Thumb MUL assembly parsing for 3-operand form.

Get the source register that isn't tied to the destination register correct,
even when the assembly source operand order is backwards.

rdar://10428630

llvm-svn: 144322
This commit is contained in:
Jim Grosbach 2011-11-10 22:10:12 +00:00
parent 085f6f2af1
commit 5a5ce63742
2 changed files with 11 additions and 7 deletions

View File

@ -3415,13 +3415,15 @@ cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
}
((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1);
((ARMOperand*)Operands[4])->addRegOperands(Inst, 1);
// If we have a three-operand form, use that, else the second source operand
// is just the destination operand again.
if (Operands.size() == 6)
((ARMOperand*)Operands[5])->addRegOperands(Inst, 1);
else
Inst.addOperand(Inst.getOperand(0));
// If we have a three-operand form, make sure to set Rn to be the operand
// that isn't the same as Rd.
unsigned RegOp = 4;
if (Operands.size() == 6 &&
((ARMOperand*)Operands[4])->getReg() ==
((ARMOperand*)Operands[3])->getReg())
RegOp = 5;
((ARMOperand*)Operands[RegOp])->addRegOperands(Inst, 1);
Inst.addOperand(Inst.getOperand(0));
((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2);
return true;

View File

@ -372,9 +372,11 @@ _func:
@ MUL
@------------------------------------------------------------------------------
muls r1, r2, r1
muls r2, r2, r3
muls r3, r4
@ CHECK: muls r1, r2, r1 @ encoding: [0x51,0x43]
@ CHECK: muls r2, r3, r2 @ encoding: [0x5a,0x43]
@ CHECK: muls r3, r4, r3 @ encoding: [0x63,0x43]