xref: /freebsd/contrib/llvm-project/llvm/lib/Target/VE/VVPInstrPatternsVec.td (revision 04eeddc0aa8e0a417a16eaf9d7d095207f4a8623)
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
200eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode,
210eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
220eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
23*04eeddc0SDimitry Andric  // Masked with passthru, broadcast.
24*04eeddc0SDimitry Andric  def : Pat<(vvp_select
25*04eeddc0SDimitry Andric                (OpNode
26*04eeddc0SDimitry Andric                    (any_broadcast ScalarVT:$sx),
27*04eeddc0SDimitry Andric                    DataVT:$vy,
28*04eeddc0SDimitry Andric                    (MaskVT srcvalue),
29*04eeddc0SDimitry Andric                    (i32 srcvalue)),
30*04eeddc0SDimitry Andric                DataVT:$vfalse,
31*04eeddc0SDimitry Andric                MaskVT:$mask,
32*04eeddc0SDimitry Andric                i32:$pivot),
33*04eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvml_v")
34*04eeddc0SDimitry Andric                ScalarVT:$sx,
35*04eeddc0SDimitry Andric                $vy,
36*04eeddc0SDimitry Andric                $mask,
37*04eeddc0SDimitry Andric                $pivot,
38*04eeddc0SDimitry Andric                $vfalse)>;
390eae32dcSDimitry Andric
400eae32dcSDimitry Andric  // Unmasked, broadcast.
41e8d8bef9SDimitry Andric  def : Pat<(OpNode
420eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
430eae32dcSDimitry Andric                (MaskVT true_mask),
440eae32dcSDimitry Andric                i32:$avl),
45e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvl")
46e8d8bef9SDimitry Andric                ScalarVT:$sx, $vy, $avl)>;
470eae32dcSDimitry Andric  // Masked, broadcast.
480eae32dcSDimitry Andric  def : Pat<(OpNode
490eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
500eae32dcSDimitry Andric                MaskVT:$mask,
510eae32dcSDimitry Andric                i32:$avl),
520eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"rvml")
530eae32dcSDimitry Andric                ScalarVT:$sx, $vy, $mask, $avl)>;
540eae32dcSDimitry Andric}
550eae32dcSDimitry Andric
560eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode,
570eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
580eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
59*04eeddc0SDimitry Andric  // Masked with passthru, broadcast.
60*04eeddc0SDimitry Andric  def : Pat<(vvp_select
61*04eeddc0SDimitry Andric                (OpNode
62*04eeddc0SDimitry Andric                    DataVT:$vx,
63*04eeddc0SDimitry Andric                    (any_broadcast ScalarVT:$sy),
64*04eeddc0SDimitry Andric                    (MaskVT srcvalue),
65*04eeddc0SDimitry Andric                    (i32 srcvalue)),
66*04eeddc0SDimitry Andric                DataVT:$vfalse,
67*04eeddc0SDimitry Andric                MaskVT:$mask,
68*04eeddc0SDimitry Andric                i32:$pivot),
69*04eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vrml_v")
70*04eeddc0SDimitry Andric                $vx,
71*04eeddc0SDimitry Andric                ScalarVT:$sy,
72*04eeddc0SDimitry Andric                $mask,
73*04eeddc0SDimitry Andric                $pivot,
74*04eeddc0SDimitry Andric                $vfalse)>;
750eae32dcSDimitry Andric
760eae32dcSDimitry Andric  // Unmasked, broadcast.
770eae32dcSDimitry Andric  def : Pat<(OpNode
780eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
790eae32dcSDimitry Andric                (MaskVT true_mask),
800eae32dcSDimitry Andric                i32:$avl),
810eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrl")
820eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $avl)>;
830eae32dcSDimitry Andric  // Masked, broadcast.
840eae32dcSDimitry Andric  def : Pat<(OpNode
850eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
860eae32dcSDimitry Andric                MaskVT:$mask,
870eae32dcSDimitry Andric                i32:$avl),
880eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrml")
890eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $mask, $avl)>;
900eae32dcSDimitry Andric}
910eae32dcSDimitry Andric
920eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode,
930eae32dcSDimitry Andric    ValueType DataVT,
940eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
95*04eeddc0SDimitry Andric  // Masked with passthru, broadcast.
96*04eeddc0SDimitry Andric  def : Pat<(vvp_select
97*04eeddc0SDimitry Andric                (OpNode
98*04eeddc0SDimitry Andric                    DataVT:$vx,
99*04eeddc0SDimitry Andric                    DataVT:$vy,
100*04eeddc0SDimitry Andric                    (MaskVT srcvalue),
101*04eeddc0SDimitry Andric                    (i32 srcvalue)),
102*04eeddc0SDimitry Andric                DataVT:$vfalse,
103*04eeddc0SDimitry Andric                MaskVT:$mask,
104*04eeddc0SDimitry Andric                i32:$pivot),
105*04eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml_v")
106*04eeddc0SDimitry Andric                $vx,
107*04eeddc0SDimitry Andric                $vy,
108*04eeddc0SDimitry Andric                $mask,
109*04eeddc0SDimitry Andric                $pivot,
110*04eeddc0SDimitry Andric                $vfalse)>;
111*04eeddc0SDimitry Andric
1120eae32dcSDimitry Andric  // Masked with select.
1130eae32dcSDimitry Andric  // TODO
1140eae32dcSDimitry Andric
1150eae32dcSDimitry Andric  // Unmasked.
1160eae32dcSDimitry Andric  def : Pat<(OpNode
1170eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
1180eae32dcSDimitry Andric                (MaskVT true_mask),
1190eae32dcSDimitry Andric                i32:$avl),
120e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvl")
121e8d8bef9SDimitry Andric                $vx, $vy, $avl)>;
122e8d8bef9SDimitry Andric
1230eae32dcSDimitry Andric  // Masked.
124e8d8bef9SDimitry Andric  def : Pat<(OpNode
1250eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
1260eae32dcSDimitry Andric                MaskVT:$mask,
1270eae32dcSDimitry Andric                i32:$avl),
128e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml")
129e8d8bef9SDimitry Andric                $vx, $vy, $mask, $avl)>;
1300eae32dcSDimitry Andric}
131e8d8bef9SDimitry Andric
1320eae32dcSDimitry Andricmulticlass Binary_rv_vv<
1330eae32dcSDimitry Andric    SDPatternOperator OpNode,
1340eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
1350eae32dcSDimitry Andric    string OpBaseName> {
1360eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
1370eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
1380eae32dcSDimitry Andric}
139e8d8bef9SDimitry Andric
1400eae32dcSDimitry Andricmulticlass Binary_vr_vv<
1410eae32dcSDimitry Andric    SDPatternOperator OpNode,
1420eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
1430eae32dcSDimitry Andric    string OpBaseName> {
1440eae32dcSDimitry Andric  defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
1450eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
1460eae32dcSDimitry Andric}
1470eae32dcSDimitry Andric
1480eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv<
1490eae32dcSDimitry Andric    SDPatternOperator OpNode,
1500eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
1510eae32dcSDimitry Andric    string OpBaseName> {
1520eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
1530eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
154e8d8bef9SDimitry Andric}
155e8d8bef9SDimitry Andric
156e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements)
1570eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong<
158e8d8bef9SDimitry Andric    SDPatternOperator OpNode,
159e8d8bef9SDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
160e8d8bef9SDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
1610eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
162e8d8bef9SDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
163349cc55cSDimitry Andric                      LongOpBaseName>;
1640eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
165e8d8bef9SDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
166349cc55cSDimitry Andric                      ShortOpBaseName>;
167e8d8bef9SDimitry Andric}
168e8d8bef9SDimitry Andric
1690eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong<
1700eae32dcSDimitry Andric    SDPatternOperator OpNode,
1710eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
1720eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
1730eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
1740eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
1750eae32dcSDimitry Andric                      LongOpBaseName>;
1760eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
1770eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
1780eae32dcSDimitry Andric                      ShortOpBaseName>;
1790eae32dcSDimitry Andric}
180e8d8bef9SDimitry Andric
1810eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong<
1820eae32dcSDimitry Andric    SDPatternOperator OpNode,
1830eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
1840eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
1850eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
1860eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
1870eae32dcSDimitry Andric                      LongOpBaseName>;
1880eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
1890eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
1900eae32dcSDimitry Andric                      ShortOpBaseName>;
1910eae32dcSDimitry Andric}
1920eae32dcSDimitry Andric
1930eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add,
194e8d8bef9SDimitry Andric                              i64, v256i64, "VADDSL",
195e8d8bef9SDimitry Andric                              i32, v256i32, "VADDSWSX">;
1960eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub,
1970eae32dcSDimitry Andric                              i64, v256i64, "VSUBSL",
1980eae32dcSDimitry Andric                              i32, v256i32, "VSUBSWSX">;
1990eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul,
2000eae32dcSDimitry Andric                              i64, v256i64, "VMULSL",
2010eae32dcSDimitry Andric                              i32, v256i32, "VMULSWSX">;
2020eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv,
2030eae32dcSDimitry Andric                              i64, v256i64, "VDIVSL",
2040eae32dcSDimitry Andric                              i32, v256i32, "VDIVSWSX">;
2050eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv,
2060eae32dcSDimitry Andric                              i64, v256i64, "VDIVUL",
2070eae32dcSDimitry Andric                              i32, v256i32, "VDIVUW">;
2080eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and,
209e8d8bef9SDimitry Andric                              i64, v256i64, "VAND",
210e8d8bef9SDimitry Andric                              i32, v256i32, "PVANDLO">;
2110eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or,
2120eae32dcSDimitry Andric                              i64, v256i64, "VOR",
2130eae32dcSDimitry Andric                              i32, v256i32, "PVORLO">;
2140eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor,
2150eae32dcSDimitry Andric                              i64, v256i64, "VXOR",
2160eae32dcSDimitry Andric                              i32, v256i32, "PVXORLO">;
2170eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl,
2180eae32dcSDimitry Andric                              i64, v256i64, "VSLL",
2190eae32dcSDimitry Andric                              i32, v256i32, "PVSLLLO">;
2200eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra,
2210eae32dcSDimitry Andric                              i64, v256i64, "VSRAL",
2220eae32dcSDimitry Andric                              i32, v256i32, "PVSRALO">;
2230eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl,
2240eae32dcSDimitry Andric                              i64, v256i64, "VSRL",
2250eae32dcSDimitry Andric                              i32, v256i32, "PVSRLLO">;
2260eae32dcSDimitry Andric
2270eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd,
2280eae32dcSDimitry Andric                              f64, v256f64, "VFADDD",
2290eae32dcSDimitry Andric                              f32, v256f32, "PVFADDUP">;
2300eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul,
2310eae32dcSDimitry Andric                              f64, v256f64, "VFMULD",
2320eae32dcSDimitry Andric                              f32, v256f32, "PVFMULUP">;
2330eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub,
2340eae32dcSDimitry Andric                              f64, v256f64, "VFSUBD",
2350eae32dcSDimitry Andric                              f32, v256f32, "PVFSUBUP">;
2360eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv,
2370eae32dcSDimitry Andric                              f64, v256f64, "VFDIVD",
2380eae32dcSDimitry Andric                              f32, v256f32, "VFDIVS">;
239*04eeddc0SDimitry Andric
240*04eeddc0SDimitry Andricmulticlass Merge_mvv<
241*04eeddc0SDimitry Andric    SDPatternOperator OpNode,
242*04eeddc0SDimitry Andric    ValueType DataVT, ValueType MaskVT,
243*04eeddc0SDimitry Andric    string OpBaseName> {
244*04eeddc0SDimitry Andric  // Masked.
245*04eeddc0SDimitry Andric  def : Pat<(OpNode
246*04eeddc0SDimitry Andric                DataVT:$vtrue, DataVT:$vfalse,
247*04eeddc0SDimitry Andric                MaskVT:$vm,
248*04eeddc0SDimitry Andric                i32:$avl),
249*04eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml_v")
250*04eeddc0SDimitry Andric                $vfalse, $vtrue, $vm, $avl, $vfalse)>;
251*04eeddc0SDimitry Andric}
252*04eeddc0SDimitry Andric
253*04eeddc0SDimitry Andricmulticlass Merge_mvv_ShortLong<
254*04eeddc0SDimitry Andric    SDPatternOperator OpNode,
255*04eeddc0SDimitry Andric    ValueType LongDataVT, ValueType ShortDataVT,
256*04eeddc0SDimitry Andric    string OpBaseName> {
257*04eeddc0SDimitry Andric  defm : Merge_mvv<OpNode,
258*04eeddc0SDimitry Andric                   LongDataVT, v256i1,
259*04eeddc0SDimitry Andric                   OpBaseName>;
260*04eeddc0SDimitry Andric  defm : Merge_mvv<OpNode,
261*04eeddc0SDimitry Andric                   ShortDataVT, v256i1,
262*04eeddc0SDimitry Andric                   OpBaseName>;
263*04eeddc0SDimitry Andric}
264*04eeddc0SDimitry Andric
265*04eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select,
266*04eeddc0SDimitry Andric                           v256f64,
267*04eeddc0SDimitry Andric                           v256f32, "VMRG">;
268*04eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select,
269*04eeddc0SDimitry Andric                           v256i64,
270*04eeddc0SDimitry Andric                           v256i32, "VMRG">;
271