diff options
author | Hans Wennborg <hans@hanshq.net> | 2014-03-12 21:09:05 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2014-03-12 21:09:05 +0000 |
commit | a4421e03fa4fc342e9a0d264b64950a7c57903f1 (patch) | |
tree | 023c7b16b8e44ca051476d09494ad7d66414c143 /clang/lib | |
parent | dd0f5304f60e09c1e056e97634db032fd4922820 (diff) | |
download | bcm5719-llvm-a4421e03fa4fc342e9a0d264b64950a7c57903f1.tar.gz bcm5719-llvm-a4421e03fa4fc342e9a0d264b64950a7c57903f1.zip |
MS intrinsics: implement __readgs{byte,word,dword,qword} (PR19054)
llvm-svn: 203715
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Headers/Intrin.h | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h index 54e08993506..baba6330a1c 100644 --- a/clang/lib/Headers/Intrin.h +++ b/clang/lib/Headers/Intrin.h @@ -322,8 +322,12 @@ void __movsq(unsigned long long *, unsigned long long const *, size_t); __int64 __mulh(__int64, __int64); static __inline__ unsigned __int64 __popcnt64(unsigned __int64); +static __inline__ unsigned char __readgsbyte(unsigned long); +static __inline__ unsigned long __readgsdword(unsigned long); +static __inline__ +unsigned __int64 __readgsqword(unsigned long); unsigned short __readgsword(unsigned long); unsigned __int64 __shiftleft128(unsigned __int64 _LowPart, unsigned __int64 _HighPart, @@ -818,14 +822,15 @@ __faststorefence(void) { } #endif /*----------------------------------------------------------------------------*\ -|* readfs -|* (Pointers in address space #257 are relative to the FS segment register.) +|* readfs, readgs +|* (Pointers in address space #256 and #257 are relative to the GS and FS +|* segment registers, respectively.) \*----------------------------------------------------------------------------*/ -#ifdef __i386__ #define __ptr_to_addr_space(__addr_space_nbr, __type, __offset) \ ((volatile __type __attribute__((__address_space__(__addr_space_nbr)))*) \ (__offset)) +#ifdef __i386__ static __inline__ unsigned char __attribute__((__always_inline__, __nodebug__)) __readfsbyte(unsigned long __offset) { return *__ptr_to_addr_space(257, unsigned char, __offset); @@ -842,8 +847,26 @@ static __inline__ unsigned short __attribute__((__always_inline__, __nodebug__)) __readfsword(unsigned long __offset) { return *__ptr_to_addr_space(257, unsigned short, __offset); } -#undef __ptr_to_addr_space #endif +#ifdef __x86_64__ +static __inline__ unsigned char __attribute__((__always_inline__, __nodebug__)) +__readgsbyte(unsigned long __offset) { + return *__ptr_to_addr_space(256, unsigned char, __offset); +} +static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__)) +__readgsdword(unsigned long __offset) { + return *__ptr_to_addr_space(256, unsigned long, __offset); +} +static __inline__ unsigned __int64 __attribute__((__always_inline__, __nodebug__)) +__readgsqword(unsigned long __offset) { + return *__ptr_to_addr_space(256, unsigned __int64, __offset); +} +static __inline__ unsigned short __attribute__((__always_inline__, __nodebug__)) +__readgsword(unsigned long __offset) { + return *__ptr_to_addr_space(256, unsigned short, __offset); +} +#endif +#undef __ptr_to_addr_space /*----------------------------------------------------------------------------*\ |* Misc \*----------------------------------------------------------------------------*/ |