xref: /llvm-project/llvm/test/CodeGen/AVR/shift32.ll (revision 2a528760bf20004066effcf8f91fedaabd261903)
1840d10a1SAyke van Laethem; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2840d10a1SAyke van Laethem; RUN: llc < %s -mtriple=avr -mattr=movw -verify-machineinstrs | FileCheck %s
3840d10a1SAyke van Laethem
4840d10a1SAyke van Laethemdefine i32 @shl_i32_1(i32 %a) {
5840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_1:
6840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
7840d10a1SAyke van Laethem; CHECK-NEXT:    lsl r22
8840d10a1SAyke van Laethem; CHECK-NEXT:    rol r23
9840d10a1SAyke van Laethem; CHECK-NEXT:    rol r24
10840d10a1SAyke van Laethem; CHECK-NEXT:    rol r25
11840d10a1SAyke van Laethem; CHECK-NEXT:    ret
12840d10a1SAyke van Laethem  %res = shl i32 %a, 1
13840d10a1SAyke van Laethem  ret i32 %res
14840d10a1SAyke van Laethem}
15840d10a1SAyke van Laethem
16840d10a1SAyke van Laethemdefine i32 @shl_i32_2(i32 %a) {
17840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_2:
18840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
19840d10a1SAyke van Laethem; CHECK-NEXT:    lsl r22
20840d10a1SAyke van Laethem; CHECK-NEXT:    rol r23
21840d10a1SAyke van Laethem; CHECK-NEXT:    rol r24
22840d10a1SAyke van Laethem; CHECK-NEXT:    rol r25
23840d10a1SAyke van Laethem; CHECK-NEXT:    lsl r22
24840d10a1SAyke van Laethem; CHECK-NEXT:    rol r23
25840d10a1SAyke van Laethem; CHECK-NEXT:    rol r24
26840d10a1SAyke van Laethem; CHECK-NEXT:    rol r25
27840d10a1SAyke van Laethem; CHECK-NEXT:    ret
28840d10a1SAyke van Laethem  %res = shl i32 %a, 2
29840d10a1SAyke van Laethem  ret i32 %res
30840d10a1SAyke van Laethem}
31840d10a1SAyke van Laethem
3281f5f22fSAyke van Laethemdefine i32 @shl_i32_4(i32 %a) {
3381f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_4:
3481f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
3581f5f22fSAyke van Laethem; CHECK-NEXT:    swap r25
3681f5f22fSAyke van Laethem; CHECK-NEXT:    andi r25, 240
3781f5f22fSAyke van Laethem; CHECK-NEXT:    swap r24
3881f5f22fSAyke van Laethem; CHECK-NEXT:    eor r25, r24
3981f5f22fSAyke van Laethem; CHECK-NEXT:    andi r24, 240
4081f5f22fSAyke van Laethem; CHECK-NEXT:    eor r25, r24
4181f5f22fSAyke van Laethem; CHECK-NEXT:    swap r23
4281f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
4381f5f22fSAyke van Laethem; CHECK-NEXT:    andi r23, 240
4481f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
4581f5f22fSAyke van Laethem; CHECK-NEXT:    swap r22
4681f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
4781f5f22fSAyke van Laethem; CHECK-NEXT:    andi r22, 240
4881f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
4981f5f22fSAyke van Laethem; CHECK-NEXT:    ret
5081f5f22fSAyke van Laethem  %res = shl i32 %a, 4
5181f5f22fSAyke van Laethem  ret i32 %res
5281f5f22fSAyke van Laethem}
5381f5f22fSAyke van Laethem
5481f5f22fSAyke van Laethem; shift four bits and then shift one bit
5581f5f22fSAyke van Laethemdefine i32 @shl_i32_5(i32 %a) {
5681f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_5:
5781f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
5881f5f22fSAyke van Laethem; CHECK-NEXT:    swap r25
5981f5f22fSAyke van Laethem; CHECK-NEXT:    andi r25, 240
6081f5f22fSAyke van Laethem; CHECK-NEXT:    swap r24
6181f5f22fSAyke van Laethem; CHECK-NEXT:    eor r25, r24
6281f5f22fSAyke van Laethem; CHECK-NEXT:    andi r24, 240
6381f5f22fSAyke van Laethem; CHECK-NEXT:    eor r25, r24
6481f5f22fSAyke van Laethem; CHECK-NEXT:    swap r23
6581f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
6681f5f22fSAyke van Laethem; CHECK-NEXT:    andi r23, 240
6781f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
6881f5f22fSAyke van Laethem; CHECK-NEXT:    swap r22
6981f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
7081f5f22fSAyke van Laethem; CHECK-NEXT:    andi r22, 240
7181f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
7281f5f22fSAyke van Laethem; CHECK-NEXT:    lsl r22
7381f5f22fSAyke van Laethem; CHECK-NEXT:    rol r23
7481f5f22fSAyke van Laethem; CHECK-NEXT:    rol r24
7581f5f22fSAyke van Laethem; CHECK-NEXT:    rol r25
7681f5f22fSAyke van Laethem; CHECK-NEXT:    ret
7781f5f22fSAyke van Laethem  %res = shl i32 %a, 5
7881f5f22fSAyke van Laethem  ret i32 %res
7981f5f22fSAyke van Laethem}
8081f5f22fSAyke van Laethem
81fad5e0cfSAyke van Laethem; shift two to the right and move the registers around
82fad5e0cfSAyke van Laethemdefine i32 @shl_i32_6(i32 %a) {
83fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_6:
84fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
85fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsr r25
86fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r24
87fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r23
88fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r22
89fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r18, r1
90fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r18
91fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsr r25
92fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r24
93fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r23
94fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r22
95fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r18
96fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r25, r24
97fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r24, r23
98fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r19, r22
99fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r22, r18
100fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
101fad5e0cfSAyke van Laethem  %res = shl i32 %a, 6
102fad5e0cfSAyke van Laethem  ret i32 %res
103fad5e0cfSAyke van Laethem}
104fad5e0cfSAyke van Laethem
105fad5e0cfSAyke van Laethem
106fad5e0cfSAyke van Laethem; shift one to the right and move registers around
107fad5e0cfSAyke van Laethemdefine i32 @shl_i32_7(i32 %a) {
108fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_7:
109fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
110fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsr r25
111fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r24
112fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r23
113fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r22
114fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r18, r1
115fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r18
116fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r25, r24
117fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r24, r23
118fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r19, r22
119fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r22, r18
120fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
121fad5e0cfSAyke van Laethem  %res = shl i32 %a, 7
122fad5e0cfSAyke van Laethem  ret i32 %res
123fad5e0cfSAyke van Laethem}
124fad5e0cfSAyke van Laethem
1258f8afabdSAyke van Laethemdefine i32 @shl_i32_8(i32 %a) {
1268f8afabdSAyke van Laethem; CHECK-LABEL: shl_i32_8:
1278f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
1288f8afabdSAyke van Laethem; CHECK-NEXT:    mov r25, r24
1298f8afabdSAyke van Laethem; CHECK-NEXT:    mov r24, r23
1308f8afabdSAyke van Laethem; CHECK-NEXT:    mov r23, r22
1318f8afabdSAyke van Laethem; CHECK-NEXT:    mov r22, r1
1328f8afabdSAyke van Laethem; CHECK-NEXT:    ret
1338f8afabdSAyke van Laethem  %res = shl i32 %a, 8
1348f8afabdSAyke van Laethem  ret i32 %res
1358f8afabdSAyke van Laethem}
1368f8afabdSAyke van Laethem
1378f8afabdSAyke van Laethemdefine i32 @shl_i32_9(i32 %a) {
1388f8afabdSAyke van Laethem; CHECK-LABEL: shl_i32_9:
1398f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
1408f8afabdSAyke van Laethem; CHECK-NEXT:    lsl r22
1418f8afabdSAyke van Laethem; CHECK-NEXT:    rol r23
1428f8afabdSAyke van Laethem; CHECK-NEXT:    rol r24
1438f8afabdSAyke van Laethem; CHECK-NEXT:    mov r25, r24
1448f8afabdSAyke van Laethem; CHECK-NEXT:    mov r24, r23
1458f8afabdSAyke van Laethem; CHECK-NEXT:    mov r23, r22
1468f8afabdSAyke van Laethem; CHECK-NEXT:    mov r22, r1
1478f8afabdSAyke van Laethem; CHECK-NEXT:    ret
1488f8afabdSAyke van Laethem  %res = shl i32 %a, 9
1498f8afabdSAyke van Laethem  ret i32 %res
1508f8afabdSAyke van Laethem}
1518f8afabdSAyke van Laethem
15281f5f22fSAyke van Laethem; shift 3 of 4 registers and move the others around
15381f5f22fSAyke van Laethemdefine i32 @shl_i32_12(i32 %a) {
15481f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_12:
15581f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
15681f5f22fSAyke van Laethem; CHECK-NEXT:    swap r24
15781f5f22fSAyke van Laethem; CHECK-NEXT:    andi r24, 240
15881f5f22fSAyke van Laethem; CHECK-NEXT:    swap r23
15981f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
16081f5f22fSAyke van Laethem; CHECK-NEXT:    andi r23, 240
16181f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r23
16281f5f22fSAyke van Laethem; CHECK-NEXT:    swap r22
16381f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
16481f5f22fSAyke van Laethem; CHECK-NEXT:    andi r22, 240
16581f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r22
16681f5f22fSAyke van Laethem; CHECK-NEXT:    mov r25, r24
16781f5f22fSAyke van Laethem; CHECK-NEXT:    mov r24, r23
16881f5f22fSAyke van Laethem; CHECK-NEXT:    mov r23, r22
16981f5f22fSAyke van Laethem; CHECK-NEXT:    mov r22, r1
17081f5f22fSAyke van Laethem; CHECK-NEXT:    ret
17181f5f22fSAyke van Laethem  %res = shl i32 %a, 12
17281f5f22fSAyke van Laethem  ret i32 %res
17381f5f22fSAyke van Laethem}
17481f5f22fSAyke van Laethem
175fad5e0cfSAyke van Laethemdefine i32 @shl_i32_15(i32 %a) {
176fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_15:
177fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
178fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r18, r22
179fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsr r24
180fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r19
181fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r18
182fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r23, r1
183fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r23
184fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r22, r1
185fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r18
186fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
187fad5e0cfSAyke van Laethem  %res = shl i32 %a, 15
188fad5e0cfSAyke van Laethem  ret i32 %res
189fad5e0cfSAyke van Laethem}
190fad5e0cfSAyke van Laethem
191840d10a1SAyke van Laethem; This is a special case: this shift is performed directly inside SelectionDAG
192840d10a1SAyke van Laethem; instead of as a custom lowering like the other shift operations.
193840d10a1SAyke van Laethemdefine i32 @shl_i32_16(i32 %a) {
194840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_16:
195840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
196840d10a1SAyke van Laethem; CHECK-NEXT:    movw r24, r22
197840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r22, 0
198840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r23, 0
199840d10a1SAyke van Laethem; CHECK-NEXT:    ret
200840d10a1SAyke van Laethem  %res = shl i32 %a, 16
201840d10a1SAyke van Laethem  ret i32 %res
202840d10a1SAyke van Laethem}
203840d10a1SAyke van Laethem
204840d10a1SAyke van Laethem; Combined with the register allocator, shift instructions can sometimes be
205840d10a1SAyke van Laethem; optimized away entirely. The least significant registers are simply stored
206840d10a1SAyke van Laethem; directly instead of moving them first.
207840d10a1SAyke van Laethemdefine void @shl_i32_16_ptr(i32 %a, ptr %ptr) {
208840d10a1SAyke van Laethem; CHECK-LABEL: shl_i32_16_ptr:
209840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
210840d10a1SAyke van Laethem; CHECK-NEXT:    movw r30, r20
211840d10a1SAyke van Laethem; CHECK-NEXT:    std Z+3, r23
212*2a528760SBen Shi; CHECK-NEXT:    std Z+2, r22
213840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r24, 0
214840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r25, 0
215840d10a1SAyke van Laethem; CHECK-NEXT:    std Z+1, r25
216*2a528760SBen Shi; CHECK-NEXT:    st Z, r24
217840d10a1SAyke van Laethem; CHECK-NEXT:    ret
218840d10a1SAyke van Laethem  %res = shl i32 %a, 16
219840d10a1SAyke van Laethem  store i32 %res, ptr %ptr
220840d10a1SAyke van Laethem  ret void
221840d10a1SAyke van Laethem}
222840d10a1SAyke van Laethem
22381f5f22fSAyke van Laethem; shift only the most significant byte and then move it
22481f5f22fSAyke van Laethemdefine i32 @shl_i32_28(i32 %a) {
22581f5f22fSAyke van Laethem; CHECK-LABEL: shl_i32_28:
22681f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
22781f5f22fSAyke van Laethem; CHECK-NEXT:    swap r22
22881f5f22fSAyke van Laethem; CHECK-NEXT:    andi r22, 240
22981f5f22fSAyke van Laethem; CHECK-NEXT:    mov r25, r22
23081f5f22fSAyke van Laethem; CHECK-NEXT:    mov r24, r1
23181f5f22fSAyke van Laethem; CHECK-NEXT:    mov r23, r1
23281f5f22fSAyke van Laethem; CHECK-NEXT:    mov r22, r1
23381f5f22fSAyke van Laethem; CHECK-NEXT:    ret
23481f5f22fSAyke van Laethem  %res = shl i32 %a, 28
23581f5f22fSAyke van Laethem  ret i32 %res
23681f5f22fSAyke van Laethem}
23781f5f22fSAyke van Laethem
238fad5e0cfSAyke van Laethem; move the rightmost bit to the leftmost bit and clear the rest
239fad5e0cfSAyke van Laethemdefine i32 @shl_i32_31(i32 %a) {
240fad5e0cfSAyke van Laethem; CHECK-LABEL: shl_i32_31:
241fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
242fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsr r22
243fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r25, r1
244fad5e0cfSAyke van Laethem; CHECK-NEXT:    ror r25
245fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r24, r1
246fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r23, r1
247fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r22, r1
248fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
249fad5e0cfSAyke van Laethem  %res = shl i32 %a, 31
250fad5e0cfSAyke van Laethem  ret i32 %res
251fad5e0cfSAyke van Laethem}
252fad5e0cfSAyke van Laethem
253840d10a1SAyke van Laethemdefine i32 @lshr_i32_1(i32 %a) {
254840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_1:
255840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
256840d10a1SAyke van Laethem; CHECK-NEXT:    lsr r25
257840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
258840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
259840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
260840d10a1SAyke van Laethem; CHECK-NEXT:    ret
261840d10a1SAyke van Laethem  %res = lshr i32 %a, 1
262840d10a1SAyke van Laethem  ret i32 %res
263840d10a1SAyke van Laethem}
264840d10a1SAyke van Laethem
265840d10a1SAyke van Laethemdefine i32 @lshr_i32_2(i32 %a) {
266840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_2:
267840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
268840d10a1SAyke van Laethem; CHECK-NEXT:    lsr r25
269840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
270840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
271840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
272840d10a1SAyke van Laethem; CHECK-NEXT:    lsr r25
273840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
274840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
275840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
276840d10a1SAyke van Laethem; CHECK-NEXT:    ret
277840d10a1SAyke van Laethem  %res = lshr i32 %a, 2
278840d10a1SAyke van Laethem  ret i32 %res
279840d10a1SAyke van Laethem}
280840d10a1SAyke van Laethem
28181f5f22fSAyke van Laethemdefine i32 @lshr_i32_4(i32 %a) {
28281f5f22fSAyke van Laethem; CHECK-LABEL: lshr_i32_4:
28381f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
28481f5f22fSAyke van Laethem; CHECK-NEXT:    swap r22
28581f5f22fSAyke van Laethem; CHECK-NEXT:    andi r22, 15
28681f5f22fSAyke van Laethem; CHECK-NEXT:    swap r23
28781f5f22fSAyke van Laethem; CHECK-NEXT:    eor r22, r23
28881f5f22fSAyke van Laethem; CHECK-NEXT:    andi r23, 15
28981f5f22fSAyke van Laethem; CHECK-NEXT:    eor r22, r23
29081f5f22fSAyke van Laethem; CHECK-NEXT:    swap r24
29181f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r24
29281f5f22fSAyke van Laethem; CHECK-NEXT:    andi r24, 15
29381f5f22fSAyke van Laethem; CHECK-NEXT:    eor r23, r24
29481f5f22fSAyke van Laethem; CHECK-NEXT:    swap r25
29581f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r25
29681f5f22fSAyke van Laethem; CHECK-NEXT:    andi r25, 15
29781f5f22fSAyke van Laethem; CHECK-NEXT:    eor r24, r25
29881f5f22fSAyke van Laethem; CHECK-NEXT:    ret
29981f5f22fSAyke van Laethem  %res = lshr i32 %a, 4
30081f5f22fSAyke van Laethem  ret i32 %res
30181f5f22fSAyke van Laethem}
30281f5f22fSAyke van Laethem
303fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_6(i32 %a) {
304fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_6:
305fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
306fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r22
307fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r23
308fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r24
309fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
310fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r19, r1
311fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r19
312fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r22
313fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r23
314fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r24
315fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
316fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r19
31795929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
31895929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
319fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r18, r25
320fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r18
321fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
322fad5e0cfSAyke van Laethem  %res = lshr i32 %a, 6
323fad5e0cfSAyke van Laethem  ret i32 %res
324fad5e0cfSAyke van Laethem}
325fad5e0cfSAyke van Laethem
326fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_7(i32 %a) {
327fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_7:
328fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
329fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r22
330fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r23
331fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r24
332fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
333fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r19, r1
334fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r19
33595929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
33695929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
337fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r18, r25
338fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r18
339fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
340fad5e0cfSAyke van Laethem  %res = lshr i32 %a, 7
341fad5e0cfSAyke van Laethem  ret i32 %res
342fad5e0cfSAyke van Laethem}
343fad5e0cfSAyke van Laethem
3448f8afabdSAyke van Laethemdefine i32 @lshr_i32_8(i32 %a) {
3458f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_8:
3468f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
34795929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
34895929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
34995929208SAyke van Laethem; CHECK-NEXT:    mov r24, r25
35095929208SAyke van Laethem; CHECK-NEXT:    mov r25, r1
3518f8afabdSAyke van Laethem; CHECK-NEXT:    ret
3528f8afabdSAyke van Laethem  %res = lshr i32 %a, 8
3538f8afabdSAyke van Laethem  ret i32 %res
3548f8afabdSAyke van Laethem}
3558f8afabdSAyke van Laethem
3568f8afabdSAyke van Laethemdefine i32 @lshr_i32_9(i32 %a) {
3578f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_9:
3588f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
3598f8afabdSAyke van Laethem; CHECK-NEXT:    lsr r25
3608f8afabdSAyke van Laethem; CHECK-NEXT:    ror r24
3618f8afabdSAyke van Laethem; CHECK-NEXT:    ror r23
36295929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
36395929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
36495929208SAyke van Laethem; CHECK-NEXT:    mov r24, r25
36595929208SAyke van Laethem; CHECK-NEXT:    mov r25, r1
3668f8afabdSAyke van Laethem; CHECK-NEXT:    ret
3678f8afabdSAyke van Laethem  %res = lshr i32 %a, 9
3688f8afabdSAyke van Laethem  ret i32 %res
3698f8afabdSAyke van Laethem}
3708f8afabdSAyke van Laethem
371840d10a1SAyke van Laethemdefine i32 @lshr_i32_16(i32 %a) {
372840d10a1SAyke van Laethem; CHECK-LABEL: lshr_i32_16:
373840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
374840d10a1SAyke van Laethem; CHECK-NEXT:    movw r22, r24
375840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r24, 0
376840d10a1SAyke van Laethem; CHECK-NEXT:    ldi r25, 0
377840d10a1SAyke van Laethem; CHECK-NEXT:    ret
378840d10a1SAyke van Laethem  %res = lshr i32 %a, 16
379840d10a1SAyke van Laethem  ret i32 %res
380840d10a1SAyke van Laethem}
381840d10a1SAyke van Laethem
3828f8afabdSAyke van Laethemdefine i32 @lshr_i32_24(i32 %a) {
3838f8afabdSAyke van Laethem; CHECK-LABEL: lshr_i32_24:
3848f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
3858f8afabdSAyke van Laethem; CHECK-NEXT:    mov r22, r25
38695929208SAyke van Laethem; CHECK-NEXT:    mov r23, r1
38795929208SAyke van Laethem; CHECK-NEXT:    mov r24, r1
38895929208SAyke van Laethem; CHECK-NEXT:    mov r25, r1
3898f8afabdSAyke van Laethem; CHECK-NEXT:    ret
3908f8afabdSAyke van Laethem  %res = lshr i32 %a, 24
3918f8afabdSAyke van Laethem  ret i32 %res
3928f8afabdSAyke van Laethem}
3938f8afabdSAyke van Laethem
394fad5e0cfSAyke van Laethemdefine i32 @lshr_i32_31(i32 %a) {
395fad5e0cfSAyke van Laethem; CHECK-LABEL: lshr_i32_31:
396fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
397fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r25
398fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r22, r1
399fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r22
400fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r23, r1
40195929208SAyke van Laethem; CHECK-NEXT:    mov r24, r1
40295929208SAyke van Laethem; CHECK-NEXT:    mov r25, r1
403fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
404fad5e0cfSAyke van Laethem  %res = lshr i32 %a, 31
405fad5e0cfSAyke van Laethem  ret i32 %res
406fad5e0cfSAyke van Laethem}
407fad5e0cfSAyke van Laethem
408840d10a1SAyke van Laethemdefine i32 @ashr_i32_1(i32 %a) {
409840d10a1SAyke van Laethem; CHECK-LABEL: ashr_i32_1:
410840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
411840d10a1SAyke van Laethem; CHECK-NEXT:    asr r25
412840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
413840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
414840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
415840d10a1SAyke van Laethem; CHECK-NEXT:    ret
416840d10a1SAyke van Laethem  %res = ashr i32 %a, 1
417840d10a1SAyke van Laethem  ret i32 %res
418840d10a1SAyke van Laethem}
419840d10a1SAyke van Laethem
420840d10a1SAyke van Laethemdefine i32 @ashr_i32_2(i32 %a) {
421840d10a1SAyke van Laethem; CHECK-LABEL: ashr_i32_2:
422840d10a1SAyke van Laethem; CHECK:       ; %bb.0:
423840d10a1SAyke van Laethem; CHECK-NEXT:    asr r25
424840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
425840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
426840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
427840d10a1SAyke van Laethem; CHECK-NEXT:    asr r25
428840d10a1SAyke van Laethem; CHECK-NEXT:    ror r24
429840d10a1SAyke van Laethem; CHECK-NEXT:    ror r23
430840d10a1SAyke van Laethem; CHECK-NEXT:    ror r22
431840d10a1SAyke van Laethem; CHECK-NEXT:    ret
432840d10a1SAyke van Laethem  %res = ashr i32 %a, 2
433840d10a1SAyke van Laethem  ret i32 %res
434840d10a1SAyke van Laethem}
4358f8afabdSAyke van Laethem
43681f5f22fSAyke van Laethem; can't use the swap/andi/eor trick here
43781f5f22fSAyke van Laethemdefine i32 @ashr_i32_4(i32 %a) {
43881f5f22fSAyke van Laethem; CHECK-LABEL: ashr_i32_4:
43981f5f22fSAyke van Laethem; CHECK:       ; %bb.0:
44081f5f22fSAyke van Laethem; CHECK-NEXT:    asr r25
44181f5f22fSAyke van Laethem; CHECK-NEXT:    ror r24
44281f5f22fSAyke van Laethem; CHECK-NEXT:    ror r23
44381f5f22fSAyke van Laethem; CHECK-NEXT:    ror r22
44481f5f22fSAyke van Laethem; CHECK-NEXT:    asr r25
44581f5f22fSAyke van Laethem; CHECK-NEXT:    ror r24
44681f5f22fSAyke van Laethem; CHECK-NEXT:    ror r23
44781f5f22fSAyke van Laethem; CHECK-NEXT:    ror r22
44881f5f22fSAyke van Laethem; CHECK-NEXT:    asr r25
44981f5f22fSAyke van Laethem; CHECK-NEXT:    ror r24
45081f5f22fSAyke van Laethem; CHECK-NEXT:    ror r23
45181f5f22fSAyke van Laethem; CHECK-NEXT:    ror r22
45281f5f22fSAyke van Laethem; CHECK-NEXT:    asr r25
45381f5f22fSAyke van Laethem; CHECK-NEXT:    ror r24
45481f5f22fSAyke van Laethem; CHECK-NEXT:    ror r23
45581f5f22fSAyke van Laethem; CHECK-NEXT:    ror r22
45681f5f22fSAyke van Laethem; CHECK-NEXT:    ret
45781f5f22fSAyke van Laethem  %res = ashr i32 %a, 4
45881f5f22fSAyke van Laethem  ret i32 %res
45981f5f22fSAyke van Laethem}
46081f5f22fSAyke van Laethem
461fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_7(i32 %a) {
462fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_7:
463fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
464fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r22
465fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r23
466fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r24
467fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
468fad5e0cfSAyke van Laethem; CHECK-NEXT:    sbc r19, r19
46995929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
47095929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
471fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r18, r25
472fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r18
473fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
474fad5e0cfSAyke van Laethem  %res = ashr i32 %a, 7
475fad5e0cfSAyke van Laethem  ret i32 %res
476fad5e0cfSAyke van Laethem}
477fad5e0cfSAyke van Laethem
47895929208SAyke van Laethem; TODO: this could be optimized to 4 movs, instead of 5.
4798f8afabdSAyke van Laethemdefine i32 @ashr_i32_8(i32 %a) {
4808f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_8:
4818f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
4828f8afabdSAyke van Laethem; CHECK-NEXT:    mov r19, r25
4838f8afabdSAyke van Laethem; CHECK-NEXT:    lsl r19
4848f8afabdSAyke van Laethem; CHECK-NEXT:    sbc r19, r19
48595929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
48695929208SAyke van Laethem; CHECK-NEXT:    mov r23, r24
4878f8afabdSAyke van Laethem; CHECK-NEXT:    mov r18, r25
4888f8afabdSAyke van Laethem; CHECK-NEXT:    movw r24, r18
4898f8afabdSAyke van Laethem; CHECK-NEXT:    ret
4908f8afabdSAyke van Laethem  %res = ashr i32 %a, 8
4918f8afabdSAyke van Laethem  ret i32 %res
4928f8afabdSAyke van Laethem}
4938f8afabdSAyke van Laethem
4948f8afabdSAyke van Laethemdefine i32 @ashr_i32_16(i32 %a) {
4958f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_16:
4968f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
4978f8afabdSAyke van Laethem; CHECK-NEXT:    movw r22, r24
4988f8afabdSAyke van Laethem; CHECK-NEXT:    lsl r25
4998f8afabdSAyke van Laethem; CHECK-NEXT:    sbc r25, r25
5008f8afabdSAyke van Laethem; CHECK-NEXT:    mov r24, r25
5018f8afabdSAyke van Laethem; CHECK-NEXT:    ret
5028f8afabdSAyke van Laethem  %res = ashr i32 %a, 16
5038f8afabdSAyke van Laethem  ret i32 %res
5048f8afabdSAyke van Laethem}
5058f8afabdSAyke van Laethem
5068f8afabdSAyke van Laethemdefine i32 @ashr_i32_17(i32 %a) {
5078f8afabdSAyke van Laethem; CHECK-LABEL: ashr_i32_17:
5088f8afabdSAyke van Laethem; CHECK:       ; %bb.0:
5098f8afabdSAyke van Laethem; CHECK-NEXT:    movw r22, r24
5108f8afabdSAyke van Laethem; CHECK-NEXT:    lsl r25
5118f8afabdSAyke van Laethem; CHECK-NEXT:    sbc r25, r25
5128f8afabdSAyke van Laethem; CHECK-NEXT:    asr r23
5138f8afabdSAyke van Laethem; CHECK-NEXT:    ror r22
5148f8afabdSAyke van Laethem; CHECK-NEXT:    mov r24, r25
5158f8afabdSAyke van Laethem; CHECK-NEXT:    ret
5168f8afabdSAyke van Laethem  %res = ashr i32 %a, 17
5178f8afabdSAyke van Laethem  ret i32 %res
5188f8afabdSAyke van Laethem}
519fad5e0cfSAyke van Laethem
520fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_22(i32 %a) {
521fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_22:
522fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
523fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r24
524fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
52595929208SAyke van Laethem; CHECK-NEXT:    sbc r18, r18
526fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r24
527fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
528effb7ab6SJay Foad; CHECK-NEXT:    mov r19, r18
52995929208SAyke van Laethem; CHECK-NEXT:    mov r23, r18
530fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r23
531fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r22, r25
532fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r18
533fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
534fad5e0cfSAyke van Laethem  %res = ashr i32 %a, 22
535fad5e0cfSAyke van Laethem  ret i32 %res
536fad5e0cfSAyke van Laethem}
537fad5e0cfSAyke van Laethem
538fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_23(i32 %a) {
539fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_23:
540fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
541fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r24
542fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r25
54395929208SAyke van Laethem; CHECK-NEXT:    sbc r23, r23
544fad5e0cfSAyke van Laethem; CHECK-NEXT:    mov r22, r25
54595929208SAyke van Laethem; CHECK-NEXT:    mov r24, r23
54695929208SAyke van Laethem; CHECK-NEXT:    mov r25, r23
547fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
548fad5e0cfSAyke van Laethem  %res = ashr i32 %a, 23
549fad5e0cfSAyke van Laethem  ret i32 %res
550fad5e0cfSAyke van Laethem}
551fad5e0cfSAyke van Laethem
552fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_30(i32 %a) {
553fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_30:
554fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
555fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r25
55695929208SAyke van Laethem; CHECK-NEXT:    sbc r23, r23
557fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r25
55895929208SAyke van Laethem; CHECK-NEXT:    mov r22, r23
559fad5e0cfSAyke van Laethem; CHECK-NEXT:    rol r22
56095929208SAyke van Laethem; CHECK-NEXT:    mov r24, r23
56195929208SAyke van Laethem; CHECK-NEXT:    mov r25, r23
562fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
563fad5e0cfSAyke van Laethem  %res = ashr i32 %a, 30
564fad5e0cfSAyke van Laethem  ret i32 %res
565fad5e0cfSAyke van Laethem}
566fad5e0cfSAyke van Laethem
567fad5e0cfSAyke van Laethemdefine i32 @ashr_i32_31(i32 %a) {
568fad5e0cfSAyke van Laethem; CHECK-LABEL: ashr_i32_31:
569fad5e0cfSAyke van Laethem; CHECK:       ; %bb.0:
570fad5e0cfSAyke van Laethem; CHECK-NEXT:    lsl r25
57195929208SAyke van Laethem; CHECK-NEXT:    sbc r22, r22
57295929208SAyke van Laethem; CHECK-NEXT:    mov r23, r22
573fad5e0cfSAyke van Laethem; CHECK-NEXT:    movw r24, r22
574fad5e0cfSAyke van Laethem; CHECK-NEXT:    ret
575fad5e0cfSAyke van Laethem  %res = ashr i32 %a, 31
576fad5e0cfSAyke van Laethem  ret i32 %res
577fad5e0cfSAyke van Laethem}
578