[CIR] Upstream CIR codegen for mxcsr x86 builtins (#167948)
This commit is contained in:
parent
2f9f492b3d
commit
f85942728f
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user