From: Tilmann Scheller Date: Fri, 1 Aug 2014 11:33:47 +0000 (+0000) Subject: [ARM] Make the assembler reject unpredictable pre/post-indexed ARM LDRH/LDRSH instruc... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9bd0d2a6a02750f51633ea20394c37a9c5457eaa;p=oota-llvm.git [ARM] Make the assembler reject unpredictable pre/post-indexed ARM LDRH/LDRSH instructions. The ARM ARM prohibits LDRH/LDRSH instructions with writeback into the source register. With this commit this constraint is now enforced and we stop assembling LDRH/LDRSH instructions with unpredictable behavior. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214499 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 9a2745bec00..d0cd04b66d5 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -5750,7 +5750,11 @@ bool ARMAsmParser::validateInstruction(MCInst &Inst, case ARM::LDR_PRE_IMM: case ARM::LDR_PRE_REG: case ARM::LDR_POST_IMM: - case ARM::LDR_POST_REG: { + case ARM::LDR_POST_REG: + case ARM::LDRH_PRE: + case ARM::LDRH_POST: + case ARM::LDRSH_PRE: + case ARM::LDRSH_POST: { // Rt must be different from Rn. const unsigned Rt = MRI->getEncodingValue(Inst.getOperand(0).getReg()); const unsigned Rn = MRI->getEncodingValue(Inst.getOperand(2).getReg()); diff --git a/test/MC/ARM/diagnostics.s b/test/MC/ARM/diagnostics.s index b2ba184c746..9bfd8c7fec0 100644 --- a/test/MC/ARM/diagnostics.s +++ b/test/MC/ARM/diagnostics.s @@ -545,6 +545,14 @@ foo2: ldr r0, [r0, r1]! ldr r0, [r0], #4 ldr r0, [r0], r1 + ldrh r0, [r0, #2]! + ldrh r0, [r0, r1]! + ldrh r0, [r0], #2 + ldrh r0, [r0], r1 + ldrsh r0, [r0, #2]! + ldrsh r0, [r0, r1]! + ldrsh r0, [r0], #2 + ldrsh r0, [r0], r1 @ CHECK-ERRORS: error: destination register and base register can't be identical @ CHECK-ERRORS: ldr r0, [r0, #4]! @ CHECK-ERRORS: ^ @@ -557,3 +565,27 @@ foo2: @ CHECK-ERRORS: error: destination register and base register can't be identical @ CHECK-ERRORS: ldr r0, [r0], r1 @ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrh r0, [r0, #2]! +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrh r0, [r0, r1]! +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrh r0, [r0], #2 +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrh r0, [r0], r1 +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrsh r0, [r0, #2]! +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrsh r0, [r0, r1]! +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrsh r0, [r0], #2 +@ CHECK-ERRORS: ^ +@ CHECK-ERRORS: error: destination register and base register can't be identical +@ CHECK-ERRORS: ldrsh r0, [r0], r1 +@ CHECK-ERRORS: ^