Skip to content

Commit bdc4fdc

Browse files
committed
[CIR][CIRGen][Builtin][X86] lower stmx and ldmx intrinsics
1 parent aed448e commit bdc4fdc

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,24 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
344344
}
345345
case X86::BI_mm_setcsr:
346346
case X86::BI__builtin_ia32_ldmxcsr: {
347-
llvm_unreachable("mm_setcsr NYI");
347+
Address tmp =
348+
CreateMemTemp(E->getArg(0)->getType(), getLoc(E->getExprLoc()));
349+
builder.createStore(getLoc(E->getExprLoc()), Ops[0], tmp);
350+
return builder
351+
.create<cir::LLVMIntrinsicCallOp>(
352+
getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.ldmxcsr"),
353+
builder.getVoidTy(), tmp.getPointer())
354+
.getResult();
348355
}
349356
case X86::BI_mm_getcsr:
350357
case X86::BI__builtin_ia32_stmxcsr: {
351-
llvm_unreachable("mm_getcsr NYI");
358+
Address tmp = CreateMemTemp(E->getType(), getLoc(E->getExprLoc()));
359+
builder
360+
.create<cir::LLVMIntrinsicCallOp>(
361+
getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.stmxcsr"),
362+
builder.getVoidTy(), tmp.getPointer())
363+
.getResult();
364+
return builder.createLoad(getLoc(E->getExprLoc()), tmp);
352365
}
353366

354367
case X86::BI__builtin_ia32_xsave:

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,26 @@ __m128 test_mm_undefined_ps(void) {
4242
// LLVM: ret <4 x float> %{{.*}}
4343
return _mm_undefined_ps();
4444
}
45+
46+
void test_mm_setcsr(unsigned int A) {
47+
// CIR-LABEL: test_mm_setcsr
48+
// CIR: cir.store {{.*}}, {{.*}} : !u32i
49+
// CIR: cir.llvm.intrinsic "x86.sse.ldmxcsr" {{.*}} : (!cir.ptr<!u32i>) -> !void
50+
51+
// LLVM-LABEL: test_mm_setcsr
52+
// LLVM: store i32
53+
// LLVM: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
54+
_mm_setcsr(A);
55+
}
56+
57+
unsigned int test_mm_getcsr(void) {
58+
// CIR-LABEL: test_mm_getcsr
59+
// CIR: cir.llvm.intrinsic "x86.sse.stmxcsr" %{{.*}} : (!cir.ptr<!u32i>) -> !void
60+
// CIR: cir.load {{.*}} : !cir.ptr<!u32i>, !u32i
61+
62+
// LLVM-LABEL: test_mm_getcsr
63+
// LLVM: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
64+
// LLVM: load i32
65+
return _mm_getcsr();
66+
}
67+

0 commit comments

Comments
 (0)