xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VVPInstrPatternsVec.td (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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*81ad6265SDimitry Andricmulticlass VectorStore<ValueType DataVT,
21*81ad6265SDimitry Andric    ValueType PtrVT, ValueType MaskVT,
22*81ad6265SDimitry Andric    string STWithMask, string STNoMask> {
23*81ad6265SDimitry Andric  // Unmasked (imm stride).
24*81ad6265SDimitry Andric  def : Pat<(vvp_store
25*81ad6265SDimitry Andric               DataVT:$val, PtrVT:$addr,
26*81ad6265SDimitry Andric               (i64 simm7:$stride), (MaskVT true_mask), i32:$avl),
27*81ad6265SDimitry Andric            (!cast<Instruction>(STNoMask#"irvl")
28*81ad6265SDimitry Andric               (LO7 $stride), $addr, $val, $avl)>;
29*81ad6265SDimitry Andric  // Unmasked.
30*81ad6265SDimitry Andric  def : Pat<(vvp_store
31*81ad6265SDimitry Andric               DataVT:$val, PtrVT:$addr,
32*81ad6265SDimitry Andric               i64:$stride, (MaskVT true_mask), i32:$avl),
33*81ad6265SDimitry Andric            (!cast<Instruction>(STNoMask#"rrvl")
34*81ad6265SDimitry Andric               $stride, $addr, $val, $avl)>;
35*81ad6265SDimitry Andric  // Masked (imm stride).
36*81ad6265SDimitry Andric  def : Pat<(vvp_store
37*81ad6265SDimitry Andric               DataVT:$val, PtrVT:$addr,
38*81ad6265SDimitry Andric               (i64 simm7:$stride), MaskVT:$mask, i32:$avl),
39*81ad6265SDimitry Andric            (!cast<Instruction>(STWithMask#"irvml")
40*81ad6265SDimitry Andric               (LO7 $stride), $addr, $val, $mask, $avl)>;
41*81ad6265SDimitry Andric  // Masked.
42*81ad6265SDimitry Andric  def : Pat<(vvp_store
43*81ad6265SDimitry Andric               DataVT:$val, PtrVT:$addr,
44*81ad6265SDimitry Andric               i64:$stride, MaskVT:$mask, i32:$avl),
45*81ad6265SDimitry Andric            (!cast<Instruction>(STWithMask#"rrvml")
46*81ad6265SDimitry Andric               $stride, $addr, $val, $mask, $avl)>;
47*81ad6265SDimitry Andric}
48*81ad6265SDimitry Andric
49*81ad6265SDimitry Andricdefm : VectorStore<v256f64, i64, v256i1, "VST",  "VST">;
50*81ad6265SDimitry Andricdefm : VectorStore<v256i64, i64, v256i1, "VST",  "VST">;
51*81ad6265SDimitry Andricdefm : VectorStore<v256f32, i64, v256i1, "VSTU", "VSTU">;
52*81ad6265SDimitry Andricdefm : VectorStore<v256i32, i64, v256i1, "VSTL", "VSTL">;
53*81ad6265SDimitry Andric
54*81ad6265SDimitry Andricmulticlass VectorLoad<ValueType DataVT,
55*81ad6265SDimitry Andric    ValueType PtrVT, ValueType MaskVT,
56*81ad6265SDimitry Andric    string GTWithMask, string LDNoMask> {
57*81ad6265SDimitry Andric  // Unmasked (imm stride).
58*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_load
59*81ad6265SDimitry Andric               PtrVT:$addr, (i64 simm7:$stride),
60*81ad6265SDimitry Andric               (MaskVT true_mask), i32:$avl)),
61*81ad6265SDimitry Andric            (!cast<Instruction>(LDNoMask#"irl")
62*81ad6265SDimitry Andric               (LO7 $stride), $addr, $avl)>;
63*81ad6265SDimitry Andric  // Unmasked.
64*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_load
65*81ad6265SDimitry Andric               PtrVT:$addr, i64:$stride,
66*81ad6265SDimitry Andric               (MaskVT true_mask), i32:$avl)),
67*81ad6265SDimitry Andric            (!cast<Instruction>(LDNoMask#"rrl")
68*81ad6265SDimitry Andric               $stride, PtrVT:$addr, $avl)>;
69*81ad6265SDimitry Andric  // Masked (imm stride).
70*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_load
71*81ad6265SDimitry Andric               PtrVT:$addr, (i64 simm7:$stride),
72*81ad6265SDimitry Andric               MaskVT:$mask, i32:$avl)),
73*81ad6265SDimitry Andric            (!cast<Instruction>(GTWithMask#"vizml")
74*81ad6265SDimitry Andric               (VADDULrvml $addr,
75*81ad6265SDimitry Andric                  (VMULULivml (LO7 $stride), (VSEQl $avl), $mask, $avl),
76*81ad6265SDimitry Andric                  $mask, $avl),
77*81ad6265SDimitry Andric               0, 0,
78*81ad6265SDimitry Andric               $mask,
79*81ad6265SDimitry Andric               $avl)>;
80*81ad6265SDimitry Andric  // Masked.
81*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_load
82*81ad6265SDimitry Andric               PtrVT:$addr, i64:$stride, MaskVT:$mask, i32:$avl)),
83*81ad6265SDimitry Andric            (!cast<Instruction>(GTWithMask#"vizml")
84*81ad6265SDimitry Andric               (VADDULrvml $addr,
85*81ad6265SDimitry Andric                  (VMULULrvml $stride, (VSEQl $avl), $mask, $avl),
86*81ad6265SDimitry Andric                  $mask, $avl),
87*81ad6265SDimitry Andric               0, 0,
88*81ad6265SDimitry Andric               $mask,
89*81ad6265SDimitry Andric               $avl)>;
90*81ad6265SDimitry Andric}
91*81ad6265SDimitry Andric
92*81ad6265SDimitry Andricdefm : VectorLoad<v256f64, i64, v256i1, "VGT",    "VLD">;
93*81ad6265SDimitry Andricdefm : VectorLoad<v256i64, i64, v256i1, "VGT",    "VLD">;
94*81ad6265SDimitry Andricdefm : VectorLoad<v256f32, i64, v256i1, "VGTU",   "VLDU">;
95*81ad6265SDimitry Andricdefm : VectorLoad<v256i32, i64, v256i1, "VGTLZX", "VLDLZX">;
96*81ad6265SDimitry Andric
97*81ad6265SDimitry Andric// Vector Gather and scatter
98*81ad6265SDimitry Andricmulticlass VectorGather<ValueType DataVT,
99*81ad6265SDimitry Andric    ValueType PtrVT, ValueType MaskVT,
100*81ad6265SDimitry Andric    string GTPrefix> {
101*81ad6265SDimitry Andric  // Unmasked.
102*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_gather
103*81ad6265SDimitry Andric               PtrVT:$addr, (MaskVT true_mask), i32:$avl)),
104*81ad6265SDimitry Andric            (!cast<Instruction>(GTPrefix#"vizl") $addr, 0, 0, $avl)>;
105*81ad6265SDimitry Andric  // Masked.
106*81ad6265SDimitry Andric  def : Pat<(DataVT (vvp_gather PtrVT:$addr, MaskVT:$mask, i32:$avl)),
107*81ad6265SDimitry Andric            (!cast<Instruction>(GTPrefix#"vizml") $addr, 0, 0, $mask, $avl)>;
108*81ad6265SDimitry Andric}
109*81ad6265SDimitry Andric
110*81ad6265SDimitry Andricdefm : VectorGather<v256f64, v256i64, v256i1, "VGT">;
111*81ad6265SDimitry Andricdefm : VectorGather<v256i64, v256i64, v256i1, "VGT">;
112*81ad6265SDimitry Andricdefm : VectorGather<v256f32, v256i64, v256i1, "VGTU">;
113*81ad6265SDimitry Andricdefm : VectorGather<v256i32, v256i64, v256i1, "VGTLZX">;
114*81ad6265SDimitry Andric
115*81ad6265SDimitry Andricmulticlass VectorScatter<ValueType DataVT,
116*81ad6265SDimitry Andric    ValueType PtrVT, ValueType MaskVT,
117*81ad6265SDimitry Andric    string SCPrefix> {
118*81ad6265SDimitry Andric  // Unmasked.
119*81ad6265SDimitry Andric  def : Pat<(vvp_scatter
120*81ad6265SDimitry Andric               DataVT:$data, PtrVT:$addr, (MaskVT true_mask), i32:$avl),
121*81ad6265SDimitry Andric            (!cast<Instruction>(SCPrefix#"vizvl") $addr, 0, 0, $data, $avl)>;
122*81ad6265SDimitry Andric  // Masked.
123*81ad6265SDimitry Andric  def : Pat<(vvp_scatter
124*81ad6265SDimitry Andric               DataVT:$data, PtrVT:$addr, MaskVT:$mask, i32:$avl),
125*81ad6265SDimitry Andric            (!cast<Instruction>(SCPrefix#"vizvml") $addr, 0, 0, $data, $mask, $avl)>;
126*81ad6265SDimitry Andric}
127*81ad6265SDimitry Andric
128*81ad6265SDimitry Andricdefm : VectorScatter<v256f64, v256i64, v256i1, "VSC">;
129*81ad6265SDimitry Andricdefm : VectorScatter<v256i64, v256i64, v256i1, "VSC">;
130*81ad6265SDimitry Andricdefm : VectorScatter<v256f32, v256i64, v256i1, "VSCU">;
131*81ad6265SDimitry Andricdefm : VectorScatter<v256i32, v256i64, v256i1, "VSCL">;
132*81ad6265SDimitry Andric
133*81ad6265SDimitry Andric
134*81ad6265SDimitry Andric/// FNEG {
135*81ad6265SDimitry Andric// Directly modify the sign bit to flip the sign.
136*81ad6265SDimitry Andric
137*81ad6265SDimitry Andric// Set sign bits in a pack of <2 x f32>.
138*81ad6265SDimitry Andricdef packed_fneg_imm     : OutPatFrag<(ins ),
139*81ad6265SDimitry Andric                          (i64 (SLLri (i64 (ORim 1, (i32 32))), 31))>;
140*81ad6265SDimitry Andric
141*81ad6265SDimitry Andric
142*81ad6265SDimitry Andricmulticlass FNeg<ValueType DataVT> {
143*81ad6265SDimitry Andric  // Masked with select.
144*81ad6265SDimitry Andric  def : Pat<(vvp_select (vvp_fneg DataVT:$vx, (v256i1 srcvalue), (i32 srcvalue)),
145*81ad6265SDimitry Andric                        DataVT:$vfalse,
146*81ad6265SDimitry Andric                        v256i1:$mask,
147*81ad6265SDimitry Andric                        i32:$avl),
148*81ad6265SDimitry Andric            (VXORmvml_v (i32 1), $vx, $mask, $avl, $vfalse)>;
149*81ad6265SDimitry Andric
150*81ad6265SDimitry Andric  // Unmasked.
151*81ad6265SDimitry Andric  def : Pat<(vvp_fneg DataVT:$vx, (v256i1 true_mask), i32:$avl),
152*81ad6265SDimitry Andric            (VXORmvl (i32 1), $vx, $avl)>;
153*81ad6265SDimitry Andric
154*81ad6265SDimitry Andric  // Masked.
155*81ad6265SDimitry Andric  def : Pat<(vvp_fneg DataVT:$vx, v256i1:$mask, i32:$avl),
156*81ad6265SDimitry Andric            (VXORmvml (i32 1), $vx, $mask, $avl)>;
157*81ad6265SDimitry Andric}
158*81ad6265SDimitry Andric
159*81ad6265SDimitry Andricdefm: FNeg<v256f32>;
160*81ad6265SDimitry Andricdefm: FNeg<v256f64>;
161*81ad6265SDimitry Andric
162*81ad6265SDimitry Andric///// Packed FNeg /////
163*81ad6265SDimitry Andric
164*81ad6265SDimitry Andric// Masked with select.
165*81ad6265SDimitry Andricdef : Pat<(vvp_select (vvp_fneg v512f32:$vx, (v512i1 srcvalue), (i32 srcvalue)),
166*81ad6265SDimitry Andric                      v512f32:$vfalse,
167*81ad6265SDimitry Andric                      v512i1:$mask,
168*81ad6265SDimitry Andric                      i32:$avl),
169*81ad6265SDimitry Andric          (v512f32 (PVXORrvml_v (packed_fneg_imm ), $vx, $mask, $avl, $vfalse))>;
170*81ad6265SDimitry Andric
171*81ad6265SDimitry Andric// Unmasked.
172*81ad6265SDimitry Andricdef : Pat<(vvp_fneg v512f32:$vx, (v512i1 true_mask), i32:$avl),
173*81ad6265SDimitry Andric          (v512f32 (PVXORrvl (packed_fneg_imm ), $vx, $avl))>;
174*81ad6265SDimitry Andric
175*81ad6265SDimitry Andric// Masked.
176*81ad6265SDimitry Andricdef : Pat<(vvp_fneg v512f32:$vx, v512i1:$mask, i32:$avl),
177*81ad6265SDimitry Andric          (v512f32 (PVXORrvml (packed_fneg_imm ), $vx, $mask, $avl))>;
178*81ad6265SDimitry Andric
179*81ad6265SDimitry Andric/// } FNEG
180*81ad6265SDimitry Andric
1810eae32dcSDimitry Andricmulticlass Binary_rv<SDPatternOperator OpNode,
1820eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
1830eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
18404eeddc0SDimitry Andric  // Masked with passthru, broadcast.
18504eeddc0SDimitry Andric  def : Pat<(vvp_select
18604eeddc0SDimitry Andric                (OpNode
18704eeddc0SDimitry Andric                    (any_broadcast ScalarVT:$sx),
18804eeddc0SDimitry Andric                    DataVT:$vy,
18904eeddc0SDimitry Andric                    (MaskVT srcvalue),
19004eeddc0SDimitry Andric                    (i32 srcvalue)),
19104eeddc0SDimitry Andric                DataVT:$vfalse,
19204eeddc0SDimitry Andric                MaskVT:$mask,
19304eeddc0SDimitry Andric                i32:$pivot),
19404eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvml_v")
19504eeddc0SDimitry Andric                ScalarVT:$sx,
19604eeddc0SDimitry Andric                $vy,
19704eeddc0SDimitry Andric                $mask,
19804eeddc0SDimitry Andric                $pivot,
19904eeddc0SDimitry Andric                $vfalse)>;
2000eae32dcSDimitry Andric
2010eae32dcSDimitry Andric  // Unmasked, broadcast.
202e8d8bef9SDimitry Andric  def : Pat<(OpNode
2030eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
2040eae32dcSDimitry Andric                (MaskVT true_mask),
2050eae32dcSDimitry Andric                i32:$avl),
206e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvl")
207e8d8bef9SDimitry Andric                ScalarVT:$sx, $vy, $avl)>;
2080eae32dcSDimitry Andric  // Masked, broadcast.
2090eae32dcSDimitry Andric  def : Pat<(OpNode
2100eae32dcSDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy,
2110eae32dcSDimitry Andric                MaskVT:$mask,
2120eae32dcSDimitry Andric                i32:$avl),
2130eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"rvml")
2140eae32dcSDimitry Andric                ScalarVT:$sx, $vy, $mask, $avl)>;
2150eae32dcSDimitry Andric}
2160eae32dcSDimitry Andric
2170eae32dcSDimitry Andricmulticlass Binary_vr<SDPatternOperator OpNode,
2180eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT,
2190eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
22004eeddc0SDimitry Andric  // Masked with passthru, broadcast.
22104eeddc0SDimitry Andric  def : Pat<(vvp_select
22204eeddc0SDimitry Andric                (OpNode
22304eeddc0SDimitry Andric                    DataVT:$vx,
22404eeddc0SDimitry Andric                    (any_broadcast ScalarVT:$sy),
22504eeddc0SDimitry Andric                    (MaskVT srcvalue),
22604eeddc0SDimitry Andric                    (i32 srcvalue)),
22704eeddc0SDimitry Andric                DataVT:$vfalse,
22804eeddc0SDimitry Andric                MaskVT:$mask,
22904eeddc0SDimitry Andric                i32:$pivot),
23004eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vrml_v")
23104eeddc0SDimitry Andric                $vx,
23204eeddc0SDimitry Andric                ScalarVT:$sy,
23304eeddc0SDimitry Andric                $mask,
23404eeddc0SDimitry Andric                $pivot,
23504eeddc0SDimitry Andric                $vfalse)>;
2360eae32dcSDimitry Andric
2370eae32dcSDimitry Andric  // Unmasked, broadcast.
2380eae32dcSDimitry Andric  def : Pat<(OpNode
2390eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
2400eae32dcSDimitry Andric                (MaskVT true_mask),
2410eae32dcSDimitry Andric                i32:$avl),
2420eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrl")
2430eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $avl)>;
2440eae32dcSDimitry Andric  // Masked, broadcast.
2450eae32dcSDimitry Andric  def : Pat<(OpNode
2460eae32dcSDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy),
2470eae32dcSDimitry Andric                MaskVT:$mask,
2480eae32dcSDimitry Andric                i32:$avl),
2490eae32dcSDimitry Andric            (!cast<Instruction>(OpBaseName#"vrml")
2500eae32dcSDimitry Andric                $vx, ScalarVT:$sy, $mask, $avl)>;
2510eae32dcSDimitry Andric}
2520eae32dcSDimitry Andric
2530eae32dcSDimitry Andricmulticlass Binary_vv<SDPatternOperator OpNode,
2540eae32dcSDimitry Andric    ValueType DataVT,
2550eae32dcSDimitry Andric    ValueType MaskVT, string OpBaseName> {
25604eeddc0SDimitry Andric  // Masked with passthru, broadcast.
25704eeddc0SDimitry Andric  def : Pat<(vvp_select
25804eeddc0SDimitry Andric                (OpNode
25904eeddc0SDimitry Andric                    DataVT:$vx,
26004eeddc0SDimitry Andric                    DataVT:$vy,
26104eeddc0SDimitry Andric                    (MaskVT srcvalue),
26204eeddc0SDimitry Andric                    (i32 srcvalue)),
26304eeddc0SDimitry Andric                DataVT:$vfalse,
26404eeddc0SDimitry Andric                MaskVT:$mask,
26504eeddc0SDimitry Andric                i32:$pivot),
26604eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml_v")
26704eeddc0SDimitry Andric                $vx,
26804eeddc0SDimitry Andric                $vy,
26904eeddc0SDimitry Andric                $mask,
27004eeddc0SDimitry Andric                $pivot,
27104eeddc0SDimitry Andric                $vfalse)>;
27204eeddc0SDimitry Andric
2730eae32dcSDimitry Andric  // Masked with select.
2740eae32dcSDimitry Andric  // TODO
2750eae32dcSDimitry Andric
2760eae32dcSDimitry Andric  // Unmasked.
2770eae32dcSDimitry Andric  def : Pat<(OpNode
2780eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
2790eae32dcSDimitry Andric                (MaskVT true_mask),
2800eae32dcSDimitry Andric                i32:$avl),
281e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvl")
282e8d8bef9SDimitry Andric                $vx, $vy, $avl)>;
283e8d8bef9SDimitry Andric
2840eae32dcSDimitry Andric  // Masked.
285e8d8bef9SDimitry Andric  def : Pat<(OpNode
2860eae32dcSDimitry Andric                DataVT:$vx, DataVT:$vy,
2870eae32dcSDimitry Andric                MaskVT:$mask,
2880eae32dcSDimitry Andric                i32:$avl),
289e8d8bef9SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml")
290e8d8bef9SDimitry Andric                $vx, $vy, $mask, $avl)>;
2910eae32dcSDimitry Andric}
292e8d8bef9SDimitry Andric
2930eae32dcSDimitry Andricmulticlass Binary_rv_vv<
2940eae32dcSDimitry Andric    SDPatternOperator OpNode,
2950eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
2960eae32dcSDimitry Andric    string OpBaseName> {
2970eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
2980eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
2990eae32dcSDimitry Andric}
300e8d8bef9SDimitry Andric
3010eae32dcSDimitry Andricmulticlass Binary_vr_vv<
3020eae32dcSDimitry Andric    SDPatternOperator OpNode,
3030eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
3040eae32dcSDimitry Andric    string OpBaseName> {
3050eae32dcSDimitry Andric  defm : Binary_vr<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
3060eae32dcSDimitry Andric  defm : Binary_vv<OpNode, DataVT, MaskVT, OpBaseName>;
3070eae32dcSDimitry Andric}
3080eae32dcSDimitry Andric
3090eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv<
3100eae32dcSDimitry Andric    SDPatternOperator OpNode,
3110eae32dcSDimitry Andric    ValueType ScalarVT, ValueType DataVT, ValueType MaskVT,
3120eae32dcSDimitry Andric    string OpBaseName> {
3130eae32dcSDimitry Andric  defm : Binary_rv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
3140eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
315e8d8bef9SDimitry Andric}
316e8d8bef9SDimitry Andric
317e8d8bef9SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements)
3180eae32dcSDimitry Andricmulticlass Binary_rv_vv_ShortLong<
319e8d8bef9SDimitry Andric    SDPatternOperator OpNode,
320e8d8bef9SDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
321e8d8bef9SDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
3220eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
323e8d8bef9SDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
324349cc55cSDimitry Andric                      LongOpBaseName>;
3250eae32dcSDimitry Andric  defm : Binary_rv_vv<OpNode,
326e8d8bef9SDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
327349cc55cSDimitry Andric                      ShortOpBaseName>;
328e8d8bef9SDimitry Andric}
329e8d8bef9SDimitry Andric
3300eae32dcSDimitry Andricmulticlass Binary_vr_vv_ShortLong<
3310eae32dcSDimitry Andric    SDPatternOperator OpNode,
3320eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
3330eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
3340eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
3350eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
3360eae32dcSDimitry Andric                      LongOpBaseName>;
3370eae32dcSDimitry Andric  defm : Binary_vr_vv<OpNode,
3380eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
3390eae32dcSDimitry Andric                      ShortOpBaseName>;
3400eae32dcSDimitry Andric}
341e8d8bef9SDimitry Andric
3420eae32dcSDimitry Andricmulticlass Binary_rv_vr_vv_ShortLong<
3430eae32dcSDimitry Andric    SDPatternOperator OpNode,
3440eae32dcSDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
3450eae32dcSDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
3460eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
3470eae32dcSDimitry Andric                      LongScalarVT, LongDataVT, v256i1,
3480eae32dcSDimitry Andric                      LongOpBaseName>;
3490eae32dcSDimitry Andric  defm : Binary_rv_vr_vv<OpNode,
3500eae32dcSDimitry Andric                      ShortScalarVT, ShortDataVT, v256i1,
3510eae32dcSDimitry Andric                      ShortOpBaseName>;
3520eae32dcSDimitry Andric}
3530eae32dcSDimitry Andric
3540eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_add,
355e8d8bef9SDimitry Andric                              i64, v256i64, "VADDSL",
356e8d8bef9SDimitry Andric                              i32, v256i32, "VADDSWSX">;
3570eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_sub,
3580eae32dcSDimitry Andric                              i64, v256i64, "VSUBSL",
3590eae32dcSDimitry Andric                              i32, v256i32, "VSUBSWSX">;
3600eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_mul,
3610eae32dcSDimitry Andric                              i64, v256i64, "VMULSL",
3620eae32dcSDimitry Andric                              i32, v256i32, "VMULSWSX">;
3630eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_sdiv,
3640eae32dcSDimitry Andric                              i64, v256i64, "VDIVSL",
3650eae32dcSDimitry Andric                              i32, v256i32, "VDIVSWSX">;
3660eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_udiv,
3670eae32dcSDimitry Andric                              i64, v256i64, "VDIVUL",
3680eae32dcSDimitry Andric                              i32, v256i32, "VDIVUW">;
3690eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_and,
370e8d8bef9SDimitry Andric                              i64, v256i64, "VAND",
371e8d8bef9SDimitry Andric                              i32, v256i32, "PVANDLO">;
3720eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_or,
3730eae32dcSDimitry Andric                              i64, v256i64, "VOR",
3740eae32dcSDimitry Andric                              i32, v256i32, "PVORLO">;
3750eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_xor,
3760eae32dcSDimitry Andric                              i64, v256i64, "VXOR",
3770eae32dcSDimitry Andric                              i32, v256i32, "PVXORLO">;
3780eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_shl,
3790eae32dcSDimitry Andric                              i64, v256i64, "VSLL",
3800eae32dcSDimitry Andric                              i32, v256i32, "PVSLLLO">;
3810eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_sra,
3820eae32dcSDimitry Andric                              i64, v256i64, "VSRAL",
3830eae32dcSDimitry Andric                              i32, v256i32, "PVSRALO">;
3840eae32dcSDimitry Andricdefm : Binary_vr_vv_ShortLong<vvp_srl,
3850eae32dcSDimitry Andric                              i64, v256i64, "VSRL",
3860eae32dcSDimitry Andric                              i32, v256i32, "PVSRLLO">;
3870eae32dcSDimitry Andric
3880eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fadd,
3890eae32dcSDimitry Andric                              f64, v256f64, "VFADDD",
3900eae32dcSDimitry Andric                              f32, v256f32, "PVFADDUP">;
3910eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<c_vvp_fmul,
3920eae32dcSDimitry Andric                              f64, v256f64, "VFMULD",
3930eae32dcSDimitry Andric                              f32, v256f32, "PVFMULUP">;
3940eae32dcSDimitry Andricdefm : Binary_rv_vv_ShortLong<vvp_fsub,
3950eae32dcSDimitry Andric                              f64, v256f64, "VFSUBD",
3960eae32dcSDimitry Andric                              f32, v256f32, "PVFSUBUP">;
3970eae32dcSDimitry Andricdefm : Binary_rv_vr_vv_ShortLong<vvp_fdiv,
3980eae32dcSDimitry Andric                              f64, v256f64, "VFDIVD",
3990eae32dcSDimitry Andric                              f32, v256f32, "VFDIVS">;
40004eeddc0SDimitry Andric
401*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_and,
402*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVAND">;
403*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_or,
404*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVOR">;
405*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_xor,
406*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVXOR">;
407*81ad6265SDimitry Andric
408*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_add,
409*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVADDU">;
410*81ad6265SDimitry Andricdefm : Binary_rv_vv<vvp_sub,
411*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVSUBU">;
412*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_srl,
413*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVSRL">;
414*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_sra,
415*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVSRA">;
416*81ad6265SDimitry Andricdefm : Binary_vr_vv<vvp_shl,
417*81ad6265SDimitry Andric                    i64, v512i32, v512i1, "PVSLL">;
418*81ad6265SDimitry Andric
419*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_fadd,
420*81ad6265SDimitry Andric                    i64, v512f32, v512i1, "PVFADD">;
421*81ad6265SDimitry Andricdefm : Binary_rv_vv<c_vvp_fmul,
422*81ad6265SDimitry Andric                    i64, v512f32, v512i1, "PVFMUL">;
423*81ad6265SDimitry Andricdefm : Binary_rv_vv<vvp_fsub,
424*81ad6265SDimitry Andric                    i64, v512f32, v512i1, "PVFSUB">;
425*81ad6265SDimitry Andric
426*81ad6265SDimitry Andricmulticlass Ternary_vvv<
427*81ad6265SDimitry Andric    SDPatternOperator OpNode, ValueType DataVT,
428*81ad6265SDimitry Andric    ValueType MaskVT, string OpBaseName> {
429*81ad6265SDimitry Andric  // Masked with passthru.
430*81ad6265SDimitry Andric  def : Pat<(vvp_select
431*81ad6265SDimitry Andric              (OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
432*81ad6265SDimitry Andric                (MaskVT srcvalue), (i32 srcvalue)),
433*81ad6265SDimitry Andric              DataVT:$vfalse,
434*81ad6265SDimitry Andric              MaskVT:$mask,
435*81ad6265SDimitry Andric              i32:$avl),
436*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvvml_v")
437*81ad6265SDimitry Andric              $vx, $vy, $vz, $mask, $avl, $vfalse)>;
438*81ad6265SDimitry Andric
439*81ad6265SDimitry Andric  // Unmasked.
440*81ad6265SDimitry Andric  def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
441*81ad6265SDimitry Andric              (MaskVT true_mask), i32:$avl),
442*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvvl")
443*81ad6265SDimitry Andric              $vx, $vy, $vz, $avl)>;
444*81ad6265SDimitry Andric
445*81ad6265SDimitry Andric  // Masked.
446*81ad6265SDimitry Andric  def : Pat<(OpNode DataVT:$vx, DataVT:$vy, DataVT:$vz,
447*81ad6265SDimitry Andric              MaskVT:$mask, i32:$avl),
448*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvvml")
449*81ad6265SDimitry Andric              $vx, $vy, $vz, $mask, $avl)>;
450*81ad6265SDimitry Andric}
451*81ad6265SDimitry Andric
452*81ad6265SDimitry Andricmulticlass Ternary_rvv<
453*81ad6265SDimitry Andric    SDPatternOperator OpNode,
454*81ad6265SDimitry Andric    ValueType ScalarVT, ValueType DataVT,
455*81ad6265SDimitry Andric    ValueType MaskVT, string OpBaseName> {
456*81ad6265SDimitry Andric  // Masked with passthru, broadcast first.
457*81ad6265SDimitry Andric  def : Pat<(vvp_select
458*81ad6265SDimitry Andric              (OpNode
459*81ad6265SDimitry Andric                (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
460*81ad6265SDimitry Andric                (MaskVT srcvalue), (i32 srcvalue)),
461*81ad6265SDimitry Andric              DataVT:$vfalse,
462*81ad6265SDimitry Andric              MaskVT:$mask,
463*81ad6265SDimitry Andric              i32:$avl),
464*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvvml_v")
465*81ad6265SDimitry Andric              $sx, $vy, $vz, $mask, $avl, $vfalse)>;
466*81ad6265SDimitry Andric
467*81ad6265SDimitry Andric  // Unmasked, broadcast first.
468*81ad6265SDimitry Andric  def : Pat<(OpNode
469*81ad6265SDimitry Andric              (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
470*81ad6265SDimitry Andric              (MaskVT true_mask), i32:$avl),
471*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvvl")
472*81ad6265SDimitry Andric              $sx, $vy, $vz, $avl)>;
473*81ad6265SDimitry Andric
474*81ad6265SDimitry Andric  // Masked, broadcast first.
475*81ad6265SDimitry Andric  def : Pat<(OpNode
476*81ad6265SDimitry Andric              (any_broadcast ScalarVT:$sx), DataVT:$vy, DataVT:$vz,
477*81ad6265SDimitry Andric              MaskVT:$mask, i32:$avl),
478*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"rvvml")
479*81ad6265SDimitry Andric              $sx, $vy, $vz, $mask, $avl)>;
480*81ad6265SDimitry Andric}
481*81ad6265SDimitry Andric
482*81ad6265SDimitry Andricmulticlass Ternary_vrv<
483*81ad6265SDimitry Andric    SDPatternOperator OpNode,
484*81ad6265SDimitry Andric    ValueType ScalarVT, ValueType DataVT,
485*81ad6265SDimitry Andric    ValueType MaskVT, string OpBaseName> {
486*81ad6265SDimitry Andric  // Masked with passthru, broadcast second.
487*81ad6265SDimitry Andric  def : Pat<(vvp_select
488*81ad6265SDimitry Andric              (OpNode
489*81ad6265SDimitry Andric                DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
490*81ad6265SDimitry Andric                (MaskVT srcvalue), (i32 srcvalue)),
491*81ad6265SDimitry Andric              DataVT:$vfalse,
492*81ad6265SDimitry Andric              MaskVT:$mask,
493*81ad6265SDimitry Andric              i32:$avl),
494*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vrvml_v")
495*81ad6265SDimitry Andric              $vx, $sy, $vz,
496*81ad6265SDimitry Andric              $mask, $avl, $vfalse)>;
497*81ad6265SDimitry Andric
498*81ad6265SDimitry Andric  // Unmasked, broadcast second.
499*81ad6265SDimitry Andric  def : Pat<(OpNode
500*81ad6265SDimitry Andric              DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
501*81ad6265SDimitry Andric              (MaskVT true_mask), i32:$avl),
502*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vrvl")
503*81ad6265SDimitry Andric              $vx, $sy, $vz, $avl)>;
504*81ad6265SDimitry Andric
505*81ad6265SDimitry Andric  // Masked, broadcast second.
506*81ad6265SDimitry Andric  def : Pat<(OpNode
507*81ad6265SDimitry Andric              DataVT:$vx, (any_broadcast ScalarVT:$sy), DataVT:$vz,
508*81ad6265SDimitry Andric              MaskVT:$mask, i32:$avl),
509*81ad6265SDimitry Andric            (!cast<Instruction>(OpBaseName#"vrvml")
510*81ad6265SDimitry Andric              $vx, $sy, $vz, $mask, $avl)>;
511*81ad6265SDimitry Andric}
512*81ad6265SDimitry Andric
513*81ad6265SDimitry Andricmulticlass Ternary_rvv_vrv_vvv<
514*81ad6265SDimitry Andric    SDPatternOperator OpNode,
515*81ad6265SDimitry Andric    ValueType ScalarVT, ValueType DataVT,
516*81ad6265SDimitry Andric    ValueType MaskVT, string OpBaseName> {
517*81ad6265SDimitry Andric  defm : Ternary_rvv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
518*81ad6265SDimitry Andric  defm : Ternary_vrv<OpNode, ScalarVT, DataVT, MaskVT, OpBaseName>;
519*81ad6265SDimitry Andric  defm : Ternary_vvv<OpNode, DataVT, MaskVT, OpBaseName>;
520*81ad6265SDimitry Andric}
521*81ad6265SDimitry Andric
522*81ad6265SDimitry Andric// Expand both 64bit and 32 bit variant (256 elements)
523*81ad6265SDimitry Andricmulticlass Ternary_ShortLong<
524*81ad6265SDimitry Andric    SDPatternOperator OpNode,
525*81ad6265SDimitry Andric    ValueType LongScalarVT, ValueType LongDataVT, string LongOpBaseName,
526*81ad6265SDimitry Andric    ValueType ShortScalarVT, ValueType ShortDataVT, string ShortOpBaseName> {
527*81ad6265SDimitry Andric  defm : Ternary_rvv_vrv_vvv<OpNode, LongScalarVT, LongDataVT,
528*81ad6265SDimitry Andric                             v256i1, LongOpBaseName>;
529*81ad6265SDimitry Andric  defm : Ternary_rvv_vrv_vvv<OpNode, ShortScalarVT, ShortDataVT,
530*81ad6265SDimitry Andric                             v256i1, ShortOpBaseName>;
531*81ad6265SDimitry Andric}
532*81ad6265SDimitry Andric
533*81ad6265SDimitry Andricdefm : Ternary_ShortLong<c_vvp_ffma,
534*81ad6265SDimitry Andric                         f64, v256f64, "VFMADD", f32, v256f32, "VFMADS">;
535*81ad6265SDimitry Andricdefm : Ternary_rvv_vrv_vvv<c_vvp_ffma,
536*81ad6265SDimitry Andric                           i64, v512f32, v512i1, "PVFMAD">;
537*81ad6265SDimitry Andric
53804eeddc0SDimitry Andricmulticlass Merge_mvv<
53904eeddc0SDimitry Andric    SDPatternOperator OpNode,
54004eeddc0SDimitry Andric    ValueType DataVT, ValueType MaskVT,
54104eeddc0SDimitry Andric    string OpBaseName> {
54204eeddc0SDimitry Andric  // Masked.
54304eeddc0SDimitry Andric  def : Pat<(OpNode
54404eeddc0SDimitry Andric                DataVT:$vtrue, DataVT:$vfalse,
54504eeddc0SDimitry Andric                MaskVT:$vm,
54604eeddc0SDimitry Andric                i32:$avl),
54704eeddc0SDimitry Andric            (!cast<Instruction>(OpBaseName#"vvml_v")
54804eeddc0SDimitry Andric                $vfalse, $vtrue, $vm, $avl, $vfalse)>;
54904eeddc0SDimitry Andric}
55004eeddc0SDimitry Andric
55104eeddc0SDimitry Andricmulticlass Merge_mvv_ShortLong<
55204eeddc0SDimitry Andric    SDPatternOperator OpNode,
55304eeddc0SDimitry Andric    ValueType LongDataVT, ValueType ShortDataVT,
55404eeddc0SDimitry Andric    string OpBaseName> {
55504eeddc0SDimitry Andric  defm : Merge_mvv<OpNode,
55604eeddc0SDimitry Andric                   LongDataVT, v256i1,
55704eeddc0SDimitry Andric                   OpBaseName>;
55804eeddc0SDimitry Andric  defm : Merge_mvv<OpNode,
55904eeddc0SDimitry Andric                   ShortDataVT, v256i1,
56004eeddc0SDimitry Andric                   OpBaseName>;
56104eeddc0SDimitry Andric}
56204eeddc0SDimitry Andric
56304eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select,
56404eeddc0SDimitry Andric                           v256f64,
56504eeddc0SDimitry Andric                           v256f32, "VMRG">;
56604eeddc0SDimitry Andricdefm : Merge_mvv_ShortLong<vvp_select,
56704eeddc0SDimitry Andric                           v256i64,
56804eeddc0SDimitry Andric                           v256i32, "VMRG">;
569*81ad6265SDimitry Andric
570*81ad6265SDimitry Andricmulticlass Set_CC<ValueType DataVT, string FmkBaseName, string CmpBaseName, SDPatternOperator CCMatcher, SDNodeXForm CCConv> {
571*81ad6265SDimitry Andric  // Unmasked.
572*81ad6265SDimitry Andric  def : Pat<(v256i1 (vvp_setcc
573*81ad6265SDimitry Andric              DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, (v256i1 true_mask), i32:$vl)),
574*81ad6265SDimitry Andric              (!cast<Instruction>(FmkBaseName#"vl")
575*81ad6265SDimitry Andric                (CCConv $cond),
576*81ad6265SDimitry Andric                (!cast<Instruction>(CmpBaseName#"vvl")
577*81ad6265SDimitry Andric                  $LHS, $RHS, $vl),
578*81ad6265SDimitry Andric                $vl)>;
579*81ad6265SDimitry Andric  // Masked.
580*81ad6265SDimitry Andric  def : Pat<(v256i1 (vvp_setcc
581*81ad6265SDimitry Andric              DataVT:$LHS, DataVT:$RHS, CCMatcher:$cond, v256i1:$vm, i32:$vl)),
582*81ad6265SDimitry Andric              (!cast<Instruction>(FmkBaseName#"vml")
583*81ad6265SDimitry Andric                (CCConv $cond),
584*81ad6265SDimitry Andric                (!cast<Instruction>(CmpBaseName#"vvl")
585*81ad6265SDimitry Andric                  $LHS, $RHS, $vl),
586*81ad6265SDimitry Andric                $vm, $vl)>;
587*81ad6265SDimitry Andric}
588*81ad6265SDimitry Andric
589*81ad6265SDimitry Andricdefm : Set_CC<v256i64,"VFMKL","VCMPUL",CCUIOp,icond2cc>;
590*81ad6265SDimitry Andricdefm : Set_CC<v256i64,"VFMKL","VCMPSL",CCSIOp,icond2cc>;
591*81ad6265SDimitry Andricdefm : Set_CC<v256f64,"VFMKL","VFCMPD",cond,fcond2cc>;
592*81ad6265SDimitry Andric
593*81ad6265SDimitry Andricdefm : Set_CC<v256i32,"VFMKW","VCMPUW",CCUIOp,icond2cc>;
594*81ad6265SDimitry Andricdefm : Set_CC<v256i32,"VFMKW","VCMPSWZX",CCSIOp,icond2cc>;
595*81ad6265SDimitry Andricdefm : Set_CC<v256f32,"VFMKS","VFCMPS",cond,fcond2cc>;
596*81ad6265SDimitry Andric
597*81ad6265SDimitry Andricmulticlass Reduce_GenericInt<ValueType VectorVT,
598*81ad6265SDimitry Andric    RegisterClass ResRC, ValueType ResVT,
599*81ad6265SDimitry Andric    string VVPRedOp, string RedInstName> {
600*81ad6265SDimitry Andric  // Unmasked.
601*81ad6265SDimitry Andric  def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp)
602*81ad6265SDimitry Andric                VectorVT:$vx, (v256i1 true_mask), i32:$vl)),
603*81ad6265SDimitry Andric             (COPY_TO_REGCLASS
604*81ad6265SDimitry Andric               (!cast<Instruction>("LVSvi")
605*81ad6265SDimitry Andric                 (!cast<Instruction>(RedInstName#"vl") $vx, $vl), 0),
606*81ad6265SDimitry Andric                 ResRC)>;
607*81ad6265SDimitry Andric
608*81ad6265SDimitry Andric  // Masked.
609*81ad6265SDimitry Andric  def : Pat <(ResVT (!cast<SDPatternOperator>("vvp_reduce_"#VVPRedOp)
610*81ad6265SDimitry Andric                VectorVT:$vx, v256i1:$vm, i32:$vl)),
611*81ad6265SDimitry Andric             (COPY_TO_REGCLASS
612*81ad6265SDimitry Andric                (!cast<Instruction>("LVSvi")
613*81ad6265SDimitry Andric                   (!cast<Instruction>(RedInstName#"vml") $vx, $vm, $vl), 0),
614*81ad6265SDimitry Andric                   ResRC)>;
615*81ad6265SDimitry Andric}
616*81ad6265SDimitry Andric
617*81ad6265SDimitry Andricmulticlass IntReduce_ShortLong<ValueType VectorVT,
618*81ad6265SDimitry Andric    RegisterClass ResRC, ValueType ResVT,
619*81ad6265SDimitry Andric    string SumSuffix, string MinMaxSuffix> {
620*81ad6265SDimitry Andric  defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "or",  "VROR">;
621*81ad6265SDimitry Andric  defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "and", "VRAND">;
622*81ad6265SDimitry Andric  defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "xor", "VRXOR">;
623*81ad6265SDimitry Andric  defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "add", "VSUM"#SumSuffix>;
624*81ad6265SDimitry Andric  defm: Reduce_GenericInt<VectorVT, ResRC, ResVT, "smax", "VRMAX"#MinMaxSuffix>;
625*81ad6265SDimitry Andric}
626*81ad6265SDimitry Andric
627*81ad6265SDimitry Andricdefm: IntReduce_ShortLong<v256i64, I64, i64, "L","SLFST">;
628*81ad6265SDimitry Andricdefm: IntReduce_ShortLong<v256i32, I32, i32, "WSX","SWFSTSX">;
629