Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
258 changes: 258 additions & 0 deletions llvm/lib/Target/RISCV/RISCVInstrInfoP.td
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,37 @@ class RVPNarrowingBase<bits<3> f, bit r, bits<4> funct4, dag outs, dag ins,
let Inst{6-0} = OPC_OP_IMM_32.Value;
}

// Common base for pair ops (non-widening nor narrowing)
class RVPPairBase<bits<3> f, bit r, bit direction, dag outs, dag ins,
string opcodestr, string argstr>
: RVInst<outs, ins, opcodestr, argstr, [], InstFormatOther> {
bits<5> rs1;
bits<5> rd;

let Inst{30-28} = f;
let Inst{27} = r;
let Inst{19-16} = rs1{4-1};
let Inst{15} = direction;
let Inst{14-12} = 0b110;
let Inst{11-8} = rd{4-1};
let Inst{7} = 0b0;
let Inst{6-0} = OPC_OP_IMM_32.Value;
}

// Common base for pair binary ops
class RVPPairBinaryBase_rr<bits<3> f, bit r, bits<2> w, bit pack, bit direction,
string opcodestr>
: RVPPairBase<f, r, direction, (outs GPRPairRV32:$rd),
(ins GPRPairRV32:$rs1, GPRPairRV32:$rs2), opcodestr,
"$rd, $rs1, $rs2"> {
bits<5> rs2;

let Inst{31} = 0b1;
let Inst{26-25} = w;
let Inst{24-21} = rs2{4-1};
let Inst{20} = pack;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPShift_ri<bits<3> f, bits<3> funct3, string opcodestr, Operand ImmType>
: RVInstIBase<funct3, OPC_OP_IMM_32, (outs GPR:$rd),
Expand Down Expand Up @@ -249,6 +280,39 @@ class RVPNarrowingShiftB_ri<bits<3> f, string opcodestr>
let Inst{23-20} = shamt;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairShift_ri<bits<3> f, string opcodestr, Operand ImmType,
bit direction>
: RVPPairBase<f, 0b0, direction, (outs GPRPairRV32:$rd),
(ins GPRPairRV32:$rs1, ImmType:$shamt), opcodestr,
"$rd, $rs1, $shamt"> {
let Inst{31} = 0b0;
}

class RVPPairShiftW_ri<bits<3> f, string opcodestr, bit direction = 0b0>
: RVPPairShift_ri<f, opcodestr, uimm5, direction> {
bits<5> shamt;

let Inst{26-25} = 0b01;
let Inst{24-20} = shamt;
}

class RVPPairShiftH_ri<bits<3> f, string opcodestr, bit direction = 0b0>
: RVPPairShift_ri<f, opcodestr, uimm4, direction> {
bits<4> shamt;

let Inst{26-24} = 0b001;
let Inst{23-20} = shamt;
}

class RVPPairShiftB_ri<bits<3> f, string opcodestr, bit direction = 0b0>
: RVPPairShift_ri<f, opcodestr, uimm3, direction> {
bits<3> shamt;

let Inst{26-23} = 0b0001;
let Inst{22-20} = shamt;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPNarrowingShift_rr<bits<3> f, bits<2> w, string opcodestr>
: RVPNarrowingBase<f, 0b1, 0b1100, (outs GPR:$rd),
Expand All @@ -268,6 +332,18 @@ class RVPWideningShift_rr<bits<3> f, bits<2> w, string opcodestr>
let Inst{27} = 0b1;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairShift_rr<bits<3> f, bits<2> w, string opcodestr,
bit direction = 0b0>
: RVPPairBase<f, 0b1, direction, (outs GPRPairRV32:$rd),
(ins GPRPairRV32:$rs1, GPR:$rs2), opcodestr,
"$rd, $rs1, $rs2"> {
bits<5> rs2;

let Inst{26-25} = w;
let Inst{24-20} = rs2;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPUnary_ri<bits<2> w, bits<5> uf, string opcodestr>
: RVInstIBase<0b010, OPC_OP_IMM_32, (outs GPR:$rd), (ins GPR:$rs1),
Expand All @@ -277,6 +353,15 @@ class RVPUnary_ri<bits<2> w, bits<5> uf, string opcodestr>
let Inst{24-20} = uf;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairUnary_r<bits<2> w, bits<5> uf, string opcodestr>
: RVPPairBase<0b110, 0b0, 0b0, (outs GPRPairRV32:$rd),
(ins GPRPairRV32:$rs1), opcodestr, "$rd, $rs1"> {
let Inst{31} = 0b0;
let Inst{26-25} = w;
let Inst{24-20} = uf;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPBinaryScalar_rr<bits<3> f, bits<2> w, bits<3> funct3, string opcodestr>
: RVInstRBase<funct3, OPC_OP_IMM_32, (outs GPR:$rd),
Expand Down Expand Up @@ -314,6 +399,22 @@ class RVPNarrowingBinary_rr<bits<3> f, bits<2> w, string opcodestr>
let Inst{24-20} = rs2;
}

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairBinary_rr<bits<4> f, bits<2> w, string opcodestr>
: RVPPairBinaryBase_rr<f{3-1}, f{0}, w, 0b0, 0b0, opcodestr>;

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairBinaryShift_rr<bits<3> f, bits<2> w, string opcodestr>
: RVPPairBinaryBase_rr<f, 0b0, w, 0b1, 0b0, opcodestr>;

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairBinaryPack_rr<bits<3> f, bits<2> w, string opcodestr>
: RVPPairBinaryBase_rr<f, 0b0, w, 0b0, 0b1, opcodestr>;

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPPairBinaryExchanged_rr<bits<4> f, bits<2> w, string opcodestr>
: RVPPairBinaryBase_rr<f{3-1}, f{0}, w, 0b1, 0b1, opcodestr>;

let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class RVPTernary_rrr<bits<4> f, bits<2> w, bits<3> funct3, string opcodestr>
: RVInstRBase<funct3, OPC_OP_32, (outs GPR:$rd_wb),
Expand Down Expand Up @@ -1196,4 +1297,161 @@ let Predicates = [HasStdExtP, IsRV32] in {
def PNCLIPR_BS : RVPNarrowingShift_rr<0b111, 0b00, "pnclipr.bs">;
def PNCLIPR_HS : RVPNarrowingShift_rr<0b111, 0b01, "pnclipr.hs">;
def NCLIPR : RVPNarrowingShift_rr<0b111, 0b11, "nclipr">;

def PSLLI_DB : RVPPairShiftB_ri<0b000, "pslli.db">;
def PSLLI_DH : RVPPairShiftH_ri<0b000, "pslli.dh">;
def PSLLI_DW : RVPPairShiftW_ri<0b000, "pslli.dw">;

def PSSLAI_DH : RVPPairShiftH_ri<0b101, "psslai.dh">;
def PSSLAI_DW : RVPPairShiftW_ri<0b101, "psslai.dw">;

def PSEXT_DH_B : RVPPairUnary_r<0b00, 0b00100, "psext.dh.b">;
def PSEXT_DW_B : RVPPairUnary_r<0b01, 0b00100, "psext.dw.b">;

def PSEXT_DW_H : RVPPairUnary_r<0b01, 0b00101, "psext.dw.h">;

def PSABS_DH : RVPPairUnary_r<0b00, 0b00111, "psabs.dh">;
def PSABS_DB : RVPPairUnary_r<0b10, 0b00111, "psabs.db">;

def PSLL_DHS : RVPPairShift_rr<0b000, 0b00, "psll.dhs">;
def PSLL_DWS : RVPPairShift_rr<0b000, 0b01, "psll.dws">;
def PSLL_DBS : RVPPairShift_rr<0b000, 0b10, "psll.dbs">;

def PADD_DHS : RVPPairShift_rr<0b001, 0b00, "padd.dhs">;
def PADD_DWS : RVPPairShift_rr<0b001, 0b01, "padd.dws">;
def PADD_DBS : RVPPairShift_rr<0b001, 0b10, "padd.dbs">;

def PSSHA_DHS : RVPPairShift_rr<0b110, 0b00, "pssha.dhs">;
def PSSHA_DWS : RVPPairShift_rr<0b110, 0b01, "pssha.dws">;

def PSSHAR_DHS : RVPPairShift_rr<0b111, 0b00, "psshar.dhs">;
def PSSHAR_DWS : RVPPairShift_rr<0b111, 0b01, "psshar.dws">;

def PSRLI_DB : RVPPairShiftB_ri<0b000, "psrli.db", 0b1>;
def PSRLI_DH : RVPPairShiftH_ri<0b000, "psrli.dh", 0b1>;
def PSRLI_DW : RVPPairShiftW_ri<0b000, "psrli.dw", 0b1>;

def PUSATI_DH : RVPPairShiftH_ri<0b010, "pusati.dh", 0b1>;
def PUSATI_DW : RVPPairShiftW_ri<0b010, "pusati.dw", 0b1>;

def PSRAI_DB : RVPPairShiftB_ri<0b100, "psrai.db", 0b1>;
def PSRAI_DH : RVPPairShiftH_ri<0b100, "psrai.dh", 0b1>;
def PSRAI_DW : RVPPairShiftW_ri<0b100, "psrai.dw", 0b1>;

def PSRARI_DH : RVPPairShiftH_ri<0b101, "psrari.dh", 0b1>;
def PSRARI_DW : RVPPairShiftW_ri<0b101, "psrari.dw", 0b1>;

def PSATI_DH : RVPPairShiftH_ri<0b110, "psati.dh", 0b1>;
def PSATI_DW : RVPPairShiftW_ri<0b110, "psati.dw", 0b1>;

def PSRL_DHS : RVPPairShift_rr<0b000, 0b00, "psrl.dhs", 0b1>;
def PSRL_DWS : RVPPairShift_rr<0b000, 0b01, "psrl.dws", 0b1>;
def PSRL_DBS : RVPPairShift_rr<0b000, 0b10, "psrl.dbs", 0b1>;

def PSRA_DHS : RVPPairShift_rr<0b100, 0b00, "psra.dhs", 0b1>;
def PSRA_DWS : RVPPairShift_rr<0b100, 0b01, "psra.dws", 0b1>;
def PSRA_DBS : RVPPairShift_rr<0b100, 0b10, "psra.dbs", 0b1>;

def PADD_DH : RVPPairBinary_rr<0b0000, 0b00, "padd.dh">;
def PADD_DW : RVPPairBinary_rr<0b0000, 0b01, "padd.dw">;
def PADD_DB : RVPPairBinary_rr<0b0000, 0b10, "padd.db">;
def ADDD : RVPPairBinary_rr<0b0000, 0b11, "addd">;

def PSADD_DH : RVPPairBinary_rr<0b0010, 0b00, "psadd.dh">;
def PSADD_DW : RVPPairBinary_rr<0b0010, 0b01, "psadd.dw">;
def PSADD_DB : RVPPairBinary_rr<0b0010, 0b10, "psadd.db">;

def PAADD_DH : RVPPairBinary_rr<0b0011, 0b00, "paadd.dh">;
def PAADD_DW : RVPPairBinary_rr<0b0011, 0b01, "paadd.dw">;
def PAADD_DB : RVPPairBinary_rr<0b0011, 0b10, "paadd.db">;

def PSADDU_DH : RVPPairBinary_rr<0b0110, 0b00, "psaddu.dh">;
def PSADDU_DW : RVPPairBinary_rr<0b0110, 0b01, "psaddu.dw">;
def PSADDU_DB : RVPPairBinary_rr<0b0110, 0b10, "psaddu.db">;

def PAADDU_DH : RVPPairBinary_rr<0b0111, 0b00, "paaddu.dh">;
def PAADDU_DW : RVPPairBinary_rr<0b0111, 0b01, "paaddu.dw">;
def PAADDU_DB : RVPPairBinary_rr<0b0111, 0b10, "paaddu.db">;

def PSUB_DH : RVPPairBinary_rr<0b1000, 0b00, "psub.dh">;
def PSUB_DW : RVPPairBinary_rr<0b1000, 0b01, "psub.dw">;
def PSUB_DB : RVPPairBinary_rr<0b1000, 0b10, "psub.db">;
def SUBD : RVPPairBinary_rr<0b1000, 0b11, "subd">;

def PDIF_DH : RVPPairBinary_rr<0b1001, 0b00, "pdif.dh">;
def PDIF_DB : RVPPairBinary_rr<0b1001, 0b10, "pdif.db">;

def PSSUB_DH : RVPPairBinary_rr<0b1010, 0b00, "pssub.dh">;
def PSSUB_DW : RVPPairBinary_rr<0b1010, 0b01, "pssub.dw">;
def PSSUB_DB : RVPPairBinary_rr<0b1010, 0b10, "pssub.db">;

def PASUB_DH : RVPPairBinary_rr<0b1011, 0b00, "pasub.dh">;
def PASUB_DW : RVPPairBinary_rr<0b1011, 0b01, "pasub.dw">;
def PASUB_DB : RVPPairBinary_rr<0b1011, 0b10, "pasub.db">;

def PDIFU_DH : RVPPairBinary_rr<0b1101, 0b00, "pdifu.dh">;
def PDIFU_DB : RVPPairBinary_rr<0b1101, 0b10, "pdifu.db">;

def PSSUBU_DH : RVPPairBinary_rr<0b1110, 0b00, "pssubu.dh">;
def PSSUBU_DW : RVPPairBinary_rr<0b1110, 0b01, "pssubu.dw">;
def PSSUBU_DB : RVPPairBinary_rr<0b1110, 0b10, "pssubu.db">;

def PASUBU_DH : RVPPairBinary_rr<0b1111, 0b00, "pasubu.dh">;
def PASUBU_DW : RVPPairBinary_rr<0b1111, 0b01, "pasubu.dw">;
def PASUBU_DB : RVPPairBinary_rr<0b1111, 0b10, "pasubu.db">;

def PSH1ADD_DH : RVPPairBinaryShift_rr<0b010, 0b00, "psh1add.dh">;
def PSH1ADD_DW : RVPPairBinaryShift_rr<0b010, 0b01, "psh1add.dw">;

def PSSH1SADD_DH : RVPPairBinaryShift_rr<0b011, 0b00, "pssh1sadd.dh">;
def PSSH1SADD_DW : RVPPairBinaryShift_rr<0b011, 0b01, "pssh1sadd.dw">;

def PPACK_DH : RVPPairBinaryPack_rr<0b000, 0b00, "ppack.dh">;
def PPACK_DW : RVPPairBinaryPack_rr<0b000, 0b01, "ppack.dw">;

def PPACKBT_DH : RVPPairBinaryPack_rr<0b001, 0b00, "ppackbt.dh">;
def PPACKBT_DW : RVPPairBinaryPack_rr<0b001, 0b01, "ppackbt.dw">;

def PPACKTB_DH : RVPPairBinaryPack_rr<0b010, 0b00, "ppacktb.dh">;
def PPACKTB_DW : RVPPairBinaryPack_rr<0b010, 0b01, "ppacktb.dw">;

def PPACKT_DH : RVPPairBinaryPack_rr<0b011, 0b00, "ppackt.dh">;
def PPACKT_DW : RVPPairBinaryPack_rr<0b011, 0b01, "ppackt.dw">;

def PAS_DHX : RVPPairBinaryExchanged_rr<0b0000, 0b00, "pas.dhx">;
def PSA_DHX : RVPPairBinaryExchanged_rr<0b0000, 0b10, "psa.dhx">;

def PSAS_DHX : RVPPairBinaryExchanged_rr<0b0010, 0b00, "psas.dhx">;
def PSSA_DHX : RVPPairBinaryExchanged_rr<0b0010, 0b10, "pssa.dhx">;

def PAAX_DHX : RVPPairBinaryExchanged_rr<0b0011, 0b00, "paax.dhx">;
def PASA_DHX : RVPPairBinaryExchanged_rr<0b0011, 0b10, "pasa.dhx">;

def PMSEQ_DH : RVPPairBinaryExchanged_rr<0b1000, 0b00, "pmseq.dh">;
def PMSEQ_DW : RVPPairBinaryExchanged_rr<0b1000, 0b01, "pmseq.dw">;
def PMSEQ_DB : RVPPairBinaryExchanged_rr<0b1000, 0b10, "pmseq.db">;

def PMSLT_DH : RVPPairBinaryExchanged_rr<0b1010, 0b00, "pmslt.dh">;
def PMSLT_DW : RVPPairBinaryExchanged_rr<0b1010, 0b01, "pmslt.dw">;
def PMSLT_DB : RVPPairBinaryExchanged_rr<0b1010, 0b10, "pmslt.db">;

def PMSLTU_DH : RVPPairBinaryExchanged_rr<0b1011, 0b00, "pmsltu.dh">;
def PMSLTU_DW : RVPPairBinaryExchanged_rr<0b1011, 0b01, "pmsltu.dw">;
def PMSLTU_DB : RVPPairBinaryExchanged_rr<0b1011, 0b10, "pmsltu.db">;

def PMIN_DH : RVPPairBinaryExchanged_rr<0b1100, 0b00, "pmin.dh">;
def PMIN_DW : RVPPairBinaryExchanged_rr<0b1100, 0b01, "pmin.dw">;
def PMIN_DB : RVPPairBinaryExchanged_rr<0b1100, 0b10, "pmin.db">;

def PMINU_DH : RVPPairBinaryExchanged_rr<0b1101, 0b00, "pminu.dh">;
def PMINU_DW : RVPPairBinaryExchanged_rr<0b1101, 0b01, "pminu.dw">;
def PMINU_DB : RVPPairBinaryExchanged_rr<0b1101, 0b10, "pminu.db">;

def PMAX_DH : RVPPairBinaryExchanged_rr<0b1110, 0b00, "pmax.dh">;
def PMAX_DW : RVPPairBinaryExchanged_rr<0b1110, 0b01, "pmax.dw">;
def PMAX_DB : RVPPairBinaryExchanged_rr<0b1110, 0b10, "pmax.db">;

def PMAXU_DH : RVPPairBinaryExchanged_rr<0b1111, 0b00, "pmaxu.dh">;
def PMAXU_DW : RVPPairBinaryExchanged_rr<0b1111, 0b01, "pmaxu.dw">;
def PMAXU_DB : RVPPairBinaryExchanged_rr<0b1111, 0b10, "pmaxu.db">;
} // Predicates = [HasStdExtP, IsRV32]
4 changes: 2 additions & 2 deletions llvm/test/MC/RISCV/invalid-instruction-spellcheck.s
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ fl ft0, 0(sp)
# CHECK-RV64IF: did you mean: flw, la, lb, ld, lh, li, lw
# CHECK-NEXT: fl ft0, 0(sp)

addd x1, x1, x1
addc x1, x1, x1
# CHECK-RV32: did you mean: add, addi
# CHECK-RV64: did you mean: add, addi, addw
# CHECK-NEXT: addd x1, x1, x1
# CHECK-NEXT: addc x1, x1, x1

vm x0, x0
# CHECK: did you mean: mv
Expand Down
Loading