diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp index f00d435937b92..157ddd8aca8ad 100644 --- a/clang/lib/Basic/Targets/X86.cpp +++ b/clang/lib/Basic/Targets/X86.cpp @@ -157,6 +157,14 @@ bool X86TargetInfo::initFeatureMap( if (getTriple().getArch() == llvm::Triple::x86_64) setFeatureEnabled(Features, "sse2", true); + // Enable SSE4.1 for Windows MSVC targets to support SIMD intrinsics like + // _mm_mullo_epi32 without requiring explicit /arch: flags. + if ((getTriple().getArch() == llvm::Triple::x86_64 || + getTriple().getArch() == llvm::Triple::x86) && + getTriple().isWindowsMSVCEnvironment()) { + setFeatureEnabled(Features, "sse4.1", true); + } + using namespace llvm::X86; SmallVector CPUFeatures; diff --git a/clang/test/CodeGen/x86-sse41-windows-msvc.c b/clang/test/CodeGen/x86-sse41-windows-msvc.c new file mode 100644 index 0000000000000..e9821c2f7eea9 --- /dev/null +++ b/clang/test/CodeGen/x86-sse41-windows-msvc.c @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple i386-pc-windows-msvc -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX +// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX + +// This test verifies that SSE4.1 is enabled by default for Windows MSVC targets +// to support SIMD intrinsics like _mm_mullo_epi32 + +#include + +__m128i test_sse41(void) { + __m128i a = _mm_set1_epi32(5); + __m128i b = _mm_set1_epi32(3); + return _mm_mullo_epi32(a, b); +} + +// CHECK: "target-features"="+sse4.1" +// LINUX-NOT: "target-features"="+sse4.1"