blob: 4ba052b25e42831e7eabceeac8b8390cb5fcc80e [file] [log] [blame]
//===-- RISCVInstrInfoXCV.td - CORE-V instructions ---------*- tablegen -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file describes the vendor extensions defined by Core-V extensions.
//
//===----------------------------------------------------------------------===//
let DecoderNamespace = "XCVbitmanip" in {
class CVInstBitManipRII<bits<2> funct2, bits<3> funct3, dag outs, dag ins,
string opcodestr, string argstr>
: RVInstI<funct3, OPC_CUSTOM_2, outs, ins, opcodestr, argstr> {
bits<5> is3;
bits<5> is2;
let imm12 = {funct2, is3, is2};
}
class CVBitManipRII<bits<2> funct2, bits<3> funct3, string opcodestr,
Operand i3type = uimm5>
: CVInstBitManipRII<funct2, funct3, (outs GPR:$rd),
(ins GPR:$rs1, i3type:$is3, uimm5:$is2),
opcodestr, "$rd, $rs1, $is3, $is2">;
class CVBitManipRR<bits<7> funct7, string opcodestr>
: RVInstR<funct7, 0b011, OPC_CUSTOM_1, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
class CVBitManipR<bits<7> funct7, string opcodestr>
: RVInstR<funct7, 0b011, OPC_CUSTOM_1, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1"> {
let rs2 = 0b00000;
}
}
let Predicates = [HasVendorXCVbitmanip, IsRV32],
hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
def CV_EXTRACT : CVBitManipRII<0b00, 0b000, "cv.extract">;
def CV_EXTRACTU : CVBitManipRII<0b01, 0b000, "cv.extractu">;
def CV_BCLR : CVBitManipRII<0b00, 0b001, "cv.bclr">;
def CV_BSET : CVBitManipRII<0b01, 0b001, "cv.bset">;
def CV_BITREV : CVBitManipRII<0b11, 0b001, "cv.bitrev", uimm2>;
def CV_EXTRACTR : CVBitManipRR<0b0011000, "cv.extractr">;
def CV_EXTRACTUR : CVBitManipRR<0b0011001, "cv.extractur">;
let Constraints = "$rd = $rd_wb" in {
def CV_INSERT : CVInstBitManipRII<0b10, 0b000, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, uimm5:$is3, uimm5:$is2),
"cv.insert", "$rd, $rs1, $is3, $is2">;
def CV_INSERTR : RVInstR<0b0011010, 0b011, OPC_CUSTOM_1, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2),
"cv.insertr", "$rd, $rs1, $rs2">;
}
def CV_BCLRR : CVBitManipRR<0b0011100, "cv.bclrr">;
def CV_BSETR : CVBitManipRR<0b0011101, "cv.bsetr">;
def CV_ROR : CVBitManipRR<0b0100000, "cv.ror">;
def CV_FF1 : CVBitManipR<0b0100001, "cv.ff1">;
def CV_FL1 : CVBitManipR<0b0100010, "cv.fl1">;
def CV_CLB : CVBitManipR<0b0100011, "cv.clb">;
def CV_CNT : CVBitManipR<0b0100100, "cv.cnt">;
}
class CVInstMac<bits<7> funct7, bits<3> funct3, dag outs, dag ins,
string opcodestr, string argstr, list<dag> pattern>
: RVInst<outs, ins, opcodestr, argstr, pattern, InstFormatOther> {
bits<5> rs2;
bits<5> rs1;
bits<5> rd;
let Inst{31-25} = funct7;
let Inst{24-20} = rs2;
let Inst{19-15} = rs1;
let Inst{14-12} = funct3;
let Inst{11-7} = rd;
let Inst{6-0} = OPC_CUSTOM_1.Value;
let DecoderNamespace = "XCVmac";
}
class CVInstMac16I<bits<2> funct2, bits<3> funct3, dag outs, dag ins,
string opcodestr, string argstr, list<dag> pattern>
: RVInst<outs, ins, opcodestr, argstr, pattern, InstFormatOther> {
bits<5> imm5;
bits<5> rs2;
bits<5> rs1;
bits<5> rd;
let Inst{31-30} = funct2;
let Inst{29-25} = imm5;
let Inst{24-20} = rs2;
let Inst{19-15} = rs1;
let Inst{14-12} = funct3;
let Inst{11-7} = rd;
let Inst{6-0} = OPC_CUSTOM_2.Value;
let DecoderNamespace = "XCVmac";
}
let Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0,
mayStore = 0, Constraints = "$rd = $rd_wb" in {
// 32x32 bit macs
def CV_MAC : CVInstMac<0b1001000, 0b011, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2),
"cv.mac", "$rd, $rs1, $rs2", []>,
Sched<[]>;
def CV_MSU : CVInstMac<0b1001001, 0b011, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2),
"cv.msu", "$rd, $rs1, $rs2", []>,
Sched<[]>;
// Signed 16x16 bit macs with imm
def CV_MACSN : CVInstMac16I<0b00, 0b110, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.macsn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACHHSN : CVInstMac16I<0b01, 0b110, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.machhsn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACSRN : CVInstMac16I<0b10, 0b110, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.macsrn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACHHSRN : CVInstMac16I<0b11, 0b110, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.machhsrn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
// Unsigned 16x16 bit macs with imm
def CV_MACUN : CVInstMac16I<0b00, 0b111, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.macun", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACHHUN : CVInstMac16I<0b01, 0b111, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.machhun", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACURN : CVInstMac16I<0b10, 0b111, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.macurn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MACHHURN : CVInstMac16I<0b11, 0b111, (outs GPR:$rd_wb),
(ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.machhurn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
} // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0...
let Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
// Signed 16x16 bit muls with imm
def CV_MULSN : CVInstMac16I<0b00, 0b100, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulsn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULHHSN : CVInstMac16I<0b01, 0b100, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulhhsn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULSRN : CVInstMac16I<0b10, 0b100, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulsrn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULHHSRN : CVInstMac16I<0b11, 0b100, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulhhsrn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
// Unsigned 16x16 bit muls with imm
def CV_MULUN : CVInstMac16I<0b00, 0b101, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulun", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULHHUN : CVInstMac16I<0b01, 0b101, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulhhun", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULURN : CVInstMac16I<0b10, 0b101, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulurn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
def CV_MULHHURN : CVInstMac16I<0b11, 0b101, (outs GPR:$rd),
(ins GPR:$rs1, GPR:$rs2, uimm5:$imm5),
"cv.mulhhurn", "$rd, $rs1, $rs2, $imm5", []>,
Sched<[]>;
} // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0...
let Predicates = [HasVendorXCVmac, IsRV32] in {
// Xcvmac Pseudo Instructions
// Signed 16x16 bit muls
def : InstAlias<"cv.muls $rd1, $rs1, $rs2",
(CV_MULSN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
def : InstAlias<"cv.mulhhs $rd1, $rs1, $rs2",
(CV_MULHHSN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
// Unsigned 16x16 bit muls
def : InstAlias<"cv.mulu $rd1, $rs1, $rs2",
(CV_MULUN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
def : InstAlias<"cv.mulhhu $rd1, $rs1, $rs2",
(CV_MULHHUN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
} // Predicates = [HasVendorXCVmac, IsRV32]