Skip to content

Commit 33c739f

Browse files
authored
[CIR][CIRGen][Builtin][X86] Lower vec_set related intrinsics (#1731)
1 parent c0fb3b0 commit 33c739f

File tree

4 files changed

+101
-1
lines changed

4 files changed

+101
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,23 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
257257
case X86::BI__builtin_ia32_vec_set_v16hi:
258258
case X86::BI__builtin_ia32_vec_set_v8si:
259259
case X86::BI__builtin_ia32_vec_set_v4di: {
260-
llvm_unreachable("__builtin_ia32_vec_set_vXX NYI");
260+
unsigned NumElts = cast<cir::VectorType>(Ops[0].getType()).getSize();
261+
262+
auto constOp = cast<cir::ConstantOp>(Ops[2].getDefiningOp());
263+
auto intAttr = cast<cir::IntAttr>(constOp.getValue());
264+
uint64_t index = intAttr.getValue().getZExtValue();
265+
266+
index &= NumElts - 1;
267+
268+
auto indexAttr = cir::IntAttr::get(
269+
cir::IntType::get(&getMLIRContext(), 64, false), index);
270+
auto indexVal =
271+
builder.create<cir::ConstantOp>(getLoc(E->getExprLoc()), indexAttr);
272+
273+
// These builtins exist so we can ensure the index is an ICE and in range.
274+
// Otherwise we could just do this in the header file.
275+
return builder.create<cir::VecInsertOp>(getLoc(E->getExprLoc()), Ops[0],
276+
Ops[1], indexVal);
261277
}
262278
case X86::BI_mm_setcsr:
263279
case X86::BI__builtin_ia32_ldmxcsr: {

clang/test/CIR/CodeGen/X86/avx-builtins.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,45 @@ long long test_mm256_extract_epi64(__m256i A) {
5858
return _mm256_extract_epi64(A, 3);
5959
}
6060
#endif
61+
62+
__m256i test_mm256_insert_epi8(__m256i x, char b) {
63+
64+
// CIR-CHECK-LABEL: test_mm256_insert_epi8
65+
// CIR-CHECK-LABEL: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<{{!s8i|!u8i}} x 32>
66+
67+
// LLVM-CHECK-LABEL: test_mm256_insert_epi8
68+
// LLVM-CHECK: insertelement <32 x i8> %{{.*}}, i8 %{{.*}}, {{i32|i64}} 14
69+
return _mm256_insert_epi8(x, b, 14);
70+
}
71+
72+
__m256i test_mm256_insert_epi16(__m256i x, int b) {
73+
74+
// CIR-CHECK-LABEL: test_mm256_insert_epi16
75+
// CIR-CHECK: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<!s16i x 16>
76+
77+
// LLVM-CHECK-LABEL: test_mm256_insert_epi16
78+
// LLVM-CHECK: insertelement <16 x i16> %{{.*}}, i16 %{{.*}}, {{i32|i64}} 4
79+
return _mm256_insert_epi16(x, b, 4);
80+
}
81+
82+
__m256i test_mm256_insert_epi32(__m256i x, int b) {
83+
84+
// CIR-CHECK-LABEL: test_mm256_insert_epi32
85+
// CIR-CHECK: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<!s32i x 8>
86+
87+
// LLVM-CHECK-LABEL: test_mm256_insert_epi32
88+
// LLVM-CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, {{i32|i64}} 5
89+
return _mm256_insert_epi32(x, b, 5);
90+
}
91+
92+
#ifdef __x86_64__
93+
__m256i test_mm256_insert_epi64(__m256i x, long long b) {
94+
95+
// CIR-X64-LABEL: test_mm256_insert_epi64
96+
// CIR-X64: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<!s64i x 4>
97+
98+
// LLVM-X64-LABEL: test_mm256_insert_epi64
99+
// LLVM-X64: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, {{i32|i64}} 2
100+
return _mm256_insert_epi64(x, b, 2);
101+
}
102+
#endif

clang/test/CIR/CodeGen/X86/mmx-builtins.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,13 @@ int test_mm_extract_pi16(__m64 a) {
1919
// LLVM-CHECK: extractelement <4 x i16> %{{.*}}, i64 2
2020
return _mm_extract_pi16(a, 2);
2121
}
22+
23+
__m64 test_mm_insert_pi16(__m64 a, int d) {
24+
25+
// CIR-CHECK-LABEL: test_mm_insert_pi16
26+
// CIR-CHECK-LABEL: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : !u64i] : !cir.vector<!s16i x 4>
27+
28+
// LLVM-CHECK-LABEL: test_mm_insert_pi16
29+
// LLVM-CHECK: insertelement <4 x i16>
30+
return _mm_insert_pi16(a, d, 2);
31+
}

clang/test/CIR/CodeGen/X86/sse41-builtins.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,35 @@ int test_mm_extract_ps(__m128 x) {
4848
// LLVM-CHECK: extractelement <4 x float> %{{.*}}, {{i32|i64}} 1
4949
return _mm_extract_ps(x, 1);
5050
}
51+
52+
__m128i test_mm_insert_epi8(__m128i x, char b) {
53+
54+
// CIR-CHECK-LABEL: test_mm_insert_epi8
55+
// CIR-CHECK-LABEL: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<{{!s8i|!u8i}} x 16>
56+
57+
// LLVM-CHECK-LABEL: test_mm_insert_epi8
58+
// LLVM-CHECK: insertelement <16 x i8> %{{.*}}, i8 %{{.*}}, {{i32|i64}} 1
59+
return _mm_insert_epi8(x, b, 1);
60+
}
61+
62+
__m128i test_mm_insert_epi32(__m128i x, int b) {
63+
64+
// CIR-CHECK-LABEL: test_mm_insert_epi32
65+
// CIR-CHECK-LABEL: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<!s32i x 4>
66+
67+
// LLVM-CHECK-LABEL: test_mm_insert_epi32
68+
// LLVM-CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, {{i32|i64}} 1
69+
return _mm_insert_epi32(x, b, 1);
70+
}
71+
72+
#ifdef __x86_64__
73+
__m128i test_mm_insert_epi64(__m128i x, long long b) {
74+
75+
// CIR-X64-LABEL: test_mm_insert_epi64
76+
// CIR-X64: {{%.*}} = cir.vec.insert {{%.*}}, {{%.*}}[{{%.*}} : {{!u32i|!u64i}}] : !cir.vector<!s64i x 2>
77+
78+
// LLVM-X64-LABEL: test_mm_insert_epi64
79+
// LLVM-X64: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, {{i32|i64}} 1
80+
return _mm_insert_epi64(x, b, 1);
81+
}
82+
#endif

0 commit comments

Comments
 (0)