Skip to content

Commit 29cb003

Browse files
authored
[mlir][llvmir] add llvm.experimental.constrained.uitofp intrinsics (#133300)
https://llvm.org/docs/LangRef.html#llvm-experimental-constrained-uitofp-intrinsic Signed-off-by: Letu Ren <[email protected]>
1 parent 68f71aa commit 29cb003

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,15 @@ class LLVM_ConstrainedIntr<string mnem, int numArgs,
471471
}];
472472
}
473473

474+
def LLVM_ConstrainedUIToFP
475+
: LLVM_ConstrainedIntr<"uitofp", /*numArgs=*/1,
476+
/*overloadedResult=*/1, /*overloadedOperands=*/[0],
477+
/*hasRoundingMode=*/1> {
478+
let assemblyFormat = [{
479+
$arg_0 $roundingmode $fpExceptionBehavior attr-dict `:` type($arg_0) `to` type(results)
480+
}];
481+
}
482+
474483
def LLVM_ConstrainedSIToFP
475484
: LLVM_ConstrainedIntr<"sitofp", /*numArgs=*/1,
476485
/*overloadedResult=*/1, /*overloadedOperands=*/[0],

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,23 @@ define void @experimental_constrained_fptrunc(double %s, <4 x double> %v) {
10521052
ret void
10531053
}
10541054

1055+
; CHECK-LABEL: experimental_constrained_uitofp
1056+
define void @experimental_constrained_uitofp(i32 %s, <4 x i32> %v) {
1057+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} towardzero ignore : i32 to f32
1058+
%1 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %s, metadata !"round.towardzero", metadata !"fpexcept.ignore")
1059+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} tonearest maytrap : i32 to f32
1060+
%2 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %s, metadata !"round.tonearest", metadata !"fpexcept.maytrap")
1061+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} upward strict : i32 to f32
1062+
%3 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %s, metadata !"round.upward", metadata !"fpexcept.strict")
1063+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} downward ignore : i32 to f32
1064+
%4 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %s, metadata !"round.downward", metadata !"fpexcept.ignore")
1065+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} tonearestaway ignore : i32 to f32
1066+
%5 = call float @llvm.experimental.constrained.uitofp.f32.i32(i32 %s, metadata !"round.tonearestaway", metadata !"fpexcept.ignore")
1067+
; CHECK: llvm.intr.experimental.constrained.uitofp %{{.*}} tonearestaway ignore : vector<4xi32> to vector<4xf32>
1068+
%6 = call <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32> %v, metadata !"round.tonearestaway", metadata !"fpexcept.ignore")
1069+
ret void
1070+
}
1071+
10551072
; CHECK-LABEL: experimental_constrained_sitofp
10561073
define void @experimental_constrained_sitofp(i32 %s, <4 x i32> %v) {
10571074
; CHECK: llvm.intr.experimental.constrained.sitofp %{{.*}} towardzero ignore : i32 to f32
@@ -1328,8 +1345,10 @@ declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
13281345
declare <8 x ptr> @llvm.ptrmask.v8p0.v8i64(<8 x ptr>, <8 x i64>)
13291346
declare <vscale x 4 x float> @llvm.vector.insert.nxv4f32.v4f32(<vscale x 4 x float>, <4 x float>, i64)
13301347
declare <4 x float> @llvm.vector.extract.v4f32.nxv4f32(<vscale x 4 x float>, i64)
1331-
declare <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4i32(<4 x i32>, metadata, metadata)
1332-
declare float @llvm.experimental.constrained.fptrunc.f32.i32(i32, metadata, metadata)
1348+
declare <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
1349+
declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)
1350+
declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
1351+
declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
13331352
declare <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x double>, metadata, metadata)
13341353
declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)
13351354
declare <4 x double> @llvm.experimental.constrained.fpext.v4f64.v4f32(<4 x float>, metadata)

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,6 +1120,35 @@ llvm.func @vector_ptrmask(%p: !llvm.vec<8 x ptr>, %mask: vector<8 x i64>) -> !ll
11201120
llvm.return %0 : !llvm.vec<8 x ptr>
11211121
}
11221122

1123+
// CHECK-LABEL: @experimental_constrained_uitofp
1124+
llvm.func @experimental_constrained_uitofp(%s: i32, %v: vector<4 x i32>) {
1125+
// CHECK: call float @llvm.experimental.constrained.uitofp.f32.i32(
1126+
// CHECK: metadata !"round.towardzero"
1127+
// CHECK: metadata !"fpexcept.ignore"
1128+
%0 = llvm.intr.experimental.constrained.uitofp %s towardzero ignore : i32 to f32
1129+
// CHECK: call float @llvm.experimental.constrained.uitofp.f32.i32(
1130+
// CHECK: metadata !"round.tonearest"
1131+
// CHECK: metadata !"fpexcept.maytrap"
1132+
%1 = llvm.intr.experimental.constrained.uitofp %s tonearest maytrap : i32 to f32
1133+
// CHECK: call float @llvm.experimental.constrained.uitofp.f32.i32(
1134+
// CHECK: metadata !"round.upward"
1135+
// CHECK: metadata !"fpexcept.strict"
1136+
%2 = llvm.intr.experimental.constrained.uitofp %s upward strict : i32 to f32
1137+
// CHECK: call float @llvm.experimental.constrained.uitofp.f32.i32(
1138+
// CHECK: metadata !"round.downward"
1139+
// CHECK: metadata !"fpexcept.ignore"
1140+
%3 = llvm.intr.experimental.constrained.uitofp %s downward ignore : i32 to f32
1141+
// CHECK: call float @llvm.experimental.constrained.uitofp.f32.i32(
1142+
// CHECK: metadata !"round.tonearestaway"
1143+
// CHECK: metadata !"fpexcept.ignore"
1144+
%4 = llvm.intr.experimental.constrained.uitofp %s tonearestaway ignore : i32 to f32
1145+
// CHECK: call <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(
1146+
// CHECK: metadata !"round.upward"
1147+
// CHECK: metadata !"fpexcept.strict"
1148+
%5 = llvm.intr.experimental.constrained.uitofp %v upward strict : vector<4 x i32> to vector<4 x f32>
1149+
llvm.return
1150+
}
1151+
11231152
// CHECK-LABEL: @experimental_constrained_sitofp
11241153
llvm.func @experimental_constrained_sitofp(%s: i32, %v: vector<4 x i32>) {
11251154
// CHECK: call float @llvm.experimental.constrained.sitofp.f32.i32(
@@ -1373,6 +1402,8 @@ llvm.func @experimental_constrained_fpext(%s: f32, %v: vector<4xf32>) {
13731402
// CHECK-DAG: declare ptr addrspace(1) @llvm.stacksave.p1()
13741403
// CHECK-DAG: declare void @llvm.stackrestore.p0(ptr)
13751404
// CHECK-DAG: declare void @llvm.stackrestore.p1(ptr addrspace(1))
1405+
// CHECK-DAG: declare float @llvm.experimental.constrained.uitofp.f32.i32(i32, metadata, metadata)
1406+
// CHECK-DAG: declare <4 x float> @llvm.experimental.constrained.uitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
13761407
// CHECK-DAG: declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
13771408
// CHECK-DAG: declare <4 x float> @llvm.experimental.constrained.sitofp.v4f32.v4i32(<4 x i32>, metadata, metadata)
13781409
// CHECK-DAG: declare float @llvm.experimental.constrained.fptrunc.f32.f64(double, metadata, metadata)

0 commit comments

Comments
 (0)