brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 3a6ce3c Raw
190 lines · plain
1//===-- RISCVInstrInfoXRivos.td ----------------------------*- tablegen -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file describes the vendor extensions defined by Rivos Inc.10//11//===----------------------------------------------------------------------===//12 13class CustomRivosVXI<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,14                string opcodestr, string argstr>15    : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {16  bits<5> imm;17  bits<5> rs1;18  bits<5> vd;19  bit vm = 0;20 21  let Inst{31-26} = funct6;22  let Inst{25} = vm;23  let Inst{24-20} = imm;24  let Inst{19-15} = rs1;25  let Inst{14-12} = opv.Value;26  let Inst{11-7} = vd;27  let Inst{6-0} = OPC_CUSTOM_2.Value;28 29  let Uses = [VL, VTYPE];30  let RVVConstraint = NoConstraint;31  let Constraints = "$vd = $vd_wb";32}33 34class CustomRivosXVI<bits<6> funct6, RISCVVFormat opv, dag outs, dag ins,35                string opcodestr, string argstr>36    : RVInst<outs, ins, opcodestr, argstr, [], InstFormatR> {37  bits<5> imm;38  bits<5> vs2;39  bits<5> rd;40  bit vm = 1;41 42  let Inst{31-26} = funct6;43  let Inst{25} = vm;44  let Inst{24-20} = vs2;45  let Inst{19-15} = imm;46  let Inst{14-12} = opv.Value;47  let Inst{11-7} = rd;48  let Inst{6-0} = OPC_CUSTOM_2.Value;49 50  let Uses = [VL, VTYPE];51  let RVVConstraint = NoConstraint;52}53 54//===----------------------------------------------------------------------===//55// XRivosVizip56//===----------------------------------------------------------------------===//57 58 59let Predicates = [HasVendorXRivosVizip], DecoderNamespace = "XRivos",60  Constraints = "@earlyclobber $vd", RVVConstraint = Vrgather,61  Inst<6-0> = OPC_CUSTOM_2.Value, ReadsPastVL = 1 in  {62defm RI_VZIPEVEN_V : VALU_IV_V<"ri.vzipeven", 0b001100>;63defm RI_VZIPODD_V : VALU_IV_V<"ri.vzipodd", 0b011100>;64defm RI_VZIP2A_V : VALU_IV_V<"ri.vzip2a", 0b000100>;65defm RI_VZIP2B_V : VALU_IV_V<"ri.vzip2b", 0b010100>;66defm RI_VUNZIP2A_V : VALU_IV_V<"ri.vunzip2a", 0b001000>;67defm RI_VUNZIP2B_V : VALU_IV_V<"ri.vunzip2b", 0b011000>;68}69 70// These are modeled after the int binop VL nodes71let HasMaskOp = true in {72  def ri_vzipeven_vl : RVSDNode<"RI_VZIPEVEN_VL", SDT_RISCVIntBinOp_VL>;73  def ri_vzipodd_vl : RVSDNode<"RI_VZIPODD_VL", SDT_RISCVIntBinOp_VL>;74  def ri_vzip2a_vl : RVSDNode<"RI_VZIP2A_VL", SDT_RISCVIntBinOp_VL>;75  def ri_vzip2b_vl : RVSDNode<"RI_VZIP2B_VL", SDT_RISCVIntBinOp_VL>;76  def ri_vunzip2a_vl : RVSDNode<"RI_VUNZIP2A_VL", SDT_RISCVIntBinOp_VL>;77  def ri_vunzip2b_vl : RVSDNode<"RI_VUNZIP2B_VL", SDT_RISCVIntBinOp_VL>;78}79 80multiclass RIVPseudoVALU_VV {81  foreach m = MxList in82    defm "" : VPseudoBinaryV_VV<m, Commutable=0>;83}84 85let Predicates = [HasVendorXRivosVizip],86  Constraints = "@earlyclobber $rd, $rd = $passthru" in {87defm PseudoRI_VZIPEVEN   : RIVPseudoVALU_VV;88defm PseudoRI_VZIPODD   : RIVPseudoVALU_VV;89defm PseudoRI_VZIP2A   : RIVPseudoVALU_VV;90defm PseudoRI_VZIP2B   : RIVPseudoVALU_VV;91defm PseudoRI_VUNZIP2A   : RIVPseudoVALU_VV;92defm PseudoRI_VUNZIP2B   : RIVPseudoVALU_VV;93}94 95multiclass RIVPatBinaryVL_VV<SDPatternOperator vop, string instruction_name,96                              list<VTypeInfo> vtilist = AllIntegerVectors,97                              bit isSEWAware = false> {98  foreach vti = vtilist in99    let Predicates = GetVTypePredicates<vti>.Predicates in100      def : VPatBinaryVL_V<vop, instruction_name, "VV",101                           vti.Vector, vti.Vector, vti.Vector, vti.Mask,102                           vti.Log2SEW, vti.LMul, vti.RegClass, vti.RegClass,103                           vti.RegClass, isSEWAware>;104}105 106defm : RIVPatBinaryVL_VV<ri_vzipeven_vl, "PseudoRI_VZIPEVEN">;107defm : RIVPatBinaryVL_VV<ri_vzipodd_vl, "PseudoRI_VZIPODD">;108defm : RIVPatBinaryVL_VV<ri_vzip2a_vl, "PseudoRI_VZIP2A">;109defm : RIVPatBinaryVL_VV<ri_vzip2b_vl, "PseudoRI_VZIP2B">;110defm : RIVPatBinaryVL_VV<ri_vunzip2a_vl, "PseudoRI_VUNZIP2A">;111defm : RIVPatBinaryVL_VV<ri_vunzip2b_vl, "PseudoRI_VUNZIP2B">;112 113//===----------------------------------------------------------------------===//114// XRivosVisni115//===----------------------------------------------------------------------===//116 117let Predicates = [HasVendorXRivosVisni], DecoderNamespace = "XRivos",118  mayLoad = false, mayStore = false, hasSideEffects = false in {119 120let vm = 0, vs2=0, Inst<6-0> = OPC_CUSTOM_2.Value,121    isReMaterializable = 1, isAsCheapAsAMove = 1 in122def RI_VZERO : RVInstV<0b000000, 0b00000, OPCFG, (outs VR:$vd),123                     (ins), "ri.vzero.v", "$vd">;124 125def RI_VINSERT : CustomRivosVXI<0b010000, OPMVX, (outs VR:$vd_wb),126                                (ins VR:$vd, GPR:$rs1, uimm5:$imm),127                                "ri.vinsert.v.x", "$vd, $rs1, $imm">;128 129let ReadsPastVL = 1 in130def RI_VEXTRACT : CustomRivosXVI<0b010111, OPMVV, (outs GPR:$rd),131                                (ins VR:$vs2, uimm5:$imm),132                                "ri.vextract.x.v", "$rd, $vs2, $imm">;133}134 135// RI_VEXTRACT matches the semantics of ri.vextract.x.v. The result is always136// XLenVT sign extended from the vector element size.  VEXTRACT does *not*137// have a VL operand.138def ri_vextract : RVSDNode<"RI_VEXTRACT",139                           SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisVec<1>,140                                                SDTCisInt<2>,141                                                SDTCisInt<1>]>>;142 143// RI_VINSERT_VL matches the semantics of ri.vinsert.v.x. It carries a VL operand.144def ri_vinsert_vl : RVSDNode<"RI_VINSERT_VL",145                             SDTypeProfile<1, 5, [SDTCisSameAs<0, 1>,146                                                  SDTCisInt<0>,147                                                  SDTCisVT<2, XLenVT>,148                                                  SDTCisVT<3, XLenVT>,149                                                  SDTCisVT<4, XLenVT>]>>;150 151let Predicates = [HasVendorXRivosVisni], mayLoad = 0, mayStore = 0,152    hasSideEffects = 0, HasSEWOp = 1 in153foreach m = MxList in {154  defvar mx = m.MX;155  let VLMul = m.value in {156    let BaseInstr = RI_VEXTRACT in157    def PseudoRI_VEXTRACT_  # mx :158      RISCVVPseudo<(outs GPR:$rd),159                   (ins m.vrclass:$rs2, uimm5:$idx, ixlenimm:$sew),160                   []>;161 162    let HasVLOp = 1, BaseInstr = RI_VINSERT, HasVecPolicyOp = 1,163        Constraints = "$rd = $rs1" in164    def PseudoRI_VINSERT_ # mx :165      RISCVVPseudo<(outs m.vrclass:$rd),166                   (ins m.vrclass:$rs1, GPR:$rs2, uimm5:$idx, AVL:$vl,167                        ixlenimm:$sew, ixlenimm:$policy),168                   []>;169  }170}171 172 173 174foreach vti = AllIntegerVectors in175  let Predicates = GetVTypePredicates<vti>.Predicates in {176    def : Pat<(XLenVT (ri_vextract (vti.Vector vti.RegClass:$vs2), uimm5:$imm)),177              (!cast<Instruction>("PseudoRI_VEXTRACT_" # vti.LMul.MX)178               $vs2, uimm5:$imm, vti.Log2SEW)>;179 180    def : Pat<(vti.Vector (ri_vinsert_vl (vti.Vector vti.RegClass:$merge),181                                          vti.ScalarRegClass:$rs1,182                                          uimm5:$imm,183                                          VLOpFrag,184                                          (XLenVT timm:$policy))),185              (!cast<Instruction>("PseudoRI_VINSERT_" # vti.LMul.MX)186               $merge, vti.ScalarRegClass:$rs1, uimm5:$imm,187               GPR:$vl, vti.Log2SEW, (XLenVT timm:$policy))>;188 189  }190