blob: f4628649934c888e4452591feff4417b93f8bc2a [file] [log] [blame]
JF Bastienb9073fb2015-07-22 21:28:15 +00001; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
JF Bastien8f9aea02015-08-01 04:48:44 +00003; Test that basic 32-bit integer operations assemble as expected.
4
Dan Gohmandde8dce2015-08-19 20:30:20 +00005target datalayout = "e-p:32:32-i64:64-n32:64-S128"
JF Bastienb9073fb2015-07-22 21:28:15 +00006target triple = "wasm32-unknown-unknown"
7
JF Bastien600aee92015-07-31 17:53:38 +00008declare i32 @llvm.ctlz.i32(i32, i1)
9declare i32 @llvm.cttz.i32(i32, i1)
10declare i32 @llvm.ctpop.i32(i32)
11
Dan Gohmane51c0582015-10-06 00:27:55 +000012; 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{{$}}
JF Bastienb9073fb2015-07-22 21:28:15 +000023define i32 @add32(i32 %x, i32 %y) {
24 %a = add i32 %x, %y
25 ret i32 %a
26}
JF Bastien600aee92015-07-31 17:53:38 +000027
Dan Gohmane51c0582015-10-06 00:27:55 +000028; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +000039define i32 @sub32(i32 %x, i32 %y) {
40 %a = sub i32 %x, %y
41 ret i32 %a
42}
43
Dan Gohmane51c0582015-10-06 00:27:55 +000044; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +000055define i32 @mul32(i32 %x, i32 %y) {
56 %a = mul i32 %x, %y
57 ret i32 %a
58}
59
Dan Gohmane51c0582015-10-06 00:27:55 +000060; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +000071define i32 @sdiv32(i32 %x, i32 %y) {
72 %a = sdiv i32 %x, %y
73 ret i32 %a
74}
75
Dan Gohmane51c0582015-10-06 00:27:55 +000076; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +000087define i32 @udiv32(i32 %x, i32 %y) {
88 %a = udiv i32 %x, %y
89 ret i32 %a
90}
91
Dan Gohmane51c0582015-10-06 00:27:55 +000092; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000103define i32 @srem32(i32 %x, i32 %y) {
104 %a = srem i32 %x, %y
105 ret i32 %a
106}
107
Dan Gohmane51c0582015-10-06 00:27:55 +0000108; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000119define i32 @urem32(i32 %x, i32 %y) {
120 %a = urem i32 %x, %y
121 ret i32 %a
122}
123
Dan Gohmane51c0582015-10-06 00:27:55 +0000124; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000135define i32 @and32(i32 %x, i32 %y) {
136 %a = and i32 %x, %y
137 ret i32 %a
138}
139
Dan Gohmane51c0582015-10-06 00:27:55 +0000140; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000151define i32 @ior32(i32 %x, i32 %y) {
152 %a = or i32 %x, %y
153 ret i32 %a
154}
155
Dan Gohmane51c0582015-10-06 00:27:55 +0000156; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000167define i32 @xor32(i32 %x, i32 %y) {
168 %a = xor i32 %x, %y
169 ret i32 %a
170}
171
Dan Gohmane51c0582015-10-06 00:27:55 +0000172; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000183define i32 @shl32(i32 %x, i32 %y) {
184 %a = shl i32 %x, %y
185 ret i32 %a
186}
187
Dan Gohmane51c0582015-10-06 00:27:55 +0000188; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000199define i32 @shr32(i32 %x, i32 %y) {
200 %a = lshr i32 %x, %y
201 ret i32 %a
202}
203
Dan Gohmane51c0582015-10-06 00:27:55 +0000204; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000215define i32 @sar32(i32 %x, i32 %y) {
216 %a = ashr i32 %x, %y
217 ret i32 %a
218}
219
Dan Gohmane51c0582015-10-06 00:27:55 +0000220; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000228define i32 @clz32(i32 %x) {
229 %a = call i32 @llvm.ctlz.i32(i32 %x, i1 false)
230 ret i32 %a
231}
232
Dan Gohmane51c0582015-10-06 00:27:55 +0000233; 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{{$}}
Dan Gohman08fc9662015-08-24 16:39:37 +0000241define i32 @clz32_zero_undef(i32 %x) {
242 %a = call i32 @llvm.ctlz.i32(i32 %x, i1 true)
243 ret i32 %a
244}
245
Dan Gohmane51c0582015-10-06 00:27:55 +0000246; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000254define i32 @ctz32(i32 %x) {
255 %a = call i32 @llvm.cttz.i32(i32 %x, i1 false)
256 ret i32 %a
257}
258
Dan Gohmane51c0582015-10-06 00:27:55 +0000259; 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{{$}}
Dan Gohman08fc9662015-08-24 16:39:37 +0000267define i32 @ctz32_zero_undef(i32 %x) {
268 %a = call i32 @llvm.cttz.i32(i32 %x, i1 true)
269 ret i32 %a
270}
271
Dan Gohmane51c0582015-10-06 00:27:55 +0000272; 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{{$}}
JF Bastien600aee92015-07-31 17:53:38 +0000280define i32 @popcnt32(i32 %x) {
281 %a = call i32 @llvm.ctpop.i32(i32 %x)
282 ret i32 %a
283}