diff --git a/llvm/lib/Target/RISCV/RISCVInstrFormats.td b/llvm/lib/Target/RISCV/RISCVInstrFormats.td --- a/llvm/lib/Target/RISCV/RISCVInstrFormats.td +++ b/llvm/lib/Target/RISCV/RISCVInstrFormats.td @@ -302,16 +302,15 @@ let Opcode = opcode.Value; } -class RVInstIShift funct3, RISCVOpcode opcode, +class RVInstIShift imm11_7, bits<3> funct3, RISCVOpcode opcode, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<6> shamt; bits<5> rs1; bits<5> rd; - let Inst{31} = 0; - let Inst{30} = arithshift; - let Inst{29-26} = 0; + let Inst{31-27} = imm11_7; + let Inst{26} = 0; let Inst{25-20} = shamt; let Inst{19-15} = rs1; let Inst{14-12} = funct3; @@ -319,16 +318,14 @@ let Opcode = opcode.Value; } -class RVInstIShiftW funct3, RISCVOpcode opcode, +class RVInstIShiftW imm11_5, bits<3> funct3, RISCVOpcode opcode, dag outs, dag ins, string opcodestr, string argstr> : RVInst { bits<5> shamt; bits<5> rs1; bits<5> rd; - let Inst{31} = 0; - let Inst{30} = arithshift; - let Inst{29-25} = 0; + let Inst{31-25} = imm11_5; let Inst{24-20} = shamt; let Inst{19-15} = rs1; let Inst{14-12} = funct3; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -384,8 +384,8 @@ Sched<[WriteIALU, ReadIALU]>; let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in -class Shift_ri funct3, string opcodestr> - : RVInstIShift imm11_7, bits<3> funct3, string opcodestr> + : RVInstIShift, Sched<[WriteShiftImm, ReadShiftImm]>; @@ -409,8 +409,8 @@ opcodestr, "$rd, $imm12, $rs1">, Sched<[WriteCSR]>; let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in -class ShiftW_ri funct3, string opcodestr> - : RVInstIShiftW imm11_5, bits<3> funct3, string opcodestr> + : RVInstIShiftW, Sched<[WriteShiftImm32, ReadShiftImm32]>; @@ -480,9 +480,9 @@ def ANDI : ALU_ri<0b111, "andi">; -def SLLI : Shift_ri<0, 0b001, "slli">; -def SRLI : Shift_ri<0, 0b101, "srli">; -def SRAI : Shift_ri<1, 0b101, "srai">; +def SLLI : Shift_ri<0b00000, 0b001, "slli">; +def SRLI : Shift_ri<0b00000, 0b101, "srli">; +def SRAI : Shift_ri<0b01000, 0b101, "srai">; def ADD : ALU_rr<0b0000000, 0b000, "add">, Sched<[WriteIALU, ReadIALU, ReadIALU]>; def SUB : ALU_rr<0b0100000, 0b000, "sub">, Sched<[WriteIALU, ReadIALU, ReadIALU]>; @@ -564,9 +564,9 @@ "addiw", "$rd, $rs1, $imm12">, Sched<[WriteIALU32, ReadIALU32]>; -def SLLIW : ShiftW_ri<0, 0b001, "slliw">; -def SRLIW : ShiftW_ri<0, 0b101, "srliw">; -def SRAIW : ShiftW_ri<1, 0b101, "sraiw">; +def SLLIW : ShiftW_ri<0b0000000, 0b001, "slliw">; +def SRLIW : ShiftW_ri<0b0000000, 0b101, "srliw">; +def SRAIW : ShiftW_ri<0b0100000, 0b101, "sraiw">; def ADDW : ALUW_rr<0b0000000, 0b000, "addw">, Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoB.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoB.td @@ -92,46 +92,30 @@ RISCVOpcode opcode, string opcodestr> : RVInstR { - let Inst{24-20} = funct5; + let rs2 = funct5; } let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in -class RVBShift_ri funct5, bits<3> funct3, RISCVOpcode opcode, +class RVBShift_ri imm11_7, bits<3> funct3, RISCVOpcode opcode, string opcodestr> - : RVInstI { - bits<6> shamt; - - let Inst{31-27} = funct5; - // NOTE: the bit op(26)=1 is used to select funnel shifts. All other - // shifts operations and operations that live in the encoding space - // of the shifts (single bit operations, grev, gorc) use op(26) = 0 - let Inst{26} = 0; - let Inst{25-20} = shamt; -} + : RVInstIShift; let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in -class RVBShiftW_ri funct7, bits<3> funct3, RISCVOpcode opcode, +class RVBShiftW_ri imm11_5, bits<3> funct3, RISCVOpcode opcode, string opcodestr> - : RVInstI { - bits<5> shamt; - - let Inst{31-25} = funct7; - let Inst{24-20} = shamt; -} + : RVInstIShiftW; +// Using RVInstIShiftW since it allocates 5 bits instead of 6 to shamt. let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in -class RVBShfl_ri funct6, bits<3> funct3, RISCVOpcode opcode, +class RVBShfl_ri imm11_5, bits<3> funct3, RISCVOpcode opcode, string opcodestr> - : RVInstI { - bits<6> shamt; - - let Inst{31-26} = funct6; - let Inst{25-20} = shamt; -} + : RVInstIShiftW; let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in class RVBTernaryR funct2, bits<3> funct3_b, RISCVOpcode opcode, @@ -338,8 +322,8 @@ def BFP : ALU_rr<0b0100100, 0b111, "bfp">, Sched<[]>; let Predicates = [HasStdExtZbp] in { -def SHFLI : RVBShfl_ri<0b000010, 0b001, OPC_OP_IMM, "shfli">, Sched<[]>; -def UNSHFLI : RVBShfl_ri<0b000010, 0b101, OPC_OP_IMM, "unshfli">, Sched<[]>; +def SHFLI : RVBShfl_ri<0b0000100, 0b001, OPC_OP_IMM, "shfli">, Sched<[]>; +def UNSHFLI : RVBShfl_ri<0b0000100, 0b101, OPC_OP_IMM, "unshfli">, Sched<[]>; } // Predicates = [HasStdExtZbp] let Predicates = [HasStdExtZba, IsRV64] in {