//===---- RISCVInstrInfoZvzip.td - 'Zvzip' instructions ----*- tablegen -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file describes the RISC-V instructions from the Zvzip standard extension // for reordering structured data in vector registers. // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// let Predicates = [HasStdExtZvzip], Constraints = "@earlyclobber $vd" in { let VS1VS2Constraint = WidenV in def VZIP_VV : VALUVV<0b111110, OPMVV, "vzip.vv">; let VS1VS2Constraint = VS2Constraint in { def VUNZIPE_V : VALUVs2<0b010010, 0b01011, OPMVV, "vunzipe.v">; def VUNZIPO_V : VALUVs2<0b010010, 0b01111, OPMVV, "vunzipo.v">; } let VS1VS2Constraint = Vrgather in { def VPAIRE_VV : VALUVV<0b001111, OPIVV, "vpaire.vv">; def VPAIRO_VV : VALUVV<0b001111, OPMVV, "vpairo.vv">; } } // Predicates = [HasStdExtZvzip] defset list AllZvzipVectors = { def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; // Floating-point 16-bit def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; // BF16 def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; // Floating-point 32-bit def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; // Floating-point 64-bit def : VTypeInfoToWide; def : VTypeInfoToWide; def : VTypeInfoToWide; } multiclass VPseudoVZIP { foreach m = MxListW in defm "" : VPseudoBinaryW_VV, SchedBinary<"WriteVIWALUV", "ReadVIWALUV", "ReadVIWALUV", m.MX, forcePassthruRead=true>; } multiclass VPseudoVUNZIP { foreach m = MxListW in { defvar mx = m.MX; let VLMul = m.value in { def "_V_" # mx : VPseudoUnaryNoMask, SchedUnary<"WriteVIALUV", "ReadVIALUV", mx, forcePassthruRead=true>; def "_V_" # mx # "_MASK" : VPseudoUnaryMask, RISCVMaskedPseudo, SchedUnary<"WriteVIALUV", "ReadVIALUV", mx, forcePassthruRead=true>; } } } let Predicates = [HasStdExtZvzip], Constraints = "@earlyclobber $rd, $rd = $passthru" in { defm PseudoVZIP : VPseudoVZIP; defm PseudoVUNZIPE : VPseudoVUNZIP; defm PseudoVUNZIPO : VPseudoVUNZIP; defm PseudoVPAIRE : VPseudoVALU_VV; defm PseudoVPAIRO : VPseudoVALU_VV; } multiclass VPatVUnzipIntrinsic { foreach VtiToWti = AllZvzipVectors in { defvar vti = VtiToWti.Vti; defvar wti = VtiToWti.Wti; let Predicates = !listconcat(GetVTypeMinimalPredicates.Predicates, [HasStdExtZvzip]) in { def : VPatUnaryNoMask; def : VPatUnaryMask; } } } defm : VPatVUnzipIntrinsic<"int_riscv_vunzipe", "PseudoVUNZIPE">; defm : VPatVUnzipIntrinsic<"int_riscv_vunzipo", "PseudoVUNZIPO">; defm : VPatBinaryV_VV<"int_riscv_vpaire", "PseudoVPAIRE", AllVectors, ExtraPreds = [HasStdExtZvzip], requireMinimal = true>; defm : VPatBinaryV_VV<"int_riscv_vpairo", "PseudoVPAIRO", AllVectors, ExtraPreds = [HasStdExtZvzip], requireMinimal = true>; defm : VPatBinaryW_VV<"int_riscv_vzip", "PseudoVZIP", AllZvzipVectors, ExtraPreds = [HasStdExtZvzip], requireMinimal = true>; // (vd (op vs2, vs1, passthru, mask, vl)) def SDT_RISCVZip_VL : SDTypeProfile<1, 5, [SDTCisVec<0>, SDTCisVec<1>, SDTCisSubVecOfVec<1, 0>, SDTCisSameAs<1, 2>, SDTCisSameAs<0, 3>, SDTCVecEltisVT<4, i1>, SDTCisSameNumEltsAs<1, 4>, SDTCisVT<5, XLenVT>]>; // (vd (op vs2, passthru, mask, vl)) def SDT_RISCVUnzip_VL : SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisVec<1>, SDTCisSubVecOfVec<0, 1>, SDTCisSameAs<0, 2>, SDTCVecEltisVT<3, i1>, SDTCisSameNumEltsAs<0, 3>, SDTCisVT<4, XLenVT>]>; def SDT_RISCVVecBinOp_VL : SDTypeProfile<1, 5, [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisVec<0>, SDTCisSameAs<0, 3>, SDTCVecEltisVT<4, i1>, SDTCisSameNumEltsAs<0, 4>, SDTCisVT<5, XLenVT>]>; let HasPassthruOp = true, HasMaskOp = true in { def vpaire_vl : RVSDNode<"VPAIRE_VL", SDT_RISCVVecBinOp_VL>; def vpairo_vl : RVSDNode<"VPAIRO_VL", SDT_RISCVVecBinOp_VL>; def vzip_vl : RVSDNode<"VZIP_VL", SDT_RISCVZip_VL>; def vunzipe_vl : RVSDNode<"VUNZIPE_VL", SDT_RISCVUnzip_VL>; def vunzipo_vl : RVSDNode<"VUNZIPO_VL", SDT_RISCVUnzip_VL>; } // HasPassthruOp = true, HasMaskOp = true multiclass VPatVZIP { foreach VtiToWti = AllZvzipVectors in { defvar vti = VtiToWti.Vti; defvar wti = VtiToWti.Wti; let Predicates = !listconcat([HasStdExtZvzip], GetVTypeMinimalPredicates.Predicates) in { def : VPatBinaryVL_V; } } } multiclass VPatVUNZIP { foreach VtiToWti = AllZvzipVectors in { defvar vti = VtiToWti.Vti; defvar wti = VtiToWti.Wti; let Predicates = !listconcat([HasStdExtZvzip], GetVTypeMinimalPredicates.Predicates) in { def : VPatUnaryVL_V; } } } defm : VPatVZIP; defm : VPatVUNZIP; defm : VPatVUNZIP; defm : VPatBinaryVL_VV; defm : VPatBinaryVL_VV;