diff --git a/llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp b/llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp --- a/llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp +++ b/llvm/lib/Target/PowerPC/Disassembler/PPCDisassembler.cpp @@ -239,7 +239,8 @@ static DecodeStatus decodeUImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder) { - assert(isUInt(Imm) && "Invalid immediate"); + if (!isUInt(Imm)) + return MCDisassembler::Fail; Inst.addOperand(MCOperand::createImm(Imm)); return MCDisassembler::Success; } @@ -248,7 +249,8 @@ static DecodeStatus decodeSImmOperand(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder) { - assert(isUInt(Imm) && "Invalid immediate"); + if (!isUInt(Imm)) + return MCDisassembler::Fail; Inst.addOperand(MCOperand::createImm(SignExtend64(Imm))); return MCDisassembler::Success; } diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.td b/llvm/lib/Target/PowerPC/PPCRegisterInfo.td --- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.td +++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.td @@ -548,6 +548,7 @@ def u1imm : Operand { let PrintMethod = "printU1ImmOperand"; let ParserMatchClass = PPCU1ImmAsmOperand; + let DecoderMethod = "decodeUImmOperand<1>"; let OperandType = "OPERAND_IMMEDIATE"; } @@ -558,6 +559,7 @@ def u2imm : Operand { let PrintMethod = "printU2ImmOperand"; let ParserMatchClass = PPCU2ImmAsmOperand; + let DecoderMethod = "decodeUImmOperand<2>"; let OperandType = "OPERAND_IMMEDIATE"; } @@ -578,6 +580,7 @@ def u3imm : Operand { let PrintMethod = "printU3ImmOperand"; let ParserMatchClass = PPCU3ImmAsmOperand; + let DecoderMethod = "decodeUImmOperand<3>"; let OperandType = "OPERAND_IMMEDIATE"; } @@ -588,6 +591,7 @@ def u4imm : Operand { let PrintMethod = "printU4ImmOperand"; let ParserMatchClass = PPCU4ImmAsmOperand; + let DecoderMethod = "decodeUImmOperand<4>"; let OperandType = "OPERAND_IMMEDIATE"; } def PPCS5ImmAsmOperand : AsmOperandClass { diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31-invalid.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31-invalid.txt --- a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31-invalid.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31-invalid.txt @@ -85,3 +85,7 @@ # pstxv 31, 8589934591(3), 1. However, RA is not zero with R=1 # CHECK: warning: invalid instruction encoding 0x04 0x11 0xff 0xff 0xdb 0xe3 0xff 0xff + +# xxextractuw 52, 30, 20 (i.e. the immediate 20 is invalid) +# CHECK: warning: invalid instruction encoding +0xf2 0x94 0xf2 0x95