@@ -7343,34 +7343,46 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
7343
7343
// automatically
7344
7344
// expressed as a GPRPair, so we have to manually merge them.
7345
7345
// FIXME: We would really like to be able to tablegen'erate this.
7346
- if (!isThumb () && Operands.size () > MnemonicOpsEndInd + 1 &&
7346
+ bool IsLoad = (Mnemonic == " ldrexd" || Mnemonic == " ldaexd" );
7347
+ if (!isThumb () && Operands.size () > MnemonicOpsEndInd + 1 + (!IsLoad) &&
7347
7348
(Mnemonic == " ldrexd" || Mnemonic == " strexd" || Mnemonic == " ldaexd" ||
7348
7349
Mnemonic == " stlexd" )) {
7349
- bool isLoad = (Mnemonic == " ldrexd" || Mnemonic == " ldaexd" );
7350
- unsigned Idx = isLoad ? MnemonicOpsEndInd : MnemonicOpsEndInd + 1 ;
7350
+ unsigned Idx = IsLoad ? MnemonicOpsEndInd : MnemonicOpsEndInd + 1 ;
7351
7351
ARMOperand &Op1 = static_cast <ARMOperand &>(*Operands[Idx]);
7352
7352
ARMOperand &Op2 = static_cast <ARMOperand &>(*Operands[Idx + 1 ]);
7353
7353
7354
7354
const MCRegisterClass &MRC = MRI->getRegClass (ARM::GPRRegClassID);
7355
- // Adjust only if Op1 and Op2 are GPRs.
7356
- if ( Op1. isReg () && Op2. isReg () && MRC. contains (Op1. getReg ()) &&
7357
- MRC.contains (Op2 .getReg ())) {
7355
+ bool IsGNUAlias = !( Op2. isReg () && MRC. contains (Op2. getReg ()));
7356
+ // Adjust only if Op1 is a GPR.
7357
+ if (Op1. isReg () && MRC.contains (Op1 .getReg ())) {
7358
7358
unsigned Reg1 = Op1.getReg ();
7359
- unsigned Reg2 = Op2.getReg ();
7360
7359
unsigned Rt = MRI->getEncodingValue (Reg1);
7361
- unsigned Rt2 = MRI->getEncodingValue (Reg2);
7362
7360
7363
- // Rt2 must be Rt + 1 and Rt must be even.
7364
- if (Rt + 1 != Rt2 || (Rt & 1 )) {
7365
- return Error (Op2.getStartLoc (),
7366
- isLoad ? " destination operands must be sequential"
7367
- : " source operands must be sequential" );
7361
+ // Check we are not in the GNU alias case with only one of the register
7362
+ // pair specified
7363
+ if (!IsGNUAlias) {
7364
+ unsigned Reg2 = Op2.getReg ();
7365
+ unsigned Rt2 = MRI->getEncodingValue (Reg2);
7366
+ // Rt2 must be Rt + 1.
7367
+ if (Rt + 1 != Rt2)
7368
+ return Error (Op2.getStartLoc (),
7369
+ IsLoad ? " destination operands must be sequential"
7370
+ : " source operands must be sequential" );
7368
7371
}
7372
+ // Rt bust be even
7373
+ if (Rt & 1 )
7374
+ return Error (
7375
+ Op1.getStartLoc (),
7376
+ IsLoad ? " destination operands must start start at an even register"
7377
+ : " source operands must start start at an even register" );
7378
+
7369
7379
unsigned NewReg = MRI->getMatchingSuperReg (
7370
7380
Reg1, ARM::gsub_0, &(MRI->getRegClass (ARM::GPRPairRegClassID)));
7371
7381
Operands[Idx] =
7372
7382
ARMOperand::CreateReg (NewReg, Op1.getStartLoc (), Op2.getEndLoc ());
7373
- Operands.erase (Operands.begin () + Idx + 1 );
7383
+ // Only remove redundent operand if not in GNU alias case
7384
+ if (!IsGNUAlias)
7385
+ Operands.erase (Operands.begin () + Idx + 1 );
7374
7386
}
7375
7387
}
7376
7388
0 commit comments