mirror of git://gcc.gnu.org/git/gcc.git
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.
Reviewed-on: https://go-review.googlesource.com/c/140137
From-SVN: r264882
This commit is contained in:
parent
d5a9895595
commit
7fc9c2e52f
|
|
@ -1,4 +1,4 @@
|
|||
9f4cf23e716bcf65e071260afa032a64acd3fdde
|
||||
d0739c13ca3686df1f8d0fae7c6c5caaed058503
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
|||
|
|
@ -52,12 +52,18 @@ struct xgetbv_ret xgetbv(void)
|
|||
#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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue