mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[RISCV] Add scheduler classes for the Zba and Zbb extensions.
I've used IALU for the simplest operations from Zbb: min, minu, max, maxu, sext.b, sext.h, zext.h, andn, orn, xnor I've put add.uw in IALU32 and slli.uw in ShiftImm32. Remaining instructions have received new classes. All 3 sh*add are grouped together. sh*add.uw are grouped together. Rotate left and right are together. Everything else got their own class containing one instruction. I think what I have here is the minimum granularity we need. I could be convinced that we need more classes. Reviewed By: evandro Differential Revision: https://reviews.llvm.org/D99040
This commit is contained in:
parent
859df511df
commit
e856ce428c
@ -170,20 +170,28 @@ class RVBTernaryImm5<bits<2> funct2, bits<3> funct3_b, RISCVOpcode opcode,
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbbOrZbp] in {
|
let Predicates = [HasStdExtZbbOrZbp] in {
|
||||||
def ANDN : ALU_rr<0b0100000, 0b111, "andn">, Sched<[]>;
|
def ANDN : ALU_rr<0b0100000, 0b111, "andn">,
|
||||||
def ORN : ALU_rr<0b0100000, 0b110, "orn">, Sched<[]>;
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
def XNOR : ALU_rr<0b0100000, 0b100, "xnor">, Sched<[]>;
|
def ORN : ALU_rr<0b0100000, 0b110, "orn">,
|
||||||
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
|
def XNOR : ALU_rr<0b0100000, 0b100, "xnor">,
|
||||||
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
} // Predicates = [HasStdExtZbbOrZbp]
|
} // Predicates = [HasStdExtZbbOrZbp]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZba] in {
|
let Predicates = [HasStdExtZba] in {
|
||||||
def SH1ADD : ALU_rr<0b0010000, 0b010, "sh1add">, Sched<[]>;
|
def SH1ADD : ALU_rr<0b0010000, 0b010, "sh1add">,
|
||||||
def SH2ADD : ALU_rr<0b0010000, 0b100, "sh2add">, Sched<[]>;
|
Sched<[WriteSHXADD, ReadSHXADD, ReadSHXADD]>;
|
||||||
def SH3ADD : ALU_rr<0b0010000, 0b110, "sh3add">, Sched<[]>;
|
def SH2ADD : ALU_rr<0b0010000, 0b100, "sh2add">,
|
||||||
|
Sched<[WriteSHXADD, ReadSHXADD, ReadSHXADD]>;
|
||||||
|
def SH3ADD : ALU_rr<0b0010000, 0b110, "sh3add">,
|
||||||
|
Sched<[WriteSHXADD, ReadSHXADD, ReadSHXADD]>;
|
||||||
} // Predicates = [HasStdExtZba]
|
} // Predicates = [HasStdExtZba]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbbOrZbp] in {
|
let Predicates = [HasStdExtZbbOrZbp] in {
|
||||||
def ROL : ALU_rr<0b0110000, 0b001, "rol">, Sched<[]>;
|
def ROL : ALU_rr<0b0110000, 0b001, "rol">,
|
||||||
def ROR : ALU_rr<0b0110000, 0b101, "ror">, Sched<[]>;
|
Sched<[WriteRotateReg, ReadRotateReg, ReadRotateReg]>;
|
||||||
|
def ROR : ALU_rr<0b0110000, 0b101, "ror">,
|
||||||
|
Sched<[WriteRotateReg, ReadRotateReg, ReadRotateReg]>;
|
||||||
} // Predicates = [HasStdExtZbbOrZbp]
|
} // Predicates = [HasStdExtZbbOrZbp]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbs] in {
|
let Predicates = [HasStdExtZbs] in {
|
||||||
@ -205,7 +213,8 @@ def XPERMH : ALU_rr<0b0010100, 0b110, "xperm.h">, Sched<[]>;
|
|||||||
} // Predicates = [HasStdExtZbp]
|
} // Predicates = [HasStdExtZbp]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbbOrZbp] in
|
let Predicates = [HasStdExtZbbOrZbp] in
|
||||||
def RORI : RVBShift_ri<0b01100, 0b101, OPC_OP_IMM, "rori">, Sched<[]>;
|
def RORI : RVBShift_ri<0b01100, 0b101, OPC_OP_IMM, "rori">,
|
||||||
|
Sched<[WriteRotateImm, ReadRotateImm]>;
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbs] in {
|
let Predicates = [HasStdExtZbs] in {
|
||||||
def BCLRI : RVBShift_ri<0b01001, 0b001, OPC_OP_IMM, "bclri">, Sched<[]>;
|
def BCLRI : RVBShift_ri<0b01001, 0b001, OPC_OP_IMM, "bclri">, Sched<[]>;
|
||||||
@ -234,11 +243,11 @@ def FSRI : RVBTernaryImm6<0b101, OPC_OP_IMM, "fsri",
|
|||||||
|
|
||||||
let Predicates = [HasStdExtZbb] in {
|
let Predicates = [HasStdExtZbb] in {
|
||||||
def CLZ : RVBUnary<0b0110000, 0b00000, 0b001, RISCVOpcode<0b0010011>, "clz">,
|
def CLZ : RVBUnary<0b0110000, 0b00000, 0b001, RISCVOpcode<0b0010011>, "clz">,
|
||||||
Sched<[]>;
|
Sched<[WriteCLZ, ReadCLZ]>;
|
||||||
def CTZ : RVBUnary<0b0110000, 0b00001, 0b001, RISCVOpcode<0b0010011>, "ctz">,
|
def CTZ : RVBUnary<0b0110000, 0b00001, 0b001, RISCVOpcode<0b0010011>, "ctz">,
|
||||||
Sched<[]>;
|
Sched<[WriteCTZ, ReadCTZ]>;
|
||||||
def CPOP : RVBUnary<0b0110000, 0b00010, 0b001, RISCVOpcode<0b0010011>, "cpop">,
|
def CPOP : RVBUnary<0b0110000, 0b00010, 0b001, RISCVOpcode<0b0010011>, "cpop">,
|
||||||
Sched<[]>;
|
Sched<[WriteCPOP, ReadCPOP]>;
|
||||||
} // Predicates = [HasStdExtZbb]
|
} // Predicates = [HasStdExtZbb]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbm, IsRV64] in
|
let Predicates = [HasStdExtZbm, IsRV64] in
|
||||||
@ -247,9 +256,9 @@ def BMATFLIP : RVBUnary<0b0110000, 0b00011, 0b001, RISCVOpcode<0b0010011>,
|
|||||||
|
|
||||||
let Predicates = [HasStdExtZbb] in {
|
let Predicates = [HasStdExtZbb] in {
|
||||||
def SEXTB : RVBUnary<0b0110000, 0b00100, 0b001, RISCVOpcode<0b0010011>,
|
def SEXTB : RVBUnary<0b0110000, 0b00100, 0b001, RISCVOpcode<0b0010011>,
|
||||||
"sext.b">, Sched<[]>;
|
"sext.b">, Sched<[WriteIALU, ReadIALU]>;
|
||||||
def SEXTH : RVBUnary<0b0110000, 0b00101, 0b001, RISCVOpcode<0b0010011>,
|
def SEXTH : RVBUnary<0b0110000, 0b00101, 0b001, RISCVOpcode<0b0010011>,
|
||||||
"sext.h">, Sched<[]>;
|
"sext.h">, Sched<[WriteIALU, ReadIALU]>;
|
||||||
} // Predicates = [HasStdExtZbb]
|
} // Predicates = [HasStdExtZbb]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbr] in {
|
let Predicates = [HasStdExtZbr] in {
|
||||||
@ -285,10 +294,14 @@ def CLMULH : ALU_rr<0b0000101, 0b011, "clmulh">, Sched<[]>;
|
|||||||
} // Predicates = [HasStdExtZbc]
|
} // Predicates = [HasStdExtZbc]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbb] in {
|
let Predicates = [HasStdExtZbb] in {
|
||||||
def MIN : ALU_rr<0b0000101, 0b100, "min">, Sched<[]>;
|
def MIN : ALU_rr<0b0000101, 0b100, "min">,
|
||||||
def MINU : ALU_rr<0b0000101, 0b101, "minu">, Sched<[]>;
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
def MAX : ALU_rr<0b0000101, 0b110, "max">, Sched<[]>;
|
def MINU : ALU_rr<0b0000101, 0b101, "minu">,
|
||||||
def MAXU : ALU_rr<0b0000101, 0b111, "maxu">, Sched<[]>;
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
|
def MAX : ALU_rr<0b0000101, 0b110, "max">,
|
||||||
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
|
def MAXU : ALU_rr<0b0000101, 0b111, "maxu">,
|
||||||
|
Sched<[WriteIALU, ReadIALU, ReadIALU]>;
|
||||||
} // Predicates = [HasStdExtZbb]
|
} // Predicates = [HasStdExtZbb]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbp] in {
|
let Predicates = [HasStdExtZbp] in {
|
||||||
@ -323,16 +336,23 @@ def UNSHFLI : RVBShfl_ri<0b000010, 0b101, OPC_OP_IMM, "unshfli">, Sched<[]>;
|
|||||||
} // Predicates = [HasStdExtZbp]
|
} // Predicates = [HasStdExtZbp]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZba, IsRV64] in {
|
let Predicates = [HasStdExtZba, IsRV64] in {
|
||||||
def SLLIUW : RVBShift_ri<0b00001, 0b001, OPC_OP_IMM_32, "slli.uw">, Sched<[]>;
|
def SLLIUW : RVBShift_ri<0b00001, 0b001, OPC_OP_IMM_32, "slli.uw">,
|
||||||
def ADDUW : ALUW_rr<0b0000100, 0b000, "add.uw">, Sched<[]>;
|
Sched<[WriteShiftImm32, ReadShiftImm32]>;
|
||||||
def SH1ADDUW : ALUW_rr<0b0010000, 0b010, "sh1add.uw">, Sched<[]>;
|
def ADDUW : ALUW_rr<0b0000100, 0b000, "add.uw">,
|
||||||
def SH2ADDUW : ALUW_rr<0b0010000, 0b100, "sh2add.uw">, Sched<[]>;
|
Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
|
||||||
def SH3ADDUW : ALUW_rr<0b0010000, 0b110, "sh3add.uw">, Sched<[]>;
|
def SH1ADDUW : ALUW_rr<0b0010000, 0b010, "sh1add.uw">,
|
||||||
|
Sched<[WriteSHXADD32, ReadSHXADD32, ReadSHXADD32]>;
|
||||||
|
def SH2ADDUW : ALUW_rr<0b0010000, 0b100, "sh2add.uw">,
|
||||||
|
Sched<[WriteSHXADD32, ReadSHXADD32, ReadSHXADD32]>;
|
||||||
|
def SH3ADDUW : ALUW_rr<0b0010000, 0b110, "sh3add.uw">,
|
||||||
|
Sched<[WriteSHXADD32, ReadSHXADD32, ReadSHXADD32]>;
|
||||||
} // Predicates = [HasStdExtZbb, IsRV64]
|
} // Predicates = [HasStdExtZbb, IsRV64]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
||||||
def ROLW : ALUW_rr<0b0110000, 0b001, "rolw">, Sched<[]>;
|
def ROLW : ALUW_rr<0b0110000, 0b001, "rolw">,
|
||||||
def RORW : ALUW_rr<0b0110000, 0b101, "rorw">, Sched<[]>;
|
Sched<[WriteRotateReg32, ReadRotateReg32, ReadRotateReg32]>;
|
||||||
|
def RORW : ALUW_rr<0b0110000, 0b101, "rorw">,
|
||||||
|
Sched<[WriteRotateReg32, ReadRotateReg32, ReadRotateReg32]>;
|
||||||
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbs, IsRV64] in {
|
let Predicates = [HasStdExtZbs, IsRV64] in {
|
||||||
@ -354,7 +374,8 @@ def XPERMW : ALU_rr<0b0010100, 0b000, "xperm.w">, Sched<[]>;
|
|||||||
} // Predicates = [HasStdExtZbp, IsRV64]
|
} // Predicates = [HasStdExtZbp, IsRV64]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in
|
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in
|
||||||
def RORIW : RVBShiftW_ri<0b0110000, 0b101, OPC_OP_IMM_32, "roriw">, Sched<[]>;
|
def RORIW : RVBShiftW_ri<0b0110000, 0b101, OPC_OP_IMM_32, "roriw">,
|
||||||
|
Sched<[WriteRotateImm32, ReadRotateImm32]>;
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbs, IsRV64] in {
|
let Predicates = [HasStdExtZbs, IsRV64] in {
|
||||||
// NOTE: These instructions have been removed from the 0.94 spec. As a result
|
// NOTE: These instructions have been removed from the 0.94 spec. As a result
|
||||||
@ -383,11 +404,11 @@ def FSRIW : RVBTernaryImm5<0b10, 0b101, OPC_OP_IMM_32,
|
|||||||
|
|
||||||
let Predicates = [HasStdExtZbb, IsRV64] in {
|
let Predicates = [HasStdExtZbb, IsRV64] in {
|
||||||
def CLZW : RVBUnary<0b0110000, 0b00000, 0b001, RISCVOpcode<0b0011011>,
|
def CLZW : RVBUnary<0b0110000, 0b00000, 0b001, RISCVOpcode<0b0011011>,
|
||||||
"clzw">, Sched<[]>;
|
"clzw">, Sched<[WriteCLZ32, ReadCLZ32]>;
|
||||||
def CTZW : RVBUnary<0b0110000, 0b00001, 0b001, RISCVOpcode<0b0011011>,
|
def CTZW : RVBUnary<0b0110000, 0b00001, 0b001, RISCVOpcode<0b0011011>,
|
||||||
"ctzw">, Sched<[]>;
|
"ctzw">, Sched<[WriteCTZ32, ReadCTZ32]>;
|
||||||
def CPOPW : RVBUnary<0b0110000, 0b00010, 0b001, RISCVOpcode<0b0011011>,
|
def CPOPW : RVBUnary<0b0110000, 0b00010, 0b001, RISCVOpcode<0b0011011>,
|
||||||
"cpopw">, Sched<[]>;
|
"cpopw">, Sched<[WriteCPOP32, ReadCPOP32]>;
|
||||||
} // Predicates = [HasStdExtZbb, IsRV64]
|
} // Predicates = [HasStdExtZbb, IsRV64]
|
||||||
|
|
||||||
let Predicates = [HasStdExtZbp, IsRV64] in {
|
let Predicates = [HasStdExtZbp, IsRV64] in {
|
||||||
@ -413,7 +434,8 @@ def BFPW : ALUW_rr<0b0100100, 0b111, "bfpw">, Sched<[]>;
|
|||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV32] in {
|
let Predicates = [HasStdExtZbbOrZbp, IsRV32] in {
|
||||||
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
||||||
def ZEXTH_RV32 : RVInstR<0b0000100, 0b100, OPC_OP, (outs GPR:$rd),
|
def ZEXTH_RV32 : RVInstR<0b0000100, 0b100, OPC_OP, (outs GPR:$rd),
|
||||||
(ins GPR:$rs1), "zext.h", "$rd, $rs1">, Sched<[]> {
|
(ins GPR:$rs1), "zext.h", "$rd, $rs1">,
|
||||||
|
Sched<[WriteIALU, ReadIALU]> {
|
||||||
let rs2 = 0b00000;
|
let rs2 = 0b00000;
|
||||||
}
|
}
|
||||||
} // Predicates = [HasStdExtZbbOrZbp, IsRV32]
|
} // Predicates = [HasStdExtZbbOrZbp, IsRV32]
|
||||||
@ -421,7 +443,8 @@ def ZEXTH_RV32 : RVInstR<0b0000100, 0b100, OPC_OP, (outs GPR:$rd),
|
|||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
||||||
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
||||||
def ZEXTH_RV64 : RVInstR<0b0000100, 0b100, OPC_OP_32, (outs GPR:$rd),
|
def ZEXTH_RV64 : RVInstR<0b0000100, 0b100, OPC_OP_32, (outs GPR:$rd),
|
||||||
(ins GPR:$rs1), "zext.h", "$rd, $rs1">, Sched<[]> {
|
(ins GPR:$rs1), "zext.h", "$rd, $rs1">,
|
||||||
|
Sched<[WriteIALU, ReadIALU]> {
|
||||||
let rs2 = 0b00000;
|
let rs2 = 0b00000;
|
||||||
}
|
}
|
||||||
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
||||||
@ -436,7 +459,7 @@ def ZEXTH_RV64 : RVInstR<0b0000100, 0b100, OPC_OP_32, (outs GPR:$rd),
|
|||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV32] in {
|
let Predicates = [HasStdExtZbbOrZbp, IsRV32] in {
|
||||||
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
||||||
def REV8_RV32 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
def REV8_RV32 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
||||||
"rev8", "$rd, $rs1">, Sched<[]> {
|
"rev8", "$rd, $rs1">, Sched<[WriteREV8, ReadREV8]> {
|
||||||
let imm12 = { 0b01101, 0b0011000 };
|
let imm12 = { 0b01101, 0b0011000 };
|
||||||
}
|
}
|
||||||
} // Predicates = [HasStdExtZbbOrZbp, IsRV32]
|
} // Predicates = [HasStdExtZbbOrZbp, IsRV32]
|
||||||
@ -444,7 +467,7 @@ def REV8_RV32 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
|||||||
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
let Predicates = [HasStdExtZbbOrZbp, IsRV64] in {
|
||||||
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
||||||
def REV8_RV64 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
def REV8_RV64 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
||||||
"rev8", "$rd, $rs1">, Sched<[]> {
|
"rev8", "$rd, $rs1">, Sched<[WriteREV8, ReadREV8]> {
|
||||||
let imm12 = { 0b01101, 0b0111000 };
|
let imm12 = { 0b01101, 0b0111000 };
|
||||||
}
|
}
|
||||||
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
} // Predicates = [HasStdExtZbbOrZbp, IsRV64]
|
||||||
@ -452,7 +475,7 @@ def REV8_RV64 : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
|||||||
let Predicates = [HasStdExtZbbOrZbp] in {
|
let Predicates = [HasStdExtZbbOrZbp] in {
|
||||||
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
|
||||||
def ORCB : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
def ORCB : RVInstI<0b101, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1),
|
||||||
"orc.b", "$rd, $rs1">, Sched<[]> {
|
"orc.b", "$rd, $rs1">, Sched<[WriteORCB, ReadORCB]> {
|
||||||
let imm12 = { 0b00101, 0b0000111 };
|
let imm12 = { 0b00101, 0b0000111 };
|
||||||
}
|
}
|
||||||
} // Predicates = [HasStdExtZbbOrZbp]
|
} // Predicates = [HasStdExtZbbOrZbp]
|
||||||
|
@ -281,4 +281,7 @@ def : ReadAdvance<ReadFMovF16ToI16, 0>;
|
|||||||
def : ReadAdvance<ReadFSGNJ16, 0>;
|
def : ReadAdvance<ReadFSGNJ16, 0>;
|
||||||
def : ReadAdvance<ReadFSqrt16, 0>;
|
def : ReadAdvance<ReadFSqrt16, 0>;
|
||||||
} // Unsupported = true
|
} // Unsupported = true
|
||||||
|
|
||||||
|
defm : UnsupportedSchedZba;
|
||||||
|
defm : UnsupportedSchedZbb;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,6 @@ def : WriteRes<WriteNop, []>;
|
|||||||
|
|
||||||
def : InstRW<[WriteIALU], (instrs COPY)>;
|
def : InstRW<[WriteIALU], (instrs COPY)>;
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Bypass and advance
|
// Bypass and advance
|
||||||
def : ReadAdvance<ReadJmp, 0>;
|
def : ReadAdvance<ReadJmp, 0>;
|
||||||
@ -270,4 +269,7 @@ def : ReadAdvance<ReadFMovF16ToI16, 0>;
|
|||||||
def : ReadAdvance<ReadFSGNJ16, 0>;
|
def : ReadAdvance<ReadFSGNJ16, 0>;
|
||||||
def : ReadAdvance<ReadFSqrt16, 0>;
|
def : ReadAdvance<ReadFSqrt16, 0>;
|
||||||
} // Unsupported = true
|
} // Unsupported = true
|
||||||
|
|
||||||
|
defm : UnsupportedSchedZba;
|
||||||
|
defm : UnsupportedSchedZbb;
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,24 @@ def WriteFST16 : SchedWrite; // Floating point sp store
|
|||||||
def WriteFST32 : SchedWrite; // Floating point sp store
|
def WriteFST32 : SchedWrite; // Floating point sp store
|
||||||
def WriteFST64 : SchedWrite; // Floating point dp store
|
def WriteFST64 : SchedWrite; // Floating point dp store
|
||||||
|
|
||||||
|
// Zba extension
|
||||||
|
def WriteSHXADD : SchedWrite; // sh1add/sh2add/sh3add
|
||||||
|
def WriteSHXADD32 : SchedWrite; // sh1add.uw/sh2add.uw/sh3add.uw
|
||||||
|
|
||||||
|
// Zbb extension
|
||||||
|
def WriteRotateImm : SchedWrite;
|
||||||
|
def WriteRotateImm32 : SchedWrite;
|
||||||
|
def WriteRotateReg : SchedWrite;
|
||||||
|
def WriteRotateReg32 : SchedWrite;
|
||||||
|
def WriteCLZ : SchedWrite;
|
||||||
|
def WriteCLZ32 : SchedWrite;
|
||||||
|
def WriteCTZ : SchedWrite;
|
||||||
|
def WriteCTZ32 : SchedWrite;
|
||||||
|
def WriteCPOP : SchedWrite;
|
||||||
|
def WriteCPOP32 : SchedWrite;
|
||||||
|
def WriteREV8 : SchedWrite;
|
||||||
|
def WriteORCB : SchedWrite;
|
||||||
|
|
||||||
/// Define scheduler resources associated with use operands.
|
/// Define scheduler resources associated with use operands.
|
||||||
def ReadJmp : SchedRead;
|
def ReadJmp : SchedRead;
|
||||||
def ReadJalr : SchedRead;
|
def ReadJalr : SchedRead;
|
||||||
@ -187,3 +205,61 @@ def ReadFCvtF64ToF16 : SchedRead;
|
|||||||
def ReadFClass16 : SchedRead;
|
def ReadFClass16 : SchedRead;
|
||||||
def ReadFClass32 : SchedRead;
|
def ReadFClass32 : SchedRead;
|
||||||
def ReadFClass64 : SchedRead;
|
def ReadFClass64 : SchedRead;
|
||||||
|
|
||||||
|
// Zba extension
|
||||||
|
def ReadSHXADD : SchedRead; // sh1add/sh2add/sh3add
|
||||||
|
def ReadSHXADD32 : SchedRead; // sh1add.uw/sh2add.uw/sh3add.uw
|
||||||
|
|
||||||
|
// Zbb extension
|
||||||
|
def ReadRotateImm : SchedRead;
|
||||||
|
def ReadRotateImm32 : SchedRead;
|
||||||
|
def ReadRotateReg : SchedRead;
|
||||||
|
def ReadRotateReg32 : SchedRead;
|
||||||
|
def ReadCLZ : SchedRead;
|
||||||
|
def ReadCLZ32 : SchedRead;
|
||||||
|
def ReadCTZ : SchedRead;
|
||||||
|
def ReadCTZ32 : SchedRead;
|
||||||
|
def ReadCPOP : SchedRead;
|
||||||
|
def ReadCPOP32 : SchedRead;
|
||||||
|
def ReadREV8 : SchedRead;
|
||||||
|
def ReadORCB : SchedRead;
|
||||||
|
|
||||||
|
multiclass UnsupportedSchedZba {
|
||||||
|
let Unsupported = true in {
|
||||||
|
def : WriteRes<WriteSHXADD, []>;
|
||||||
|
def : WriteRes<WriteSHXADD32, []>;
|
||||||
|
|
||||||
|
def : ReadAdvance<ReadSHXADD, 0>;
|
||||||
|
def : ReadAdvance<ReadSHXADD32, 0>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
multiclass UnsupportedSchedZbb {
|
||||||
|
let Unsupported = true in {
|
||||||
|
def : WriteRes<WriteRotateImm, []>;
|
||||||
|
def : WriteRes<WriteRotateImm32, []>;
|
||||||
|
def : WriteRes<WriteRotateReg, []>;
|
||||||
|
def : WriteRes<WriteRotateReg32, []>;
|
||||||
|
def : WriteRes<WriteCLZ, []>;
|
||||||
|
def : WriteRes<WriteCLZ32, []>;
|
||||||
|
def : WriteRes<WriteCTZ, []>;
|
||||||
|
def : WriteRes<WriteCTZ32, []>;
|
||||||
|
def : WriteRes<WriteCPOP, []>;
|
||||||
|
def : WriteRes<WriteCPOP32, []>;
|
||||||
|
def : WriteRes<WriteREV8, []>;
|
||||||
|
def : WriteRes<WriteORCB, []>;
|
||||||
|
|
||||||
|
def : ReadAdvance<ReadRotateImm, 0>;
|
||||||
|
def : ReadAdvance<ReadRotateImm32, 0>;
|
||||||
|
def : ReadAdvance<ReadRotateReg, 0>;
|
||||||
|
def : ReadAdvance<ReadRotateReg32, 0>;
|
||||||
|
def : ReadAdvance<ReadCLZ, 0>;
|
||||||
|
def : ReadAdvance<ReadCLZ32, 0>;
|
||||||
|
def : ReadAdvance<ReadCTZ, 0>;
|
||||||
|
def : ReadAdvance<ReadCTZ32, 0>;
|
||||||
|
def : ReadAdvance<ReadCPOP, 0>;
|
||||||
|
def : ReadAdvance<ReadCPOP32, 0>;
|
||||||
|
def : ReadAdvance<ReadREV8, 0>;
|
||||||
|
def : ReadAdvance<ReadORCB, 0>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user