<div dir="ltr">Thanks, this is great.</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Nov 2, 2014 at 10:51 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ctopper<br>
Date: Mon Nov  3 00:51:41 2014<br>
New Revision: 221130<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221130&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221130&view=rev</a><br>
Log:<br>
Add FSGSBASE intrinsics to x86 intrinsic headers.<br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/fsgsbase-builtins.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/lib/Basic/Targets.cpp<br>
    cfe/trunk/lib/Headers/Intrin.h<br>
    cfe/trunk/lib/Headers/immintrin.h<br>
<br>
Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=221130&r1=221129&r2=221130&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=221130&r1=221129&r2=221130&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)<br>
+++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Mon Nov  3 00:51:41 2014<br>
@@ -625,6 +625,16 @@ BUILTIN(__builtin_ia32_rdrand16_step, "U<br>
 BUILTIN(__builtin_ia32_rdrand32_step, "UiUi*", "")<br>
 BUILTIN(__builtin_ia32_rdrand64_step, "UiULLi*", "")<br>
<br>
+// FSGSBASE<br>
+BUILTIN(__builtin_ia32_rdfsbase32, "Ui", "")<br>
+BUILTIN(__builtin_ia32_rdfsbase64, "ULLi", "")<br>
+BUILTIN(__builtin_ia32_rdgsbase32, "Ui", "")<br>
+BUILTIN(__builtin_ia32_rdgsbase64, "ULLi", "")<br>
+BUILTIN(__builtin_ia32_wrfsbase32, "vUi", "")<br>
+BUILTIN(__builtin_ia32_wrfsbase64, "vULLi", "")<br>
+BUILTIN(__builtin_ia32_wrgsbase32, "vUi", "")<br>
+BUILTIN(__builtin_ia32_wrgsbase64, "vULLi", "")<br>
+<br>
 // ADX<br>
 BUILTIN(__builtin_ia32_addcarryx_u32, "UcUcUiUiUi*", "")<br>
 BUILTIN(__builtin_ia32_addcarryx_u64, "UcUcULLiULLiULLi*", "")<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=221130&r1=221129&r2=221130&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=221130&r1=221129&r2=221130&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Mon Nov  3 00:51:41 2014<br>
@@ -1134,6 +1134,7 @@ def mno_avx512vl : Flag<["-"], "mno-avx5<br>
 def mno_pclmul : Flag<["-"], "mno-pclmul">, Group<m_x86_Features_Group>;<br>
 def mno_lzcnt : Flag<["-"], "mno-lzcnt">, Group<m_x86_Features_Group>;<br>
 def mno_rdrnd : Flag<["-"], "mno-rdrnd">, Group<m_x86_Features_Group>;<br>
+def mno_fsgsbase : Flag<["-"], "mno-fsgsbase">, Group<m_x86_Features_Group>;<br>
 def mno_bmi : Flag<["-"], "mno-bmi">, Group<m_x86_Features_Group>;<br>
 def mno_bmi2 : Flag<["-"], "mno-bmi2">, Group<m_x86_Features_Group>;<br>
 def mno_popcnt : Flag<["-"], "mno-popcnt">, Group<m_x86_Features_Group>;<br>
@@ -1243,6 +1244,7 @@ def mavx512vl : Flag<["-"], "mavx512vl"><br>
 def mpclmul : Flag<["-"], "mpclmul">, Group<m_x86_Features_Group>;<br>
 def mlzcnt : Flag<["-"], "mlzcnt">, Group<m_x86_Features_Group>;<br>
 def mrdrnd : Flag<["-"], "mrdrnd">, Group<m_x86_Features_Group>;<br>
+def mfsgsbase : Flag<["-"], "mfsgsbase">, Group<m_x86_Features_Group>;<br>
 def mbmi : Flag<["-"], "mbmi">, Group<m_x86_Features_Group>;<br>
 def mbmi2 : Flag<["-"], "mbmi2">, Group<m_x86_Features_Group>;<br>
 def mpopcnt : Flag<["-"], "mpopcnt">, Group<m_x86_Features_Group>;<br>
<br>
Modified: cfe/trunk/lib/Basic/Targets.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=221130&r1=221129&r2=221130&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=221130&r1=221129&r2=221130&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/Targets.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Targets.cpp Mon Nov  3 00:51:41 2014<br>
@@ -1709,6 +1709,7 @@ class X86TargetInfo : public TargetInfo<br>
   bool HasPCLMUL;<br>
   bool HasLZCNT;<br>
   bool HasRDRND;<br>
+  bool HasFSGSBASE;<br>
   bool HasBMI;<br>
   bool HasBMI2;<br>
   bool HasPOPCNT;<br>
@@ -1886,12 +1887,12 @@ public:<br>
   X86TargetInfo(const llvm::Triple &Triple)<br>
       : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),<br>
         XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),<br>
-        HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),<br>
-        HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasADX(false),<br>
-        HasTBM(false), HasFMA(false), HasF16C(false), HasAVX512CD(false),<br>
-        HasAVX512ER(false), HasAVX512PF(false), HasAVX512DQ(false),<br>
-        HasAVX512BW(false), HasAVX512VL(false), HasSHA(false), HasCX16(false),<br>
-        CPU(CK_Generic), FPMath(FP_Default) {<br>
+        HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),<br>
+        HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),<br>
+        HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),<br>
+        HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),<br>
+        HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),<br>
+        HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {<br>
     BigEndian = false;<br>
     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;<br>
   }<br>
@@ -2193,6 +2194,7 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "pclmul", true);<br>
     setFeatureEnabledImpl(Features, "rdrnd", true);<br>
     setFeatureEnabledImpl(Features, "f16c", true);<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
     break;<br>
   case CK_CoreAVX2:<br>
     setFeatureEnabledImpl(Features, "avx2", true);<br>
@@ -2201,6 +2203,7 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "lzcnt", true);<br>
     setFeatureEnabledImpl(Features, "rdrnd", true);<br>
     setFeatureEnabledImpl(Features, "f16c", true);<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
     setFeatureEnabledImpl(Features, "bmi", true);<br>
     setFeatureEnabledImpl(Features, "bmi2", true);<br>
     setFeatureEnabledImpl(Features, "rtm", true);<br>
@@ -2214,6 +2217,7 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "lzcnt", true);<br>
     setFeatureEnabledImpl(Features, "rdrnd", true);<br>
     setFeatureEnabledImpl(Features, "f16c", true);<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
     setFeatureEnabledImpl(Features, "bmi", true);<br>
     setFeatureEnabledImpl(Features, "bmi2", true);<br>
     setFeatureEnabledImpl(Features, "rtm", true);<br>
@@ -2232,6 +2236,7 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "lzcnt", true);<br>
     setFeatureEnabledImpl(Features, "rdrnd", true);<br>
     setFeatureEnabledImpl(Features, "f16c", true);<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
     setFeatureEnabledImpl(Features, "bmi", true);<br>
     setFeatureEnabledImpl(Features, "bmi2", true);<br>
     setFeatureEnabledImpl(Features, "rtm", true);<br>
@@ -2250,6 +2255,7 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "lzcnt", true);<br>
     setFeatureEnabledImpl(Features, "rdrnd", true);<br>
     setFeatureEnabledImpl(Features, "f16c", true);<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
     setFeatureEnabledImpl(Features, "bmi", true);<br>
     setFeatureEnabledImpl(Features, "bmi2", true);<br>
     setFeatureEnabledImpl(Features, "rtm", true);<br>
@@ -2329,8 +2335,10 @@ void X86TargetInfo::getDefaultFeatures(l<br>
     setFeatureEnabledImpl(Features, "avx2", true);<br>
     setFeatureEnabledImpl(Features, "bmi2", true);<br>
     // FALLTHROUGH<br>
-  case CK_BDVER2:<br>
   case CK_BDVER3:<br>
+    setFeatureEnabledImpl(Features, "fsgsbase", true);<br>
+    // FALLTHROUGH<br>
+  case CK_BDVER2:<br>
     setFeatureEnabledImpl(Features, "xop", true);<br>
     setFeatureEnabledImpl(Features, "lzcnt", true);<br>
     setFeatureEnabledImpl(Features, "aes", true);<br>
@@ -2552,6 +2560,11 @@ bool X86TargetInfo::handleTargetFeatures<br>
       continue;<br>
     }<br>
<br>
+    if (Feature == "fsgsbase") {<br>
+      HasFSGSBASE = true;<br>
+      continue;<br>
+    }<br>
+<br>
     if (Feature == "bmi") {<br>
       HasBMI = true;<br>
       continue;<br>
@@ -2889,6 +2902,9 @@ void X86TargetInfo::getTargetDefines(con<br>
   if (HasRDRND)<br>
     Builder.defineMacro("__RDRND__");<br>
<br>
+  if (HasFSGSBASE)<br>
+    Builder.defineMacro("__FSGSBASE__");<br>
+<br>
   if (HasBMI)<br>
     Builder.defineMacro("__BMI__");<br>
<br>
@@ -3037,6 +3053,7 @@ bool X86TargetInfo::hasFeature(StringRef<br>
       .Case("tbm", HasTBM)<br>
       .Case("lzcnt", HasLZCNT)<br>
       .Case("rdrnd", HasRDRND)<br>
+      .Case("fsgsbase", HasFSGSBASE)<br>
       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)<br>
       .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)<br>
       .Case("mmx", MMX3DNowLevel >= MMX)<br>
<br>
Modified: cfe/trunk/lib/Headers/Intrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=221130&r1=221129&r2=221130&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=221130&r1=221129&r2=221130&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/Intrin.h (original)<br>
+++ cfe/trunk/lib/Headers/Intrin.h Mon Nov  3 00:51:41 2014<br>
@@ -410,10 +410,6 @@ char _InterlockedXor8_np(char volatile *<br>
 static __inline__<br>
 __int64 _mul128(__int64 _Multiplier, __int64 _Multiplicand,<br>
                 __int64 *_HighProduct);<br>
-unsigned int __cdecl _readfsbase_u32(void);<br>
-unsigned __int64 __cdecl _readfsbase_u64(void);<br>
-unsigned int __cdecl _readgsbase_u32(void);<br>
-unsigned __int64 __cdecl _readgsbase_u64(void);<br>
 unsigned __int64 _rorx_u64(unsigned __int64, const unsigned int);<br>
 __int64 _sarx_i64(__int64, unsigned int);<br>
 #if __STDC_HOSTED__<br>
@@ -424,10 +420,6 @@ unsigned __int64 shrx_u64(unsigned __int<br>
 unsigned __int64 _umul128(unsigned __int64 _Multiplier,<br>
                           unsigned __int64 _Multiplicand,<br>
                           unsigned __int64 *_HighProduct);<br>
-void __cdecl _writefsbase_u32(unsigned int);<br>
-void _cdecl _writefsbase_u64(unsigned __int64);<br>
-void __cdecl _writegsbase_u32(unsigned int);<br>
-void __cdecl _writegsbase_u64(unsigned __int64);<br>
 void __cdecl _xrstor64(void const *, unsigned __int64);<br>
 void __cdecl _xsave64(void *, unsigned __int64);<br>
 void __cdecl _xsaveopt64(void *, unsigned __int64);<br>
<br>
Modified: cfe/trunk/lib/Headers/immintrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=221130&r1=221129&r2=221130&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/immintrin.h?rev=221130&r1=221129&r2=221130&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/immintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/immintrin.h Mon Nov  3 00:51:41 2014<br>
@@ -118,6 +118,58 @@ _rdrand64_step(unsigned long long *__p)<br>
 #endif<br>
 #endif /* __RDRND__ */<br>
<br>
+#ifdef __FSGSBASE__<br>
+#ifdef __x86_64__<br>
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))<br>
+_readfsbase_u32(void)<br>
+{<br>
+  return __builtin_ia32_rdfsbase32();<br>
+}<br>
+<br>
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))<br>
+_readfsbase_u64(void)<br>
+{<br>
+  return __builtin_ia32_rdfsbase64();<br>
+}<br>
+<br>
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))<br>
+_readgsbase_u32(void)<br>
+{<br>
+  return __builtin_ia32_rdgsbase32();<br>
+}<br>
+<br>
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))<br>
+_readgsbase_u64(void)<br>
+{<br>
+  return __builtin_ia32_rdgsbase64();<br>
+}<br>
+<br>
+static __inline__ void __attribute__((__always_inline__, __nodebug__))<br>
+_writefsbase_u32(unsigned int __V)<br>
+{<br>
+  return __builtin_ia32_wrfsbase32(__V);<br>
+}<br>
+<br>
+static __inline__ void __attribute__((__always_inline__, __nodebug__))<br>
+_writefsbase_u64(unsigned long long __V)<br>
+{<br>
+  return __builtin_ia32_wrfsbase64(__V);<br>
+}<br>
+<br>
+static __inline__ void __attribute__((__always_inline__, __nodebug__))<br>
+_writegsbase_u32(unsigned int __V)<br>
+{<br>
+  return __builtin_ia32_wrgsbase32(__V);<br>
+}<br>
+<br>
+static __inline__ void __attribute__((__always_inline__, __nodebug__))<br>
+_writegsbase_u64(unsigned long long __V)<br>
+{<br>
+  return __builtin_ia32_wrgsbase64(__V);<br>
+}<br>
+#endif<br>
+#endif /* __FSGSBASE__ */<br>
+<br>
 #ifdef __RTM__<br>
 #include <rtmintrin.h><br>
 #endif<br>
<br>
Added: cfe/trunk/test/CodeGen/fsgsbase-builtins.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/fsgsbase-builtins.c?rev=221130&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/fsgsbase-builtins.c?rev=221130&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/fsgsbase-builtins.c (added)<br>
+++ cfe/trunk/test/CodeGen/fsgsbase-builtins.c Mon Nov  3 00:51:41 2014<br>
@@ -0,0 +1,54 @@<br>
+// RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +fsgsbase -emit-llvm -o - | FileCheck %s<br>
+<br>
+// Don't include mm_malloc.h, it's system specific.<br>
+#define __MM_MALLOC_H<br>
+<br>
+#include <x86intrin.h><br>
+<br>
+unsigned int test_readfsbase_u32()<br>
+{<br>
+  // CHECK: @llvm.x86.rdfsbase.32<br>
+  return _readfsbase_u32();<br>
+}<br>
+<br>
+unsigned long long test_readfsbase_u64()<br>
+{<br>
+  // CHECK: @llvm.x86.rdfsbase.64<br>
+  return _readfsbase_u64();<br>
+}<br>
+<br>
+unsigned int test_readgsbase_u32()<br>
+{<br>
+  // CHECK: @llvm.x86.rdgsbase.32<br>
+  return _readgsbase_u32();<br>
+}<br>
+<br>
+unsigned long long test_readgsbase_u64()<br>
+{<br>
+  // CHECK: @llvm.x86.rdgsbase.64<br>
+  return _readgsbase_u64();<br>
+}<br>
+<br>
+void test_writefsbase_u32(unsigned int __X)<br>
+{<br>
+  // CHECK: @llvm.x86.wrfsbase.32<br>
+  _writefsbase_u32(__X);<br>
+}<br>
+<br>
+void test_writefsbase_u64(unsigned long long __X)<br>
+{<br>
+  // CHECK: @llvm.x86.wrfsbase.64<br>
+  _writefsbase_u64(__X);<br>
+}<br>
+<br>
+void test_writegsbase_u32(unsigned int __X)<br>
+{<br>
+  // CHECK: @llvm.x86.wrgsbase.32<br>
+  _writegsbase_u32(__X);<br>
+}<br>
+<br>
+void test_writegsbase_u64(unsigned long long __X)<br>
+{<br>
+  // CHECK: @llvm.x86.wrgsbase.64<br>
+  _writegsbase_u64(__X);<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>