xref: /freebsd/contrib/llvm-project/llvm/lib/Target/VE/VVPNodes.def (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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