mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-19 09:57:42 +00:00
[mips][ias] Range check uimm4 operands and fixed a bug this revealed.
Summary: The bug was that the sldi instructions have immediate widths dependant on their element size. So sldi.d has a 1-bit immediate and sldi.b has a 4-bit immediate. All of these were using 4-bit immediates previously. Reviewers: vkalintiris Subscribers: llvm-commits, atanasyan, dsanders Differential Revision: http://reviews.llvm.org/D14018 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252297 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4b305e4b19
commit
169bb7dc81
@ -3300,6 +3300,9 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
return Error(IDLoc, "source and destination must be different");
|
||||
case Match_Immz:
|
||||
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), "expected '0'");
|
||||
case Match_UImm1_0:
|
||||
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
|
||||
"expected 1-bit unsigned immediate");
|
||||
case Match_UImm2_0:
|
||||
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
|
||||
"expected 2-bit unsigned immediate");
|
||||
@ -3309,6 +3312,9 @@ bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
|
||||
case Match_UImm3_0:
|
||||
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
|
||||
"expected 3-bit unsigned immediate");
|
||||
case Match_UImm4_0:
|
||||
return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
|
||||
"expected 4-bit unsigned immediate");
|
||||
}
|
||||
|
||||
llvm_unreachable("Implement any new match types added!");
|
||||
|
@ -390,17 +390,21 @@ class ConstantUImmAsmOperandClass<int Bits, list<AsmOperandClass> Supers = [],
|
||||
let DiagnosticType = "UImm" # Bits # "_" # Offset;
|
||||
}
|
||||
|
||||
def ConstantUImm4AsmOperandClass
|
||||
: ConstantUImmAsmOperandClass<4, []>;
|
||||
def ConstantUImm3AsmOperandClass
|
||||
: ConstantUImmAsmOperandClass<3, []>;
|
||||
: ConstantUImmAsmOperandClass<3, [ConstantUImm4AsmOperandClass]>;
|
||||
def ConstantUImm2Plus1AsmOperandClass
|
||||
: ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass], 1>;
|
||||
def ConstantUImm2AsmOperandClass
|
||||
: ConstantUImmAsmOperandClass<2, [ConstantUImm3AsmOperandClass]>;
|
||||
def ConstantUImm1AsmOperandClass
|
||||
: ConstantUImmAsmOperandClass<1, [ConstantUImm2AsmOperandClass]>;
|
||||
def ConstantImmzAsmOperandClass : AsmOperandClass {
|
||||
let Name = "ConstantImmz";
|
||||
let RenderMethod = "addConstantUImmOperands<1>";
|
||||
let PredicateMethod = "isConstantImmz";
|
||||
let SuperClasses = [ConstantUImm2AsmOperandClass];
|
||||
let SuperClasses = [ConstantUImm1AsmOperandClass];
|
||||
let DiagnosticType = "Immz";
|
||||
}
|
||||
|
||||
@ -477,7 +481,7 @@ def uimmz : Operand<i32> {
|
||||
}
|
||||
|
||||
// Unsigned Operands
|
||||
foreach I = {2, 3} in
|
||||
foreach I = {1, 2, 3, 4} in
|
||||
def uimm # I : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
let ParserMatchClass =
|
||||
|
@ -70,10 +70,6 @@ def immZExt6Ptr : ImmLeaf<iPTR, [{return isUInt<6>(Imm);}]>;
|
||||
|
||||
// Operands
|
||||
|
||||
def uimm4 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm8";
|
||||
}
|
||||
|
||||
def uimm4_ptr : Operand<iPTR> {
|
||||
let PrintMethod = "printUnsignedImm8";
|
||||
}
|
||||
@ -1277,13 +1273,14 @@ class MSA_COPY_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
|
||||
}
|
||||
|
||||
class MSA_ELM_SLD_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
|
||||
RegisterOperand ROWD, RegisterOperand ROWS = ROWD,
|
||||
RegisterOperand ROWD, RegisterOperand ROWS,
|
||||
Operand ImmOp, ImmLeaf Imm,
|
||||
InstrItinClass itin = NoItinerary> {
|
||||
dag OutOperandList = (outs ROWD:$wd);
|
||||
dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, uimm4:$n);
|
||||
dag InOperandList = (ins ROWD:$wd_in, ROWS:$ws, ImmOp:$n);
|
||||
string AsmString = !strconcat(instr_asm, "\t$wd, $ws[$n]");
|
||||
list<dag> Pattern = [(set ROWD:$wd, (OpNode ROWD:$wd_in, ROWS:$ws,
|
||||
immZExt4:$n))];
|
||||
Imm:$n))];
|
||||
string Constraints = "$wd = $wd_in";
|
||||
InstrItinClass Itinerary = itin;
|
||||
}
|
||||
@ -2573,13 +2570,17 @@ class SLD_W_DESC : MSA_3R_SLD_DESC_BASE<"sld.w", int_mips_sld_w, MSA128WOpnd>;
|
||||
class SLD_D_DESC : MSA_3R_SLD_DESC_BASE<"sld.d", int_mips_sld_d, MSA128DOpnd>;
|
||||
|
||||
class SLDI_B_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.b", int_mips_sldi_b,
|
||||
MSA128BOpnd>;
|
||||
MSA128BOpnd, MSA128BOpnd, uimm4,
|
||||
immZExt4>;
|
||||
class SLDI_H_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.h", int_mips_sldi_h,
|
||||
MSA128HOpnd>;
|
||||
MSA128HOpnd, MSA128HOpnd, uimm3,
|
||||
immZExt3>;
|
||||
class SLDI_W_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.w", int_mips_sldi_w,
|
||||
MSA128WOpnd>;
|
||||
MSA128WOpnd, MSA128WOpnd, uimm2,
|
||||
immZExt2>;
|
||||
class SLDI_D_DESC : MSA_ELM_SLD_DESC_BASE<"sldi.d", int_mips_sldi_d,
|
||||
MSA128DOpnd>;
|
||||
MSA128DOpnd, MSA128DOpnd, uimm1,
|
||||
immZExt1>;
|
||||
|
||||
class SLL_B_DESC : MSA_3R_DESC_BASE<"sll.b", shl, MSA128BOpnd>;
|
||||
class SLL_H_DESC : MSA_3R_DESC_BASE<"sll.h", shl, MSA128HOpnd>;
|
||||
|
7
test/MC/Mips/micromips/invalid.s
Normal file
7
test/MC/Mips/micromips/invalid.s
Normal file
@ -0,0 +1,7 @@
|
||||
# RUN: not llvm-mc %s -triple=mips -show-encoding -mattr=micromips 2>%t1
|
||||
# RUN: FileCheck %s < %t1
|
||||
|
||||
break16 -1 # CHECK: :[[@LINE]]:11: error: expected 4-bit unsigned immediate
|
||||
break16 16 # CHECK: :[[@LINE]]:11: error: expected 4-bit unsigned immediate
|
||||
sdbbp16 -1 # CHECK: :[[@LINE]]:11: error: expected 4-bit unsigned immediate
|
||||
sdbbp16 16 # CHECK: :[[@LINE]]:11: error: expected 4-bit unsigned immediate
|
@ -15,8 +15,20 @@
|
||||
lsa $2, $3, $4, 5 # CHECK: :[[@LINE]]:25: error: expected immediate in range 1 .. 4
|
||||
sat_s.b $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_s.b $w31, $w31, 8 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_s.h $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_s.h $w31, $w31, 16 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_u.b $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_u.b $w31, $w31, 8 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_u.h $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_u.h $w31, $w31, 16 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sldi.b $w0, $w29[-1] # CHECK: :[[@LINE]]:22: error: expected 4-bit unsigned immediate
|
||||
sldi.b $w0, $w29[16] # CHECK: :[[@LINE]]:22: error: expected 4-bit unsigned immediate
|
||||
sldi.d $w4, $w12[-1] # CHECK: :[[@LINE]]:22: error: expected 1-bit unsigned immediate
|
||||
sldi.d $w4, $w12[2] # CHECK: :[[@LINE]]:22: error: expected 1-bit unsigned immediate
|
||||
sldi.h $w8, $w17[-1] # CHECK: :[[@LINE]]:22: error: expected 3-bit unsigned immediate
|
||||
sldi.h $w8, $w17[8] # CHECK: :[[@LINE]]:22: error: expected 3-bit unsigned immediate
|
||||
sldi.w $w20, $w27[-1] # CHECK: :[[@LINE]]:23: error: expected 2-bit unsigned immediate
|
||||
sldi.w $w20, $w27[4] # CHECK: :[[@LINE]]:23: error: expected 2-bit unsigned immediate
|
||||
srari.b $w5, $w25, -1 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
srari.b $w5, $w25, 8 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
srlri.b $w18, $w3, -1 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
|
@ -13,8 +13,20 @@
|
||||
lsa $2, $3, $4, 5 # CHECK: :[[@LINE]]:25: error: expected immediate in range 1 .. 4
|
||||
sat_s.b $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_s.b $w31, $w31, 8 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_s.h $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_s.h $w31, $w31, 16 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_u.b $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_u.b $w31, $w31, 8 # CHECK: :[[@LINE]]:25: error: expected 3-bit unsigned immediate
|
||||
sat_u.h $w31, $w31, -1 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sat_u.h $w31, $w31, 16 # CHECK: :[[@LINE]]:25: error: expected 4-bit unsigned immediate
|
||||
sldi.b $w0, $w29[-1] # CHECK: :[[@LINE]]:22: error: expected 4-bit unsigned immediate
|
||||
sldi.b $w0, $w29[16] # CHECK: :[[@LINE]]:22: error: expected 4-bit unsigned immediate
|
||||
sldi.d $w4, $w12[-1] # CHECK: :[[@LINE]]:22: error: expected 1-bit unsigned immediate
|
||||
sldi.d $w4, $w12[2] # CHECK: :[[@LINE]]:22: error: expected 1-bit unsigned immediate
|
||||
sldi.h $w8, $w17[-1] # CHECK: :[[@LINE]]:22: error: expected 3-bit unsigned immediate
|
||||
sldi.h $w8, $w17[8] # CHECK: :[[@LINE]]:22: error: expected 3-bit unsigned immediate
|
||||
sldi.w $w20, $w27[-1] # CHECK: :[[@LINE]]:23: error: expected 2-bit unsigned immediate
|
||||
sldi.w $w20, $w27[4] # CHECK: :[[@LINE]]:23: error: expected 2-bit unsigned immediate
|
||||
srari.b $w5, $w25, -1 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
srari.b $w5, $w25, 8 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
srlri.b $w18, $w3, -1 # CHECK: :[[@LINE]]:24: error: expected 3-bit unsigned immediate
|
||||
|
Loading…
Reference in New Issue
Block a user