Mercurial > hg > Members > tobaru > cbc > CbC_llvm
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 } |