[CIR] Upstream CIR codegen for mxcsr x86 builtins (#167948)

This commit is contained in:
Thibault Monnier 2025-11-19 21:34:49 +01:00 committed by GitHub
parent 2f9f492b3d
commit f85942728f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 2 deletions

View File

@ -169,10 +169,26 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
case X86::BI__builtin_ia32_vec_set_v16hi:
case X86::BI__builtin_ia32_vec_set_v8si:
case X86::BI__builtin_ia32_vec_set_v4di:
cgm.errorNYI(e->getSourceRange(),
std::string("unimplemented X86 builtin call: ") +
getContext().BuiltinInfo.getName(builtinID));
return {};
case X86::BI_mm_setcsr:
case X86::BI__builtin_ia32_ldmxcsr:
case X86::BI__builtin_ia32_ldmxcsr: {
mlir::Location loc = getLoc(e->getExprLoc());
Address tmp = createMemTemp(e->getArg(0)->getType(), loc);
builder.createStore(loc, ops[0], tmp);
return emitIntrinsicCallOp(*this, e, "x86.sse.ldmxcsr", builder.getVoidTy(),
tmp.getPointer());
}
case X86::BI_mm_getcsr:
case X86::BI__builtin_ia32_stmxcsr:
case X86::BI__builtin_ia32_stmxcsr: {
mlir::Location loc = getLoc(e->getExprLoc());
Address tmp = createMemTemp(e->getType(), loc);
emitIntrinsicCallOp(*this, e, "x86.sse.stmxcsr", builder.getVoidTy(),
tmp.getPointer());
return builder.createLoad(loc, tmp);
}
case X86::BI__builtin_ia32_xsave:
case X86::BI__builtin_ia32_xsave64:
case X86::BI__builtin_ia32_xrstor:

View File

@ -16,6 +16,35 @@
#include <immintrin.h>
void test_mm_setcsr(unsigned int A) {
// CIR-LABEL: test_mm_setcsr
// CIR: cir.store {{.*}}, {{.*}} : !u32i
// CIR: cir.call_llvm_intrinsic "x86.sse.ldmxcsr" {{.*}} : (!cir.ptr<!u32i>) -> !void
// LLVM-LABEL: test_mm_setcsr
// LLVM: store i32
// LLVM: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
// OGCG-LABEL: test_mm_setcsr
// OGCG: store i32
// OGCG: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
_mm_setcsr(A);
}
unsigned int test_mm_getcsr(void) {
// CIR-LABEL: test_mm_getcsr
// CIR: cir.call_llvm_intrinsic "x86.sse.stmxcsr" %{{.*}} : (!cir.ptr<!u32i>) -> !void
// CIR: cir.load {{.*}} : !cir.ptr<!u32i>, !u32i
// LLVM-LABEL: test_mm_getcsr
// LLVM: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
// LLVM: load i32
// OGCG-LABEL: test_mm_getcsr
// OGCG: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
// OGCG: load i32
return _mm_getcsr();
}
void test_mm_sfence(void) {
// CIR-LABEL: test_mm_sfence