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