diff options
| author | Hans Wennborg <hans@hanshq.net> | 2014-01-16 23:39:35 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2014-01-16 23:39:35 +0000 |
| commit | 854f7d34ec3d7c0559ffde536cfa88fad5419bf0 (patch) | |
| tree | 340a64ddc5419c2afb68eb056210639f74895efe /clang/lib/Headers | |
| parent | beef3453cd12923bd8100a40d6a2e6281dd250ab (diff) | |
| download | bcm5719-llvm-854f7d34ec3d7c0559ffde536cfa88fad5419bf0.tar.gz bcm5719-llvm-854f7d34ec3d7c0559ffde536cfa88fad5419bf0.zip | |
Add implementations of _cpuid and _xgetbv to Intrin.h
The _cpuid() implementation is the same as in lib/Headers/cpuid.h
with the parameter names adjusted to match the interface.
_xgetbv just does what the Intel manual says.
Differential Revision: http://llvm-reviews.chandlerc.com/D2564
llvm-svn: 199439
Diffstat (limited to 'clang/lib/Headers')
| -rw-r--r-- | clang/lib/Headers/Intrin.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h index 437646471da..b0fe2ce4395 100644 --- a/clang/lib/Headers/Intrin.h +++ b/clang/lib/Headers/Intrin.h @@ -48,6 +48,7 @@ void __addfsbyte(unsigned long, unsigned char); void __addfsdword(unsigned long, unsigned long); void __addfsword(unsigned long, unsigned short); void __code_seg(const char *); +static __inline__ void __cpuid(int[4], int); void __cpuidex(int[4], int, int); void __debugbreak(void); @@ -287,6 +288,7 @@ void _WriteBarrier(void); void _xabort(const unsigned int imm); unsigned __int32 xbegin(void); void _xend(void); +static __inline__ unsigned __int64 __cdecl _xgetbv(unsigned int); void __cdecl _xrstor(void const *, unsigned __int64); void __cdecl _xsave(void *, unsigned __int64); @@ -775,6 +777,23 @@ static __inline__ void * __attribute__((__always_inline__, __nodebug__)) _ReturnAddress(void) { return __builtin_return_address(0); } +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +__cpuid(int __info[4], int __level) { +#if __i386__ + __asm__ ("cpuid" + : "=a"(__info[0]), "=b" (__info[1]), "=c"(__info[2]), "=d"(__info[3]) + : "0"(__level)); +#else + __asm__ ("cpuid" : "=a"(__info[0]), "=b" (__info[1]), "=c"(__info[2]), "=d"(__info[3]) + : "0"(__level)); +#endif +} +static __inline__ unsigned __int64 __cdecl __attribute__((__always_inline__, __nodebug__)) +_xgetbv(unsigned int __xcr_no) { + unsigned int __eax, __edx; + __asm__ ("xgetbv" : "=a" (__eax), "=d" (__edx) : "c" (__xcr_no)); + return ((unsigned __int64)__edx << 32) | __eax; +} #ifdef __cplusplus } |

