| //===-------------- VVPInstrInfo.td - VVP_* SDNode patterns ---------------===// | |
| // | |
| // 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 defines the VE Vector Predicated SDNodes (VVP SDNodes). VVP | |
| // SDNodes are an intermediate isel layer between the vector SDNodes emitted by | |
| // LLVM and the actual VE vector instructions. For example: | |
| // | |
| // ADD(x,y) --> VVP_ADD(x,y,mask,evl) --> VADDSWSXrvml(x,y,mask,evl) | |
| // ^ ^ ^ | |
| // The standard The VVP layer SDNode. The VE vector instruction. | |
| // SDNode. | |
| // | |
| // TODO explain how VVP nodes relate to VP SDNodes once VP ISel is uptream. | |
| //===----------------------------------------------------------------------===// | |
| // vvp_load(ptr, stride, mask, avl) | |
| def SDTLoadVVP : SDTypeProfile<1, 4, [ | |
| SDTCisVec<0>, | |
| SDTCisPtrTy<1>, | |
| SDTCisInt<2>, | |
| SDTCisVec<3>, | |
| IsVLVT<4> | |
| ]>; | |
| // vvp_store(data, ptr, stride, mask, avl) | |
| def SDTStoreVVP: SDTypeProfile<0, 5, [ | |
| SDTCisVec<0>, | |
| SDTCisPtrTy<1>, | |
| SDTCisInt<2>, | |
| SDTCisVec<3>, | |
| IsVLVT<4> | |
| ]>; | |
| // vvp_scatter(chain, data, addr, mask, avl) | |
| def SDTScatterVVP: SDTypeProfile<0, 4, [ | |
| SDTCisVec<0>, | |
| SDTCisVec<1>, | |
| SDTCisVec<2>, | |
| SDTCisSameNumEltsAs<0, 2>, | |
| IsVLVT<3> | |
| ]>; | |
| // vvp_gather(chain, addr, mask, avl) | |
| def SDTGatherVVP: SDTypeProfile<1, 3, [ | |
| SDTCisVec<0>, | |
| SDTCisVec<1>, | |
| SDTCisSameNumEltsAs<0, 2>, | |
| IsVLVT<3> | |
| ]>; | |
| // BinaryOp(x,y,mask,vl) | |
| def SDTIntBinOpVVP : SDTypeProfile<1, 4, [ // vp_add, vp_and, etc. | |
| SDTCisSameAs<0, 1>, | |
| SDTCisSameAs<0, 2>, | |
| SDTCisInt<0>, | |
| SDTCisSameNumEltsAs<0, 3>, | |
| IsVLVT<4> | |
| ]>; | |
| // UnaryFPOp(x,mask,vl) | |
| def SDTFPUnaryOpVVP : SDTypeProfile<1, 3, [ | |
| SDTCisSameAs<0, 1>, | |
| SDTCisFP<0>, | |
| SDTCisInt<2>, | |
| SDTCisSameNumEltsAs<0, 2>, | |
| IsVLVT<3> | |
| ]>; | |
| // BinaryFPOp(x,y,mask,vl) | |
| def SDTFPBinOpVVP : SDTypeProfile<1, 4, [ // vvp_fadd, etc. | |
| SDTCisSameAs<0, 1>, | |
| SDTCisSameAs<0, 2>, | |
| SDTCisFP<0>, | |
| SDTCisInt<3>, | |
| SDTCisSameNumEltsAs<0, 3>, | |
| IsVLVT<4> | |
| ]>; | |
| // TernaryFPOp(x,y,z,mask,vl) | |
| def SDTFPTernaryOpVVP : SDTypeProfile<1, 5, [ | |
| SDTCisSameAs<0, 1>, | |
| SDTCisSameAs<0, 2>, | |
| SDTCisSameAs<0, 3>, | |
| SDTCisFP<0>, | |
| SDTCisInt<4>, | |
| SDTCisSameNumEltsAs<0, 4>, | |
| IsVLVT<5> | |
| ]>; | |
| // Select(OnTrue, OnFalse, SelMask, vl) | |
| def SDTSelectVVP : SDTypeProfile<1, 4, [ // vp_select, vp_merge | |
| SDTCisVec<0>, | |
| SDTCisSameNumEltsAs<0, 3>, | |
| SDTCisSameAs<0, 1>, | |
| SDTCisSameAs<1, 2>, | |
| IsVLVT<4> | |
| ]>; | |
| // SetCC (lhs, rhs, cc, mask, vl) | |
| def SDTSetCCVVP : SDTypeProfile<1, 5, [ // vp_setcc | |
| SDTCisVec<0>, | |
| SDTCisVec<1>, | |
| SDTCisSameNumEltsAs<0, 1>, | |
| SDTCisSameAs<1, 2>, | |
| SDTCisVT<3, OtherVT>, | |
| SDTCisInt<4>, | |
| SDTCisSameNumEltsAs<0, 4>, | |
| IsVLVT<5> | |
| ]>; | |
| // vvp_reduce(vector, mask, vl) | |
| def SDTReduceVVP : SDTypeProfile<1, 3, [ | |
| SDTCisVec<1>, | |
| SDTCisInt<2>, | |
| SDTCisVec<2>, | |
| SDTCisSameNumEltsAs<1,2>, | |
| IsVLVT<3> | |
| ]>; | |
| // Binary operator commutative pattern. | |
| class vvp_commutative<SDNode RootOp> : | |
| PatFrags< | |
| (ops node:$lhs, node:$rhs, node:$mask, node:$vlen), | |
| [(RootOp node:$lhs, node:$rhs, node:$mask, node:$vlen), | |
| (RootOp node:$rhs, node:$lhs, node:$mask, node:$vlen)]>; | |
| class vvp_fma_commutative<SDNode RootOp> : | |
| PatFrags< | |
| (ops node:$X, node:$Y, node:$Z, node:$mask, node:$vlen), | |
| [(RootOp node:$X, node:$Y, node:$Z, node:$mask, node:$vlen), | |
| (RootOp node:$X, node:$Z, node:$Y, node:$mask, node:$vlen)]>; | |
| // VVP node definitions. | |
| def vvp_add : SDNode<"VEISD::VVP_ADD", SDTIntBinOpVVP>; | |
| def c_vvp_add : vvp_commutative<vvp_add>; | |
| def vvp_sub : SDNode<"VEISD::VVP_SUB", SDTIntBinOpVVP>; | |
| def vvp_mul : SDNode<"VEISD::VVP_MUL", SDTIntBinOpVVP>; | |
| def c_vvp_mul : vvp_commutative<vvp_mul>; | |
| def vvp_sdiv : SDNode<"VEISD::VVP_SDIV", SDTIntBinOpVVP>; | |
| def vvp_udiv : SDNode<"VEISD::VVP_UDIV", SDTIntBinOpVVP>; | |
| def vvp_and : SDNode<"VEISD::VVP_AND", SDTIntBinOpVVP>; | |
| def c_vvp_and : vvp_commutative<vvp_and>; | |
| def vvp_or : SDNode<"VEISD::VVP_OR", SDTIntBinOpVVP>; | |
| def c_vvp_or : vvp_commutative<vvp_or>; | |
| def vvp_xor : SDNode<"VEISD::VVP_XOR", SDTIntBinOpVVP>; | |
| def c_vvp_xor : vvp_commutative<vvp_xor>; | |
| def vvp_srl : SDNode<"VEISD::VVP_SRL", SDTIntBinOpVVP>; | |
| def vvp_sra : SDNode<"VEISD::VVP_SRA", SDTIntBinOpVVP>; | |
| def vvp_shl : SDNode<"VEISD::VVP_SHL", SDTIntBinOpVVP>; | |
| def vvp_fneg : SDNode<"VEISD::VVP_FNEG", SDTFPUnaryOpVVP>; | |
| def vvp_fadd : SDNode<"VEISD::VVP_FADD", SDTFPBinOpVVP>; | |
| def c_vvp_fadd : vvp_commutative<vvp_fadd>; | |
| def vvp_fsub : SDNode<"VEISD::VVP_FSUB", SDTFPBinOpVVP>; | |
| def vvp_fmul : SDNode<"VEISD::VVP_FMUL", SDTFPBinOpVVP>; | |
| def c_vvp_fmul : vvp_commutative<vvp_fmul>; | |
| def vvp_fdiv : SDNode<"VEISD::VVP_FDIV", SDTFPBinOpVVP>; | |
| def vvp_ffma : SDNode<"VEISD::VVP_FFMA", SDTFPTernaryOpVVP>; | |
| def c_vvp_ffma : vvp_fma_commutative<vvp_ffma>; | |
| def vvp_scatter : SDNode<"VEISD::VVP_SCATTER", SDTScatterVVP, | |
| [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | |
| def vvp_gather : SDNode<"VEISD::VVP_GATHER", SDTGatherVVP, | |
| [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; | |
| def vvp_load : SDNode<"VEISD::VVP_LOAD", SDTLoadVVP, | |
| [SDNPHasChain, SDNPMayLoad, SDNPMemOperand ]>; | |
| def vvp_store : SDNode<"VEISD::VVP_STORE", SDTStoreVVP, | |
| [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | |
| // Reductions | |
| // int reductions | |
| def vvp_reduce_add : SDNode<"VEISD::VVP_REDUCE_ADD", SDTReduceVVP>; | |
| def vvp_reduce_and : SDNode<"VEISD::VVP_REDUCE_AND", SDTReduceVVP>; | |
| def vvp_reduce_or : SDNode<"VEISD::VVP_REDUCE_OR", SDTReduceVVP>; | |
| def vvp_reduce_xor : SDNode<"VEISD::VVP_REDUCE_XOR", SDTReduceVVP>; | |
| def vvp_reduce_smax : SDNode<"VEISD::VVP_REDUCE_SMAX", SDTReduceVVP>; | |
| def vvp_select : SDNode<"VEISD::VVP_SELECT", SDTSelectVVP>; | |
| // setcc (lhs, rhs, cc, mask, vl) | |
| def vvp_setcc : SDNode<"VEISD::VVP_SETCC", SDTSetCCVVP>; |