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