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: (func $fadd64
18; CHECK-NEXT: (param f64) (param f64) (result f64)
19; CHECK-NEXT: (set_local @0 (argument 1))
20; CHECK-NEXT: (set_local @1 (argument 0))
21; CHECK-NEXT: (set_local @2 (fadd @1 @0))
22; CHECK-NEXT: (return @2)
23define double @fadd64(double %x, double %y) {
24  %a = fadd double %x, %y
25  ret double %a
26}
27
28; CHECK-LABEL: (func $fsub64
29; CHECK: (set_local @2 (fsub @1 @0))
30define double @fsub64(double %x, double %y) {
31  %a = fsub double %x, %y
32  ret double %a
33}
34
35; CHECK-LABEL: (func $fmul64
36; CHECK: (set_local @2 (fmul @1 @0))
37define double @fmul64(double %x, double %y) {
38  %a = fmul double %x, %y
39  ret double %a
40}
41
42; CHECK-LABEL: (func $fdiv64
43; CHECK: (set_local @2 (fdiv @1 @0))
44define double @fdiv64(double %x, double %y) {
45  %a = fdiv double %x, %y
46  ret double %a
47}
48
49; CHECK-LABEL: (func $fabs64
50; CHECK: (set_local @1 (fabs @0))
51define double @fabs64(double %x) {
52  %a = call double @llvm.fabs.f64(double %x)
53  ret double %a
54}
55
56; CHECK-LABEL: (func $fneg64
57; CHECK: (set_local @1 (fneg @0))
58define double @fneg64(double %x) {
59  %a = fsub double -0., %x
60  ret double %a
61}
62
63; CHECK-LABEL: (func $copysign64
64; CHECK: (set_local @2 (copysign @1 @0))
65define double @copysign64(double %x, double %y) {
66  %a = call double @llvm.copysign.f64(double %x, double %y)
67  ret double %a
68}
69
70; CHECK-LABEL: (func $sqrt64
71; CHECK: (set_local @1 (sqrt @0))
72define double @sqrt64(double %x) {
73  %a = call double @llvm.sqrt.f64(double %x)
74  ret double %a
75}
76
77; CHECK-LABEL: (func $ceil64
78; CHECK: (set_local @1 (ceil @0))
79define double @ceil64(double %x) {
80  %a = call double @llvm.ceil.f64(double %x)
81  ret double %a
82}
83
84; CHECK-LABEL: (func $floor64
85; CHECK: (set_local @1 (floor @0))
86define double @floor64(double %x) {
87  %a = call double @llvm.floor.f64(double %x)
88  ret double %a
89}
90
91; CHECK-LABEL: (func $trunc64
92; CHECK: (set_local @1 (trunc @0))
93define double @trunc64(double %x) {
94  %a = call double @llvm.trunc.f64(double %x)
95  ret double %a
96}
97
98; CHECK-LABEL: (func $nearest64
99; CHECK: (set_local @1 (nearest @0))
100define double @nearest64(double %x) {
101  %a = call double @llvm.nearbyint.f64(double %x)
102  ret double %a
103}
104
105; CHECK-LABEL: (func $nearest64_via_rint
106; CHECK: (set_local @1 (nearest @0))
107define double @nearest64_via_rint(double %x) {
108  %a = call double @llvm.rint.f64(double %x)
109  ret double %a
110}
111