libgo: use inline assembly in favor of call to _xgetbv()
Use inline assembly in the implementation of internal_cpu.xgetbv as
opposed to a call to the intrinsic _xgetbv(), since non-gcc compilers
(e.g. clang) may or may not have support for it.
Change-Id: If16289688529fdbcd8ba9d7339092521fe1abeda
Reviewed-on: https://go-review.googlesource.com/c/140137
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/internal/cpu/cpu_gccgo.c b/libgo/go/internal/cpu/cpu_gccgo.c
index 6625ddc..1d5b492 100644
--- a/libgo/go/internal/cpu/cpu_gccgo.c
+++ b/libgo/go/internal/cpu/cpu_gccgo.c
@@ -52,12 +52,18 @@
#pragma GCC target("xsave")
struct xgetbv_ret xgetbv(void) {
- long long r;
struct xgetbv_ret ret;
- r = _xgetbv(0);
- ret.eax = r & 0xffffffff;
- ret.edx = r >> 32;
+ // At some point, use call to _xgetbv() instead:
+ //
+ // long long r = _xgetbv(0);
+ // ret.eax = r & 0xffffffff;
+ // ret.edx = r >> 32;
+ //
+ unsigned int __eax, __edx, __xcr_no = 0;
+ __asm__ ("xgetbv" : "=a" (__eax), "=d" (__edx) : "c" (__xcr_no));
+ ret.eax = __eax;
+ ret.edx = __edx;
return ret;
}