Skip to content

Commit f859427

Browse files
[CIR] Upstream CIR codegen for mxcsr x86 builtins (llvm#167948)
1 parent 2f9f492 commit f859427

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,26 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
169169
case X86::BI__builtin_ia32_vec_set_v16hi:
170170
case X86::BI__builtin_ia32_vec_set_v8si:
171171
case X86::BI__builtin_ia32_vec_set_v4di:
172+
cgm.errorNYI(e->getSourceRange(),
173+
std::string("unimplemented X86 builtin call: ") +
174+
getContext().BuiltinInfo.getName(builtinID));
175+
return {};
172176
case X86::BI_mm_setcsr:
173-
case X86::BI__builtin_ia32_ldmxcsr:
177+
case X86::BI__builtin_ia32_ldmxcsr: {
178+
mlir::Location loc = getLoc(e->getExprLoc());
179+
Address tmp = createMemTemp(e->getArg(0)->getType(), loc);
180+
builder.createStore(loc, ops[0], tmp);
181+
return emitIntrinsicCallOp(*this, e, "x86.sse.ldmxcsr", builder.getVoidTy(),
182+
tmp.getPointer());
183+
}
174184
case X86::BI_mm_getcsr:
175-
case X86::BI__builtin_ia32_stmxcsr:
185+
case X86::BI__builtin_ia32_stmxcsr: {
186+
mlir::Location loc = getLoc(e->getExprLoc());
187+
Address tmp = createMemTemp(e->getType(), loc);
188+
emitIntrinsicCallOp(*this, e, "x86.sse.stmxcsr", builder.getVoidTy(),
189+
tmp.getPointer());
190+
return builder.createLoad(loc, tmp);
191+
}
176192
case X86::BI__builtin_ia32_xsave:
177193
case X86::BI__builtin_ia32_xsave64:
178194
case X86::BI__builtin_ia32_xrstor:

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,35 @@
1616

1717
#include <immintrin.h>
1818

19+
void test_mm_setcsr(unsigned int A) {
20+
// CIR-LABEL: test_mm_setcsr
21+
// CIR: cir.store {{.*}}, {{.*}} : !u32i
22+
// CIR: cir.call_llvm_intrinsic "x86.sse.ldmxcsr" {{.*}} : (!cir.ptr<!u32i>) -> !void
23+
24+
// LLVM-LABEL: test_mm_setcsr
25+
// LLVM: store i32
26+
// LLVM: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
27+
28+
// OGCG-LABEL: test_mm_setcsr
29+
// OGCG: store i32
30+
// OGCG: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
31+
_mm_setcsr(A);
32+
}
33+
34+
unsigned int test_mm_getcsr(void) {
35+
// CIR-LABEL: test_mm_getcsr
36+
// CIR: cir.call_llvm_intrinsic "x86.sse.stmxcsr" %{{.*}} : (!cir.ptr<!u32i>) -> !void
37+
// CIR: cir.load {{.*}} : !cir.ptr<!u32i>, !u32i
38+
39+
// LLVM-LABEL: test_mm_getcsr
40+
// LLVM: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
41+
// LLVM: load i32
42+
43+
// OGCG-LABEL: test_mm_getcsr
44+
// OGCG: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
45+
// OGCG: load i32
46+
return _mm_getcsr();
47+
}
1948

2049
void test_mm_sfence(void) {
2150
// CIR-LABEL: test_mm_sfence

0 commit comments

Comments
 (0)