Skip to content

Commit 47f0f8c

Browse files
authored
[WebAssembly] Add exp10 libcall signatures (#69661)
The llvm.exp.* family of intrinsics and their corresponding libcalls were recently added, which means we need to know their signatures.
1 parent 20fc8e8 commit 47f0f8c

File tree

2 files changed

+38
-32
lines changed

2 files changed

+38
-32
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ struct RuntimeLibcallSignatureTable {
191191
Table[RTLIB::EXP2_F32] = f32_func_f32;
192192
Table[RTLIB::EXP2_F64] = f64_func_f64;
193193
Table[RTLIB::EXP2_F128] = i64_i64_func_i64_i64;
194+
Table[RTLIB::EXP10_F32] = f32_func_f32;
195+
Table[RTLIB::EXP10_F64] = f64_func_f64;
196+
Table[RTLIB::EXP10_F128] = i64_i64_func_i64_i64;
194197
Table[RTLIB::SIN_F32] = f32_func_f32;
195198
Table[RTLIB::SIN_F64] = f64_func_f64;
196199
Table[RTLIB::SIN_F128] = i64_i64_func_i64_i64;

llvm/test/CodeGen/WebAssembly/libcalls.ll

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ declare double @llvm.pow.f64(double, double)
1818
declare double @llvm.powi.f64.i32(double, i32)
1919
declare double @llvm.log.f64(double)
2020
declare double @llvm.exp.f64(double)
21+
declare double @llvm.exp10.f64(double)
2122
declare double @llvm.ldexp.f64.i32(double, i32)
2223
declare {double, i32} @llvm.frexp.f64.i32(double)
2324
declare i32 @llvm.lround(double)
@@ -239,38 +240,39 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
239240
; CHECK: .functype f64libcalls (f64, f64, i32) -> (f64)
240241
; CHECK-NEXT: .local i32
241242
; CHECK-NEXT: # %bb.0:
242-
; CHECK-NEXT: global.get $push10=, __stack_pointer
243-
; CHECK-NEXT: i32.const $push11=, 16
244-
; CHECK-NEXT: i32.sub $push17=, $pop10, $pop11
245-
; CHECK-NEXT: local.tee $push16=, 3, $pop17
246-
; CHECK-NEXT: global.set __stack_pointer, $pop16
247-
; CHECK-NEXT: local.get $push21=, 0
248-
; CHECK-NEXT: local.get $push18=, 0
249-
; CHECK-NEXT: call $push0=, cos, $pop18
243+
; CHECK-NEXT: global.get $push11=, __stack_pointer
244+
; CHECK-NEXT: i32.const $push12=, 16
245+
; CHECK-NEXT: i32.sub $push18=, $pop11, $pop12
246+
; CHECK-NEXT: local.tee $push17=, 3, $pop18
247+
; CHECK-NEXT: global.set __stack_pointer, $pop17
248+
; CHECK-NEXT: local.get $push22=, 0
249+
; CHECK-NEXT: local.get $push19=, 0
250+
; CHECK-NEXT: call $push0=, cos, $pop19
250251
; CHECK-NEXT: call $push1=, log10, $pop0
251-
; CHECK-NEXT: local.get $push19=, 1
252-
; CHECK-NEXT: call $push2=, pow, $pop1, $pop19
253-
; CHECK-NEXT: local.get $push20=, 2
254-
; CHECK-NEXT: call $push3=, __powidf2, $pop2, $pop20
252+
; CHECK-NEXT: local.get $push20=, 1
253+
; CHECK-NEXT: call $push2=, pow, $pop1, $pop20
254+
; CHECK-NEXT: local.get $push21=, 2
255+
; CHECK-NEXT: call $push3=, __powidf2, $pop2, $pop21
255256
; CHECK-NEXT: call $push4=, log, $pop3
256257
; CHECK-NEXT: call $push5=, exp, $pop4
257-
; CHECK-NEXT: call $push6=, cbrt, $pop5
258-
; CHECK-NEXT: call $push7=, lround, $pop6
259-
; CHECK-NEXT: call $push8=, ldexp, $pop21, $pop7
260-
; CHECK-NEXT: local.get $push22=, 3
261-
; CHECK-NEXT: i32.const $push14=, 12
262-
; CHECK-NEXT: i32.add $push15=, $pop22, $pop14
263-
; CHECK-NEXT: call $push23=, frexp, $pop8, $pop15
264-
; CHECK-NEXT: local.set 0, $pop23
265-
; CHECK-NEXT: local.get $push24=, 3
266-
; CHECK-NEXT: i32.load $push9=, 12($pop24)
267-
; CHECK-NEXT: call escape_value, $pop9
258+
; CHECK-NEXT: call $push6=, exp10, $pop5
259+
; CHECK-NEXT: call $push7=, cbrt, $pop6
260+
; CHECK-NEXT: call $push8=, lround, $pop7
261+
; CHECK-NEXT: call $push9=, ldexp, $pop22, $pop8
262+
; CHECK-NEXT: local.get $push23=, 3
263+
; CHECK-NEXT: i32.const $push15=, 12
264+
; CHECK-NEXT: i32.add $push16=, $pop23, $pop15
265+
; CHECK-NEXT: call $push24=, frexp, $pop9, $pop16
266+
; CHECK-NEXT: local.set 0, $pop24
268267
; CHECK-NEXT: local.get $push25=, 3
269-
; CHECK-NEXT: i32.const $push12=, 16
270-
; CHECK-NEXT: i32.add $push13=, $pop25, $pop12
271-
; CHECK-NEXT: global.set __stack_pointer, $pop13
272-
; CHECK-NEXT: local.get $push26=, 0
273-
; CHECK-NEXT: return $pop26
268+
; CHECK-NEXT: i32.load $push10=, 12($pop25)
269+
; CHECK-NEXT: call escape_value, $pop10
270+
; CHECK-NEXT: local.get $push26=, 3
271+
; CHECK-NEXT: i32.const $push13=, 16
272+
; CHECK-NEXT: i32.add $push14=, $pop26, $pop13
273+
; CHECK-NEXT: global.set __stack_pointer, $pop14
274+
; CHECK-NEXT: local.get $push27=, 0
275+
; CHECK-NEXT: return $pop27
274276

275277

276278
%a = call double @llvm.cos.f64(double %x)
@@ -279,10 +281,11 @@ define double @f64libcalls(double %x, double %y, i32 %z) {
279281
%d = call double @llvm.powi.f64.i32(double %c, i32 %z)
280282
%e = call double @llvm.log.f64(double %d)
281283
%f = call double @llvm.exp.f64(double %e)
282-
%g = call fast double @llvm.pow.f64(double %f, double 0x3FD5555555555555)
283-
%h = call i32 @llvm.lround(double %g)
284-
%i = call double @llvm.ldexp.f64.i32(double %x, i32 %h);
285-
%result = call {double, i32} @llvm.frexp.f64.i32(double %i)
284+
%g = call double @llvm.exp10.f64(double %f)
285+
%h = call fast double @llvm.pow.f64(double %g, double 0x3FD5555555555555)
286+
%i = call i32 @llvm.lround(double %h)
287+
%j = call double @llvm.ldexp.f64.i32(double %x, i32 %i);
288+
%result = call {double, i32} @llvm.frexp.f64.i32(double %j)
286289
%result.0 = extractvalue { double, i32 } %result, 0
287290
%result.1 = extractvalue { double, i32 } %result, 1
288291
call void @escape_value(i32 %result.1)

0 commit comments

Comments
 (0)