mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 04:39:44 +00:00
[mips][sched] Split IIImul and IIImult into subclasses.
IIImul -> II_MUL IIImult -> II_MULT, II_MULTU, II_MADD, II_MADDU, II_MSUB, II_MSUBU, II_DMULT, II_DMULTU No functional change since the InstrItinData's have been duplicated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199495 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8821f3c6b2
commit
235a81cbbf
@ -106,9 +106,9 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in {
|
||||
def XOR_MM : MMRel, ArithLogicR<"xor", GPR32Opnd, 1, II_XOR, xor>,
|
||||
ADD_FM_MM<0, 0x310>;
|
||||
def NOR_MM : MMRel, LogicNOR<"nor", GPR32Opnd>, ADD_FM_MM<0, 0x2d0>;
|
||||
def MULT_MM : MMRel, Mult<"mult", IIImult, GPR32Opnd, [HI0, LO0]>,
|
||||
def MULT_MM : MMRel, Mult<"mult", II_MULT, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM_MM<0x22c>;
|
||||
def MULTu_MM : MMRel, Mult<"multu", IIImult, GPR32Opnd, [HI0, LO0]>,
|
||||
def MULTu_MM : MMRel, Mult<"multu", II_MULTU, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM_MM<0x26c>;
|
||||
def SDIV_MM : MMRel, Div<"div", IIIdiv, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM_MM<0x2ac>;
|
||||
@ -178,10 +178,10 @@ let DecoderNamespace = "MicroMips", Predicates = [InMicroMips] in {
|
||||
MFLO_FM_MM<0x075>;
|
||||
|
||||
/// Multiply Add/Sub Instructions
|
||||
def MADD_MM : MMRel, MArithR<"madd", 1>, MULT_FM_MM<0x32c>;
|
||||
def MADDU_MM : MMRel, MArithR<"maddu", 1>, MULT_FM_MM<0x36c>;
|
||||
def MSUB_MM : MMRel, MArithR<"msub">, MULT_FM_MM<0x3ac>;
|
||||
def MSUBU_MM : MMRel, MArithR<"msubu">, MULT_FM_MM<0x3ec>;
|
||||
def MADD_MM : MMRel, MArithR<"madd", II_MADD, 1>, MULT_FM_MM<0x32c>;
|
||||
def MADDU_MM : MMRel, MArithR<"maddu", II_MADDU, 1>, MULT_FM_MM<0x36c>;
|
||||
def MSUB_MM : MMRel, MArithR<"msub", II_MSUB>, MULT_FM_MM<0x3ac>;
|
||||
def MSUBU_MM : MMRel, MArithR<"msubu", II_MSUBU>, MULT_FM_MM<0x3ec>;
|
||||
|
||||
/// Count Leading
|
||||
def CLZ_MM : MMRel, CountLeading0<"clz", GPR32Opnd>, CLO_FM_MM<0x16c>;
|
||||
|
@ -167,14 +167,14 @@ def TAILCALL64_R : TailCallReg<GPR64Opnd, JR, GPR32Opnd>;
|
||||
}
|
||||
|
||||
/// Multiply and Divide Instructions.
|
||||
def DMULT : Mult<"dmult", IIImult, GPR64Opnd, [HI0_64, LO0_64]>,
|
||||
def DMULT : Mult<"dmult", II_DMULT, GPR64Opnd, [HI0_64, LO0_64]>,
|
||||
MULT_FM<0, 0x1c>;
|
||||
def DMULTu : Mult<"dmultu", IIImult, GPR64Opnd, [HI0_64, LO0_64]>,
|
||||
def DMULTu : Mult<"dmultu", II_DMULTU, GPR64Opnd, [HI0_64, LO0_64]>,
|
||||
MULT_FM<0, 0x1d>;
|
||||
def PseudoDMULT : MultDivPseudo<DMULT, ACC128, GPR64Opnd, MipsMult,
|
||||
IIImult>;
|
||||
II_DMULT>;
|
||||
def PseudoDMULTu : MultDivPseudo<DMULTu, ACC128, GPR64Opnd, MipsMultu,
|
||||
IIImult>;
|
||||
II_DMULTU>;
|
||||
def DSDIV : Div<"ddiv", IIIdiv, GPR64Opnd, [HI0_64, LO0_64]>, MULT_FM<0, 0x1e>;
|
||||
def DUDIV : Div<"ddivu", IIIdiv, GPR64Opnd, [HI0_64, LO0_64]>, MULT_FM<0, 0x1f>;
|
||||
def PseudoDSDIV : MultDivPseudo<DSDIV, ACC128, GPR64Opnd, MipsDivRem,
|
||||
|
@ -436,9 +436,9 @@ class ArithLogicI<string opstr, Operand Od, RegisterOperand RO,
|
||||
}
|
||||
|
||||
// Arithmetic Multiply ADD/SUB
|
||||
class MArithR<string opstr, bit isComm = 0> :
|
||||
class MArithR<string opstr, InstrItinClass itin, bit isComm = 0> :
|
||||
InstSE<(outs), (ins GPR32Opnd:$rs, GPR32Opnd:$rt),
|
||||
!strconcat(opstr, "\t$rs, $rt"), [], IIImult, FrmR, opstr> {
|
||||
!strconcat(opstr, "\t$rs, $rt"), [], itin, FrmR, opstr> {
|
||||
let Defs = [HI0, LO0];
|
||||
let Uses = [HI0, LO0];
|
||||
let isCommutable = isComm;
|
||||
@ -707,12 +707,13 @@ class MultDivPseudo<Instruction RealInst, RegisterClass R0, RegisterOperand R1,
|
||||
|
||||
// Pseudo multiply add/sub instruction with explicit accumulator register
|
||||
// operands.
|
||||
class MAddSubPseudo<Instruction RealInst, SDPatternOperator OpNode>
|
||||
class MAddSubPseudo<Instruction RealInst, SDPatternOperator OpNode,
|
||||
InstrItinClass itin>
|
||||
: PseudoSE<(outs ACC64:$ac),
|
||||
(ins GPR32Opnd:$rs, GPR32Opnd:$rt, ACC64:$acin),
|
||||
[(set ACC64:$ac,
|
||||
(OpNode GPR32Opnd:$rs, GPR32Opnd:$rt, ACC64:$acin))],
|
||||
IIImult>,
|
||||
itin>,
|
||||
PseudoInstExpansion<(RealInst GPR32Opnd:$rs, GPR32Opnd:$rt)> {
|
||||
string Constraints = "$acin = $ac";
|
||||
}
|
||||
@ -929,7 +930,7 @@ def ADDu : MMRel, ArithLogicR<"addu", GPR32Opnd, 1, II_ADDU, add>,
|
||||
def SUBu : MMRel, ArithLogicR<"subu", GPR32Opnd, 0, II_SUBU, sub>,
|
||||
ADD_FM<0, 0x23>;
|
||||
let Defs = [HI0, LO0] in
|
||||
def MUL : MMRel, ArithLogicR<"mul", GPR32Opnd, 1, IIImul, mul>,
|
||||
def MUL : MMRel, ArithLogicR<"mul", GPR32Opnd, 1, II_MUL, mul>,
|
||||
ADD_FM<0x1c, 2>;
|
||||
def ADD : MMRel, ArithLogicR<"add", GPR32Opnd>, ADD_FM<0, 0x20>;
|
||||
def SUB : MMRel, ArithLogicR<"sub", GPR32Opnd>, ADD_FM<0, 0x22>;
|
||||
@ -1069,9 +1070,9 @@ let Uses = [V0, V1], isTerminator = 1, isReturn = 1, isBarrier = 1 in {
|
||||
}
|
||||
|
||||
/// Multiply and Divide Instructions.
|
||||
def MULT : MMRel, Mult<"mult", IIImult, GPR32Opnd, [HI0, LO0]>,
|
||||
def MULT : MMRel, Mult<"mult", II_MULT, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM<0, 0x18>;
|
||||
def MULTu : MMRel, Mult<"multu", IIImult, GPR32Opnd, [HI0, LO0]>,
|
||||
def MULTu : MMRel, Mult<"multu", II_MULTU, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM<0, 0x19>;
|
||||
def SDIV : MMRel, Div<"div", IIIdiv, GPR32Opnd, [HI0, LO0]>,
|
||||
MULT_FM<0, 0x1a>;
|
||||
@ -1104,21 +1105,21 @@ def NOP : PseudoSE<(outs), (ins), []>, PseudoInstExpansion<(SLL ZERO, ZERO, 0)>;
|
||||
def LEA_ADDiu : MMRel, EffectiveAddress<"addiu", GPR32Opnd>, LW_FM<9>;
|
||||
|
||||
// MADD*/MSUB*
|
||||
def MADD : MMRel, MArithR<"madd", 1>, MULT_FM<0x1c, 0>;
|
||||
def MADDU : MMRel, MArithR<"maddu", 1>, MULT_FM<0x1c, 1>;
|
||||
def MSUB : MMRel, MArithR<"msub">, MULT_FM<0x1c, 4>;
|
||||
def MSUBU : MMRel, MArithR<"msubu">, MULT_FM<0x1c, 5>;
|
||||
def MADD : MMRel, MArithR<"madd", II_MADD, 1>, MULT_FM<0x1c, 0>;
|
||||
def MADDU : MMRel, MArithR<"maddu", II_MADDU, 1>, MULT_FM<0x1c, 1>;
|
||||
def MSUB : MMRel, MArithR<"msub", II_MSUB>, MULT_FM<0x1c, 4>;
|
||||
def MSUBU : MMRel, MArithR<"msubu", II_MSUBU>, MULT_FM<0x1c, 5>;
|
||||
|
||||
let Predicates = [HasStdEnc, NotDSP] in {
|
||||
def PseudoMULT : MultDivPseudo<MULT, ACC64, GPR32Opnd, MipsMult, IIImult>;
|
||||
def PseudoMULTu : MultDivPseudo<MULTu, ACC64, GPR32Opnd, MipsMultu, IIImult>;
|
||||
def PseudoMULT : MultDivPseudo<MULT, ACC64, GPR32Opnd, MipsMult, II_MULT>;
|
||||
def PseudoMULTu : MultDivPseudo<MULTu, ACC64, GPR32Opnd, MipsMultu, II_MULTU>;
|
||||
def PseudoMFHI : PseudoMFLOHI<GPR32, ACC64, MipsMFHI>;
|
||||
def PseudoMFLO : PseudoMFLOHI<GPR32, ACC64, MipsMFLO>;
|
||||
def PseudoMTLOHI : PseudoMTLOHI<ACC64, GPR32>;
|
||||
def PseudoMADD : MAddSubPseudo<MADD, MipsMAdd>;
|
||||
def PseudoMADDU : MAddSubPseudo<MADDU, MipsMAddu>;
|
||||
def PseudoMSUB : MAddSubPseudo<MSUB, MipsMSub>;
|
||||
def PseudoMSUBU : MAddSubPseudo<MSUBU, MipsMSubu>;
|
||||
def PseudoMADD : MAddSubPseudo<MADD, MipsMAdd, II_MADD>;
|
||||
def PseudoMADDU : MAddSubPseudo<MADDU, MipsMAddu, II_MADDU>;
|
||||
def PseudoMSUB : MAddSubPseudo<MSUB, MipsMSub, II_MSUB>;
|
||||
def PseudoMSUBU : MAddSubPseudo<MSUBU, MipsMSubu, II_MSUBU>;
|
||||
}
|
||||
|
||||
def PseudoSDIV : MultDivPseudo<SDIV, ACC64, GPR32Opnd, MipsDivRem, IIIdiv,
|
||||
|
@ -20,8 +20,6 @@ def IIAlu : InstrItinClass;
|
||||
def IILoad : InstrItinClass;
|
||||
def IIStore : InstrItinClass;
|
||||
def IIBranch : InstrItinClass;
|
||||
def IIImul : InstrItinClass;
|
||||
def IIImult : InstrItinClass;
|
||||
def IIIdiv : InstrItinClass;
|
||||
def IIslt : InstrItinClass;
|
||||
def IIFcvt : InstrItinClass;
|
||||
@ -49,6 +47,8 @@ def II_CLO : InstrItinClass;
|
||||
def II_CLZ : InstrItinClass;
|
||||
def II_DADDIU : InstrItinClass;
|
||||
def II_DADDU : InstrItinClass;
|
||||
def II_DMULT : InstrItinClass;
|
||||
def II_DMULTU : InstrItinClass;
|
||||
def II_DROTR : InstrItinClass;
|
||||
def II_DROTR32 : InstrItinClass;
|
||||
def II_DROTRV : InstrItinClass;
|
||||
@ -63,12 +63,19 @@ def II_DSRL32 : InstrItinClass;
|
||||
def II_DSRLV : InstrItinClass;
|
||||
def II_DSUBU : InstrItinClass;
|
||||
def II_LUI : InstrItinClass;
|
||||
def II_MADD : InstrItinClass;
|
||||
def II_MADDU : InstrItinClass;
|
||||
def II_MFHI_MFLO : InstrItinClass; // mfhi and mflo
|
||||
def II_MTHI_MTLO : InstrItinClass; // mthi and mtlo
|
||||
def II_MOVF : InstrItinClass;
|
||||
def II_MOVN : InstrItinClass;
|
||||
def II_MOVT : InstrItinClass;
|
||||
def II_MOVZ : InstrItinClass;
|
||||
def II_MUL : InstrItinClass;
|
||||
def II_MULT : InstrItinClass;
|
||||
def II_MULTU : InstrItinClass;
|
||||
def II_MSUB : InstrItinClass;
|
||||
def II_MSUBU : InstrItinClass;
|
||||
def II_NOR : InstrItinClass;
|
||||
def II_OR : InstrItinClass;
|
||||
def II_ORI : InstrItinClass;
|
||||
@ -133,10 +140,17 @@ def MipsGenericItineraries : ProcessorItineraries<[ALU, IMULDIV], [], [
|
||||
InstrItinData<IILoad , [InstrStage<3, [ALU]>]>,
|
||||
InstrItinData<IIStore , [InstrStage<1, [ALU]>]>,
|
||||
InstrItinData<IIBranch , [InstrStage<1, [ALU]>]>,
|
||||
InstrItinData<II_DMULT , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_DMULTU , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MADD , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MADDU , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MFHI_MFLO , [InstrStage<1, [IMULDIV]>]>,
|
||||
InstrItinData<II_MSUB , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MSUBU , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MTHI_MTLO , [InstrStage<1, [IMULDIV]>]>,
|
||||
InstrItinData<IIImul , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<IIImult , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MUL , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MULT , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<II_MULTU , [InstrStage<17, [IMULDIV]>]>,
|
||||
InstrItinData<IIIdiv , [InstrStage<38, [IMULDIV]>]>,
|
||||
InstrItinData<IIFcvt , [InstrStage<1, [ALU]>]>,
|
||||
InstrItinData<IIFmove , [InstrStage<2, [ALU]>]>,
|
||||
|
Loading…
Reference in New Issue
Block a user