1; RUN: llc -O2 -march=bpfel -mattr=+alu32 < %s | FileCheck %s
2;
3; int mov(int a)
4; {
5;   return a;
6; }
7;
8; int mov_ri(void)
9; {
10;   return 0xff;
11; }
12;
13; int add(int a, int b)
14; {
15;   return a + b;
16; }
17;
18; int add_i(int a)
19; {
20;   return a + 0x7fffffff;
21; }
22;
23; int sub(int a, int b)
24; {
25;   return a - b;
26; }
27;
28; int sub_i(int a)
29; {
30;   return a - 0xffffffff;
31; }
32;
33; int mul(int a, int b)
34; {
35;   return a * b;
36; }
37;
38; int mul_i(int a)
39; {
40;   return a * 0xf;
41; }
42;
43; unsigned div(unsigned a, unsigned b)
44; {
45;   return a / b;
46; }
47;
48; unsigned div_i(unsigned a)
49; {
50;   return a / 0xf;
51; }
52;
53; int or(int a, int b)
54; {
55;   return a | b;
56; }
57;
58; int or_i(int a)
59; {
60;   return a | 0xff;
61; }
62;
63; int xor(int a, int b)
64; {
65;   return a ^ b;
66; }
67;
68; int xor_i(int a)
69; {
70;   return a ^ 0xfff;
71; }
72;
73; int and(int a, int b)
74; {
75;   return a & b;
76; }
77;
78; int and_i(int a)
79; {
80;   return a & 0xffff;
81; }
82;
83; int sll(int a, int b)
84; {
85;   return a << b;
86; }
87;
88; int sll_i(int a)
89; {
90;   return a << 17;
91; }
92;
93; unsigned srl(unsigned a, unsigned b)
94; {
95;   return a >> b;
96; }
97;
98; unsigned srl_i(unsigned a, unsigned b)
99; {
100;   return a >> 31;
101; }
102;
103; int sra(int a, int b)
104; {
105;   return a >> b;
106; }
107;
108; int sra_i(int a, int b)
109; {
110;   return a >> 7;
111; }
112;
113; int neg(int a)
114; {
115;   return -a;
116; }
117
118; Function Attrs: norecurse nounwind readnone
119define dso_local i32 @mov(i32 returned %a) local_unnamed_addr #0 {
120entry:
121  ret i32 %a
122; CHECK: w{{[0-9]+}} = w{{[0-9]+}}
123}
124
125; Function Attrs: norecurse nounwind readnone
126define dso_local i32 @mov_ri() local_unnamed_addr #0 {
127entry:
128  ret i32 255
129; CHECK: w{{[0-9]+}} = 255
130}
131
132; Function Attrs: norecurse nounwind readnone
133define dso_local i32 @add(i32 %a, i32 %b) local_unnamed_addr #0 {
134entry:
135  %add = add nsw i32 %b, %a
136; CHECK: w{{[0-9]+}} += w{{[0-9]+}}
137  ret i32 %add
138}
139
140; Function Attrs: norecurse nounwind readnone
141define dso_local i32 @add_i(i32 %a) local_unnamed_addr #0 {
142entry:
143  %add = add nsw i32 %a, 2147483647
144; CHECK: w{{[0-9]+}} += 2147483647
145  ret i32 %add
146}
147
148; Function Attrs: norecurse nounwind readnone
149define dso_local i32 @sub(i32 %a, i32 %b) local_unnamed_addr #0 {
150entry:
151  %sub = sub nsw i32 %a, %b
152; CHECK: w{{[0-9]+}} -= w{{[0-9]+}}
153  ret i32 %sub
154}
155
156; Function Attrs: norecurse nounwind readnone
157define dso_local i32 @sub_i(i32 %a) local_unnamed_addr #0 {
158entry:
159  %sub = add i32 %a, 1
160; CHECK: w{{[0-9]+}} += 1
161  ret i32 %sub
162}
163
164; Function Attrs: norecurse nounwind readnone
165define dso_local i32 @mul(i32 %a, i32 %b) local_unnamed_addr #0 {
166entry:
167  %mul = mul nsw i32 %b, %a
168; CHECK: w{{[0-9]+}} *= w{{[0-9]+}}
169  ret i32 %mul
170}
171
172; Function Attrs: norecurse nounwind readnone
173define dso_local i32 @mul_i(i32 %a) local_unnamed_addr #0 {
174entry:
175  %mul = mul nsw i32 %a, 15
176; CHECK: w{{[0-9]+}} *= 15
177  ret i32 %mul
178}
179
180; Function Attrs: norecurse nounwind readnone
181define dso_local i32 @div(i32 %a, i32 %b) local_unnamed_addr #0 {
182entry:
183  %div = udiv i32 %a, %b
184; CHECK: w{{[0-9]+}} /= w{{[0-9]+}}
185  ret i32 %div
186}
187
188; Function Attrs: norecurse nounwind readnone
189define dso_local i32 @div_i(i32 %a) local_unnamed_addr #0 {
190entry:
191  %div = udiv i32 %a, 15
192; CHECK: w{{[0-9]+}} /= 15
193  ret i32 %div
194}
195
196; Function Attrs: norecurse nounwind readnone
197define dso_local i32 @or(i32 %a, i32 %b) local_unnamed_addr #0 {
198entry:
199  %or = or i32 %b, %a
200; CHECK: w{{[0-9]+}} |= w{{[0-9]+}}
201  ret i32 %or
202}
203
204; Function Attrs: norecurse nounwind readnone
205define dso_local i32 @or_i(i32 %a) local_unnamed_addr #0 {
206entry:
207  %or = or i32 %a, 255
208; CHECK: w{{[0-9]+}} |= 255
209  ret i32 %or
210}
211
212; Function Attrs: norecurse nounwind readnone
213define dso_local i32 @xor(i32 %a, i32 %b) local_unnamed_addr #0 {
214entry:
215  %xor = xor i32 %b, %a
216; CHECK: w{{[0-9]+}} ^= w{{[0-9]+}}
217  ret i32 %xor
218}
219
220; Function Attrs: norecurse nounwind readnone
221define dso_local i32 @xor_i(i32 %a) local_unnamed_addr #0 {
222entry:
223  %xor = xor i32 %a, 4095
224; CHECK: w{{[0-9]+}} ^= 4095
225  ret i32 %xor
226}
227
228; Function Attrs: norecurse nounwind readnone
229define dso_local i32 @and(i32 %a, i32 %b) local_unnamed_addr #0 {
230entry:
231  %and = and i32 %b, %a
232; CHECK: w{{[0-9]+}} &= w{{[0-9]+}}
233  ret i32 %and
234}
235
236; Function Attrs: norecurse nounwind readnone
237define dso_local i32 @and_i(i32 %a) local_unnamed_addr #0 {
238entry:
239  %and = and i32 %a, 65535
240; CHECK: w{{[0-9]+}} &= 65535
241  ret i32 %and
242}
243
244; Function Attrs: norecurse nounwind readnone
245define dso_local i32 @sll(i32 %a, i32 %b) local_unnamed_addr #0 {
246entry:
247  %shl = shl i32 %a, %b
248; CHECK: w{{[0-9]+}} <<= w{{[0-9]+}}
249  ret i32 %shl
250}
251
252; Function Attrs: norecurse nounwind readnone
253define dso_local i32 @sll_i(i32 %a) local_unnamed_addr #0 {
254entry:
255  %shl = shl i32 %a, 17
256; CHECK: w{{[0-9]+}} <<= 17
257  ret i32 %shl
258}
259
260; Function Attrs: norecurse nounwind readnone
261define dso_local i32 @srl(i32 %a, i32 %b) local_unnamed_addr #0 {
262entry:
263  %shr = lshr i32 %a, %b
264; CHECK: w{{[0-9]+}} >>= w{{[0-9]+}}
265  ret i32 %shr
266}
267
268; Function Attrs: norecurse nounwind readnone
269define dso_local i32 @srl_i(i32 %a, i32 %b) local_unnamed_addr #0 {
270entry:
271  %shr = lshr i32 %a, 31
272; CHECK: w{{[0-9]+}} >>= 31
273  ret i32 %shr
274}
275
276; Function Attrs: norecurse nounwind readnone
277define dso_local i32 @sra(i32 %a, i32 %b) local_unnamed_addr #0 {
278entry:
279  %shr = ashr i32 %a, %b
280; CHECK: w{{[0-9]+}} s>>= w{{[0-9]+}}
281  ret i32 %shr
282}
283
284; Function Attrs: norecurse nounwind readnone
285define dso_local i32 @sra_i(i32 %a, i32 %b) local_unnamed_addr #0 {
286entry:
287  %shr = ashr i32 %a, 7
288; CHECK: w{{[0-9]+}} s>>= 7
289  ret i32 %shr
290}
291
292; Function Attrs: norecurse nounwind readnone
293define dso_local i32 @neg(i32 %a) local_unnamed_addr #0 {
294entry:
295  %sub = sub nsw i32 0, %a
296; CHECK: w{{[0-9]+}} = -w{{[0-9]+}}
297  ret i32 %sub
298}
299