mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-25 13:35:10 +00:00
[mips] Use uimm5 and uimm6 instead of shamt and imm, if the immediate has to fit
into a 5-bit or 6-bit field. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190226 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8b56ca61e1
commit
69f8e0935a
@ -71,11 +71,11 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in {
|
||||
MULT_FM_MM<0x26c>;
|
||||
|
||||
/// Shift Instructions
|
||||
def SLL_MM : MMRel, shift_rotate_imm<"sll", shamt, GPR32Opnd>,
|
||||
def SLL_MM : MMRel, shift_rotate_imm<"sll", uimm5, GPR32Opnd>,
|
||||
SRA_FM_MM<0, 0>;
|
||||
def SRL_MM : MMRel, shift_rotate_imm<"srl", shamt, GPR32Opnd>,
|
||||
def SRL_MM : MMRel, shift_rotate_imm<"srl", uimm5, GPR32Opnd>,
|
||||
SRA_FM_MM<0x40, 0>;
|
||||
def SRA_MM : MMRel, shift_rotate_imm<"sra", shamt, GPR32Opnd>,
|
||||
def SRA_MM : MMRel, shift_rotate_imm<"sra", uimm5, GPR32Opnd>,
|
||||
SRA_FM_MM<0x80, 0>;
|
||||
def SLLV_MM : MMRel, shift_rotate_reg<"sllv", GPR32Opnd>,
|
||||
SRLV_FM_MM<0x10, 0>;
|
||||
@ -83,7 +83,7 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in {
|
||||
SRLV_FM_MM<0x50, 0>;
|
||||
def SRAV_MM : MMRel, shift_rotate_reg<"srav", GPR32Opnd>,
|
||||
SRLV_FM_MM<0x90, 0>;
|
||||
def ROTR_MM : MMRel, shift_rotate_imm<"rotr", shamt, GPR32Opnd>,
|
||||
def ROTR_MM : MMRel, shift_rotate_imm<"rotr", uimm5, GPR32Opnd>,
|
||||
SRA_FM_MM<0xc0, 0>;
|
||||
def ROTRV_MM : MMRel, shift_rotate_reg<"rotrv", GPR32Opnd>,
|
||||
SRLV_FM_MM<0xd0, 0>;
|
||||
|
@ -220,7 +220,7 @@ class FEXT_RRI_A16_mem_ins<bits<1> op, string asmstr, Operand MemOpnd,
|
||||
// EXT-SHIFT instruction format
|
||||
//
|
||||
class FEXT_SHIFT16_ins<bits<2> _f, string asmstr, InstrItinClass itin>:
|
||||
FEXT_SHIFT16<_f, (outs CPU16Regs:$rx), (ins CPU16Regs:$ry, shamt:$sa),
|
||||
FEXT_SHIFT16<_f, (outs CPU16Regs:$rx), (ins CPU16Regs:$ry, uimm5:$sa),
|
||||
!strconcat(asmstr, "\t$rx, $ry, $sa"), [], itin>;
|
||||
|
||||
//
|
||||
|
@ -15,9 +15,6 @@
|
||||
// Mips Operand, Complex Patterns and Transformations Definitions.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Instruction operand types
|
||||
def shamt_64 : Operand<i64>;
|
||||
|
||||
// Unsigned Operand
|
||||
def uimm16_64 : Operand<i64> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
@ -95,22 +92,22 @@ def NOR64 : LogicNOR<"nor", GPR64Opnd>, ADD_FM<0, 0x27>;
|
||||
}
|
||||
|
||||
/// Shift Instructions
|
||||
def DSLL : shift_rotate_imm<"dsll", shamt, GPR64Opnd, shl, immZExt6>,
|
||||
def DSLL : shift_rotate_imm<"dsll", uimm6, GPR64Opnd, shl, immZExt6>,
|
||||
SRA_FM<0x38, 0>;
|
||||
def DSRL : shift_rotate_imm<"dsrl", shamt, GPR64Opnd, srl, immZExt6>,
|
||||
def DSRL : shift_rotate_imm<"dsrl", uimm6, GPR64Opnd, srl, immZExt6>,
|
||||
SRA_FM<0x3a, 0>;
|
||||
def DSRA : shift_rotate_imm<"dsra", shamt, GPR64Opnd, sra, immZExt6>,
|
||||
def DSRA : shift_rotate_imm<"dsra", uimm6, GPR64Opnd, sra, immZExt6>,
|
||||
SRA_FM<0x3b, 0>;
|
||||
def DSLLV : shift_rotate_reg<"dsllv", GPR64Opnd, shl>, SRLV_FM<0x14, 0>;
|
||||
def DSRLV : shift_rotate_reg<"dsrlv", GPR64Opnd, srl>, SRLV_FM<0x16, 0>;
|
||||
def DSRAV : shift_rotate_reg<"dsrav", GPR64Opnd, sra>, SRLV_FM<0x17, 0>;
|
||||
def DSLL32 : shift_rotate_imm<"dsll32", shamt, GPR64Opnd>, SRA_FM<0x3c, 0>;
|
||||
def DSRL32 : shift_rotate_imm<"dsrl32", shamt, GPR64Opnd>, SRA_FM<0x3e, 0>;
|
||||
def DSRA32 : shift_rotate_imm<"dsra32", shamt, GPR64Opnd>, SRA_FM<0x3f, 0>;
|
||||
def DSLL32 : shift_rotate_imm<"dsll32", uimm5, GPR64Opnd>, SRA_FM<0x3c, 0>;
|
||||
def DSRL32 : shift_rotate_imm<"dsrl32", uimm5, GPR64Opnd>, SRA_FM<0x3e, 0>;
|
||||
def DSRA32 : shift_rotate_imm<"dsra32", uimm5, GPR64Opnd>, SRA_FM<0x3f, 0>;
|
||||
|
||||
// Rotate Instructions
|
||||
let Predicates = [HasMips64r2, HasStdEnc] in {
|
||||
def DROTR : shift_rotate_imm<"drotr", shamt, GPR64Opnd, rotr, immZExt6>,
|
||||
def DROTR : shift_rotate_imm<"drotr", uimm6, GPR64Opnd, rotr, immZExt6>,
|
||||
SRA_FM<0x3a, 1>;
|
||||
def DROTRV : shift_rotate_reg<"drotrv", GPR64Opnd, rotr>,
|
||||
SRLV_FM<0x16, 1>;
|
||||
@ -204,16 +201,13 @@ def LEA_ADDiu64 : EffectiveAddress<"daddiu", GPR64Opnd>, LW_FM<0x19>;
|
||||
let isCodeGenOnly = 1 in
|
||||
def RDHWR64 : ReadHardware<GPR64Opnd, HWRegsOpnd>, RDHWR_FM;
|
||||
|
||||
def DEXT : ExtBase<"dext", GPR64Opnd>, EXT_FM<3>;
|
||||
let Pattern = []<dag> in {
|
||||
def DEXTU : ExtBase<"dextu", GPR64Opnd>, EXT_FM<2>;
|
||||
def DEXTM : ExtBase<"dextm", GPR64Opnd>, EXT_FM<1>;
|
||||
}
|
||||
def DINS : InsBase<"dins", GPR64Opnd>, EXT_FM<7>;
|
||||
let Pattern = []<dag> in {
|
||||
def DINSU : InsBase<"dinsu", GPR64Opnd>, EXT_FM<6>;
|
||||
def DINSM : InsBase<"dinsm", GPR64Opnd>, EXT_FM<5>;
|
||||
}
|
||||
def DEXT : ExtBase<"dext", GPR64Opnd, uimm6, MipsExt>, EXT_FM<3>;
|
||||
def DEXTU : ExtBase<"dextu", GPR64Opnd, uimm6>, EXT_FM<2>;
|
||||
def DEXTM : ExtBase<"dextm", GPR64Opnd, uimm5>, EXT_FM<1>;
|
||||
|
||||
def DINS : InsBase<"dins", GPR64Opnd, uimm6, MipsIns>, EXT_FM<7>;
|
||||
def DINSU : InsBase<"dinsu", GPR64Opnd, uimm6>, EXT_FM<6>;
|
||||
def DINSM : InsBase<"dinsm", GPR64Opnd, uimm5>, EXT_FM<5>;
|
||||
|
||||
let isCodeGenOnly = 1, rs = 0, shamt = 0 in {
|
||||
def DSLL64_32 : FR<0x00, 0x3c, (outs GPR64:$rd), (ins GPR32:$rt),
|
||||
|
@ -299,7 +299,7 @@ class PRECR_SRA_PH_W_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
|
||||
InstrItinClass itin, RegisterOperand ROT,
|
||||
RegisterOperand ROS = ROT> {
|
||||
dag OutOperandList = (outs ROT:$rt);
|
||||
dag InOperandList = (ins ROS:$rs, shamt:$sa, ROS:$src);
|
||||
dag InOperandList = (ins ROS:$rs, uimm5:$sa, ROS:$src);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $sa");
|
||||
list<dag> Pattern = [(set ROT:$rt, (OpNode ROS:$src, ROS:$rs, immZExt5:$sa))];
|
||||
InstrItinClass Itinerary = itin;
|
||||
@ -368,7 +368,7 @@ class ADDUH_QB_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
|
||||
class APPEND_DESC_BASE<string instr_asm, SDPatternOperator OpNode,
|
||||
SDPatternOperator ImmOp, InstrItinClass itin> {
|
||||
dag OutOperandList = (outs GPR32Opnd:$rt);
|
||||
dag InOperandList = (ins GPR32Opnd:$rs, shamt:$sa, GPR32Opnd:$src);
|
||||
dag InOperandList = (ins GPR32Opnd:$rs, uimm5:$sa, GPR32Opnd:$src);
|
||||
string AsmString = !strconcat(instr_asm, "\t$rt, $rs, $sa");
|
||||
list<dag> Pattern = [(set GPR32Opnd:$rt,
|
||||
(OpNode GPR32Opnd:$src, GPR32Opnd:$rs, ImmOp:$sa))];
|
||||
|
@ -263,13 +263,16 @@ def uimm10 : Operand<i32> {
|
||||
}
|
||||
|
||||
def simm16_64 : Operand<i64>;
|
||||
def shamt : Operand<i32>;
|
||||
|
||||
// Unsigned Operand
|
||||
def uimm5 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
|
||||
def uimm6 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
|
||||
def uimm16 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
@ -737,18 +740,20 @@ class ReadHardware<RegisterOperand CPURegOperand, RegisterOperand RO> :
|
||||
IIArith, FrmR>;
|
||||
|
||||
// Ext and Ins
|
||||
class ExtBase<string opstr, RegisterOperand RO>:
|
||||
InstSE<(outs RO:$rt), (ins RO:$rs, uimm16:$pos, size_ext:$size),
|
||||
class ExtBase<string opstr, RegisterOperand RO, Operand PosOpnd,
|
||||
SDPatternOperator Op = null_frag>:
|
||||
InstSE<(outs RO:$rt), (ins RO:$rs, PosOpnd:$pos, size_ext:$size),
|
||||
!strconcat(opstr, " $rt, $rs, $pos, $size"),
|
||||
[(set RO:$rt, (MipsExt RO:$rs, imm:$pos, imm:$size))], NoItinerary,
|
||||
[(set RO:$rt, (Op RO:$rs, imm:$pos, imm:$size))], NoItinerary,
|
||||
FrmR> {
|
||||
let Predicates = [HasMips32r2, HasStdEnc];
|
||||
}
|
||||
|
||||
class InsBase<string opstr, RegisterOperand RO>:
|
||||
InstSE<(outs RO:$rt), (ins RO:$rs, uimm16:$pos, size_ins:$size, RO:$src),
|
||||
class InsBase<string opstr, RegisterOperand RO, Operand PosOpnd,
|
||||
SDPatternOperator Op = null_frag>:
|
||||
InstSE<(outs RO:$rt), (ins RO:$rs, PosOpnd:$pos, size_ins:$size, RO:$src),
|
||||
!strconcat(opstr, " $rt, $rs, $pos, $size"),
|
||||
[(set RO:$rt, (MipsIns RO:$rs, imm:$pos, imm:$size, RO:$src))],
|
||||
[(set RO:$rt, (Op RO:$rs, imm:$pos, imm:$size, RO:$src))],
|
||||
NoItinerary, FrmR> {
|
||||
let Predicates = [HasMips32r2, HasStdEnc];
|
||||
let Constraints = "$src = $rt";
|
||||
@ -888,11 +893,11 @@ def XOR : MMRel, ArithLogicR<"xor", GPR32Opnd, 1, IILogic, xor>,
|
||||
def NOR : MMRel, LogicNOR<"nor", GPR32Opnd>, ADD_FM<0, 0x27>;
|
||||
|
||||
/// Shift Instructions
|
||||
def SLL : MMRel, shift_rotate_imm<"sll", shamt, GPR32Opnd, shl, immZExt5>,
|
||||
def SLL : MMRel, shift_rotate_imm<"sll", uimm5, GPR32Opnd, shl, immZExt5>,
|
||||
SRA_FM<0, 0>;
|
||||
def SRL : MMRel, shift_rotate_imm<"srl", shamt, GPR32Opnd, srl, immZExt5>,
|
||||
def SRL : MMRel, shift_rotate_imm<"srl", uimm5, GPR32Opnd, srl, immZExt5>,
|
||||
SRA_FM<2, 0>;
|
||||
def SRA : MMRel, shift_rotate_imm<"sra", shamt, GPR32Opnd, sra, immZExt5>,
|
||||
def SRA : MMRel, shift_rotate_imm<"sra", uimm5, GPR32Opnd, sra, immZExt5>,
|
||||
SRA_FM<3, 0>;
|
||||
def SLLV : MMRel, shift_rotate_reg<"sllv", GPR32Opnd, shl>, SRLV_FM<4, 0>;
|
||||
def SRLV : MMRel, shift_rotate_reg<"srlv", GPR32Opnd, srl>, SRLV_FM<6, 0>;
|
||||
@ -900,7 +905,7 @@ def SRAV : MMRel, shift_rotate_reg<"srav", GPR32Opnd, sra>, SRLV_FM<7, 0>;
|
||||
|
||||
// Rotate Instructions
|
||||
let Predicates = [HasMips32r2, HasStdEnc] in {
|
||||
def ROTR : MMRel, shift_rotate_imm<"rotr", shamt, GPR32Opnd, rotr,
|
||||
def ROTR : MMRel, shift_rotate_imm<"rotr", uimm5, GPR32Opnd, rotr,
|
||||
immZExt5>,
|
||||
SRA_FM<2, 1>;
|
||||
def ROTRV : MMRel, shift_rotate_reg<"rotrv", GPR32Opnd, rotr>,
|
||||
@ -1053,8 +1058,8 @@ def PseudoMSUBU : MAddSubPseudo<MSUBU, MipsMSubu>;
|
||||
|
||||
def RDHWR : ReadHardware<GPR32Opnd, HWRegsOpnd>, RDHWR_FM;
|
||||
|
||||
def EXT : ExtBase<"ext", GPR32Opnd>, EXT_FM<0>;
|
||||
def INS : InsBase<"ins", GPR32Opnd>, EXT_FM<4>;
|
||||
def EXT : ExtBase<"ext", GPR32Opnd, uimm5, MipsExt>, EXT_FM<0>;
|
||||
def INS : InsBase<"ins", GPR32Opnd, uimm5, MipsIns>, EXT_FM<4>;
|
||||
|
||||
/// Move Control Registers From/To CPU Registers
|
||||
def MFC0 : MFC3OP<"mfc0", GPR32Opnd>, MFC3OP_FM<0x10, 0>;
|
||||
@ -1121,7 +1126,7 @@ def : InstAlias<"tne $rs, $rt", (TNE GPR32Opnd:$rs, GPR32Opnd:$rt, 0), 1>;
|
||||
class LoadImm32< string instr_asm, Operand Od, RegisterOperand RO> :
|
||||
MipsAsmPseudoInst<(outs RO:$rt), (ins Od:$imm32),
|
||||
!strconcat(instr_asm, "\t$rt, $imm32")> ;
|
||||
def LoadImm32Reg : LoadImm32<"li", shamt,GPR32Opnd>;
|
||||
def LoadImm32Reg : LoadImm32<"li", uimm5, GPR32Opnd>;
|
||||
|
||||
class LoadAddress<string instr_asm, Operand MemOpnd, RegisterOperand RO> :
|
||||
MipsAsmPseudoInst<(outs RO:$rt), (ins MemOpnd:$addr),
|
||||
@ -1131,7 +1136,7 @@ def LoadAddr32Reg : LoadAddress<"la", mem, GPR32Opnd>;
|
||||
class LoadAddressImm<string instr_asm, Operand Od, RegisterOperand RO> :
|
||||
MipsAsmPseudoInst<(outs RO:$rt), (ins Od:$imm32),
|
||||
!strconcat(instr_asm, "\t$rt, $imm32")> ;
|
||||
def LoadAddr32Imm : LoadAddressImm<"la", shamt,GPR32Opnd>;
|
||||
def LoadAddr32Imm : LoadAddressImm<"la", uimm5, GPR32Opnd>;
|
||||
|
||||
|
||||
|
||||
|
@ -29,10 +29,6 @@ def uimm4 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
|
||||
def uimm6 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
|
||||
def uimm8 : Operand<i32> {
|
||||
let PrintMethod = "printUnsignedImm";
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user