xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVInstrInfoXCV.td (revision 6c05f3a74f30934ee60919cc97e16ec69b542b06)
106c3fb27SDimitry Andric//===-- RISCVInstrInfoXCV.td - CORE-V instructions ---------*- tablegen -*-===//
206c3fb27SDimitry Andric//
306c3fb27SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric//
706c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric//
906c3fb27SDimitry Andric// This file describes the vendor extensions defined by Core-V extensions.
1006c3fb27SDimitry Andric//
1106c3fb27SDimitry Andric//===----------------------------------------------------------------------===//
1206c3fb27SDimitry Andric
1306c3fb27SDimitry Andriclet DecoderNamespace = "XCVbitmanip" in {
1406c3fb27SDimitry Andric  class CVInstBitManipRII<bits<2> funct2, bits<3> funct3, dag outs, dag ins,
1506c3fb27SDimitry Andric                      string opcodestr, string argstr>
165f757f3fSDimitry Andric      : RVInstIBase<funct3, OPC_CUSTOM_2, outs, ins, opcodestr, argstr> {
1706c3fb27SDimitry Andric    bits<5> is3;
1806c3fb27SDimitry Andric    bits<5> is2;
195f757f3fSDimitry Andric    let Inst{31-30} = funct2;
205f757f3fSDimitry Andric    let Inst{29-25} = is3;
215f757f3fSDimitry Andric    let Inst{24-20} = is2;
2206c3fb27SDimitry Andric  }
2306c3fb27SDimitry Andric
2406c3fb27SDimitry Andric  class CVBitManipRII<bits<2> funct2, bits<3> funct3, string opcodestr,
2506c3fb27SDimitry Andric                      Operand i3type = uimm5>
2606c3fb27SDimitry Andric      : CVInstBitManipRII<funct2, funct3, (outs GPR:$rd),
2706c3fb27SDimitry Andric                          (ins GPR:$rs1, i3type:$is3, uimm5:$is2),
2806c3fb27SDimitry Andric                          opcodestr, "$rd, $rs1, $is3, $is2">;
2906c3fb27SDimitry Andric
3006c3fb27SDimitry Andric  class CVBitManipRR<bits<7> funct7, string opcodestr>
3106c3fb27SDimitry Andric      : RVInstR<funct7, 0b011, OPC_CUSTOM_1, (outs GPR:$rd),
3206c3fb27SDimitry Andric                (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
3306c3fb27SDimitry Andric
3406c3fb27SDimitry Andric  class CVBitManipR<bits<7> funct7, string opcodestr>
3506c3fb27SDimitry Andric      : RVInstR<funct7, 0b011, OPC_CUSTOM_1, (outs GPR:$rd),
365f757f3fSDimitry Andric                (ins GPR:$rs1), opcodestr, "$rd, $rs1"> {
3706c3fb27SDimitry Andric    let rs2 = 0b00000;
3806c3fb27SDimitry Andric  }
3906c3fb27SDimitry Andric}
4006c3fb27SDimitry Andric
4106c3fb27SDimitry Andriclet Predicates = [HasVendorXCVbitmanip, IsRV32],
4206c3fb27SDimitry Andric    hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
4306c3fb27SDimitry Andric  def CV_EXTRACT : CVBitManipRII<0b00, 0b000, "cv.extract">;
4406c3fb27SDimitry Andric  def CV_EXTRACTU : CVBitManipRII<0b01, 0b000, "cv.extractu">;
4506c3fb27SDimitry Andric
4606c3fb27SDimitry Andric  def CV_BCLR : CVBitManipRII<0b00, 0b001, "cv.bclr">;
4706c3fb27SDimitry Andric  def CV_BSET : CVBitManipRII<0b01, 0b001, "cv.bset">;
4806c3fb27SDimitry Andric  def CV_BITREV : CVBitManipRII<0b11, 0b001, "cv.bitrev", uimm2>;
4906c3fb27SDimitry Andric
5006c3fb27SDimitry Andric  def CV_EXTRACTR : CVBitManipRR<0b0011000, "cv.extractr">;
5106c3fb27SDimitry Andric  def CV_EXTRACTUR : CVBitManipRR<0b0011001, "cv.extractur">;
5206c3fb27SDimitry Andric
5306c3fb27SDimitry Andric  let Constraints = "$rd = $rd_wb" in {
5406c3fb27SDimitry Andric    def CV_INSERT : CVInstBitManipRII<0b10, 0b000, (outs GPR:$rd_wb),
5506c3fb27SDimitry Andric                             (ins GPR:$rd, GPR:$rs1, uimm5:$is3, uimm5:$is2),
5606c3fb27SDimitry Andric                             "cv.insert", "$rd, $rs1, $is3, $is2">;
5706c3fb27SDimitry Andric    def CV_INSERTR : RVInstR<0b0011010, 0b011, OPC_CUSTOM_1, (outs GPR:$rd_wb),
5806c3fb27SDimitry Andric                             (ins GPR:$rd, GPR:$rs1, GPR:$rs2),
5906c3fb27SDimitry Andric                             "cv.insertr", "$rd, $rs1, $rs2">;
6006c3fb27SDimitry Andric  }
6106c3fb27SDimitry Andric
6206c3fb27SDimitry Andric  def CV_BCLRR : CVBitManipRR<0b0011100, "cv.bclrr">;
6306c3fb27SDimitry Andric  def CV_BSETR : CVBitManipRR<0b0011101, "cv.bsetr">;
6406c3fb27SDimitry Andric
6506c3fb27SDimitry Andric  def CV_ROR : CVBitManipRR<0b0100000, "cv.ror">;
6606c3fb27SDimitry Andric  def CV_FF1 : CVBitManipR<0b0100001, "cv.ff1">;
6706c3fb27SDimitry Andric  def CV_FL1 : CVBitManipR<0b0100010, "cv.fl1">;
6806c3fb27SDimitry Andric  def CV_CLB : CVBitManipR<0b0100011, "cv.clb">;
6906c3fb27SDimitry Andric  def CV_CNT : CVBitManipR<0b0100100, "cv.cnt">;
7006c3fb27SDimitry Andric}
7106c3fb27SDimitry Andric
725f757f3fSDimitry Andricclass CVInstMac<bits<7> funct7, bits<3> funct3, string opcodestr>
735f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1,
745f757f3fSDimitry Andric              (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, GPR:$rs2),
755f757f3fSDimitry Andric              opcodestr, "$rd, $rs1, $rs2"> {
7606c3fb27SDimitry Andric  let DecoderNamespace = "XCVmac";
7706c3fb27SDimitry Andric}
7806c3fb27SDimitry Andric
795f757f3fSDimitry Andricclass CVInstMacMulN<bits<2> funct2, bits<3> funct3, dag outs, dag ins,
805f757f3fSDimitry Andric                    string opcodestr>
815f757f3fSDimitry Andric    : RVInstRBase<funct3, OPC_CUSTOM_2, outs, ins, opcodestr,
825f757f3fSDimitry Andric                  "$rd, $rs1, $rs2, $imm5"> {
8306c3fb27SDimitry Andric  bits<5> imm5;
8406c3fb27SDimitry Andric
8506c3fb27SDimitry Andric  let Inst{31-30} = funct2;
8606c3fb27SDimitry Andric  let Inst{29-25} = imm5;
8706c3fb27SDimitry Andric  let DecoderNamespace = "XCVmac";
8806c3fb27SDimitry Andric}
8906c3fb27SDimitry Andric
905f757f3fSDimitry Andricclass CVInstMacN<bits<2> funct2, bits<3> funct3, string opcodestr>
915f757f3fSDimitry Andric    : CVInstMacMulN<funct2, funct3, (outs GPR:$rd_wb),
925f757f3fSDimitry Andric                    (ins GPR:$rd, GPR:$rs1, GPR:$rs2, uimm5:$imm5), opcodestr>;
935f757f3fSDimitry Andric
945f757f3fSDimitry Andricclass CVInstMulN<bits<2> funct2, bits<3> funct3, string opcodestr>
955f757f3fSDimitry Andric    : CVInstMacMulN<funct2, funct3, (outs GPR:$rd),
965f757f3fSDimitry Andric                    (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), opcodestr>;
975f757f3fSDimitry Andric
9806c3fb27SDimitry Andriclet Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0,
9906c3fb27SDimitry Andric    mayStore = 0, Constraints = "$rd = $rd_wb" in {
10006c3fb27SDimitry Andric  // 32x32 bit macs
1015f757f3fSDimitry Andric  def CV_MAC      : CVInstMac<0b1001000, 0b011, "cv.mac">,
10206c3fb27SDimitry Andric                    Sched<[]>;
1035f757f3fSDimitry Andric  def CV_MSU      : CVInstMac<0b1001001, 0b011, "cv.msu">,
10406c3fb27SDimitry Andric                    Sched<[]>;
10506c3fb27SDimitry Andric
10606c3fb27SDimitry Andric  // Signed 16x16 bit macs with imm
1075f757f3fSDimitry Andric  def CV_MACSN    : CVInstMacN<0b00, 0b110, "cv.macsn">,
10806c3fb27SDimitry Andric                    Sched<[]>;
1095f757f3fSDimitry Andric  def CV_MACHHSN  : CVInstMacN<0b01, 0b110, "cv.machhsn">,
11006c3fb27SDimitry Andric                    Sched<[]>;
1115f757f3fSDimitry Andric  def CV_MACSRN   : CVInstMacN<0b10, 0b110, "cv.macsrn">,
11206c3fb27SDimitry Andric                    Sched<[]>;
1135f757f3fSDimitry Andric  def CV_MACHHSRN : CVInstMacN<0b11, 0b110, "cv.machhsrn">,
11406c3fb27SDimitry Andric                    Sched<[]>;
11506c3fb27SDimitry Andric
11606c3fb27SDimitry Andric  // Unsigned 16x16 bit macs with imm
1175f757f3fSDimitry Andric  def CV_MACUN    : CVInstMacN<0b00, 0b111, "cv.macun">,
11806c3fb27SDimitry Andric                    Sched<[]>;
1195f757f3fSDimitry Andric  def CV_MACHHUN  : CVInstMacN<0b01, 0b111, "cv.machhun">,
12006c3fb27SDimitry Andric                    Sched<[]>;
1215f757f3fSDimitry Andric  def CV_MACURN   : CVInstMacN<0b10, 0b111, "cv.macurn">,
12206c3fb27SDimitry Andric                    Sched<[]>;
1235f757f3fSDimitry Andric  def CV_MACHHURN : CVInstMacN<0b11, 0b111, "cv.machhurn">,
12406c3fb27SDimitry Andric                    Sched<[]>;
12506c3fb27SDimitry Andric} // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0...
12606c3fb27SDimitry Andric
12706c3fb27SDimitry Andriclet Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
12806c3fb27SDimitry Andric  // Signed 16x16 bit muls with imm
1295f757f3fSDimitry Andric  def CV_MULSN    : CVInstMulN<0b00, 0b100, "cv.mulsn">,
13006c3fb27SDimitry Andric                    Sched<[]>;
1315f757f3fSDimitry Andric  def CV_MULHHSN  : CVInstMulN<0b01, 0b100, "cv.mulhhsn">,
13206c3fb27SDimitry Andric                    Sched<[]>;
1335f757f3fSDimitry Andric  def CV_MULSRN   : CVInstMulN<0b10, 0b100, "cv.mulsrn">,
13406c3fb27SDimitry Andric                    Sched<[]>;
1355f757f3fSDimitry Andric  def CV_MULHHSRN : CVInstMulN<0b11, 0b100, "cv.mulhhsrn">,
13606c3fb27SDimitry Andric                    Sched<[]>;
13706c3fb27SDimitry Andric
13806c3fb27SDimitry Andric  // Unsigned 16x16 bit muls with imm
1395f757f3fSDimitry Andric  def CV_MULUN    : CVInstMulN<0b00, 0b101, "cv.mulun">,
14006c3fb27SDimitry Andric                    Sched<[]>;
1415f757f3fSDimitry Andric  def CV_MULHHUN  : CVInstMulN<0b01, 0b101, "cv.mulhhun">,
14206c3fb27SDimitry Andric                    Sched<[]>;
1435f757f3fSDimitry Andric  def CV_MULURN   : CVInstMulN<0b10, 0b101, "cv.mulurn">,
14406c3fb27SDimitry Andric                    Sched<[]>;
1455f757f3fSDimitry Andric  def CV_MULHHURN : CVInstMulN<0b11, 0b101, "cv.mulhhurn">,
14606c3fb27SDimitry Andric                    Sched<[]>;
14706c3fb27SDimitry Andric} // Predicates = [HasVendorXCVmac, IsRV32], hasSideEffects = 0, mayLoad = 0...
14806c3fb27SDimitry Andric
14906c3fb27SDimitry Andriclet Predicates = [HasVendorXCVmac, IsRV32] in {
15006c3fb27SDimitry Andric  // Xcvmac Pseudo Instructions
15106c3fb27SDimitry Andric  // Signed 16x16 bit muls
15206c3fb27SDimitry Andric  def : InstAlias<"cv.muls $rd1, $rs1, $rs2",
15306c3fb27SDimitry Andric                  (CV_MULSN GPR:$rd1,   GPR:$rs1, GPR:$rs2, 0)>;
15406c3fb27SDimitry Andric  def : InstAlias<"cv.mulhhs $rd1, $rs1, $rs2",
15506c3fb27SDimitry Andric                  (CV_MULHHSN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
15606c3fb27SDimitry Andric
15706c3fb27SDimitry Andric  // Unsigned 16x16 bit muls
15806c3fb27SDimitry Andric  def : InstAlias<"cv.mulu $rd1, $rs1, $rs2",
15906c3fb27SDimitry Andric                  (CV_MULUN GPR:$rd1,   GPR:$rs1, GPR:$rs2, 0)>;
16006c3fb27SDimitry Andric  def : InstAlias<"cv.mulhhu $rd1, $rs1, $rs2",
16106c3fb27SDimitry Andric                  (CV_MULHHUN GPR:$rd1, GPR:$rs1, GPR:$rs2, 0)>;
16206c3fb27SDimitry Andric} // Predicates = [HasVendorXCVmac, IsRV32]
1635f757f3fSDimitry Andric
1645f757f3fSDimitry Andriclet DecoderNamespace = "XCValu" in {
1655f757f3fSDimitry Andric  class CVInstAluRRI<bits<2> funct2, bits<3> funct3, string opcodestr>
1665f757f3fSDimitry Andric      : RVInstRBase<funct3, OPC_CUSTOM_2, (outs GPR:$rd),
1675f757f3fSDimitry Andric                    (ins GPR:$rs1, GPR:$rs2, uimm5:$imm5), opcodestr,
1685f757f3fSDimitry Andric                    "$rd, $rs1, $rs2, $imm5"> {
1695f757f3fSDimitry Andric    bits<5> imm5;
1705f757f3fSDimitry Andric
1715f757f3fSDimitry Andric    let Inst{31-30} = funct2;
1725f757f3fSDimitry Andric    let Inst{29-25} = imm5;
1735f757f3fSDimitry Andric  }
1745f757f3fSDimitry Andric
1755f757f3fSDimitry Andric  class CVInstAluRR<bits<7> funct7, bits<3> funct3, string opcodestr>
1765f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1, (outs GPR:$rd),
1775f757f3fSDimitry Andric              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
1785f757f3fSDimitry Andric
1795f757f3fSDimitry Andric  class CVInstAluRRNR<bits<7> funct7, bits<3> funct3, string opcodestr>
1805f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1, (outs GPR:$rd_wb),
1815f757f3fSDimitry Andric              (ins GPR:$rd, GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
1825f757f3fSDimitry Andric
1835f757f3fSDimitry Andric  class CVInstAluRI<bits<7> funct7, bits<3> funct3, string opcodestr>
1845f757f3fSDimitry Andric      : RVInstIBase<funct3, OPC_CUSTOM_1, (outs GPR:$rd),
1855f757f3fSDimitry Andric                    (ins GPR:$rs1, uimm5:$imm5), opcodestr,
1865f757f3fSDimitry Andric                    "$rd, $rs1, $imm5"> {
1875f757f3fSDimitry Andric    bits<5> imm5;
1885f757f3fSDimitry Andric
1895f757f3fSDimitry Andric    let Inst{31-25} = funct7;
1905f757f3fSDimitry Andric    let Inst{24-20} = imm5;
1915f757f3fSDimitry Andric  }
1925f757f3fSDimitry Andric
1935f757f3fSDimitry Andric  class CVInstAluR<bits<7> funct7, bits<3> funct3, string opcodestr>
1945f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1, (outs GPR:$rd), (ins GPR:$rs1),
1955f757f3fSDimitry Andric              opcodestr, "$rd, $rs1"> {
1965f757f3fSDimitry Andric     let rs2 = 0b00000;
1975f757f3fSDimitry Andric  }
1985f757f3fSDimitry Andric
1995f757f3fSDimitry Andric} // DecoderNamespace = "XCValu"
2005f757f3fSDimitry Andric
2010fca6ea1SDimitry Andriclet Predicates = [HasVendorXCValu, IsRV32],
2025f757f3fSDimitry Andric  hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
2035f757f3fSDimitry Andric  // General ALU Operations
2045f757f3fSDimitry Andric  def CV_ABS    : CVInstAluR<0b0101000, 0b011, "cv.abs">,
2055f757f3fSDimitry Andric                  Sched<[]>;
2065f757f3fSDimitry Andric  def CV_SLET   : CVInstAluRR<0b0101001, 0b011, "cv.slet">,
2075f757f3fSDimitry Andric                  Sched<[]>;
2085f757f3fSDimitry Andric  def CV_SLETU  : CVInstAluRR<0b0101010, 0b011, "cv.sletu">,
2095f757f3fSDimitry Andric                  Sched<[]>;
2105f757f3fSDimitry Andric  def CV_MIN    : CVInstAluRR<0b0101011, 0b011, "cv.min">,
2115f757f3fSDimitry Andric                  Sched<[]>;
2125f757f3fSDimitry Andric  def CV_MINU   : CVInstAluRR<0b0101100, 0b011, "cv.minu">,
2135f757f3fSDimitry Andric                  Sched<[]>;
2145f757f3fSDimitry Andric  def CV_MAX    : CVInstAluRR<0b0101101, 0b011, "cv.max">,
2155f757f3fSDimitry Andric                  Sched<[]>;
2165f757f3fSDimitry Andric  def CV_MAXU   : CVInstAluRR<0b0101110, 0b011, "cv.maxu">,
2175f757f3fSDimitry Andric                  Sched<[]>;
2185f757f3fSDimitry Andric  def CV_EXTHS  : CVInstAluR<0b0110000, 0b011, "cv.exths">,
2195f757f3fSDimitry Andric                  Sched<[]>;
2205f757f3fSDimitry Andric  def CV_EXTHZ  : CVInstAluR<0b0110001, 0b011, "cv.exthz">,
2215f757f3fSDimitry Andric                  Sched<[]>;
2225f757f3fSDimitry Andric  def CV_EXTBS  : CVInstAluR<0b0110010, 0b011, "cv.extbs">,
2235f757f3fSDimitry Andric                  Sched<[]>;
2245f757f3fSDimitry Andric  def CV_EXTBZ  : CVInstAluR<0b0110011, 0b011, "cv.extbz">,
2255f757f3fSDimitry Andric                  Sched<[]>;
2265f757f3fSDimitry Andric
2275f757f3fSDimitry Andric  def CV_CLIP   : CVInstAluRI<0b0111000, 0b011, "cv.clip">,
2285f757f3fSDimitry Andric                  Sched<[]>;
2295f757f3fSDimitry Andric  def CV_CLIPU  : CVInstAluRI<0b0111001, 0b011, "cv.clipu">,
2305f757f3fSDimitry Andric                  Sched<[]>;
2315f757f3fSDimitry Andric  def CV_CLIPR  : CVInstAluRR<0b0111010, 0b011, "cv.clipr">,
2325f757f3fSDimitry Andric                  Sched<[]>;
2335f757f3fSDimitry Andric  def CV_CLIPUR : CVInstAluRR<0b0111011, 0b011, "cv.clipur">,
2345f757f3fSDimitry Andric                  Sched<[]>;
2355f757f3fSDimitry Andric
2365f757f3fSDimitry Andric  def CV_ADDN   : CVInstAluRRI<0b00, 0b010, "cv.addn">,
2375f757f3fSDimitry Andric                  Sched<[]>;
2385f757f3fSDimitry Andric  def CV_ADDUN  : CVInstAluRRI<0b01, 0b010, "cv.addun">,
2395f757f3fSDimitry Andric                  Sched<[]>;
2405f757f3fSDimitry Andric  def CV_ADDRN  : CVInstAluRRI<0b10, 0b010, "cv.addrn">,
2415f757f3fSDimitry Andric                  Sched<[]>;
2425f757f3fSDimitry Andric  def CV_ADDURN : CVInstAluRRI<0b11, 0b010, "cv.addurn">,
2435f757f3fSDimitry Andric                  Sched<[]>;
2445f757f3fSDimitry Andric  def CV_SUBN   : CVInstAluRRI<0b00, 0b011, "cv.subn">,
2455f757f3fSDimitry Andric                  Sched<[]>;
2465f757f3fSDimitry Andric  def CV_SUBUN  : CVInstAluRRI<0b01, 0b011, "cv.subun">,
2475f757f3fSDimitry Andric                  Sched<[]>;
2485f757f3fSDimitry Andric  def CV_SUBRN  : CVInstAluRRI<0b10, 0b011, "cv.subrn">,
2495f757f3fSDimitry Andric                  Sched<[]>;
2505f757f3fSDimitry Andric  def CV_SUBURN : CVInstAluRRI<0b11, 0b011, "cv.suburn">,
2515f757f3fSDimitry Andric                  Sched<[]>;
2520fca6ea1SDimitry Andric} // Predicates = [HasVendorXCValu, IsRV32],
2535f757f3fSDimitry Andric  //   hasSideEffects = 0, mayLoad = 0, mayStore = 0
2545f757f3fSDimitry Andric
2550fca6ea1SDimitry Andriclet Predicates = [HasVendorXCValu, IsRV32],
2565f757f3fSDimitry Andric  hasSideEffects = 0, mayLoad = 0, mayStore = 0,
2575f757f3fSDimitry Andric  Constraints = "$rd = $rd_wb" in {
2585f757f3fSDimitry Andric  def CV_ADDNR   : CVInstAluRRNR<0b1000000, 0b011, "cv.addnr">,
2595f757f3fSDimitry Andric                   Sched<[]>;
2605f757f3fSDimitry Andric  def CV_ADDUNR  : CVInstAluRRNR<0b1000001, 0b011, "cv.addunr">,
2615f757f3fSDimitry Andric                   Sched<[]>;
2625f757f3fSDimitry Andric  def CV_ADDRNR  : CVInstAluRRNR<0b1000010, 0b011, "cv.addrnr">,
2635f757f3fSDimitry Andric                   Sched<[]>;
2645f757f3fSDimitry Andric  def CV_ADDURNR : CVInstAluRRNR<0b1000011, 0b011, "cv.addurnr">,
2655f757f3fSDimitry Andric                   Sched<[]>;
2665f757f3fSDimitry Andric  def CV_SUBNR   : CVInstAluRRNR<0b1000100, 0b011, "cv.subnr">,
2675f757f3fSDimitry Andric                   Sched<[]>;
2685f757f3fSDimitry Andric  def CV_SUBUNR  : CVInstAluRRNR<0b1000101, 0b011, "cv.subunr">,
2695f757f3fSDimitry Andric                   Sched<[]>;
2705f757f3fSDimitry Andric  def CV_SUBRNR  : CVInstAluRRNR<0b1000110, 0b011, "cv.subrnr">,
2715f757f3fSDimitry Andric                   Sched<[]>;
2725f757f3fSDimitry Andric  def CV_SUBURNR : CVInstAluRRNR<0b1000111, 0b011, "cv.suburnr">,
2735f757f3fSDimitry Andric                   Sched<[]>;
2745f757f3fSDimitry Andric
2750fca6ea1SDimitry Andric} // Predicates = [HasVendorXCValu, IsRV32],
2765f757f3fSDimitry Andric  //   hasSideEffects = 0, mayLoad = 0, mayStore = 0,
2775f757f3fSDimitry Andric  //   Constraints = "$rd = $rd_wb"
2785f757f3fSDimitry Andric
2795f757f3fSDimitry Andric
2805f757f3fSDimitry Andricclass CVInstSIMDRR<bits<5> funct5, bit F, bit funct1, bits<3> funct3,
2815f757f3fSDimitry Andric                   RISCVOpcode opcode, dag outs,
2825f757f3fSDimitry Andric                   dag ins, string opcodestr, string argstr>
2835f757f3fSDimitry Andric    : RVInstRBase<funct3, opcode, outs, ins, opcodestr, argstr> {
2845f757f3fSDimitry Andric  let Inst{31-27} = funct5;
2855f757f3fSDimitry Andric  let Inst{26} = F;
2865f757f3fSDimitry Andric  let Inst{25} = funct1;
2875f757f3fSDimitry Andric  let DecoderNamespace = "XCVsimd";
2885f757f3fSDimitry Andric}
2895f757f3fSDimitry Andric
2905f757f3fSDimitry Andricclass CVInstSIMDRI<bits<5> funct5, bit F, bits<3> funct3, RISCVOpcode opcode,
2915f757f3fSDimitry Andric                   dag outs, dag ins, string opcodestr, string argstr>
2925f757f3fSDimitry Andric    : RVInstIBase<funct3, opcode, outs, ins, opcodestr, argstr> {
2935f757f3fSDimitry Andric  bits<6> imm6;
2945f757f3fSDimitry Andric
2955f757f3fSDimitry Andric  let Inst{31-27} = funct5;
2965f757f3fSDimitry Andric  let Inst{26} = F;
2975f757f3fSDimitry Andric  let Inst{25} = imm6{0}; // funct1 unused
2985f757f3fSDimitry Andric  let Inst{24-20} = imm6{5-1};
2995f757f3fSDimitry Andric  let DecoderNamespace = "XCVsimd";
3005f757f3fSDimitry Andric}
3015f757f3fSDimitry Andric
3025f757f3fSDimitry Andricclass CVSIMDRR<bits<5> funct5, bit F, bit funct1, bits<3> funct3,
3035f757f3fSDimitry Andric               string opcodestr>
3045f757f3fSDimitry Andric    : CVInstSIMDRR<funct5, F, funct1, funct3, OPC_CUSTOM_3, (outs GPR:$rd),
3055f757f3fSDimitry Andric              (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
3065f757f3fSDimitry Andric
3075f757f3fSDimitry Andricclass CVSIMDRRWb<bits<5> funct5, bit F, bit funct1, bits<3> funct3,
3085f757f3fSDimitry Andric                 string opcodestr>
3095f757f3fSDimitry Andric    : CVInstSIMDRR<funct5, F, funct1, funct3, OPC_CUSTOM_3, (outs GPR:$rd_wb),
3105f757f3fSDimitry Andric              (ins GPR:$rd, GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2"> {
3115f757f3fSDimitry Andric  let Constraints = "$rd = $rd_wb";
3125f757f3fSDimitry Andric}
3135f757f3fSDimitry Andric
3145f757f3fSDimitry Andricclass CVSIMDRI<bits<5> funct5, bit F, bits<3> funct3, string opcodestr>
3155f757f3fSDimitry Andric    : CVInstSIMDRI<funct5, F, funct3, OPC_CUSTOM_3, (outs GPR:$rd),
3165f757f3fSDimitry Andric              (ins GPR:$rs1, simm6:$imm6), opcodestr, "$rd, $rs1, $imm6">;
3175f757f3fSDimitry Andric
3185f757f3fSDimitry Andricclass CVSIMDRIWb<bits<5> funct5, bit F, bits<3> funct3, string opcodestr>
3195f757f3fSDimitry Andric    : CVInstSIMDRI<funct5, F, funct3, OPC_CUSTOM_3,
3205f757f3fSDimitry Andric                   (outs GPR:$rd_wb), (ins GPR:$rd, GPR:$rs1, simm6:$imm6),
3215f757f3fSDimitry Andric                   opcodestr, "$rd, $rs1, $imm6"> {
3225f757f3fSDimitry Andric  let Constraints = "$rd = $rd_wb";
3235f757f3fSDimitry Andric}
3245f757f3fSDimitry Andric
3255f757f3fSDimitry Andricclass CVSIMDRU<bits<5> funct5, bit F, bits<3> funct3, string opcodestr,
3265f757f3fSDimitry Andric               Operand immtype = uimm6>
3275f757f3fSDimitry Andric    : CVInstSIMDRI<funct5, F, funct3, OPC_CUSTOM_3,
3285f757f3fSDimitry Andric                   (outs GPR:$rd), (ins GPR:$rs1, immtype:$imm6),
3295f757f3fSDimitry Andric                   opcodestr, "$rd, $rs1, $imm6">;
3305f757f3fSDimitry Andric
3315f757f3fSDimitry Andricclass CVSIMDRUWb<bits<5> funct5, bit F, bits<3> funct3, string opcodestr>
3325f757f3fSDimitry Andric    : CVInstSIMDRI<funct5, F, funct3, OPC_CUSTOM_3,
3335f757f3fSDimitry Andric                   (outs GPR:$rd_wb),
3345f757f3fSDimitry Andric                   (ins GPR:$rd, GPR:$rs1, uimm6:$imm6),
3355f757f3fSDimitry Andric                   opcodestr, "$rd, $rs1, $imm6"> {
3365f757f3fSDimitry Andric  let Constraints = "$rd = $rd_wb";
3375f757f3fSDimitry Andric}
3385f757f3fSDimitry Andric
3395f757f3fSDimitry Andricclass CVSIMDR<bits<5> funct5, bit F, bit funct1, bits<3> funct3,
3405f757f3fSDimitry Andric              string opcodestr>
3415f757f3fSDimitry Andric    : CVInstSIMDRR<funct5, F, funct1, funct3, OPC_CUSTOM_3, (outs GPR:$rd),
3425f757f3fSDimitry Andric                  (ins GPR:$rs1), opcodestr, "$rd, $rs1"> {
3435f757f3fSDimitry Andric  let rs2 = 0b00000;
3445f757f3fSDimitry Andric}
3455f757f3fSDimitry Andric
3465f757f3fSDimitry Andricmulticlass CVSIMDBinarySigned<bits<5> funct5, bit F, bit funct1, string mnemonic> {
3475f757f3fSDimitry Andric  def CV_ # NAME # _H : CVSIMDRR<funct5, F, funct1, 0b000, "cv." # mnemonic # ".h">;
3485f757f3fSDimitry Andric  def CV_ # NAME # _B : CVSIMDRR<funct5, F, funct1, 0b001, "cv." # mnemonic # ".b">;
3495f757f3fSDimitry Andric  def CV_ # NAME # _SC_H : CVSIMDRR<funct5, F, funct1, 0b100, "cv." # mnemonic # ".sc.h">;
3505f757f3fSDimitry Andric  def CV_ # NAME # _SC_B : CVSIMDRR<funct5, F, funct1, 0b101, "cv." # mnemonic # ".sc.b">;
3515f757f3fSDimitry Andric  def CV_ # NAME # _SCI_H : CVSIMDRI<funct5, F, 0b110, "cv." # mnemonic # ".sci.h">;
3525f757f3fSDimitry Andric  def CV_ # NAME # _SCI_B : CVSIMDRI<funct5, F, 0b111, "cv." # mnemonic # ".sci.b">;
3535f757f3fSDimitry Andric}
3545f757f3fSDimitry Andric
3555f757f3fSDimitry Andricmulticlass CVSIMDBinaryUnsigned<bits<5> funct5, bit F, bit funct1, string mnemonic> {
3565f757f3fSDimitry Andric  def CV_ # NAME # _H : CVSIMDRR<funct5, F, funct1, 0b000, "cv." # mnemonic # ".h">;
3575f757f3fSDimitry Andric  def CV_ # NAME # _B : CVSIMDRR<funct5, F, funct1, 0b001, "cv." # mnemonic # ".b">;
3585f757f3fSDimitry Andric  def CV_ # NAME # _SC_H : CVSIMDRR<funct5, F, funct1, 0b100, "cv." # mnemonic # ".sc.h">;
3595f757f3fSDimitry Andric  def CV_ # NAME # _SC_B : CVSIMDRR<funct5, F, funct1, 0b101, "cv." # mnemonic # ".sc.b">;
3605f757f3fSDimitry Andric  def CV_ # NAME # _SCI_H : CVSIMDRU<funct5, F, 0b110, "cv." # mnemonic # ".sci.h">;
3615f757f3fSDimitry Andric  def CV_ # NAME # _SCI_B : CVSIMDRU<funct5, F, 0b111, "cv." # mnemonic # ".sci.b">;
3625f757f3fSDimitry Andric}
3635f757f3fSDimitry Andric
3645f757f3fSDimitry Andricmulticlass CVSIMDShift<bits<5> funct5, bit F, bit funct1, string mnemonic> {
3655f757f3fSDimitry Andric  def CV_ # NAME # _H : CVSIMDRR<funct5, F, funct1, 0b000, "cv." # mnemonic # ".h">;
3665f757f3fSDimitry Andric  def CV_ # NAME # _B : CVSIMDRR<funct5, F, funct1, 0b001, "cv." # mnemonic # ".b">;
3675f757f3fSDimitry Andric  def CV_ # NAME # _SC_H : CVSIMDRR<funct5, F, funct1, 0b100, "cv." # mnemonic # ".sc.h">;
3685f757f3fSDimitry Andric  def CV_ # NAME # _SC_B : CVSIMDRR<funct5, F, funct1, 0b101, "cv." # mnemonic # ".sc.b">;
3695f757f3fSDimitry Andric  def CV_ # NAME # _SCI_H : CVSIMDRU<funct5, F, 0b110, "cv." # mnemonic # ".sci.h", uimm4>;
3705f757f3fSDimitry Andric  def CV_ # NAME # _SCI_B : CVSIMDRU<funct5, F, 0b111, "cv." # mnemonic # ".sci.b", uimm3>;
3715f757f3fSDimitry Andric}
3725f757f3fSDimitry Andric
3735f757f3fSDimitry Andricmulticlass CVSIMDBinarySignedWb<bits<5> funct5, bit F, bit funct1, string mnemonic> {
3745f757f3fSDimitry Andric  def CV_ # NAME # _H : CVSIMDRRWb<funct5, F, funct1, 0b000, "cv." # mnemonic # ".h">;
3755f757f3fSDimitry Andric  def CV_ # NAME # _B : CVSIMDRRWb<funct5, F, funct1, 0b001, "cv." # mnemonic # ".b">;
3765f757f3fSDimitry Andric  def CV_ # NAME # _SC_H : CVSIMDRRWb<funct5, F, funct1, 0b100, "cv." # mnemonic # ".sc.h">;
3775f757f3fSDimitry Andric  def CV_ # NAME # _SC_B : CVSIMDRRWb<funct5, F, funct1, 0b101, "cv." # mnemonic # ".sc.b">;
3785f757f3fSDimitry Andric  def CV_ # NAME # _SCI_H : CVSIMDRIWb<funct5, F, 0b110, "cv." # mnemonic # ".sci.h">;
3795f757f3fSDimitry Andric  def CV_ # NAME # _SCI_B : CVSIMDRIWb<funct5, F, 0b111, "cv." # mnemonic # ".sci.b">;
3805f757f3fSDimitry Andric}
3815f757f3fSDimitry Andric
3825f757f3fSDimitry Andricmulticlass CVSIMDBinaryUnsignedWb<bits<5> funct5, bit F, bit funct1, string mnemonic> {
3835f757f3fSDimitry Andric  def CV_ # NAME # _H : CVSIMDRRWb<funct5, F, funct1, 0b000, "cv." # mnemonic # ".h">;
3845f757f3fSDimitry Andric  def CV_ # NAME # _B : CVSIMDRRWb<funct5, F, funct1, 0b001, "cv." # mnemonic # ".b">;
3855f757f3fSDimitry Andric  def CV_ # NAME # _SC_H : CVSIMDRRWb<funct5, F, funct1, 0b100, "cv." # mnemonic # ".sc.h">;
3865f757f3fSDimitry Andric  def CV_ # NAME # _SC_B : CVSIMDRRWb<funct5, F, funct1, 0b101, "cv." # mnemonic # ".sc.b">;
3875f757f3fSDimitry Andric  def CV_ # NAME # _SCI_H : CVSIMDRUWb<funct5, F, 0b110, "cv." # mnemonic # ".sci.h">;
3885f757f3fSDimitry Andric  def CV_ # NAME # _SCI_B : CVSIMDRUWb<funct5, F, 0b111, "cv." # mnemonic # ".sci.b">;
3895f757f3fSDimitry Andric}
3905f757f3fSDimitry Andric
3915f757f3fSDimitry Andric
3925f757f3fSDimitry Andriclet Predicates = [HasVendorXCVsimd, IsRV32],
3935f757f3fSDimitry Andric    hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
3945f757f3fSDimitry Andric  defm ADD :    CVSIMDBinarySigned<0b00000, 0, 0, "add">;
3955f757f3fSDimitry Andric  defm SUB :    CVSIMDBinarySigned<0b00001, 0, 0, "sub">;
3965f757f3fSDimitry Andric  defm AVG :    CVSIMDBinarySigned<0b00010, 0, 0, "avg">;
3975f757f3fSDimitry Andric  defm AVGU : CVSIMDBinaryUnsigned<0b00011, 0, 0, "avgu">;
3985f757f3fSDimitry Andric  defm MIN :    CVSIMDBinarySigned<0b00100, 0, 0, "min">;
3995f757f3fSDimitry Andric  defm MINU : CVSIMDBinaryUnsigned<0b00101, 0, 0, "minu">;
4005f757f3fSDimitry Andric  defm MAX :    CVSIMDBinarySigned<0b00110, 0, 0, "max">;
4015f757f3fSDimitry Andric  defm MAXU : CVSIMDBinaryUnsigned<0b00111, 0, 0, "maxu">;
4025f757f3fSDimitry Andric  defm SRL :           CVSIMDShift<0b01000, 0, 0, "srl">;
4035f757f3fSDimitry Andric  defm SRA :           CVSIMDShift<0b01001, 0, 0, "sra">;
4045f757f3fSDimitry Andric  defm SLL :           CVSIMDShift<0b01010, 0, 0, "sll">;
4055f757f3fSDimitry Andric  defm OR :     CVSIMDBinarySigned<0b01011, 0, 0, "or">;
4065f757f3fSDimitry Andric  defm XOR :    CVSIMDBinarySigned<0b01100, 0, 0, "xor">;
4075f757f3fSDimitry Andric  defm AND :    CVSIMDBinarySigned<0b01101, 0, 0, "and">;
4085f757f3fSDimitry Andric
4095f757f3fSDimitry Andric  def CV_ABS_H :    CVSIMDR<0b01110, 0, 0, 0b000, "cv.abs.h">;
4105f757f3fSDimitry Andric  def CV_ABS_B :    CVSIMDR<0b01110, 0, 0, 0b001, "cv.abs.b">;
4115f757f3fSDimitry Andric
4125f757f3fSDimitry Andric  // 0b01111xx: UNDEF
4135f757f3fSDimitry Andric
4145f757f3fSDimitry Andric  defm DOTUP :   CVSIMDBinaryUnsigned<0b10000, 0, 0, "dotup">;
4155f757f3fSDimitry Andric  defm DOTUSP :  CVSIMDBinarySigned<0b10001, 0, 0, "dotusp">;
4165f757f3fSDimitry Andric  defm DOTSP :   CVSIMDBinarySigned<0b10010, 0, 0, "dotsp">;
4175f757f3fSDimitry Andric  defm SDOTUP :  CVSIMDBinaryUnsignedWb<0b10011, 0, 0, "sdotup">;
4185f757f3fSDimitry Andric  defm SDOTUSP : CVSIMDBinarySignedWb<0b10100, 0, 0, "sdotusp">;
4195f757f3fSDimitry Andric  defm SDOTSP :  CVSIMDBinarySignedWb<0b10101, 0, 0, "sdotsp">;
4205f757f3fSDimitry Andric
4215f757f3fSDimitry Andric  // 0b10110xx: UNDEF
4225f757f3fSDimitry Andric
4235f757f3fSDimitry Andric  def CV_EXTRACT_H :    CVSIMDRU<0b10111, 0, 0b000, "cv.extract.h">;
4245f757f3fSDimitry Andric  def CV_EXTRACT_B :    CVSIMDRU<0b10111, 0, 0b001, "cv.extract.b">;
4255f757f3fSDimitry Andric  def CV_EXTRACTU_H :   CVSIMDRU<0b10111, 0, 0b010, "cv.extractu.h">;
4265f757f3fSDimitry Andric  def CV_EXTRACTU_B :   CVSIMDRU<0b10111, 0, 0b011, "cv.extractu.b">;
4275f757f3fSDimitry Andric  def CV_INSERT_H :     CVSIMDRUWb<0b10111, 0, 0b100, "cv.insert.h">;
4285f757f3fSDimitry Andric  def CV_INSERT_B :     CVSIMDRUWb<0b10111, 0, 0b101, "cv.insert.b">;
4295f757f3fSDimitry Andric
4305f757f3fSDimitry Andric  def CV_SHUFFLE_H :    CVSIMDRR<0b11000, 0, 0, 0b000, "cv.shuffle.h">;
4315f757f3fSDimitry Andric  def CV_SHUFFLE_B :    CVSIMDRR<0b11000, 0, 0, 0b001, "cv.shuffle.b">;
4325f757f3fSDimitry Andric  def CV_SHUFFLE_SCI_H :   CVSIMDRU<0b11000, 0, 0b110, "cv.shuffle.sci.h">;
4335f757f3fSDimitry Andric  def CV_SHUFFLEI0_SCI_B : CVSIMDRU<0b11000, 0, 0b111, "cv.shufflei0.sci.b">;
4345f757f3fSDimitry Andric
4355f757f3fSDimitry Andric  def CV_SHUFFLEI1_SCI_B : CVSIMDRU<0b11001, 0, 0b111, "cv.shufflei1.sci.b">;
4365f757f3fSDimitry Andric
4375f757f3fSDimitry Andric  def CV_SHUFFLEI2_SCI_B : CVSIMDRU<0b11010, 0, 0b111, "cv.shufflei2.sci.b">;
4385f757f3fSDimitry Andric
4395f757f3fSDimitry Andric  def CV_SHUFFLEI3_SCI_B : CVSIMDRU<0b11011, 0, 0b111, "cv.shufflei3.sci.b">;
4405f757f3fSDimitry Andric
4415f757f3fSDimitry Andric  def CV_SHUFFLE2_H :    CVSIMDRRWb<0b11100, 0, 0, 0b000, "cv.shuffle2.h">;
4425f757f3fSDimitry Andric  def CV_SHUFFLE2_B :    CVSIMDRRWb<0b11100, 0, 0, 0b001, "cv.shuffle2.b">;
4435f757f3fSDimitry Andric
4445f757f3fSDimitry Andric  // 0b11101xx: UNDEF
4455f757f3fSDimitry Andric
4465f757f3fSDimitry Andric  def CV_PACK :      CVSIMDRR<0b11110, 0, 0, 0b000, "cv.pack">;
4475f757f3fSDimitry Andric  def CV_PACK_H :    CVSIMDRR<0b11110, 0, 1, 0b000, "cv.pack.h">;
4485f757f3fSDimitry Andric
4495f757f3fSDimitry Andric  def CV_PACKHI_B : CVSIMDRRWb<0b11111, 0, 1, 0b001, "cv.packhi.b">;
4505f757f3fSDimitry Andric  def CV_PACKLO_B : CVSIMDRRWb<0b11111, 0, 0, 0b001, "cv.packlo.b">;
4515f757f3fSDimitry Andric
4525f757f3fSDimitry Andric  defm CMPEQ :  CVSIMDBinarySigned<0b00000, 1, 0, "cmpeq">;
4535f757f3fSDimitry Andric  defm CMPNE :  CVSIMDBinarySigned<0b00001, 1, 0, "cmpne">;
4545f757f3fSDimitry Andric  defm CMPGT :  CVSIMDBinarySigned<0b00010, 1, 0, "cmpgt">;
4555f757f3fSDimitry Andric  defm CMPGE :  CVSIMDBinarySigned<0b00011, 1, 0, "cmpge">;
4565f757f3fSDimitry Andric  defm CMPLT :  CVSIMDBinarySigned<0b00100, 1, 0, "cmplt">;
4575f757f3fSDimitry Andric  defm CMPLE :  CVSIMDBinarySigned<0b00101, 1, 0, "cmple">;
4585f757f3fSDimitry Andric  defm CMPGTU : CVSIMDBinaryUnsigned<0b00110, 1, 0, "cmpgtu">;
4595f757f3fSDimitry Andric  defm CMPGEU : CVSIMDBinaryUnsigned<0b00111, 1, 0, "cmpgeu">;
4605f757f3fSDimitry Andric  defm CMPLTU : CVSIMDBinaryUnsigned<0b01000, 1, 0, "cmpltu">;
4615f757f3fSDimitry Andric  defm CMPLEU : CVSIMDBinaryUnsigned<0b01001, 1, 0, "cmpleu">;
4625f757f3fSDimitry Andric
4635f757f3fSDimitry Andric  def CV_CPLXMUL_R :      CVSIMDRRWb<0b01010, 1, 0, 0b000, "cv.cplxmul.r">;
4645f757f3fSDimitry Andric  def CV_CPLXMUL_I :      CVSIMDRRWb<0b01010, 1, 1, 0b000, "cv.cplxmul.i">;
4655f757f3fSDimitry Andric  def CV_CPLXMUL_R_DIV2 : CVSIMDRRWb<0b01010, 1, 0, 0b010, "cv.cplxmul.r.div2">;
4665f757f3fSDimitry Andric  def CV_CPLXMUL_I_DIV2 : CVSIMDRRWb<0b01010, 1, 1, 0b010, "cv.cplxmul.i.div2">;
4675f757f3fSDimitry Andric  def CV_CPLXMUL_R_DIV4 : CVSIMDRRWb<0b01010, 1, 0, 0b100, "cv.cplxmul.r.div4">;
4685f757f3fSDimitry Andric  def CV_CPLXMUL_I_DIV4 : CVSIMDRRWb<0b01010, 1, 1, 0b100, "cv.cplxmul.i.div4">;
4695f757f3fSDimitry Andric  def CV_CPLXMUL_R_DIV8 : CVSIMDRRWb<0b01010, 1, 0, 0b110, "cv.cplxmul.r.div8">;
4705f757f3fSDimitry Andric  def CV_CPLXMUL_I_DIV8 : CVSIMDRRWb<0b01010, 1, 1, 0b110, "cv.cplxmul.i.div8">;
4715f757f3fSDimitry Andric
4725f757f3fSDimitry Andric  def CV_CPLXCONJ :    CVSIMDR<0b01011, 1, 0, 0b000, "cv.cplxconj">;
4735f757f3fSDimitry Andric
4745f757f3fSDimitry Andric  // 0b01011xx: UNDEF
4755f757f3fSDimitry Andric
4765f757f3fSDimitry Andric  def CV_SUBROTMJ :      CVSIMDRR<0b01100, 1, 0, 0b000, "cv.subrotmj">;
4775f757f3fSDimitry Andric  def CV_SUBROTMJ_DIV2 : CVSIMDRR<0b01100, 1, 0, 0b010, "cv.subrotmj.div2">;
4785f757f3fSDimitry Andric  def CV_SUBROTMJ_DIV4 : CVSIMDRR<0b01100, 1, 0, 0b100, "cv.subrotmj.div4">;
4795f757f3fSDimitry Andric  def CV_SUBROTMJ_DIV8 : CVSIMDRR<0b01100, 1, 0, 0b110, "cv.subrotmj.div8">;
4805f757f3fSDimitry Andric
4815f757f3fSDimitry Andric  def CV_ADD_DIV2 :    CVSIMDRR<0b01101, 1, 0, 0b010, "cv.add.div2">;
4825f757f3fSDimitry Andric  def CV_ADD_DIV4 :    CVSIMDRR<0b01101, 1, 0, 0b100, "cv.add.div4">;
4835f757f3fSDimitry Andric  def CV_ADD_DIV8 :    CVSIMDRR<0b01101, 1, 0, 0b110, "cv.add.div8">;
4845f757f3fSDimitry Andric
4855f757f3fSDimitry Andric  def CV_SUB_DIV2 :    CVSIMDRR<0b01110, 1, 0, 0b010, "cv.sub.div2">;
4865f757f3fSDimitry Andric  def CV_SUB_DIV4 :    CVSIMDRR<0b01110, 1, 0, 0b100, "cv.sub.div4">;
4875f757f3fSDimitry Andric  def CV_SUB_DIV8 :    CVSIMDRR<0b01110, 1, 0, 0b110, "cv.sub.div8">;
4885f757f3fSDimitry Andric}
4895f757f3fSDimitry Andric
4905f757f3fSDimitry Andricclass CVInstImmBranch<bits<3> funct3, dag outs, dag ins,
4915f757f3fSDimitry Andric                      string opcodestr, string argstr>
4925f757f3fSDimitry Andric    : RVInstB<funct3, OPC_CUSTOM_0, outs, ins, opcodestr, argstr> {
4935f757f3fSDimitry Andric  bits<5> imm5;
4945f757f3fSDimitry Andric  let rs2 = imm5;
4955f757f3fSDimitry Andric  let DecoderNamespace = "XCVbi";
4965f757f3fSDimitry Andric}
4975f757f3fSDimitry Andric
4985f757f3fSDimitry Andriclet Predicates = [HasVendorXCVbi, IsRV32], hasSideEffects = 0, mayLoad = 0,
4995f757f3fSDimitry Andric    mayStore = 0, isBranch = 1, isTerminator = 1 in {
5005f757f3fSDimitry Andric  // Immediate branching operations
5015f757f3fSDimitry Andric  def CV_BEQIMM : CVInstImmBranch<0b110, (outs),
5025f757f3fSDimitry Andric        (ins GPR:$rs1, simm5:$imm5, simm13_lsb0:$imm12),
5035f757f3fSDimitry Andric        "cv.beqimm", "$rs1, $imm5, $imm12">, Sched<[]>;
5045f757f3fSDimitry Andric  def CV_BNEIMM : CVInstImmBranch<0b111, (outs),
5055f757f3fSDimitry Andric        (ins GPR:$rs1, simm5:$imm5, simm13_lsb0:$imm12),
5065f757f3fSDimitry Andric        "cv.bneimm", "$rs1, $imm5, $imm12">, Sched<[]>;
5075f757f3fSDimitry Andric}
5085f757f3fSDimitry Andric
5095f757f3fSDimitry Andricdef CVrrAsmOperand : AsmOperandClass {
5105f757f3fSDimitry Andric  let Name = "RegReg";
5115f757f3fSDimitry Andric  let ParserMethod = "parseRegReg";
5125f757f3fSDimitry Andric  let DiagnosticType = "InvalidRegReg";
5135f757f3fSDimitry Andric}
5145f757f3fSDimitry Andric
5150fca6ea1SDimitry Andricdef CVrr : Operand<i32>,
5160fca6ea1SDimitry Andric           ComplexPattern<i32, 2, "SelectAddrRegReg",[]> {
5175f757f3fSDimitry Andric   let ParserMatchClass = CVrrAsmOperand;
5185f757f3fSDimitry Andric   let EncoderMethod =  "getRegReg";
5195f757f3fSDimitry Andric   let DecoderMethod = "decodeRegReg";
5205f757f3fSDimitry Andric   let PrintMethod = "printRegReg";
5210fca6ea1SDimitry Andric   let MIOperandInfo = (ops GPR:$base, GPR:$offset);
5225f757f3fSDimitry Andric}
5235f757f3fSDimitry Andric
5245f757f3fSDimitry Andricclass CVLoad_ri_inc<bits<3> funct3, string opcodestr>
5255f757f3fSDimitry Andric    : RVInstI<funct3, OPC_CUSTOM_0, (outs GPR:$rd, GPR:$rs1_wb), (ins GPRMem:$rs1, simm12:$imm12),
5265f757f3fSDimitry Andric              opcodestr, "$rd, (${rs1}), ${imm12}"> {
5275f757f3fSDimitry Andric  let Constraints = "$rs1_wb = $rs1";
5285f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
5295f757f3fSDimitry Andric}
5305f757f3fSDimitry Andric
5315f757f3fSDimitry Andricclass CVLoad_rr_inc<bits<7> funct7, bits<3> funct3, string opcodestr>
5325f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1, (outs GPR:$rd, GPR:$rs1_wb), (ins GPRMem:$rs1, GPR:$rs2),
5335f757f3fSDimitry Andric              opcodestr, "$rd, (${rs1}), ${rs2}"> {
5345f757f3fSDimitry Andric  let Constraints = "$rs1_wb = $rs1";
5355f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
5365f757f3fSDimitry Andric}
5375f757f3fSDimitry Andric
5385f757f3fSDimitry Andricclass CVLoad_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
5395f757f3fSDimitry Andric    : RVInstR<funct7, funct3, OPC_CUSTOM_1, (outs GPR:$rd), (ins CVrr:$cvrr),
5405f757f3fSDimitry Andric              opcodestr, "$rd, $cvrr"> {
5415f757f3fSDimitry Andric  bits<5> rd;
5425f757f3fSDimitry Andric  bits<10> cvrr;
5435f757f3fSDimitry Andric
5445f757f3fSDimitry Andric  let Inst{31-25} = funct7;
5455f757f3fSDimitry Andric  let Inst{24-20} = cvrr{4-0};
5465f757f3fSDimitry Andric  let Inst{19-15} = cvrr{9-5};
5475f757f3fSDimitry Andric  let Inst{14-12} = funct3;
5485f757f3fSDimitry Andric  let Inst{11-7} = rd;
5495f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
5505f757f3fSDimitry Andric}
5515f757f3fSDimitry Andric
5525f757f3fSDimitry Andriclet Predicates = [HasVendorXCVmem, IsRV32], hasSideEffects = 0,
5535f757f3fSDimitry Andric                 mayLoad = 1, mayStore = 0, Constraints = "$rs1_wb = $rs1" in {
5545f757f3fSDimitry Andric  // Register-Immediate load with post-increment
5555f757f3fSDimitry Andric  def CV_LB_ri_inc  : CVLoad_ri_inc<0b000, "cv.lb">;
5565f757f3fSDimitry Andric  def CV_LBU_ri_inc : CVLoad_ri_inc<0b100, "cv.lbu">;
5575f757f3fSDimitry Andric  def CV_LH_ri_inc  : CVLoad_ri_inc<0b001, "cv.lh">;
5585f757f3fSDimitry Andric  def CV_LHU_ri_inc : CVLoad_ri_inc<0b101, "cv.lhu">;
5595f757f3fSDimitry Andric  def CV_LW_ri_inc  : CVLoad_ri_inc<0b010, "cv.lw">;
5605f757f3fSDimitry Andric
5615f757f3fSDimitry Andric  // Register-Register load with post-increment
5625f757f3fSDimitry Andric  def CV_LB_rr_inc  : CVLoad_rr_inc<0b0000000, 0b011, "cv.lb">;
5635f757f3fSDimitry Andric  def CV_LBU_rr_inc : CVLoad_rr_inc<0b0001000, 0b011, "cv.lbu">;
5645f757f3fSDimitry Andric  def CV_LH_rr_inc  : CVLoad_rr_inc<0b0000001, 0b011, "cv.lh">;
5655f757f3fSDimitry Andric  def CV_LHU_rr_inc : CVLoad_rr_inc<0b0001001, 0b011, "cv.lhu">;
5665f757f3fSDimitry Andric  def CV_LW_rr_inc  : CVLoad_rr_inc<0b0000010, 0b011, "cv.lw">;
5675f757f3fSDimitry Andric}
5685f757f3fSDimitry Andric
5695f757f3fSDimitry Andriclet Predicates = [HasVendorXCVmem, IsRV32], hasSideEffects = 0,
5705f757f3fSDimitry Andric                 mayLoad = 1, mayStore = 0 in {
5715f757f3fSDimitry Andric  // Register-Register load
5725f757f3fSDimitry Andric  def CV_LB_rr  : CVLoad_rr<0b0000100, 0b011, "cv.lb">;
5735f757f3fSDimitry Andric  def CV_LBU_rr : CVLoad_rr<0b0001100, 0b011, "cv.lbu">;
5745f757f3fSDimitry Andric  def CV_LH_rr  : CVLoad_rr<0b0000101, 0b011, "cv.lh">;
5755f757f3fSDimitry Andric  def CV_LHU_rr : CVLoad_rr<0b0001101, 0b011, "cv.lhu">;
5765f757f3fSDimitry Andric  def CV_LW_rr  : CVLoad_rr<0b0000110, 0b011, "cv.lw">;
5775f757f3fSDimitry Andric}
5785f757f3fSDimitry Andric
5795f757f3fSDimitry Andricclass CVStore_ri_inc<bits<3> funct3, string opcodestr>
5805f757f3fSDimitry Andric    : RVInstS<funct3, OPC_CUSTOM_1, (outs GPR:$rs1_wb),
5815f757f3fSDimitry Andric              (ins GPR:$rs2, GPR:$rs1, simm12:$imm12),
5825f757f3fSDimitry Andric              opcodestr, "$rs2, (${rs1}), ${imm12}"> {
5835f757f3fSDimitry Andric  let Constraints = "$rs1_wb = $rs1";
5845f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
5855f757f3fSDimitry Andric}
5865f757f3fSDimitry Andric
5875f757f3fSDimitry Andricclass CVStore_rr_inc<bits<3> funct3, bits<7> funct7, dag outs, dag ins,
5885f757f3fSDimitry Andric                     string opcodestr, string argstr>
5895f757f3fSDimitry Andric    : RVInst<outs, ins, opcodestr, argstr, [], InstFormatOther> {
5905f757f3fSDimitry Andric  bits<5> rs3;
5915f757f3fSDimitry Andric  bits<5> rs2;
5925f757f3fSDimitry Andric  bits<5> rs1;
5935f757f3fSDimitry Andric
5945f757f3fSDimitry Andric  let Inst{31-25} = funct7;
5955f757f3fSDimitry Andric  let Inst{24-20} = rs2;
5965f757f3fSDimitry Andric  let Inst{19-15} = rs1;
5975f757f3fSDimitry Andric  let Inst{14-12} = funct3;
5985f757f3fSDimitry Andric  let Inst{11-7} = rs3;
5995f757f3fSDimitry Andric  let Inst{6-0} = OPC_CUSTOM_1.Value;
6005f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
6015f757f3fSDimitry Andric}
6025f757f3fSDimitry Andric
6035f757f3fSDimitry Andric
6045f757f3fSDimitry Andricclass CVStore_rr<bits<3> funct3, bits<7> funct7, dag outs, dag ins,
6055f757f3fSDimitry Andric                     string opcodestr, string argstr>
6065f757f3fSDimitry Andric    : RVInst<outs, ins, opcodestr, argstr, [], InstFormatOther> {
6075f757f3fSDimitry Andric  bits<5> rs2;
6085f757f3fSDimitry Andric  bits<10> cvrr;
6095f757f3fSDimitry Andric
6105f757f3fSDimitry Andric  let Inst{31-25} = funct7;
6115f757f3fSDimitry Andric  let Inst{24-20} = rs2;
6125f757f3fSDimitry Andric  let Inst{19-15} = cvrr{9-5};
6135f757f3fSDimitry Andric  let Inst{14-12} = funct3;
6145f757f3fSDimitry Andric  let Inst{11-7} = cvrr{4-0};
6155f757f3fSDimitry Andric  let Inst{6-0} = OPC_CUSTOM_1.Value;
6165f757f3fSDimitry Andric  let DecoderNamespace = "XCVmem";
6175f757f3fSDimitry Andric}
6185f757f3fSDimitry Andric
6195f757f3fSDimitry Andriclet Predicates = [HasVendorXCVmem, IsRV32], hasSideEffects = 0,
6205f757f3fSDimitry Andric                 mayLoad = 0, mayStore = 1, Constraints = "$rs1_wb = $rs1" in {
6215f757f3fSDimitry Andric  // Register-Immediate store with post-increment
6225f757f3fSDimitry Andric  def CV_SB_ri_inc : CVStore_ri_inc<0b000, "cv.sb">;
6235f757f3fSDimitry Andric  def CV_SH_ri_inc : CVStore_ri_inc<0b001, "cv.sh">;
6245f757f3fSDimitry Andric  def CV_SW_ri_inc : CVStore_ri_inc<0b010, "cv.sw">;
6255f757f3fSDimitry Andric
6265f757f3fSDimitry Andric  // Register-Register store with post-increment
6275f757f3fSDimitry Andric  def CV_SB_rr_inc : CVStore_rr_inc<0b011, 0b0010000,
6285f757f3fSDimitry Andric                     (outs GPR:$rs1_wb), (ins GPR:$rs2, GPR:$rs1, GPR:$rs3),
6295f757f3fSDimitry Andric                      "cv.sb", "$rs2, (${rs1}), ${rs3}">;
6305f757f3fSDimitry Andric  def CV_SH_rr_inc : CVStore_rr_inc<0b011, 0b0010001,
6315f757f3fSDimitry Andric                     (outs GPR:$rs1_wb), (ins GPR:$rs2, GPR:$rs1, GPR:$rs3),
6325f757f3fSDimitry Andric                      "cv.sh", "$rs2, (${rs1}), ${rs3}">;
6335f757f3fSDimitry Andric  def CV_SW_rr_inc : CVStore_rr_inc<0b011, 0b0010010,
6345f757f3fSDimitry Andric                     (outs GPR:$rs1_wb), (ins GPR:$rs2, GPR:$rs1, GPR:$rs3),
6355f757f3fSDimitry Andric                      "cv.sw", "$rs2, (${rs1}), ${rs3}">;
6365f757f3fSDimitry Andric}
6375f757f3fSDimitry Andric
6385f757f3fSDimitry Andric
6395f757f3fSDimitry Andriclet Predicates = [HasVendorXCVmem, IsRV32], hasSideEffects = 0,
6405f757f3fSDimitry Andric                  mayLoad = 0, mayStore = 1 in {
6415f757f3fSDimitry Andric  // Register-Register store
6425f757f3fSDimitry Andric  def CV_SB_rr : CVStore_rr<0b011, 0b0010100,
6435f757f3fSDimitry Andric                 (outs), (ins GPR:$rs2, CVrr:$cvrr),
6445f757f3fSDimitry Andric                 "cv.sb", "$rs2, $cvrr">;
6455f757f3fSDimitry Andric  def CV_SH_rr : CVStore_rr<0b011, 0b0010101,
6465f757f3fSDimitry Andric                 (outs), (ins GPR:$rs2, CVrr:$cvrr),
6475f757f3fSDimitry Andric                 "cv.sh", "$rs2, $cvrr">;
6485f757f3fSDimitry Andric  def CV_SW_rr : CVStore_rr<0b011, 0b0010110,
6495f757f3fSDimitry Andric                 (outs), (ins GPR:$rs2, CVrr:$cvrr),
6505f757f3fSDimitry Andric                 "cv.sw", "$rs2, $cvrr">;
6515f757f3fSDimitry Andric}
6525f757f3fSDimitry Andric
6535f757f3fSDimitry Andriclet DecoderNamespace = "XCVelw" in
6545f757f3fSDimitry Andricclass CVLoad_ri<bits<3> funct3, string opcodestr>
6555f757f3fSDimitry Andric    : RVInstI<funct3, OPC_CUSTOM_0, (outs GPR:$rd),
6565f757f3fSDimitry Andric      (ins GPRMem:$rs1, simm12:$imm12), opcodestr, "$rd, ${imm12}(${rs1})">;
6575f757f3fSDimitry Andric
6585f757f3fSDimitry Andriclet Predicates = [HasVendorXCVelw, IsRV32], hasSideEffects = 0,
6595f757f3fSDimitry Andric    mayLoad = 1, mayStore = 0 in {
6605f757f3fSDimitry Andric  // Event load
6615f757f3fSDimitry Andric  def CV_ELW : CVLoad_ri<0b011, "cv.elw">;
6625f757f3fSDimitry Andric}
6635f757f3fSDimitry Andric
6640fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
6650fca6ea1SDimitry Andric// Patterns for load & store operations
6660fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
6670fca6ea1SDimitry Andricclass CVLdrrPat<PatFrag LoadOp, RVInst Inst>
6680fca6ea1SDimitry Andric    : Pat<(XLenVT (LoadOp CVrr:$regreg)),
6690fca6ea1SDimitry Andric          (Inst CVrr:$regreg)>;
6700fca6ea1SDimitry Andric
6710fca6ea1SDimitry Andricclass CVStriPat<PatFrag StoreOp, RVInst Inst>
6720fca6ea1SDimitry Andric    : Pat<(StoreOp (XLenVT GPR:$rs2), GPR:$rs1, simm12:$imm12),
6730fca6ea1SDimitry Andric          (Inst GPR:$rs2, GPR:$rs1, simm12:$imm12)>;
6740fca6ea1SDimitry Andric
6750fca6ea1SDimitry Andricclass CVStrriPat<PatFrag StoreOp, RVInst Inst>
6760fca6ea1SDimitry Andric    : Pat<(StoreOp (XLenVT GPR:$rs2), GPR:$rs1, GPR:$rs3),
6770fca6ea1SDimitry Andric          (Inst GPR:$rs2, GPR:$rs1, GPR:$rs3)>;
6780fca6ea1SDimitry Andric
6790fca6ea1SDimitry Andricclass CVStrrPat<PatFrag StoreOp, RVInst Inst>
6800fca6ea1SDimitry Andric    : Pat<(StoreOp (XLenVT GPR:$rs2), CVrr:$regreg),
6810fca6ea1SDimitry Andric          (Inst GPR:$rs2, CVrr:$regreg)>;
6820fca6ea1SDimitry Andric
6830fca6ea1SDimitry Andriclet Predicates = [HasVendorXCVmem, IsRV32], AddedComplexity = 1 in {
6840fca6ea1SDimitry Andric  def : CVLdrrPat<sextloadi8, CV_LB_rr>;
6850fca6ea1SDimitry Andric  def : CVLdrrPat<zextloadi8, CV_LBU_rr>;
6860fca6ea1SDimitry Andric  def : CVLdrrPat<extloadi8, CV_LBU_rr>;
6870fca6ea1SDimitry Andric  def : CVLdrrPat<sextloadi16, CV_LH_rr>;
6880fca6ea1SDimitry Andric  def : CVLdrrPat<zextloadi16, CV_LHU_rr>;
6890fca6ea1SDimitry Andric  def : CVLdrrPat<extloadi16, CV_LHU_rr>;
6900fca6ea1SDimitry Andric  def : CVLdrrPat<load, CV_LW_rr>;
6910fca6ea1SDimitry Andric
6920fca6ea1SDimitry Andric  def : CVStriPat<post_truncsti8, CV_SB_ri_inc>;
6930fca6ea1SDimitry Andric  def : CVStriPat<post_truncsti16, CV_SH_ri_inc>;
6940fca6ea1SDimitry Andric  def : CVStriPat<post_store, CV_SW_ri_inc>;
6950fca6ea1SDimitry Andric
6960fca6ea1SDimitry Andric  def : CVStrriPat<post_truncsti8, CV_SB_rr_inc>;
697*6c05f3a7SDimitry Andric  def : CVStrriPat<post_truncsti16, CV_SH_rr_inc>;
6980fca6ea1SDimitry Andric  def : CVStrriPat<post_store, CV_SW_rr_inc>;
6990fca6ea1SDimitry Andric
7000fca6ea1SDimitry Andric  def : CVStrrPat<truncstorei8, CV_SB_rr>;
7010fca6ea1SDimitry Andric  def : CVStrrPat<truncstorei16, CV_SH_rr>;
7020fca6ea1SDimitry Andric  def : CVStrrPat<store, CV_SW_rr>;
7030fca6ea1SDimitry Andric}
7040fca6ea1SDimitry Andric
7055f757f3fSDimitry Andricdef cv_tuimm2 : TImmLeaf<XLenVT, [{return isUInt<2>(Imm);}]>;
7065f757f3fSDimitry Andricdef cv_tuimm5 : TImmLeaf<XLenVT, [{return isUInt<5>(Imm);}]>;
7075f757f3fSDimitry Andricdef cv_uimm10 : ImmLeaf<XLenVT, [{return isUInt<10>(Imm);}]>;
7085f757f3fSDimitry Andric
7095f757f3fSDimitry Andricdef CV_LO5: SDNodeXForm<imm, [{
7105f757f3fSDimitry Andric  return CurDAG->getTargetConstant(N->getZExtValue() & 0x1f, SDLoc(N),
7115f757f3fSDimitry Andric                                   N->getValueType(0));
7125f757f3fSDimitry Andric}]>;
7135f757f3fSDimitry Andric
7145f757f3fSDimitry Andricdef CV_HI5: SDNodeXForm<imm, [{
7155f757f3fSDimitry Andric  return CurDAG->getTargetConstant(N->getZExtValue() >> 5, SDLoc(N),
7165f757f3fSDimitry Andric                                   N->getValueType(0));
7175f757f3fSDimitry Andric}]>;
7185f757f3fSDimitry Andric
7190fca6ea1SDimitry Andricdef powerOf2Minus1 : ImmLeaf<XLenVT, [{ return isPowerOf2_32(Imm+1); }]>;
7200fca6ea1SDimitry Andricdef trailing1sPlus1 : SDNodeXForm<imm, [{
7210fca6ea1SDimitry Andric  return CurDAG->getTargetConstant(
7220fca6ea1SDimitry Andric                          llvm::countr_one(N->getZExtValue()) + 1,
7230fca6ea1SDimitry Andric                          SDLoc(N), N->getValueType(0));
7240fca6ea1SDimitry Andric}]>;
7250fca6ea1SDimitry Andric
7265f757f3fSDimitry Andricmulticlass PatCoreVBitManip<Intrinsic intr> {
7275f757f3fSDimitry Andric  def : PatGprGpr<intr, !cast<RVInst>("CV_" # NAME # "R")>;
7285f757f3fSDimitry Andric  def : Pat<(intr GPR:$rs1, cv_uimm10:$imm),
7295f757f3fSDimitry Andric            (!cast<RVInst>("CV_" # NAME)
7305f757f3fSDimitry Andric             GPR:$rs1, (CV_HI5 cv_uimm10:$imm), (CV_LO5 cv_uimm10:$imm))>;
7315f757f3fSDimitry Andric}
7325f757f3fSDimitry Andric
7335f757f3fSDimitry Andriclet Predicates = [HasVendorXCVbitmanip, IsRV32] in {
7345f757f3fSDimitry Andric  defm EXTRACT : PatCoreVBitManip<int_riscv_cv_bitmanip_extract>;
7355f757f3fSDimitry Andric  defm EXTRACTU : PatCoreVBitManip<int_riscv_cv_bitmanip_extractu>;
7365f757f3fSDimitry Andric  defm BCLR : PatCoreVBitManip<int_riscv_cv_bitmanip_bclr>;
7375f757f3fSDimitry Andric  defm BSET : PatCoreVBitManip<int_riscv_cv_bitmanip_bset>;
7385f757f3fSDimitry Andric
7395f757f3fSDimitry Andric  def : Pat<(int_riscv_cv_bitmanip_insert GPR:$rs1, GPR:$rs2, GPR:$rd),
7405f757f3fSDimitry Andric            (CV_INSERTR GPR:$rd, GPR:$rs1, GPR:$rs2)>;
7415f757f3fSDimitry Andric  def : Pat<(int_riscv_cv_bitmanip_insert GPR:$rs1, cv_uimm10:$imm, GPR:$rd),
7425f757f3fSDimitry Andric            (CV_INSERT GPR:$rd, GPR:$rs1, (CV_HI5 cv_uimm10:$imm),
7435f757f3fSDimitry Andric                                          (CV_LO5 cv_uimm10:$imm))>;
7445f757f3fSDimitry Andric
7455f757f3fSDimitry Andric  def : PatGpr<cttz, CV_FF1>;
7465f757f3fSDimitry Andric  def : PatGpr<ctlz, CV_FL1>;
7475f757f3fSDimitry Andric  def : PatGpr<int_riscv_cv_bitmanip_clb, CV_CLB>;
7485f757f3fSDimitry Andric  def : PatGpr<ctpop, CV_CNT>;
7495f757f3fSDimitry Andric
7505f757f3fSDimitry Andric  def : PatGprGpr<rotr, CV_ROR>;
7515f757f3fSDimitry Andric
7525f757f3fSDimitry Andric  def : Pat<(int_riscv_cv_bitmanip_bitrev GPR:$rs1, cv_tuimm5:$pts,
7535f757f3fSDimitry Andric             cv_tuimm2:$radix),
7545f757f3fSDimitry Andric            (CV_BITREV GPR:$rs1, cv_tuimm2:$radix, cv_tuimm5:$pts)>;
7555f757f3fSDimitry Andric  def : Pat<(bitreverse (XLenVT GPR:$rs)), (CV_BITREV GPR:$rs, 0, 0)>;
7565f757f3fSDimitry Andric}
7570fca6ea1SDimitry Andric
7580fca6ea1SDimitry Andricclass PatCoreVAluGpr<string intr, string asm> :
7590fca6ea1SDimitry Andric  PatGpr<!cast<Intrinsic>("int_riscv_cv_alu_" # intr),
7600fca6ea1SDimitry Andric            !cast<RVInst>("CV_" # asm)>;
7610fca6ea1SDimitry Andricclass PatCoreVAluGprGpr <string intr, string asm> :
7620fca6ea1SDimitry Andric  PatGprGpr<!cast<Intrinsic>("int_riscv_cv_alu_" # intr),
7630fca6ea1SDimitry Andric               !cast<RVInst>("CV_" # asm)>;
7640fca6ea1SDimitry Andric
7650fca6ea1SDimitry Andricmulticlass PatCoreVAluGprImm<Intrinsic intr> {
7660fca6ea1SDimitry Andric  def : PatGprGpr<intr, !cast<RVInst>("CV_" # NAME # "R")>;
7670fca6ea1SDimitry Andric  def : Pat<(intr (XLenVT GPR:$rs1), powerOf2Minus1:$upperBound),
7680fca6ea1SDimitry Andric            (!cast<RVInst>("CV_" # NAME) GPR:$rs1,
7690fca6ea1SDimitry Andric            (trailing1sPlus1 imm:$upperBound))>;
7700fca6ea1SDimitry Andric}
7710fca6ea1SDimitry Andric
7720fca6ea1SDimitry Andricmulticlass PatCoreVAluGprGprImm<Intrinsic intr> {
7730fca6ea1SDimitry Andric  def : Pat<(intr GPR:$rs1, GPR:$rs2, GPR:$rs3),
7740fca6ea1SDimitry Andric            (!cast<RVInst>("CV_" # NAME # "R") GPR:$rs1, GPR:$rs2, GPR:$rs3)>;
7750fca6ea1SDimitry Andric  def : Pat<(intr GPR:$rs1, GPR:$rs2, uimm5:$imm),
7760fca6ea1SDimitry Andric            (!cast<RVInst>("CV_" # NAME) GPR:$rs1, GPR:$rs2, uimm5:$imm)>;
7770fca6ea1SDimitry Andric}
7780fca6ea1SDimitry Andric
7790fca6ea1SDimitry Andriclet Predicates = [HasVendorXCValu, IsRV32], AddedComplexity = 1 in {
7800fca6ea1SDimitry Andric  def : PatGpr<abs, CV_ABS>;
7810fca6ea1SDimitry Andric  def : PatGprGpr<setle, CV_SLET>;
7820fca6ea1SDimitry Andric  def : PatGprGpr<setule, CV_SLETU>;
7830fca6ea1SDimitry Andric  def : PatGprGpr<smin, CV_MIN>;
7840fca6ea1SDimitry Andric  def : PatGprGpr<umin, CV_MINU>;
7850fca6ea1SDimitry Andric  def : PatGprGpr<smax, CV_MAX>;
7860fca6ea1SDimitry Andric  def : PatGprGpr<umax, CV_MAXU>;
7870fca6ea1SDimitry Andric
7880fca6ea1SDimitry Andric  def : Pat<(sext_inreg (XLenVT GPR:$rs1), i16), (CV_EXTHS GPR:$rs1)>;
7890fca6ea1SDimitry Andric  def : Pat<(sext_inreg (XLenVT GPR:$rs1), i8), (CV_EXTBS GPR:$rs1)>;
7900fca6ea1SDimitry Andric  def : Pat<(and (XLenVT GPR:$rs1), 0xffff), (CV_EXTHZ GPR:$rs1)>;
7910fca6ea1SDimitry Andric
7920fca6ea1SDimitry Andric  defm CLIP   : PatCoreVAluGprImm<int_riscv_cv_alu_clip>;
7930fca6ea1SDimitry Andric  defm CLIPU  : PatCoreVAluGprImm<int_riscv_cv_alu_clipu>;
7940fca6ea1SDimitry Andric  defm ADDN   : PatCoreVAluGprGprImm<int_riscv_cv_alu_addn>;
7950fca6ea1SDimitry Andric  defm ADDUN  : PatCoreVAluGprGprImm<int_riscv_cv_alu_addun>;
7960fca6ea1SDimitry Andric  defm ADDRN  : PatCoreVAluGprGprImm<int_riscv_cv_alu_addrn>;
7970fca6ea1SDimitry Andric  defm ADDURN : PatCoreVAluGprGprImm<int_riscv_cv_alu_addurn>;
7980fca6ea1SDimitry Andric  defm SUBN   : PatCoreVAluGprGprImm<int_riscv_cv_alu_subn>;
7990fca6ea1SDimitry Andric  defm SUBUN  : PatCoreVAluGprGprImm<int_riscv_cv_alu_subun>;
8000fca6ea1SDimitry Andric  defm SUBRN  : PatCoreVAluGprGprImm<int_riscv_cv_alu_subrn>;
8010fca6ea1SDimitry Andric  defm SUBURN : PatCoreVAluGprGprImm<int_riscv_cv_alu_suburn>;
8020fca6ea1SDimitry Andric} // Predicates = [HasVendorXCValu, IsRV32]
8030fca6ea1SDimitry Andric
8040fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
8050fca6ea1SDimitry Andric// Patterns for immediate branching operations
8060fca6ea1SDimitry Andric//===----------------------------------------------------------------------===//
8070fca6ea1SDimitry Andric
8080fca6ea1SDimitry Andriclet Predicates = [HasVendorXCVbi, IsRV32], AddedComplexity = 2 in {
8090fca6ea1SDimitry Andric  def : Pat<(riscv_brcc GPR:$rs1, simm5:$imm5, SETEQ, bb:$imm12),
8100fca6ea1SDimitry Andric            (CV_BEQIMM GPR:$rs1, simm5:$imm5, simm13_lsb0:$imm12)>;
8110fca6ea1SDimitry Andric  def : Pat<(riscv_brcc GPR:$rs1, simm5:$imm5, SETNE, bb:$imm12),
8120fca6ea1SDimitry Andric            (CV_BNEIMM GPR:$rs1, simm5:$imm5, simm13_lsb0:$imm12)>;
8130fca6ea1SDimitry Andric
8140fca6ea1SDimitry Andric  let usesCustomInserter = 1 in
8150fca6ea1SDimitry Andric  def Select_GPR_Using_CC_Imm : Pseudo<(outs GPR:$dst),
8160fca6ea1SDimitry Andric                             (ins GPR:$lhs, simm5:$imm5, ixlenimm:$cc,
8170fca6ea1SDimitry Andric                              GPR:$truev, GPR:$falsev), []>;
8180fca6ea1SDimitry Andric
8190fca6ea1SDimitry Andric
8200fca6ea1SDimitry Andric  class Selectbi<CondCode Cond>
8210fca6ea1SDimitry Andric      : Pat<(riscv_selectcc_frag:$cc (i32 GPR:$lhs), simm5:$Constant, Cond,
8220fca6ea1SDimitry Andric                                     (i32 GPR:$truev), GPR:$falsev),
8230fca6ea1SDimitry Andric            (Select_GPR_Using_CC_Imm GPR:$lhs, simm5:$Constant,
8240fca6ea1SDimitry Andric             (IntCCtoRISCVCC $cc), GPR:$truev, GPR:$falsev)>;
8250fca6ea1SDimitry Andric
8260fca6ea1SDimitry Andric  def : Selectbi<SETEQ>;
8270fca6ea1SDimitry Andric  def : Selectbi<SETNE>;
8280fca6ea1SDimitry Andric}
8290fca6ea1SDimitry Andric
8300fca6ea1SDimitry Andricclass PatCoreVMacGprGprGpr <string intr, string asm>
8310fca6ea1SDimitry Andric  : Pat<(!cast<Intrinsic>("int_riscv_cv_mac_" # intr) GPR:$rs1, GPR:$rs2, GPR:$rd),
8320fca6ea1SDimitry Andric        (!cast<RVInst>("CV_" # asm) GPR:$rd, GPR:$rs1, GPR:$rs2)>;
8330fca6ea1SDimitry Andricclass PatCoreVMacGprGprGprUimm5 <string intr, string asm>
8340fca6ea1SDimitry Andric  : Pat<(!cast<Intrinsic>("int_riscv_cv_mac_" # intr) GPR:$rs1, GPR:$rs2, GPR:$rd, cv_tuimm5:$imm5),
8350fca6ea1SDimitry Andric        (!cast<RVInst>("CV_" # asm) GPR:$rd, GPR:$rs1, GPR:$rs2, cv_tuimm5:$imm5)>;
8360fca6ea1SDimitry Andricclass PatCoreVMacGprGprUimm5 <string intr, string asm>
8370fca6ea1SDimitry Andric  : Pat<(!cast<Intrinsic>("int_riscv_cv_mac_" # intr) GPR:$rs1, GPR:$rs2, cv_tuimm5:$imm5),
8380fca6ea1SDimitry Andric        (!cast<RVInst>("CV_" # asm) GPR:$rs1, GPR:$rs2, cv_tuimm5:$imm5)>;
8390fca6ea1SDimitry Andric
8400fca6ea1SDimitry Andriclet Predicates = [HasVendorXCVmac] in {
8410fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGpr<"mac", "MAC">;
8420fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGpr<"msu", "MSU">;
8430fca6ea1SDimitry Andric
8440fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"muluN", "MULUN">;
8450fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulhhuN", "MULHHUN">;
8460fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulsN", "MULSN">;
8470fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulhhsN", "MULHHSN">;
8480fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"muluRN", "MULURN">;
8490fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulhhuRN", "MULHHURN">;
8500fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulsRN", "MULSRN">;
8510fca6ea1SDimitry Andric  def : PatCoreVMacGprGprUimm5<"mulhhsRN", "MULHHSRN">;
8520fca6ea1SDimitry Andric
8530fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"macuN", "MACUN">;
8540fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"machhuN", "MACHHUN">;
8550fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"macsN", "MACSN">;
8560fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"machhsN", "MACHHSN">;
8570fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"macuRN", "MACURN">;
8580fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"machhuRN", "MACHHURN">;
8590fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"macsRN", "MACSRN">;
8600fca6ea1SDimitry Andric  def : PatCoreVMacGprGprGprUimm5<"machhsRN", "MACHHSRN">;
8610fca6ea1SDimitry Andric}
862