diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td @@ -339,10 +339,14 @@ } // Predicates = [HasStdExtZbbOrZbp] let Predicates = [HasStdExtZbs] in { -def BCLR : ALU_rr<0b0100100, 0b001, "bclr">, Sched<[]>; -def BSET : ALU_rr<0b0010100, 0b001, "bset">, Sched<[]>; -def BINV : ALU_rr<0b0110100, 0b001, "binv">, Sched<[]>; -def BEXT : ALU_rr<0b0100100, 0b101, "bext">, Sched<[]>; +def BCLR : ALU_rr<0b0100100, 0b001, "bclr">, + Sched<[WriteSingleBit, ReadSingleBit, ReadSingleBit]>; +def BSET : ALU_rr<0b0010100, 0b001, "bset">, + Sched<[WriteSingleBit, ReadSingleBit, ReadSingleBit]>; +def BINV : ALU_rr<0b0110100, 0b001, "binv">, + Sched<[WriteSingleBit, ReadSingleBit, ReadSingleBit]>; +def BEXT : ALU_rr<0b0100100, 0b101, "bext">, + Sched<[WriteSingleBit, ReadSingleBit, ReadSingleBit]>; } // Predicates = [HasStdExtZbs] let Predicates = [HasStdExtZbp] in { @@ -361,10 +365,14 @@ Sched<[WriteRotateImm, ReadRotateImm]>; let Predicates = [HasStdExtZbs] in { -def BCLRI : RVBShift_ri<0b01001, 0b001, OPC_OP_IMM, "bclri">, Sched<[]>; -def BSETI : RVBShift_ri<0b00101, 0b001, OPC_OP_IMM, "bseti">, Sched<[]>; -def BINVI : RVBShift_ri<0b01101, 0b001, OPC_OP_IMM, "binvi">, Sched<[]>; -def BEXTI : RVBShift_ri<0b01001, 0b101, OPC_OP_IMM, "bexti">, Sched<[]>; +def BCLRI : RVBShift_ri<0b01001, 0b001, OPC_OP_IMM, "bclri">, + Sched<[WriteSingleBitImm, ReadSingleBitImm]>; +def BSETI : RVBShift_ri<0b00101, 0b001, OPC_OP_IMM, "bseti">, + Sched<[WriteSingleBitImm, ReadSingleBitImm]>; +def BINVI : RVBShift_ri<0b01101, 0b001, OPC_OP_IMM, "binvi">, + Sched<[WriteSingleBitImm, ReadSingleBitImm]>; +def BEXTI : RVBShift_ri<0b01001, 0b101, OPC_OP_IMM, "bexti">, + Sched<[WriteSingleBitImm, ReadSingleBitImm]>; } // Predicates = [HasStdExtZbs] let Predicates = [HasStdExtZbp] in { @@ -432,9 +440,12 @@ Sched<[]>; let Predicates = [HasStdExtZbc] in { -def CLMUL : ALU_rr<0b0000101, 0b001, "clmul">, Sched<[]>; -def CLMULR : ALU_rr<0b0000101, 0b010, "clmulr">, Sched<[]>; -def CLMULH : ALU_rr<0b0000101, 0b011, "clmulh">, Sched<[]>; +def CLMUL : ALU_rr<0b0000101, 0b001, "clmul">, + Sched<[WriteCLMUL, ReadCLMUL, ReadCLMUL]>; +def CLMULR : ALU_rr<0b0000101, 0b010, "clmulr">, + Sched<[WriteCLMUL, ReadCLMUL, ReadCLMUL]>; +def CLMULH : ALU_rr<0b0000101, 0b011, "clmulh">, + Sched<[WriteCLMUL, ReadCLMUL, ReadCLMUL]>; } // Predicates = [HasStdExtZbc] let Predicates = [HasStdExtZbb] in { diff --git a/llvm/lib/Target/RISCV/RISCVSchedRocket.td b/llvm/lib/Target/RISCV/RISCVSchedRocket.td --- a/llvm/lib/Target/RISCV/RISCVSchedRocket.td +++ b/llvm/lib/Target/RISCV/RISCVSchedRocket.td @@ -237,6 +237,8 @@ defm : UnsupportedSchedV; defm : UnsupportedSchedZba; defm : UnsupportedSchedZbb; +defm : UnsupportedSchedZbc; +defm : UnsupportedSchedZbs; defm : UnsupportedSchedZbf; defm : UnsupportedSchedZfh; } diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -224,6 +224,8 @@ defm : UnsupportedSchedV; defm : UnsupportedSchedZba; defm : UnsupportedSchedZbb; +defm : UnsupportedSchedZbc; +defm : UnsupportedSchedZbs; defm : UnsupportedSchedZbf; defm : UnsupportedSchedZfh; } diff --git a/llvm/lib/Target/RISCV/RISCVScheduleB.td b/llvm/lib/Target/RISCV/RISCVScheduleB.td --- a/llvm/lib/Target/RISCV/RISCVScheduleB.td +++ b/llvm/lib/Target/RISCV/RISCVScheduleB.td @@ -26,6 +26,13 @@ def WriteREV8 : SchedWrite; def WriteORCB : SchedWrite; +// Zbc extension +def WriteCLMUL : SchedWrite; // CLMUL/CLMULR/CLMULH + +// Zbs extension +def WriteSingleBit : SchedWrite; // BCLR/BSET/BINV/BEXT +def WriteSingleBitImm: SchedWrite; // BCLRI/BSETI/BINVI/BEXTI + // Zbf extension def WriteBFP : SchedWrite; // BFP def WriteBFP32 : SchedWrite; // BFPW @@ -50,6 +57,13 @@ def ReadREV8 : SchedRead; def ReadORCB : SchedRead; +// Zbc extension +def ReadCLMUL : SchedRead; // CLMUL/CLMULR/CLMULH + +// Zbs extension +def ReadSingleBit : SchedRead; // BCLR/BSET/BINV/BEXT +def ReadSingleBitImm: SchedRead; // BCLRI/BSETI/BINVI/BEXTI + // Zbf extension def ReadBFP : SchedRead; // BFP def ReadBFP32 : SchedRead; // BFPW @@ -96,6 +110,24 @@ } } +multiclass UnsupportedSchedZbc { +let Unsupported = true in { +def : WriteRes; + +def : ReadAdvance; +} +} + +multiclass UnsupportedSchedZbs { +let Unsupported = true in { +def : WriteRes; +def : WriteRes; + +def : ReadAdvance; +def : ReadAdvance; +} +} + multiclass UnsupportedSchedZbf { let Unsupported = true in { def : WriteRes;