28d1ef986788d677d70fc505e22ce3e2bd4e6c59
[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: get_local 1{{$}}
18 ; CHECK-NEXT: set_local 2, pop{{$}}
19 ; CHECK-NEXT: get_local 0{{$}}
20 ; CHECK-NEXT: set_local 3, pop{{$}}
21 ; CHECK-NEXT: add (get_local 3), (get_local 2){{$}}
22 ; CHECK-NEXT: set_local 4, pop{{$}}
23 ; CHECK-NEXT: return (get_local 4){{$}}
24 define i64 @add64(i64 %x, i64 %y) {
25   %a = add i64 %x, %y
26   ret i64 %a
27 }
28
29 ; CHECK-LABEL: sub64:
30 ; CHECK-NEXT: .param i64{{$}}
31 ; CHECK-NEXT: .param i64{{$}}
32 ; CHECK-NEXT: .result i64{{$}}
33 ; CHECK-NEXT: .local i64, i64, i64{{$}}
34 ; CHECK-NEXT: get_local 1{{$}}
35 ; CHECK-NEXT: set_local 2, pop{{$}}
36 ; CHECK-NEXT: get_local 0{{$}}
37 ; CHECK-NEXT: set_local 3, pop{{$}}
38 ; CHECK-NEXT: sub (get_local 3), (get_local 2){{$}}
39 ; CHECK-NEXT: set_local 4, pop{{$}}
40 ; CHECK-NEXT: return (get_local 4){{$}}
41 define i64 @sub64(i64 %x, i64 %y) {
42   %a = sub i64 %x, %y
43   ret i64 %a
44 }
45
46 ; CHECK-LABEL: mul64:
47 ; CHECK-NEXT: .param i64{{$}}
48 ; CHECK-NEXT: .param i64{{$}}
49 ; CHECK-NEXT: .result i64{{$}}
50 ; CHECK-NEXT: .local i64, i64, i64{{$}}
51 ; CHECK-NEXT: get_local 1{{$}}
52 ; CHECK-NEXT: set_local 2, pop{{$}}
53 ; CHECK-NEXT: get_local 0{{$}}
54 ; CHECK-NEXT: set_local 3, pop{{$}}
55 ; CHECK-NEXT: mul (get_local 3), (get_local 2){{$}}
56 ; CHECK-NEXT: set_local 4, pop{{$}}
57 ; CHECK-NEXT: return (get_local 4){{$}}
58 define i64 @mul64(i64 %x, i64 %y) {
59   %a = mul i64 %x, %y
60   ret i64 %a
61 }
62
63 ; CHECK-LABEL: sdiv64:
64 ; CHECK-NEXT: .param i64{{$}}
65 ; CHECK-NEXT: .param i64{{$}}
66 ; CHECK-NEXT: .result i64{{$}}
67 ; CHECK-NEXT: .local i64, i64, i64{{$}}
68 ; CHECK-NEXT: get_local 1{{$}}
69 ; CHECK-NEXT: set_local 2, pop{{$}}
70 ; CHECK-NEXT: get_local 0{{$}}
71 ; CHECK-NEXT: set_local 3, pop{{$}}
72 ; CHECK-NEXT: div_s (get_local 3), (get_local 2){{$}}
73 ; CHECK-NEXT: set_local 4, pop{{$}}
74 ; CHECK-NEXT: return (get_local 4){{$}}
75 define i64 @sdiv64(i64 %x, i64 %y) {
76   %a = sdiv i64 %x, %y
77   ret i64 %a
78 }
79
80 ; CHECK-LABEL: udiv64:
81 ; CHECK-NEXT: .param i64{{$}}
82 ; CHECK-NEXT: .param i64{{$}}
83 ; CHECK-NEXT: .result i64{{$}}
84 ; CHECK-NEXT: .local i64, i64, i64{{$}}
85 ; CHECK-NEXT: get_local 1{{$}}
86 ; CHECK-NEXT: set_local 2, pop{{$}}
87 ; CHECK-NEXT: get_local 0{{$}}
88 ; CHECK-NEXT: set_local 3, pop{{$}}
89 ; CHECK-NEXT: div_u (get_local 3), (get_local 2){{$}}
90 ; CHECK-NEXT: set_local 4, pop{{$}}
91 ; CHECK-NEXT: return (get_local 4){{$}}
92 define i64 @udiv64(i64 %x, i64 %y) {
93   %a = udiv i64 %x, %y
94   ret i64 %a
95 }
96
97 ; CHECK-LABEL: srem64:
98 ; CHECK-NEXT: .param i64{{$}}
99 ; CHECK-NEXT: .param i64{{$}}
100 ; CHECK-NEXT: .result i64{{$}}
101 ; CHECK-NEXT: .local i64, i64, i64{{$}}
102 ; CHECK-NEXT: get_local 1{{$}}
103 ; CHECK-NEXT: set_local 2, pop{{$}}
104 ; CHECK-NEXT: get_local 0{{$}}
105 ; CHECK-NEXT: set_local 3, pop{{$}}
106 ; CHECK-NEXT: rem_s (get_local 3), (get_local 2){{$}}
107 ; CHECK-NEXT: set_local 4, pop{{$}}
108 ; CHECK-NEXT: return (get_local 4){{$}}
109 define i64 @srem64(i64 %x, i64 %y) {
110   %a = srem i64 %x, %y
111   ret i64 %a
112 }
113
114 ; CHECK-LABEL: urem64:
115 ; CHECK-NEXT: .param i64{{$}}
116 ; CHECK-NEXT: .param i64{{$}}
117 ; CHECK-NEXT: .result i64{{$}}
118 ; CHECK-NEXT: .local i64, i64, i64{{$}}
119 ; CHECK-NEXT: get_local 1{{$}}
120 ; CHECK-NEXT: set_local 2, pop{{$}}
121 ; CHECK-NEXT: get_local 0{{$}}
122 ; CHECK-NEXT: set_local 3, pop{{$}}
123 ; CHECK-NEXT: rem_u (get_local 3), (get_local 2){{$}}
124 ; CHECK-NEXT: set_local 4, pop{{$}}
125 ; CHECK-NEXT: return (get_local 4){{$}}
126 define i64 @urem64(i64 %x, i64 %y) {
127   %a = urem i64 %x, %y
128   ret i64 %a
129 }
130
131 ; CHECK-LABEL: and64:
132 ; CHECK-NEXT: .param i64{{$}}
133 ; CHECK-NEXT: .param i64{{$}}
134 ; CHECK-NEXT: .result i64{{$}}
135 ; CHECK-NEXT: .local i64, i64, i64{{$}}
136 ; CHECK-NEXT: get_local 1{{$}}
137 ; CHECK-NEXT: set_local 2, pop{{$}}
138 ; CHECK-NEXT: get_local 0{{$}}
139 ; CHECK-NEXT: set_local 3, pop{{$}}
140 ; CHECK-NEXT: and (get_local 3), (get_local 2){{$}}
141 ; CHECK-NEXT: set_local 4, pop{{$}}
142 ; CHECK-NEXT: return (get_local 4){{$}}
143 define i64 @and64(i64 %x, i64 %y) {
144   %a = and i64 %x, %y
145   ret i64 %a
146 }
147
148 ; CHECK-LABEL: or64:
149 ; CHECK-NEXT: .param i64{{$}}
150 ; CHECK-NEXT: .param i64{{$}}
151 ; CHECK-NEXT: .result i64{{$}}
152 ; CHECK-NEXT: .local i64, i64, i64{{$}}
153 ; CHECK-NEXT: get_local 1{{$}}
154 ; CHECK-NEXT: set_local 2, pop{{$}}
155 ; CHECK-NEXT: get_local 0{{$}}
156 ; CHECK-NEXT: set_local 3, pop{{$}}
157 ; CHECK-NEXT: or (get_local 3), (get_local 2){{$}}
158 ; CHECK-NEXT: set_local 4, pop{{$}}
159 ; CHECK-NEXT: return (get_local 4){{$}}
160 define i64 @or64(i64 %x, i64 %y) {
161   %a = or i64 %x, %y
162   ret i64 %a
163 }
164
165 ; CHECK-LABEL: xor64:
166 ; CHECK-NEXT: .param i64{{$}}
167 ; CHECK-NEXT: .param i64{{$}}
168 ; CHECK-NEXT: .result i64{{$}}
169 ; CHECK-NEXT: .local i64, i64, i64{{$}}
170 ; CHECK-NEXT: get_local 1{{$}}
171 ; CHECK-NEXT: set_local 2, pop{{$}}
172 ; CHECK-NEXT: get_local 0{{$}}
173 ; CHECK-NEXT: set_local 3, pop{{$}}
174 ; CHECK-NEXT: xor (get_local 3), (get_local 2){{$}}
175 ; CHECK-NEXT: set_local 4, pop{{$}}
176 ; CHECK-NEXT: return (get_local 4){{$}}
177 define i64 @xor64(i64 %x, i64 %y) {
178   %a = xor i64 %x, %y
179   ret i64 %a
180 }
181
182 ; CHECK-LABEL: shl64:
183 ; CHECK-NEXT: .param i64{{$}}
184 ; CHECK-NEXT: .param i64{{$}}
185 ; CHECK-NEXT: .result i64{{$}}
186 ; CHECK-NEXT: .local i64, i64, i64{{$}}
187 ; CHECK-NEXT: get_local 1{{$}}
188 ; CHECK-NEXT: set_local 2, pop{{$}}
189 ; CHECK-NEXT: get_local 0{{$}}
190 ; CHECK-NEXT: set_local 3, pop{{$}}
191 ; CHECK-NEXT: shl (get_local 3), (get_local 2){{$}}
192 ; CHECK-NEXT: set_local 4, pop{{$}}
193 ; CHECK-NEXT: return (get_local 4){{$}}
194 define i64 @shl64(i64 %x, i64 %y) {
195   %a = shl i64 %x, %y
196   ret i64 %a
197 }
198
199 ; CHECK-LABEL: shr64:
200 ; CHECK-NEXT: .param i64{{$}}
201 ; CHECK-NEXT: .param i64{{$}}
202 ; CHECK-NEXT: .result i64{{$}}
203 ; CHECK-NEXT: .local i64, i64, i64{{$}}
204 ; CHECK-NEXT: get_local 1{{$}}
205 ; CHECK-NEXT: set_local 2, pop{{$}}
206 ; CHECK-NEXT: get_local 0{{$}}
207 ; CHECK-NEXT: set_local 3, pop{{$}}
208 ; CHECK-NEXT: shr_u (get_local 3), (get_local 2){{$}}
209 ; CHECK-NEXT: set_local 4, pop{{$}}
210 ; CHECK-NEXT: return (get_local 4){{$}}
211 define i64 @shr64(i64 %x, i64 %y) {
212   %a = lshr i64 %x, %y
213   ret i64 %a
214 }
215
216 ; CHECK-LABEL: sar64:
217 ; CHECK-NEXT: .param i64{{$}}
218 ; CHECK-NEXT: .param i64{{$}}
219 ; CHECK-NEXT: .result i64{{$}}
220 ; CHECK-NEXT: .local i64, i64, i64{{$}}
221 ; CHECK-NEXT: get_local 1{{$}}
222 ; CHECK-NEXT: set_local 2, pop{{$}}
223 ; CHECK-NEXT: get_local 0{{$}}
224 ; CHECK-NEXT: set_local 3, pop{{$}}
225 ; CHECK-NEXT: shr_s (get_local 3), (get_local 2){{$}}
226 ; CHECK-NEXT: set_local 4, pop{{$}}
227 ; CHECK-NEXT: return (get_local 4){{$}}
228 define i64 @sar64(i64 %x, i64 %y) {
229   %a = ashr i64 %x, %y
230   ret i64 %a
231 }
232
233 ; CHECK-LABEL: clz64:
234 ; CHECK-NEXT: .param i64{{$}}
235 ; CHECK-NEXT: .result i64{{$}}
236 ; CHECK-NEXT: .local i64, i64{{$}}
237 ; CHECK-NEXT: get_local 0{{$}}
238 ; CHECK-NEXT: set_local 1, pop{{$}}
239 ; CHECK-NEXT: clz (get_local 1){{$}}
240 ; CHECK-NEXT: set_local 2, pop{{$}}
241 ; CHECK-NEXT: return (get_local 2){{$}}
242 define i64 @clz64(i64 %x) {
243   %a = call i64 @llvm.ctlz.i64(i64 %x, i1 false)
244   ret i64 %a
245 }
246
247 ; CHECK-LABEL: clz64_zero_undef:
248 ; CHECK-NEXT: .param i64{{$}}
249 ; CHECK-NEXT: .result i64{{$}}
250 ; CHECK-NEXT: .local i64, i64{{$}}
251 ; CHECK-NEXT: get_local 0{{$}}
252 ; CHECK-NEXT: set_local 1, pop{{$}}
253 ; CHECK-NEXT: clz (get_local 1){{$}}
254 ; CHECK-NEXT: set_local 2, pop{{$}}
255 ; CHECK-NEXT: return (get_local 2){{$}}
256 define i64 @clz64_zero_undef(i64 %x) {
257   %a = call i64 @llvm.ctlz.i64(i64 %x, i1 true)
258   ret i64 %a
259 }
260
261 ; CHECK-LABEL: ctz64:
262 ; CHECK-NEXT: .param i64{{$}}
263 ; CHECK-NEXT: .result i64{{$}}
264 ; CHECK-NEXT: .local i64, i64{{$}}
265 ; CHECK-NEXT: get_local 0{{$}}
266 ; CHECK-NEXT: set_local 1, pop{{$}}
267 ; CHECK-NEXT: ctz (get_local 1){{$}}
268 ; CHECK-NEXT: set_local 2, pop{{$}}
269 ; CHECK-NEXT: return (get_local 2){{$}}
270 define i64 @ctz64(i64 %x) {
271   %a = call i64 @llvm.cttz.i64(i64 %x, i1 false)
272   ret i64 %a
273 }
274
275 ; CHECK-LABEL: ctz64_zero_undef:
276 ; CHECK-NEXT: .param i64{{$}}
277 ; CHECK-NEXT: .result i64{{$}}
278 ; CHECK-NEXT: .local i64, i64{{$}}
279 ; CHECK-NEXT: get_local 0{{$}}
280 ; CHECK-NEXT: set_local 1, pop{{$}}
281 ; CHECK-NEXT: ctz (get_local 1){{$}}
282 ; CHECK-NEXT: set_local 2, pop{{$}}
283 ; CHECK-NEXT: return (get_local 2){{$}}
284 define i64 @ctz64_zero_undef(i64 %x) {
285   %a = call i64 @llvm.cttz.i64(i64 %x, i1 true)
286   ret i64 %a
287 }
288
289 ; CHECK-LABEL: popcnt64:
290 ; CHECK-NEXT: .param i64{{$}}
291 ; CHECK-NEXT: .result i64{{$}}
292 ; CHECK-NEXT: .local i64, i64{{$}}
293 ; CHECK-NEXT: get_local 0{{$}}
294 ; CHECK-NEXT: set_local 1, pop{{$}}
295 ; CHECK-NEXT: popcnt (get_local 1){{$}}
296 ; CHECK-NEXT: set_local 2, pop{{$}}
297 ; CHECK-NEXT: return (get_local 2){{$}}
298 define i64 @popcnt64(i64 %x) {
299   %a = call i64 @llvm.ctpop.i64(i64 %x)
300   ret i64 %a
301 }