f4628649934c888e4452591feff4417b93f8bc2a
[oota-llvm.git] / test / CodeGen / WebAssembly / i32.ll
1 ; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3 ; Test that basic 32-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 i32 @llvm.ctlz.i32(i32, i1)
9 declare i32 @llvm.cttz.i32(i32, i1)
10 declare i32 @llvm.ctpop.i32(i32)
11
12 ; CHECK-LABEL: add32:
13 ; CHECK-NEXT: .param i32{{$}}
14 ; CHECK-NEXT: .param i32{{$}}
15 ; CHECK-NEXT: .result i32{{$}}
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 i32 @add32(i32 %x, i32 %y) {
24   %a = add i32 %x, %y
25   ret i32 %a
26 }
27
28 ; CHECK-LABEL: sub32:
29 ; CHECK-NEXT: .param i32{{$}}
30 ; CHECK-NEXT: .param i32{{$}}
31 ; CHECK-NEXT: .result i32{{$}}
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 i32 @sub32(i32 %x, i32 %y) {
40   %a = sub i32 %x, %y
41   ret i32 %a
42 }
43
44 ; CHECK-LABEL: mul32:
45 ; CHECK-NEXT: .param i32{{$}}
46 ; CHECK-NEXT: .param i32{{$}}
47 ; CHECK-NEXT: .result i32{{$}}
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 i32 @mul32(i32 %x, i32 %y) {
56   %a = mul i32 %x, %y
57   ret i32 %a
58 }
59
60 ; CHECK-LABEL: sdiv32:
61 ; CHECK-NEXT: .param i32{{$}}
62 ; CHECK-NEXT: .param i32{{$}}
63 ; CHECK-NEXT: .result i32{{$}}
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 i32 @sdiv32(i32 %x, i32 %y) {
72   %a = sdiv i32 %x, %y
73   ret i32 %a
74 }
75
76 ; CHECK-LABEL: udiv32:
77 ; CHECK-NEXT: .param i32{{$}}
78 ; CHECK-NEXT: .param i32{{$}}
79 ; CHECK-NEXT: .result i32{{$}}
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 i32 @udiv32(i32 %x, i32 %y) {
88   %a = udiv i32 %x, %y
89   ret i32 %a
90 }
91
92 ; CHECK-LABEL: srem32:
93 ; CHECK-NEXT: .param i32{{$}}
94 ; CHECK-NEXT: .param i32{{$}}
95 ; CHECK-NEXT: .result i32{{$}}
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 i32 @srem32(i32 %x, i32 %y) {
104   %a = srem i32 %x, %y
105   ret i32 %a
106 }
107
108 ; CHECK-LABEL: urem32:
109 ; CHECK-NEXT: .param i32{{$}}
110 ; CHECK-NEXT: .param i32{{$}}
111 ; CHECK-NEXT: .result i32{{$}}
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 i32 @urem32(i32 %x, i32 %y) {
120   %a = urem i32 %x, %y
121   ret i32 %a
122 }
123
124 ; CHECK-LABEL: and32:
125 ; CHECK-NEXT: .param i32{{$}}
126 ; CHECK-NEXT: .param i32{{$}}
127 ; CHECK-NEXT: .result i32{{$}}
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 i32 @and32(i32 %x, i32 %y) {
136   %a = and i32 %x, %y
137   ret i32 %a
138 }
139
140 ; CHECK-LABEL: ior32:
141 ; CHECK-NEXT: .param i32{{$}}
142 ; CHECK-NEXT: .param i32{{$}}
143 ; CHECK-NEXT: .result i32{{$}}
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 i32 @ior32(i32 %x, i32 %y) {
152   %a = or i32 %x, %y
153   ret i32 %a
154 }
155
156 ; CHECK-LABEL: xor32:
157 ; CHECK-NEXT: .param i32{{$}}
158 ; CHECK-NEXT: .param i32{{$}}
159 ; CHECK-NEXT: .result i32{{$}}
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 i32 @xor32(i32 %x, i32 %y) {
168   %a = xor i32 %x, %y
169   ret i32 %a
170 }
171
172 ; CHECK-LABEL: shl32:
173 ; CHECK-NEXT: .param i32{{$}}
174 ; CHECK-NEXT: .param i32{{$}}
175 ; CHECK-NEXT: .result i32{{$}}
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 i32 @shl32(i32 %x, i32 %y) {
184   %a = shl i32 %x, %y
185   ret i32 %a
186 }
187
188 ; CHECK-LABEL: shr32:
189 ; CHECK-NEXT: .param i32{{$}}
190 ; CHECK-NEXT: .param i32{{$}}
191 ; CHECK-NEXT: .result i32{{$}}
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 i32 @shr32(i32 %x, i32 %y) {
200   %a = lshr i32 %x, %y
201   ret i32 %a
202 }
203
204 ; CHECK-LABEL: sar32:
205 ; CHECK-NEXT: .param i32{{$}}
206 ; CHECK-NEXT: .param i32{{$}}
207 ; CHECK-NEXT: .result i32{{$}}
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 i32 @sar32(i32 %x, i32 %y) {
216   %a = ashr i32 %x, %y
217   ret i32 %a
218 }
219
220 ; CHECK-LABEL: clz32:
221 ; CHECK-NEXT: .param i32{{$}}
222 ; CHECK-NEXT: .result i32{{$}}
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 i32 @clz32(i32 %x) {
229   %a = call i32 @llvm.ctlz.i32(i32 %x, i1 false)
230   ret i32 %a
231 }
232
233 ; CHECK-LABEL: clz32_zero_undef:
234 ; CHECK-NEXT: .param i32{{$}}
235 ; CHECK-NEXT: .result i32{{$}}
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 i32 @clz32_zero_undef(i32 %x) {
242   %a = call i32 @llvm.ctlz.i32(i32 %x, i1 true)
243   ret i32 %a
244 }
245
246 ; CHECK-LABEL: ctz32:
247 ; CHECK-NEXT: .param i32{{$}}
248 ; CHECK-NEXT: .result i32{{$}}
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 i32 @ctz32(i32 %x) {
255   %a = call i32 @llvm.cttz.i32(i32 %x, i1 false)
256   ret i32 %a
257 }
258
259 ; CHECK-LABEL: ctz32_zero_undef:
260 ; CHECK-NEXT: .param i32{{$}}
261 ; CHECK-NEXT: .result i32{{$}}
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 i32 @ctz32_zero_undef(i32 %x) {
268   %a = call i32 @llvm.cttz.i32(i32 %x, i1 true)
269   ret i32 %a
270 }
271
272 ; CHECK-LABEL: popcnt32:
273 ; CHECK-NEXT: .param i32{{$}}
274 ; CHECK-NEXT: .result i32{{$}}
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 i32 @popcnt32(i32 %x) {
281   %a = call i32 @llvm.ctpop.i32(i32 %x)
282   ret i32 %a
283 }