Index: lib/Target/ARM64/ARM64InstrFormats.td =================================================================== --- lib/Target/ARM64/ARM64InstrFormats.td +++ lib/Target/ARM64/ARM64InstrFormats.td @@ -91,11 +91,13 @@ let SuperClasses = [ShifterOperand]; let Name = "MovImm32Shifter"; let RenderMethod = "addShifterOperands"; + let DiagnosticType = "InvalidMovImm32Shift"; } def MovImm64ShifterOperand : AsmOperandClass { let SuperClasses = [ShifterOperand]; let Name = "MovImm64Shifter"; let RenderMethod = "addShifterOperands"; + let DiagnosticType = "InvalidMovImm64Shift"; } // Shifter operand for arithmetic register shifted encodings. @@ -239,15 +241,6 @@ let PrintMethod = "printImmScale<16>"; } -// imm0_65535 predicate - True if the immediate is in the range [0,65535]. -def Imm0_65535Operand : AsmOperandClass { let Name = "Imm0_65535"; } -def imm0_65535 : Operand, ImmLeaf { - let ParserMatchClass = Imm0_65535Operand; - let PrintMethod = "printHexImm"; -} - class AsmImmRange : AsmOperandClass { let Name = "Imm" # Low # "_" # High; let DiagnosticType = "InvalidImm" # Low # "_" # High; @@ -469,6 +462,15 @@ let ParserMatchClass = LogicalImm64Operand; } +// imm0_65535 predicate - True if the immediate is in the range [0,65535]. +def Imm0_65535Operand : AsmImmRange<0, 65535>; +def imm0_65535 : Operand, ImmLeaf { + let ParserMatchClass = Imm0_65535Operand; + let PrintMethod = "printHexImm"; +} + // imm0_255 predicate - True if the immediate is in the range [0,255]. def Imm0_255Operand : AsmOperandClass { let Name = "Imm0_255"; } def imm0_255 : Operand, ImmLeaf; def imm0_127 : Operand, ImmLeaf { @@ -909,6 +911,7 @@ // offset are implied zero and so are not part of the immediate. def PCRelLabel19Operand : AsmOperandClass { let Name = "PCRelLabel19"; + let DiagnosticType = "InvalidLabel"; } def am_brcond : Operand { let EncoderMethod = "getCondBranchTargetOpValue"; Index: lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp =================================================================== --- lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp +++ lib/Target/ARM64/AsmParser/ARM64AsmParser.cpp @@ -3685,6 +3685,10 @@ "expected compatible register, symbol or integer in range [0, 4095]"); case Match_LogicalSecondSource: return Error(Loc, "expected compatible register or logical immediate"); + case Match_InvalidMovImm32Shift: + return Error(Loc, "expected 'lsl' with optional integer 0 or 16"); + case Match_InvalidMovImm64Shift: + return Error(Loc, "expected 'lsl' with optional integer 0, 16, 32 or 48"); case Match_AddSubRegShift32: return Error(Loc, "expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31]"); @@ -3719,6 +3723,10 @@ return Error(Loc, "immediate must be an integer in range [0, 31]."); case Match_InvalidImm0_63: return Error(Loc, "immediate must be an integer in range [0, 63]."); + case Match_InvalidImm0_127: + return Error(Loc, "immediate must be an integer in range [0, 127]."); + case Match_InvalidImm0_65535: + return Error(Loc, "immediate must be an integer in range [0, 65535]."); case Match_InvalidImm1_8: return Error(Loc, "immediate must be an integer in range [1, 8]."); case Match_InvalidImm1_16: @@ -4142,6 +4150,8 @@ case Match_LogicalSecondSource: case Match_AddSubRegShift32: case Match_AddSubRegShift64: + case Match_InvalidMovImm32Shift: + case Match_InvalidMovImm64Shift: case Match_InvalidMemoryIndexed8: case Match_InvalidMemoryIndexed16: case Match_InvalidMemoryIndexed32SImm7: @@ -4151,6 +4161,8 @@ case Match_InvalidImm0_15: case Match_InvalidImm0_31: case Match_InvalidImm0_63: + case Match_InvalidImm0_127: + case Match_InvalidImm0_65535: case Match_InvalidImm1_8: case Match_InvalidImm1_16: case Match_InvalidImm1_32: