| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s | |
| ; These intrinsics are currently expanded, because wasi-libc does not have the specific libcalls. | |
| target triple = "wasm32-unknown-wasi" | |
| define fp128 @minimum_f128(fp128 %x, fp128 %y) { | |
| ; CHECK-LABEL: minimum_f128: | |
| ; CHECK: .functype minimum_f128 (i32, i64, i64, i64, i64) -> () | |
| ; CHECK-NEXT: .local i32, i32, i32, i32 | |
| ; CHECK-NEXT: # %bb.0: | |
| ; CHECK-NEXT: local.get $push41=, 0 | |
| ; CHECK-NEXT: i64.const $push3=, 9223231299366420480 | |
| ; CHECK-NEXT: local.get $push28=, 2 | |
| ; CHECK-NEXT: local.get $push27=, 4 | |
| ; CHECK-NEXT: local.get $push26=, 1 | |
| ; CHECK-NEXT: local.get $push25=, 2 | |
| ; CHECK-NEXT: local.get $push24=, 3 | |
| ; CHECK-NEXT: local.get $push23=, 4 | |
| ; CHECK-NEXT: call $push1=, __lttf2, $pop26, $pop25, $pop24, $pop23 | |
| ; CHECK-NEXT: i32.const $push0=, 0 | |
| ; CHECK-NEXT: i32.lt_s $push22=, $pop1, $pop0 | |
| ; CHECK-NEXT: local.tee $push21=, 5, $pop22 | |
| ; CHECK-NEXT: i64.select $push2=, $pop28, $pop27, $pop21 | |
| ; CHECK-NEXT: local.get $push32=, 1 | |
| ; CHECK-NEXT: local.get $push31=, 2 | |
| ; CHECK-NEXT: local.get $push30=, 3 | |
| ; CHECK-NEXT: local.get $push29=, 4 | |
| ; CHECK-NEXT: call $push20=, __unordtf2, $pop32, $pop31, $pop30, $pop29 | |
| ; CHECK-NEXT: local.tee $push19=, 6, $pop20 | |
| ; CHECK-NEXT: i64.select $push4=, $pop3, $pop2, $pop19 | |
| ; CHECK-NEXT: local.get $push36=, 2 | |
| ; CHECK-NEXT: local.get $push35=, 4 | |
| ; CHECK-NEXT: local.get $push34=, 1 | |
| ; CHECK-NEXT: local.get $push33=, 2 | |
| ; CHECK-NEXT: call $push5=, __trunctfsf2, $pop34, $pop33 | |
| ; CHECK-NEXT: i32.reinterpret_f32 $push6=, $pop5 | |
| ; CHECK-NEXT: i32.const $push7=, -2147483648 | |
| ; CHECK-NEXT: i32.eq $push18=, $pop6, $pop7 | |
| ; CHECK-NEXT: local.tee $push17=, 7, $pop18 | |
| ; CHECK-NEXT: i64.select $push8=, $pop36, $pop35, $pop17 | |
| ; CHECK-NEXT: local.get $push40=, 1 | |
| ; CHECK-NEXT: local.get $push39=, 2 | |
| ; CHECK-NEXT: local.get $push38=, 3 | |
| ; CHECK-NEXT: local.get $push37=, 4 | |
| ; CHECK-NEXT: call $push16=, __eqtf2, $pop40, $pop39, $pop38, $pop37 | |
| ; CHECK-NEXT: local.tee $push15=, 8, $pop16 | |
| ; CHECK-NEXT: i64.select $push9=, $pop4, $pop8, $pop15 | |
| ; CHECK-NEXT: i64.store 8($pop41), $pop9 | |
| ; CHECK-NEXT: local.get $push50=, 0 | |
| ; CHECK-NEXT: i64.const $push11=, 0 | |
| ; CHECK-NEXT: local.get $push44=, 1 | |
| ; CHECK-NEXT: local.get $push43=, 3 | |
| ; CHECK-NEXT: local.get $push42=, 5 | |
| ; CHECK-NEXT: i64.select $push10=, $pop44, $pop43, $pop42 | |
| ; CHECK-NEXT: local.get $push45=, 6 | |
| ; CHECK-NEXT: i64.select $push12=, $pop11, $pop10, $pop45 | |
| ; CHECK-NEXT: local.get $push48=, 1 | |
| ; CHECK-NEXT: local.get $push47=, 3 | |
| ; CHECK-NEXT: local.get $push46=, 7 | |
| ; CHECK-NEXT: i64.select $push13=, $pop48, $pop47, $pop46 | |
| ; CHECK-NEXT: local.get $push49=, 8 | |
| ; CHECK-NEXT: i64.select $push14=, $pop12, $pop13, $pop49 | |
| ; CHECK-NEXT: i64.store 0($pop50), $pop14 | |
| ; CHECK-NEXT: return | |
| %r = call fp128 @llvm.minimum.f128(fp128 %x, fp128 %y) | |
| ret fp128 %r | |
| } | |
| define fp128 @maximum_f128(fp128 %x, fp128 %y) { | |
| ; CHECK-LABEL: maximum_f128: | |
| ; CHECK: .functype maximum_f128 (i32, i64, i64, i64, i64) -> () | |
| ; CHECK-NEXT: .local i32, i32, i32, i32 | |
| ; CHECK-NEXT: # %bb.0: | |
| ; CHECK-NEXT: local.get $push39=, 0 | |
| ; CHECK-NEXT: i64.const $push3=, 9223231299366420480 | |
| ; CHECK-NEXT: local.get $push26=, 2 | |
| ; CHECK-NEXT: local.get $push25=, 4 | |
| ; CHECK-NEXT: local.get $push24=, 1 | |
| ; CHECK-NEXT: local.get $push23=, 2 | |
| ; CHECK-NEXT: local.get $push22=, 3 | |
| ; CHECK-NEXT: local.get $push21=, 4 | |
| ; CHECK-NEXT: call $push1=, __gttf2, $pop24, $pop23, $pop22, $pop21 | |
| ; CHECK-NEXT: i32.const $push0=, 0 | |
| ; CHECK-NEXT: i32.gt_s $push20=, $pop1, $pop0 | |
| ; CHECK-NEXT: local.tee $push19=, 5, $pop20 | |
| ; CHECK-NEXT: i64.select $push2=, $pop26, $pop25, $pop19 | |
| ; CHECK-NEXT: local.get $push30=, 1 | |
| ; CHECK-NEXT: local.get $push29=, 2 | |
| ; CHECK-NEXT: local.get $push28=, 3 | |
| ; CHECK-NEXT: local.get $push27=, 4 | |
| ; CHECK-NEXT: call $push18=, __unordtf2, $pop30, $pop29, $pop28, $pop27 | |
| ; CHECK-NEXT: local.tee $push17=, 6, $pop18 | |
| ; CHECK-NEXT: i64.select $push4=, $pop3, $pop2, $pop17 | |
| ; CHECK-NEXT: local.get $push34=, 4 | |
| ; CHECK-NEXT: local.get $push33=, 2 | |
| ; CHECK-NEXT: local.get $push32=, 1 | |
| ; CHECK-NEXT: local.get $push31=, 2 | |
| ; CHECK-NEXT: call $push5=, __trunctfsf2, $pop32, $pop31 | |
| ; CHECK-NEXT: i32.reinterpret_f32 $push16=, $pop5 | |
| ; CHECK-NEXT: local.tee $push15=, 7, $pop16 | |
| ; CHECK-NEXT: i64.select $push6=, $pop34, $pop33, $pop15 | |
| ; CHECK-NEXT: local.get $push38=, 1 | |
| ; CHECK-NEXT: local.get $push37=, 2 | |
| ; CHECK-NEXT: local.get $push36=, 3 | |
| ; CHECK-NEXT: local.get $push35=, 4 | |
| ; CHECK-NEXT: call $push14=, __eqtf2, $pop38, $pop37, $pop36, $pop35 | |
| ; CHECK-NEXT: local.tee $push13=, 8, $pop14 | |
| ; CHECK-NEXT: i64.select $push7=, $pop4, $pop6, $pop13 | |
| ; CHECK-NEXT: i64.store 8($pop39), $pop7 | |
| ; CHECK-NEXT: local.get $push48=, 0 | |
| ; CHECK-NEXT: i64.const $push9=, 0 | |
| ; CHECK-NEXT: local.get $push42=, 1 | |
| ; CHECK-NEXT: local.get $push41=, 3 | |
| ; CHECK-NEXT: local.get $push40=, 5 | |
| ; CHECK-NEXT: i64.select $push8=, $pop42, $pop41, $pop40 | |
| ; CHECK-NEXT: local.get $push43=, 6 | |
| ; CHECK-NEXT: i64.select $push10=, $pop9, $pop8, $pop43 | |
| ; CHECK-NEXT: local.get $push46=, 3 | |
| ; CHECK-NEXT: local.get $push45=, 1 | |
| ; CHECK-NEXT: local.get $push44=, 7 | |
| ; CHECK-NEXT: i64.select $push11=, $pop46, $pop45, $pop44 | |
| ; CHECK-NEXT: local.get $push47=, 8 | |
| ; CHECK-NEXT: i64.select $push12=, $pop10, $pop11, $pop47 | |
| ; CHECK-NEXT: i64.store 0($pop48), $pop12 | |
| ; CHECK-NEXT: return | |
| %r = call fp128 @llvm.maximum.f128(fp128 %x, fp128 %y) | |
| ret fp128 %r | |
| } | |
| define fp128 @minimumnum_f128(fp128 %x, fp128 %y) { | |
| ; CHECK-LABEL: minimumnum_f128: | |
| ; CHECK: .functype minimumnum_f128 (i32, i64, i64, i64, i64) -> () | |
| ; CHECK-NEXT: .local i32, i32, i64 | |
| ; CHECK-NEXT: # %bb.0: | |
| ; CHECK-NEXT: local.get $push34=, 4 | |
| ; CHECK-NEXT: local.get $push33=, 2 | |
| ; CHECK-NEXT: local.get $push32=, 1 | |
| ; CHECK-NEXT: local.get $push31=, 2 | |
| ; CHECK-NEXT: local.get $push30=, 1 | |
| ; CHECK-NEXT: local.get $push29=, 2 | |
| ; CHECK-NEXT: call $push28=, __unordtf2, $pop32, $pop31, $pop30, $pop29 | |
| ; CHECK-NEXT: local.tee $push27=, 5, $pop28 | |
| ; CHECK-NEXT: i64.select $push26=, $pop34, $pop33, $pop27 | |
| ; CHECK-NEXT: local.tee $push25=, 2, $pop26 | |
| ; CHECK-NEXT: local.get $push40=, 4 | |
| ; CHECK-NEXT: local.get $push38=, 3 | |
| ; CHECK-NEXT: local.get $push37=, 4 | |
| ; CHECK-NEXT: local.get $push36=, 3 | |
| ; CHECK-NEXT: local.get $push35=, 4 | |
| ; CHECK-NEXT: call $push24=, __unordtf2, $pop38, $pop37, $pop36, $pop35 | |
| ; CHECK-NEXT: local.tee $push23=, 6, $pop24 | |
| ; CHECK-NEXT: i64.select $push39=, $pop25, $pop40, $pop23 | |
| ; CHECK-NEXT: local.set 7, $pop39 | |
| ; CHECK-NEXT: local.get $push51=, 2 | |
| ; CHECK-NEXT: local.get $push50=, 7 | |
| ; CHECK-NEXT: local.get $push43=, 3 | |
| ; CHECK-NEXT: local.get $push42=, 1 | |
| ; CHECK-NEXT: local.get $push41=, 5 | |
| ; CHECK-NEXT: i64.select $push22=, $pop43, $pop42, $pop41 | |
| ; CHECK-NEXT: local.tee $push21=, 4, $pop22 | |
| ; CHECK-NEXT: local.get $push48=, 2 | |
| ; CHECK-NEXT: local.get $push46=, 4 | |
| ; CHECK-NEXT: local.get $push45=, 3 | |
| ; CHECK-NEXT: local.get $push44=, 6 | |
| ; CHECK-NEXT: i64.select $push20=, $pop46, $pop45, $pop44 | |
| ; CHECK-NEXT: local.tee $push19=, 1, $pop20 | |
| ; CHECK-NEXT: local.get $push47=, 7 | |
| ; CHECK-NEXT: call $push1=, __lttf2, $pop21, $pop48, $pop19, $pop47 | |
| ; CHECK-NEXT: i32.const $push0=, 0 | |
| ; CHECK-NEXT: i32.lt_s $push18=, $pop1, $pop0 | |
| ; CHECK-NEXT: local.tee $push17=, 5, $pop18 | |
| ; CHECK-NEXT: i64.select $push49=, $pop51, $pop50, $pop17 | |
| ; CHECK-NEXT: local.set 3, $pop49 | |
| ; CHECK-NEXT: local.get $push61=, 0 | |
| ; CHECK-NEXT: local.get $push60=, 3 | |
| ; CHECK-NEXT: local.get $push55=, 2 | |
| ; CHECK-NEXT: local.get $push54=, 3 | |
| ; CHECK-NEXT: local.get $push53=, 4 | |
| ; CHECK-NEXT: local.get $push52=, 2 | |
| ; CHECK-NEXT: call $push2=, __trunctfsf2, $pop53, $pop52 | |
| ; CHECK-NEXT: i32.reinterpret_f32 $push3=, $pop2 | |
| ; CHECK-NEXT: i32.const $push4=, -2147483648 | |
| ; CHECK-NEXT: i32.eq $push16=, $pop3, $pop4 | |
| ; CHECK-NEXT: local.tee $push15=, 6, $pop16 | |
| ; CHECK-NEXT: i64.select $push5=, $pop55, $pop54, $pop15 | |
| ; CHECK-NEXT: local.get $push58=, 4 | |
| ; CHECK-NEXT: local.get $push57=, 1 | |
| ; CHECK-NEXT: local.get $push56=, 5 | |
| ; CHECK-NEXT: i64.select $push14=, $pop58, $pop57, $pop56 | |
| ; CHECK-NEXT: local.tee $push13=, 2, $pop14 | |
| ; CHECK-NEXT: local.get $push59=, 3 | |
| ; CHECK-NEXT: i64.const $push6=, 0 | |
| ; CHECK-NEXT: i64.const $push12=, 0 | |
| ; CHECK-NEXT: call $push11=, __eqtf2, $pop13, $pop59, $pop6, $pop12 | |
| ; CHECK-NEXT: local.tee $push10=, 5, $pop11 | |
| ; CHECK-NEXT: i64.select $push7=, $pop60, $pop5, $pop10 | |
| ; CHECK-NEXT: i64.store 8($pop61), $pop7 | |
| ; CHECK-NEXT: local.get $push67=, 0 | |
| ; CHECK-NEXT: local.get $push66=, 2 | |
| ; CHECK-NEXT: local.get $push64=, 4 | |
| ; CHECK-NEXT: local.get $push63=, 2 | |
| ; CHECK-NEXT: local.get $push62=, 6 | |
| ; CHECK-NEXT: i64.select $push8=, $pop64, $pop63, $pop62 | |
| ; CHECK-NEXT: local.get $push65=, 5 | |
| ; CHECK-NEXT: i64.select $push9=, $pop66, $pop8, $pop65 | |
| ; CHECK-NEXT: i64.store 0($pop67), $pop9 | |
| ; CHECK-NEXT: return | |
| %r = call fp128 @llvm.minimumnum.f128(fp128 %x, fp128 %y) | |
| ret fp128 %r | |
| } | |
| define fp128 @maximumnum_f128(fp128 %x, fp128 %y) { | |
| ; CHECK-LABEL: maximumnum_f128: | |
| ; CHECK: .functype maximumnum_f128 (i32, i64, i64, i64, i64) -> () | |
| ; CHECK-NEXT: .local i32, i32, i64 | |
| ; CHECK-NEXT: # %bb.0: | |
| ; CHECK-NEXT: local.get $push32=, 4 | |
| ; CHECK-NEXT: local.get $push31=, 2 | |
| ; CHECK-NEXT: local.get $push30=, 1 | |
| ; CHECK-NEXT: local.get $push29=, 2 | |
| ; CHECK-NEXT: local.get $push28=, 1 | |
| ; CHECK-NEXT: local.get $push27=, 2 | |
| ; CHECK-NEXT: call $push26=, __unordtf2, $pop30, $pop29, $pop28, $pop27 | |
| ; CHECK-NEXT: local.tee $push25=, 5, $pop26 | |
| ; CHECK-NEXT: i64.select $push24=, $pop32, $pop31, $pop25 | |
| ; CHECK-NEXT: local.tee $push23=, 2, $pop24 | |
| ; CHECK-NEXT: local.get $push38=, 4 | |
| ; CHECK-NEXT: local.get $push36=, 3 | |
| ; CHECK-NEXT: local.get $push35=, 4 | |
| ; CHECK-NEXT: local.get $push34=, 3 | |
| ; CHECK-NEXT: local.get $push33=, 4 | |
| ; CHECK-NEXT: call $push22=, __unordtf2, $pop36, $pop35, $pop34, $pop33 | |
| ; CHECK-NEXT: local.tee $push21=, 6, $pop22 | |
| ; CHECK-NEXT: i64.select $push37=, $pop23, $pop38, $pop21 | |
| ; CHECK-NEXT: local.set 7, $pop37 | |
| ; CHECK-NEXT: local.get $push49=, 2 | |
| ; CHECK-NEXT: local.get $push48=, 7 | |
| ; CHECK-NEXT: local.get $push41=, 3 | |
| ; CHECK-NEXT: local.get $push40=, 1 | |
| ; CHECK-NEXT: local.get $push39=, 5 | |
| ; CHECK-NEXT: i64.select $push20=, $pop41, $pop40, $pop39 | |
| ; CHECK-NEXT: local.tee $push19=, 4, $pop20 | |
| ; CHECK-NEXT: local.get $push46=, 2 | |
| ; CHECK-NEXT: local.get $push44=, 4 | |
| ; CHECK-NEXT: local.get $push43=, 3 | |
| ; CHECK-NEXT: local.get $push42=, 6 | |
| ; CHECK-NEXT: i64.select $push18=, $pop44, $pop43, $pop42 | |
| ; CHECK-NEXT: local.tee $push17=, 1, $pop18 | |
| ; CHECK-NEXT: local.get $push45=, 7 | |
| ; CHECK-NEXT: call $push1=, __gttf2, $pop19, $pop46, $pop17, $pop45 | |
| ; CHECK-NEXT: i32.const $push0=, 0 | |
| ; CHECK-NEXT: i32.gt_s $push16=, $pop1, $pop0 | |
| ; CHECK-NEXT: local.tee $push15=, 5, $pop16 | |
| ; CHECK-NEXT: i64.select $push47=, $pop49, $pop48, $pop15 | |
| ; CHECK-NEXT: local.set 3, $pop47 | |
| ; CHECK-NEXT: local.get $push59=, 0 | |
| ; CHECK-NEXT: local.get $push58=, 3 | |
| ; CHECK-NEXT: local.get $push53=, 3 | |
| ; CHECK-NEXT: local.get $push52=, 2 | |
| ; CHECK-NEXT: local.get $push51=, 4 | |
| ; CHECK-NEXT: local.get $push50=, 2 | |
| ; CHECK-NEXT: call $push2=, __trunctfsf2, $pop51, $pop50 | |
| ; CHECK-NEXT: i32.reinterpret_f32 $push14=, $pop2 | |
| ; CHECK-NEXT: local.tee $push13=, 6, $pop14 | |
| ; CHECK-NEXT: i64.select $push3=, $pop53, $pop52, $pop13 | |
| ; CHECK-NEXT: local.get $push56=, 4 | |
| ; CHECK-NEXT: local.get $push55=, 1 | |
| ; CHECK-NEXT: local.get $push54=, 5 | |
| ; CHECK-NEXT: i64.select $push12=, $pop56, $pop55, $pop54 | |
| ; CHECK-NEXT: local.tee $push11=, 2, $pop12 | |
| ; CHECK-NEXT: local.get $push57=, 3 | |
| ; CHECK-NEXT: i64.const $push4=, 0 | |
| ; CHECK-NEXT: i64.const $push10=, 0 | |
| ; CHECK-NEXT: call $push9=, __eqtf2, $pop11, $pop57, $pop4, $pop10 | |
| ; CHECK-NEXT: local.tee $push8=, 5, $pop9 | |
| ; CHECK-NEXT: i64.select $push5=, $pop58, $pop3, $pop8 | |
| ; CHECK-NEXT: i64.store 8($pop59), $pop5 | |
| ; CHECK-NEXT: local.get $push65=, 0 | |
| ; CHECK-NEXT: local.get $push64=, 2 | |
| ; CHECK-NEXT: local.get $push62=, 2 | |
| ; CHECK-NEXT: local.get $push61=, 4 | |
| ; CHECK-NEXT: local.get $push60=, 6 | |
| ; CHECK-NEXT: i64.select $push6=, $pop62, $pop61, $pop60 | |
| ; CHECK-NEXT: local.get $push63=, 5 | |
| ; CHECK-NEXT: i64.select $push7=, $pop64, $pop6, $pop63 | |
| ; CHECK-NEXT: i64.store 0($pop65), $pop7 | |
| ; CHECK-NEXT: return | |
| %r = call fp128 @llvm.maximumnum.f128(fp128 %x, fp128 %y) | |
| ret fp128 %r | |
| } |