1; RUN: llc < %s -march=avr | FileCheck %s
2
3; Bit rotation tests.
4
5; CHECK-LABEL: rol8:
6define i8 @rol8(i8 %val, i8 %amt) {
7  ; CHECK:      andi r22, 7
8
9  ; CHECK-NEXT: cpi r22, 0
10  ; CHECK-NEXT: breq LBB0_2
11
12; CHECK-NEXT: LBB0_1:
13  ; CHECK-NEXT: lsl r24
14  ; CHECK-NEXT: adc r24, r1
15  ; CHECK-NEXT: subi r22, 1
16  ; CHECK-NEXT: brne LBB0_1
17
18; CHECK-NEXT:LBB0_2:
19  ; CHECK-NEXT: ret
20  %mod = urem i8 %amt, 8
21
22  %inv = sub i8 8, %mod
23  %parta = shl i8 %val, %mod
24  %partb = lshr i8 %val, %inv
25
26  %rotl = or i8 %parta, %partb
27
28  ret i8 %rotl
29}
30
31
32; CHECK-LABEL: ror8:
33define i8 @ror8(i8 %val, i8 %amt) {
34  ; CHECK:      andi r22, 7
35
36  ; CHECK-NEXT: cpi r22, 0
37  ; CHECK-NEXT: breq LBB1_2
38
39; CHECK-NEXT: LBB1_1:
40  ; CHECK-NEXT: lsr r24
41  ; CHECK-NEXT: ldi r0, 0
42  ; CHECK-NEXT: ror r0
43  ; CHECK-NEXT: or r24, r0
44  ; CHECK-NEXT: subi r22, 1
45  ; CHECK-NEXT: brne LBB1_1
46
47; CHECK-NEXT:LBB1_2:
48  ; CHECK-NEXT: ret
49  %mod = urem i8 %amt, 8
50
51  %inv = sub i8 8, %mod
52  %parta = lshr i8 %val, %mod
53  %partb = shl i8 %val, %inv
54
55  %rotr = or i8 %parta, %partb
56
57  ret i8 %rotr
58}
59
60