1e8d8bef9SDimitry Andric//===-- VVPNodes.def - Lists & properties of VE Vector Predication Nodes --===// 2e8d8bef9SDimitry Andric// 3e8d8bef9SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric// 7e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric// 9e8d8bef9SDimitry Andric// This file defines all VVP_* SDNodes and their properties 10e8d8bef9SDimitry Andric// 11e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===// 12e8d8bef9SDimitry Andric 13e8d8bef9SDimitry Andric/// HANDLE_VP_TO_VVP(VPOPC, VVPOPC) 14e8d8bef9SDimitry Andric/// \p VPOPC is the VP_* SDNode opcode. 15e8d8bef9SDimitry Andric/// \p VVPOPC is the VVP_* SDNode opcode. 16e8d8bef9SDimitry Andric#ifndef HANDLE_VP_TO_VVP 17e8d8bef9SDimitry Andric#define HANDLE_VP_TO_VVP(VPOPC, VVPOPC) 18e8d8bef9SDimitry Andric#endif 19e8d8bef9SDimitry Andric 20e8d8bef9SDimitry Andric/// ADD_VVP_OP(VVPNAME,SDNAME) 21e8d8bef9SDimitry Andric/// \p VVPName is a VVP SDNode operator. 22e8d8bef9SDimitry Andric/// \p SDNAME is the generic SD opcode corresponding to \p VVPName. 23e8d8bef9SDimitry Andric#ifndef ADD_VVP_OP 24e8d8bef9SDimitry Andric#define ADD_VVP_OP(X, Y) 25e8d8bef9SDimitry Andric#endif 26e8d8bef9SDimitry Andric 27*81ad6265SDimitry Andric/// ADD_UNARY_VVP_OP(VVPNAME,SDNAME) 28*81ad6265SDimitry Andric/// \p VVPName is a VVP Unary operator. 29*81ad6265SDimitry Andric/// \p SDNAME is the generic SD opcode corresponding to \p VVPName. 30*81ad6265SDimitry Andric#ifndef ADD_UNARY_VVP_OP 31*81ad6265SDimitry Andric#define ADD_UNARY_VVP_OP(VVPNAME,SDNAME) \ 32*81ad6265SDimitry Andric ADD_VVP_OP(VVPNAME,SDNAME) 33*81ad6265SDimitry Andric#endif 34*81ad6265SDimitry Andric 35e8d8bef9SDimitry Andric/// ADD_BINARY_VVP_OP(VVPNAME,SDNAME) 36e8d8bef9SDimitry Andric/// \p VVPName is a VVP Binary operator. 37e8d8bef9SDimitry Andric/// \p SDNAME is the generic SD opcode corresponding to \p VVPName. 38e8d8bef9SDimitry Andric#ifndef ADD_BINARY_VVP_OP 390eae32dcSDimitry Andric#define ADD_BINARY_VVP_OP(VVPNAME,VPNAME,SDNAME) \ 400eae32dcSDimitry Andric ADD_VVP_OP(VVPNAME,SDNAME) \ 410eae32dcSDimitry Andric HANDLE_VP_TO_VVP(VPNAME, VVPNAME) 420eae32dcSDimitry Andric#endif 430eae32dcSDimitry Andric 44*81ad6265SDimitry Andric/// ADD_TERNARY_VVP_OP(VVPNAME,SDNAME) 45*81ad6265SDimitry Andric/// \p VVPName is a VVP Ternary operator. 46*81ad6265SDimitry Andric/// \p SDNAME is the generic SD opcode corresponding to \p VVPName. 47*81ad6265SDimitry Andric#ifndef ADD_TERNARY_VVP_OP 48*81ad6265SDimitry Andric#define ADD_TERNARY_VVP_OP(VVPNAME,SDNAME) \ 49*81ad6265SDimitry Andric ADD_VVP_OP(VVPNAME,SDNAME) 50*81ad6265SDimitry Andric#endif 51*81ad6265SDimitry Andric 520eae32dcSDimitry Andric#ifndef ADD_BINARY_VVP_OP_COMPACT 530eae32dcSDimitry Andric#define ADD_BINARY_VVP_OP_COMPACT(NAME) \ 540eae32dcSDimitry Andric ADD_BINARY_VVP_OP(VVP_##NAME,VP_##NAME,NAME) 55e8d8bef9SDimitry Andric#endif 56e8d8bef9SDimitry Andric 57*81ad6265SDimitry Andric/// REGISTER_PACKED(OPC) 58*81ad6265SDimitry Andric/// \p OPC The VVP opcode of the operation. 59*81ad6265SDimitry Andric#ifndef REGISTER_PACKED 60*81ad6265SDimitry Andric#define REGISTER_PACKED(OPC) 61*81ad6265SDimitry Andric#endif 62*81ad6265SDimitry Andric 63*81ad6265SDimitry Andric/// ADD_REDUCE_VVP_OP(OPC) 64*81ad6265SDimitry Andric/// \p OPC The VVP opcode of the operation. 65*81ad6265SDimitry Andric/// \p SDNAME The standard opcode of the operation. 66*81ad6265SDimitry Andric#ifndef ADD_REDUCE_VVP_OP 67*81ad6265SDimitry Andric#define ADD_REDUCE_VVP_OP(OPC, SDNAME) ADD_VVP_OP(OPC, SDNAME) 68*81ad6265SDimitry Andric#endif 69*81ad6265SDimitry Andric 70*81ad6265SDimitry Andric// Scalar standard ISD to perform this reduction. 71*81ad6265SDimitry Andric#ifndef HANDLE_VVP_REDUCE_TO_SCALAR 72*81ad6265SDimitry Andric#define HANDLE_VVP_REDUCE_TO_SCALAR(VVP_RED_ISD, REDUCE_ISD) 73*81ad6265SDimitry Andric#endif 74*81ad6265SDimitry Andric 75*81ad6265SDimitry Andric/// Reductions. 76*81ad6265SDimitry Andric#define HELPER_REDUCTION(OPC, SCALAR_OPC) \ 77*81ad6265SDimitry Andric ADD_REDUCE_VVP_OP(VVP_REDUCE_##OPC,VECREDUCE_##OPC) \ 78*81ad6265SDimitry Andric HANDLE_VP_TO_VVP(VP_REDUCE_##OPC, VVP_REDUCE_##OPC) \ 79*81ad6265SDimitry Andric HANDLE_VVP_REDUCE_TO_SCALAR(VVP_REDUCE_##OPC, SCALAR_OPC) 80*81ad6265SDimitry Andric 81*81ad6265SDimitry AndricHELPER_REDUCTION(ADD, ADD) 82*81ad6265SDimitry AndricHELPER_REDUCTION(AND, AND) 83*81ad6265SDimitry AndricHELPER_REDUCTION(OR, OR) 84*81ad6265SDimitry AndricHELPER_REDUCTION(XOR, XOR) 85*81ad6265SDimitry AndricHELPER_REDUCTION(SMAX, SMAX) 86*81ad6265SDimitry Andric 87*81ad6265SDimitry Andric#undef HELPER_REDUCTION 88*81ad6265SDimitry Andric 89*81ad6265SDimitry AndricADD_VVP_OP(VVP_LOAD,LOAD) HANDLE_VP_TO_VVP(VP_LOAD, VVP_LOAD) REGISTER_PACKED(VVP_LOAD) 90*81ad6265SDimitry AndricADD_VVP_OP(VVP_STORE,STORE) HANDLE_VP_TO_VVP(VP_STORE, VVP_STORE) REGISTER_PACKED(VVP_STORE) 91*81ad6265SDimitry Andric 92*81ad6265SDimitry AndricADD_VVP_OP(VVP_GATHER, MGATHER) HANDLE_VP_TO_VVP(VP_GATHER, VVP_GATHER) 93*81ad6265SDimitry AndricADD_VVP_OP(VVP_SCATTER, MSCATTER) HANDLE_VP_TO_VVP(VP_SCATTER, VVP_SCATTER) 94*81ad6265SDimitry Andric 95e8d8bef9SDimitry Andric// Integer arithmetic. 96*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(ADD) REGISTER_PACKED(VVP_ADD) 97*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(SUB) REGISTER_PACKED(VVP_SUB) 980eae32dcSDimitry AndricADD_BINARY_VVP_OP_COMPACT(MUL) 990eae32dcSDimitry AndricADD_BINARY_VVP_OP_COMPACT(UDIV) 1000eae32dcSDimitry AndricADD_BINARY_VVP_OP_COMPACT(SDIV) 101e8d8bef9SDimitry Andric 102*81ad6265SDimitry AndricADD_BINARY_VVP_OP(VVP_SRA,VP_ASHR,SRA) REGISTER_PACKED(VVP_SRA) 103*81ad6265SDimitry AndricADD_BINARY_VVP_OP(VVP_SRL,VP_LSHR,SRL) REGISTER_PACKED(VVP_SRL) 104*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(SHL) REGISTER_PACKED(VVP_SHL) 105e8d8bef9SDimitry Andric 106*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(AND) REGISTER_PACKED(VVP_AND) 107*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(OR) REGISTER_PACKED(VVP_OR) 108*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(XOR) REGISTER_PACKED(VVP_XOR) 1090eae32dcSDimitry Andric 1100eae32dcSDimitry Andric// FP arithmetic. 111*81ad6265SDimitry AndricADD_UNARY_VVP_OP(VVP_FNEG, FNEG) HANDLE_VP_TO_VVP(VP_FNEG, VVP_FNEG) REGISTER_PACKED(VVP_FNEG) 112*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(FADD) REGISTER_PACKED(VVP_FADD) 113*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(FSUB) REGISTER_PACKED(VVP_FSUB) 114*81ad6265SDimitry AndricADD_BINARY_VVP_OP_COMPACT(FMUL) REGISTER_PACKED(VVP_FMUL) 1150eae32dcSDimitry AndricADD_BINARY_VVP_OP_COMPACT(FDIV) 1160eae32dcSDimitry Andric 117*81ad6265SDimitry AndricADD_TERNARY_VVP_OP(VVP_FFMA,FMA) HANDLE_VP_TO_VVP(VP_FMA, VVP_FFMA) REGISTER_PACKED(VVP_FFMA) 118*81ad6265SDimitry Andric 119*81ad6265SDimitry AndricADD_VVP_OP(VVP_SETCC, SETCC) 120*81ad6265SDimitry Andric 12104eeddc0SDimitry Andric// Shuffles. 122*81ad6265SDimitry AndricADD_VVP_OP(VVP_SELECT,VSELECT) REGISTER_PACKED(VVP_SELECT) 12304eeddc0SDimitry AndricHANDLE_VP_TO_VVP(VP_SELECT, VVP_SELECT) 12404eeddc0SDimitry AndricHANDLE_VP_TO_VVP(VP_MERGE, VVP_SELECT) 12504eeddc0SDimitry Andric 126*81ad6265SDimitry Andric 127e8d8bef9SDimitry Andric#undef ADD_BINARY_VVP_OP 128*81ad6265SDimitry Andric#undef ADD_TERNARY_VVP_OP 129*81ad6265SDimitry Andric#undef ADD_UNARY_VVP_OP 1300eae32dcSDimitry Andric#undef ADD_BINARY_VVP_OP_COMPACT 131*81ad6265SDimitry Andric#undef ADD_REDUCE_VVP_OP 132e8d8bef9SDimitry Andric#undef ADD_VVP_OP 1330eae32dcSDimitry Andric#undef HANDLE_VP_TO_VVP 134*81ad6265SDimitry Andric#undef HANDLE_VVP_REDUCE_TO_SCALAR 135*81ad6265SDimitry Andric#undef REGISTER_PACKED 136