xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VVPInstrPatternsVec.td (revision 0eae32dcef82f6f06de6419a0d623d7def0cc8f6)
1e8d8bef9SDimitry Andric//===----------- VVPInstrPatternsVec.td - VVP_* SDNode patterns -----------===//
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 describes how VVP_* SDNodes are lowered to machine instructions.
10e8d8bef9SDimitry Andric//
11e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
12e8d8bef9SDimitry Andric
13e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
14e8d8bef9SDimitry Andric//
15e8d8bef9SDimitry Andric// VVP SDNode definitions.
16e8d8bef9SDimitry Andric//
17e8d8bef9SDimitry Andric//===----------------------------------------------------------------------===//
18e8d8bef9SDimitry Andricinclude "VVPInstrInfo.td"
19e8d8bef9SDimitry Andric
20*0eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode,
21*0eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
22*0eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
23*0eae32dcSDimitry Andric  // Masked with select, broadcast.
24*0eae32dcSDimitry Andric  // TODO
25*0eae32dcSDimitry Andric
26*0eae32dcSDimitry Andric  // Unmasked, broadcast.
27e8d8bef9SDimitry Andric  def : Pat<(OpNode
28*0eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
29*0eae32dcSDimitry Andric                (MaskVT true_mask),
30*0eae32dcSDimitry Andric                i32:$avl),
31e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvl")
32e8d8bef9SDimitry Andric                ScalarVT:$sx, $vy, $avl)>;
33*0eae32dcSDimitry Andric  // Masked, broadcast.
34*0eae32dcSDimitry Andric  def : Pat<(OpNode
35*0eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
36*0eae32dcSDimitry Andric                MaskVT:$mask,
37*0eae32dcSDimitry Andric                i32:$avl),
38*0eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"rvml")
39*0eae32dcSDimitry Andric                ScalarVT:$sx, $vy, $mask, $avl)>;
40*0eae32dcSDimitry Andric}
41*0eae32dcSDimitry Andric
42*0eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode,
43*0eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
44*0eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
45*0eae32dcSDimitry Andric  // Masked with select, broadcast.
46*0eae32dcSDimitry Andric  // TODO
47*0eae32dcSDimitry Andric
48*0eae32dcSDimitry Andric  // Unmasked, broadcast.
49*0eae32dcSDimitry Andric  def : Pat<(OpNode
50*0eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
51*0eae32dcSDimitry Andric                (MaskVT true_mask),
52*0eae32dcSDimitry Andric                i32:$avl),
53*0eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrl")
54*0eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $avl)>;
55*0eae32dcSDimitry Andric  // Masked, broadcast.
56*0eae32dcSDimitry Andric  def : Pat<(OpNode
57*0eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
58*0eae32dcSDimitry Andric                MaskVT:$mask,
59*0eae32dcSDimitry Andric                i32:$avl),
60*0eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrml")
61*0eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $mask, $avl)>;
62*0eae32dcSDimitry Andric}
63*0eae32dcSDimitry Andric
64*0eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode,
65*0eae32dcSDimitry Andric    ValueType DataVT,
66*0eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
67*0eae32dcSDimitry Andric  // Masked with select.
68*0eae32dcSDimitry Andric  // TODO
69*0eae32dcSDimitry Andric
70*0eae32dcSDimitry Andric  // Unmasked.
71*0eae32dcSDimitry Andric  def : Pat<(OpNode
72*0eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
73*0eae32dcSDimitry Andric                (MaskVT true_mask),
74*0eae32dcSDimitry Andric                i32:$avl),
75e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvl")
76e8d8bef9SDimitry Andric                $vx, $vy, $avl)>;
77e8d8bef9SDimitry Andric
78*0eae32dcSDimitry Andric  // Masked.
79e8d8bef9SDimitry Andric  def : Pat<(OpNode
80*0eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
81*0eae32dcSDimitry Andric                MaskVT:$mask,
82*0eae32dcSDimitry Andric                i32:$avl),
83e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml")
84e8d8bef9SDimitry Andric                $vx, $vy, $mask, $avl)>;
85*0eae32dcSDimitry Andric}
86e8d8bef9SDimitry Andric
87*0eae32dcSDimitry Andricmulticlass Binary_rv_vv<
88*0eae32dcSDimitry Andric    SDPatternOperator OpNode,
89*0eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
90*0eae32dcSDimitry Andric    string OpBaseName> {
91*0eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
92*0eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
93*0eae32dcSDimitry Andric}
94e8d8bef9SDimitry Andric
95*0eae32dcSDimitry Andricmulticlass Binary_vr_vv<
96*0eae32dcSDimitry Andric    SDPatternOperator OpNode,
97*0eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
98*0eae32dcSDimitry Andric    string OpBaseName> {
99*0eae32dcSDimitry Andric  defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
100*0eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
101*0eae32dcSDimitry Andric}
102*0eae32dcSDimitry Andric
103*0eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv<
104*0eae32dcSDimitry Andric    SDPatternOperator OpNode,
105*0eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
106*0eae32dcSDimitry Andric    string OpBaseName> {
107*0eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
108*0eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
109e8d8bef9SDimitry Andric}
110e8d8bef9SDimitry Andric
111e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements)
112*0eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong<
113e8d8bef9SDimitry Andric    SDPatternOperator OpNode,
114e8d8bef9SDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
115e8d8bef9SDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
116*0eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
117e8d8bef9SDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
118349cc55cSDimitry Andric                      LongOpBaseName>;
119*0eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
120e8d8bef9SDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
121349cc55cSDimitry Andric                      ShortOpBaseName>;
122e8d8bef9SDimitry Andric}
123e8d8bef9SDimitry Andric
124*0eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong<
125*0eae32dcSDimitry Andric    SDPatternOperator OpNode,
126*0eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
127*0eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
128*0eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
129*0eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
130*0eae32dcSDimitry Andric                      LongOpBaseName>;
131*0eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
132*0eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
133*0eae32dcSDimitry Andric                      ShortOpBaseName>;
134*0eae32dcSDimitry Andric}
135e8d8bef9SDimitry Andric
136*0eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong<
137*0eae32dcSDimitry Andric    SDPatternOperator OpNode,
138*0eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
139*0eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
140*0eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
141*0eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
142*0eae32dcSDimitry Andric                      LongOpBaseName>;
143*0eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
144*0eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
145*0eae32dcSDimitry Andric                      ShortOpBaseName>;
146*0eae32dcSDimitry Andric}
147*0eae32dcSDimitry Andric
148*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add,
149e8d8bef9SDimitry Andric                              i64, v256i64, "VADDSL",
150e8d8bef9SDimitry Andric                              i32, v256i32, "VADDSWSX">;
151*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub,
152*0eae32dcSDimitry Andric                              i64, v256i64, "VSUBSL",
153*0eae32dcSDimitry Andric                              i32, v256i32, "VSUBSWSX">;
154*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul,
155*0eae32dcSDimitry Andric                              i64, v256i64, "VMULSL",
156*0eae32dcSDimitry Andric                              i32, v256i32, "VMULSWSX">;
157*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv,
158*0eae32dcSDimitry Andric                              i64, v256i64, "VDIVSL",
159*0eae32dcSDimitry Andric                              i32, v256i32, "VDIVSWSX">;
160*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv,
161*0eae32dcSDimitry Andric                              i64, v256i64, "VDIVUL",
162*0eae32dcSDimitry Andric                              i32, v256i32, "VDIVUW">;
163*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and,
164e8d8bef9SDimitry Andric                              i64, v256i64, "VAND",
165e8d8bef9SDimitry Andric                              i32, v256i32, "PVANDLO">;
166*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or,
167*0eae32dcSDimitry Andric                              i64, v256i64, "VOR",
168*0eae32dcSDimitry Andric                              i32, v256i32, "PVORLO">;
169*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor,
170*0eae32dcSDimitry Andric                              i64, v256i64, "VXOR",
171*0eae32dcSDimitry Andric                              i32, v256i32, "PVXORLO">;
172*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl,
173*0eae32dcSDimitry Andric                              i64, v256i64, "VSLL",
174*0eae32dcSDimitry Andric                              i32, v256i32, "PVSLLLO">;
175*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra,
176*0eae32dcSDimitry Andric                              i64, v256i64, "VSRAL",
177*0eae32dcSDimitry Andric                              i32, v256i32, "PVSRALO">;
178*0eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl,
179*0eae32dcSDimitry Andric                              i64, v256i64, "VSRL",
180*0eae32dcSDimitry Andric                              i32, v256i32, "PVSRLLO">;
181*0eae32dcSDimitry Andric
182*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd,
183*0eae32dcSDimitry Andric                              f64, v256f64, "VFADDD",
184*0eae32dcSDimitry Andric                              f32, v256f32, "PVFADDUP">;
185*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul,
186*0eae32dcSDimitry Andric                              f64, v256f64, "VFMULD",
187*0eae32dcSDimitry Andric                              f32, v256f32, "PVFMULUP">;
188*0eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub,
189*0eae32dcSDimitry Andric                              f64, v256f64, "VFSUBD",
190*0eae32dcSDimitry Andric                              f32, v256f32, "PVFSUBUP">;
191*0eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv,
192*0eae32dcSDimitry Andric                              f64, v256f64, "VFDIVD",
193*0eae32dcSDimitry Andric                              f32, v256f32, "VFDIVS">;
194