From 9998ba6f9907aaf61756c15d3e8d49f502748f0d Mon Sep 17 00:00:00 2001 From: Sam Elliott Date: Fri, 7 Feb 2025 08:14:31 -0800 Subject: [PATCH 1/4] [RISCV][NFC] Adopt DiagnosticString interface Where errors contain a constant string, TableGen allows us to specify the Diagnostic String with the rest of the Operand definition, which simplifies the C++ needed in the Asm Parser significantly. --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 63 ++----------------- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 6 ++ llvm/lib/Target/RISCV/RISCVInstrInfoV.td | 2 + llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td | 1 + llvm/lib/Target/RISCV/RISCVInstrInfoZc.td | 3 + llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td | 2 + 6 files changed, 19 insertions(+), 58 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index c51c4201ebd18..c3a29a4ddfa81 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -280,7 +280,7 @@ class RISCVAsmParser : public MCTargetAsmParser { std::unique_ptr defaultFRMArgLegacyOp() const; public: - enum RISCVMatchResultTy { + enum RISCVMatchResultTy : unsigned { Match_Dummy = FIRST_TARGET_MATCH_RESULT_TY, #define GET_OPERAND_DIAGNOSTIC_TYPES #include "RISCVGenAsmMatcher.inc" @@ -1524,10 +1524,6 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, std::numeric_limits::max(), "operand either must be a bare symbol name or an immediate integer in " "the range"); - case Match_InvalidImmZero: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "immediate must be zero"); - } case Match_InvalidUImmLog2XLen: if (isRV64()) return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 6) - 1); @@ -1654,47 +1650,10 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, "operand must be a valid system register " "name or an integer in the range"); } - case Match_InvalidLoadFPImm: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be a valid floating-point constant"); - } - case Match_InvalidBareSymbol: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be a bare symbol name"); - } - case Match_InvalidPseudoJumpSymbol: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be a valid jump target"); - } - case Match_InvalidCallSymbol: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be a bare symbol name"); - } - case Match_InvalidTPRelAddSymbol: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be a symbol with %tprel_add modifier"); - } - case Match_InvalidTLSDESCCallSymbol: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, - "operand must be a symbol with %tlsdesc_call modifier"); - } - case Match_InvalidRTZArg: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be 'rtz' floating-point rounding mode"); - } case Match_InvalidVTypeI: { SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); return generateVTypeError(ErrorLoc); } - case Match_InvalidVMaskRegister: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be v0.t"); - } - case Match_InvalidVMaskCarryInRegister: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operand must be v0"); - } case Match_InvalidSImm5Plus1: { return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 4) + 1, (1 << 4), @@ -1703,26 +1662,14 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, case Match_InvalidSImm26: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 25), (1 << 25) - 1); - case Match_InvalidRlist: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error( - ErrorLoc, - "operand must be {ra [, s0[-sN]]} or {x1 [, x8[-x9][, x18[-xN]]]}"); - } - case Match_InvalidStackAdj: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error( - ErrorLoc, - "stack adjustment is invalid for this instruction and register list; " - "refer to Zc spec for a detailed range of stack adjustment"); - } case Match_InvalidRnumArg: { return generateImmOutOfRangeError(Operands, ErrorInfo, 0, 10); } - case Match_InvalidRegReg: { - SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); - return Error(ErrorLoc, "operands must be register and register"); } + + if (const char* MatchDiag = getMatchKindDiag((RISCVMatchResultTy)Result)) { + SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); + return Error(ErrorLoc, MatchDiag); } llvm_unreachable("Unknown match type detected!"); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 54fee1ac3130e..fde7dc89dd693 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -125,6 +125,7 @@ def ImmZeroAsmOperand : AsmOperandClass { let Name = "ImmZero"; let RenderMethod = "addImmOperands"; let DiagnosticType = !strconcat("Invalid", Name); + let DiagnosticString = "immediate must be zero"; } // A parse method for (${gpr}) or 0(${gpr}), where the 0 is be silently ignored. @@ -323,6 +324,7 @@ def BareSymbol : AsmOperandClass { let Name = "BareSymbol"; let RenderMethod = "addImmOperands"; let DiagnosticType = "InvalidBareSymbol"; + let DiagnosticString = "operand must be a bare symbol name"; let ParserMethod = "parseBareSymbol"; } @@ -335,6 +337,7 @@ def CallSymbol : AsmOperandClass { let Name = "CallSymbol"; let RenderMethod = "addImmOperands"; let DiagnosticType = "InvalidCallSymbol"; + let DiagnosticString = "operand must be a bare symbol name"; let ParserMethod = "parseCallSymbol"; } @@ -347,6 +350,7 @@ def PseudoJumpSymbol : AsmOperandClass { let Name = "PseudoJumpSymbol"; let RenderMethod = "addImmOperands"; let DiagnosticType = "InvalidPseudoJumpSymbol"; + let DiagnosticString = "operand must be a valid jump target"; let ParserMethod = "parsePseudoJumpSymbol"; } @@ -359,6 +363,7 @@ def TPRelAddSymbol : AsmOperandClass { let Name = "TPRelAddSymbol"; let RenderMethod = "addImmOperands"; let DiagnosticType = "InvalidTPRelAddSymbol"; + let DiagnosticString = "operand must be a symbol with %tprel_add modifier"; let ParserMethod = "parseOperandWithModifier"; } @@ -1779,6 +1784,7 @@ def TLSDESCCallSymbol : AsmOperandClass { let Name = "TLSDESCCallSymbol"; let RenderMethod = "addImmOperands"; let DiagnosticType = "InvalidTLSDESCCallSymbol"; + let DiagnosticString = "operand must be a symbol with %tlsdesc_call modifier"; let ParserMethod = "parseOperandWithModifier"; } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td index 671e493fb3763..fdb2334b131da 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -48,6 +48,7 @@ def VMaskAsmOperand : AsmOperandClass { let IsOptional = 1; let DefaultMethod = "defaultMaskRegOp"; let DiagnosticType = "InvalidVMaskRegister"; + let DiagnosticString = "operand must be v0.t"; } def VMaskCarryInAsmOperand : AsmOperandClass { @@ -55,6 +56,7 @@ def VMaskCarryInAsmOperand : AsmOperandClass { let RenderMethod = "addRegOperands"; let PredicateMethod = "isV0Reg"; let DiagnosticType = "InvalidVMaskCarryInRegister"; + let DiagnosticString = "operand must be v0"; } def VMaskOp : RegisterOperand { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td index b98934d8c6396..bade4863ad348 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td @@ -514,6 +514,7 @@ def CVrrAsmOperand : AsmOperandClass { let Name = "RegReg"; let ParserMethod = "parseRegReg"; let DiagnosticType = "InvalidRegReg"; + let DiagnosticString = "operands must be register and register"; } def CVrr : Operand, diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td index 5cc16765d4ae2..9dfbcf678d6eb 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td @@ -39,12 +39,15 @@ def RlistAsmOperand : AsmOperandClass { let Name = "Rlist"; let ParserMethod = "parseReglist"; let DiagnosticType = "InvalidRlist"; + let DiagnosticString = "operand must be {ra [, s0[-sN]]} or {x1 [, x8[-x9][, x18[-xN]]]}"; } def StackAdjAsmOperand : AsmOperandClass { let Name = "StackAdj"; let ParserMethod = "parseZcmpStackAdj"; let DiagnosticType = "InvalidStackAdj"; + let DiagnosticString = "stack adjustment is invalid for this instruction and register list; " + "refer to Zc spec for a detailed range of stack adjustment"; let PredicateMethod = "isSpimm"; let RenderMethod = "addSpimmOperands"; } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td index ab54b45f4de93..a539ca82b7462 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZfa.td @@ -30,6 +30,7 @@ def LoadFPImmOperand : AsmOperandClass { let ParserMethod = "parseFPImm"; let RenderMethod = "addFPImmOperands"; let DiagnosticType = "InvalidLoadFPImm"; + let DiagnosticString = "operand must be a valid floating-point constant"; } def loadfpimm : Operand { @@ -43,6 +44,7 @@ def RTZArg : AsmOperandClass { let Name = "RTZArg"; let RenderMethod = "addFRMArgOperands"; let DiagnosticType = "InvalidRTZArg"; + let DiagnosticString = "operand must be 'rtz' floating-point rounding mode"; let ParserMethod = "parseFRMArg"; } From 70498da996ac9266c1d810c00aa6cfb25a3d4ee0 Mon Sep 17 00:00:00 2001 From: Sam Elliott Date: Fri, 7 Feb 2025 11:08:26 -0800 Subject: [PATCH 2/4] [RISCV][NFC] DiagnosticString TableGen Crimes I should be more sorry about this than I really am. --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 44 ------------------- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 20 ++++++++- llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 3 +- 3 files changed, 20 insertions(+), 47 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index c3a29a4ddfa81..a2e9237b0e813 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -1532,45 +1532,15 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, if (isRV64()) return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 6) - 1); return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 5) - 1); - case Match_InvalidUImm1: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 1) - 1); - case Match_InvalidUImm2: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 2) - 1); case Match_InvalidUImm2Lsb0: return generateImmOutOfRangeError(Operands, ErrorInfo, 0, 2, "immediate must be one of"); - case Match_InvalidUImm3: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 3) - 1); - case Match_InvalidUImm4: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 4) - 1); - case Match_InvalidUImm5: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 5) - 1); case Match_InvalidUImm5NonZero: return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 5) - 1); case Match_InvalidUImm5GT3: return generateImmOutOfRangeError(Operands, ErrorInfo, 4, (1 << 5) - 1); - case Match_InvalidUImm6: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 6) - 1); - case Match_InvalidUImm7: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 7) - 1); - case Match_InvalidUImm8: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 8) - 1); case Match_InvalidUImm8GE32: return generateImmOutOfRangeError(Operands, ErrorInfo, 32, (1 << 8) - 1); - case Match_InvalidSImm5: - return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 4), - (1 << 4) - 1); - case Match_InvalidSImm6: - return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 5), - (1 << 5) - 1); - case Match_InvalidSImm6NonZero: - return generateImmOutOfRangeError( - Operands, ErrorInfo, -(1 << 5), (1 << 5) - 1, - "immediate must be non-zero in the range"); - case Match_InvalidCLUIImm: - return generateImmOutOfRangeError( - Operands, ErrorInfo, 1, (1 << 5) - 1, - "immediate must be in [0xfffe0, 0xfffff] or"); case Match_InvalidUImm5Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 5) - 2, @@ -1607,10 +1577,6 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 9), (1 << 9) - 16, "immediate must be a multiple of 16 bytes and non-zero in the range"); - case Match_InvalidUImm10: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 10) - 1); - case Match_InvalidUImm11: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 11) - 1); case Match_InvalidSImm12: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 11), (1 << 11) - 1, @@ -1633,8 +1599,6 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, "operand must be a symbol with " "%hi/%tprel_hi modifier or an integer in " "the range"); - case Match_InvalidUImm20: - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 20) - 1); case Match_InvalidUImm20AUIPC: return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 20) - 1, @@ -1645,11 +1609,6 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 20), (1 << 20) - 2, "immediate must be a multiple of 2 bytes in the range"); - case Match_InvalidCSRSystemRegister: { - return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 12) - 1, - "operand must be a valid system register " - "name or an integer in the range"); - } case Match_InvalidVTypeI: { SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); return generateVTypeError(ErrorLoc); @@ -1659,9 +1618,6 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, (1 << 4), "immediate must be in the range"); } - case Match_InvalidSImm26: - return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 25), - (1 << 25) - 1); case Match_InvalidRnumArg: { return generateImmOutOfRangeError(Operands, ErrorInfo, 0, 10); } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index fde7dc89dd693..fc07f815945fd 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -151,12 +151,26 @@ def SPMem : MemOperand; def GPRCMem : MemOperand; -class SImmAsmOperand +class RISCVRangedImmDiagnosticString { + string Message = prefix # " [" # lo # ", " # hi # "]"; +} + +class RISCVSImmDiagnosticString : + RISCVRangedImmDiagnosticString { +} + +class RISCVUImmDiagnosticString : + RISCVRangedImmDiagnosticString<0, !sub(!shl(1, bitsNum), 1), prefix> { +} + +class SImmAsmOperand : ImmAsmOperand<"S", width, suffix> { + let DiagnosticString = RISCVSImmDiagnosticString.Message; } -class UImmAsmOperand +class UImmAsmOperand : ImmAsmOperand<"U", width, suffix> { + let DiagnosticString = RISCVUImmDiagnosticString.Message; } class RISCVOp : Operand { @@ -376,6 +390,8 @@ def CSRSystemRegister : AsmOperandClass { let Name = "CSRSystemRegister"; let ParserMethod = "parseCSRSystemRegister"; let DiagnosticType = "InvalidCSRSystemRegister"; + let DiagnosticString = RISCVUImmDiagnosticString<12, "operand must be a valid system register " + "name or an integer in the range">.Message; } def csr_sysreg : RISCVOp, TImmLeaf(Imm);"> { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index 0f320d2375ec2..dd3e93a54df72 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -47,7 +47,7 @@ def simm6 : RISCVSImmLeafOp<6> { def simm6nonzero : RISCVOp, ImmLeaf(Imm);}]> { - let ParserMatchClass = SImmAsmOperand<6, "NonZero">; + let ParserMatchClass = SImmAsmOperand<6, "NonZero", "immediate must be non-zero in the range">; let EncoderMethod = "getImmOpValue"; let DecoderMethod = "decodeSImmNonZeroOperand<6>"; let OperandType = "OPERAND_SIMM6_NONZERO"; @@ -69,6 +69,7 @@ def CLUIImmAsmOperand : AsmOperandClass { let Name = "CLUIImm"; let RenderMethod = "addImmOperands"; let DiagnosticType = !strconcat("Invalid", Name); + let DiagnosticString = "immediate must be in [0xfffe0, 0xfffff] or [1, 31]"; } From 7e3d6a64d14c37ded4c3f98134d70fd6f3445241 Mon Sep 17 00:00:00 2001 From: Sam Elliott Date: Fri, 7 Feb 2025 11:47:51 -0800 Subject: [PATCH 3/4] fixup! [RISCV][NFC] Adopt DiagnosticString interface --- llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index a2e9237b0e813..262ac5da5afd2 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -1623,7 +1623,7 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, } } - if (const char* MatchDiag = getMatchKindDiag((RISCVMatchResultTy)Result)) { + if (const char *MatchDiag = getMatchKindDiag((RISCVMatchResultTy)Result)) { SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); return Error(ErrorLoc, MatchDiag); } From a33d9ab727f9d5047a39f4b501332dc0e6bc8536 Mon Sep 17 00:00:00 2001 From: Sam Elliott Date: Fri, 7 Feb 2025 17:18:49 -0800 Subject: [PATCH 4/4] Revert "[RISCV][NFC] DiagnosticString TableGen Crimes" This reverts commit 70498da996ac9266c1d810c00aa6cfb25a3d4ee0. --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 44 +++++++++++++++++++ llvm/lib/Target/RISCV/RISCVInstrInfo.td | 20 +-------- llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 3 +- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 262ac5da5afd2..db73b38f0ef88 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -1532,15 +1532,45 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, if (isRV64()) return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 6) - 1); return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 5) - 1); + case Match_InvalidUImm1: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 1) - 1); + case Match_InvalidUImm2: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 2) - 1); case Match_InvalidUImm2Lsb0: return generateImmOutOfRangeError(Operands, ErrorInfo, 0, 2, "immediate must be one of"); + case Match_InvalidUImm3: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 3) - 1); + case Match_InvalidUImm4: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 4) - 1); + case Match_InvalidUImm5: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 5) - 1); case Match_InvalidUImm5NonZero: return generateImmOutOfRangeError(Operands, ErrorInfo, 1, (1 << 5) - 1); case Match_InvalidUImm5GT3: return generateImmOutOfRangeError(Operands, ErrorInfo, 4, (1 << 5) - 1); + case Match_InvalidUImm6: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 6) - 1); + case Match_InvalidUImm7: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 7) - 1); + case Match_InvalidUImm8: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 8) - 1); case Match_InvalidUImm8GE32: return generateImmOutOfRangeError(Operands, ErrorInfo, 32, (1 << 8) - 1); + case Match_InvalidSImm5: + return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 4), + (1 << 4) - 1); + case Match_InvalidSImm6: + return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 5), + (1 << 5) - 1); + case Match_InvalidSImm6NonZero: + return generateImmOutOfRangeError( + Operands, ErrorInfo, -(1 << 5), (1 << 5) - 1, + "immediate must be non-zero in the range"); + case Match_InvalidCLUIImm: + return generateImmOutOfRangeError( + Operands, ErrorInfo, 1, (1 << 5) - 1, + "immediate must be in [0xfffe0, 0xfffff] or"); case Match_InvalidUImm5Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 5) - 2, @@ -1577,6 +1607,10 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 9), (1 << 9) - 16, "immediate must be a multiple of 16 bytes and non-zero in the range"); + case Match_InvalidUImm10: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 10) - 1); + case Match_InvalidUImm11: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 11) - 1); case Match_InvalidSImm12: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 11), (1 << 11) - 1, @@ -1599,6 +1633,8 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, "operand must be a symbol with " "%hi/%tprel_hi modifier or an integer in " "the range"); + case Match_InvalidUImm20: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 20) - 1); case Match_InvalidUImm20AUIPC: return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 20) - 1, @@ -1609,6 +1645,11 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 20), (1 << 20) - 2, "immediate must be a multiple of 2 bytes in the range"); + case Match_InvalidCSRSystemRegister: { + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 12) - 1, + "operand must be a valid system register " + "name or an integer in the range"); + } case Match_InvalidVTypeI: { SMLoc ErrorLoc = ((RISCVOperand &)*Operands[ErrorInfo]).getStartLoc(); return generateVTypeError(ErrorLoc); @@ -1618,6 +1659,9 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, (1 << 4), "immediate must be in the range"); } + case Match_InvalidSImm26: + return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 25), + (1 << 25) - 1); case Match_InvalidRnumArg: { return generateImmOutOfRangeError(Operands, ErrorInfo, 0, 10); } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index fc07f815945fd..fde7dc89dd693 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -151,26 +151,12 @@ def SPMem : MemOperand; def GPRCMem : MemOperand; -class RISCVRangedImmDiagnosticString { - string Message = prefix # " [" # lo # ", " # hi # "]"; -} - -class RISCVSImmDiagnosticString : - RISCVRangedImmDiagnosticString { -} - -class RISCVUImmDiagnosticString : - RISCVRangedImmDiagnosticString<0, !sub(!shl(1, bitsNum), 1), prefix> { -} - -class SImmAsmOperand +class SImmAsmOperand : ImmAsmOperand<"S", width, suffix> { - let DiagnosticString = RISCVSImmDiagnosticString.Message; } -class UImmAsmOperand +class UImmAsmOperand : ImmAsmOperand<"U", width, suffix> { - let DiagnosticString = RISCVUImmDiagnosticString.Message; } class RISCVOp : Operand { @@ -390,8 +376,6 @@ def CSRSystemRegister : AsmOperandClass { let Name = "CSRSystemRegister"; let ParserMethod = "parseCSRSystemRegister"; let DiagnosticType = "InvalidCSRSystemRegister"; - let DiagnosticString = RISCVUImmDiagnosticString<12, "operand must be a valid system register " - "name or an integer in the range">.Message; } def csr_sysreg : RISCVOp, TImmLeaf(Imm);"> { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index dd3e93a54df72..0f320d2375ec2 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -47,7 +47,7 @@ def simm6 : RISCVSImmLeafOp<6> { def simm6nonzero : RISCVOp, ImmLeaf(Imm);}]> { - let ParserMatchClass = SImmAsmOperand<6, "NonZero", "immediate must be non-zero in the range">; + let ParserMatchClass = SImmAsmOperand<6, "NonZero">; let EncoderMethod = "getImmOpValue"; let DecoderMethod = "decodeSImmNonZeroOperand<6>"; let OperandType = "OPERAND_SIMM6_NONZERO"; @@ -69,7 +69,6 @@ def CLUIImmAsmOperand : AsmOperandClass { let Name = "CLUIImm"; let RenderMethod = "addImmOperands"; let DiagnosticType = !strconcat("Invalid", Name); - let DiagnosticString = "immediate must be in [0xfffe0, 0xfffff] or [1, 31]"; }