diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3a4e1fce2511e..ad6727eda3a3f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -580,6 +580,8 @@ Android Support Windows Support ^^^^^^^^^^^^^^^ +- clang-cl now supports /arch:AVX10.1 and /arch:AVX10.2. +- clang-cl now supports /vlen, /vlen=256 and /vlen=512. LoongArch Support ^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp b/clang/lib/Driver/ToolChains/Arch/X86.cpp index 1373905a5120e..8adc5d5a9cd5b 100644 --- a/clang/lib/Driver/ToolChains/Arch/X86.cpp +++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp @@ -42,6 +42,8 @@ std::string x86::getX86TargetCPU(const Driver &D, const ArgList &Args, {"AVX2", "haswell"}, {"AVX512F", "knl"}, {"AVX512", "skylake-avx512"}, + {"AVX10.1", "sapphirerapids"}, + {"AVX10.2", "diamondrapids"}, }); if (Triple.getArch() == llvm::Triple::x86) { // 32-bit-only /arch: flags. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index e20963ac288d8..091726baadf18 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8272,22 +8272,29 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, llvm::Triple::ArchType AT = getToolChain().getArch(); StringRef Default = AT == llvm::Triple::x86 ? "IA32" : "SSE2"; StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch, Default); + llvm::SmallSet Arch512 = {"AVX512F", "AVX512", "AVX10.1", + "AVX10.2"}; if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_512)) { - if (Arch == "AVX512F" || Arch == "AVX512") + if (Arch512.contains(Arch)) CmdArgs.push_back("-mprefer-vector-width=512"); else D.Diag(diag::warn_drv_argument_not_allowed_with) << "/vlen=512" << std::string("/arch:").append(Arch); - } - - if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) { - if (Arch == "AVX512F" || Arch == "AVX512") + } else if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) { + if (Arch512.contains(Arch)) CmdArgs.push_back("-mprefer-vector-width=256"); else if (Arch != "AVX" && Arch != "AVX2") D.Diag(diag::warn_drv_argument_not_allowed_with) << "/vlen=256" << std::string("/arch:").append(Arch); + } else { + if (Arch == "AVX10.1" || Arch == "AVX10.2") + CmdArgs.push_back("-mprefer-vector-width=256"); } + } else { + StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch); + if (Arch == "AVX10.1" || Arch == "AVX10.2") + CmdArgs.push_back("-mprefer-vector-width=256"); } Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg); diff --git a/clang/test/Driver/cl-x86-flags.c b/clang/test/Driver/cl-x86-flags.c index 4dae49aab7ac7..84270aae35f7a 100644 --- a/clang/test/Driver/cl-x86-flags.c +++ b/clang/test/Driver/cl-x86-flags.c @@ -18,10 +18,10 @@ // arch: args are case-sensitive. // RUN: %clang_cl -m32 -arch:ia32 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=ia32 %s -// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, AVX2, AVX512, AVX512F, IA32, SSE, SSE2 +// ia32: invalid /arch: argument 'ia32'; for 32-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F, IA32, SSE, SSE2 // RUN: %clang_cl -m64 -arch:IA32 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=IA3264 %s -// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, AVX2, AVX512, AVX512F +// IA3264: invalid /arch: argument 'IA32'; for 64-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F // RUN: %clang_cl -m32 -arch:SSE --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_SSE -- %s #if defined(TEST_32_ARCH_SSE) @@ -44,7 +44,7 @@ // sse2: invalid /arch: argument // RUN: %clang_cl -m64 -arch:SSE --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=SSE64 %s -// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, AVX2, AVX512, AVX512F +// SSE64: invalid /arch: argument 'SSE'; for 64-bit expected one of AVX, AVX10.1, AVX10.2, AVX2, AVX512, AVX512F // RUN: %clang_cl -m64 -arch:SSE2 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=SSE264 %s // SSE264: invalid /arch: argument @@ -80,6 +80,8 @@ // avx512f: invalid /arch: argument // RUN: %clang_cl -m32 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s +// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s +// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX512 -- %s #if defined(TEST_32_ARCH_AVX512) #if _M_IX86_FP != 2 || !__AVX__ || !__AVX2__ || !__AVX512F__ || !__AVX512BW__ #error fail @@ -89,6 +91,28 @@ // RUN: %clang_cl -m32 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx512 %s // avx512: invalid /arch: argument +// RUN: %clang_cl -m32 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s +// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_1_ADD -- %s +#if defined(TEST_32_ARCH_AVX10_1_ADD) +#if !__AVX512VL__ || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || !__AVX512IFMA__ || !__AVX512VNNI__ ||\ + !__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || !__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__ +#error fail +#endif +#endif + +// RUN: %clang_cl -m32 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_1 %s +// avx10_1: invalid /arch: argument + +// RUN: %clang_cl -m32 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_32_ARCH_AVX10_2_ADD -- %s +#if defined(TEST_32_ARCH_AVX10_2_ADD) +#if !__AVX10_2__ +#error fail +#endif +#endif + +// RUN: %clang_cl -m32 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_2 %s +// avx10_2: invalid /arch: argument + // RUN: %clang_cl -m64 -arch:AVX --target=x86_64-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX -- %s #if defined(TEST_64_ARCH_AVX) #if _M_IX86_FP || !__AVX__ || __AVX2__ || __AVX512F__ || __AVX512BW__ @@ -120,6 +144,8 @@ // avx512f64: invalid /arch: argument // RUN: %clang_cl -m64 -arch:AVX512 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s +// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s +// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX512 -- %s #if defined(TEST_64_ARCH_AVX512) #if _M_IX86_FP || !__AVX__ || !__AVX2__ || !__AVX512F__ || !__AVX512BW__ #error fail @@ -129,14 +155,42 @@ // RUN: %clang_cl -m64 -arch:avx512 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx51264 %s // avx51264: invalid /arch: argument +// RUN: %clang_cl -m64 -arch:AVX10.1 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s +// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_1_ADD -- %s +#if defined(TEST_64_ARCH_AVX10_1_ADD) +#if !__AVX512VL__ || !__AVX512CD__ || !__AVX512DQ__ || !__AVX512VBMI__ || !__AVX512IFMA__ || !__AVX512VNNI__ ||\ + !__AVX512BF16__ || !__AVX512VPOPCNTDQ__ || !__AVX512VBMI2__ || !__AVX512VPOPCNTDQ__ || !__AVX512BITALG__ || !__AVX512FP16__ +#error fail +#endif +#endif + +// RUN: %clang_cl -m64 -arch:avx10.1 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_1_64 %s +// avx10_1_64: invalid /arch: argument + +// RUN: %clang_cl -m64 -arch:AVX10.2 --target=i386-pc-windows /c /Fo%t.obj -Xclang -verify -DTEST_64_ARCH_AVX10_2_ADD -- %s +#if defined(TEST_64_ARCH_AVX10_2_ADD) +#if !__AVX10_2__ +#error fail +#endif +#endif + +// RUN: %clang_cl -m64 -arch:avx10.2 --target=i386-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=avx10_2_64 %s +// avx10_2_64: invalid /arch: argument + // RUN: %clang_cl -m64 -arch:AVX -tune:haswell --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=tune %s // tune: "-target-cpu" "sandybridge" // tune-SAME: "-tune-cpu" "haswell" // RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s +// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s +// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=512 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen512 %s // vlen512: "-mprefer-vector-width=512" // RUN: %clang_cl -m64 -arch:AVX512 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s +// RUN: %clang_cl -m64 -arch:AVX10.1 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s +// RUN: %clang_cl -m64 -arch:AVX10.2 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s +// RUN: %clang_cl -m64 -arch:AVX10.1 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s +// RUN: %clang_cl -m64 -arch:AVX10.2 -vlen=256 --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=vlen256 %s // vlen256: "-mprefer-vector-width=256" // RUN: %clang_cl -m64 -arch:AVX512 -vlen=512 -vlen --target=x86_64-pc-windows -### -- 2>&1 %s | FileCheck -check-prefix=novlen %s