Skip to content

Commit efb1cb7

Browse files
committed
[AVR] Fix a bug in 16-bit shifts
Reviewed By: aykevl Differential Revision: https://reviews.llvm.org/D96590
1 parent 95a695b commit efb1cb7

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

llvm/lib/Target/AVR/AVRInstrInfo.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1681,7 +1681,7 @@ Defs = [SREG] in
16811681
"lslb7\t$rd",
16821682
[(set i8:$rd, (AVRlsl7 i8:$src)), (implicit SREG)]>;
16831683

1684-
def LSLW4Rd : Pseudo<(outs DREGS:$rd),
1684+
def LSLW4Rd : Pseudo<(outs DLDREGS:$rd),
16851685
(ins DREGS:$src),
16861686
"lslw4\t$rd",
16871687
[(set i16:$rd, (AVRlsl4 i16:$src)), (implicit SREG)]>;
@@ -1691,7 +1691,7 @@ Defs = [SREG] in
16911691
"lslw8\t$rd",
16921692
[(set i16:$rd, (AVRlsl8 i16:$src)), (implicit SREG)]>;
16931693

1694-
def LSLW12Rd : Pseudo<(outs DREGS:$rd),
1694+
def LSLW12Rd : Pseudo<(outs DLDREGS:$rd),
16951695
(ins DREGS:$src),
16961696
"lslw12\t$rd",
16971697
[(set i16:$rd, (AVRlsl12 i16:$src)), (implicit SREG)]>;
@@ -1713,7 +1713,7 @@ Defs = [SREG] in
17131713
"lsrw\t$rd",
17141714
[(set i16:$rd, (AVRlsr i16:$src)), (implicit SREG)]>;
17151715

1716-
def LSRW4Rd : Pseudo<(outs DREGS:$rd),
1716+
def LSRW4Rd : Pseudo<(outs DLDREGS:$rd),
17171717
(ins DREGS:$src),
17181718
"lsrw4\t$rd",
17191719
[(set i16:$rd, (AVRlsr4 i16:$src)), (implicit SREG)]>;
@@ -1723,7 +1723,7 @@ Defs = [SREG] in
17231723
"lsrw8\t$rd",
17241724
[(set i16:$rd, (AVRlsr8 i16:$src)), (implicit SREG)]>;
17251725

1726-
def LSRW12Rd : Pseudo<(outs DREGS:$rd),
1726+
def LSRW12Rd : Pseudo<(outs DLDREGS:$rd),
17271727
(ins DREGS:$src),
17281728
"lsrw12\t$rd",
17291729
[(set i16:$rd, (AVRlsr12 i16:$src)), (implicit SREG)]>;

llvm/test/CodeGen/AVR/shift.ll

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,25 @@ define i16 @lsl_i16_5(i16 %a) {
194194
ret i16 %result
195195
}
196196

197+
define i16 @lsl_i16_6(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f) {
198+
; CHECK-LABEL: lsl_i16_6
199+
; CHECK: mov r24, r14
200+
; CHECK-NEXT: mov r25, r15
201+
; CHECK-NEXT: swap r25
202+
; CHECK-NEXT: swap r24
203+
; CHECK-NEXT: andi r25, 240
204+
; CHECK-NEXT: eor r25, r24
205+
; CHECK-NEXT: andi r24, 240
206+
; CHECK-NEXT: eor r25, r24
207+
; CHECK-NEXT: lsl r24
208+
; CHECK-NEXT: rol r25
209+
; CHECK-NEXT: lsl r24
210+
; CHECK-NEXT: rol r25
211+
; CHECK-NEXT: ret
212+
%result = shl i16 %f, 6
213+
ret i16 %result
214+
}
215+
197216
define i16 @lsl_i16_9(i16 %a) {
198217
; CHECK-LABEL: lsl_i16_9
199218
; CHECK: mov r25, r24
@@ -233,6 +252,25 @@ define i16 @lsr_i16_5(i16 %a) {
233252
ret i16 %result
234253
}
235254

255+
define i16 @lsr_i16_6(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f) {
256+
; CHECK-LABEL: lsr_i16_6
257+
; CHECK: mov r24, r14
258+
; CHECK-NEXT: mov r25, r15
259+
; CHECK-NEXT: swap r25
260+
; CHECK-NEXT: swap r24
261+
; CHECK-NEXT: andi r24, 15
262+
; CHECK-NEXT: eor r24, r25
263+
; CHECK-NEXT: andi r25, 15
264+
; CHECK-NEXT: eor r24, r25
265+
; CHECK-NEXT: lsr r25
266+
; CHECK-NEXT: ror r24
267+
; CHECK-NEXT: lsr r25
268+
; CHECK-NEXT: ror r24
269+
; CHECK-NEXT: ret
270+
%result = lshr i16 %f, 6
271+
ret i16 %result
272+
}
273+
236274
define i16 @lsr_i16_9(i16 %a) {
237275
; CHECK-LABEL: lsr_i16_9
238276
; CHECK: mov r24, r25

0 commit comments

Comments
 (0)