Skip to content

Commit 9a3a6d1

Browse files
committed
[AVR] Add LPM disassembly
1 parent 373a019 commit 9a3a6d1

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,19 @@ static DecodeStatus decodeLoadStore(MCInst &Inst, unsigned Insn,
371371
// LD Rd, Z+ : 1001 000d dddd 0001
372372
// LD Rd, -Z : 1001 000d dddd 0010
373373
//
374+
// and 3 LPM instructions
375+
// LPM Rd,Z : 1001 000d dddd 0100
376+
// LPM Rd,Z+: 1001 000d dddd 0101
377+
// LPM R0,Z : 1001 0101 1100 1000
378+
//
374379
// and 3 ELPM instructions
375380
// ELPM Rd,Z : 1001 000d dddd 0110
376381
// ELPM Rd,Z+: 1001 000d dddd 0111
377382
// ELPM R0,Z : 1001 0101 1101 1000
383+
if (Insn == 0x95c8) {
384+
Inst.setOpcode(AVR::LPM);
385+
return MCDisassembler::Success;
386+
}
378387
if (Insn == 0x95d8) {
379388
Inst.setOpcode(AVR::ELPM);
380389
return MCDisassembler::Success;
@@ -383,11 +392,15 @@ static DecodeStatus decodeLoadStore(MCInst &Inst, unsigned Insn,
383392
if ((Insn & 0xfc00) != 0x9000 || (Insn & 0xf) == 0)
384393
return MCDisassembler::Fail;
385394

386-
// ELPM Rd,Z(+) and POP
395+
// (E)LPM Rd,Z(+) and POP
387396
if ((Insn & 0xfe00) == 0x9000) {
388397
switch (Insn & 0xf) {
389-
case 0xF:
390-
Inst.setOpcode(AVR::POPRd);
398+
case 0x4:
399+
Inst.setOpcode(AVR::LPMRdZ);
400+
Inst.addOperand(MCOperand::createReg(RegVal));
401+
return MCDisassembler::Success;
402+
case 0x5:
403+
Inst.setOpcode(AVR::LPMRdZPi);
391404
Inst.addOperand(MCOperand::createReg(RegVal));
392405
return MCDisassembler::Success;
393406
case 0x6:
@@ -398,6 +411,10 @@ static DecodeStatus decodeLoadStore(MCInst &Inst, unsigned Insn,
398411
Inst.setOpcode(AVR::ELPMRdZPi);
399412
Inst.addOperand(MCOperand::createReg(RegVal));
400413
return MCDisassembler::Success;
414+
case 0xF:
415+
Inst.setOpcode(AVR::POPRd);
416+
Inst.addOperand(MCOperand::createReg(RegVal));
417+
return MCDisassembler::Success;
401418
}
402419
}
403420

0 commit comments

Comments
 (0)