]> granicus.if.org Git - clang/commitdiff
Add implementations of __readfs{byte,word,dword,qword} to Intrin.h
authorHans Wennborg <hans@hanshq.net>
Fri, 24 Jan 2014 00:52:39 +0000 (00:52 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 24 Jan 2014 00:52:39 +0000 (00:52 +0000)
Differential Revision: http://llvm-reviews.chandlerc.com/D2606

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199958 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/Intrin.h

index 82aadb2e33c3916bf974607edd373c0c38ccbf79..2a93d3d29b182d33d8c5eebfb83be85aefa25978 100644 (file)
@@ -101,10 +101,16 @@ unsigned long __readcr5(void);
 unsigned long __readcr8(void);
 unsigned int __readdr(unsigned int);
 unsigned int __readeflags(void);
+#ifdef __i386__
+static __inline__
 unsigned char __readfsbyte(unsigned long);
+static __inline__
 unsigned long __readfsdword(unsigned long);
+static __inline__
 unsigned __int64 __readfsqword(unsigned long);
+static __inline__
 unsigned short __readfsword(unsigned long);
+#endif
 unsigned __int64 __readmsr(unsigned long);
 unsigned __int64 __readpmc(unsigned long);
 unsigned long __segmentlimit(unsigned long);
@@ -767,6 +773,33 @@ _WriteBarrier(void) {
   __asm__ volatile ("" : : : "memory");
 }
 /*----------------------------------------------------------------------------*\
+|* readfs 
+|* (Pointers in address space #257 are relative to the FS segment register.)
+\*----------------------------------------------------------------------------*/
+#ifdef __i386__
+#define __ptr_to_addr_space(__addr_space_nbr, __type, __offset)              \
+    ((volatile __type __attribute__((__address_space__(__addr_space_nbr)))*) \
+    (__offset))
+
+static __inline__ unsigned char __attribute__((__always_inline__, __nodebug__))
+__readfsbyte(unsigned long __offset) {
+  return *__ptr_to_addr_space(257, unsigned char, __offset);
+}
+static __inline__ unsigned long __attribute__((__always_inline__, __nodebug__))
+__readfsdword(unsigned long __offset) {
+  return *__ptr_to_addr_space(257, unsigned long, __offset);
+}
+static __inline__ unsigned __int64 __attribute__((__always_inline__, __nodebug__))
+__readfsqword(unsigned long __offset) {
+  return *__ptr_to_addr_space(257, unsigned __int64, __offset);
+}
+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
+/*----------------------------------------------------------------------------*\
 |* Misc
 \*----------------------------------------------------------------------------*/
 static __inline__ void * __attribute__((__always_inline__, __nodebug__))