[llvm] r228920 - ARM: Fix another regression introduced in r223113
Ahmed Bougacha
ahmed.bougacha at gmail.com
Thu Feb 12 10:21:52 PST 2015
On Thu, Feb 12, 2015 at 5:37 AM, Asiri Rathnayake
<asiri.rathnayake at arm.com> wrote:
> Author: asiri
> Date: Thu Feb 12 07:37:28 2015
> New Revision: 228920
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228920&view=rev
> Log:
> ARM: Fix another regression introduced in r223113
>
> The changes in r223113 (ARM modified-immediate syntax) have broken
> instructions like:
> mov r0, #~0xffffff00
> The problem is that I've added a spurious range check on the immediate
> operand to ensure that it lies between INT32_MIN and UINT32_MAX. While
> this range check is correct in theory, it causes problems because the
> operand is stored in an int64_t (by MC). So valid 32-bit constants like
> \#~0xffffff00 become out of range. The solution is to simply remove this
> range check. It is not possible to validate the range of the immediate
> operand with the current setup because: 1) The operand is stored in an
> int64_t by MC, 2) The immediate can be of the forms #imm, #-imm, #~imm
> or even #((~imm)) etc. So we just chop the value to 32 bits and use it.
In all these cases, "imm" is a 32-bit constant, so the upper 32 bits
are either all ones or all zeros, no? Perhaps that would be useful as
a limited form of check.
-Ahmed
> Also noted that the original range check was note tested by any of the
> unit tests. I've added a new test to cover #~imm kind of operands.
>
> Change-Id: I411e90d84312a2eff01b732bb238af536c4a7599
>
> Modified:
> llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
> llvm/trunk/test/MC/ARM/basic-arm-instructions.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=228920&r1=228919&r2=228920&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/AsmParser/ARMAsmParser.cpp Thu Feb 12 07:37:28 2015
> @@ -4424,11 +4424,6 @@ ARMAsmParser::parseModImm(OperandVector
> if (CE) {
> // Immediate must fit within 32-bits
> Imm1 = CE->getValue();
> - if (Imm1 < INT32_MIN || Imm1 > UINT32_MAX) {
> - Error(Sx1, "immediate operand must be representable with 32 bits");
> - return MatchOperand_ParseFail;
> - }
> -
> int Enc = ARM_AM::getSOImmVal(Imm1);
> if (Enc != -1 && Parser.getTok().is(AsmToken::EndOfStatement)) {
> // We have a match!
>
> Modified: llvm/trunk/test/MC/ARM/basic-arm-instructions.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/basic-arm-instructions.s?rev=228920&r1=228919&r2=228920&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/basic-arm-instructions.s (original)
> +++ llvm/trunk/test/MC/ARM/basic-arm-instructions.s Thu Feb 12 07:37:28 2015
> @@ -1509,6 +1509,7 @@ Lforward:
> mvn r3, $7
> mvn r3, 7
> mvn r3, -7
> + mvn r7, #~0xffffff00
> mvn r4, #0xff0
> mvn r5, #0xff0000
> mvn r7, #(0xff << 16)
> @@ -1526,6 +1527,7 @@ Lforward:
> @ CHECK: mvn r3, #7 @ encoding: [0x07,0x30,0xe0,0xe3]
> @ CHECK: mvn r3, #7 @ encoding: [0x07,0x30,0xe0,0xe3]
> @ CHECK: mov r3, #6 @ encoding: [0x06,0x30,0xa0,0xe3]
> +@ CHECK: mvn r7, #255 @ encoding: [0xff,0x70,0xe0,0xe3]
> @ CHECK: mvn r4, #4080 @ encoding: [0xff,0x4e,0xe0,0xe3]
> @ CHECK: mvn r5, #16711680 @ encoding: [0xff,0x58,0xe0,0xe3]
> @ CHECK: mvn r7, #16711680 @ encoding: [0xff,0x78,0xe0,0xe3]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list