Skip to content

Commit 3b6616c

Browse files
committedJul 30, 2014
[SKX] Enabling SKX target (Skylake server chip)
a) add SKX support to Clang driver; b) add tests for SKX target and AVX512BW, AVX512DQ, AVX512VL features into clang driver tests Patch by Zinovy Nis <zinovy.y.nis@intel.com> llvm-svn: 214306
1 parent 152493b commit 3b6616c

File tree

4 files changed

+179
-5
lines changed

4 files changed

+179
-5
lines changed
 

Diff for: ‎clang/include/clang/Driver/Options.td

+6
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,9 @@ def mno_avx512f : Flag<["-"], "mno-avx512f">, Group<m_x86_Features_Group>;
10921092
def mno_avx512cd : Flag<["-"], "mno-avx512cd">, Group<m_x86_Features_Group>;
10931093
def mno_avx512er : Flag<["-"], "mno-avx512er">, Group<m_x86_Features_Group>;
10941094
def mno_avx512pf : Flag<["-"], "mno-avx512pf">, Group<m_x86_Features_Group>;
1095+
def mno_avx512dq : Flag<["-"], "mno-avx512dq">, Group<m_x86_Features_Group>;
1096+
def mno_avx512bw : Flag<["-"], "mno-avx512bw">, Group<m_x86_Features_Group>;
1097+
def mno_avx512vl : Flag<["-"], "mno-avx512vl">, Group<m_x86_Features_Group>;
10951098
def mno_pclmul : Flag<["-"], "mno-pclmul">, Group<m_x86_Features_Group>;
10961099
def mno_lzcnt : Flag<["-"], "mno-lzcnt">, Group<m_x86_Features_Group>;
10971100
def mno_rdrnd : Flag<["-"], "mno-rdrnd">, Group<m_x86_Features_Group>;
@@ -1186,6 +1189,9 @@ def mavx512f : Flag<["-"], "mavx512f">, Group<m_x86_Features_Group>;
11861189
def mavx512cd : Flag<["-"], "mavx512cd">, Group<m_x86_Features_Group>;
11871190
def mavx512er : Flag<["-"], "mavx512er">, Group<m_x86_Features_Group>;
11881191
def mavx512pf : Flag<["-"], "mavx512pf">, Group<m_x86_Features_Group>;
1192+
def mavx512dq : Flag<["-"], "mavx512dq">, Group<m_x86_Features_Group>;
1193+
def mavx512bw : Flag<["-"], "mavx512bw">, Group<m_x86_Features_Group>;
1194+
def mavx512vl : Flag<["-"], "mavx512vl">, Group<m_x86_Features_Group>;
11891195
def mpclmul : Flag<["-"], "mpclmul">, Group<m_x86_Features_Group>;
11901196
def mlzcnt : Flag<["-"], "mlzcnt">, Group<m_x86_Features_Group>;
11911197
def mrdrnd : Flag<["-"], "mrdrnd">, Group<m_x86_Features_Group>;

Diff for: ‎clang/lib/Basic/Targets.cpp

+56-5
Original file line numberDiff line numberDiff line change
@@ -1691,7 +1691,7 @@ class X86TargetInfo : public TargetInfo {
16911691
bool HasTBM;
16921692
bool HasFMA;
16931693
bool HasF16C;
1694-
bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
1694+
bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
16951695
bool HasSHA;
16961696
bool HasCX16;
16971697

@@ -1783,6 +1783,10 @@ class X86TargetInfo : public TargetInfo {
17831783
/// Knights Landing processor.
17841784
CK_KNL,
17851785

1786+
/// \name Skylake Server
1787+
/// Skylake server processor.
1788+
CK_SKX,
1789+
17861790
/// \name K6
17871791
/// K6 architecture processors.
17881792
//@{
@@ -1856,7 +1860,8 @@ class X86TargetInfo : public TargetInfo {
18561860
HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
18571861
HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
18581862
HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
1859-
HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1863+
HasAVX512PF(false), HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1864+
HasSHA(false), HasCX16(false), CPU(CK_Generic),
18601865
FPMath(FP_Default) {
18611866
BigEndian = false;
18621867
LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
@@ -1950,6 +1955,7 @@ class X86TargetInfo : public TargetInfo {
19501955
.Case("core-avx-i", CK_CoreAVXi)
19511956
.Case("core-avx2", CK_CoreAVX2)
19521957
.Case("knl", CK_KNL)
1958+
.Case("skx", CK_SKX)
19531959
.Case("k6", CK_K6)
19541960
.Case("k6-2", CK_K6_2)
19551961
.Case("k6-3", CK_K6_3)
@@ -2028,6 +2034,7 @@ class X86TargetInfo : public TargetInfo {
20282034
case CK_CoreAVXi:
20292035
case CK_CoreAVX2:
20302036
case CK_KNL:
2037+
case CK_SKX:
20312038
case CK_Athlon64:
20322039
case CK_Athlon64SSE3:
20332040
case CK_AthlonFX:
@@ -2176,6 +2183,22 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
21762183
setFeatureEnabledImpl(Features, "rtm", true);
21772184
setFeatureEnabledImpl(Features, "fma", true);
21782185
break;
2186+
case CK_SKX:
2187+
setFeatureEnabledImpl(Features, "avx512f", true);
2188+
setFeatureEnabledImpl(Features, "avx512cd", true);
2189+
setFeatureEnabledImpl(Features, "avx512dq", true);
2190+
setFeatureEnabledImpl(Features, "avx512bw", true);
2191+
setFeatureEnabledImpl(Features, "avx512vl", true);
2192+
setFeatureEnabledImpl(Features, "aes", true);
2193+
setFeatureEnabledImpl(Features, "pclmul", true);
2194+
setFeatureEnabledImpl(Features, "lzcnt", true);
2195+
setFeatureEnabledImpl(Features, "rdrnd", true);
2196+
setFeatureEnabledImpl(Features, "f16c", true);
2197+
setFeatureEnabledImpl(Features, "bmi", true);
2198+
setFeatureEnabledImpl(Features, "bmi2", true);
2199+
setFeatureEnabledImpl(Features, "rtm", true);
2200+
setFeatureEnabledImpl(Features, "fma", true);
2201+
break;
21792202
case CK_K6:
21802203
case CK_WinChipC6:
21812204
setFeatureEnabledImpl(Features, "mmx", true);
@@ -2317,8 +2340,8 @@ void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
23172340
case AVX2:
23182341
Features["avx2"] = false;
23192342
case AVX512F:
2320-
Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2321-
Features["avx512pf"] = false;
2343+
Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2344+
Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
23222345
}
23232346
}
23242347

@@ -2417,7 +2440,8 @@ void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
24172440
setSSELevel(Features, AVX2, Enabled);
24182441
} else if (Name == "avx512f") {
24192442
setSSELevel(Features, AVX512F, Enabled);
2420-
} else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
2443+
} else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2444+
|| Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
24212445
if (Enabled)
24222446
setSSELevel(Features, AVX512F, Enabled);
24232447
} else if (Name == "fma") {
@@ -2530,6 +2554,21 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
25302554
continue;
25312555
}
25322556

2557+
if (Feature == "avx512dq") {
2558+
HasAVX512DQ = true;
2559+
continue;
2560+
}
2561+
2562+
if (Feature == "avx512bw") {
2563+
HasAVX512BW = true;
2564+
continue;
2565+
}
2566+
2567+
if (Feature == "avx512vl") {
2568+
HasAVX512VL = true;
2569+
continue;
2570+
}
2571+
25332572
if (Feature == "sha") {
25342573
HasSHA = true;
25352574
continue;
@@ -2696,6 +2735,9 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
26962735
case CK_KNL:
26972736
defineCPUMacros(Builder, "knl");
26982737
break;
2738+
case CK_SKX:
2739+
defineCPUMacros(Builder, "skx");
2740+
break;
26992741
case CK_K6_2:
27002742
Builder.defineMacro("__k6_2__");
27012743
Builder.defineMacro("__tune_k6_2__");
@@ -2823,6 +2865,12 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
28232865
Builder.defineMacro("__AVX512ER__");
28242866
if (HasAVX512PF)
28252867
Builder.defineMacro("__AVX512PF__");
2868+
if (HasAVX512DQ)
2869+
Builder.defineMacro("__AVX512DQ__");
2870+
if (HasAVX512BW)
2871+
Builder.defineMacro("__AVX512BW__");
2872+
if (HasAVX512VL)
2873+
Builder.defineMacro("__AVX512VL__");
28262874

28272875
if (HasSHA)
28282876
Builder.defineMacro("__SHA__");
@@ -2906,6 +2954,9 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {
29062954
.Case("avx512cd", HasAVX512CD)
29072955
.Case("avx512er", HasAVX512ER)
29082956
.Case("avx512pf", HasAVX512PF)
2957+
.Case("avx512dq", HasAVX512DQ)
2958+
.Case("avx512bw", HasAVX512BW)
2959+
.Case("avx512vl", HasAVX512VL)
29092960
.Case("bmi", HasBMI)
29102961
.Case("bmi2", HasBMI2)
29112962
.Case("cx16", HasCX16)

Diff for: ‎clang/test/Preprocessor/predefined-arch-macros.c

+72
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,7 @@
594594
// CHECK_KNL_M32: #define __knl__ 1
595595
// CHECK_KNL_M32: #define __tune_knl__ 1
596596
// CHECK_KNL_M32: #define i386 1
597+
597598
// RUN: %clang -march=knl -m64 -E -dM %s -o - 2>&1 \
598599
// RUN: -target i386-unknown-linux \
599600
// RUN: | FileCheck %s -check-prefix=CHECK_KNL_M64
@@ -630,6 +631,77 @@
630631
// CHECK_KNL_M64: #define __x86_64 1
631632
// CHECK_KNL_M64: #define __x86_64__ 1
632633
//
634+
// RUN: %clang -march=skx -m32 -E -dM %s -o - 2>&1 \
635+
// RUN: -target i386-unknown-linux \
636+
// RUN: | FileCheck %s -check-prefix=CHECK_SKX_M32
637+
// CHECK_SKX_M32: #define __AES__ 1
638+
// CHECK_SKX_M32: #define __AVX2__ 1
639+
// CHECK_SKX_M32: #define __AVX512BW__ 1
640+
// CHECK_SKX_M32: #define __AVX512CD__ 1
641+
// CHECK_SKX_M32: #define __AVX512DQ__ 1
642+
// CHECK_SKX_M32: #define __AVX512F__ 1
643+
// CHECK_SKX_M32: #define __AVX512VL__ 1
644+
// CHECK_SKX_M32: #define __AVX__ 1
645+
// CHECK_SKX_M32: #define __BMI2__ 1
646+
// CHECK_SKX_M32: #define __BMI__ 1
647+
// CHECK_SKX_M32: #define __F16C__ 1
648+
// CHECK_SKX_M32: #define __FMA__ 1
649+
// CHECK_SKX_M32: #define __LZCNT__ 1
650+
// CHECK_SKX_M32: #define __MMX__ 1
651+
// CHECK_SKX_M32: #define __PCLMUL__ 1
652+
// CHECK_SKX_M32: #define __POPCNT__ 1
653+
// CHECK_SKX_M32: #define __RDRND__ 1
654+
// CHECK_SKX_M32: #define __RTM__ 1
655+
// CHECK_SKX_M32: #define __SSE2__ 1
656+
// CHECK_SKX_M32: #define __SSE3__ 1
657+
// CHECK_SKX_M32: #define __SSE4_1__ 1
658+
// CHECK_SKX_M32: #define __SSE4_2__ 1
659+
// CHECK_SKX_M32: #define __SSE__ 1
660+
// CHECK_SKX_M32: #define __SSSE3__ 1
661+
// CHECK_SKX_M32: #define __i386 1
662+
// CHECK_SKX_M32: #define __i386__ 1
663+
// CHECK_SKX_M32: #define __skx 1
664+
// CHECK_SKX_M32: #define __skx__ 1
665+
// CHECK_SKX_M32: #define __tune_skx__ 1
666+
// CHECK_SKX_M32: #define i386 1
667+
668+
// RUN: %clang -march=skx -m64 -E -dM %s -o - 2>&1 \
669+
// RUN: -target i386-unknown-linux \
670+
// RUN: | FileCheck %s -check-prefix=CHECK_SKX_M64
671+
// CHECK_SKX_M64: #define __AES__ 1
672+
// CHECK_SKX_M64: #define __AVX2__ 1
673+
// CHECK_SKX_M64: #define __AVX512BW__ 1
674+
// CHECK_SKX_M64: #define __AVX512CD__ 1
675+
// CHECK_SKX_M64: #define __AVX512DQ__ 1
676+
// CHECK_SKX_M64: #define __AVX512F__ 1
677+
// CHECK_SKX_M64: #define __AVX512VL__ 1
678+
// CHECK_SKX_M64: #define __AVX__ 1
679+
// CHECK_SKX_M64: #define __BMI2__ 1
680+
// CHECK_SKX_M64: #define __BMI__ 1
681+
// CHECK_SKX_M64: #define __F16C__ 1
682+
// CHECK_SKX_M64: #define __FMA__ 1
683+
// CHECK_SKX_M64: #define __LZCNT__ 1
684+
// CHECK_SKX_M64: #define __MMX__ 1
685+
// CHECK_SKX_M64: #define __PCLMUL__ 1
686+
// CHECK_SKX_M64: #define __POPCNT__ 1
687+
// CHECK_SKX_M64: #define __RDRND__ 1
688+
// CHECK_SKX_M64: #define __RTM__ 1
689+
// CHECK_SKX_M64: #define __SSE2_MATH__ 1
690+
// CHECK_SKX_M64: #define __SSE2__ 1
691+
// CHECK_SKX_M64: #define __SSE3__ 1
692+
// CHECK_SKX_M64: #define __SSE4_1__ 1
693+
// CHECK_SKX_M64: #define __SSE4_2__ 1
694+
// CHECK_SKX_M64: #define __SSE_MATH__ 1
695+
// CHECK_SKX_M64: #define __SSE__ 1
696+
// CHECK_SKX_M64: #define __SSSE3__ 1
697+
// CHECK_SKX_M64: #define __amd64 1
698+
// CHECK_SKX_M64: #define __amd64__ 1
699+
// CHECK_SKX_M64: #define __skx 1
700+
// CHECK_SKX_M64: #define __skx__ 1
701+
// CHECK_SKX_M64: #define __tune_skx__ 1
702+
// CHECK_SKX_M64: #define __x86_64 1
703+
// CHECK_SKX_M64: #define __x86_64__ 1
704+
//
633705
// RUN: %clang -march=atom -m32 -E -dM %s -o - 2>&1 \
634706
// RUN: -target i386-unknown-linux \
635707
// RUN: | FileCheck %s -check-prefix=CHECK_ATOM_M32

Diff for: ‎clang/test/Preprocessor/x86_target_features.c

+45
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,51 @@
114114
// AVX512PF: #define __SSE__ 1
115115
// AVX512PF: #define __SSSE3__ 1
116116

117+
// RUN: %clang -target i386-unknown-unknown -march=atom -mavx512dq -x c -E -dM -o - %s | FileCheck --check-prefix=AVX512DQ %s
118+
119+
// AVX512DQ: #define __AVX2__ 1
120+
// AVX512DQ: #define __AVX512DQ__ 1
121+
// AVX512DQ: #define __AVX512F__ 1
122+
// AVX512DQ: #define __AVX__ 1
123+
// AVX512DQ: #define __SSE2_MATH__ 1
124+
// AVX512DQ: #define __SSE2__ 1
125+
// AVX512DQ: #define __SSE3__ 1
126+
// AVX512DQ: #define __SSE4_1__ 1
127+
// AVX512DQ: #define __SSE4_2__ 1
128+
// AVX512DQ: #define __SSE_MATH__ 1
129+
// AVX512DQ: #define __SSE__ 1
130+
// AVX512DQ: #define __SSSE3__ 1
131+
132+
// RUN: %clang -target i386-unknown-unknown -march=atom -mavx512bw -x c -E -dM -o - %s | FileCheck --check-prefix=AVX512BW %s
133+
134+
// AVX512BW: #define __AVX2__ 1
135+
// AVX512BW: #define __AVX512BW__ 1
136+
// AVX512BW: #define __AVX512F__ 1
137+
// AVX512BW: #define __AVX__ 1
138+
// AVX512BW: #define __SSE2_MATH__ 1
139+
// AVX512BW: #define __SSE2__ 1
140+
// AVX512BW: #define __SSE3__ 1
141+
// AVX512BW: #define __SSE4_1__ 1
142+
// AVX512BW: #define __SSE4_2__ 1
143+
// AVX512BW: #define __SSE_MATH__ 1
144+
// AVX512BW: #define __SSE__ 1
145+
// AVX512BW: #define __SSSE3__ 1
146+
147+
// RUN: %clang -target i386-unknown-unknown -march=atom -mavx512vl -x c -E -dM -o - %s | FileCheck --check-prefix=AVX512VL %s
148+
149+
// AVX512VL: #define __AVX2__ 1
150+
// AVX512VL: #define __AVX512F__ 1
151+
// AVX512VL: #define __AVX512VL__ 1
152+
// AVX512VL: #define __AVX__ 1
153+
// AVX512VL: #define __SSE2_MATH__ 1
154+
// AVX512VL: #define __SSE2__ 1
155+
// AVX512VL: #define __SSE3__ 1
156+
// AVX512VL: #define __SSE4_1__ 1
157+
// AVX512VL: #define __SSE4_2__ 1
158+
// AVX512VL: #define __SSE_MATH__ 1
159+
// AVX512VL: #define __SSE__ 1
160+
// AVX512VL: #define __SSSE3__ 1
161+
117162
// RUN: %clang -target i386-unknown-unknown -march=atom -mavx512pf -mno-avx512f -x c -E -dM -o - %s | FileCheck --check-prefix=AVX512F2 %s
118163

119164
// AVX512F2: #define __AVX2__ 1

0 commit comments

Comments
 (0)
Please sign in to comment.