Skip to content

Commit 85ba53b

Browse files
authored
[X86][clang-cl] Add AVX10.1/2 to CL option /arch (#167111)
Ref: https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170
1 parent 7ee0e0f commit 85ba53b

File tree

4 files changed

+73
-8
lines changed

4 files changed

+73
-8
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,8 @@ Android Support
595595

596596
Windows Support
597597
^^^^^^^^^^^^^^^
598+
- clang-cl now supports /arch:AVX10.1 and /arch:AVX10.2.
599+
- clang-cl now supports /vlen, /vlen=256 and /vlen=512.
598600

599601
- Clang now supports MSVC vector deleting destructors (GH19772).
600602

clang/lib/Driver/ToolChains/Arch/X86.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ std::string x86::getX86TargetCPU(const Driver &D, const ArgList &Args,
4242
{"AVX2", "haswell"},
4343
{"AVX512F", "knl"},
4444
{"AVX512", "skylake-avx512"},
45+
{"AVX10.1", "sapphirerapids"},
46+
{"AVX10.2", "diamondrapids"},
4547
});
4648
if (Triple.getArch() == llvm::Triple::x86) {
4749
// 32-bit-only /arch: flags.

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8274,22 +8274,29 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
82748274
llvm::Triple::ArchType AT = getToolChain().getArch();
82758275
StringRef Default = AT == llvm::Triple::x86 ? "IA32" : "SSE2";
82768276
StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch, Default);
8277+
llvm::SmallSet<StringRef, 4> Arch512 = {"AVX512F", "AVX512", "AVX10.1",
8278+
"AVX10.2"};
82778279

82788280
if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_512)) {
8279-
if (Arch == "AVX512F" || Arch == "AVX512")
8281+
if (Arch512.contains(Arch))
82808282
CmdArgs.push_back("-mprefer-vector-width=512");
82818283
else
82828284
D.Diag(diag::warn_drv_argument_not_allowed_with)
82838285
<< "/vlen=512" << std::string("/arch:").append(Arch);
8284-
}
8285-
8286-
if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) {
8287-
if (Arch == "AVX512F" || Arch == "AVX512")
8286+
} else if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) {
8287+
if (Arch512.contains(Arch))
82888288
CmdArgs.push_back("-mprefer-vector-width=256");
82898289
else if (Arch != "AVX" && Arch != "AVX2")
82908290
D.Diag(diag::warn_drv_argument_not_allowed_with)
82918291
<< "/vlen=256" << std::string("/arch:").append(Arch);
8292+
} else {
8293+
if (Arch == "AVX10.1" || Arch == "AVX10.2")
8294+
CmdArgs.push_back("-mprefer-vector-width=256");
82928295
}
8296+
} else {
8297+
StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch);
8298+
if (Arch == "AVX10.1" || Arch == "AVX10.2")
8299+
CmdArgs.push_back("-mprefer-vector-width=256");
82938300
}
82948301

82958302
Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);

clang/test/Driver/cl-x86-flags.c

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
// arch: args are case-sensitive.
2020
// RUN: %clang_cl -m32 -arch:ia32 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=ia32 %s
21-
// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, AVX2, AVX512, AVX512F, IA32, SSE, SSE2
21+
// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F, IA32, SSE, SSE2
2222

2323
// RUN: %clang_cl -m64 -arch:IA32 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=IA3264 %s
24-
// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, AVX2, AVX512, AVX512F
24+
// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F
2525

2626
// RUN: %clang_cl -m32 -arch:SSE --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_SSE -- %s
2727
#if defined(TEST_32_ARCH_SSE)
@@ -44,7 +44,7 @@
4444
// sse2: invalid /arch: argument
4545

4646
// RUN: %clang_cl -m64 -arch:SSE --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=SSE64 %s
47-
// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, AVX2, AVX512, AVX512F
47+
// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F
4848

4949
// RUN: %clang_cl -m64 -arch:SSE2 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=SSE264 %s
5050
// SSE264: invalid /arch: argument
@@ -80,6 +80,8 @@
8080
// avx512f: invalid /arch: argument
8181

8282
// RUN: %clang_cl -m32 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
83+
// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
84+
// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s
8385
#if defined(TEST_32_ARCH_AVX512)
8486
#if _M_IX86_FP != 2 || !__AVX__ || !__AVX2__ || !__AVX512F__ || !__AVX512BW__
8587
#error fail
@@ -89,6 +91,28 @@
8991
// RUN: %clang_cl -m32 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx512 %s
9092
// avx512: invalid /arch: argument
9193

94+
// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s
95+
// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s
96+
#if defined(TEST_32_ARCH_AVX10_1_ADD)
97+
#if !__AVX512VL__ || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || !__AVX512IFMA__ || !__AVX512VNNI__ ||\
98+
!__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || !__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__
99+
#error fail
100+
#endif
101+
#endif
102+
103+
// RUN: %clang_cl -m32 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_1 %s
104+
// avx10_1: invalid /arch: argument
105+
106+
// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_2_ADD -- %s
107+
#if defined(TEST_32_ARCH_AVX10_2_ADD)
108+
#if !__AVX10_2__
109+
#error fail
110+
#endif
111+
#endif
112+
113+
// RUN: %clang_cl -m32 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_2 %s
114+
// avx10_2: invalid /arch: argument
115+
92116
// RUN: %clang_cl -m64 -arch:AVX --target=x86_64-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX -- %s
93117
#if defined(TEST_64_ARCH_AVX)
94118
#if _M_IX86_FP || !__AVX__ || __AVX2__ || __AVX512F__ || __AVX512BW__
@@ -120,6 +144,8 @@
120144
// avx512f64: invalid /arch: argument
121145

122146
// RUN: %clang_cl -m64 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
147+
// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
148+
// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s
123149
#if defined(TEST_64_ARCH_AVX512)
124150
#if _M_IX86_FP || !__AVX__ || !__AVX2__ || !__AVX512F__ || !__AVX512BW__
125151
#error fail
@@ -129,14 +155,42 @@
129155
// RUN: %clang_cl -m64 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx51264 %s
130156
// avx51264: invalid /arch: argument
131157

158+
// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s
159+
// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s
160+
#if defined(TEST_64_ARCH_AVX10_1_ADD)
161+
#if !__AVX512VL__ || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || !__AVX512IFMA__ || !__AVX512VNNI__ ||\
162+
!__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || !__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__
163+
#error fail
164+
#endif
165+
#endif
166+
167+
// RUN: %clang_cl -m64 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_1_64 %s
168+
// avx10_1_64: invalid /arch: argument
169+
170+
// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_2_ADD -- %s
171+
#if defined(TEST_64_ARCH_AVX10_2_ADD)
172+
#if !__AVX10_2__
173+
#error fail
174+
#endif
175+
#endif
176+
177+
// RUN: %clang_cl -m64 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_2_64 %s
178+
// avx10_2_64: invalid /arch: argument
179+
132180
// RUN: %clang_cl -m64 -arch:AVX -tune:haswell --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=tune %s
133181
// tune: "-target-cpu" "sandybridge"
134182
// tune-SAME: "-tune-cpu" "haswell"
135183

136184
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
185+
// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
186+
// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s
137187
// vlen512: "-mprefer-vector-width=512"
138188

139189
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
190+
// RUN: %clang_cl -m64 -arch:AVX10.1 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
191+
// RUN: %clang_cl -m64 -arch:AVX10.2 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
192+
// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
193+
// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s
140194
// vlen256: "-mprefer-vector-width=256"
141195

142196
// RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 -vlen --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=novlen %s

0 commit comments

Comments
 (0)