xref: /llvm-project/llvm/test/CodeGen/AVR/rotate.ll (revision 71d90f310867c78532c5bdb9ba553859910ee67e)
1ff75a2beSPatryk Wychowaniec; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2ff75a2beSPatryk Wychowaniec; RUN: llc < %s -mtriple=avr | FileCheck %s
3ff75a2beSPatryk Wychowaniec
4ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_1(i8 %x) {
5ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_1:
6ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
7ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r24
8ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    adc r24, r1
9ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
10ff75a2beSPatryk Wychowaniecstart:
11ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 1)
12ff75a2beSPatryk Wychowaniec  ret i8 %0
13ff75a2beSPatryk Wychowaniec}
14ff75a2beSPatryk Wychowaniec
15ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_3(i8 %x) {
16ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_3:
17ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
18*71d90f31SBen Shi; CHECK-NEXT:    swap r24
19*71d90f31SBen Shi; CHECK-NEXT:    bst r24, 0
20*71d90f31SBen Shi; CHECK-NEXT:    ror r24
21*71d90f31SBen Shi; CHECK-NEXT:    bld r24, 7
22ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
23ff75a2beSPatryk Wychowaniecstart:
24ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 3)
25ff75a2beSPatryk Wychowaniec  ret i8 %0
26ff75a2beSPatryk Wychowaniec}
27ff75a2beSPatryk Wychowaniec
28b1f0cb89SBen Shidefine i8 @rotl8_5(i8 %x) {
29b1f0cb89SBen Shi; CHECK-LABEL: rotl8_5:
30b1f0cb89SBen Shi; CHECK:       ; %bb.0: ; %start
31e21df829SBen Shi; CHECK-NEXT:    swap r24
32b1f0cb89SBen Shi; CHECK-NEXT:    lsl r24
33b1f0cb89SBen Shi; CHECK-NEXT:    adc r24, r1
34b1f0cb89SBen Shi; CHECK-NEXT:    ret
35b1f0cb89SBen Shistart:
36b1f0cb89SBen Shi  %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 5)
37b1f0cb89SBen Shi  ret i8 %0
38b1f0cb89SBen Shi}
39b1f0cb89SBen Shi
40b1f0cb89SBen Shidefine i8 @rotl8_7(i8 %x) {
41b1f0cb89SBen Shi; CHECK-LABEL: rotl8_7:
42b1f0cb89SBen Shi; CHECK:       ; %bb.0: ; %start
43e21df829SBen Shi; CHECK-NEXT:    bst r24, 0
44e21df829SBen Shi; CHECK-NEXT:    ror r24
45e21df829SBen Shi; CHECK-NEXT:    bld r24, 7
46b1f0cb89SBen Shi; CHECK-NEXT:    ret
47b1f0cb89SBen Shistart:
48b1f0cb89SBen Shi  %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 7)
49b1f0cb89SBen Shi  ret i8 %0
50b1f0cb89SBen Shi}
51b1f0cb89SBen Shi
52ff75a2beSPatryk Wychowaniecdefine i8 @rotl8_dyn(i8 %x, i8 %y) {
53ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl8_dyn:
54ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
55ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r22, 7
56ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    dec r22
57b1f0cb89SBen Shi; CHECK-NEXT:    brmi .LBB4_2
58b1f0cb89SBen Shi; CHECK-NEXT:  .LBB4_1: ; %start
59ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
60ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r24
61ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    adc r24, r1
62ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    dec r22
63b1f0cb89SBen Shi; CHECK-NEXT:    brpl .LBB4_1
64b1f0cb89SBen Shi; CHECK-NEXT:  .LBB4_2: ; %start
65ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
66ff75a2beSPatryk Wychowaniecstart:
67ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 %y)
68ff75a2beSPatryk Wychowaniec  ret i8 %0
69ff75a2beSPatryk Wychowaniec}
70ff75a2beSPatryk Wychowaniec
71ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_1(i8 %x) {
72ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_1:
73ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
74ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    bst r24, 0
75ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r24
76ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    bld r24, 7
77ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
78ff75a2beSPatryk Wychowaniecstart:
79ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 1)
80ff75a2beSPatryk Wychowaniec  ret i8 %0
81ff75a2beSPatryk Wychowaniec}
82ff75a2beSPatryk Wychowaniec
83ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_3(i8 %x) {
84ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_3:
85ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
86*71d90f31SBen Shi; CHECK-NEXT:    swap r24
87*71d90f31SBen Shi; CHECK-NEXT:    lsl r24
88*71d90f31SBen Shi; CHECK-NEXT:    adc r24, r1
89ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
90ff75a2beSPatryk Wychowaniecstart:
91ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 3)
92ff75a2beSPatryk Wychowaniec  ret i8 %0
93ff75a2beSPatryk Wychowaniec}
94ff75a2beSPatryk Wychowaniec
95b1f0cb89SBen Shidefine i8 @rotr8_5(i8 %x) {
96b1f0cb89SBen Shi; CHECK-LABEL: rotr8_5:
97b1f0cb89SBen Shi; CHECK:       ; %bb.0: ; %start
98e21df829SBen Shi; CHECK-NEXT:    swap r24
99b1f0cb89SBen Shi; CHECK-NEXT:    bst r24, 0
100b1f0cb89SBen Shi; CHECK-NEXT:    ror r24
101b1f0cb89SBen Shi; CHECK-NEXT:    bld r24, 7
102b1f0cb89SBen Shi; CHECK-NEXT:    ret
103b1f0cb89SBen Shistart:
104b1f0cb89SBen Shi  %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 5)
105b1f0cb89SBen Shi  ret i8 %0
106b1f0cb89SBen Shi}
107b1f0cb89SBen Shi
108b1f0cb89SBen Shidefine i8 @rotr8_7(i8 %x) {
109b1f0cb89SBen Shi; CHECK-LABEL: rotr8_7:
110b1f0cb89SBen Shi; CHECK:       ; %bb.0: ; %start
111e21df829SBen Shi; CHECK-NEXT:    lsl r24
112e21df829SBen Shi; CHECK-NEXT:    adc r24, r1
113b1f0cb89SBen Shi; CHECK-NEXT:    ret
114b1f0cb89SBen Shistart:
115b1f0cb89SBen Shi  %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 7)
116b1f0cb89SBen Shi  ret i8 %0
117b1f0cb89SBen Shi}
118b1f0cb89SBen Shi
119ff75a2beSPatryk Wychowaniecdefine i8 @rotr8_dyn(i8 %x, i8 %y) {
120ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr8_dyn:
121ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
122ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r22, 7
123ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    dec r22
124b1f0cb89SBen Shi; CHECK-NEXT:    brmi .LBB9_2
125b1f0cb89SBen Shi; CHECK-NEXT:  .LBB9_1: ; %start
126ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
127ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    bst r24, 0
128ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r24
129ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    bld r24, 7
130ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    dec r22
131b1f0cb89SBen Shi; CHECK-NEXT:    brpl .LBB9_1
132b1f0cb89SBen Shi; CHECK-NEXT:  .LBB9_2: ; %start
133ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
134ff75a2beSPatryk Wychowaniecstart:
135ff75a2beSPatryk Wychowaniec  %0 = call i8 @llvm.fshr.i8(i8 %x, i8 %x, i8 %y)
136ff75a2beSPatryk Wychowaniec  ret i8 %0
137ff75a2beSPatryk Wychowaniec}
138ff75a2beSPatryk Wychowaniec
139ff75a2beSPatryk Wychowaniecdefine i16 @rotl16(i16 %x) {
140ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl16:
141ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
142ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r18, r24
143ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r19, r25
144ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r18
145ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r19
146ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r18
147ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r19
148ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r24, r25
149ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r24
150ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r24, 15
151ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r25
152ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r24
153ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r24
154ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r24, r18
155ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r25, r19
156ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
157ff75a2beSPatryk Wychowaniecstart:
158ff75a2beSPatryk Wychowaniec  %0 = call i16 @llvm.fshl.i16(i16 %x, i16 %x, i16 2)
159ff75a2beSPatryk Wychowaniec  ret i16 %0
160ff75a2beSPatryk Wychowaniec}
161ff75a2beSPatryk Wychowaniec
162ff75a2beSPatryk Wychowaniecdefine i16 @rotr16(i16 %x) {
163ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr16:
164ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
165ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r18, r24
166ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r19, r25
167ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r19
168ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r18
169ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r19
170ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r18
171ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r25, r24
172ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r25
173ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r25, 240
174ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r24
175ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r25
176ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r25
177ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r24, r18
178ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r25, r19
179ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
180ff75a2beSPatryk Wychowaniecstart:
181ff75a2beSPatryk Wychowaniec  %0 = call i16 @llvm.fshr.i16(i16 %x, i16 %x, i16 2)
182ff75a2beSPatryk Wychowaniec  ret i16 %0
183ff75a2beSPatryk Wychowaniec}
184ff75a2beSPatryk Wychowaniec
185ff75a2beSPatryk Wychowaniecdefine i32 @rotl32(i32 %x) {
186ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotl32:
187ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
188ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r20, r22
189ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r21, r23
190ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r20
191ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r21
192ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r20
193ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r21
194ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r18, r24
195ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r19, r25
196ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r18, r19
197ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r18
198ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r18, 15
199ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r19
200ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r18
201ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r18
202ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r18, r20
203ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r19, r21
204ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r24
205ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r25
206ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r24
207ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    rol r25
208ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r22, r23
209ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r22
210ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r22, 15
211ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r23
212ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r22
213ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r22
214ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r24, r22
215ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r25, r23
216ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r22, r18
217ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r23, r19
218ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
219ff75a2beSPatryk Wychowaniecstart:
220ff75a2beSPatryk Wychowaniec  %0 = call i32 @llvm.fshl.i32(i32 %x, i32 %x, i32 2)
221ff75a2beSPatryk Wychowaniec  ret i32 %0
222ff75a2beSPatryk Wychowaniec}
223ff75a2beSPatryk Wychowaniec
224ff75a2beSPatryk Wychowaniecdefine i32 @rotr32(i32 %x) {
225ff75a2beSPatryk Wychowaniec; CHECK-LABEL: rotr32:
226ff75a2beSPatryk Wychowaniec; CHECK:       ; %bb.0: ; %start
227ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r20, r22
228ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r21, r23
229ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r21
230ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r20
231ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r21
232ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r20
233ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r18, r24
234ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r19, r25
235ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r19, r18
236ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r19
237ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r19, 240
238ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r18
239ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r19
240ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r19
241ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r18, r20
242ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r19, r21
243ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r25
244ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r24
245ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsr r25
246ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ror r24
247ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r23, r22
248ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    swap r23
249ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    andi r23, 240
250ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    clr r22
251ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r23
252ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    lsl r23
253ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r24, r22
254ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    or r25, r23
255ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r22, r18
256ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    mov r23, r19
257ff75a2beSPatryk Wychowaniec; CHECK-NEXT:    ret
258ff75a2beSPatryk Wychowaniecstart:
259ff75a2beSPatryk Wychowaniec  %0 = call i32 @llvm.fshr.i32(i32 %x, i32 %x, i32 2)
260ff75a2beSPatryk Wychowaniec  ret i32 %0
261ff75a2beSPatryk Wychowaniec}
262ff75a2beSPatryk Wychowaniec
263ff75a2beSPatryk Wychowaniecdeclare i8 @llvm.fshl.i8(i8, i8, i8)
264ff75a2beSPatryk Wychowaniecdeclare i8 @llvm.fshr.i8(i8, i8, i8)
265ff75a2beSPatryk Wychowaniec
266ff75a2beSPatryk Wychowaniecdeclare i16 @llvm.fshl.i16(i16, i16, i16)
267ff75a2beSPatryk Wychowaniecdeclare i16 @llvm.fshr.i16(i16, i16, i16)
268ff75a2beSPatryk Wychowaniec
269ff75a2beSPatryk Wychowaniecdeclare i32 @llvm.fshl.i32(i32, i32, i32)
270ff75a2beSPatryk Wychowaniecdeclare i32 @llvm.fshr.i32(i32, i32, i32)
271