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