Commit 3f1fa3d5 authored by Stepan Dyatkovskiy's avatar Stepan Dyatkovskiy
Browse files

Fix for PR18921 (LDRD/STRD part)::

Removed "GNU Assembler extension (compatibility)" definitions from ARMInstrInfo.td
Fixed ARMAsmParser::ParseInstruction GNU compatability branch, so it also works for thumb mode from now.
Added new tests.

llvm-svn: 205622
parent a25ac912
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -2282,12 +2282,6 @@ let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
  def LDRD : AI3ld<0b1101, 0, (outs GPR:$Rt, GPR:$Rt2), (ins addrmode3:$addr),
                   LdMiscFrm, IIC_iLoad_d_r, "ldrd", "\t$Rt, $Rt2, $addr", []>,
             Requires<[IsARM, HasV5TE]>;

  // GNU Assembler extension (compatibility)
  let isAsmParserOnly = 1 in
    def LDRD_PAIR : AI3ld<0b1101, 0, (outs GPRPairOp:$Rt), (ins addrmode3:$addr),
                          LdMiscFrm, IIC_iLoad_d_r, "ldrd", "\t$Rt, $addr", []>,
                    Requires<[IsARM, HasV5TE]>;
}

def LDA : AIldracq<0b00, (outs GPR:$Rt), (ins addr_offset_none:$addr),
@@ -2557,14 +2551,6 @@ let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
             Requires<[IsARM, HasV5TE]> {
    let Inst{21} = 0;
  }

  // GNU Assembler extension (compatibility)
  let isAsmParserOnly = 1 in
    def STRD_PAIR : AI3str<0b1111, (outs), (ins GPRPairOp:$Rt, addrmode3:$addr),
                           StMiscFrm, IIC_iStore_d_r, "strd", "\t$Rt, $addr", []>,
                    Requires<[IsARM, HasV5TE]> {
      let Inst{21} = 0;
    }
}

// Indexed stores
+14 −11
Original line number Diff line number Diff line
@@ -5404,21 +5404,24 @@ bool ARMAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
  }

  // GNU Assembler extension (compatibility)
  if ((Mnemonic == "ldrd" || Mnemonic == "strd") && !isThumb() &&
      Operands.size() == 4) {
    ARMOperand *Op = static_cast<ARMOperand *>(Operands[2]);
    assert(Op->isReg() && "expected register argument");
  if ((Mnemonic == "ldrd" || Mnemonic == "strd")) {
    ARMOperand *Op2 = static_cast<ARMOperand *>(Operands[2]);
    ARMOperand *Op3 = static_cast<ARMOperand *>(Operands[3]);
    if (Op3->isMem()) {
      assert(Op2->isReg() && "expected register argument");

      unsigned SuperReg = MRI->getMatchingSuperReg(
        Op->getReg(), ARM::gsub_0, &MRI->getRegClass(ARM::GPRPairRegClassID));
          Op2->getReg(), ARM::gsub_0, &MRI->getRegClass(ARM::GPRPairRegClassID));

      assert(SuperReg && "expected register pair");

      unsigned PairedReg = MRI->getSubReg(SuperReg, ARM::gsub_1);

      Operands.insert(Operands.begin() + 3,
                    ARMOperand::CreateReg(PairedReg, Op->getStartLoc(),
                                          Op->getEndLoc()));
                      ARMOperand::CreateReg(PairedReg,
                                            Op2->getStartLoc(),
                                            Op2->getEndLoc()));
    }
  }

  // FIXME: As said above, this is all a pretty gross hack.  This instruction
+9 −0
Original line number Diff line number Diff line
@ RUN: not llvm-mc -triple=armv7-linux-gnueabi %s 2>&1 | FileCheck %s
.text
@ CHECK: error: instruction requires: thumb2
@ CHECK:         ldrd    r0, [r0, #512]
        ldrd    r0, [r0, #512]

@ CHECK: error: instruction requires: thumb2
@ CHECK:         strd    r0, [r0, #512]
        strd    r0, [r0, #512]
+20 −0
Original line number Diff line number Diff line
@ PR18921
@ RUN: llvm-mc -triple=armv7-linux-gnueabi -show-encoding < %s | FileCheck %s
.text

@ CHECK-NOT: .code	16


@ CHECK: ldrd	r0, r1, [r10, #32]!     @ encoding: [0xd0,0x02,0xea,0xe1]
@ CHECK: ldrd	r0, r1, [r10], #32      @ encoding: [0xd0,0x02,0xca,0xe0]
@ CHECK: ldrd	r0, r1, [r10, #32]      @ encoding: [0xd0,0x02,0xca,0xe1]
        ldrd    r0, [r10, #32]!
        ldrd    r0, [r10], #32
        ldrd    r0, [r10, #32]

@ CHECK: strd	r0, r1, [r10, #32]!     @ encoding: [0xf0,0x02,0xea,0xe1]
@ CHECK: strd	r0, r1, [r10], #32      @ encoding: [0xf0,0x02,0xca,0xe0]
@ CHECK: strd	r0, r1, [r10, #32]      @ encoding: [0xf0,0x02,0xca,0xe1]
        strd    r0, [r10, #32]!
        strd    r0, [r10], #32
        strd    r0, [r10, #32]
+10 −0
Original line number Diff line number Diff line
@ RUN: not llvm-mc -triple=armv7-linux-gnueabi %s 2>&1 | FileCheck %s
.text
.thumb
@ CHECK: error: invalid operand for instruction
@ CHECK:         ldrd    r12, [r0, #512]
        ldrd    r12, [r0, #512]

@ CHECK: error: invalid operand for instruction
@ CHECK:         strd    r12, [r0, #512]
        strd    r12, [r0, #512]
Loading