1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that basic 32-bit floating-point operations assemble as expected. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" 6*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown" 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) 9*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.copysign.f32(float, float) 10*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.sqrt.f32(float) 11*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.ceil.f32(float) 12*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.floor.f32(float) 13*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.trunc.f32(float) 14*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.nearbyint.f32(float) 15*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.rint.f32(float) 16*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float, float, float) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fadd32: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f32, f32{{$}} 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f32{{$}} 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f32.add $push0=, $0, $1{{$}} 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 23*9880d681SAndroid Build Coastguard Workerdefine float @fadd32(float %x, float %y) { 24*9880d681SAndroid Build Coastguard Worker %a = fadd float %x, %y 25*9880d681SAndroid Build Coastguard Worker ret float %a 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fsub32: 29*9880d681SAndroid Build Coastguard Worker; CHECK: f32.sub $push0=, $0, $1{{$}} 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 31*9880d681SAndroid Build Coastguard Workerdefine float @fsub32(float %x, float %y) { 32*9880d681SAndroid Build Coastguard Worker %a = fsub float %x, %y 33*9880d681SAndroid Build Coastguard Worker ret float %a 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmul32: 37*9880d681SAndroid Build Coastguard Worker; CHECK: f32.mul $push0=, $0, $1{{$}} 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 39*9880d681SAndroid Build Coastguard Workerdefine float @fmul32(float %x, float %y) { 40*9880d681SAndroid Build Coastguard Worker %a = fmul float %x, %y 41*9880d681SAndroid Build Coastguard Worker ret float %a 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fdiv32: 45*9880d681SAndroid Build Coastguard Worker; CHECK: f32.div $push0=, $0, $1{{$}} 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 47*9880d681SAndroid Build Coastguard Workerdefine float @fdiv32(float %x, float %y) { 48*9880d681SAndroid Build Coastguard Worker %a = fdiv float %x, %y 49*9880d681SAndroid Build Coastguard Worker ret float %a 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fabs32: 53*9880d681SAndroid Build Coastguard Worker; CHECK: f32.abs $push0=, $0{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 55*9880d681SAndroid Build Coastguard Workerdefine float @fabs32(float %x) { 56*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.fabs.f32(float %x) 57*9880d681SAndroid Build Coastguard Worker ret float %a 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fneg32: 61*9880d681SAndroid Build Coastguard Worker; CHECK: f32.neg $push0=, $0{{$}} 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 63*9880d681SAndroid Build Coastguard Workerdefine float @fneg32(float %x) { 64*9880d681SAndroid Build Coastguard Worker %a = fsub float -0., %x 65*9880d681SAndroid Build Coastguard Worker ret float %a 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copysign32: 69*9880d681SAndroid Build Coastguard Worker; CHECK: f32.copysign $push0=, $0, $1{{$}} 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 71*9880d681SAndroid Build Coastguard Workerdefine float @copysign32(float %x, float %y) { 72*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.copysign.f32(float %x, float %y) 73*9880d681SAndroid Build Coastguard Worker ret float %a 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt32: 77*9880d681SAndroid Build Coastguard Worker; CHECK: f32.sqrt $push0=, $0{{$}} 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 79*9880d681SAndroid Build Coastguard Workerdefine float @sqrt32(float %x) { 80*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.sqrt.f32(float %x) 81*9880d681SAndroid Build Coastguard Worker ret float %a 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ceil32: 85*9880d681SAndroid Build Coastguard Worker; CHECK: f32.ceil $push0=, $0{{$}} 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 87*9880d681SAndroid Build Coastguard Workerdefine float @ceil32(float %x) { 88*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.ceil.f32(float %x) 89*9880d681SAndroid Build Coastguard Worker ret float %a 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floor32: 93*9880d681SAndroid Build Coastguard Worker; CHECK: f32.floor $push0=, $0{{$}} 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 95*9880d681SAndroid Build Coastguard Workerdefine float @floor32(float %x) { 96*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.floor.f32(float %x) 97*9880d681SAndroid Build Coastguard Worker ret float %a 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: trunc32: 101*9880d681SAndroid Build Coastguard Worker; CHECK: f32.trunc $push0=, $0{{$}} 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 103*9880d681SAndroid Build Coastguard Workerdefine float @trunc32(float %x) { 104*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.trunc.f32(float %x) 105*9880d681SAndroid Build Coastguard Worker ret float %a 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearest32: 109*9880d681SAndroid Build Coastguard Worker; CHECK: f32.nearest $push0=, $0{{$}} 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 111*9880d681SAndroid Build Coastguard Workerdefine float @nearest32(float %x) { 112*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.nearbyint.f32(float %x) 113*9880d681SAndroid Build Coastguard Worker ret float %a 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearest32_via_rint: 117*9880d681SAndroid Build Coastguard Worker; CHECK: f32.nearest $push0=, $0{{$}} 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 119*9880d681SAndroid Build Coastguard Workerdefine float @nearest32_via_rint(float %x) { 120*9880d681SAndroid Build Coastguard Worker %a = call float @llvm.rint.f32(float %x) 121*9880d681SAndroid Build Coastguard Worker ret float %a 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; Min and max tests. LLVM currently only forms fminnan and fmaxnan nodes in 125*9880d681SAndroid Build Coastguard Worker; cases where there's a single fcmp with a select and it can prove that one 126*9880d681SAndroid Build Coastguard Worker; of the arms is never NaN, so we only test that case. In the future if LLVM 127*9880d681SAndroid Build Coastguard Worker; learns to form fminnan/fmaxnan in more cases, we can write more general 128*9880d681SAndroid Build Coastguard Worker; tests. 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmin32: 131*9880d681SAndroid Build Coastguard Worker; CHECK: f32.min $push1=, $0, $pop0{{$}} 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop1{{$}} 133*9880d681SAndroid Build Coastguard Workerdefine float @fmin32(float %x) { 134*9880d681SAndroid Build Coastguard Worker %a = fcmp ult float %x, 0.0 135*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, float %x, float 0.0 136*9880d681SAndroid Build Coastguard Worker ret float %b 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmax32: 140*9880d681SAndroid Build Coastguard Worker; CHECK: f32.max $push1=, $0, $pop0{{$}} 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop1{{$}} 142*9880d681SAndroid Build Coastguard Workerdefine float @fmax32(float %x) { 143*9880d681SAndroid Build Coastguard Worker %a = fcmp ugt float %x, 0.0 144*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, float %x, float 0.0 145*9880d681SAndroid Build Coastguard Worker ret float %b 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma32: 149*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}} f32.call $push0=, fmaf@FUNCTION, $0, $1, $2{{$}} 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 151*9880d681SAndroid Build Coastguard Workerdefine float @fma32(float %a, float %b, float %c) { 152*9880d681SAndroid Build Coastguard Worker %d = call float @llvm.fma.f32(float %a, float %b, float %c) 153*9880d681SAndroid Build Coastguard Worker ret float %d 154*9880d681SAndroid Build Coastguard Worker} 155