Skip to content

Commit 373a019

Browse files
committed
[AVR] Add PUSH/POP disassembly
1 parent 5abd1ca commit 373a019

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,17 +383,31 @@ static DecodeStatus decodeLoadStore(MCInst &Inst, unsigned Insn,
383383
if ((Insn & 0xfc00) != 0x9000 || (Insn & 0xf) == 0)
384384
return MCDisassembler::Fail;
385385

386-
// ELPM Rd,Z(+)
386+
// ELPM Rd,Z(+) and POP
387387
if ((Insn & 0xfe00) == 0x9000) {
388388
switch (Insn & 0xf) {
389+
case 0xF:
390+
Inst.setOpcode(AVR::POPRd);
391+
Inst.addOperand(MCOperand::createReg(RegVal));
392+
return MCDisassembler::Success;
389393
case 0x6:
394+
Inst.setOpcode(AVR::ELPMRdZ);
395+
Inst.addOperand(MCOperand::createReg(RegVal));
396+
return MCDisassembler::Success;
390397
case 0x7:
391-
Inst.setOpcode((Insn & 0xf) == 6 ? AVR::ELPMRdZ : AVR::ELPMRdZPi);
398+
Inst.setOpcode(AVR::ELPMRdZPi);
392399
Inst.addOperand(MCOperand::createReg(RegVal));
393400
return MCDisassembler::Success;
394401
}
395402
}
396403

404+
// PUSH
405+
if ((Insn & 0xfe0f) == 0x920f) {
406+
Inst.setOpcode(AVR::PUSHRr);
407+
Inst.addOperand(MCOperand::createReg(RegVal));
408+
return MCDisassembler::Success;
409+
}
410+
397411
// Get the base address register.
398412
unsigned RegBase;
399413
switch (Insn & 0xc) {

0 commit comments

Comments
 (0)