diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index 5e9264c615fb..1b88c17ab080 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -973,8 +973,39 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID, case X86::BI__builtin_ia32_insertf64x2_256: case X86::BI__builtin_ia32_inserti64x2_256: case X86::BI__builtin_ia32_insertf64x2_512: - case X86::BI__builtin_ia32_inserti64x2_512: - llvm_unreachable("insertf128 NYI"); + case X86::BI__builtin_ia32_inserti64x2_512: { + unsigned dstNumElts = cast(Ops[0].getType()).getSize(); + unsigned srcNumElts = cast(Ops[1].getType()).getSize(); + unsigned subVectors = dstNumElts / srcNumElts; + unsigned index = + Ops[2].getDefiningOp().getIntValue().getZExtValue(); + assert(llvm::isPowerOf2_32(subVectors) && "Expected power of 2 subvectors"); + index &= subVectors - 1; // Remove any extra bits. + index *= srcNumElts; + + int64_t indices[16]; + for (unsigned i = 0; i != dstNumElts; ++i) + indices[i] = (i >= srcNumElts) ? srcNumElts + (i % srcNumElts) : i; + + cir::ConstantOp poisonVec = + builder.getConstant(getLoc(E->getExprLoc()), + builder.getAttr(Ops[1].getType())); + + mlir::Value op1 = + builder.createVecShuffle(getLoc(E->getExprLoc()), Ops[1], poisonVec, + ArrayRef(indices, dstNumElts)); + + for (unsigned i = 0; i != dstNumElts; ++i) { + if (i >= index && i < (index + srcNumElts)) + indices[i] = (i - index) + dstNumElts; + else + indices[i] = i; + } + + return builder.createVecShuffle(getLoc(E->getExprLoc()), Ops[0], op1, + ArrayRef(indices, dstNumElts)); + } + case X86::BI__builtin_ia32_pmovqd512_mask: case X86::BI__builtin_ia32_pmovwb512_mask: llvm_unreachable("pmovqd512_mask NYI"); diff --git a/clang/test/CIR/CodeGen/X86/avx-builtins.c b/clang/test/CIR/CodeGen/X86/avx-builtins.c index 14cf5afa889c..b33d37bd2808 100644 --- a/clang/test/CIR/CodeGen/X86/avx-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx-builtins.c @@ -172,3 +172,36 @@ __m256 test_mm256_blend_ps(__m256 A, __m256 B) { // OGCG: shufflevector <8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x i32> return _mm256_blend_ps(A, B, 0x35); } + +__m256d test_mm256_insertf128_pd(__m256d A, __m128d B) { + // CIR-LABEL: test_mm256_insertf128_pd + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm256_insertf128_pd + // LLVM: shufflevector <2 x double> %{{.*}}, <2 x double> poison, <4 x i32> + // LLVM: shufflevector <4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x i32> + return _mm256_insertf128_pd(A, B, 0); +} + +__m256 test_mm256_insertf128_ps(__m256 A, __m128 B) { + // CIR-LABEL: test_mm256_insertf128_ps + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm256_insertf128_ps + // LLVM: shufflevector <4 x float> %{{.*}}, <4 x float> poison, <8 x i32> + // LLVM: shufflevector <8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x i32> + return _mm256_insertf128_ps(A, B, 1); +} + +__m256i test_mm256_insertf128_si256(__m256i A, __m128i B) { + // CIR-LABEL: test_mm256_insertf128_si256 + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] + + // LLVM-LABEL: test_mm256_insertf128_si256 + // LLVM: shufflevector <4 x i32> %{{.*}}, <4 x i32> poison, <8 x i32> + // LLVM: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> + return _mm256_insertf128_si256(A, B, 0); +} diff --git a/clang/test/CIR/CodeGen/X86/avx-shuffle-builtins.c b/clang/test/CIR/CodeGen/X86/avx-shuffle-builtins.c new file mode 100644 index 000000000000..ac46350fb1f0 --- /dev/null +++ b/clang/test/CIR/CodeGen/X86/avx-shuffle-builtins.c @@ -0,0 +1,95 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 +// REQUIRES: x86-registered-target +// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux -target-feature +avx -disable-O0-optnone -fclangir -emit-cir -o %t.cir | opt -S -passes=mem2reg +// RUN: FileCheck --check-prefixes=CIR --input-file=%t.cir %s + +// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-unknown-linux -target-feature +avx -disable-O0-optnone -fclangir -emit-llvm -o %t.ll | opt -S -passes=mem2reg +// RUN: FileCheck --check-prefixes=LLVM --input-file=%t.ll %s + +#include + +// CIR-LABEL: @test_mm256_insertf128_pd_0( +// CIR: [[A:%.*]] = cir.load align(32) %0 : !cir.ptr>, !cir.vector +// CIR: [[B:%.*]] = cir.load align(16) %1 : !cir.ptr>, !cir.vector +// CIR: %{{.*}} = cir.vec.shuffle([[B]], %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector +// CIR-NEXT: %{{.*}} = cir.vec.shuffle([[A]], %{{.*}} : !s32i, #cir.int<5> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector +// CIR: cir.return %{{.*}} : !cir.vector + + +// LLVM-LABEL: @test_mm256_insertf128_pd_0 +// LLVM: [[A:%.*]] = load <4 x double>, ptr %{{.*}}, align 32 +// LLVM: [[B:%.*]] = load <2 x double>, ptr %{{.*}}, align 16 +// LLVM-NEXT: [[WIDEN:%.*]] = shufflevector <2 x double> [[B]], <2 x double> poison, <4 x i32> +// LLVM-NEXT: [[INSERT:%.*]] = shufflevector <4 x double> [[A]], <4 x double> [[WIDEN]], <4 x i32> +// LLVM: ret <4 x double> +__m256d test_mm256_insertf128_pd_0(__m256d a, __m128d b) { + return _mm256_insertf128_pd(a, b, 0); +} + +// CIR-LABEL: @test_mm256_insertf128_ps_0( +// CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR-NEXT: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR: cir.return %{{.*}} : !cir.vector + +// LLVM-LABEL: @test_mm256_insertf128_ps_0( +// LLVM: %{{.*}} = shufflevector <4 x float> %{{.*}}, <4 x float> poison, <8 x i32> +// LLVM-NEXT: %{{.*}} = shufflevector <8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x i32> +// LLVM: ret <8 x float> %{{.*}} +// +__m256 test_mm256_insertf128_ps_0(__m256 a, __m128 b) { + return _mm256_insertf128_ps(a, b, 0); +} + +// CIR-LABEL: @test_mm256_insertf128_ps_1( +// CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR-NEXT: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector +// CIR: cir.return %{{.*}} : !cir.vector + +// LLVM-LABEL: define dso_local <8 x float> @test_mm256_insertf128_ps_1( +// LLVM: %{{.*}} = shufflevector <4 x float> %{{.*}}, <4 x float> poison, <8 x i32> +// LLVM-NEXT: %{{.*}} = shufflevector <8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x i32> +// LLVM: ret <8 x float> %{{.*}} +// +__m256 test_mm256_insertf128_ps_1(__m256 a, __m128 b) { + return _mm256_insertf128_ps(a, b, 1); +} + +// CIR-LABEL: @test_mm256_insertf128_si256_0( +// CIR: [[TMP0:%.*]] = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: [[TMP1:%.*]] = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: %{{.*}} = cir.vec.shuffle([[TMP1]], %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR-NEXT: %{{.*}} = cir.vec.shuffle([[TMP0]], %{{.*}} : !cir.vector) [#cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR: %{{.*}} = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: cir.return %{{.*}} : !cir.vector + +// LLVM-LABEL: @test_mm256_insertf128_si256_0 +// LLVM: [[TMP0:%.*]] = bitcast <4 x i64> %{{.*}} to <8 x i32> +// LLVM: [[TMP1:%.*]] = bitcast <2 x i64> %{{.*}} to <4 x i32> +// LLVM: [[WIDEN:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <8 x i32> +// LLVM-NEXT: [[INSERT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[WIDEN]], <8 x i32> +// LLVM: [[TMP2:%.*]] = bitcast <8 x i32> [[INSERT]] to <4 x i64> +// LLVM: ret <4 x i64> %{{.*}} +// +__m256i test_mm256_insertf128_si256_0(__m256i a, __m128i b) { + return _mm256_insertf128_si256(a, b, 0); +} + +// CIR-LABEL: @test_mm256_insertf128_si256_1( +// CIR: [[TMP0:%.*]] = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: [[TMP1:%.*]] = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: %{{.*}} = cir.vec.shuffle([[TMP1]], %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector +// CIR-NEXT: %{{.*}} = cir.vec.shuffle([[TMP0]], %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector +// CIR: %{{.*}} = cir.cast(bitcast, %{{.*}} : !cir.vector), !cir.vector +// CIR: cir.return %{{.*}} : !cir.vector + +// LLVM-LABEL: @test_mm256_insertf128_si256_1 +// LLVM: [[TMP0:%.*]] = bitcast <4 x i64> %{{.*}} to <8 x i32> +// LLVM: [[TMP1:%.*]] = bitcast <2 x i64> %{{.*}} to <4 x i32> +// LLVM: [[WIDEN:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <8 x i32> +// LLVM-NEXT: [[INSERT:%.*]] = shufflevector <8 x i32> [[TMP0]], <8 x i32> [[WIDEN]], <8 x i32> +// LLVM: [[TMP2:%.*]] = bitcast <8 x i32> [[INSERT]] to <4 x i64> +// LLVM: ret <4 x i64> %{{.*}} +// +__m256i test_mm256_insertf128_si256_1(__m256i a, __m128i b) { + return _mm256_insertf128_si256(a, b, 1); +} \ No newline at end of file diff --git a/clang/test/CIR/CodeGen/X86/avx2-builtins.c b/clang/test/CIR/CodeGen/X86/avx2-builtins.c index b7b4733c4d42..f167344328fa 100644 --- a/clang/test/CIR/CodeGen/X86/avx2-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx2-builtins.c @@ -71,4 +71,42 @@ __m256i test_mm256_blend_epi32(__m256i a, __m256i b) { // OGCG-NOT: @llvm.x86.avx2.pblendd.256 // OGCG: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> return _mm256_blend_epi32(a, b, 0x35); -} \ No newline at end of file +} + +__m256i test0_mm256_inserti128_si256(__m256i a, __m128i b) { + + // CIR-LABEL: test0_mm256_inserti128_si256 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + + // LLVM-LABEL: test0_mm256_inserti128_si256 + // LLVM: shufflevector <2 x i64> %{{.*}}, <2 x i64> poison, <4 x i32> + // LLVM: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_inserti128_si256(a, b, 0); +} + +__m256i test1_mm256_inserti128_si256(__m256i a, __m128i b) { + // CIR-LABEL: test1_mm256_inserti128_si256 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i] : !cir.vector + + // LLVM-LABEL: test1_mm256_inserti128_si256 + // LLVM: shufflevector <2 x i64> %{{.*}}, <2 x i64> poison, <4 x i32> + // LLVM: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_inserti128_si256(a, b, 1); +} + +// Immediate should be truncated to one bit. +__m256i test2_mm256_inserti128_si256(__m256i a, __m128i b) { + // CIR-LABEL: test2_mm256_inserti128_si256 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i] : !cir.vector + + // LLVM-LABEL: test2_mm256_inserti128_si256 + // LLVM: shufflevector <2 x i64> %{{.*}}, <2 x i64> poison, <4 x i32> + // LLVM: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_inserti128_si256(a, b, 0); +} + + + diff --git a/clang/test/CIR/CodeGen/X86/avx512dq-builtins.c b/clang/test/CIR/CodeGen/X86/avx512dq-builtins.c index a73ddd3d66f8..11a007e89cb9 100644 --- a/clang/test/CIR/CodeGen/X86/avx512dq-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512dq-builtins.c @@ -14,3 +14,39 @@ __m512i test_mm512_movm_epi64(__mmask8 __A) { // LLVM: %{{.*}} = sext <8 x i1> %{{.*}} to <8 x i64> return _mm512_movm_epi64(__A); } + +__m512 test_mm512_insertf32x8(__m512 __A, __m256 __B) { + // CIR-LABEL: test_mm512_insertf32x8 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i, #cir.int<16> : !s32i, #cir.int<17> : !s32i, #cir.int<18> : !s32i, #cir.int<19> : !s32i, #cir.int<20> : !s32i, #cir.int<21> : !s32i, #cir.int<22> : !s32i, #cir.int<23> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm512_insertf32x8 + // LLVM: shufflevector <16 x float> %{{.*}}, <16 x float> %{{.*}}, <16 x i32> + return _mm512_insertf32x8(__A, __B, 1); +} + +__m512i test_mm512_inserti32x8(__m512i __A, __m256i __B) { + // CIR-LABEL: test_mm512_inserti32x8 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i, #cir.int<16> : !s32i, #cir.int<17> : !s32i, #cir.int<18> : !s32i, #cir.int<19> : !s32i, #cir.int<20> : !s32i, #cir.int<21> : !s32i, #cir.int<22> : !s32i, #cir.int<23> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm512_inserti32x8 + // LLVM: shufflevector <16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> + return _mm512_inserti32x8(__A, __B, 1); +} + +__m512d test_mm512_insertf64x2(__m512d __A, __m128d __B) { + // CIR-LABEL: test_mm512_insertf64x2 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm512_insertf64x2 + // LLVM: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> + return _mm512_insertf64x2(__A, __B, 3); +} + +__m512i test_mm512_inserti64x2(__m512i __A, __m128i __B) { + // CIR-LABEL: test_mm512_inserti64x2 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i, #cir.int<6> : !s32i, #cir.int<7> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm512_inserti64x2 + // LLVM: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> + return _mm512_inserti64x2(__A, __B, 1); +} \ No newline at end of file diff --git a/clang/test/CIR/CodeGen/X86/avx512f-builtins.c b/clang/test/CIR/CodeGen/X86/avx512f-builtins.c index a094a0828897..b10eb4b94860 100644 --- a/clang/test/CIR/CodeGen/X86/avx512f-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512f-builtins.c @@ -634,3 +634,39 @@ void test_mm512_mask_i64scatter_epi32(void *__addr, __mmask8 __mask, __m512i __i // LLVM: @llvm.x86.avx512.mask.scatter.qpi.512 return _mm512_mask_i64scatter_epi32(__addr, __mask, __index, __v1, 2); } + +__m512d test_mm512_insertf64x4(__m512d __A, __m256d __B) { + // CIR-LABEL: test_mm512_insertf64x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm512_insertf64x4 + // LLVM: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> + return _mm512_insertf64x4(__A, __B, 1); +} + +__m512 test_mm512_insertf32x4(__m512 __A, __m128 __B) { + // CIR-LABEL: test_mm512_insertf32x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<16> : !s32i, #cir.int<17> : !s32i, #cir.int<18> : !s32i, #cir.int<19> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i, #cir.int<12> : !s32i, #cir.int<13> : !s32i, #cir.int<14> : !s32i, #cir.int<15> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm512_insertf32x4 + // LLVM: shufflevector <16 x float> %{{.*}}, <16 x float> %{{.*}}, <16 x i32> + return _mm512_insertf32x4(__A, __B, 1); +} + +__m512i test_mm512_inserti64x4(__m512i __A, __m256i __B) { + // CIR-LABEL: test_mm512_inserti64x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm512_inserti64x4 + // LLVM: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> + return _mm512_inserti64x4(__A, __B, 1); +} + +__m512i test_mm512_inserti32x4(__m512i __A, __m128i __B) { + // CIR-LABEL: test_mm512_inserti32x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<16> : !s32i, #cir.int<17> : !s32i, #cir.int<18> : !s32i, #cir.int<19> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i, #cir.int<12> : !s32i, #cir.int<13> : !s32i, #cir.int<14> : !s32i, #cir.int<15> : !s32i] : !cir.vector + + // LLVM-LABEL: test_mm512_inserti32x4 + // LLVM: shufflevector <16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> + return _mm512_inserti32x4(__A, __B, 1); +} diff --git a/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c b/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c index 6d4f70520d81..2ecb50e06559 100644 --- a/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512vl-builtins.c @@ -1029,3 +1029,21 @@ void test_mm256_mask_i32scatter_epi32(int *__addr, __mmask8 __mask, __m256i __i // LLVM: @llvm.x86.avx512.mask.scattersiv8.si return _mm256_mask_i32scatter_epi32(__addr,__mask,__index,__v1,2); } + +__m256 test_mm256_insertf32x4(__m256 __A, __m128 __B) { + // CIR-LABEL: test_mm256_insertf32x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm256_insertf32x4 + // LLVM: shufflevector <8 x float> %{{.*}}, <8 x float> %{{.*}}, <8 x i32> + return _mm256_insertf32x4(__A, __B, 1); +} + +__m256i test_mm256_inserti32x4(__m256i __A, __m128i __B) { + // CIR-LABEL: test_mm256_inserti32x4 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.int<3> : !s32i, #cir.int<8> : !s32i, #cir.int<9> : !s32i, #cir.int<10> : !s32i, #cir.int<11> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm256_inserti32x4 + // LLVM: shufflevector <8 x i32> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> + return _mm256_inserti32x4(__A, __B, 1); +} diff --git a/clang/test/CIR/CodeGen/X86/avx512vldq-builtins.c b/clang/test/CIR/CodeGen/X86/avx512vldq-builtins.c index dc57a1d0bfd6..aa13d18f7d10 100644 --- a/clang/test/CIR/CodeGen/X86/avx512vldq-builtins.c +++ b/clang/test/CIR/CodeGen/X86/avx512vldq-builtins.c @@ -65,3 +65,21 @@ __m256i test_mm256_movm_epi64(__mmask8 __A) { // LLVM: %{{.*}} = sext <4 x i1> %{{.*}} to <4 x i64> return _mm256_movm_epi64(__A); } + +__m256d test_mm256_insertf64x2(__m256d __A, __m128d __B) { + // CIR-LABEL: test_mm256_insertf64x2 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm256_insertf64x2 + // LLVM: shufflevector <4 x double> %{{.*}}, <4 x double> %{{.*}}, <4 x i32> + return _mm256_insertf64x2(__A, __B, 1); +} + +__m256i test_mm256_inserti64x2(__m256i __A, __m128i __B) { + // CIR-LABEL: test_mm256_inserti64x2 + // CIR: %{{.*}} = cir.vec.shuffle(%{{.*}}, %{{.*}} : !cir.vector) [#cir.int<0> : !s32i, #cir.int<1> : !s32i, #cir.int<4> : !s32i, #cir.int<5> : !s32i] : !cir.vector + + // LLVM-LABEL: @test_mm256_inserti64x2 + // LLVM: shufflevector <4 x i64> %{{.*}}, <4 x i64> %{{.*}}, <4 x i32> + return _mm256_inserti64x2(__A, __B, 1); +}