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.
Reviewed-on: https://go-review.googlesource.com/c/140137
From-SVN: r264882
-9f4cf23e716bcf65e071260afa032a64acd3fdde
+d0739c13ca3686df1f8d0fae7c6c5caaed058503
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
#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;
}