Skip to content

Commit e6bb358

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

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
@@ -327,11 +327,24 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned BuiltinID,
327327
}
328328
case X86::BI_mm_setcsr:
329329
case X86::BI__builtin_ia32_ldmxcsr: {
330-
llvm_unreachable("mm_setcsr NYI");
330+
Address tmp =
331+
CreateMemTemp(E->getArg(0)->getType(), getLoc(E->getExprLoc()));
332+
builder.createStore(getLoc(E->getExprLoc()), Ops[0], tmp);
333+
return builder
334+
.create<cir::LLVMIntrinsicCallOp>(
335+
getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.ldmxcsr"),
336+
builder.getVoidTy(), tmp.getPointer())
337+
.getResult();
331338
}
332339
case X86::BI_mm_getcsr:
333340
case X86::BI__builtin_ia32_stmxcsr: {
334-
llvm_unreachable("mm_getcsr NYI");
341+
Address tmp = CreateMemTemp(E->getType(), getLoc(E->getExprLoc()));
342+
builder
343+
.create<cir::LLVMIntrinsicCallOp>(
344+
getLoc(E->getExprLoc()), builder.getStringAttr("x86.sse.stmxcsr"),
345+
builder.getVoidTy(), tmp.getPointer())
346+
.getResult();
347+
return builder.createLoad(getLoc(E->getExprLoc()), tmp);
335348
}
336349

337350
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
@@ -29,3 +29,26 @@ void test_mm_sfence(void) {
2929
// CIR: {{%.*}} = cir.llvm.intrinsic "x86.sse.sfence" : () -> !void
3030
// LLVM: call void @llvm.x86.sse.sfence()
3131
}
32+
33+
void test_mm_setcsr(unsigned int A) {
34+
// CIR-LABEL: test_mm_setcsr
35+
// CIR: cir.store {{.*}}, {{.*}} : !u32i
36+
// CIR: cir.llvm.intrinsic "x86.sse.ldmxcsr" {{.*}} : (!cir.ptr<!u32i>) -> !void
37+
38+
// LLVM-LABEL: test_mm_setcsr
39+
// LLVM: store i32
40+
// LLVM: call void @llvm.x86.sse.ldmxcsr(ptr {{.*}})
41+
_mm_setcsr(A);
42+
}
43+
44+
unsigned int test_mm_getcsr(void) {
45+
// CIR-LABEL: test_mm_getcsr
46+
// CIR: cir.llvm.intrinsic "x86.sse.stmxcsr" %{{.*}} : (!cir.ptr<!u32i>) -> !void
47+
// CIR: cir.load {{.*}} : !cir.ptr<!u32i>, !u32i
48+
49+
// LLVM-LABEL: test_mm_getcsr
50+
// LLVM: call void @llvm.x86.sse.stmxcsr(ptr %{{.*}})
51+
// LLVM: load i32
52+
return _mm_getcsr();
53+
}
54+

0 commit comments

Comments
 (0)