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 64-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 double @llvm.fabs.f64(double) 9*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.copysign.f64(double, double) 10*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double) 11*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.ceil.f64(double) 12*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.floor.f64(double) 13*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.trunc.f64(double) 14*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.nearbyint.f64(double) 15*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.rint.f64(double) 16*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fma.f64(double, double, double) 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fadd64: 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .param f64, f64{{$}} 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: .result f64{{$}} 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: f64.add $push0=, $0, $1{{$}} 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 23*9880d681SAndroid Build Coastguard Workerdefine double @fadd64(double %x, double %y) { 24*9880d681SAndroid Build Coastguard Worker %a = fadd double %x, %y 25*9880d681SAndroid Build Coastguard Worker ret double %a 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fsub64: 29*9880d681SAndroid Build Coastguard Worker; CHECK: f64.sub $push0=, $0, $1{{$}} 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 31*9880d681SAndroid Build Coastguard Workerdefine double @fsub64(double %x, double %y) { 32*9880d681SAndroid Build Coastguard Worker %a = fsub double %x, %y 33*9880d681SAndroid Build Coastguard Worker ret double %a 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmul64: 37*9880d681SAndroid Build Coastguard Worker; CHECK: f64.mul $push0=, $0, $1{{$}} 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 39*9880d681SAndroid Build Coastguard Workerdefine double @fmul64(double %x, double %y) { 40*9880d681SAndroid Build Coastguard Worker %a = fmul double %x, %y 41*9880d681SAndroid Build Coastguard Worker ret double %a 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fdiv64: 45*9880d681SAndroid Build Coastguard Worker; CHECK: f64.div $push0=, $0, $1{{$}} 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 47*9880d681SAndroid Build Coastguard Workerdefine double @fdiv64(double %x, double %y) { 48*9880d681SAndroid Build Coastguard Worker %a = fdiv double %x, %y 49*9880d681SAndroid Build Coastguard Worker ret double %a 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fabs64: 53*9880d681SAndroid Build Coastguard Worker; CHECK: f64.abs $push0=, $0{{$}} 54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 55*9880d681SAndroid Build Coastguard Workerdefine double @fabs64(double %x) { 56*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.fabs.f64(double %x) 57*9880d681SAndroid Build Coastguard Worker ret double %a 58*9880d681SAndroid Build Coastguard Worker} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fneg64: 61*9880d681SAndroid Build Coastguard Worker; CHECK: f64.neg $push0=, $0{{$}} 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 63*9880d681SAndroid Build Coastguard Workerdefine double @fneg64(double %x) { 64*9880d681SAndroid Build Coastguard Worker %a = fsub double -0., %x 65*9880d681SAndroid Build Coastguard Worker ret double %a 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copysign64: 69*9880d681SAndroid Build Coastguard Worker; CHECK: f64.copysign $push0=, $0, $1{{$}} 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 71*9880d681SAndroid Build Coastguard Workerdefine double @copysign64(double %x, double %y) { 72*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.copysign.f64(double %x, double %y) 73*9880d681SAndroid Build Coastguard Worker ret double %a 74*9880d681SAndroid Build Coastguard Worker} 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt64: 77*9880d681SAndroid Build Coastguard Worker; CHECK: f64.sqrt $push0=, $0{{$}} 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 79*9880d681SAndroid Build Coastguard Workerdefine double @sqrt64(double %x) { 80*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.sqrt.f64(double %x) 81*9880d681SAndroid Build Coastguard Worker ret double %a 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ceil64: 85*9880d681SAndroid Build Coastguard Worker; CHECK: f64.ceil $push0=, $0{{$}} 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 87*9880d681SAndroid Build Coastguard Workerdefine double @ceil64(double %x) { 88*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.ceil.f64(double %x) 89*9880d681SAndroid Build Coastguard Worker ret double %a 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floor64: 93*9880d681SAndroid Build Coastguard Worker; CHECK: f64.floor $push0=, $0{{$}} 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 95*9880d681SAndroid Build Coastguard Workerdefine double @floor64(double %x) { 96*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.floor.f64(double %x) 97*9880d681SAndroid Build Coastguard Worker ret double %a 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: trunc64: 101*9880d681SAndroid Build Coastguard Worker; CHECK: f64.trunc $push0=, $0{{$}} 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 103*9880d681SAndroid Build Coastguard Workerdefine double @trunc64(double %x) { 104*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.trunc.f64(double %x) 105*9880d681SAndroid Build Coastguard Worker ret double %a 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearest64: 109*9880d681SAndroid Build Coastguard Worker; CHECK: f64.nearest $push0=, $0{{$}} 110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 111*9880d681SAndroid Build Coastguard Workerdefine double @nearest64(double %x) { 112*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.nearbyint.f64(double %x) 113*9880d681SAndroid Build Coastguard Worker ret double %a 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: nearest64_via_rint: 117*9880d681SAndroid Build Coastguard Worker; CHECK: f64.nearest $push0=, $0{{$}} 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 119*9880d681SAndroid Build Coastguard Workerdefine double @nearest64_via_rint(double %x) { 120*9880d681SAndroid Build Coastguard Worker %a = call double @llvm.rint.f64(double %x) 121*9880d681SAndroid Build Coastguard Worker ret double %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: fmin64: 131*9880d681SAndroid Build Coastguard Worker; CHECK: f64.min $push1=, $0, $pop0{{$}} 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop1{{$}} 133*9880d681SAndroid Build Coastguard Workerdefine double @fmin64(double %x) { 134*9880d681SAndroid Build Coastguard Worker %a = fcmp ult double %x, 0.0 135*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, double %x, double 0.0 136*9880d681SAndroid Build Coastguard Worker ret double %b 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmax64: 140*9880d681SAndroid Build Coastguard Worker; CHECK: f64.max $push1=, $0, $pop0{{$}} 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop1{{$}} 142*9880d681SAndroid Build Coastguard Workerdefine double @fmax64(double %x) { 143*9880d681SAndroid Build Coastguard Worker %a = fcmp ugt double %x, 0.0 144*9880d681SAndroid Build Coastguard Worker %b = select i1 %a, double %x, double 0.0 145*9880d681SAndroid Build Coastguard Worker ret double %b 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fma64: 149*9880d681SAndroid Build Coastguard Worker; CHECK: {{^}} f64.call $push0=, fma@FUNCTION, $0, $1, $2{{$}} 150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return $pop0{{$}} 151*9880d681SAndroid Build Coastguard Workerdefine double @fma64(double %a, double %b, double %c) { 152*9880d681SAndroid Build Coastguard Worker %d = call double @llvm.fma.f64(double %a, double %b, double %c) 153*9880d681SAndroid Build Coastguard Worker ret double %d 154*9880d681SAndroid Build Coastguard Worker} 155