From: Craig Topper Date: Fri, 16 Oct 2015 06:22:36 +0000 (+0000) Subject: [X86] Add fxsr feature name for fxsave/fxrestore builtins. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9f3e67d201d7f40a37f29256bae865eb119ba786;p=clang [X86] Add fxsr feature name for fxsave/fxrestore builtins. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@250498 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 4f1955f00f..2ff14a1701 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -660,10 +660,10 @@ TARGET_BUILTIN(__builtin_ia32_wrgsbase32, "vUi", "", "fsgsbase") TARGET_BUILTIN(__builtin_ia32_wrgsbase64, "vULLi", "", "fsgsbase") // FXSR -BUILTIN(__builtin_ia32_fxrstor, "vv*", "") -BUILTIN(__builtin_ia32_fxrstor64, "vv*", "") -BUILTIN(__builtin_ia32_fxsave, "vv*", "") -BUILTIN(__builtin_ia32_fxsave64, "vv*", "") +TARGET_BUILTIN(__builtin_ia32_fxrstor, "vv*", "", "fxsr") +TARGET_BUILTIN(__builtin_ia32_fxrstor64, "vv*", "", "fxsr") +TARGET_BUILTIN(__builtin_ia32_fxsave, "vv*", "", "fxsr") +TARGET_BUILTIN(__builtin_ia32_fxsave64, "vv*", "", "fxsr") // XSAVE TARGET_BUILTIN(__builtin_ia32_xsave, "vv*ULLi", "", "xsave") diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 8bd925b688..c7131f64d9 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -1324,6 +1324,7 @@ def mno_prfchw : Flag<["-"], "mno-prfchw">, Group; def mno_rdseed : Flag<["-"], "mno-rdseed">, Group; def mno_adx : Flag<["-"], "mno-adx">, Group; def mno_sha : Flag<["-"], "mno-sha">, Group; +def mno_fxsr : Flag<["-"], "mno-fxsr">, Group; def mno_xsave : Flag<["-"], "mno-xsave">, Group; def mno_xsaveopt : Flag<["-"], "mno-xsaveopt">, Group; def mno_xsavec : Flag<["-"], "mno-xsavec">, Group; @@ -1475,6 +1476,7 @@ def mrdseed : Flag<["-"], "mrdseed">, Group; def madx : Flag<["-"], "madx">, Group; def msha : Flag<["-"], "msha">, Group; def mcx16 : Flag<["-"], "mcx16">, Group; +def mfxsr : Flag<["-"], "mfxsr">, Group; def mxsave : Flag<["-"], "mxsave">, Group; def mxsaveopt : Flag<["-"], "mxsaveopt">, Group; def mxsavec : Flag<["-"], "mxsavec">, Group; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index dcf2271a4a..b38b4e0c6c 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -2094,6 +2094,7 @@ class X86TargetInfo : public TargetInfo { bool HasAVX512VL = false; bool HasSHA = false; bool HasCX16 = false; + bool HasFXSR = false; bool HasXSAVE = false; bool HasXSAVEOPT = false; bool HasXSAVEC = false; @@ -2557,26 +2558,31 @@ bool X86TargetInfo::initFeatureMap( case CK_Pentium3M: case CK_C3_2: setFeatureEnabledImpl(Features, "sse", true); + setFeatureEnabledImpl(Features, "fxsr", true); break; case CK_PentiumM: case CK_Pentium4: case CK_Pentium4M: case CK_x86_64: setFeatureEnabledImpl(Features, "sse2", true); + setFeatureEnabledImpl(Features, "fxsr", true); break; case CK_Yonah: case CK_Prescott: case CK_Nocona: setFeatureEnabledImpl(Features, "sse3", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "cx16", true); break; case CK_Core2: case CK_Bonnell: setFeatureEnabledImpl(Features, "ssse3", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "cx16", true); break; case CK_Penryn: setFeatureEnabledImpl(Features, "sse4.1", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "cx16", true); break; case CK_Skylake: @@ -2617,6 +2623,7 @@ bool X86TargetInfo::initFeatureMap( // FALLTHROUGH case CK_Nehalem: setFeatureEnabledImpl(Features, "sse4.2", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "cx16", true); break; case CK_KNL: @@ -2624,6 +2631,7 @@ bool X86TargetInfo::initFeatureMap( setFeatureEnabledImpl(Features, "avx512cd", true); setFeatureEnabledImpl(Features, "avx512er", true); setFeatureEnabledImpl(Features, "avx512pf", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "rdseed", true); setFeatureEnabledImpl(Features, "adx", true); setFeatureEnabledImpl(Features, "lzcnt", true); @@ -2656,6 +2664,7 @@ bool X86TargetInfo::initFeatureMap( case CK_AthlonMP: setFeatureEnabledImpl(Features, "sse", true); setFeatureEnabledImpl(Features, "3dnowa", true); + setFeatureEnabledImpl(Features, "fxsr", true); break; case CK_K8: case CK_Opteron: @@ -2663,6 +2672,7 @@ bool X86TargetInfo::initFeatureMap( case CK_AthlonFX: setFeatureEnabledImpl(Features, "sse2", true); setFeatureEnabledImpl(Features, "3dnowa", true); + setFeatureEnabledImpl(Features, "fxsr", true); break; case CK_AMDFAM10: setFeatureEnabledImpl(Features, "sse4a", true); @@ -2674,6 +2684,7 @@ bool X86TargetInfo::initFeatureMap( case CK_Athlon64SSE3: setFeatureEnabledImpl(Features, "sse3", true); setFeatureEnabledImpl(Features, "3dnowa", true); + setFeatureEnabledImpl(Features, "fxsr", true); break; case CK_BTVER2: setFeatureEnabledImpl(Features, "avx", true); @@ -2690,6 +2701,7 @@ bool X86TargetInfo::initFeatureMap( setFeatureEnabledImpl(Features, "popcnt", true); setFeatureEnabledImpl(Features, "prfchw", true); setFeatureEnabledImpl(Features, "cx16", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "xsave", true); break; case CK_BDVER4: @@ -2714,6 +2726,7 @@ bool X86TargetInfo::initFeatureMap( setFeatureEnabledImpl(Features, "pclmul", true); setFeatureEnabledImpl(Features, "prfchw", true); setFeatureEnabledImpl(Features, "cx16", true); + setFeatureEnabledImpl(Features, "fxsr", true); setFeatureEnabledImpl(Features, "xsave", true); break; } @@ -2995,6 +3008,8 @@ bool X86TargetInfo::handleTargetFeatures(std::vector &Features, HasSHA = true; } else if (Feature == "+cx16") { HasCX16 = true; + } else if (Feature == "+fxsr") { + HasFXSR = true; } else if (Feature == "+xsave") { HasXSAVE = true; } else if (Feature == "+xsaveopt") { @@ -3295,6 +3310,8 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasSHA) Builder.defineMacro("__SHA__"); + if (HasFXSR) + Builder.defineMacro("__FXSR__"); if (HasXSAVE) Builder.defineMacro("__XSAVE__"); if (HasXSAVEOPT) @@ -3393,6 +3410,7 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const { .Case("fma", HasFMA) .Case("fma4", XOPLevel >= FMA4) .Case("fsgsbase", HasFSGSBASE) + .Case("fxsr", HasFXSR) .Case("lzcnt", HasLZCNT) .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon) diff --git a/lib/Headers/fxsrintrin.h b/lib/Headers/fxsrintrin.h index 2b3549c057..ac6026aa5b 100644 --- a/lib/Headers/fxsrintrin.h +++ b/lib/Headers/fxsrintrin.h @@ -28,7 +28,7 @@ #ifndef __FXSRINTRIN_H #define __FXSRINTRIN_H -#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) +#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("fxsr"))) static __inline__ void __DEFAULT_FN_ATTRS _fxsave(void *__p) { diff --git a/test/CodeGen/attr-target-x86.c b/test/CodeGen/attr-target-x86.c index 9801c4841f..58e33d1cbf 100644 --- a/test/CodeGen/attr-target-x86.c +++ b/test/CodeGen/attr-target-x86.c @@ -31,9 +31,9 @@ int __attribute__((target("no-mmx"))) qq(int a) { return 40; } // CHECK: qux{{.*}} #1 // CHECK: qax{{.*}} #4 // CHECK: qq{{.*}} #5 -// CHECK: #0 = {{.*}}"target-cpu"="x86-64" "target-features"="+mmx,+sse,+sse2" -// CHECK: #1 = {{.*}}"target-cpu"="ivybridge" "target-features"="+aes,+avx,+cx16,+f16c,+fsgsbase,+mmx,+pclmul,+popcnt,+rdrnd,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave,+xsaveopt" -// CHECK: #2 = {{.*}}"target-cpu"="x86-64" "target-features"="+mmx,+sse,-aes,-avx,-avx2,-avx512bw,-avx512cd,-avx512dq,-avx512er,-avx512f,-avx512pf,-avx512vl,-f16c,-fma,-fma4,-pclmul,-sha,-sse2,-sse3,-sse4.1,-sse4.2,-sse4a,-ssse3,-xop,-xsave,-xsaveopt" -// CHECK: #3 = {{.*}}"target-cpu"="x86-64" "target-features"="+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3" -// CHECK: #4 = {{.*}}"target-cpu"="ivybridge" "target-features"="+avx,+cx16,+f16c,+fsgsbase,+mmx,+pclmul,+popcnt,+rdrnd,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave,+xsaveopt,-aes" -// CHECK: #5 = {{.*}}"target-cpu"="x86-64" "target-features"="+sse,+sse2,-3dnow,-3dnowa,-mmx" +// CHECK: #0 = {{.*}}"target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" +// CHECK: #1 = {{.*}}"target-cpu"="ivybridge" "target-features"="+aes,+avx,+cx16,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave,+xsaveopt" +// CHECK: #2 = {{.*}}"target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,-aes,-avx,-avx2,-avx512bw,-avx512cd,-avx512dq,-avx512er,-avx512f,-avx512pf,-avx512vl,-f16c,-fma,-fma4,-pclmul,-sha,-sse2,-sse3,-sse4.1,-sse4.2,-sse4a,-ssse3,-xop,-xsave,-xsaveopt" +// CHECK: #3 = {{.*}}"target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3" +// CHECK: #4 = {{.*}}"target-cpu"="ivybridge" "target-features"="+avx,+cx16,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+xsave,+xsaveopt,-aes" +// CHECK: #5 = {{.*}}"target-cpu"="x86-64" "target-features"="+fxsr,+sse,+sse2,-3dnow,-3dnowa,-mmx" diff --git a/test/CodeGen/builtins-x86.c b/test/CodeGen/builtins-x86.c index d4fcae0478..0721ccb9ff 100644 --- a/test/CodeGen/builtins-x86.c +++ b/test/CodeGen/builtins-x86.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -DUSE_64 -triple x86_64-unknown-unknown -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -emit-llvm -o %t %s -// RUN: %clang_cc1 -DUSE_ALL -triple x86_64-unknown-unknown -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -fsyntax-only -o %t %s +// RUN: %clang_cc1 -DUSE_64 -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -emit-llvm -o %t %s +// RUN: %clang_cc1 -DUSE_ALL -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -fsyntax-only -o %t %s #ifdef USE_ALL #define USE_3DNOW