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;
 }