Skip to content

Commit 2974dd5

Browse files
committed
[mlir][llvmir] add llvm.experimental.constrained.sitofp intrinsics
Signed-off-by: Letu Ren <[email protected]>
1 parent 2d1517d commit 2974dd5

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,15 @@ class LLVM_ConstrainedIntr<string mnem, int numArgs,
459459
}];
460460
}
461461

462+
def LLVM_ConstrainedSIToFP
463+
: LLVM_ConstrainedIntr<"sitofp", /*numArgs=*/1,
464+
/*overloadedResult=*/1, /*overloadedOperands=*/[0],
465+
/*hasRoundingMode=*/1> {
466+
let assemblyFormat = [{
467+
$arg_0 $roundingmode $fpExceptionBehavior attr-dict `:` type($arg_0) `to` type(results)
468+
}];
469+
}
470+
462471
def LLVM_ConstrainedFPTruncIntr
463472
: LLVM_ConstrainedIntr<"fptrunc", /*numArgs=*/1,
464473
/*overloadedResult=*/1, /*overloadedOperands=*/[0],

mlir/test/Target/LLVMIR/Import/intrinsic.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,23 @@ define void @experimental_constrained_fptrunc(double %s, <4 x double> %v) {
10341034
ret void
10351035
}
10361036

1037+
; CHECK-LABEL: experimental_constrained_sitofp
1038+
define void @experimental_constrained_sitofp(i32 %s, <4 x i32> %v) {
1039+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} towardzero ignore : i32 to f32
1040+
%1 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %s, metadata !"round.towardzero", metadata !"fpexcept.ignore")
1041+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} tonearest maytrap : i32 to f32
1042+
%2 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %s, metadata !"round.tonearest", metadata !"fpexcept.maytrap")
1043+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} upward strict : i32 to f32
1044+
%3 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %s, metadata !"round.upward", metadata !"fpexcept.strict")
1045+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} downward ignore : i32 to f32
1046+
%4 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %s, metadata !"round.downward", metadata !"fpexcept.ignore")
1047+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} tonearestaway ignore : i32 to f32
1048+
%5 = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 %s, metadata !"round.tonearestaway", metadata !"fpexcept.ignore")
1049+
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} tonearestaway ignore : vector<4xi32> to vector<4xf32>
1050+
%6 = call <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32> %v, metadata !"round.tonearestaway", metadata !"fpexcept.ignore")
1051+
ret void
1052+
}
1053+
10371054
; CHECK-LABEL: experimental_constrained_fpext
10381055
define void @experimental_constrained_fpext(float %s, <4 x float> %v) {
10391056
; CHECK: llvm.intr.experimental.constrained.fpext %{{.*}} ignore : f32 to f64
@@ -1289,6 +1306,8 @@ declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
12891306
declare <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr>, <8 x i64>)
12901307
declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.v4f32(<vscale x 4 x float>, <4 x float>, i64)
12911308
declare <4 x float> @llvm.vector.extract.v4f32.nxv4f32(<vscale x 4 x float>, i64)
1309+
declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4i32(<4 x i32>, metadata, metadata)
1310+
declare float @llvm.experimental.constrained.fptrunc.f32.i32(i32, metadata, metadata)
12921311
declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x double>, metadata, metadata)
12931312
declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
12941313
declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)

mlir/test/Target/LLVMIR/llvmir-intrinsics.mlir

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,35 @@ llvm.func @vector_ptrmask(%p: !llvm.vec<8 x ptr>, %mask: vector<8 x i64>) -> !ll
11021102
llvm.return %0 : !llvm.vec<8 x ptr>
11031103
}
11041104

1105+
// CHECK-LABEL: @experimental_constrained_sitofp
1106+
llvm.func @experimental_constrained_sitofp(%s: i32, %v: vector<4 x i32>) {
1107+
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
1108+
// CHECK: metadata !"round.towardzero"
1109+
// CHECK: metadata !"fpexcept.ignore"
1110+
%0 = llvm.intr.experimental.constrained.sitofp %s towardzero ignore : i32 to f32
1111+
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
1112+
// CHECK: metadata !"round.tonearest"
1113+
// CHECK: metadata !"fpexcept.maytrap"
1114+
%1 = llvm.intr.experimental.constrained.sitofp %s tonearest maytrap : i32 to f32
1115+
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
1116+
// CHECK: metadata !"round.upward"
1117+
// CHECK: metadata !"fpexcept.strict"
1118+
%2 = llvm.intr.experimental.constrained.sitofp %s upward strict : i32 to f32
1119+
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
1120+
// CHECK: metadata !"round.downward"
1121+
// CHECK: metadata !"fpexcept.ignore"
1122+
%3 = llvm.intr.experimental.constrained.sitofp %s downward ignore : i32 to f32
1123+
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
1124+
// CHECK: metadata !"round.tonearestaway"
1125+
// CHECK: metadata !"fpexcept.ignore"
1126+
%4 = llvm.intr.experimental.constrained.sitofp %s tonearestaway ignore : i32 to f32
1127+
// CHECK: call <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(
1128+
// CHECK: metadata !"round.upward"
1129+
// CHECK: metadata !"fpexcept.strict"
1130+
%5 = llvm.intr.experimental.constrained.sitofp %v upward strict : vector<4 x i32> to vector<4 x f32>
1131+
llvm.return
1132+
}
1133+
11051134
// CHECK-LABEL: @experimental_constrained_fptrunc
11061135
llvm.func @experimental_constrained_fptrunc(%s: f64, %v: vector<4xf32>) {
11071136
// CHECK: call float @llvm.experimental.constrained.fptrunc.f32.f64(
@@ -1318,5 +1347,9 @@ llvm.func @experimental_constrained_fpext(%s: f32, %v: vector<4xf32>) {
13181347
// CHECK-DAG: declare ptr addrspace(1) @llvm.stacksave.p1()
13191348
// CHECK-DAG: declare void @llvm.stackrestore.p0(ptr)
13201349
// CHECK-DAG: declare void @llvm.stackrestore.p1(ptr addrspace(1))
1350+
// CHECK-DAG: declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
1351+
// CHECK-DAG: declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
13211352
// CHECK-DAG: declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
13221353
// CHECK-DAG: declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f32(<4 x float>, metadata, metadata)
1354+
// CHECK-DAG: declare double @llvm.experimental.constrained.fpext.f64.f32(float, metadata)
1355+
// CHECK-DAG: declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)

0 commit comments

Comments
 (0)