85 lines
4.2 KiB
TableGen
85 lines
4.2 KiB
TableGen
include "FootInstrFormats.td"
|
|
|
|
def Footcall : SDNode<"FootISD::CALL",
|
|
SDTypeProfile<0, -1, [SDTCisPtrTy<0>]>,
|
|
[SDNPHasChain, SDNPOptInGlue, SDNPOutGlue,
|
|
SDNPVariadic]>;
|
|
|
|
def Footcallseq_start : SDNode<"ISD::CALLSEQ_START",
|
|
SDCallSeqStart<[SDTCisVT<0, i32>,
|
|
SDTCisVT<0, i32>]>,
|
|
[SDNPHasChain, SDNPOutGlue]>;
|
|
|
|
def Footcallseq_end : SDNode<"ISD::CALLSEQ_END",
|
|
SDCallSeqStart<[SDTCisVT<0, i32>,
|
|
SDTCisVT<0, i32>]>,
|
|
[SDNPHasChain, SDNPOutGlue]>;
|
|
|
|
let mayLoad = 1, mayStore = 1, hasSideEffects = 1 in {
|
|
defm CNST_M : FootInstructionA<"CNST.m", "$dst, $imm", 0b0000, 0b00, (outs GP32:$dst), (ins i16imm:$imm)>;
|
|
defm CNST_D : FootInstructionA<"CNST.d", "$dst, $imm", 0b0000, 0b01, (outs GP32:$dst), (ins i16imm:$imm)>;
|
|
defm CNST_I : FootInstructionA<"CNST.i", "$dst, $imm", 0b0000, 0b10, (outs GP32:$dst), (ins i16imm:$imm)>;
|
|
defm CNST_A : FootInstructionA<"CNST.a", "$dst, $imm", 0b0000, 0b11, (outs GP32:$dst), (ins i16imm:$imm)>;
|
|
|
|
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
|
|
defm CNST_JMP_D : FootInstructionA<"CNST.d", "$dst, $imm", 0b0000, 0b01, (outs), (ins PC32:$dst, i16imm:$imm)>;
|
|
}
|
|
defm CNST_STR_I : FootInstructionA<"CNST.i", "$dst, $imm", 0b0000, 0b10, (outs), (ins GP32:$dst, i16imm:$imm)>;
|
|
|
|
defm CMPR : FootInstructionB<"CMPR", 0b00000000, (outs), (ins GP32:$dst, GP32:$a)>;
|
|
defm BWNG : FootInstructionB<"BWNG", 0b00000001, (outs GP32:$dst), (ins GP32:$a)>;
|
|
defm ARNG : FootInstructionB<"ARNG", 0b00000010, (outs GP32:$dst), (ins GP32:$a)>;
|
|
defm LONG : FootInstructionB<"LONG", 0b00000011, (outs GP32:$dst), (ins GP32:$a)>;
|
|
defm CONF : FootInstructionB<"CONF", 0b00000100, (outs GP32:$dst), (ins GP32:$a)>;
|
|
defm COPY : FootInstructionB<"COPY", 0b00000101, (outs GP32:$dst), (ins GP32:$a)>;
|
|
|
|
defm BWOR : FootInstructionC<"BWOR", 0b0010, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm BAND : FootInstructionC<"BAND", 0b0011, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm BXOR : FootInstructionC<"BXOR", 0b0100, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm ZRSH : FootInstructionC<"ZRSH", 0b0101, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm SRSH : FootInstructionC<"SRSH", 0b0110, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm ZLSH : FootInstructionC<"ZLSH", 0b0111, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm CLSH : FootInstructionC<"CLSH", 0b1000, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm ADDI : FootInstructionC<"ADDI", 0b1001, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm SUBT : FootInstructionC<"SUBT", 0b1010, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm MULT : FootInstructionC<"MULT", 0b1011, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm DIVI : FootInstructionC<"DIVI", 0b1100, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
defm MODU : FootInstructionC<"MODU", 0b1101, (outs GP32:$dst), (ins GP32:$a, GP32:$b)>;
|
|
|
|
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
|
|
defm BWOR_JMP : FootInstructionC<"BWOR", 0b0010, (outs), (ins PC32:$dst, GP32:$a, GP32:$b)>;
|
|
defm ADDI_JMP : FootInstructionC<"ADDI", 0b0010, (outs), (ins PC32:$dst, GP32:$a, GP32:$b)>;
|
|
}
|
|
|
|
defm BWOR_STR : FootInstructionC<"BWOR", 0b0010, (outs), (ins GP32:$dst, GP32:$a, GP32:$b)>;
|
|
defm ADDI_STR : FootInstructionC<"ADDI", 0b1001, (outs), (ins GP32:$dst, GP32:$a, GP32:$b)>;
|
|
}
|
|
|
|
let OutOperandList = (outs),
|
|
InOperandList = (ins),
|
|
isReturn = 1,
|
|
isTerminator = 1,
|
|
isBarrier = 1,
|
|
Namespace = "Foot" in {
|
|
def PSEUDO_RET : StandardPseudoInstruction;
|
|
}
|
|
|
|
let OutOperandList = (outs GP32:$dst),
|
|
InOperandList = (ins GP32:$a, GP32:$b, GP32:$iftrue, GP32:$iffalse, i16imm:$cc),
|
|
usesCustomInserter = 1,
|
|
Namespace = "Foot" in {
|
|
def PSEUDO_SELECT : StandardPseudoInstruction;
|
|
}
|
|
|
|
let Defs = [RSP], Uses = [RSP],
|
|
isCodeGenOnly = 1, Namespace = "Foot",
|
|
OutOperandList = (outs),
|
|
InOperandList = (ins i32imm:$amt1, i32imm:$amt2) in {
|
|
def ADJCALLSTACKDOWN : StandardPseudoInstruction {
|
|
let Pattern = [(Footcallseq_start timm:$amt1, timm:$amt2)];
|
|
}
|
|
def ADJCALLSTACKUP : StandardPseudoInstruction {
|
|
let Pattern = [(Footcallseq_end timm:$amt1, timm:$amt2)];
|
|
}
|
|
}
|