Skip to content

Commit 9438694

Browse files
authored
[mlir][llvmir] Add llvm.intr.ldexp operation (#133070)
https://llvm.org/docs/LangRef.html#llvm-ldexp-intrinsic
1 parent ad51368 commit 9438694

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,22 @@ def LLVM_IsFPClass : LLVM_OneResultIntrOp<"is.fpclass", [], [0], [Pure],
106106
let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$in, I32Attr:$bit);
107107
}
108108

109+
class LLVM_PowFI<string func> :
110+
LLVM_OneResultIntrOp<func, [], [0,1],
111+
[Pure], /*requiresFastmath=*/1> {
112+
let arguments =
113+
(ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
114+
AnySignlessInteger:$power,
115+
DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
116+
let assemblyFormat = "`(` operands `)` attr-dict `:` "
117+
"functional-type(operands, results)";
118+
}
119+
109120
def LLVM_CopySignOp : LLVM_BinarySameArgsIntrOpF<"copysign">;
110121
def LLVM_ExpOp : LLVM_UnaryIntrOpF<"exp">;
111122
def LLVM_Exp2Op : LLVM_UnaryIntrOpF<"exp2">;
112123
def LLVM_Exp10Op : LLVM_UnaryIntrOpF<"exp10">;
124+
def LLVM_LoadExpOp: LLVM_PowFI<"ldexp">;
113125
def LLVM_FAbsOp : LLVM_UnaryIntrOpF<"fabs">;
114126
def LLVM_FCeilOp : LLVM_UnaryIntrOpF<"ceil">;
115127
def LLVM_FFloorOp : LLVM_UnaryIntrOpF<"floor">;
@@ -130,15 +142,7 @@ def LLVM_RoundOp : LLVM_UnaryIntrOpF<"round">;
130142
def LLVM_FTruncOp : LLVM_UnaryIntrOpF<"trunc">;
131143
def LLVM_SqrtOp : LLVM_UnaryIntrOpF<"sqrt">;
132144
def LLVM_PowOp : LLVM_BinarySameArgsIntrOpF<"pow">;
133-
def LLVM_PowIOp : LLVM_OneResultIntrOp<"powi", [], [0,1],
134-
[Pure], /*requiresFastmath=*/1> {
135-
let arguments =
136-
(ins LLVM_ScalarOrVectorOf<LLVM_AnyFloat>:$val,
137-
AnySignlessInteger:$power,
138-
DefaultValuedAttr<LLVM_FastmathFlagsAttr, "{}">:$fastmathFlags);
139-
let assemblyFormat = "`(` operands `)` attr-dict `:` "
140-
"functional-type(operands, results)";
141-
}
145+
def LLVM_PowIOp : LLVM_PowFI<"powi">;
142146
def LLVM_RintOp : LLVM_UnaryIntrOpF<"rint">;
143147
def LLVM_NearbyintOp : LLVM_UnaryIntrOpF<"nearbyint">;
144148
class LLVM_IntRoundIntrOpBase<string func> :

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ define void @exp10_test(float %0, <8 x float> %1) {
5151
ret void
5252
}
5353

54+
; CHECK-LABEL: llvm.func @ldexp_test
55+
define void @ldexp_test(float %0, <8 x float> %1, i32 %2) {
56+
; CHECK: llvm.intr.ldexp(%{{.*}}, %{{.*}}) : (f32, i32) -> f32
57+
%4 = call float @llvm.ldexp.f32.i32(float %0, i32 %2)
58+
; CHECK: llvm.intr.ldexp(%{{.*}}, %{{.*}}) : (vector<8xf32>, i32) -> vector<8xf32>
59+
%5 = call <8 x float> @llvm.ldexp.v8f32.i32(<8 x float> %1, i32 %2)
60+
ret void
61+
}
62+
5463
; CHECK-LABEL: llvm.func @log_test
5564
define void @log_test(float %0, <8 x float> %1) {
5665
; CHECK: llvm.intr.log(%{{.*}}) : (f32) -> f32
@@ -1077,6 +1086,8 @@ declare float @llvm.exp2.f32(float)
10771086
declare <8 x float> @llvm.exp2.v8f32(<8 x float>)
10781087
declare float @llvm.exp10.f32(float)
10791088
declare <8 x float> @llvm.exp10.v8f32(<8 x float>)
1089+
declare float @llvm.ldexp.f32.i32(float, i32)
1090+
declare <8 x float> @llvm.ldexp.v8f32.i32(<8 x float>, i32)
10801091
declare float @llvm.log.f32(float)
10811092
declare <8 x float> @llvm.log.v8f32(<8 x float>)
10821093
declare float @llvm.log10.f32(float)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ llvm.func @exp10_test(%arg0: f32, %arg1: vector<8xf32>) {
4949
llvm.return
5050
}
5151

52+
// CHECK-LABEL: @ldexp_test
53+
llvm.func @ldexp_test(%arg0: f32, %arg1: vector<8xf32>, %arg2: i32) {
54+
// CHECK: call float @llvm.ldexp.f32.i32(float %{{.*}}, i32 %{{.*}})
55+
"llvm.intr.ldexp"(%arg0, %arg2) : (f32, i32) -> f32
56+
// CHECK: call <8 x float> @llvm.ldexp.v8f32.i32(<8 x float> %{{.*}}, i32 %{{.*}})
57+
"llvm.intr.ldexp"(%arg1, %arg2) : (vector<8xf32>, i32) -> vector<8xf32>
58+
llvm.return
59+
}
60+
5261
// CHECK-LABEL: @log_test
5362
llvm.func @log_test(%arg0: f32, %arg1: vector<8xf32>) {
5463
// CHECK: call float @llvm.log.f32

0 commit comments

Comments
 (0)