[WebAssembly] Reapply r252858, with svn add for the new file.
[oota-llvm.git] / test / CodeGen / WebAssembly / i64.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3 ; Test that basic 64-bit integer operations assemble as expected.
4
5 target datalayout = "e-p:32:32-i64:64-n32:64-S128"
6 target triple = "wasm32-unknown-unknown"
7
8 declare i64 @llvm.ctlz.i64(i64, i1)
9 declare i64 @llvm.cttz.i64(i64, i1)
10 declare i64 @llvm.ctpop.i64(i64)
11
12 ; CHECK-LABEL: add64:
13 ; CHECK-NEXT: .param i64{{$}}
14 ; CHECK-NEXT: .param i64{{$}}
15 ; CHECK-NEXT: .result i64{{$}}
16 ; CHECK-NEXT: .local i64, i64, i64{{$}}
17 ; CHECK-NEXT: i64.add $push, (get_local 0), (get_local 1){{$}}
18 ; CHECK-NEXT: set_local 2, $pop{{$}}
19 ; CHECK-NEXT: return (get_local 2){{$}}
20 define i64 @add64(i64 %x, i64 %y) {
21   %a = add i64 %x, %y
22   ret i64 %a
23 }
24
25 ; CHECK-LABEL: sub64:
26 ; CHECK-NEXT: .param i64{{$}}
27 ; CHECK-NEXT: .param i64{{$}}
28 ; CHECK-NEXT: .result i64{{$}}
29 ; CHECK-NEXT: .local i64, i64, i64{{$}}
30 ; CHECK-NEXT: i64.sub $push, (get_local 0), (get_local 1){{$}}
31 ; CHECK-NEXT: set_local 2, $pop{{$}}
32 ; CHECK-NEXT: return (get_local 2){{$}}
33 define i64 @sub64(i64 %x, i64 %y) {
34   %a = sub i64 %x, %y
35   ret i64 %a
36 }
37
38 ; CHECK-LABEL: mul64:
39 ; CHECK-NEXT: .param i64{{$}}
40 ; CHECK-NEXT: .param i64{{$}}
41 ; CHECK-NEXT: .result i64{{$}}
42 ; CHECK-NEXT: .local i64, i64, i64{{$}}
43 ; CHECK-NEXT: i64.mul $push, (get_local 0), (get_local 1){{$}}
44 ; CHECK-NEXT: set_local 2, $pop{{$}}
45 ; CHECK-NEXT: return (get_local 2){{$}}
46 define i64 @mul64(i64 %x, i64 %y) {
47   %a = mul i64 %x, %y
48   ret i64 %a
49 }
50
51 ; CHECK-LABEL: sdiv64:
52 ; CHECK-NEXT: .param i64{{$}}
53 ; CHECK-NEXT: .param i64{{$}}
54 ; CHECK-NEXT: .result i64{{$}}
55 ; CHECK-NEXT: .local i64, i64, i64{{$}}
56 ; CHECK-NEXT: i64.div_s $push, (get_local 0), (get_local 1){{$}}
57 ; CHECK-NEXT: set_local 2, $pop{{$}}
58 ; CHECK-NEXT: return (get_local 2){{$}}
59 define i64 @sdiv64(i64 %x, i64 %y) {
60   %a = sdiv i64 %x, %y
61   ret i64 %a
62 }
63
64 ; CHECK-LABEL: udiv64:
65 ; CHECK-NEXT: .param i64{{$}}
66 ; CHECK-NEXT: .param i64{{$}}
67 ; CHECK-NEXT: .result i64{{$}}
68 ; CHECK-NEXT: .local i64, i64, i64{{$}}
69 ; CHECK-NEXT: i64.div_u $push, (get_local 0), (get_local 1){{$}}
70 ; CHECK-NEXT: set_local 2, $pop{{$}}
71 ; CHECK-NEXT: return (get_local 2){{$}}
72 define i64 @udiv64(i64 %x, i64 %y) {
73   %a = udiv i64 %x, %y
74   ret i64 %a
75 }
76
77 ; CHECK-LABEL: srem64:
78 ; CHECK-NEXT: .param i64{{$}}
79 ; CHECK-NEXT: .param i64{{$}}
80 ; CHECK-NEXT: .result i64{{$}}
81 ; CHECK-NEXT: .local i64, i64, i64{{$}}
82 ; CHECK-NEXT: i64.rem_s $push, (get_local 0), (get_local 1){{$}}
83 ; CHECK-NEXT: set_local 2, $pop{{$}}
84 ; CHECK-NEXT: return (get_local 2){{$}}
85 define i64 @srem64(i64 %x, i64 %y) {
86   %a = srem i64 %x, %y
87   ret i64 %a
88 }
89
90 ; CHECK-LABEL: urem64:
91 ; CHECK-NEXT: .param i64{{$}}
92 ; CHECK-NEXT: .param i64{{$}}
93 ; CHECK-NEXT: .result i64{{$}}
94 ; CHECK-NEXT: .local i64, i64, i64{{$}}
95 ; CHECK-NEXT: i64.rem_u $push, (get_local 0), (get_local 1){{$}}
96 ; CHECK-NEXT: set_local 2, $pop{{$}}
97 ; CHECK-NEXT: return (get_local 2){{$}}
98 define i64 @urem64(i64 %x, i64 %y) {
99   %a = urem i64 %x, %y
100   ret i64 %a
101 }
102
103 ; CHECK-LABEL: and64:
104 ; CHECK-NEXT: .param i64{{$}}
105 ; CHECK-NEXT: .param i64{{$}}
106 ; CHECK-NEXT: .result i64{{$}}
107 ; CHECK-NEXT: .local i64, i64, i64{{$}}
108 ; CHECK-NEXT: i64.and $push, (get_local 0), (get_local 1){{$}}
109 ; CHECK-NEXT: set_local 2, $pop{{$}}
110 ; CHECK-NEXT: return (get_local 2){{$}}
111 define i64 @and64(i64 %x, i64 %y) {
112   %a = and i64 %x, %y
113   ret i64 %a
114 }
115
116 ; CHECK-LABEL: or64:
117 ; CHECK-NEXT: .param i64{{$}}
118 ; CHECK-NEXT: .param i64{{$}}
119 ; CHECK-NEXT: .result i64{{$}}
120 ; CHECK-NEXT: .local i64, i64, i64{{$}}
121 ; CHECK-NEXT: i64.or $push, (get_local 0), (get_local 1){{$}}
122 ; CHECK-NEXT: set_local 2, $pop{{$}}
123 ; CHECK-NEXT: return (get_local 2){{$}}
124 define i64 @or64(i64 %x, i64 %y) {
125   %a = or i64 %x, %y
126   ret i64 %a
127 }
128
129 ; CHECK-LABEL: xor64:
130 ; CHECK-NEXT: .param i64{{$}}
131 ; CHECK-NEXT: .param i64{{$}}
132 ; CHECK-NEXT: .result i64{{$}}
133 ; CHECK-NEXT: .local i64, i64, i64{{$}}
134 ; CHECK-NEXT: i64.xor $push, (get_local 0), (get_local 1){{$}}
135 ; CHECK-NEXT: set_local 2, $pop{{$}}
136 ; CHECK-NEXT: return (get_local 2){{$}}
137 define i64 @xor64(i64 %x, i64 %y) {
138   %a = xor i64 %x, %y
139   ret i64 %a
140 }
141
142 ; CHECK-LABEL: shl64:
143 ; CHECK-NEXT: .param i64{{$}}
144 ; CHECK-NEXT: .param i64{{$}}
145 ; CHECK-NEXT: .result i64{{$}}
146 ; CHECK-NEXT: .local i64, i64, i64{{$}}
147 ; CHECK-NEXT: i64.shl $push, (get_local 0), (get_local 1){{$}}
148 ; CHECK-NEXT: set_local 2, $pop{{$}}
149 ; CHECK-NEXT: return (get_local 2){{$}}
150 define i64 @shl64(i64 %x, i64 %y) {
151   %a = shl i64 %x, %y
152   ret i64 %a
153 }
154
155 ; CHECK-LABEL: shr64:
156 ; CHECK-NEXT: .param i64{{$}}
157 ; CHECK-NEXT: .param i64{{$}}
158 ; CHECK-NEXT: .result i64{{$}}
159 ; CHECK-NEXT: .local i64, i64, i64{{$}}
160 ; CHECK-NEXT: i64.shr_u $push, (get_local 0), (get_local 1){{$}}
161 ; CHECK-NEXT: set_local 2, $pop{{$}}
162 ; CHECK-NEXT: return (get_local 2){{$}}
163 define i64 @shr64(i64 %x, i64 %y) {
164   %a = lshr i64 %x, %y
165   ret i64 %a
166 }
167
168 ; CHECK-LABEL: sar64:
169 ; CHECK-NEXT: .param i64{{$}}
170 ; CHECK-NEXT: .param i64{{$}}
171 ; CHECK-NEXT: .result i64{{$}}
172 ; CHECK-NEXT: .local i64, i64, i64{{$}}
173 ; CHECK-NEXT: i64.shr_s $push, (get_local 0), (get_local 1){{$}}
174 ; CHECK-NEXT: set_local 2, $pop{{$}}
175 ; CHECK-NEXT: return (get_local 2){{$}}
176 define i64 @sar64(i64 %x, i64 %y) {
177   %a = ashr i64 %x, %y
178   ret i64 %a
179 }
180
181 ; CHECK-LABEL: clz64:
182 ; CHECK-NEXT: .param i64{{$}}
183 ; CHECK-NEXT: .result i64{{$}}
184 ; CHECK-NEXT: .local i64, i64{{$}}
185 ; CHECK-NEXT: i64.clz $push, (get_local 0){{$}}
186 ; CHECK-NEXT: set_local 1, $pop{{$}}
187 ; CHECK-NEXT: return (get_local 1){{$}}
188 define i64 @clz64(i64 %x) {
189   %a = call i64 @llvm.ctlz.i64(i64 %x, i1 false)
190   ret i64 %a
191 }
192
193 ; CHECK-LABEL: clz64_zero_undef:
194 ; CHECK-NEXT: .param i64{{$}}
195 ; CHECK-NEXT: .result i64{{$}}
196 ; CHECK-NEXT: .local i64, i64{{$}}
197 ; CHECK-NEXT: i64.clz $push, (get_local 0){{$}}
198 ; CHECK-NEXT: set_local 1, $pop{{$}}
199 ; CHECK-NEXT: return (get_local 1){{$}}
200 define i64 @clz64_zero_undef(i64 %x) {
201   %a = call i64 @llvm.ctlz.i64(i64 %x, i1 true)
202   ret i64 %a
203 }
204
205 ; CHECK-LABEL: ctz64:
206 ; CHECK-NEXT: .param i64{{$}}
207 ; CHECK-NEXT: .result i64{{$}}
208 ; CHECK-NEXT: .local i64, i64{{$}}
209 ; CHECK-NEXT: i64.ctz $push, (get_local 0){{$}}
210 ; CHECK-NEXT: set_local 1, $pop{{$}}
211 ; CHECK-NEXT: return (get_local 1){{$}}
212 define i64 @ctz64(i64 %x) {
213   %a = call i64 @llvm.cttz.i64(i64 %x, i1 false)
214   ret i64 %a
215 }
216
217 ; CHECK-LABEL: ctz64_zero_undef:
218 ; CHECK-NEXT: .param i64{{$}}
219 ; CHECK-NEXT: .result i64{{$}}
220 ; CHECK-NEXT: .local i64, i64{{$}}
221 ; CHECK-NEXT: i64.ctz $push, (get_local 0){{$}}
222 ; CHECK-NEXT: set_local 1, $pop{{$}}
223 ; CHECK-NEXT: return (get_local 1){{$}}
224 define i64 @ctz64_zero_undef(i64 %x) {
225   %a = call i64 @llvm.cttz.i64(i64 %x, i1 true)
226   ret i64 %a
227 }
228
229 ; CHECK-LABEL: popcnt64:
230 ; CHECK-NEXT: .param i64{{$}}
231 ; CHECK-NEXT: .result i64{{$}}
232 ; CHECK-NEXT: .local i64, i64{{$}}
233 ; CHECK-NEXT: i64.popcnt $push, (get_local 0){{$}}
234 ; CHECK-NEXT: set_local 1, $pop{{$}}
235 ; CHECK-NEXT: return (get_local 1){{$}}
236 define i64 @popcnt64(i64 %x) {
237   %a = call i64 @llvm.ctpop.i64(i64 %x)
238   ret i64 %a
239 }