mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-04 16:47:41 +00:00
[mips] Refactor jump, jump register, jump-and-link and nop instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170952 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0a57dc1d14
commit
6a8309e62a
@ -164,7 +164,7 @@ let Predicates = [IsN64, HasStdEnc], isCodeGenOnly = 1 in {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Jump and Branch Instructions
|
/// Jump and Branch Instructions
|
||||||
def JR64 : IndirectBranch<CPU64Regs>;
|
def JR64 : IndirectBranch<CPU64Regs>, MTLO_FM<8>;
|
||||||
def BEQ64 : CBranch<"beq", seteq, CPU64Regs>, BEQ_FM<4>;
|
def BEQ64 : CBranch<"beq", seteq, CPU64Regs>, BEQ_FM<4>;
|
||||||
def BNE64 : CBranch<"bne", setne, CPU64Regs>, BEQ_FM<5>;
|
def BNE64 : CBranch<"bne", setne, CPU64Regs>, BEQ_FM<5>;
|
||||||
def BGEZ64 : CBranchZero<"bgez", setge, CPU64Regs>, BGEZ_FM<1, 1>;
|
def BGEZ64 : CBranchZero<"bgez", setge, CPU64Regs>, BGEZ_FM<1, 1>;
|
||||||
@ -173,8 +173,8 @@ def BLEZ64 : CBranchZero<"blez", setle, CPU64Regs>, BGEZ_FM<6, 0>;
|
|||||||
def BLTZ64 : CBranchZero<"bltz", setlt, CPU64Regs>, BGEZ_FM<1, 0>;
|
def BLTZ64 : CBranchZero<"bltz", setlt, CPU64Regs>, BGEZ_FM<1, 0>;
|
||||||
}
|
}
|
||||||
let DecoderNamespace = "Mips64" in
|
let DecoderNamespace = "Mips64" in
|
||||||
def JALR64 : JumpLinkReg<0x00, 0x09, "jalr", CPU64Regs>;
|
def JALR64 : JumpLinkReg<"jalr", CPU64Regs>, JALR_FM;
|
||||||
def TAILCALL64_R : JumpFR<CPU64Regs, MipsTailCall>, IsTailCall;
|
def TAILCALL64_R : JumpFR<CPU64Regs, MipsTailCall>, MTLO_FM<8>, IsTailCall;
|
||||||
|
|
||||||
let DecoderNamespace = "Mips64" in {
|
let DecoderNamespace = "Mips64" in {
|
||||||
/// Multiply and Divide Instructions.
|
/// Multiply and Divide Instructions.
|
||||||
|
@ -163,14 +163,14 @@ class BranchBase<bits<6> op, dag outs, dag ins, string asmstr,
|
|||||||
// Format J instruction class in Mips : <|opcode|address|>
|
// Format J instruction class in Mips : <|opcode|address|>
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
class FJ<bits<6> op, dag outs, dag ins, string asmstr, list<dag> pattern,
|
class FJ<bits<6> op>
|
||||||
InstrItinClass itin>: InstSE<outs, ins, asmstr, pattern, itin, FrmJ>
|
|
||||||
{
|
{
|
||||||
bits<26> addr;
|
bits<26> target;
|
||||||
|
|
||||||
let Opcode = op;
|
bits<32> Inst;
|
||||||
|
|
||||||
let Inst{25-0} = addr;
|
let Inst{31-26} = op;
|
||||||
|
let Inst{25-0} = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -368,6 +368,25 @@ class LUI_FM {
|
|||||||
let Inst{15-0} = imm16;
|
let Inst{15-0} = imm16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NOP_FM {
|
||||||
|
bits<32> Inst;
|
||||||
|
|
||||||
|
let Inst{31-0} = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
class JALR_FM {
|
||||||
|
bits<5> rs;
|
||||||
|
|
||||||
|
bits<32> Inst;
|
||||||
|
|
||||||
|
let Inst{31-26} = 0;
|
||||||
|
let Inst{25-21} = rs;
|
||||||
|
let Inst{20-16} = 0;
|
||||||
|
let Inst{15-11} = 31;
|
||||||
|
let Inst{10-6} = 0;
|
||||||
|
let Inst{5-0} = 9;
|
||||||
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// FLOATING POINT INSTRUCTION FORMATS
|
// FLOATING POINT INSTRUCTION FORMATS
|
||||||
|
@ -506,10 +506,10 @@ class SetCC_I<string opstr, PatFrag cond_op, Operand Od, PatLeaf imm_type,
|
|||||||
[(set CPURegs:$rt, (cond_op RC:$rs, imm_type:$imm16))], IIAlu, FrmI>;
|
[(set CPURegs:$rt, (cond_op RC:$rs, imm_type:$imm16))], IIAlu, FrmI>;
|
||||||
|
|
||||||
// Jump
|
// Jump
|
||||||
class JumpFJ<bits<6> op, DAGOperand opnd, string instr_asm,
|
class JumpFJ<DAGOperand opnd, string opstr, SDPatternOperator operator,
|
||||||
SDPatternOperator operator, SDPatternOperator targetoperator>:
|
SDPatternOperator targetoperator> :
|
||||||
FJ<op, (outs), (ins opnd:$target), !strconcat(instr_asm, "\t$target"),
|
InstSE<(outs), (ins opnd:$target), !strconcat(opstr, "\t$target"),
|
||||||
[(operator targetoperator:$target)], IIBranch> {
|
[(operator targetoperator:$target)], IIBranch, FrmJ> {
|
||||||
let isTerminator=1;
|
let isTerminator=1;
|
||||||
let isBarrier=1;
|
let isBarrier=1;
|
||||||
let hasDelaySlot = 1;
|
let hasDelaySlot = 1;
|
||||||
@ -532,11 +532,7 @@ class UncondBranch<string opstr> :
|
|||||||
// Base class for indirect branch and return instruction classes.
|
// Base class for indirect branch and return instruction classes.
|
||||||
let isTerminator=1, isBarrier=1, hasDelaySlot = 1 in
|
let isTerminator=1, isBarrier=1, hasDelaySlot = 1 in
|
||||||
class JumpFR<RegisterClass RC, SDPatternOperator operator = null_frag>:
|
class JumpFR<RegisterClass RC, SDPatternOperator operator = null_frag>:
|
||||||
FR<0, 0x8, (outs), (ins RC:$rs), "jr\t$rs", [(operator RC:$rs)], IIBranch> {
|
InstSE<(outs), (ins RC:$rs), "jr\t$rs", [(operator RC:$rs)], IIBranch, FrmR>;
|
||||||
let rt = 0;
|
|
||||||
let rd = 0;
|
|
||||||
let shamt = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indirect branch
|
// Indirect branch
|
||||||
class IndirectBranch<RegisterClass RC>: JumpFR<RC, brind> {
|
class IndirectBranch<RegisterClass RC>: JumpFR<RC, brind> {
|
||||||
@ -554,22 +550,16 @@ class RetBase<RegisterClass RC>: JumpFR<RC> {
|
|||||||
|
|
||||||
// Jump and Link (Call)
|
// Jump and Link (Call)
|
||||||
let isCall=1, hasDelaySlot=1, Defs = [RA] in {
|
let isCall=1, hasDelaySlot=1, Defs = [RA] in {
|
||||||
class JumpLink<bits<6> op, string instr_asm>:
|
class JumpLink<string opstr> :
|
||||||
FJ<op, (outs), (ins calltarget:$target),
|
InstSE<(outs), (ins calltarget:$target), !strconcat(opstr, "\t$target"),
|
||||||
!strconcat(instr_asm, "\t$target"), [(MipsJmpLink imm:$target)],
|
[(MipsJmpLink imm:$target)], IIBranch, FrmJ> {
|
||||||
IIBranch> {
|
let DecoderMethod = "DecodeJumpTarget";
|
||||||
let DecoderMethod = "DecodeJumpTarget";
|
|
||||||
}
|
|
||||||
|
|
||||||
class JumpLinkReg<bits<6> op, bits<6> func, string instr_asm,
|
|
||||||
RegisterClass RC>:
|
|
||||||
FR<op, func, (outs), (ins RC:$rs),
|
|
||||||
!strconcat(instr_asm, "\t$rs"), [(MipsJmpLink RC:$rs)], IIBranch> {
|
|
||||||
let rt = 0;
|
|
||||||
let rd = 31;
|
|
||||||
let shamt = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class JumpLinkReg<string opstr, RegisterClass RC>:
|
||||||
|
InstSE<(outs), (ins RC:$rs), !strconcat(opstr, "\t$rs"),
|
||||||
|
[(MipsJmpLink RC:$rs)], IIBranch, FrmR>;
|
||||||
|
|
||||||
class BranchLink<string instr_asm, bits<5> _rt, RegisterClass RC>:
|
class BranchLink<string instr_asm, bits<5> _rt, RegisterClass RC>:
|
||||||
FI<0x1, (outs), (ins RC:$rs, brtarget:$imm16),
|
FI<0x1, (outs), (ins RC:$rs, brtarget:$imm16),
|
||||||
!strconcat(instr_asm, "\t$rs, $imm16"), [], IIBranch> {
|
!strconcat(instr_asm, "\t$rs, $imm16"), [], IIBranch> {
|
||||||
@ -858,9 +848,9 @@ let Predicates = [IsN64, HasStdEnc], DecoderNamespace = "Mips64" in {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Jump and Branch Instructions
|
/// Jump and Branch Instructions
|
||||||
def J : JumpFJ<0x02, jmptarget, "j", br, bb>,
|
def J : JumpFJ<jmptarget, "j", br, bb>, FJ<2>,
|
||||||
Requires<[RelocStatic, HasStdEnc]>, IsBranch;
|
Requires<[RelocStatic, HasStdEnc]>, IsBranch;
|
||||||
def JR : IndirectBranch<CPURegs>;
|
def JR : IndirectBranch<CPURegs>, MTLO_FM<8>;
|
||||||
def B : UncondBranch<"b">, B_FM;
|
def B : UncondBranch<"b">, B_FM;
|
||||||
def BEQ : CBranch<"beq", seteq, CPURegs>, BEQ_FM<4>;
|
def BEQ : CBranch<"beq", seteq, CPURegs>, BEQ_FM<4>;
|
||||||
def BNE : CBranch<"bne", setne, CPURegs>, BEQ_FM<5>;
|
def BNE : CBranch<"bne", setne, CPURegs>, BEQ_FM<5>;
|
||||||
@ -873,14 +863,14 @@ let rt = 0, rs = 0, isBranch = 1, isTerminator = 1, isBarrier = 1,
|
|||||||
hasDelaySlot = 1, Defs = [RA] in
|
hasDelaySlot = 1, Defs = [RA] in
|
||||||
def BAL_BR: FI<0x1, (outs), (ins brtarget:$imm16), "bal\t$imm16", [], IIBranch>;
|
def BAL_BR: FI<0x1, (outs), (ins brtarget:$imm16), "bal\t$imm16", [], IIBranch>;
|
||||||
|
|
||||||
def JAL : JumpLink<0x03, "jal">;
|
def JAL : JumpLink<"jal">, FJ<3>;
|
||||||
def JALR : JumpLinkReg<0x00, 0x09, "jalr", CPURegs>;
|
def JALR : JumpLinkReg<"jalr", CPURegs>, JALR_FM;
|
||||||
def BGEZAL : BranchLink<"bgezal", 0x11, CPURegs>;
|
def BGEZAL : BranchLink<"bgezal", 0x11, CPURegs>;
|
||||||
def BLTZAL : BranchLink<"bltzal", 0x10, CPURegs>;
|
def BLTZAL : BranchLink<"bltzal", 0x10, CPURegs>;
|
||||||
def TAILCALL : JumpFJ<0x02, calltarget, "j", MipsTailCall, imm>, IsTailCall;
|
def TAILCALL : JumpFJ<calltarget, "j", MipsTailCall, imm>, FJ<2>, IsTailCall;
|
||||||
def TAILCALL_R : JumpFR<CPURegs, MipsTailCall>, IsTailCall;
|
def TAILCALL_R : JumpFR<CPURegs, MipsTailCall>, MTLO_FM<8>, IsTailCall;
|
||||||
|
|
||||||
def RET : RetBase<CPURegs>;
|
def RET : RetBase<CPURegs>, MTLO_FM<8>;
|
||||||
|
|
||||||
/// Multiply and Divide Instructions.
|
/// Multiply and Divide Instructions.
|
||||||
def MULT : Mult32<0x18, "mult", IIImul>;
|
def MULT : Mult32<0x18, "mult", IIImul>;
|
||||||
@ -904,9 +894,9 @@ def CLO : CountLeading1<"clo", CPURegs>, CLO_FM<0x21>;
|
|||||||
/// Word Swap Bytes Within Halfwords
|
/// Word Swap Bytes Within Halfwords
|
||||||
def WSBH : SubwordSwap<0x20, 0x2, "wsbh", CPURegs>;
|
def WSBH : SubwordSwap<0x20, 0x2, "wsbh", CPURegs>;
|
||||||
|
|
||||||
/// No operation
|
/// No operation.
|
||||||
let addr=0 in
|
/// FIXME: NOP should be an alias of "sll $0, $0, 0".
|
||||||
def NOP : FJ<0, (outs), (ins), "nop", [], IIAlu>;
|
def NOP : InstSE<(outs), (ins), "nop", [], IIAlu, FrmJ>, NOP_FM;
|
||||||
|
|
||||||
// FrameIndexes are legalized when they are operands from load/store
|
// FrameIndexes are legalized when they are operands from load/store
|
||||||
// instructions. The same not happens for stack address copies, so an
|
// instructions. The same not happens for stack address copies, so an
|
||||||
|
Loading…
x
Reference in New Issue
Block a user