Skip to content

Commit 776f5c1

Browse files
formatting + refactor
1 parent 9eb5199 commit 776f5c1

File tree

3 files changed

+51
-11
lines changed

3 files changed

+51
-11
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinX86.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ static int64_t getIntValueFromConstOp(mlir::Value val) {
2626
return val.getDefiningOp<cir::ConstantOp>().getIntValue().getSExtValue();
2727
}
2828

29-
static mlir::Value emitClFlush(CIRGenFunction &cgf, const CallExpr *e,
30-
mlir::Value &op) {
31-
mlir::Type voidTy = cir::VoidType::get(&cgf.getMLIRContext());
29+
template <typename... Operands>
30+
static mlir::Value emitIntrinsicCallOp(CIRGenFunction &cgf, const CallExpr *e,
31+
const std::string &str,
32+
const mlir::Type &resTy,
33+
Operands &&...op) {
34+
CIRGenBuilderTy &builder = cgf.getBuilder();
3235
mlir::Location location = cgf.getLoc(e->getExprLoc());
33-
return cir::LLVMIntrinsicCallOp::create(
34-
cgf.getBuilder(), location,
35-
cgf.getBuilder().getStringAttr("x86.sse2.clflush"), voidTy, op)
36+
return cir::LLVMIntrinsicCallOp::create(builder, location,
37+
builder.getStringAttr(str), resTy,
38+
std::forward<Operands>(op)...)
3639
.getResult();
3740
}
3841

@@ -46,10 +49,8 @@ static mlir::Value emitPrefetch(CIRGenFunction &cgf, const CallExpr *e,
4649
mlir::Value locality = builder.getSignedInt(location, hint & 0x3, 32);
4750
mlir::Value data = builder.getSignedInt(location, 1, 32);
4851

49-
return cir::LLVMIntrinsicCallOp::create(
50-
builder, location, builder.getStringAttr("prefetch"), voidTy,
51-
mlir::ValueRange{address, rw, locality, data})
52-
.getResult();
52+
return emitIntrinsicCallOp(cgf, e, "prefetch", voidTy,
53+
mlir::ValueRange{address, rw, locality, data});
5354
}
5455

5556
mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
@@ -89,17 +90,24 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
8990
ops.push_back(emitScalarOrConstFoldImmArg(iceArguments, i, e));
9091
}
9192

93+
CIRGenBuilderTy &builder = getBuilder();
94+
mlir::Type voidTy = builder.getVoidTy();
95+
9296
switch (builtinID) {
9397
default:
9498
return {};
9599
case X86::BI_mm_prefetch:
96100
return emitPrefetch(*this, e, ops[0], getIntValueFromConstOp(ops[1]));
97101
case X86::BI_mm_clflush:
98-
return emitClFlush(*this, e, ops[0]);
102+
return emitIntrinsicCallOp(*this, e, "x86.sse2.clflush", voidTy, ops[0]);
99103
case X86::BI_mm_lfence:
104+
return emitIntrinsicCallOp(*this, e, "x86.sse2.lfence", voidTy);
100105
case X86::BI_mm_pause:
106+
return emitIntrinsicCallOp(*this, e, "x86.sse2.pause", voidTy);
101107
case X86::BI_mm_mfence:
108+
return emitIntrinsicCallOp(*this, e, "x86.sse2.mfence", voidTy);
102109
case X86::BI_mm_sfence:
110+
return emitIntrinsicCallOp(*this, e, "x86.sse.sfence", voidTy);
103111
case X86::BI__rdtsc:
104112
case X86::BI__builtin_ia32_rdtscp:
105113
case X86::BI__builtin_ia32_lzcnt_u16:

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,11 @@ void test_mm_prefetch(char const* p) {
2121
// CIR: cir.prefetch read locality(0) %{{.*}} : !cir.ptr<!void>
2222
// LLVM: call void @llvm.prefetch.p0(ptr {{.*}}, i32 0, i32 0, i32 1)
2323
}
24+
25+
void test_mm_sfence(void) {
26+
// CIR-LABEL: test_mm_sfence
27+
// LLVM-LABEL: test_mm_sfence
28+
_mm_sfence();
29+
// CIR: {{%.*}} = cir.call_llvm_intrinsic "x86.sse.sfence" : () -> !void
30+
// LLVM: call void @llvm.x86.sse.sfence()
31+
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,27 @@ void test_mm_clflush(void* A) {
2121
// CIR-CHECK: {{%.*}} = cir.call_llvm_intrinsic "x86.sse2.clflush" {{%.*}} : (!cir.ptr<!void>) -> !void
2222
// LLVM-CHECK: call void @llvm.x86.sse2.clflush(ptr {{%.*}})
2323
}
24+
25+
void test_mm_lfence(void) {
26+
// CIR-CHECK-LABEL: test_mm_lfence
27+
// LLVM-CHECK-LABEL: test_mm_lfence
28+
_mm_lfence();
29+
// CIR-CHECK: {{%.*}} = cir.call_llvm_intrinsic "x86.sse2.lfence" : () -> !void
30+
// LLVM-CHECK: call void @llvm.x86.sse2.lfence()
31+
}
32+
33+
void test_mm_mfence(void) {
34+
// CIR-CHECK-LABEL: test_mm_mfence
35+
// LLVM-CHECK-LABEL: test_mm_mfence
36+
_mm_mfence();
37+
// CIR-CHECK: {{%.*}} = cir.call_llvm_intrinsic "x86.sse2.mfence" : () -> !void
38+
// LLVM-CHECK: call void @llvm.x86.sse2.mfence()
39+
}
40+
41+
void test_mm_pause(void) {
42+
// CIR-LABEL: test_mm_pause
43+
// LLVM-LABEL: test_mm_pause
44+
_mm_pause();
45+
// CIR: {{%.*}} = cir.call_llvm_intrinsic "x86.sse2.pause" : () -> !void
46+
// LLVM: call void @llvm.x86.sse2.pause()
47+
}

0 commit comments

Comments
 (0)