[llvm] r191678 - [ARM] Assembler: ARM LDRD with writeback requires the base register to be different from the destination registers.
Quentin Colombet
qcolombet at apple.com
Mon Sep 30 09:23:50 PDT 2013
Hi Tilmann,
Would it be difficult to turn greps into FileCheck patterns?
I think it would also help to figure out which instruction is causing which error.
Thanks,
-Quentin
On Sep 30, 2013, at 9:11 AM, Tilmann Scheller <tilmann.scheller at googlemail.com> wrote:
> Author: tilmann
> Date: Mon Sep 30 11:11:48 2013
> New Revision: 191678
>
> URL: http://llvm.org/viewvc/llvm-project?rev=191678&view=rev
> Log:
> [ARM] Assembler: ARM LDRD with writeback requires the base register to be different from the destination registers.
>
> See ARM ARM A8.8.72.
>
> Violating this constraint results in unpredictable behavior.
>
>
> Modified:
> llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> llvm/trunk/test/MC/ARM/arm-ldrd.s
>
> Modified: llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp?rev=191678&r1=191677&r2=191678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Mon Sep 30 11:11:48 2013
> @@ -5343,25 +5343,40 @@ validateInstruction(MCInst &Inst,
> Inst.getOpcode() != ARM::t2Bcc)
> return Error(Loc, "predicated instructions must be in IT block");
>
> - switch (Inst.getOpcode()) {
> + const unsigned Opcode = Inst.getOpcode();
> + switch (Opcode) {
> case ARM::LDRD:
> case ARM::LDRD_PRE:
> case ARM::LDRD_POST: {
> - unsigned RtReg = Inst.getOperand(0).getReg();
> + const unsigned RtReg = Inst.getOperand(0).getReg();
> +
> // Rt can't be R14.
> if (RtReg == ARM::LR)
> return Error(Operands[3]->getStartLoc(),
> "Rt can't be R14");
> - unsigned Rt = MRI->getEncodingValue(RtReg);
> +
> + const unsigned Rt = MRI->getEncodingValue(RtReg);
> // Rt must be even-numbered.
> if ((Rt & 1) == 1)
> return Error(Operands[3]->getStartLoc(),
> "Rt must be even-numbered");
> +
> // Rt2 must be Rt + 1.
> - unsigned Rt2 = MRI->getEncodingValue(Inst.getOperand(1).getReg());
> + const unsigned Rt2 = MRI->getEncodingValue(Inst.getOperand(1).getReg());
> if (Rt2 != Rt + 1)
> return Error(Operands[3]->getStartLoc(),
> "destination operands must be sequential");
> +
> + if (Opcode == ARM::LDRD_PRE || Opcode == ARM::LDRD_POST) {
> + const unsigned Rn = MRI->getEncodingValue(Inst.getOperand(3).getReg());
> + // For addressing modes with writeback, the base register needs to be
> + // different from the destination registers.
> + if (Rn == Rt || Rn == Rt2)
> + return Error(Operands[3]->getStartLoc(),
> + "base register needs to be different from destination "
> + "registers");
> + }
> +
> return false;
> }
> case ARM::t2LDRDi8:
>
> Modified: llvm/trunk/test/MC/ARM/arm-ldrd.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/arm-ldrd.s?rev=191678&r1=191677&r2=191678&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/arm-ldrd.s (original)
> +++ llvm/trunk/test/MC/ARM/arm-ldrd.s Mon Sep 30 11:11:48 2013
> @@ -3,6 +3,7 @@
> // RUN: grep "error: Rt must be even-numbered" %t | count 7
> // RUN: grep "error: Rt can't be R14" %t | count 7
> // RUN: grep "error: destination operands must be sequential" %t | count 7
> +// RUN: grep "error: base register needs to be different from destination registers" %t | count 4
> // rdar://14479793
>
> ldrd r1, r2, [pc, #0]
> @@ -26,3 +27,8 @@ ldrd r0, r3, [r4, r5]
> ldrd r1, r2, [r3], r4
> ldrd lr, pc, [r3], r4
> ldrd r0, r3, [r4], r5
> +
> +ldrd r0, r1, [r0], #4
> +ldrd r0, r1, [r1], #4
> +ldrd r0, r1, [r0, #4]!
> +ldrd r0, r1, [r1, #4]!
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130930/7abc1a4f/attachment.html>
More information about the llvm-commits
mailing list