| ; 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 |
| } |