@@ -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