1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel  -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
3
4define i1 @and_i1(i1 %a, i1 %b) {
5; MIPS32-LABEL: and_i1:
6; MIPS32:       # %bb.0: # %entry
7; MIPS32-NEXT:    and $2, $5, $4
8; MIPS32-NEXT:    jr $ra
9; MIPS32-NEXT:    nop
10entry:
11  %and = and i1 %b, %a
12  ret i1 %and
13}
14
15define i8 @and_i8(i8 %a, i8 %b) {
16; MIPS32-LABEL: and_i8:
17; MIPS32:       # %bb.0: # %entry
18; MIPS32-NEXT:    and $2, $5, $4
19; MIPS32-NEXT:    jr $ra
20; MIPS32-NEXT:    nop
21entry:
22  %and = and i8 %b, %a
23  ret i8 %and
24}
25
26define i16 @and_i16(i16 %a, i16 %b) {
27; MIPS32-LABEL: and_i16:
28; MIPS32:       # %bb.0: # %entry
29; MIPS32-NEXT:    and $2, $5, $4
30; MIPS32-NEXT:    jr $ra
31; MIPS32-NEXT:    nop
32entry:
33  %and = and i16 %b, %a
34  ret i16 %and
35}
36
37define i32 @and_i32(i32 %a, i32 %b) {
38; MIPS32-LABEL: and_i32:
39; MIPS32:       # %bb.0: # %entry
40; MIPS32-NEXT:    and $2, $5, $4
41; MIPS32-NEXT:    jr $ra
42; MIPS32-NEXT:    nop
43entry:
44  %and = and i32 %b, %a
45  ret i32 %and
46}
47
48define i64 @and_i64(i64 %a, i64 %b) {
49; MIPS32-LABEL: and_i64:
50; MIPS32:       # %bb.0: # %entry
51; MIPS32-NEXT:    and $2, $6, $4
52; MIPS32-NEXT:    and $3, $7, $5
53; MIPS32-NEXT:    jr $ra
54; MIPS32-NEXT:    nop
55entry:
56  %and = and i64 %b, %a
57  ret i64 %and
58}
59
60define i32 @and_imm(i32 %a) {
61; MIPS32-LABEL: and_imm:
62; MIPS32:       # %bb.0: # %entry
63; MIPS32-NEXT:    andi $2, $4, 255
64; MIPS32-NEXT:    jr $ra
65; MIPS32-NEXT:    nop
66entry:
67  %and = and i32 %a, 255
68  ret i32 %and
69}
70
71define i32 @and_not_imm32ZExt16(i32 %a) {
72; MIPS32-LABEL: and_not_imm32ZExt16:
73; MIPS32:       # %bb.0: # %entry
74; MIPS32-NEXT:    addiu $1, $zero, 65280
75; MIPS32-NEXT:    and $2, $4, $1
76; MIPS32-NEXT:    jr $ra
77; MIPS32-NEXT:    nop
78entry:
79  %and = and i32 %a, -256
80  ret i32 %and
81}
82
83define i1 @or_i1(i1 %a, i1 %b) {
84; MIPS32-LABEL: or_i1:
85; MIPS32:       # %bb.0: # %entry
86; MIPS32-NEXT:    or $2, $5, $4
87; MIPS32-NEXT:    jr $ra
88; MIPS32-NEXT:    nop
89entry:
90  %or = or i1 %b, %a
91  ret i1 %or
92}
93
94define i8 @or_i8(i8 %a, i8 %b) {
95; MIPS32-LABEL: or_i8:
96; MIPS32:       # %bb.0: # %entry
97; MIPS32-NEXT:    or $2, $5, $4
98; MIPS32-NEXT:    jr $ra
99; MIPS32-NEXT:    nop
100entry:
101  %or = or i8 %b, %a
102  ret i8 %or
103}
104
105define i16 @or_i16(i16 %a, i16 %b) {
106; MIPS32-LABEL: or_i16:
107; MIPS32:       # %bb.0: # %entry
108; MIPS32-NEXT:    or $2, $5, $4
109; MIPS32-NEXT:    jr $ra
110; MIPS32-NEXT:    nop
111entry:
112  %or = or i16 %b, %a
113  ret i16 %or
114}
115
116define i32 @or_i32(i32 %a, i32 %b) {
117; MIPS32-LABEL: or_i32:
118; MIPS32:       # %bb.0: # %entry
119; MIPS32-NEXT:    or $2, $5, $4
120; MIPS32-NEXT:    jr $ra
121; MIPS32-NEXT:    nop
122entry:
123  %or = or i32 %b, %a
124  ret i32 %or
125}
126
127define i64 @or_i64(i64 %a, i64 %b) {
128; MIPS32-LABEL: or_i64:
129; MIPS32:       # %bb.0: # %entry
130; MIPS32-NEXT:    or $2, $6, $4
131; MIPS32-NEXT:    or $3, $7, $5
132; MIPS32-NEXT:    jr $ra
133; MIPS32-NEXT:    nop
134entry:
135  %or = or i64 %b, %a
136  ret i64 %or
137}
138
139define i32 @or_imm(i32 %a) {
140; MIPS32-LABEL: or_imm:
141; MIPS32:       # %bb.0: # %entry
142; MIPS32-NEXT:    ori $2, $4, 65535
143; MIPS32-NEXT:    jr $ra
144; MIPS32-NEXT:    nop
145entry:
146  %or = or i32 %a, 65535
147  ret i32 %or
148}
149
150define i32 @or_not_imm32ZExt16(i32 %a) {
151; MIPS32-LABEL: or_not_imm32ZExt16:
152; MIPS32:       # %bb.0: # %entry
153; MIPS32-NEXT:    lui $1, 1
154; MIPS32-NEXT:    or $2, $4, $1
155; MIPS32-NEXT:    jr $ra
156; MIPS32-NEXT:    nop
157entry:
158  %or = or i32 %a, 65536
159  ret i32 %or
160}
161
162define i1 @xor_i1(i1 %a, i1 %b) {
163; MIPS32-LABEL: xor_i1:
164; MIPS32:       # %bb.0: # %entry
165; MIPS32-NEXT:    xor $2, $5, $4
166; MIPS32-NEXT:    jr $ra
167; MIPS32-NEXT:    nop
168entry:
169  %xor = xor i1 %b, %a
170  ret i1 %xor
171}
172
173define i8 @xor_i8(i8 %a, i8 %b) {
174; MIPS32-LABEL: xor_i8:
175; MIPS32:       # %bb.0: # %entry
176; MIPS32-NEXT:    xor $2, $5, $4
177; MIPS32-NEXT:    jr $ra
178; MIPS32-NEXT:    nop
179entry:
180  %xor = xor i8 %b, %a
181  ret i8 %xor
182}
183
184define i16 @xor_i16(i16 %a, i16 %b) {
185; MIPS32-LABEL: xor_i16:
186; MIPS32:       # %bb.0: # %entry
187; MIPS32-NEXT:    xor $2, $5, $4
188; MIPS32-NEXT:    jr $ra
189; MIPS32-NEXT:    nop
190entry:
191  %xor = xor i16 %b, %a
192  ret i16 %xor
193}
194
195define i32 @xor_i32(i32 %a, i32 %b) {
196; MIPS32-LABEL: xor_i32:
197; MIPS32:       # %bb.0: # %entry
198; MIPS32-NEXT:    xor $2, $5, $4
199; MIPS32-NEXT:    jr $ra
200; MIPS32-NEXT:    nop
201entry:
202  %xor = xor i32 %b, %a
203  ret i32 %xor
204}
205
206define i64 @xor_i64(i64 %a, i64 %b) {
207; MIPS32-LABEL: xor_i64:
208; MIPS32:       # %bb.0: # %entry
209; MIPS32-NEXT:    xor $2, $6, $4
210; MIPS32-NEXT:    xor $3, $7, $5
211; MIPS32-NEXT:    jr $ra
212; MIPS32-NEXT:    nop
213entry:
214  %xor = xor i64 %b, %a
215  ret i64 %xor
216}
217
218define i32 @xor_imm(i32 %a) {
219; MIPS32-LABEL: xor_imm:
220; MIPS32:       # %bb.0: # %entry
221; MIPS32-NEXT:    xori $2, $4, 1
222; MIPS32-NEXT:    jr $ra
223; MIPS32-NEXT:    nop
224entry:
225  %xor = xor i32 %a, 1
226  ret i32 %xor
227}
228
229define i32 @xor_not_imm32ZExt16(i32 %a) {
230; MIPS32-LABEL: xor_not_imm32ZExt16:
231; MIPS32:       # %bb.0: # %entry
232; MIPS32-NEXT:    not $2, $4
233; MIPS32-NEXT:    jr $ra
234; MIPS32-NEXT:    nop
235entry:
236  %xor = xor i32 %a, -1
237  ret i32 %xor
238}
239
240define i32 @shl(i32 %a) {
241; MIPS32-LABEL: shl:
242; MIPS32:       # %bb.0: # %entry
243; MIPS32-NEXT:    sll $2, $4, 1
244; MIPS32-NEXT:    jr $ra
245; MIPS32-NEXT:    nop
246entry:
247  %shl = shl i32 %a, 1
248  ret i32 %shl
249}
250
251define i32 @ashr(i32 %a) {
252; MIPS32-LABEL: ashr:
253; MIPS32:       # %bb.0: # %entry
254; MIPS32-NEXT:    sra $2, $4, 1
255; MIPS32-NEXT:    jr $ra
256; MIPS32-NEXT:    nop
257entry:
258  %shr = ashr i32 %a, 1
259  ret i32 %shr
260}
261
262define i32 @lshr(i32 %a) {
263; MIPS32-LABEL: lshr:
264; MIPS32:       # %bb.0: # %entry
265; MIPS32-NEXT:    srl $2, $4, 1
266; MIPS32-NEXT:    jr $ra
267; MIPS32-NEXT:    nop
268entry:
269  %shr = lshr i32 %a, 1
270  ret i32 %shr
271}
272
273define i32 @shlv(i32 %a, i32 %b) {
274; MIPS32-LABEL: shlv:
275; MIPS32:       # %bb.0: # %entry
276; MIPS32-NEXT:    sllv $2, $4, $5
277; MIPS32-NEXT:    jr $ra
278; MIPS32-NEXT:    nop
279entry:
280  %shl = shl i32 %a, %b
281  ret i32 %shl
282}
283
284define i32 @ashrv(i32 %a, i32 %b) {
285; MIPS32-LABEL: ashrv:
286; MIPS32:       # %bb.0: # %entry
287; MIPS32-NEXT:    srav $2, $4, $5
288; MIPS32-NEXT:    jr $ra
289; MIPS32-NEXT:    nop
290entry:
291  %shr = ashr i32 %a, %b
292  ret i32 %shr
293}
294
295define i32 @lshrv(i32 %a, i32 %b) {
296; MIPS32-LABEL: lshrv:
297; MIPS32:       # %bb.0: # %entry
298; MIPS32-NEXT:    srlv $2, $4, $5
299; MIPS32-NEXT:    jr $ra
300; MIPS32-NEXT:    nop
301entry:
302  %shr = lshr i32 %a, %b
303  ret i32 %shr
304}
305
306define  i16 @shl_i16(i16 %a) {
307; MIPS32-LABEL: shl_i16:
308; MIPS32:       # %bb.0: # %entry
309; MIPS32-NEXT:    ori $1, $zero, 2
310; MIPS32-NEXT:    sllv $2, $4, $1
311; MIPS32-NEXT:    jr $ra
312; MIPS32-NEXT:    nop
313entry:
314  %shl = shl i16 %a, 2
315  ret i16 %shl
316}
317
318define i8 @ashr_i8(i8 %a) {
319; MIPS32-LABEL: ashr_i8:
320; MIPS32:       # %bb.0: # %entry
321; MIPS32-NEXT:    ori $2, $zero, 2
322; MIPS32-NEXT:    sll $1, $4, 24
323; MIPS32-NEXT:    sra $1, $1, 24
324; MIPS32-NEXT:    srav $2, $1, $2
325; MIPS32-NEXT:    jr $ra
326; MIPS32-NEXT:    nop
327entry:
328  %0 = ashr i8 %a, 2
329  ret i8 %0
330}
331
332define i16 @lshr_i16(i16 %a) {
333; MIPS32-LABEL: lshr_i16:
334; MIPS32:       # %bb.0: # %entry
335; MIPS32-NEXT:    ori $2, $zero, 2
336; MIPS32-NEXT:    andi $1, $4, 65535
337; MIPS32-NEXT:    srlv $2, $1, $2
338; MIPS32-NEXT:    jr $ra
339; MIPS32-NEXT:    nop
340entry:
341  %0 = lshr i16 %a, 2
342  ret i16 %0
343}
344
345define i64 @shl_i64(i64 %a, i64 %b) {
346; MIPS32-LABEL: shl_i64:
347; MIPS32:       # %bb.0: # %entry
348; MIPS32-NEXT:    move $3, $4
349; MIPS32-NEXT:    move $9, $6
350; MIPS32-NEXT:    ori $1, $zero, 32
351; MIPS32-NEXT:    subu $8, $9, $1
352; MIPS32-NEXT:    subu $4, $1, $9
353; MIPS32-NEXT:    ori $2, $zero, 0
354; MIPS32-NEXT:    sltu $6, $9, $1
355; MIPS32-NEXT:    sltiu $1, $9, 1
356; MIPS32-NEXT:    sllv $7, $3, $9
357; MIPS32-NEXT:    srlv $4, $3, $4
358; MIPS32-NEXT:    sllv $9, $5, $9
359; MIPS32-NEXT:    or $4, $4, $9
360; MIPS32-NEXT:    sllv $3, $3, $8
361; MIPS32-NEXT:    andi $8, $6, 1
362; MIPS32-NEXT:    movn $2, $7, $8
363; MIPS32-NEXT:    andi $6, $6, 1
364; MIPS32-NEXT:    movn $3, $4, $6
365; MIPS32-NEXT:    andi $1, $1, 1
366; MIPS32-NEXT:    movn $3, $5, $1
367; MIPS32-NEXT:    jr $ra
368; MIPS32-NEXT:    nop
369entry:
370  %shl = shl i64 %a, %b
371  ret i64 %shl
372}
373
374define i64 @ashl_i64(i64 %a, i64 %b) {
375; MIPS32-LABEL: ashl_i64:
376; MIPS32:       # %bb.0: # %entry
377; MIPS32-NEXT:    addiu $sp, $sp, -8
378; MIPS32-NEXT:    .cfi_def_cfa_offset 8
379; MIPS32-NEXT:    sw $4, 4($sp) # 4-byte Folded Spill
380; MIPS32-NEXT:    move $2, $5
381; MIPS32-NEXT:    lw $5, 4($sp) # 4-byte Folded Reload
382; MIPS32-NEXT:    move $3, $6
383; MIPS32-NEXT:    ori $1, $zero, 32
384; MIPS32-NEXT:    subu $8, $3, $1
385; MIPS32-NEXT:    subu $7, $1, $3
386; MIPS32-NEXT:    sltu $4, $3, $1
387; MIPS32-NEXT:    sltiu $6, $3, 1
388; MIPS32-NEXT:    srav $1, $2, $3
389; MIPS32-NEXT:    srlv $3, $5, $3
390; MIPS32-NEXT:    sllv $7, $2, $7
391; MIPS32-NEXT:    or $7, $3, $7
392; MIPS32-NEXT:    sra $3, $2, 31
393; MIPS32-NEXT:    srav $2, $2, $8
394; MIPS32-NEXT:    andi $8, $4, 1
395; MIPS32-NEXT:    movn $2, $7, $8
396; MIPS32-NEXT:    andi $6, $6, 1
397; MIPS32-NEXT:    movn $2, $5, $6
398; MIPS32-NEXT:    andi $4, $4, 1
399; MIPS32-NEXT:    movn $3, $1, $4
400; MIPS32-NEXT:    addiu $sp, $sp, 8
401; MIPS32-NEXT:    jr $ra
402; MIPS32-NEXT:    nop
403entry:
404  %shr = ashr i64 %a, %b
405  ret i64 %shr
406}
407
408define i64 @lshr_i64(i64 %a, i64 %b) {
409; MIPS32-LABEL: lshr_i64:
410; MIPS32:       # %bb.0: # %entry
411; MIPS32-NEXT:    addiu $sp, $sp, -8
412; MIPS32-NEXT:    .cfi_def_cfa_offset 8
413; MIPS32-NEXT:    sw $4, 4($sp) # 4-byte Folded Spill
414; MIPS32-NEXT:    move $2, $5
415; MIPS32-NEXT:    lw $5, 4($sp) # 4-byte Folded Reload
416; MIPS32-NEXT:    move $7, $6
417; MIPS32-NEXT:    ori $1, $zero, 32
418; MIPS32-NEXT:    subu $8, $7, $1
419; MIPS32-NEXT:    subu $9, $1, $7
420; MIPS32-NEXT:    ori $3, $zero, 0
421; MIPS32-NEXT:    sltu $4, $7, $1
422; MIPS32-NEXT:    sltiu $6, $7, 1
423; MIPS32-NEXT:    srlv $1, $2, $7
424; MIPS32-NEXT:    srlv $7, $5, $7
425; MIPS32-NEXT:    sllv $9, $2, $9
426; MIPS32-NEXT:    or $7, $7, $9
427; MIPS32-NEXT:    srlv $2, $2, $8
428; MIPS32-NEXT:    andi $8, $4, 1
429; MIPS32-NEXT:    movn $2, $7, $8
430; MIPS32-NEXT:    andi $6, $6, 1
431; MIPS32-NEXT:    movn $2, $5, $6
432; MIPS32-NEXT:    andi $4, $4, 1
433; MIPS32-NEXT:    movn $3, $1, $4
434; MIPS32-NEXT:    addiu $sp, $sp, 8
435; MIPS32-NEXT:    jr $ra
436; MIPS32-NEXT:    nop
437entry:
438  %shr = lshr i64 %a, %b
439  ret i64 %shr
440}
441