comparison test/CodeGen/WebAssembly/f64.ll @ 100:7d135dc70f03

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