Skip to content

Commit 5b2046c

Browse files
committed
[AVR] Disassemble register operands
Simply by implementing a few functions I was able to correctly disassemble a much larger amount of instructions. Differential Revision: https://reviews.llvm.org/D74045
1 parent daac8db commit 5b2046c

29 files changed

+215
-0
lines changed

llvm/lib/Target/AVR/Disassembler/AVRDisassembler.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,41 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAVRDisassembler() {
5757
createAVRDisassembler);
5858
}
5959

60+
static const uint16_t GPRDecoderTable[] = {
61+
AVR::R0, AVR::R1, AVR::R2, AVR::R3,
62+
AVR::R4, AVR::R5, AVR::R6, AVR::R7,
63+
AVR::R8, AVR::R9, AVR::R10, AVR::R11,
64+
AVR::R12, AVR::R13, AVR::R14, AVR::R15,
65+
AVR::R16, AVR::R17, AVR::R18, AVR::R19,
66+
AVR::R20, AVR::R21, AVR::R22, AVR::R23,
67+
AVR::R24, AVR::R25, AVR::R26, AVR::R27,
68+
AVR::R28, AVR::R29, AVR::R30, AVR::R31,
69+
};
70+
6071
static DecodeStatus DecodeGPR8RegisterClass(MCInst &Inst, unsigned RegNo,
6172
uint64_t Address, const void *Decoder) {
73+
if (RegNo > 31)
74+
return MCDisassembler::Fail;
75+
76+
unsigned Register = GPRDecoderTable[RegNo];
77+
Inst.addOperand(MCOperand::createReg(Register));
6278
return MCDisassembler::Success;
6379
}
6480

6581
static DecodeStatus DecodeLD8RegisterClass(MCInst &Inst, unsigned RegNo,
6682
uint64_t Address, const void *Decoder) {
83+
if (RegNo > 15)
84+
return MCDisassembler::Fail;
85+
86+
unsigned Register = GPRDecoderTable[RegNo+16];
87+
Inst.addOperand(MCOperand::createReg(Register));
6788
return MCDisassembler::Success;
6889
}
6990

7091
static DecodeStatus DecodePTRREGSRegisterClass(MCInst &Inst, unsigned RegNo,
7192
uint64_t Address, const void *Decoder) {
93+
// Note: this function must be defined but does not seem to be called.
94+
assert(false && "unimplemented: PTRREGS register class");
7295
return MCDisassembler::Success;
7396
}
7497

llvm/test/MC/AVR/inst-adc.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: adc r15, r0 ; encoding: [0xf0,0x1c]
1314
; CHECK: adc r16, r31 ; encoding: [0x0f,0x1f]
1415
; CHECK: adc r31, r16 ; encoding: [0xf0,0x1f]
16+
17+
; CHECK-INST: adc r0, r15
18+
; CHECK-INST: adc r15, r0
19+
; CHECK-INST: adc r16, r31
20+
; CHECK-INST: adc r31, r16

llvm/test/MC/AVR/inst-add.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: add r15, r0 ; encoding: [0xf0,0x0c]
1314
; CHECK: add r16, r31 ; encoding: [0x0f,0x0f]
1415
; CHECK: add r31, r16 ; encoding: [0xf0,0x0f]
16+
17+
; CHECK-INST: add r0, r15
18+
; CHECK-INST: add r15, r0
19+
; CHECK-INST: add r16, r31
20+
; CHECK-INST: add r31, r16

llvm/test/MC/AVR/inst-adiw.s

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -mattr=addsubiw -show-encoding < %s | FileCheck %s
2+
; RUNx: llvm-mc -filetype=obj -triple avr -mattr=addsubiw < %s | llvm-objdump -d -mattr=addsubiw - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -25,3 +26,14 @@ foo:
2526

2627
; CHECK: adiw r24, SYMBOL ; encoding: [0b00AAAAAA,0x96]
2728
; fixup A - offset: 0, value: SYMBOL, kind: fixup_6_adiw
29+
30+
; CHECK-INST: adiw r26, 12
31+
; CHECK-INST: adiw r26, 63
32+
33+
; CHECK-INST: adiw r28, 17
34+
; CHECK-INST: adiw r28, 0
35+
36+
; CHECK-INST: adiw r30, 63
37+
; CHECK-INST: adiw r30, 3
38+
39+
; CHECK-INST: adiw r24, 0

llvm/test/MC/AVR/inst-and.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: and r15, r0 ; encoding: [0xf0,0x20]
1314
; CHECK: and r16, r31 ; encoding: [0x0f,0x23]
1415
; CHECK: and r31, r16 ; encoding: [0xf0,0x23]
16+
17+
; CHECK-INST: and r0, r15
18+
; CHECK-INST: and r15, r0
19+
; CHECK-INST: and r16, r31
20+
; CHECK-INST: and r31, r16

llvm/test/MC/AVR/inst-andi.s

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -17,3 +18,10 @@ foo:
1718

1819
; CHECK: andi r20, BAR ; encoding: [0x40'A',0x70]
1920
; CHECK: ; fixup A - offset: 0, value: BAR, kind: fixup_ldi
21+
22+
; CHECK-INST: andi r16, 255
23+
; CHECK-INST: andi r29, 190
24+
; CHECK-INST: andi r22, 172
25+
; CHECK-INST: andi r27, 92
26+
27+
; CHECK-INST: andi r20, 0

llvm/test/MC/AVR/inst-bld.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: bld r1, 1 ; encoding: [0x11,0xf8]
1314
; CHECK: bld r0, 0 ; encoding: [0x00,0xf8]
1415
; CHECK: bld r7, 2 ; encoding: [0x72,0xf8]
16+
17+
; CHECK-INST: bld r3, 5
18+
; CHECK-INST: bld r1, 1
19+
; CHECK-INST: bld r0, 0
20+
; CHECK-INST: bld r7, 2

llvm/test/MC/AVR/inst-bst.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: bst r1, 1 ; encoding: [0x11,0xfa]
1314
; CHECK: bst r0, 0 ; encoding: [0x00,0xfa]
1415
; CHECK: bst r7, 2 ; encoding: [0x72,0xfa]
16+
17+
; CHECK-INST: bst r3, 5
18+
; CHECK-INST: bst r1, 1
19+
; CHECK-INST: bst r0, 0
20+
; CHECK-INST: bst r7, 2

llvm/test/MC/AVR/inst-cbr.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: andi r24, -191 ; encoding: [0x81,0x74]
1314
; CHECK: andi r20, -174 ; encoding: [0x42,0x75]
1415
; CHECK: andi r31, -1 ; encoding: [0xff,0x7f]
16+
17+
; CHECK-INST: andi r17, 47
18+
; CHECK-INST: andi r24, 65
19+
; CHECK-INST: andi r20, 82
20+
; CHECK-INST: andi r31, 255

llvm/test/MC/AVR/inst-clr.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -13,3 +14,7 @@ foo:
1314
; CHECK: clr r5 ; encoding: [0x55,0x24]
1415
; CHECK: clr r0 ; encoding: [0x00,0x24]
1516

17+
; CHECK-INST: clr r2
18+
; CHECK-INST: clr r12
19+
; CHECK-INST: clr r5
20+
; CHECK-INST: clr r0

llvm/test/MC/AVR/inst-cp.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: cp r19, r0 ; encoding: [0x30,0x15]
1314
; CHECK: cp r15, r31 ; encoding: [0xff,0x16]
1415
; CHECK: cp r0, r0 ; encoding: [0x00,0x14]
16+
17+
; CHECK-INST: cp r12, r2
18+
; CHECK-INST: cp r19, r0
19+
; CHECK-INST: cp r15, r31
20+
; CHECK-INST: cp r0, r0

llvm/test/MC/AVR/inst-cpc.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: cp r20, r0 ; encoding: [0x40,0x15]
1314
; CHECK: cp r10, r31 ; encoding: [0xaf,0x16]
1415
; CHECK: cp r0, r0 ; encoding: [0x00,0x14]
16+
17+
; CHECK-INST: cp r13, r12
18+
; CHECK-INST: cp r20, r0
19+
; CHECK-INST: cp r10, r31
20+
; CHECK-INST: cp r0, r0

llvm/test/MC/AVR/inst-cpi.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -18,3 +19,8 @@ foo:
1819
; CHECK: cpi r21, ear ; encoding: [0x50'A',0x30]
1920
; CHECK: ; fixup A - offset: 0, value: ear, kind: fixup_ldi
2021

22+
; CHECK-INST: cpi r16, 241
23+
; CHECK-INST: cpi r29, 190
24+
; CHECK-INST: cpi r22, 172
25+
; CHECK-INST: cpi r27, 92
26+
; CHECK-INST: cpi r21, 0

llvm/test/MC/AVR/inst-cpse.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: cpse r9, r0 ; encoding: [0x90,0x10]
1314
; CHECK: cpse r5, r31 ; encoding: [0x5f,0x12]
1415
; CHECK: cpse r3, r3 ; encoding: [0x33,0x10]
16+
17+
; CHECK-INST: cpse r2, r13
18+
; CHECK-INST: cpse r9, r0
19+
; CHECK-INST: cpse r5, r31
20+
; CHECK-INST: cpse r3, r3

llvm/test/MC/AVR/inst-eor.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: eor r15, r0 ; encoding: [0xf0,0x24]
1314
; CHECK: eor r16, r31 ; encoding: [0x0f,0x27]
1415
; CHECK: eor r31, r16 ; encoding: [0xf0,0x27]
16+
17+
; CHECK-INST: eor r0, r15
18+
; CHECK-INST: eor r15, r0
19+
; CHECK-INST: eor r16, r31
20+
; CHECK-INST: eor r31, r16

llvm/test/MC/AVR/inst-ldi.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr -mattr=sram < %s | llvm-objdump -d -mattr=sram - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -15,3 +16,9 @@ foo:
1516

1617
; CHECK: ldi r21, SYMBOL+3 ; encoding: [0x50'A',0xe0]
1718
; CHECK: ; fixup A - offset: 0, value: SYMBOL+3, kind: fixup_ldi
19+
20+
; CHECK-INST: ldi r16, 241
21+
; CHECK-INST: ldi r29, 190
22+
; CHECK-INST: ldi r22, 172
23+
; CHECK-INST: ldi r27, 92
24+
; CHECK-INST: ldi r21, 0

llvm/test/MC/AVR/inst-lsl.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: lsl r25 ; encoding: [0x99,0x0f]
1314
; CHECK: lsl r5 ; encoding: [0x55,0x0c]
1415
; CHECK: lsl r0 ; encoding: [0x00,0x0c]
16+
17+
; CHECK-INST: lsl r31
18+
; CHECK-INST: lsl r25
19+
; CHECK-INST: lsl r5
20+
; CHECK-INST: lsl r0

llvm/test/MC/AVR/inst-mov.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: mov r9, r0 ; encoding: [0x90,0x2c]
1314
; CHECK: mov r5, r31 ; encoding: [0x5f,0x2e]
1415
; CHECK: mov r3, r3 ; encoding: [0x33,0x2c]
16+
17+
; CHECK-INST: mov r2, r13
18+
; CHECK-INST: mov r9, r0
19+
; CHECK-INST: mov r5, r31
20+
; CHECK-INST: mov r3, r3

llvm/test/MC/AVR/inst-or.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -11,3 +12,8 @@ foo:
1112
; CHECK: or r15, r0 ; encoding: [0xf0,0x28]
1213
; CHECK: or r16, r31 ; encoding: [0x0f,0x2b]
1314
; CHECK: or r31, r16 ; encoding: [0xf0,0x2b]
15+
16+
; CHECK-INST: or r0, r15
17+
; CHECK-INST: or r15, r0
18+
; CHECK-INST: or r16, r31
19+
; CHECK-INST: or r31, r16

llvm/test/MC/AVR/inst-ori.s

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -17,3 +18,10 @@ foo:
1718

1819
; CHECK: ori r16, FOOBAR ; encoding: [A,0x60]
1920
; CHECK: ; fixup A - offset: 0, value: FOOBAR, kind: fixup_ldi
21+
22+
; CHECK-INST: ori r17, 208
23+
; CHECK-INST: ori r24, 190
24+
; CHECK-INST: ori r20, 173
25+
; CHECK-INST: ori r31, 0
26+
27+
; CHECK-INST: ori r16, 0

llvm/test/MC/AVR/inst-rol.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: rol r25 ; encoding: [0x99,0x1f]
1314
; CHECK: rol r5 ; encoding: [0x55,0x1c]
1415
; CHECK: rol r0 ; encoding: [0x00,0x1c]
16+
17+
; CHECK-INST: rol r31
18+
; CHECK-INST: rol r25
19+
; CHECK-INST: rol r5
20+
; CHECK-INST: rol r0

llvm/test/MC/AVR/inst-sbc.s

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -12,3 +13,8 @@ foo:
1213
; CHECK: sbc r15, r0 ; encoding: [0xf0,0x08]
1314
; CHECK: sbc r16, r31 ; encoding: [0x0f,0x0b]
1415
; CHECK: sbc r31, r16 ; encoding: [0xf0,0x0b]
16+
17+
; CHECK-INST: sbc r0, r15
18+
; CHECK-INST: sbc r15, r0
19+
; CHECK-INST: sbc r16, r31
20+
; CHECK-INST: sbc r31, r16

llvm/test/MC/AVR/inst-sbci.s

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: llvm-mc -triple avr -show-encoding < %s | FileCheck %s
2+
; RUN: llvm-mc -filetype=obj -triple avr < %s | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s
23

34

45
foo:
@@ -16,3 +17,9 @@ foo:
1617

1718
; CHECK: sbci r22, FOO ; encoding: [0x60'A',0x40]
1819
; CHECK: ; fixup A - offset: 0, value: FOO, kind: fixup_ldi
20+
21+
; CHECK-INST: sbci r17, 21
22+
; CHECK-INST: sbci r23, 196
23+
; CHECK-INST: sbci r30, 244
24+
; CHECK-INST: sbci r19, 16
25+
; CHECK-INST: sbci r22, 0

0 commit comments

Comments
 (0)