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