mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
ARM64: Improve diagnostics for malformed reg+reg addressing mode.
Make sure only general purpose registers are valid for offset regs and that 32-bit regs are only valid for sxtw and uxtw extends. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206799 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1416,7 +1416,7 @@ public:
|
||||
assert(N == 3 && "Invalid number of operands!");
|
||||
|
||||
Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
|
||||
Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
|
||||
Inst.addOperand(MCOperand::CreateReg(getXRegFromWReg(Mem.OffsetRegNum)));
|
||||
unsigned ExtendImm = ARM64_AM::getMemExtendImm(Mem.ExtType, DoShift);
|
||||
Inst.addOperand(MCOperand::CreateImm(ExtendImm));
|
||||
}
|
||||
@@ -2894,6 +2894,17 @@ bool ARM64AsmParser::parseMemory(OperandVector &Operands) {
|
||||
|
||||
Parser.Lex(); // Eat the extend op.
|
||||
|
||||
// A 32-bit offset register is only valid for [SU]/XTW extend
|
||||
// operators.
|
||||
if (isGPR32Register(Reg2)) {
|
||||
if (ExtOp != ARM64_AM::UXTW &&
|
||||
ExtOp != ARM64_AM::SXTW)
|
||||
return Error(ExtLoc, "32-bit general purpose offset register "
|
||||
"requires sxtw or uxtw extend");
|
||||
} else if (!isGPR64Register(Reg2))
|
||||
return Error(OffsetLoc,
|
||||
"64-bit general purpose offset register expected");
|
||||
|
||||
bool Hash = getLexer().is(AsmToken::Hash);
|
||||
if (getLexer().is(AsmToken::RBrac)) {
|
||||
// No immediate operand.
|
||||
|
Reference in New Issue
Block a user