diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp index aa1a9d7be9cc..1e48f489bd61 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp @@ -344,11 +344,24 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID, } case X86::BI_mm_setcsr: case X86::BI__builtin_ia32_ldmxcsr: { - llvm_unreachable("mm_setcsr NYI"); + Address tmp = + CreateMemTemp(E->getArg(0)->getType(), getLoc(E->getExprLoc())); + builder.createStore(getLoc(E->getExprLoc()), Ops[0], tmp); + return builder + .create( + getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.ldmxcsr"), + builder.getVoidTy(), tmp.getPointer()) + .getResult(); } case X86::BI_mm_getcsr: case X86::BI__builtin_ia32_stmxcsr: { - llvm_unreachable("mm_getcsr NYI"); + Address tmp = CreateMemTemp(E->getType(), getLoc(E->getExprLoc())); + builder + .create( + getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.stmxcsr"), + builder.getVoidTy(), tmp.getPointer()) + .getResult(); + return builder.createLoad(getLoc(E->getExprLoc()), tmp); } case X86::BI__builtin_ia32_xsave: diff --git a/clang/test/CIR/CodeGen/X86/sse-builtins.c b/clang/test/CIR/CodeGen/X86/sse-builtins.c index e014e1ab4d88..fd10c5541f9f 100644 --- a/clang/test/CIR/CodeGen/X86/sse-builtins.c +++ b/clang/test/CIR/CodeGen/X86/sse-builtins.c @@ -42,3 +42,26 @@ __m128 test_mm_undefined_ps(void) { // LLVM: ret <4 x float> %{{.*}} return _mm_undefined_ps(); } + +void test_mm_setcsr(unsigned int A) { + // CIR-LABEL: test_mm_setcsr + // CIR: cir.store {{.*}}, {{.*}} : !u32i + // CIR: cir.llvm.intrinsic "x86.sse.ldmxcsr" {{.*}} : (!cir.ptr) -> !void + + // LLVM-LABEL: test_mm_setcsr + // LLVM: store i32 + // LLVM: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}}) + _mm_setcsr(A); +} + +unsigned int test_mm_getcsr(void) { + // CIR-LABEL: test_mm_getcsr + // CIR: cir.llvm.intrinsic "x86.sse.stmxcsr" %{{.*}} : (!cir.ptr) -> !void + // CIR: cir.load {{.*}} : !cir.ptr, !u32i + + // LLVM-LABEL: test_mm_getcsr + // LLVM: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}}) + // LLVM: load i32 + return _mm_getcsr(); +} +