llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-aarch64 Author: Jonathan Thackray (jthackray) <details> <summary>Changes</summary> Use the standard immediate parser for CMPBR aliases so that parenthesized expressions and explicit unary plus are accepted. This also simplifies the amount of code required, since we can remove `tryParseAdjImm0_63`, and reuse code in `AdjImmAsmOperand` which does the same job. Check immediates in their original ranges and apply the adjustment when rendering MC operands. Add coverage for constant expressions in `cbge`, `cbhs`, `cble` and `cbls`. --- <sub>Stack created with <a href="https://github.com/github/gh-stack">GitHub Stacks CLI</a> • <a href="https://gh.io/stacks-feedback">Give Feedback 💬</a></sub> --- Full diff: https://github.com/llvm/llvm-project/pull/230050.diff 3 Files Affected: - (modified) llvm/lib/Target/AArch64/AArch64InstrFormats.td (+13-23) - (modified) llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp (-30) - (modified) llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s (+13) ``````````diff diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td index 754e4444cf0dc..b87bf6ade0acc 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td +++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td @@ -470,6 +470,15 @@ def uimm6_32b : Operand<i32>, ImmLeaf<i32, [{ return Imm >= 0 && Imm < 64; }]> { let OperandType = "OPERAND_IMMEDIATE"; } +class AdjImmAsmOperand<string name, string diagnostic, int adjustment, + int low, int high> : AsmOperandClass { + let Name = name; + let DiagnosticType = diagnostic; + let RenderMethod = "addAdjImmOperands<" # adjustment # ">"; + let PredicateMethod = "isImmInRange<" # !sub(low, adjustment) # "," # + !sub(high, adjustment) # ">"; +} + def CmpBranchUImm6Operand_32b : ComplexPattern<i32, 1, "SelectCmpBranchUImm6Operand", [imm]> { let WantsParent = true; @@ -486,21 +495,11 @@ def CmpBranchBExtOperand def CmpBranchHExtOperand : ComplexPattern<i32, 2, "SelectCmpBranchExtOperand<false>", []> {} -def UImm6Plus1Operand : AsmOperandClass { - let Name = "UImm6P1"; - let DiagnosticType = "InvalidImm1_64"; - let RenderMethod = "addImmOperands"; - let ParserMethod = "tryParseAdjImm0_63<-1>"; - let PredicateMethod = "isImmInRange<0,63>"; -} +def UImm6Plus1Operand + : AdjImmAsmOperand<"UImm6P1", "InvalidImm1_64", -1, 0, 63>; -def UImm6Minus1Operand : AsmOperandClass { - let Name = "UImm6M1"; - let DiagnosticType = "InvalidImmM1_62"; - let RenderMethod = "addImmOperands"; - let ParserMethod = "tryParseAdjImm0_63<1>"; - let PredicateMethod = "isImmInRange<0,63>"; -} +def UImm6Minus1Operand + : AdjImmAsmOperand<"UImm6M1", "InvalidImmM1_62", 1, 0, 63>; def uimm6p1_32b : Operand<i32> { let ParserMatchClass = UImm6Plus1Operand; @@ -527,15 +526,6 @@ def uimm9 : Operand<i64> { let OperandType = "OPERAND_IMMEDIATE"; } -class AdjImmAsmOperand<string name, string diagnostic, int adjustment, - int low, int high> : AsmOperandClass { - let Name = name; - let DiagnosticType = diagnostic; - let RenderMethod = "addAdjImmOperands<" # adjustment # ">"; - let PredicateMethod = "isImmInRange<" # !sub(low, adjustment) # "," # - !sub(high, adjustment) # ">"; -} - def uimm9p1 : Operand<i64> { let ParserMatchClass = AdjImmAsmOperand<"UImm9P1", "InvalidImm1_512", -1, 0, 511>; diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index 412d4f16bc98b..a904efc8f0612 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -296,7 +296,6 @@ class AArch64AsmParser : public MCTargetAsmParser { ParseStatus tryParseSVEVecLenSpecifier(OperandVector &Operands); ParseStatus tryParseGPR64x8(OperandVector &Operands); ParseStatus tryParseImmRange(OperandVector &Operands); - template <int> ParseStatus tryParseAdjImm0_63(OperandVector &Operands); public: enum AArch64MatchResultTy { @@ -8797,32 +8796,3 @@ ParseStatus AArch64AsmParser::tryParseImmRange(OperandVector &Operands) { AArch64Operand::CreateImmRange(ImmFVal, ImmLVal, S, E, getContext())); return ParseStatus::Success; } - -template <int Adj> -ParseStatus AArch64AsmParser::tryParseAdjImm0_63(OperandVector &Operands) { - SMLoc S = getLoc(); - - parseOptionalToken(AsmToken::Hash); - - if (getTok().isNot(AsmToken::Integer) && getTok().isNot(AsmToken::Minus)) - return ParseStatus::NoMatch; - - int64_t Imm; - if (parseImmExpr(Imm)) - return ParseStatus::Failure; - - // We want an adjusted immediate in the range [0, 63]. If we don't have one, - // return a value, which is certain to trigger a error message about invalid - // immediate range instead of a non-descriptive invalid operand error. - static_assert(Adj == 1 || Adj == -1, "Unsafe immediate adjustment"); - if (Imm == INT64_MIN || Imm == INT64_MAX || Imm + Adj < 0 || Imm + Adj > 63) - Imm = -2; - else - Imm += Adj; - - SMLoc E = SMLoc::getFromPointer(getLoc().getPointer() - 1); - Operands.push_back(AArch64Operand::CreateImm( - MCConstantExpr::create(Imm, getContext()), S, E, getContext())); - - return ParseStatus::Success; -} diff --git a/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s b/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s index b7ec31d51a426..8985a574ace80 100644 --- a/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s +++ b/llvm/test/MC/AArch64/CMPBR/cmpbr_aliases.s @@ -72,3 +72,16 @@ // CHECK: cbgt x5, x3, #-1024 // encoding: [0x05,0x20,0x03,0xf4] cblt x3, x5, #-1024 +// Constant expressions in adjusted immediate aliases. + +// CHECK: cbgt w5, #0, #-1024 // encoding: [0x05,0x20,0x00,0x75] + cbge w5, #(2 - 1), #-1024 + +// CHECK: cbhi x5, #63, #-1024 // encoding: [0x05,0xa0,0x5f,0xf5] + cbhs x5, #+64, #-1024 + +// CHECK: cblt w5, #0, #-1024 // encoding: [0x05,0x20,0x20,0x75] + cble w5, #(-1), #-1024 + +// CHECK: cblo x5, #63, #-1024 // encoding: [0x05,0xa0,0x7f,0xf5] + cbls x5, #+62, #-1024 `````````` </details> https://github.com/llvm/llvm-project/pull/230050 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
