xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonInstrInfoV60.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//=- HexagonInstrInfoV60.td - Target Desc. for Hexagon Target -*- tablegen -*-=//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// This file describes the Hexagon V60 instructions in TableGen format.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Workerdef alignedload : PatFrag<(ops node:$addr), (load $addr), [{
14*9880d681SAndroid Build Coastguard Worker  return isAlignedMemNode(dyn_cast<MemSDNode>(N));
15*9880d681SAndroid Build Coastguard Worker}]>;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdef unalignedload : PatFrag<(ops node:$addr), (load $addr), [{
18*9880d681SAndroid Build Coastguard Worker  return !isAlignedMemNode(dyn_cast<MemSDNode>(N));
19*9880d681SAndroid Build Coastguard Worker}]>;
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdef alignedstore : PatFrag<(ops node:$val, node:$addr), (store $val, $addr), [{
22*9880d681SAndroid Build Coastguard Worker  return isAlignedMemNode(dyn_cast<MemSDNode>(N));
23*9880d681SAndroid Build Coastguard Worker}]>;
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdef unalignedstore : PatFrag<(ops node:$val, node:$addr), (store $val, $addr), [{
26*9880d681SAndroid Build Coastguard Worker  return !isAlignedMemNode(dyn_cast<MemSDNode>(N));
27*9880d681SAndroid Build Coastguard Worker}]>;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// Vector store
31*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, validSubTargets = HasV60SubT, hasSideEffects = 0 in
32*9880d681SAndroid Build Coastguard Worker{
33*9880d681SAndroid Build Coastguard Worker  class VSTInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
34*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = CVI_VM_ST,
35*9880d681SAndroid Build Coastguard Worker                IType type = TypeCVI_VM_ST>
36*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, type>, OpcodeHexagon;
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker// Vector load
41*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV60T, UseHVX] in
42*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1, validSubTargets = HasV60SubT, hasSideEffects = 0 in
43*9880d681SAndroid Build Coastguard Worker  class V6_LDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
44*9880d681SAndroid Build Coastguard Worker                  string cstr = "", InstrItinClass itin = CVI_VM_LD,
45*9880d681SAndroid Build Coastguard Worker                  IType type = TypeCVI_VM_LD>
46*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, type>;
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerlet Predicates = [HasV60T, UseHVX] in
49*9880d681SAndroid Build Coastguard Workerlet mayStore = 1, validSubTargets = HasV60SubT, hasSideEffects = 0 in
50*9880d681SAndroid Build Coastguard Workerclass V6_STInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
51*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = CVI_VM_ST,
52*9880d681SAndroid Build Coastguard Worker                IType type = TypeCVI_VM_ST>
53*9880d681SAndroid Build Coastguard Worker: InstHexagon<outs, ins, asmstr, pattern, cstr, itin, type>;
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
56*9880d681SAndroid Build Coastguard Worker// Vector loads with base + immediate offset
57*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
58*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, accessSize = Vector64Access in
59*9880d681SAndroid Build Coastguard Workerclass T_vload_ai<string asmStr>
60*9880d681SAndroid Build Coastguard Worker  : V6_LDInst <(outs VectorRegs:$dst), (ins IntRegs:$src1, s4_6Imm:$src2),
61*9880d681SAndroid Build Coastguard Worker                asmStr>;
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, addrMode = BaseImmOffset, accessSize = Vector128Access in
64*9880d681SAndroid Build Coastguard Workerclass T_vload_ai_128B<string asmStr>
65*9880d681SAndroid Build Coastguard Worker  : V6_LDInst <(outs VectorRegs128B:$dst), (ins IntRegs:$src1, s4_7Imm:$src2),
66*9880d681SAndroid Build Coastguard Worker                asmStr>;
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerlet isCVLoadable = 1, hasNewValue = 1 in {
69*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_ai         : T_vload_ai <"$dst = vmem($src1+#$src2)">,
70*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_ai_enc;
71*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_ai      : T_vload_ai <"$dst = vmem($src1+#$src2):nt">,
72*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_nt_ai_enc;
73*9880d681SAndroid Build Coastguard Worker  // 128B
74*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_ai_128B    : T_vload_ai_128B <"$dst = vmem($src1+#$src2)">,
75*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_ai_128B_enc;
76*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_ai_128B : T_vload_ai_128B <"$dst = vmem($src1+#$src2):nt">,
77*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_nt_ai_128B_enc;
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_VP_LDU, Type = TypeCVI_VM_VP_LDU, hasNewValue = 1 in {
81*9880d681SAndroid Build Coastguard Worker  def V6_vL32Ub_ai      : T_vload_ai <"$dst = vmemu($src1+#$src2)">,
82*9880d681SAndroid Build Coastguard Worker                          V6_vL32Ub_ai_enc;
83*9880d681SAndroid Build Coastguard Worker  def V6_vL32Ub_ai_128B : T_vload_ai_128B <"$dst = vmemu($src1+#$src2)">,
84*9880d681SAndroid Build Coastguard Worker                          V6_vL32Ub_ai_128B_enc;
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_LD, Type = TypeCVI_VM_LD, isCVLoad = 1,
88*9880d681SAndroid Build Coastguard Worker    hasNewValue = 1 in {
89*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_cur_ai    : T_vload_ai <"$dst.cur = vmem($src1+#$src2)">,
90*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_cur_ai_enc;
91*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_cur_ai : T_vload_ai <"$dst.cur = vmem($src1+#$src2):nt">,
92*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_nt_cur_ai_enc;
93*9880d681SAndroid Build Coastguard Worker  // 128B
94*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_cur_ai_128B    : T_vload_ai_128B
95*9880d681SAndroid Build Coastguard Worker                                <"$dst.cur = vmem($src1+#$src2)">,
96*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_cur_ai_128B_enc;
97*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_cur_ai_128B : T_vload_ai_128B
98*9880d681SAndroid Build Coastguard Worker                                <"$dst.cur = vmem($src1+#$src2):nt">,
99*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_nt_cur_ai_128B_enc;
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_TMP_LD, Type = TypeCVI_VM_TMP_LD, hasNewValue = 1 in {
104*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_tmp_ai    : T_vload_ai <"$dst.tmp = vmem($src1+#$src2)">,
105*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_tmp_ai_enc;
106*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_tmp_ai : T_vload_ai <"$dst.tmp = vmem($src1+#$src2):nt">,
107*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_nt_tmp_ai_enc;
108*9880d681SAndroid Build Coastguard Worker  // 128B
109*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_tmp_ai_128B    : T_vload_ai_128B
110*9880d681SAndroid Build Coastguard Worker                                <"$dst.tmp = vmem($src1+#$src2)">,
111*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_tmp_ai_128B_enc;
112*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_tmp_ai_128B : T_vload_ai_128B
113*9880d681SAndroid Build Coastguard Worker                                <"$dst.tmp = vmem($src1+#$src2)">,
114*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_nt_tmp_ai_128B_enc;
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
118*9880d681SAndroid Build Coastguard Worker// Vector stores with base + immediate offset - unconditional
119*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
120*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, accessSize = Vector64Access, isPredicable = 1 in
121*9880d681SAndroid Build Coastguard Workerclass T_vstore_ai <string mnemonic, string baseOp, Operand ImmOp,
122*9880d681SAndroid Build Coastguard Worker                   RegisterClass RC, bit isNT>
123*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs), (ins IntRegs:$src1, ImmOp:$src2, RC:$src3),
124*9880d681SAndroid Build Coastguard Worker    mnemonic#"($src1+#$src2)"#!if(isNT, ":nt", "")#" = $src3">, NewValueRel {
125*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
129*9880d681SAndroid Build Coastguard Workerclass T_vstore_ai_64B <string mnemonic, string baseOp, bit isNT = 0>
130*9880d681SAndroid Build Coastguard Worker  : T_vstore_ai <mnemonic, baseOp, s4_6Imm, VectorRegs, isNT>;
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
133*9880d681SAndroid Build Coastguard Workerclass T_vstore_ai_128B <string mnemonic, string baseOp, bit isNT = 0>
134*9880d681SAndroid Build Coastguard Worker  : T_vstore_ai <mnemonic, baseOp#"128B", s4_7Imm, VectorRegs128B, isNT>;
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 in {
137*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_ai         : T_vstore_ai_64B <"vmem", "vS32b_ai">,
138*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_ai_enc;
139*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_ai_128B    : T_vstore_ai_128B <"vmem", "vS32b_ai">,
140*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_ai_128B_enc;
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, isNonTemporal = 1 in {
144*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_ai      : T_vstore_ai_64B <"vmem", "vS32b_ai", 1>,
145*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_ai_enc;
146*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_ai_128B : T_vstore_ai_128B <"vmem", "vS32b_ai", 1>,
147*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_ai_128B_enc;
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_STU, Type = TypeCVI_VM_STU in {
151*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_ai      : T_vstore_ai_64B <"vmemu", "vS32Ub_ai">,
152*9880d681SAndroid Build Coastguard Worker                          V6_vS32Ub_ai_enc;
153*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_ai_128B : T_vstore_ai_128B <"vmemu", "vS32Ub_ai">,
154*9880d681SAndroid Build Coastguard Worker                          V6_vS32Ub_ai_128B_enc;
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
157*9880d681SAndroid Build Coastguard Worker// Vector stores with base + immediate offset - unconditional new
158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
159*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, isNewValue = 1, opNewValue = 2, isNVStore = 1,
160*9880d681SAndroid Build Coastguard Worker    isPredicable = 1, Itinerary = CVI_VM_NEW_ST, Type = TypeCVI_VM_NEW_ST in
161*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_ai <string baseOp, Operand ImmOp, RegisterClass RC, bit isNT>
162*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs ), (ins IntRegs:$src1, ImmOp:$src2, RC:$src3),
163*9880d681SAndroid Build Coastguard Worker    "vmem($src1+#$src2)"#!if(isNT, ":nt", "")#" = $src3.new">, NewValueRel {
164*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
168*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_ai_64B <string baseOp, bit isNT = 0>
169*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_ai <baseOp, s4_6Imm, VectorRegs, isNT>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
172*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_ai_128B <string baseOp, bit isNT = 0>
173*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_ai <baseOp#"128B", s4_7Imm, VectorRegs128B, isNT>;
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_ai      : T_vstore_new_ai_64B <"vS32b_ai">, V6_vS32b_new_ai_enc;
176*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_ai_128B : T_vstore_new_ai_128B <"vS32b_ai">,
177*9880d681SAndroid Build Coastguard Worker                           V6_vS32b_new_ai_128B_enc;
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerlet isNonTemporal = 1 in {
180*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_ai      : T_vstore_new_ai_64B<"vS32b_ai", 1>,
181*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_ai_enc;
182*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_ai_128B : T_vstore_new_ai_128B<"vS32b_ai", 1>,
183*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_ai_128B_enc;
184*9880d681SAndroid Build Coastguard Worker}
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
187*9880d681SAndroid Build Coastguard Worker// Vector stores with base + immediate offset - conditional
188*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
189*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, isPredicated = 1 in
190*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_ai <string mnemonic, string baseOp, Operand ImmOp,
191*9880d681SAndroid Build Coastguard Worker                        RegisterClass RC, bit isPredNot = 0, bit isNT = 0>
192*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs),
193*9880d681SAndroid Build Coastguard Worker               (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
194*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) "
195*9880d681SAndroid Build Coastguard Worker     #mnemonic#"($src2+#$src3)"#!if(isNT, ":nt", "")#" = $src4">, NewValueRel {
196*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
197*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
201*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_ai_64B <string mnemonic, string baseOp,
202*9880d681SAndroid Build Coastguard Worker                            bit isPredNot = 0, bit isNT = 0>
203*9880d681SAndroid Build Coastguard Worker  : T_vstore_pred_ai <mnemonic, baseOp, s4_6Imm, VectorRegs, isPredNot, isNT>;
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
206*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_ai_128B <string mnemonic, string baseOp,
207*9880d681SAndroid Build Coastguard Worker                             bit isPredNot = 0, bit isNT = 0>
208*9880d681SAndroid Build Coastguard Worker  : T_vstore_pred_ai <mnemonic, baseOp#"128B", s4_7Imm, VectorRegs128B,
209*9880d681SAndroid Build Coastguard Worker                      isPredNot, isNT>;
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 in {
212*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pred_ai     : T_vstore_pred_ai_64B <"vmem", "vS32b_ai">,
213*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_pred_ai_enc;
214*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_npred_ai    : T_vstore_pred_ai_64B <"vmem", "vS32b_ai", 1>,
215*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_npred_ai_enc;
216*9880d681SAndroid Build Coastguard Worker  // 128B
217*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pred_ai_128B    : T_vstore_pred_ai_128B <"vmem", "vS32b_ai">,
218*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_pred_ai_128B_enc;
219*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_npred_ai_128B   : T_vstore_pred_ai_128B <"vmem", "vS32b_ai", 1>,
220*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_npred_ai_128B_enc;
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, isNonTemporal = 1 in {
223*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pred_ai  : T_vstore_pred_ai_64B <"vmem", "vS32b_ai", 0, 1>,
224*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_pred_ai_enc;
225*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_npred_ai : T_vstore_pred_ai_64B <"vmem", "vS32b_ai", 1, 1>,
226*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_npred_ai_enc;
227*9880d681SAndroid Build Coastguard Worker  // 128B
228*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pred_ai_128B  : T_vstore_pred_ai_128B
229*9880d681SAndroid Build Coastguard Worker                                  <"vmem", "vS32b_ai", 0, 1>,
230*9880d681SAndroid Build Coastguard Worker                                  V6_vS32b_nt_pred_ai_128B_enc;
231*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_npred_ai_128B : T_vstore_pred_ai_128B
232*9880d681SAndroid Build Coastguard Worker                                  <"vmem", "vS32b_ai", 1, 1>,
233*9880d681SAndroid Build Coastguard Worker                                  V6_vS32b_nt_npred_ai_128B_enc;
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_STU, Type = TypeCVI_VM_STU in {
237*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pred_ai  : T_vstore_pred_ai_64B <"vmemu", "vS32Ub_ai">,
238*9880d681SAndroid Build Coastguard Worker                           V6_vS32Ub_pred_ai_enc;
239*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_npred_ai : T_vstore_pred_ai_64B <"vmemu", "vS32Ub_ai", 1>,
240*9880d681SAndroid Build Coastguard Worker                           V6_vS32Ub_npred_ai_enc;
241*9880d681SAndroid Build Coastguard Worker  // 128B
242*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pred_ai_128B  :T_vstore_pred_ai_128B <"vmemu", "vS32Ub_ai">,
243*9880d681SAndroid Build Coastguard Worker                               V6_vS32Ub_pred_ai_128B_enc;
244*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_npred_ai_128B :T_vstore_pred_ai_128B <"vmemu", "vS32Ub_ai", 1>,
245*9880d681SAndroid Build Coastguard Worker                               V6_vS32Ub_npred_ai_128B_enc;
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
249*9880d681SAndroid Build Coastguard Worker// Vector stores with base + immediate offset - byte-enabled aligned
250*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
251*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset in
252*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_ai <Operand ImmOp, RegisterClass RC,
253*9880d681SAndroid Build Coastguard Worker                         bit isPredNot = 0, bit isNT = 0>
254*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs),
255*9880d681SAndroid Build Coastguard Worker               (ins VecPredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
256*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) vmem($src2+#$src3)"
257*9880d681SAndroid Build Coastguard Worker          #!if(isNT, ":nt", "")#" = $src4"> {
258*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
262*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_ai_64B <bit isPredNot = 0, bit isNT = 0>
263*9880d681SAndroid Build Coastguard Worker  : T_vstore_qpred_ai <s4_6Imm, VectorRegs, isPredNot, isNT>;
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
266*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_ai_128B <bit isPredNot = 0, bit isNT = 0>
267*9880d681SAndroid Build Coastguard Worker  : T_vstore_qpred_ai <s4_7Imm, VectorRegs128B, isPredNot, isNT>;
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_qpred_ai  : T_vstore_qpred_ai_64B, V6_vS32b_qpred_ai_enc;
270*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nqpred_ai : T_vstore_qpred_ai_64B <1>,
271*9880d681SAndroid Build Coastguard Worker                         V6_vS32b_nqpred_ai_enc;
272*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_qpred_ai  : T_vstore_qpred_ai_64B <0, 1>,
273*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_qpred_ai_enc;
274*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_nqpred_ai : T_vstore_qpred_ai_64B <1, 1>,
275*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_nqpred_ai_enc;
276*9880d681SAndroid Build Coastguard Worker// 128B
277*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_qpred_ai_128B  : T_vstore_qpred_ai_128B, V6_vS32b_qpred_ai_128B_enc;
278*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nqpred_ai_128B : T_vstore_qpred_ai_128B<1>,
279*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nqpred_ai_128B_enc;
280*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_qpred_ai_128B  : T_vstore_qpred_ai_128B<0, 1>,
281*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_qpred_ai_128B_enc;
282*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_nqpred_ai_128B : T_vstore_qpred_ai_128B<1, 1>,
283*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_nqpred_ai_128B_enc;
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
287*9880d681SAndroid Build Coastguard Worker// Vector stores with base + immediate offset - conditional new
288*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
289*9880d681SAndroid Build Coastguard Workerlet addrMode = BaseImmOffset, isPredicated = 1, isNewValue = 1, opNewValue = 3,
290*9880d681SAndroid Build Coastguard Worker    isNVStore = 1, Type = TypeCVI_VM_NEW_ST, Itinerary = CVI_VM_NEW_ST in
291*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_ai <string baseOp, Operand ImmOp, RegisterClass RC,
292*9880d681SAndroid Build Coastguard Worker                            bit isPredNot, bit isNT>
293*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs),
294*9880d681SAndroid Build Coastguard Worker               (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
295*9880d681SAndroid Build Coastguard Worker    "if("#!if(isPredNot, "!", "")#"$src1) vmem($src2+#$src3)"
296*9880d681SAndroid Build Coastguard Worker         #!if(isNT, ":nt", "")#" = $src4.new">, NewValueRel {
297*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
298*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
302*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_ai_64B <string baseOp, bit isPredNot = 0, bit isNT = 0>
303*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pred_ai <baseOp, s4_6Imm, VectorRegs, isPredNot, isNT>;
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
306*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_ai_128B <string baseOp, bit isPredNot = 0, bit isNT = 0>
307*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pred_ai <baseOp#"128B", s4_7Imm, VectorRegs128B,
308*9880d681SAndroid Build Coastguard Worker                          isPredNot, isNT>;
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pred_ai     : T_vstore_new_pred_ai_64B <"vS32b_ai">,
312*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_pred_ai_enc;
313*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_npred_ai    : T_vstore_new_pred_ai_64B <"vS32b_ai", 1>,
314*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_npred_ai_enc;
315*9880d681SAndroid Build Coastguard Worker// 128B
316*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pred_ai_128B     : T_vstore_new_pred_ai_128B <"vS32b_ai">,
317*9880d681SAndroid Build Coastguard Worker                                    V6_vS32b_new_pred_ai_128B_enc;
318*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_npred_ai_128B    : T_vstore_new_pred_ai_128B <"vS32b_ai", 1>,
319*9880d681SAndroid Build Coastguard Worker                                    V6_vS32b_new_npred_ai_128B_enc;
320*9880d681SAndroid Build Coastguard Workerlet isNonTemporal = 1 in {
321*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pred_ai  : T_vstore_new_pred_ai_64B <"vS32b_ai", 0, 1>,
322*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_new_pred_ai_enc;
323*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_npred_ai : T_vstore_new_pred_ai_64B <"vS32b_ai", 1, 1>,
324*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_new_npred_ai_enc;
325*9880d681SAndroid Build Coastguard Worker  // 128B
326*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pred_ai_128B  : T_vstore_new_pred_ai_128B
327*9880d681SAndroid Build Coastguard Worker                                      <"vS32b_ai", 0, 1>,
328*9880d681SAndroid Build Coastguard Worker                                      V6_vS32b_nt_new_pred_ai_128B_enc;
329*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_npred_ai_128B : T_vstore_new_pred_ai_128B
330*9880d681SAndroid Build Coastguard Worker                                      <"vS32b_ai", 1, 1>,
331*9880d681SAndroid Build Coastguard Worker                                      V6_vS32b_nt_new_npred_ai_128B_enc;
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
335*9880d681SAndroid Build Coastguard Worker// Post increment vector loads with immediate offset.
336*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
337*9880d681SAndroid Build Coastguard Workerlet addrMode = PostInc, hasNewValue = 1 in
338*9880d681SAndroid Build Coastguard Workerclass T_vload_pi<string asmStr, Operand ImmOp, RegisterClass RC>
339*9880d681SAndroid Build Coastguard Worker  : V6_LDInst <(outs RC:$dst, IntRegs:$_dst_),
340*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ImmOp:$src2), asmStr, [],
341*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">;
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
344*9880d681SAndroid Build Coastguard Workerclass T_vload_pi_64B <string asmStr>
345*9880d681SAndroid Build Coastguard Worker  : T_vload_pi <asmStr, s3_6Imm, VectorRegs>;
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
348*9880d681SAndroid Build Coastguard Workerclass T_vload_pi_128B <string asmStr>
349*9880d681SAndroid Build Coastguard Worker  : T_vload_pi <asmStr, s3_7Imm, VectorRegs128B>;
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Workerlet isCVLoadable = 1 in {
352*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_pi    : T_vload_pi_64B <"$dst = vmem($src1++#$src2)">,
353*9880d681SAndroid Build Coastguard Worker                       V6_vL32b_pi_enc;
354*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_pi : T_vload_pi_64B <"$dst = vmem($src1++#$src2):nt">,
355*9880d681SAndroid Build Coastguard Worker                       V6_vL32b_nt_pi_enc;
356*9880d681SAndroid Build Coastguard Worker  // 128B
357*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_pi_128B    : T_vload_pi_128B <"$dst = vmem($src1++#$src2)">,
358*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_pi_128B_enc;
359*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_pi_128B : T_vload_pi_128B <"$dst = vmem($src1++#$src2):nt">,
360*9880d681SAndroid Build Coastguard Worker                            V6_vL32b_nt_pi_128B_enc;
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_VP_LDU, Type = TypeCVI_VM_VP_LDU in {
364*9880d681SAndroid Build Coastguard Worker  def V6_vL32Ub_pi : T_vload_pi_64B <"$dst = vmemu($src1++#$src2)">,
365*9880d681SAndroid Build Coastguard Worker                     V6_vL32Ub_pi_enc;
366*9880d681SAndroid Build Coastguard Worker  // 128B
367*9880d681SAndroid Build Coastguard Worker  def V6_vL32Ub_pi_128B : T_vload_pi_128B <"$dst = vmemu($src1++#$src2)">,
368*9880d681SAndroid Build Coastguard Worker                          V6_vL32Ub_pi_128B_enc;
369*9880d681SAndroid Build Coastguard Worker}
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerlet isCVLoad = 1, Itinerary = CVI_VM_LD, Type = TypeCVI_VM_LD in {
372*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_cur_pi    : T_vload_pi_64B <"$dst.cur = vmem($src1++#$src2)">,
373*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_cur_pi_enc;
374*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_cur_pi : T_vload_pi_64B <"$dst.cur = vmem($src1++#$src2):nt">,
375*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_nt_cur_pi_enc;
376*9880d681SAndroid Build Coastguard Worker  // 128B
377*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_cur_pi_128B    : T_vload_pi_128B
378*9880d681SAndroid Build Coastguard Worker                                <"$dst.cur = vmem($src1++#$src2)">,
379*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_cur_pi_128B_enc;
380*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_cur_pi_128B : T_vload_pi_128B
381*9880d681SAndroid Build Coastguard Worker                                <"$dst.cur = vmem($src1++#$src2):nt">,
382*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_nt_cur_pi_128B_enc;
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_TMP_LD, Type = TypeCVI_VM_TMP_LD in {
386*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_tmp_pi    : T_vload_pi_64B <"$dst.tmp = vmem($src1++#$src2)">,
387*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_tmp_pi_enc;
388*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_tmp_pi : T_vload_pi_64B <"$dst.tmp = vmem($src1++#$src2):nt">,
389*9880d681SAndroid Build Coastguard Worker                           V6_vL32b_nt_tmp_pi_enc;
390*9880d681SAndroid Build Coastguard Worker  //128B
391*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_tmp_pi_128B    : T_vload_pi_128B
392*9880d681SAndroid Build Coastguard Worker                                <"$dst.tmp = vmem($src1++#$src2)">,
393*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_tmp_pi_128B_enc;
394*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_tmp_pi_128B : T_vload_pi_128B
395*9880d681SAndroid Build Coastguard Worker                                <"$dst.tmp = vmem($src1++#$src2):nt">,
396*9880d681SAndroid Build Coastguard Worker                                V6_vL32b_nt_tmp_pi_128B_enc;
397*9880d681SAndroid Build Coastguard Worker}
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
400*9880d681SAndroid Build Coastguard Worker// Post increment vector stores with immediate offset.
401*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
402*9880d681SAndroid Build Coastguard Workerlet addrMode = PostInc, isPredicable = 1 in
403*9880d681SAndroid Build Coastguard Workerclass T_vstore_pi <string mnemonic, string baseOp, Operand ImmOp,
404*9880d681SAndroid Build Coastguard Worker                   RegisterClass RC, bit isNT>
405*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
406*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ImmOp:$src2, RC:$src3),
407*9880d681SAndroid Build Coastguard Worker    mnemonic#"($src1++#$src2)"#!if(isNT, ":nt", "")#" = $src3", [],
408*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">, NewValueRel {
409*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
413*9880d681SAndroid Build Coastguard Workerclass T_vstore_pi_64B <string mnemonic, string baseOp, bit isNT = 0>
414*9880d681SAndroid Build Coastguard Worker  : T_vstore_pi <mnemonic, baseOp, s3_6Imm, VectorRegs, isNT>;
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
417*9880d681SAndroid Build Coastguard Workerclass T_vstore_pi_128B <string mnemonic, string baseOp, bit isNT = 0>
418*9880d681SAndroid Build Coastguard Worker  : T_vstore_pi <mnemonic, baseOp#"128B", s3_7Imm, VectorRegs128B, isNT>;
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 in {
421*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pi      : T_vstore_pi_64B <"vmem", "vS32b_pi">, V6_vS32b_pi_enc;
422*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pi_128B : T_vstore_pi_128B <"vmem", "vS32b_pi">,
423*9880d681SAndroid Build Coastguard Worker                         V6_vS32b_pi_128B_enc;
424*9880d681SAndroid Build Coastguard Worker}
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 , isNonTemporal = 1  in {
427*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pi      : T_vstore_pi_64B <"vmem", "vS32b_pi", 1>,
428*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_pi_enc;
429*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pi_128B : T_vstore_pi_128B <"vmem", "vS32b_pi", 1>,
430*9880d681SAndroid Build Coastguard Worker                            V6_vS32b_nt_pi_128B_enc;
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_STU, Type = TypeCVI_VM_STU in {
435*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pi      : T_vstore_pi_64B <"vmemu", "vS32Ub_pi">,
436*9880d681SAndroid Build Coastguard Worker                          V6_vS32Ub_pi_enc;
437*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pi_128B : T_vstore_pi_128B <"vmemu", "vS32Ub_pi">,
438*9880d681SAndroid Build Coastguard Worker                          V6_vS32Ub_pi_128B_enc;
439*9880d681SAndroid Build Coastguard Worker}
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
442*9880d681SAndroid Build Coastguard Worker// Post increment unconditional .new vector stores with immediate offset.
443*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
444*9880d681SAndroid Build Coastguard Workerlet addrMode = PostInc, isNVStore = 1 in
445*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_NEW_ST, Type = TypeCVI_VM_NEW_ST, isNewValue = 1,
446*9880d681SAndroid Build Coastguard Worker    isPredicable = 1, opNewValue = 3, isNVStore = 1 in
447*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pi <string baseOp, Operand ImmOp, RegisterClass RC, bit isNT>
448*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
449*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ImmOp:$src2, RC:$src3),
450*9880d681SAndroid Build Coastguard Worker    "vmem($src1++#$src2)"#!if(isNT, ":nt", "")#" = $src3.new", [],
451*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">, NewValueRel {
452*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
453*9880d681SAndroid Build Coastguard Worker}
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
456*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pi_64B <string baseOp, bit isNT = 0>
457*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pi <baseOp, s3_6Imm, VectorRegs, isNT>;
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
460*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pi_128B <string baseOp, bit isNT = 0>
461*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pi <baseOp#"128B", s3_7Imm, VectorRegs128B, isNT>;
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pi      : T_vstore_new_pi_64B <"vS32b_pi">,
465*9880d681SAndroid Build Coastguard Worker                           V6_vS32b_new_pi_enc;
466*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pi_128B : T_vstore_new_pi_128B <"vS32b_pi">,
467*9880d681SAndroid Build Coastguard Worker                           V6_vS32b_new_pi_128B_enc;
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Workerlet isNonTemporal = 1 in {
470*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pi      : T_vstore_new_pi_64B <"vS32b_pi", 1>,
471*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_pi_enc;
472*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pi_128B : T_vstore_new_pi_128B <"vS32b_pi", 1>,
473*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_pi_128B_enc;
474*9880d681SAndroid Build Coastguard Worker}
475*9880d681SAndroid Build Coastguard Worker
476*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
477*9880d681SAndroid Build Coastguard Worker// Post increment conditional vector stores with immediate offset
478*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
479*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1, addrMode = PostInc in
480*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_pi <string mnemonic, string baseOp, Operand ImmOp,
481*9880d681SAndroid Build Coastguard Worker                        RegisterClass RC, bit isPredNot, bit isNT>
482*9880d681SAndroid Build Coastguard Worker  : V6_STInst<(outs IntRegs:$_dst_),
483*9880d681SAndroid Build Coastguard Worker             (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
484*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) "#mnemonic#"($src2++#$src3)"
485*9880d681SAndroid Build Coastguard Worker          #!if(isNT, ":nt", "")#" = $src4", [],
486*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_">, NewValueRel {
487*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
488*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
489*9880d681SAndroid Build Coastguard Worker}
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
492*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_pi_64B <string mnemonic, string baseOp,
493*9880d681SAndroid Build Coastguard Worker                            bit isPredNot = 0, bit isNT = 0>
494*9880d681SAndroid Build Coastguard Worker  : T_vstore_pred_pi <mnemonic, baseOp, s3_6Imm, VectorRegs, isPredNot, isNT>;
495*9880d681SAndroid Build Coastguard Worker
496*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
497*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_pi_128B <string mnemonic, string baseOp,
498*9880d681SAndroid Build Coastguard Worker                             bit isPredNot = 0, bit isNT = 0>
499*9880d681SAndroid Build Coastguard Worker  : T_vstore_pred_pi <mnemonic, baseOp#"128B", s3_7Imm, VectorRegs128B,
500*9880d681SAndroid Build Coastguard Worker                      isPredNot, isNT>;
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1 in {
503*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pred_pi     : T_vstore_pred_pi_64B <"vmem", "vS32b_pi">,
504*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_pred_pi_enc;
505*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_npred_pi    : T_vstore_pred_pi_64B <"vmem", "vS32b_pi", 1>,
506*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_npred_pi_enc;
507*9880d681SAndroid Build Coastguard Worker  // 128B
508*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pred_pi_128B  : T_vstore_pred_pi_128B <"vmem", "vS32b_pi">,
509*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_pred_pi_128B_enc;
510*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_npred_pi_128B : T_vstore_pred_pi_128B <"vmem", "vS32b_pi", 1>,
511*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_npred_pi_128B_enc;
512*9880d681SAndroid Build Coastguard Worker}
513*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, isNonTemporal = 1 in {
514*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pred_pi  : T_vstore_pred_pi_64B <"vmem", "vS32b_pi", 0, 1>,
515*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_pred_pi_enc;
516*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_npred_pi : T_vstore_pred_pi_64B <"vmem", "vS32b_pi", 1, 1>,
517*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_npred_pi_enc;
518*9880d681SAndroid Build Coastguard Worker  // 128B
519*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pred_pi_128B  : T_vstore_pred_pi_128B
520*9880d681SAndroid Build Coastguard Worker                                  <"vmem", "vS32b_pi", 0, 1>,
521*9880d681SAndroid Build Coastguard Worker                                  V6_vS32b_nt_pred_pi_128B_enc;
522*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_npred_pi_128B : T_vstore_pred_pi_128B
523*9880d681SAndroid Build Coastguard Worker                                  <"vmem", "vS32b_pi", 1, 1>,
524*9880d681SAndroid Build Coastguard Worker                                  V6_vS32b_nt_npred_pi_128B_enc;
525*9880d681SAndroid Build Coastguard Worker}
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_STU, Type = TypeCVI_VM_STU in {
528*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pred_pi  : T_vstore_pred_pi_64B <"vmemu", "vS32Ub_pi">,
529*9880d681SAndroid Build Coastguard Worker                           V6_vS32Ub_pred_pi_enc;
530*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_npred_pi : T_vstore_pred_pi_64B <"vmemu", "vS32Ub_pi", 1>,
531*9880d681SAndroid Build Coastguard Worker                           V6_vS32Ub_npred_pi_enc;
532*9880d681SAndroid Build Coastguard Worker  // 128B
533*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pred_pi_128B  : T_vstore_pred_pi_128B <"vmemu", "vS32Ub_pi">,
534*9880d681SAndroid Build Coastguard Worker                                V6_vS32Ub_pred_pi_128B_enc;
535*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_npred_pi_128B : T_vstore_pred_pi_128B <"vmemu", "vS32Ub_pi", 1>,
536*9880d681SAndroid Build Coastguard Worker                                V6_vS32Ub_npred_pi_128B_enc;
537*9880d681SAndroid Build Coastguard Worker}
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
540*9880d681SAndroid Build Coastguard Worker// Post increment vector stores with immediate offset - byte-enabled aligned
541*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
542*9880d681SAndroid Build Coastguard Workerlet addrMode = PostInc in
543*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_pi <Operand ImmOp, RegisterClass RC, bit isPredNot = 0,
544*9880d681SAndroid Build Coastguard Worker                         bit isNT = 0>
545*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
546*9880d681SAndroid Build Coastguard Worker               (ins VecPredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
547*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) vmem($src2++#$src3)"
548*9880d681SAndroid Build Coastguard Worker          #!if(isNT, ":nt", "")#" = $src4", [],
549*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_">;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
552*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_pi_64B <bit isPredNot = 0, bit isNT = 0>
553*9880d681SAndroid Build Coastguard Worker  : T_vstore_qpred_pi <s3_6Imm, VectorRegs, isPredNot, isNT>;
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
556*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_pi_128B <bit isPredNot = 0, bit isNT = 0>
557*9880d681SAndroid Build Coastguard Worker  : T_vstore_qpred_pi <s3_7Imm, VectorRegs128B, isPredNot, isNT>;
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_qpred_pi  : T_vstore_qpred_pi_64B, V6_vS32b_qpred_pi_enc;
560*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nqpred_pi : T_vstore_qpred_pi_64B <1>, V6_vS32b_nqpred_pi_enc;
561*9880d681SAndroid Build Coastguard Worker// 128B
562*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_qpred_pi_128B  : T_vstore_qpred_pi_128B,
563*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_qpred_pi_128B_enc;
564*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nqpred_pi_128B : T_vstore_qpred_pi_128B<1>,
565*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nqpred_pi_128B_enc;
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Workerlet isNonTemporal = 1 in {
568*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_qpred_pi  : T_vstore_qpred_pi_64B <0, 1>,
569*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nt_qpred_pi_enc;
570*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_nqpred_pi : T_vstore_qpred_pi_64B <1, 1>,
571*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nt_nqpred_pi_enc;
572*9880d681SAndroid Build Coastguard Worker  // 128B
573*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_qpred_pi_128B  : T_vstore_qpred_pi_128B<0, 1>,
574*9880d681SAndroid Build Coastguard Worker                                   V6_vS32b_nt_qpred_pi_128B_enc;
575*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_nqpred_pi_128B : T_vstore_qpred_pi_128B<1, 1>,
576*9880d681SAndroid Build Coastguard Worker                                   V6_vS32b_nt_nqpred_pi_128B_enc;
577*9880d681SAndroid Build Coastguard Worker}
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
580*9880d681SAndroid Build Coastguard Worker// Post increment conditional .new vector stores with immediate offset
581*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
582*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_NEW_ST, Type = TypeCVI_VM_NEW_ST, isPredicated = 1,
583*9880d681SAndroid Build Coastguard Worker    isNewValue = 1, opNewValue = 4, addrMode = PostInc, isNVStore = 1 in
584*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_pi <string baseOp, Operand ImmOp, RegisterClass RC,
585*9880d681SAndroid Build Coastguard Worker                            bit isPredNot, bit isNT>
586*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
587*9880d681SAndroid Build Coastguard Worker               (ins PredRegs:$src1, IntRegs:$src2, ImmOp:$src3, RC:$src4),
588*9880d681SAndroid Build Coastguard Worker    "if("#!if(isPredNot, "!", "")#"$src1) vmem($src2++#$src3)"
589*9880d681SAndroid Build Coastguard Worker         #!if(isNT, ":nt", "")#" = $src4.new", [],
590*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_"> , NewValueRel {
591*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
592*9880d681SAndroid Build Coastguard Worker  let BaseOpcode = baseOp;
593*9880d681SAndroid Build Coastguard Worker}
594*9880d681SAndroid Build Coastguard Worker
595*9880d681SAndroid Build Coastguard Workerlet accessSize = Vector64Access in
596*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_pi_64B <string baseOp, bit isPredNot = 0, bit isNT = 0>
597*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pred_pi <baseOp, s3_6Imm, VectorRegs, isPredNot, isNT>;
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, accessSize = Vector128Access in
600*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_pi_128B <string baseOp, bit isPredNot = 0, bit isNT = 0>
601*9880d681SAndroid Build Coastguard Worker  : T_vstore_new_pred_pi <baseOp#"128B", s3_7Imm, VectorRegs128B,
602*9880d681SAndroid Build Coastguard Worker                          isPredNot, isNT>;
603*9880d681SAndroid Build Coastguard Worker
604*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pred_pi     : T_vstore_new_pred_pi_64B <"vS32b_pi">,
605*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_pred_pi_enc;
606*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_npred_pi    : T_vstore_new_pred_pi_64B <"vS32b_pi", 1>,
607*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_npred_pi_enc;
608*9880d681SAndroid Build Coastguard Worker// 128B
609*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_pred_pi_128B    : T_vstore_new_pred_pi_128B <"vS32b_pi">,
610*9880d681SAndroid Build Coastguard Worker                                   V6_vS32b_new_pred_pi_128B_enc;
611*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_npred_pi_128B   : T_vstore_new_pred_pi_128B <"vS32b_pi", 1>,
612*9880d681SAndroid Build Coastguard Worker                                   V6_vS32b_new_npred_pi_128B_enc;
613*9880d681SAndroid Build Coastguard Workerlet isNonTemporal = 1 in {
614*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pred_pi  : T_vstore_new_pred_pi_64B <"vS32b_pi", 0, 1>,
615*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_new_pred_pi_enc;
616*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_npred_pi : T_vstore_new_pred_pi_64B <"vS32b_pi", 1, 1>,
617*9880d681SAndroid Build Coastguard Worker                                 V6_vS32b_nt_new_npred_pi_enc;
618*9880d681SAndroid Build Coastguard Worker  // 128B
619*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_pred_pi_128B : T_vstore_new_pred_pi_128B
620*9880d681SAndroid Build Coastguard Worker                                     <"vS32b_pi", 0, 1>,
621*9880d681SAndroid Build Coastguard Worker                                     V6_vS32b_nt_new_pred_pi_128B_enc;
622*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_new_npred_pi_128B : T_vstore_new_pred_pi_128B
623*9880d681SAndroid Build Coastguard Worker                                      <"vS32b_pi", 1, 1>,
624*9880d681SAndroid Build Coastguard Worker                                      V6_vS32b_nt_new_npred_pi_128B_enc;
625*9880d681SAndroid Build Coastguard Worker}
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
628*9880d681SAndroid Build Coastguard Worker// Post increment vector loads with register offset
629*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
630*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
631*9880d681SAndroid Build Coastguard Workerclass T_vload_ppu<string asmStr>
632*9880d681SAndroid Build Coastguard Worker  : V6_LDInst <(outs VectorRegs:$dst, IntRegs:$_dst_),
633*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ModRegs:$src2), asmStr, [],
634*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">, NewValueRel;
635*9880d681SAndroid Build Coastguard Worker
636*9880d681SAndroid Build Coastguard Workerlet isCVLoadable = 1 in {
637*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_ppu    : T_vload_ppu <"$dst = vmem($src1++$src2)">,
638*9880d681SAndroid Build Coastguard Worker                        V6_vL32b_ppu_enc;
639*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_ppu : T_vload_ppu <"$dst = vmem($src1++$src2):nt">,
640*9880d681SAndroid Build Coastguard Worker                        V6_vL32b_nt_ppu_enc;
641*9880d681SAndroid Build Coastguard Worker}
642*9880d681SAndroid Build Coastguard Worker
643*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_VP_LDU, Type = TypeCVI_VM_VP_LDU in
644*9880d681SAndroid Build Coastguard Workerdef V6_vL32Ub_ppu : T_vload_ppu <"$dst = vmemu($src1++$src2)">,
645*9880d681SAndroid Build Coastguard Worker                     V6_vL32Ub_ppu_enc;
646*9880d681SAndroid Build Coastguard Worker
647*9880d681SAndroid Build Coastguard Workerlet isCVLoad = 1, Itinerary = CVI_VM_CUR_LD, Type = TypeCVI_VM_CUR_LD in {
648*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_cur_ppu    : T_vload_ppu <"$dst.cur = vmem($src1++$src2)">,
649*9880d681SAndroid Build Coastguard Worker                             V6_vL32b_cur_ppu_enc;
650*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_cur_ppu : T_vload_ppu <"$dst.cur = vmem($src1++$src2):nt">,
651*9880d681SAndroid Build Coastguard Worker                             V6_vL32b_nt_cur_ppu_enc;
652*9880d681SAndroid Build Coastguard Worker}
653*9880d681SAndroid Build Coastguard Worker
654*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_TMP_LD, Type = TypeCVI_VM_TMP_LD in {
655*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_tmp_ppu    : T_vload_ppu <"$dst.tmp = vmem($src1++$src2)">,
656*9880d681SAndroid Build Coastguard Worker                             V6_vL32b_tmp_ppu_enc;
657*9880d681SAndroid Build Coastguard Worker  def V6_vL32b_nt_tmp_ppu : T_vload_ppu <"$dst.tmp = vmem($src1++$src2):nt">,
658*9880d681SAndroid Build Coastguard Worker                             V6_vL32b_nt_tmp_ppu_enc;
659*9880d681SAndroid Build Coastguard Worker}
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
662*9880d681SAndroid Build Coastguard Worker// Post increment vector stores with register offset
663*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
664*9880d681SAndroid Build Coastguard Workerlet isPredicable = 1 in
665*9880d681SAndroid Build Coastguard Workerclass T_vstore_ppu <string mnemonic, bit isNT = 0>
666*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
667*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ModRegs:$src2, VectorRegs:$src3),
668*9880d681SAndroid Build Coastguard Worker    mnemonic#"($src1++$src2)"#!if(isNT, ":nt", "")#" = $src3", [],
669*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">, NewValueRel;
670*9880d681SAndroid Build Coastguard Worker
671*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, BaseOpcode = "vS32b_ppu" in {
672*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_ppu    : T_vstore_ppu <"vmem">,
673*9880d681SAndroid Build Coastguard Worker                        V6_vS32b_ppu_enc;
674*9880d681SAndroid Build Coastguard Worker  let isNonTemporal = 1, BaseOpcode = "vS32b_ppu" in
675*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_ppu : T_vstore_ppu <"vmem", 1>,
676*9880d681SAndroid Build Coastguard Worker                        V6_vS32b_nt_ppu_enc;
677*9880d681SAndroid Build Coastguard Worker}
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32Ub_ppu", Itinerary = CVI_VM_STU, Type = TypeCVI_VM_STU in
680*9880d681SAndroid Build Coastguard Workerdef V6_vS32Ub_ppu   : T_vstore_ppu <"vmemu">, V6_vS32Ub_ppu_enc;
681*9880d681SAndroid Build Coastguard Worker
682*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
683*9880d681SAndroid Build Coastguard Worker// Post increment .new vector stores with register offset
684*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
685*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_NEW_ST, Type = TypeCVI_VM_NEW_ST, isNewValue = 1,
686*9880d681SAndroid Build Coastguard Worker    isPredicable = 1, opNewValue = 3, isNVStore = 1 in
687*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_ppu <bit isNT = 0>
688*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
689*9880d681SAndroid Build Coastguard Worker               (ins IntRegs:$src1, ModRegs:$src2, VectorRegs:$src3),
690*9880d681SAndroid Build Coastguard Worker    "vmem($src1++$src2)"#!if(isNT, ":nt", "")#" = $src3.new", [],
691*9880d681SAndroid Build Coastguard Worker    "$src1 = $_dst_">, NewValueRel;
692*9880d681SAndroid Build Coastguard Worker
693*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32b_ppu" in
694*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_new_ppu    : T_vstore_new_ppu, V6_vS32b_new_ppu_enc;
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32b_ppu", isNonTemporal = 1 in
697*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_new_ppu : T_vstore_new_ppu<1>, V6_vS32b_nt_new_ppu_enc;
698*9880d681SAndroid Build Coastguard Worker
699*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
700*9880d681SAndroid Build Coastguard Worker// Post increment conditional .new vector stores with register offset
701*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
702*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1 in
703*9880d681SAndroid Build Coastguard Workerclass T_vstore_pred_ppu <string mnemonic, bit isPredNot = 0, bit isNT = 0>
704*9880d681SAndroid Build Coastguard Worker  : V6_STInst<(outs IntRegs:$_dst_),
705*9880d681SAndroid Build Coastguard Worker           (ins PredRegs:$src1, IntRegs:$src2, ModRegs:$src3, VectorRegs:$src4),
706*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) "#mnemonic#"($src2++$src3)"
707*9880d681SAndroid Build Coastguard Worker          #!if(isNT, ":nt", "")#" = $src4", [],
708*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_">, NewValueRel {
709*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
710*9880d681SAndroid Build Coastguard Worker}
711*9880d681SAndroid Build Coastguard Worker
712*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, BaseOpcode = "vS32b_ppu" in {
713*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_pred_ppu : T_vstore_pred_ppu<"vmem">, V6_vS32b_pred_ppu_enc;
714*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_npred_ppu: T_vstore_pred_ppu<"vmem", 1>, V6_vS32b_npred_ppu_enc;
715*9880d681SAndroid Build Coastguard Worker}
716*9880d681SAndroid Build Coastguard Worker
717*9880d681SAndroid Build Coastguard Workerlet isNVStorable = 1, BaseOpcode = "vS32b_ppu", isNonTemporal = 1 in {
718*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_pred_ppu  : T_vstore_pred_ppu <"vmem", 0, 1>,
719*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nt_pred_ppu_enc;
720*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_nt_npred_ppu : T_vstore_pred_ppu <"vmem", 1, 1>,
721*9880d681SAndroid Build Coastguard Worker                              V6_vS32b_nt_npred_ppu_enc;
722*9880d681SAndroid Build Coastguard Worker}
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32Ub_ppu", Itinerary = CVI_VM_STU,
725*9880d681SAndroid Build Coastguard Worker    Type = TypeCVI_VM_STU in {
726*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_pred_ppu  : T_vstore_pred_ppu <"vmemu">,
727*9880d681SAndroid Build Coastguard Worker                            V6_vS32Ub_pred_ppu_enc;
728*9880d681SAndroid Build Coastguard Worker  def V6_vS32Ub_npred_ppu : T_vstore_pred_ppu <"vmemu", 1>,
729*9880d681SAndroid Build Coastguard Worker                            V6_vS32Ub_npred_ppu_enc;
730*9880d681SAndroid Build Coastguard Worker}
731*9880d681SAndroid Build Coastguard Worker
732*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
733*9880d681SAndroid Build Coastguard Worker// Post increment vector stores with register offset - byte-enabled aligned
734*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
735*9880d681SAndroid Build Coastguard Workerclass T_vstore_qpred_ppu <bit isPredNot = 0, bit isNT = 0>
736*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
737*9880d681SAndroid Build Coastguard Worker        (ins VecPredRegs:$src1, IntRegs:$src2, ModRegs:$src3, VectorRegs:$src4),
738*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) vmem($src2++$src3)"
739*9880d681SAndroid Build Coastguard Worker          #!if(isNT, ":nt", "")#" = $src4", [],
740*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_">, NewValueRel;
741*9880d681SAndroid Build Coastguard Worker
742*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_qpred_ppu  : T_vstore_qpred_ppu, V6_vS32b_qpred_ppu_enc;
743*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nqpred_ppu : T_vstore_qpred_ppu<1>, V6_vS32b_nqpred_ppu_enc;
744*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_qpred_ppu  : T_vstore_qpred_ppu<0, 1>,
745*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_qpred_ppu_enc;
746*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_nqpred_ppu : T_vstore_qpred_ppu<1, 1>,
747*9880d681SAndroid Build Coastguard Worker                             V6_vS32b_nt_nqpred_ppu_enc;
748*9880d681SAndroid Build Coastguard Worker
749*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
750*9880d681SAndroid Build Coastguard Worker// Post increment conditional .new vector stores with register offset
751*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
752*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VM_NEW_ST, Type = TypeCVI_VM_NEW_ST, isPredicated = 1,
753*9880d681SAndroid Build Coastguard Worker    isNewValue = 1, opNewValue = 4, isNVStore = 1 in
754*9880d681SAndroid Build Coastguard Workerclass T_vstore_new_pred_ppu <bit isPredNot = 0, bit isNT = 0>
755*9880d681SAndroid Build Coastguard Worker  : V6_STInst <(outs IntRegs:$_dst_),
756*9880d681SAndroid Build Coastguard Worker           (ins PredRegs:$src1, IntRegs:$src2, ModRegs:$src3, VectorRegs:$src4),
757*9880d681SAndroid Build Coastguard Worker    "if("#!if(isPredNot, "!", "")#"$src1) vmem($src2++$src3)"
758*9880d681SAndroid Build Coastguard Worker         #!if(isNT, ":nt", "")#" = $src4.new", [],
759*9880d681SAndroid Build Coastguard Worker    "$src2 = $_dst_">, NewValueRel {
760*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
761*9880d681SAndroid Build Coastguard Worker}
762*9880d681SAndroid Build Coastguard Worker
763*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32b_ppu" in {
764*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_new_pred_ppu  : T_vstore_new_pred_ppu,
765*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_pred_ppu_enc;
766*9880d681SAndroid Build Coastguard Worker  def V6_vS32b_new_npred_ppu : T_vstore_new_pred_ppu<1>,
767*9880d681SAndroid Build Coastguard Worker                               V6_vS32b_new_npred_ppu_enc;
768*9880d681SAndroid Build Coastguard Worker}
769*9880d681SAndroid Build Coastguard Worker
770*9880d681SAndroid Build Coastguard Workerlet BaseOpcode = "vS32b_ppu", isNonTemporal = 1 in {
771*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_new_pred_ppu :  T_vstore_new_pred_ppu<0, 1>,
772*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_pred_ppu_enc;
773*9880d681SAndroid Build Coastguard Workerdef V6_vS32b_nt_new_npred_ppu : T_vstore_new_pred_ppu<1, 1>,
774*9880d681SAndroid Build Coastguard Worker                                V6_vS32b_nt_new_npred_ppu_enc;
775*9880d681SAndroid Build Coastguard Worker}
776*9880d681SAndroid Build Coastguard Worker
777*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1, validSubTargets = HasV60SubT in
778*9880d681SAndroid Build Coastguard Workerclass STrivv_template<string mnemonic, Operand ImmOp, RegisterClass RC>:
779*9880d681SAndroid Build Coastguard Worker        VSTInst<(outs), (ins IntRegs:$addr, ImmOp:$off, RC:$src),
780*9880d681SAndroid Build Coastguard Worker                #mnemonic#"($addr+#$off) = $src", []>;
781*9880d681SAndroid Build Coastguard Worker
782*9880d681SAndroid Build Coastguard Workerdef STrivv_indexed: STrivv_template<"vvmem", s4_6Imm, VecDblRegs>,
783*9880d681SAndroid Build Coastguard Worker                    Requires<[HasV60T, UseHVXSgl]>;
784*9880d681SAndroid Build Coastguard Workerdef STrivv_indexed_128B: STrivv_template<"vvmem", s4_7Imm, VecDblRegs128B>,
785*9880d681SAndroid Build Coastguard Worker                         Requires<[HasV60T, UseHVXDbl]>;
786*9880d681SAndroid Build Coastguard Worker
787*9880d681SAndroid Build Coastguard Workermulticlass STrivv_pats <ValueType VTSgl, ValueType VTDbl> {
788*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (VTSgl VecDblRegs:$src1), IntRegs:$addr),
789*9880d681SAndroid Build Coastguard Worker            (STrivv_indexed IntRegs:$addr, #0, (VTSgl VecDblRegs:$src1))>,
790*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXSgl]>;
791*9880d681SAndroid Build Coastguard Worker
792*9880d681SAndroid Build Coastguard Worker  def : Pat<(store (VTDbl VecDblRegs128B:$src1), IntRegs:$addr),
793*9880d681SAndroid Build Coastguard Worker            (STrivv_indexed_128B IntRegs:$addr, #0,
794*9880d681SAndroid Build Coastguard Worker                                 (VTDbl VecDblRegs128B:$src1))>,
795*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXDbl]>;
796*9880d681SAndroid Build Coastguard Worker}
797*9880d681SAndroid Build Coastguard Worker
798*9880d681SAndroid Build Coastguard Workerdefm : STrivv_pats <v128i8, v256i8>;
799*9880d681SAndroid Build Coastguard Workerdefm : STrivv_pats <v64i16, v128i16>;
800*9880d681SAndroid Build Coastguard Workerdefm : STrivv_pats <v32i32, v64i32>;
801*9880d681SAndroid Build Coastguard Workerdefm : STrivv_pats <v16i64, v32i64>;
802*9880d681SAndroid Build Coastguard Worker
803*9880d681SAndroid Build Coastguard Worker
804*9880d681SAndroid Build Coastguard Workermulticlass vS32b_ai_pats <ValueType VTSgl, ValueType VTDbl> {
805*9880d681SAndroid Build Coastguard Worker  // Aligned stores
806*9880d681SAndroid Build Coastguard Worker  def : Pat<(alignedstore (VTSgl VectorRegs:$src1), IntRegs:$addr),
807*9880d681SAndroid Build Coastguard Worker            (V6_vS32b_ai IntRegs:$addr, #0, (VTSgl VectorRegs:$src1))>,
808*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXSgl]>;
809*9880d681SAndroid Build Coastguard Worker  def : Pat<(unalignedstore (VTSgl VectorRegs:$src1), IntRegs:$addr),
810*9880d681SAndroid Build Coastguard Worker            (V6_vS32Ub_ai IntRegs:$addr, #0, (VTSgl VectorRegs:$src1))>,
811*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXSgl]>;
812*9880d681SAndroid Build Coastguard Worker
813*9880d681SAndroid Build Coastguard Worker  // 128B Aligned stores
814*9880d681SAndroid Build Coastguard Worker  def : Pat<(alignedstore (VTDbl VectorRegs128B:$src1), IntRegs:$addr),
815*9880d681SAndroid Build Coastguard Worker            (V6_vS32b_ai_128B IntRegs:$addr, #0, (VTDbl VectorRegs128B:$src1))>,
816*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXDbl]>;
817*9880d681SAndroid Build Coastguard Worker  def : Pat<(unalignedstore (VTDbl VectorRegs128B:$src1), IntRegs:$addr),
818*9880d681SAndroid Build Coastguard Worker            (V6_vS32Ub_ai_128B IntRegs:$addr, #0, (VTDbl VectorRegs128B:$src1))>,
819*9880d681SAndroid Build Coastguard Worker            Requires<[UseHVXDbl]>;
820*9880d681SAndroid Build Coastguard Worker
821*9880d681SAndroid Build Coastguard Worker  // Fold Add R+IFF into vector store.
822*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 10 in {
823*9880d681SAndroid Build Coastguard Worker    def : Pat<(alignedstore (VTSgl VectorRegs:$src1),
824*9880d681SAndroid Build Coastguard Worker                     (add IntRegs:$src2, s4_6ImmPred:$offset)),
825*9880d681SAndroid Build Coastguard Worker              (V6_vS32b_ai IntRegs:$src2, s4_6ImmPred:$offset,
826*9880d681SAndroid Build Coastguard Worker                           (VTSgl VectorRegs:$src1))>,
827*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
828*9880d681SAndroid Build Coastguard Worker    def : Pat<(unalignedstore (VTSgl VectorRegs:$src1),
829*9880d681SAndroid Build Coastguard Worker                     (add IntRegs:$src2, s4_6ImmPred:$offset)),
830*9880d681SAndroid Build Coastguard Worker              (V6_vS32Ub_ai IntRegs:$src2, s4_6ImmPred:$offset,
831*9880d681SAndroid Build Coastguard Worker                           (VTSgl VectorRegs:$src1))>,
832*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
833*9880d681SAndroid Build Coastguard Worker
834*9880d681SAndroid Build Coastguard Worker    // Fold Add R+IFF into vector store 128B.
835*9880d681SAndroid Build Coastguard Worker    def : Pat<(alignedstore (VTDbl VectorRegs128B:$src1),
836*9880d681SAndroid Build Coastguard Worker                     (add IntRegs:$src2, s4_7ImmPred:$offset)),
837*9880d681SAndroid Build Coastguard Worker              (V6_vS32b_ai_128B IntRegs:$src2, s4_7ImmPred:$offset,
838*9880d681SAndroid Build Coastguard Worker                                (VTDbl VectorRegs128B:$src1))>,
839*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXDbl]>;
840*9880d681SAndroid Build Coastguard Worker    def : Pat<(unalignedstore (VTDbl VectorRegs128B:$src1),
841*9880d681SAndroid Build Coastguard Worker                     (add IntRegs:$src2, s4_7ImmPred:$offset)),
842*9880d681SAndroid Build Coastguard Worker              (V6_vS32Ub_ai_128B IntRegs:$src2, s4_7ImmPred:$offset,
843*9880d681SAndroid Build Coastguard Worker                                (VTDbl VectorRegs128B:$src1))>,
844*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXDbl]>;
845*9880d681SAndroid Build Coastguard Worker  }
846*9880d681SAndroid Build Coastguard Worker}
847*9880d681SAndroid Build Coastguard Worker
848*9880d681SAndroid Build Coastguard Workerdefm : vS32b_ai_pats <v64i8,  v128i8>;
849*9880d681SAndroid Build Coastguard Workerdefm : vS32b_ai_pats <v32i16, v64i16>;
850*9880d681SAndroid Build Coastguard Workerdefm : vS32b_ai_pats <v16i32, v32i32>;
851*9880d681SAndroid Build Coastguard Workerdefm : vS32b_ai_pats <v8i64,  v16i64>;
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1, validSubTargets = HasV60SubT in
854*9880d681SAndroid Build Coastguard Workerclass LDrivv_template<string mnemonic, Operand ImmOp, RegisterClass RC>
855*9880d681SAndroid Build Coastguard Worker  : V6_LDInst <(outs RC:$dst), (ins IntRegs:$addr, ImmOp:$off),
856*9880d681SAndroid Build Coastguard Worker               "$dst="#mnemonic#"($addr+#$off)",
857*9880d681SAndroid Build Coastguard Worker               []>,
858*9880d681SAndroid Build Coastguard Worker               Requires<[HasV60T,UseHVXSgl]>;
859*9880d681SAndroid Build Coastguard Worker
860*9880d681SAndroid Build Coastguard Workerdef LDrivv_indexed: LDrivv_template<"vvmem", s4_6Imm, VecDblRegs>;
861*9880d681SAndroid Build Coastguard Workerdef LDrivv_indexed_128B: LDrivv_template<"vvmem", s4_7Imm, VecDblRegs128B>;
862*9880d681SAndroid Build Coastguard Worker
863*9880d681SAndroid Build Coastguard Workermulticlass LDrivv_pats <ValueType VTSgl, ValueType VTDbl> {
864*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTSgl (load IntRegs:$addr)),
865*9880d681SAndroid Build Coastguard Worker              (LDrivv_indexed IntRegs:$addr, #0) >,
866*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
867*9880d681SAndroid Build Coastguard Worker
868*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTDbl (load IntRegs:$addr)),
869*9880d681SAndroid Build Coastguard Worker              (LDrivv_indexed_128B IntRegs:$addr, #0) >,
870*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXDbl]>;
871*9880d681SAndroid Build Coastguard Worker}
872*9880d681SAndroid Build Coastguard Worker
873*9880d681SAndroid Build Coastguard Workerdefm : LDrivv_pats <v128i8, v256i8>;
874*9880d681SAndroid Build Coastguard Workerdefm : LDrivv_pats <v64i16, v128i16>;
875*9880d681SAndroid Build Coastguard Workerdefm : LDrivv_pats <v32i32, v64i32>;
876*9880d681SAndroid Build Coastguard Workerdefm : LDrivv_pats <v16i64, v32i64>;
877*9880d681SAndroid Build Coastguard Worker
878*9880d681SAndroid Build Coastguard Workermulticlass vL32b_ai_pats <ValueType VTSgl, ValueType VTDbl> {
879*9880d681SAndroid Build Coastguard Worker  // Aligned loads
880*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTSgl (alignedload IntRegs:$addr)),
881*9880d681SAndroid Build Coastguard Worker              (V6_vL32b_ai IntRegs:$addr, #0) >,
882*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
883*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTSgl (unalignedload IntRegs:$addr)),
884*9880d681SAndroid Build Coastguard Worker              (V6_vL32Ub_ai IntRegs:$addr, #0) >,
885*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
886*9880d681SAndroid Build Coastguard Worker
887*9880d681SAndroid Build Coastguard Worker  // 128B Load
888*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTDbl (alignedload IntRegs:$addr)),
889*9880d681SAndroid Build Coastguard Worker              (V6_vL32b_ai_128B IntRegs:$addr, #0) >,
890*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXDbl]>;
891*9880d681SAndroid Build Coastguard Worker  def : Pat < (VTDbl (unalignedload IntRegs:$addr)),
892*9880d681SAndroid Build Coastguard Worker              (V6_vL32Ub_ai_128B IntRegs:$addr, #0) >,
893*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXDbl]>;
894*9880d681SAndroid Build Coastguard Worker
895*9880d681SAndroid Build Coastguard Worker  // Fold Add R+IFF into vector load.
896*9880d681SAndroid Build Coastguard Worker  let AddedComplexity = 10 in {
897*9880d681SAndroid Build Coastguard Worker    def : Pat<(VTDbl (alignedload (add IntRegs:$src2, s4_7ImmPred:$offset))),
898*9880d681SAndroid Build Coastguard Worker              (V6_vL32b_ai_128B IntRegs:$src2, s4_7ImmPred:$offset)>,
899*9880d681SAndroid Build Coastguard Worker               Requires<[UseHVXDbl]>;
900*9880d681SAndroid Build Coastguard Worker    def : Pat<(VTDbl (unalignedload (add IntRegs:$src2, s4_7ImmPred:$offset))),
901*9880d681SAndroid Build Coastguard Worker              (V6_vL32Ub_ai_128B IntRegs:$src2, s4_7ImmPred:$offset)>,
902*9880d681SAndroid Build Coastguard Worker               Requires<[UseHVXDbl]>;
903*9880d681SAndroid Build Coastguard Worker
904*9880d681SAndroid Build Coastguard Worker    def : Pat<(VTSgl (alignedload (add IntRegs:$src2, s4_6ImmPred:$offset))),
905*9880d681SAndroid Build Coastguard Worker              (V6_vL32b_ai IntRegs:$src2, s4_6ImmPred:$offset)>,
906*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
907*9880d681SAndroid Build Coastguard Worker    def : Pat<(VTSgl (unalignedload (add IntRegs:$src2, s4_6ImmPred:$offset))),
908*9880d681SAndroid Build Coastguard Worker              (V6_vL32Ub_ai IntRegs:$src2, s4_6ImmPred:$offset)>,
909*9880d681SAndroid Build Coastguard Worker              Requires<[UseHVXSgl]>;
910*9880d681SAndroid Build Coastguard Worker  }
911*9880d681SAndroid Build Coastguard Worker}
912*9880d681SAndroid Build Coastguard Worker
913*9880d681SAndroid Build Coastguard Workerdefm : vL32b_ai_pats <v64i8,  v128i8>;
914*9880d681SAndroid Build Coastguard Workerdefm : vL32b_ai_pats <v32i16, v64i16>;
915*9880d681SAndroid Build Coastguard Workerdefm : vL32b_ai_pats <v16i32, v32i32>;
916*9880d681SAndroid Build Coastguard Workerdefm : vL32b_ai_pats <v8i64,  v16i64>;
917*9880d681SAndroid Build Coastguard Worker
918*9880d681SAndroid Build Coastguard Worker// Store vector predicate pseudo.
919*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, isExtentSigned = 1, opExtentBits = 13,
920*9880d681SAndroid Build Coastguard Worker    isCodeGenOnly = 1, isPseudo = 1, mayStore = 1, hasSideEffects = 0 in {
921*9880d681SAndroid Build Coastguard Workerdef STriq_pred_V6 : STInst<(outs),
922*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VecPredRegs:$src1),
923*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
924*9880d681SAndroid Build Coastguard Worker            []>,
925*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
926*9880d681SAndroid Build Coastguard Worker
927*9880d681SAndroid Build Coastguard Workerdef STriq_pred_vec_V6 : STInst<(outs),
928*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VectorRegs:$src1),
929*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
930*9880d681SAndroid Build Coastguard Worker            []>,
931*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
932*9880d681SAndroid Build Coastguard Worker
933*9880d681SAndroid Build Coastguard Workerdef STriq_pred_V6_128B : STInst<(outs),
934*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VecPredRegs128B:$src1),
935*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
936*9880d681SAndroid Build Coastguard Worker            []>,
937*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
938*9880d681SAndroid Build Coastguard Worker
939*9880d681SAndroid Build Coastguard Workerdef STriq_pred_vec_V6_128B : STInst<(outs),
940*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VectorRegs128B:$src1),
941*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
942*9880d681SAndroid Build Coastguard Worker            []>,
943*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
944*9880d681SAndroid Build Coastguard Worker}
945*9880d681SAndroid Build Coastguard Worker
946*9880d681SAndroid Build Coastguard Worker// Load vector predicate pseudo.
947*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13,
948*9880d681SAndroid Build Coastguard Worker    opExtentAlign = 2, isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in {
949*9880d681SAndroid Build Coastguard Workerdef LDriq_pred_V6 : LDInst<(outs VecPredRegs:$dst),
950*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
951*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
952*9880d681SAndroid Build Coastguard Worker            []>,
953*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
954*9880d681SAndroid Build Coastguard Workerdef LDriq_pred_vec_V6 : LDInst<(outs VectorRegs:$dst),
955*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
956*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
957*9880d681SAndroid Build Coastguard Worker            []>,
958*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
959*9880d681SAndroid Build Coastguard Workerdef LDriq_pred_V6_128B : LDInst<(outs VecPredRegs128B:$dst),
960*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
961*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
962*9880d681SAndroid Build Coastguard Worker            []>,
963*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
964*9880d681SAndroid Build Coastguard Workerdef LDriq_pred_vec_V6_128B : LDInst<(outs VectorRegs128B:$dst),
965*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
966*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
967*9880d681SAndroid Build Coastguard Worker            []>,
968*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
969*9880d681SAndroid Build Coastguard Worker}
970*9880d681SAndroid Build Coastguard Worker
971*9880d681SAndroid Build Coastguard Worker// Store vector pseudo.
972*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, isExtentSigned = 1, opExtentBits = 13,
973*9880d681SAndroid Build Coastguard Worker    isCodeGenOnly = 1, isPseudo = 1, mayStore = 1, hasSideEffects = 0 in {
974*9880d681SAndroid Build Coastguard Workerdef STriv_pseudo_V6 : STInst<(outs),
975*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VectorRegs:$src1),
976*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
977*9880d681SAndroid Build Coastguard Worker            []>,
978*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
979*9880d681SAndroid Build Coastguard Workerdef STriv_pseudo_V6_128B : STInst<(outs),
980*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VectorRegs128B:$src1),
981*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
982*9880d681SAndroid Build Coastguard Worker            []>,
983*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
984*9880d681SAndroid Build Coastguard Worker}
985*9880d681SAndroid Build Coastguard Worker
986*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 1, isExtentSigned = 1, opExtentBits = 13,
987*9880d681SAndroid Build Coastguard Worker    isCodeGenOnly = 1, isPseudo = 1, mayStore = 1, hasSideEffects = 0 in {
988*9880d681SAndroid Build Coastguard Workerdef STrivv_pseudo_V6 : STInst<(outs),
989*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VecDblRegs:$src1),
990*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
991*9880d681SAndroid Build Coastguard Worker            []>,
992*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
993*9880d681SAndroid Build Coastguard Workerdef STrivv_pseudo_V6_128B : STInst<(outs),
994*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset, VecDblRegs128B:$src1),
995*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
996*9880d681SAndroid Build Coastguard Worker            []>,
997*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
998*9880d681SAndroid Build Coastguard Worker}
999*9880d681SAndroid Build Coastguard Worker
1000*9880d681SAndroid Build Coastguard Worker// Load vector pseudo.
1001*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13,
1002*9880d681SAndroid Build Coastguard Worker    opExtentAlign = 2, isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in {
1003*9880d681SAndroid Build Coastguard Workerdef LDriv_pseudo_V6 : LDInst<(outs VectorRegs:$dst),
1004*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
1005*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
1006*9880d681SAndroid Build Coastguard Worker            []>,
1007*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
1008*9880d681SAndroid Build Coastguard Workerdef LDriv_pseudo_V6_128B : LDInst<(outs VectorRegs128B:$dst),
1009*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
1010*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
1011*9880d681SAndroid Build Coastguard Worker            []>,
1012*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
1013*9880d681SAndroid Build Coastguard Worker}
1014*9880d681SAndroid Build Coastguard Worker
1015*9880d681SAndroid Build Coastguard Workerlet isExtendable = 1, opExtendable = 2, isExtentSigned = 1, opExtentBits = 13,
1016*9880d681SAndroid Build Coastguard Worker    opExtentAlign = 2, isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in {
1017*9880d681SAndroid Build Coastguard Workerdef LDrivv_pseudo_V6 : LDInst<(outs VecDblRegs:$dst),
1018*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
1019*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
1020*9880d681SAndroid Build Coastguard Worker            []>,
1021*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
1022*9880d681SAndroid Build Coastguard Workerdef LDrivv_pseudo_V6_128B : LDInst<(outs VecDblRegs128B:$dst),
1023*9880d681SAndroid Build Coastguard Worker            (ins IntRegs:$base, s32Imm:$offset),
1024*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
1025*9880d681SAndroid Build Coastguard Worker            []>,
1026*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXDbl]>;
1027*9880d681SAndroid Build Coastguard Worker}
1028*9880d681SAndroid Build Coastguard Worker
1029*9880d681SAndroid Build Coastguard Workerclass VSELInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
1030*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin = CVI_VA_DV,
1031*9880d681SAndroid Build Coastguard Worker              IType type = TypeCVI_VA_DV>
1032*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, type>;
1033*9880d681SAndroid Build Coastguard Worker
1034*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1, hasSideEffects = 0 in {
1035*9880d681SAndroid Build Coastguard Workerdef VSelectPseudo_V6 : VSELInst<(outs VectorRegs:$dst),
1036*9880d681SAndroid Build Coastguard Worker            (ins PredRegs:$src1, VectorRegs:$src2, VectorRegs:$src3),
1037*9880d681SAndroid Build Coastguard Worker            ".error \"should not emit\" ",
1038*9880d681SAndroid Build Coastguard Worker            []>,
1039*9880d681SAndroid Build Coastguard Worker            Requires<[HasV60T,UseHVXSgl]>;
1040*9880d681SAndroid Build Coastguard Workerdef VSelectDblPseudo_V6 : VSELInst<(outs VecDblRegs:$dst),
1041*9880d681SAndroid Build Coastguard Worker               (ins PredRegs:$src1, VecDblRegs:$src2, VecDblRegs:$src3),
1042*9880d681SAndroid Build Coastguard Worker               ".error \"should not emit\" ",
1043*9880d681SAndroid Build Coastguard Worker               []>,
1044*9880d681SAndroid Build Coastguard Worker               Requires<[HasV60T,UseHVXSgl]>;
1045*9880d681SAndroid Build Coastguard Worker}
1046*9880d681SAndroid Build Coastguard Worker
1047*9880d681SAndroid Build Coastguard Workerdef : Pat <(v16i32 (selectcc (i32 IntRegs:$lhs), (i32 IntRegs:$rhs),
1048*9880d681SAndroid Build Coastguard Worker                             (v16i32 VectorRegs:$tval),
1049*9880d681SAndroid Build Coastguard Worker                             (v16i32 VectorRegs:$fval), SETEQ)),
1050*9880d681SAndroid Build Coastguard Worker      (v16i32 (VSelectPseudo_V6 (i32 (C2_cmpeq (i32 IntRegs:$lhs),
1051*9880d681SAndroid Build Coastguard Worker                                (i32 IntRegs:$rhs))),
1052*9880d681SAndroid Build Coastguard Worker                                (v16i32 VectorRegs:$tval),
1053*9880d681SAndroid Build Coastguard Worker                                (v16i32 VectorRegs:$fval)))>;
1054*9880d681SAndroid Build Coastguard Worker
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
1057*9880d681SAndroid Build Coastguard Workerclass T_vmpy <string asmString, RegisterClass RCout, RegisterClass RCin>
1058*9880d681SAndroid Build Coastguard Worker  : CVI_VX_DV_Resource1<(outs RCout:$dst), (ins RCin:$src1, IntRegs:$src2),
1059*9880d681SAndroid Build Coastguard Worker    asmString >;
1060*9880d681SAndroid Build Coastguard Worker
1061*9880d681SAndroid Build Coastguard Workermulticlass T_vmpy <string asmString, RegisterClass RCout,
1062*9880d681SAndroid Build Coastguard Worker                        RegisterClass RCin> {
1063*9880d681SAndroid Build Coastguard Worker  def NAME : T_vmpy <asmString, RCout, RCin>;
1064*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1065*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_vmpy <asmString, !cast<RegisterClass>(RCout#"128B"),
1066*9880d681SAndroid Build Coastguard Worker                                      !cast<RegisterClass>(RCin#"128B")>;
1067*9880d681SAndroid Build Coastguard Worker}
1068*9880d681SAndroid Build Coastguard Worker
1069*9880d681SAndroid Build Coastguard Workermulticlass T_vmpy_VV <string asmString>:
1070*9880d681SAndroid Build Coastguard Worker  T_vmpy <asmString, VectorRegs, VectorRegs>;
1071*9880d681SAndroid Build Coastguard Worker
1072*9880d681SAndroid Build Coastguard Workermulticlass T_vmpy_WW <string asmString>:
1073*9880d681SAndroid Build Coastguard Worker  T_vmpy <asmString, VecDblRegs, VecDblRegs>;
1074*9880d681SAndroid Build Coastguard Worker
1075*9880d681SAndroid Build Coastguard Workermulticlass T_vmpy_VW <string asmString>:
1076*9880d681SAndroid Build Coastguard Worker  T_vmpy <asmString, VectorRegs, VecDblRegs>;
1077*9880d681SAndroid Build Coastguard Worker
1078*9880d681SAndroid Build Coastguard Workermulticlass T_vmpy_WV <string asmString>:
1079*9880d681SAndroid Build Coastguard Worker  T_vmpy <asmString, VecDblRegs, VectorRegs>;
1080*9880d681SAndroid Build Coastguard Worker
1081*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpyb   :T_vmpy_WW<"$dst.h = vtmpy($src1.b,$src2.b)">, V6_vtmpyb_enc;
1082*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpybus :T_vmpy_WW<"$dst.h = vtmpy($src1.ub,$src2.b)">, V6_vtmpybus_enc;
1083*9880d681SAndroid Build Coastguard Workerdefm V6_vdsaduh  :T_vmpy_WW<"$dst.uw = vdsad($src1.uh,$src2.uh)">, V6_vdsaduh_enc;
1084*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybus  :T_vmpy_WV<"$dst.h = vmpy($src1.ub,$src2.b)">, V6_vmpybus_enc;
1085*9880d681SAndroid Build Coastguard Workerdefm V6_vmpabus  :T_vmpy_WW<"$dst.h = vmpa($src1.ub,$src2.b)">, V6_vmpabus_enc;
1086*9880d681SAndroid Build Coastguard Workerdefm V6_vmpahb   :T_vmpy_WW<"$dst.w = vmpa($src1.h,$src2.b)">, V6_vmpahb_enc;
1087*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyh    :T_vmpy_WV<"$dst.w = vmpy($src1.h,$src2.h)">, V6_vmpyh_enc;
1088*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyuh   :T_vmpy_WV<"$dst.uw = vmpy($src1.uh,$src2.uh)">, V6_vmpyuh_enc;
1089*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiwh  :T_vmpy_VV<"$dst.w = vmpyi($src1.w,$src2.h)">, V6_vmpyiwh_enc;
1090*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpyhb  :T_vmpy_WW<"$dst.w = vtmpy($src1.h,$src2.b)">, V6_vtmpyhb_enc;
1091*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyub   :T_vmpy_WV<"$dst.uh = vmpy($src1.ub,$src2.ub)">, V6_vmpyub_enc;
1092*9880d681SAndroid Build Coastguard Worker
1093*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_LONG, Type = TypeCVI_VX in
1094*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyihb  :T_vmpy_VV<"$dst.h = vmpyi($src1.h,$src2.b)">, V6_vmpyihb_enc;
1095*9880d681SAndroid Build Coastguard Worker
1096*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpybus_dv :
1097*9880d681SAndroid Build Coastguard Worker     T_vmpy_WW <"$dst.h = vdmpy($src1.ub,$src2.b)">, V6_vdmpybus_dv_enc;
1098*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsusat :
1099*9880d681SAndroid Build Coastguard Worker     T_vmpy_VV <"$dst.w = vdmpy($src1.h,$src2.uh):sat">, V6_vdmpyhsusat_enc;
1100*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsuisat :
1101*9880d681SAndroid Build Coastguard Worker     T_vmpy_VW <"$dst.w = vdmpy($src1.h,$src2.uh,#1):sat">, V6_vdmpyhsuisat_enc;
1102*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsat :
1103*9880d681SAndroid Build Coastguard Worker     T_vmpy_VV <"$dst.w = vdmpy($src1.h,$src2.h):sat">, V6_vdmpyhsat_enc;
1104*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhisat :
1105*9880d681SAndroid Build Coastguard Worker     T_vmpy_VW <"$dst.w = vdmpy($src1.h,$src2.h):sat">, V6_vdmpyhisat_enc;
1106*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhb_dv :
1107*9880d681SAndroid Build Coastguard Worker     T_vmpy_WW <"$dst.w = vdmpy($src1.h,$src2.b)">, V6_vdmpyhb_dv_enc;
1108*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhss :
1109*9880d681SAndroid Build Coastguard Worker     T_vmpy_VV <"$dst.h = vmpy($src1.h,$src2.h):<<1:sat">, V6_vmpyhss_enc;
1110*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhsrs :
1111*9880d681SAndroid Build Coastguard Worker     T_vmpy_VV <"$dst.h = vmpy($src1.h,$src2.h):<<1:rnd:sat">, V6_vmpyhsrs_enc;
1112*9880d681SAndroid Build Coastguard Worker
1113*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP, Type = TypeCVI_VP in
1114*9880d681SAndroid Build Coastguard Workerdefm V6_vror : T_vmpy_VV <"$dst = vror($src1,$src2)">, V6_vror_enc;
1115*9880d681SAndroid Build Coastguard Worker
1116*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX, Type = TypeCVI_VX in {
1117*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhb  : T_vmpy_VV<"$dst.w = vdmpy($src1.h,$src2.b)">, V6_vdmpyhb_enc;
1118*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybus : T_vmpy_VV<"$dst.w = vrmpy($src1.ub,$src2.b)">, V6_vrmpybus_enc;
1119*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpybus : T_vmpy_VV<"$dst.h = vdmpy($src1.ub,$src2.b)">, V6_vdmpybus_enc;
1120*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiwb  : T_vmpy_VV<"$dst.w = vmpyi($src1.w,$src2.b)">, V6_vmpyiwb_enc;
1121*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyub : T_vmpy_VV<"$dst.uw = vrmpy($src1.ub,$src2.ub)">, V6_vrmpyub_enc;
1122*9880d681SAndroid Build Coastguard Worker}
1123*9880d681SAndroid Build Coastguard Worker
1124*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VS, Type = TypeCVI_VS in {
1125*9880d681SAndroid Build Coastguard Workerdefm V6_vasrw  : T_vmpy_VV <"$dst.w = vasr($src1.w,$src2)">, V6_vasrw_enc;
1126*9880d681SAndroid Build Coastguard Workerdefm V6_vasrh  : T_vmpy_VV <"$dst.h = vasr($src1.h,$src2)">, V6_vasrh_enc;
1127*9880d681SAndroid Build Coastguard Workerdefm V6_vaslw  : T_vmpy_VV <"$dst.w = vasl($src1.w,$src2)">, V6_vaslw_enc;
1128*9880d681SAndroid Build Coastguard Workerdefm V6_vaslh  : T_vmpy_VV <"$dst.h = vasl($src1.h,$src2)">, V6_vaslh_enc;
1129*9880d681SAndroid Build Coastguard Workerdefm V6_vlsrw  : T_vmpy_VV <"$dst.uw = vlsr($src1.uw,$src2)">, V6_vlsrw_enc;
1130*9880d681SAndroid Build Coastguard Workerdefm V6_vlsrh  : T_vmpy_VV <"$dst.uh = vlsr($src1.uh,$src2)">, V6_vlsrh_enc;
1131*9880d681SAndroid Build Coastguard Worker}
1132*9880d681SAndroid Build Coastguard Worker
1133*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
1134*9880d681SAndroid Build Coastguard Workerclass T_HVX_alu <string asmString, InstrItinClass itin,
1135*9880d681SAndroid Build Coastguard Worker                 RegisterClass RCout, RegisterClass RCin>
1136*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RCout:$dst), (ins RCin:$src1, RCin:$src2),
1137*9880d681SAndroid Build Coastguard Worker    asmString >{
1138*9880d681SAndroid Build Coastguard Worker  let Itinerary = itin;
1139*9880d681SAndroid Build Coastguard Worker  let Type = !cast<IType>("Type"#itin);
1140*9880d681SAndroid Build Coastguard Worker}
1141*9880d681SAndroid Build Coastguard Worker
1142*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu <string asmString, RegisterClass RCout,
1143*9880d681SAndroid Build Coastguard Worker           RegisterClass RCin, InstrItinClass itin> {
1144*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_alu <asmString, itin, RCout, RCin>;
1145*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1146*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_alu <asmString, itin,
1147*9880d681SAndroid Build Coastguard Worker                              !cast<RegisterClass>(RCout#"128B"),
1148*9880d681SAndroid Build Coastguard Worker                              !cast<RegisterClass>(RCin#"128B")>;
1149*9880d681SAndroid Build Coastguard Worker}
1150*9880d681SAndroid Build Coastguard Worker
1151*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_VV <string asmString>:
1152*9880d681SAndroid Build Coastguard Worker  T_HVX_alu <asmString, VectorRegs, VectorRegs, CVI_VA>;
1153*9880d681SAndroid Build Coastguard Worker
1154*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_WW <string asmString>:
1155*9880d681SAndroid Build Coastguard Worker  T_HVX_alu <asmString, VecDblRegs, VecDblRegs, CVI_VA_DV>;
1156*9880d681SAndroid Build Coastguard Worker
1157*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_WV <string asmString>:
1158*9880d681SAndroid Build Coastguard Worker  T_HVX_alu <asmString, VecDblRegs, VectorRegs, CVI_VX_DV>;
1159*9880d681SAndroid Build Coastguard Worker
1160*9880d681SAndroid Build Coastguard Worker
1161*9880d681SAndroid Build Coastguard Workerlet Itinerary  =  CVI_VX, Type  =  TypeCVI_VX in {
1162*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyubv :
1163*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uw = vrmpy($src1.ub,$src2.ub)">, V6_vrmpyubv_enc;
1164*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybv :
1165*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vrmpy($src1.b,$src2.b)">, V6_vrmpybv_enc;
1166*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybusv :
1167*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vrmpy($src1.ub,$src2.b)">, V6_vrmpybusv_enc;
1168*9880d681SAndroid Build Coastguard Workerdefm V6_vabsdiffub :
1169*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vabsdiff($src1.ub,$src2.ub)">, V6_vabsdiffub_enc;
1170*9880d681SAndroid Build Coastguard Workerdefm V6_vabsdiffh :
1171*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vabsdiff($src1.h,$src2.h)">, V6_vabsdiffh_enc;
1172*9880d681SAndroid Build Coastguard Workerdefm V6_vabsdiffuh :
1173*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vabsdiff($src1.uh,$src2.uh)">, V6_vabsdiffuh_enc;
1174*9880d681SAndroid Build Coastguard Workerdefm V6_vabsdiffw :
1175*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uw = vabsdiff($src1.w,$src2.w)">, V6_vabsdiffw_enc;
1176*9880d681SAndroid Build Coastguard Worker}
1177*9880d681SAndroid Build Coastguard Worker
1178*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_DV, Type = TypeCVI_VX_DV in {
1179*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhvsat :
1180*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vdmpy($src1.h,$src2.h):sat">, V6_vdmpyhvsat_enc;
1181*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhvsrs :
1182*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV<"$dst.h = vmpy($src1.h,$src2.h):<<1:rnd:sat">, V6_vmpyhvsrs_enc;
1183*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyih :
1184*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vmpyi($src1.h,$src2.h)">, V6_vmpyih_enc;
1185*9880d681SAndroid Build Coastguard Worker}
1186*9880d681SAndroid Build Coastguard Worker
1187*9880d681SAndroid Build Coastguard Workerdefm V6_vand :
1188*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst = vand($src1,$src2)">, V6_vand_enc;
1189*9880d681SAndroid Build Coastguard Workerdefm V6_vor :
1190*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst = vor($src1,$src2)">, V6_vor_enc;
1191*9880d681SAndroid Build Coastguard Workerdefm V6_vxor :
1192*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst = vxor($src1,$src2)">, V6_vxor_enc;
1193*9880d681SAndroid Build Coastguard Workerdefm V6_vaddw :
1194*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vadd($src1.w,$src2.w)">, V6_vaddw_enc;
1195*9880d681SAndroid Build Coastguard Workerdefm V6_vaddubsat :
1196*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vadd($src1.ub,$src2.ub):sat">, V6_vaddubsat_enc;
1197*9880d681SAndroid Build Coastguard Workerdefm V6_vadduhsat :
1198*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vadd($src1.uh,$src2.uh):sat">, V6_vadduhsat_enc;
1199*9880d681SAndroid Build Coastguard Workerdefm V6_vaddhsat :
1200*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vadd($src1.h,$src2.h):sat">, V6_vaddhsat_enc;
1201*9880d681SAndroid Build Coastguard Workerdefm V6_vaddwsat :
1202*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vadd($src1.w,$src2.w):sat">, V6_vaddwsat_enc;
1203*9880d681SAndroid Build Coastguard Workerdefm V6_vsubb :
1204*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vsub($src1.b,$src2.b)">, V6_vsubb_enc;
1205*9880d681SAndroid Build Coastguard Workerdefm V6_vsubh :
1206*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vsub($src1.h,$src2.h)">, V6_vsubh_enc;
1207*9880d681SAndroid Build Coastguard Workerdefm V6_vsubw :
1208*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vsub($src1.w,$src2.w)">, V6_vsubw_enc;
1209*9880d681SAndroid Build Coastguard Workerdefm V6_vsububsat :
1210*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vsub($src1.ub,$src2.ub):sat">, V6_vsububsat_enc;
1211*9880d681SAndroid Build Coastguard Workerdefm V6_vsubuhsat :
1212*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vsub($src1.uh,$src2.uh):sat">, V6_vsubuhsat_enc;
1213*9880d681SAndroid Build Coastguard Workerdefm V6_vsubhsat :
1214*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vsub($src1.h,$src2.h):sat">, V6_vsubhsat_enc;
1215*9880d681SAndroid Build Coastguard Workerdefm V6_vsubwsat :
1216*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vsub($src1.w,$src2.w):sat">, V6_vsubwsat_enc;
1217*9880d681SAndroid Build Coastguard Workerdefm V6_vavgub :
1218*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vavg($src1.ub,$src2.ub)">, V6_vavgub_enc;
1219*9880d681SAndroid Build Coastguard Workerdefm V6_vavguh :
1220*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vavg($src1.uh,$src2.uh)">, V6_vavguh_enc;
1221*9880d681SAndroid Build Coastguard Workerdefm V6_vavgh :
1222*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vavg($src1.h,$src2.h)">, V6_vavgh_enc;
1223*9880d681SAndroid Build Coastguard Workerdefm V6_vavgw :
1224*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vavg($src1.w,$src2.w)">, V6_vavgw_enc;
1225*9880d681SAndroid Build Coastguard Workerdefm V6_vnavgub :
1226*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vnavg($src1.ub,$src2.ub)">, V6_vnavgub_enc;
1227*9880d681SAndroid Build Coastguard Workerdefm V6_vnavgh :
1228*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vnavg($src1.h,$src2.h)">, V6_vnavgh_enc;
1229*9880d681SAndroid Build Coastguard Workerdefm V6_vnavgw :
1230*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vnavg($src1.w,$src2.w)">, V6_vnavgw_enc;
1231*9880d681SAndroid Build Coastguard Workerdefm V6_vavgubrnd :
1232*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vavg($src1.ub,$src2.ub):rnd">, V6_vavgubrnd_enc;
1233*9880d681SAndroid Build Coastguard Workerdefm V6_vavguhrnd :
1234*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vavg($src1.uh,$src2.uh):rnd">, V6_vavguhrnd_enc;
1235*9880d681SAndroid Build Coastguard Workerdefm V6_vavghrnd :
1236*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vavg($src1.h,$src2.h):rnd">, V6_vavghrnd_enc;
1237*9880d681SAndroid Build Coastguard Workerdefm V6_vavgwrnd :
1238*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vavg($src1.w,$src2.w):rnd">, V6_vavgwrnd_enc;
1239*9880d681SAndroid Build Coastguard Worker
1240*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybv :
1241*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.h = vmpy($src1.b,$src2.b)">, V6_vmpybv_enc;
1242*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyubv :
1243*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.uh = vmpy($src1.ub,$src2.ub)">, V6_vmpyubv_enc;
1244*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybusv :
1245*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.h = vmpy($src1.ub,$src2.b)">, V6_vmpybusv_enc;
1246*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhv :
1247*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vmpy($src1.h,$src2.h)">, V6_vmpyhv_enc;
1248*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyuhv :
1249*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.uw = vmpy($src1.uh,$src2.uh)">, V6_vmpyuhv_enc;
1250*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhus :
1251*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vmpy($src1.h,$src2.uh)">, V6_vmpyhus_enc;
1252*9880d681SAndroid Build Coastguard Workerdefm V6_vaddubh :
1253*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.h = vadd($src1.ub,$src2.ub)">, V6_vaddubh_enc;
1254*9880d681SAndroid Build Coastguard Workerdefm V6_vadduhw :
1255*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vadd($src1.uh,$src2.uh)">, V6_vadduhw_enc;
1256*9880d681SAndroid Build Coastguard Workerdefm V6_vaddhw :
1257*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vadd($src1.h,$src2.h)">, V6_vaddhw_enc;
1258*9880d681SAndroid Build Coastguard Workerdefm V6_vsububh :
1259*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.h = vsub($src1.ub,$src2.ub)">, V6_vsububh_enc;
1260*9880d681SAndroid Build Coastguard Workerdefm V6_vsubuhw :
1261*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vsub($src1.uh,$src2.uh)">, V6_vsubuhw_enc;
1262*9880d681SAndroid Build Coastguard Workerdefm V6_vsubhw :
1263*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.w = vsub($src1.h,$src2.h)">, V6_vsubhw_enc;
1264*9880d681SAndroid Build Coastguard Worker
1265*9880d681SAndroid Build Coastguard Workerdefm V6_vaddb_dv :
1266*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.b = vadd($src1.b,$src2.b)">, V6_vaddb_dv_enc;
1267*9880d681SAndroid Build Coastguard Workerdefm V6_vaddh_dv :
1268*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vadd($src1.h,$src2.h)">, V6_vaddh_dv_enc;
1269*9880d681SAndroid Build Coastguard Workerdefm V6_vaddw_dv :
1270*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.w = vadd($src1.w,$src2.w)">, V6_vaddw_dv_enc;
1271*9880d681SAndroid Build Coastguard Workerdefm V6_vaddubsat_dv :
1272*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.ub = vadd($src1.ub,$src2.ub):sat">, V6_vaddubsat_dv_enc;
1273*9880d681SAndroid Build Coastguard Workerdefm V6_vadduhsat_dv :
1274*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.uh = vadd($src1.uh,$src2.uh):sat">, V6_vadduhsat_dv_enc;
1275*9880d681SAndroid Build Coastguard Workerdefm V6_vaddhsat_dv :
1276*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vadd($src1.h,$src2.h):sat">, V6_vaddhsat_dv_enc;
1277*9880d681SAndroid Build Coastguard Workerdefm V6_vaddwsat_dv :
1278*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.w = vadd($src1.w,$src2.w):sat">, V6_vaddwsat_dv_enc;
1279*9880d681SAndroid Build Coastguard Workerdefm V6_vsubb_dv :
1280*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.b = vsub($src1.b,$src2.b)">, V6_vsubb_dv_enc;
1281*9880d681SAndroid Build Coastguard Workerdefm V6_vsubh_dv :
1282*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vsub($src1.h,$src2.h)">, V6_vsubh_dv_enc;
1283*9880d681SAndroid Build Coastguard Workerdefm V6_vsubw_dv :
1284*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.w = vsub($src1.w,$src2.w)">, V6_vsubw_dv_enc;
1285*9880d681SAndroid Build Coastguard Workerdefm V6_vsububsat_dv :
1286*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.ub = vsub($src1.ub,$src2.ub):sat">, V6_vsububsat_dv_enc;
1287*9880d681SAndroid Build Coastguard Workerdefm V6_vsubuhsat_dv :
1288*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.uh = vsub($src1.uh,$src2.uh):sat">, V6_vsubuhsat_dv_enc;
1289*9880d681SAndroid Build Coastguard Workerdefm V6_vsubhsat_dv :
1290*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vsub($src1.h,$src2.h):sat">, V6_vsubhsat_dv_enc;
1291*9880d681SAndroid Build Coastguard Workerdefm V6_vsubwsat_dv :
1292*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.w = vsub($src1.w,$src2.w):sat">, V6_vsubwsat_dv_enc;
1293*9880d681SAndroid Build Coastguard Worker
1294*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_DV_LONG, Type = TypeCVI_VX_DV in {
1295*9880d681SAndroid Build Coastguard Workerdefm V6_vmpabusv :
1296*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vmpa($src1.ub,$src2.b)">, V6_vmpabusv_enc;
1297*9880d681SAndroid Build Coastguard Workerdefm V6_vmpabuuv :
1298*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WW <"$dst.h = vmpa($src1.ub,$src2.ub)">, V6_vmpabuuv_enc;
1299*9880d681SAndroid Build Coastguard Worker}
1300*9880d681SAndroid Build Coastguard Worker
1301*9880d681SAndroid Build Coastguard Workerlet isAccumulator = 1, hasNewValue = 1 in
1302*9880d681SAndroid Build Coastguard Workerclass T_HVX_vmpyacc <string asmString, InstrItinClass itin, RegisterClass RCout,
1303*9880d681SAndroid Build Coastguard Worker                     RegisterClass RCin1, RegisterClass RCin2>
1304*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RCout:$dst),
1305*9880d681SAndroid Build Coastguard Worker                      (ins RCout:$_src_, RCin1:$src1, RCin2:$src2), asmString,
1306*9880d681SAndroid Build Coastguard Worker                      [], "$dst = $_src_" > {
1307*9880d681SAndroid Build Coastguard Worker  let Itinerary = itin;
1308*9880d681SAndroid Build Coastguard Worker  let Type = !cast<IType>("Type"#itin);
1309*9880d681SAndroid Build Coastguard Worker}
1310*9880d681SAndroid Build Coastguard Worker
1311*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_both <string asmString, RegisterClass RCout,
1312*9880d681SAndroid Build Coastguard Worker           RegisterClass RCin1, RegisterClass RCin2, InstrItinClass itin > {
1313*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vmpyacc <asmString, itin, RCout, RCin1, RCin2>;
1314*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1315*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vmpyacc <asmString, itin,
1316*9880d681SAndroid Build Coastguard Worker                   !cast<RegisterClass>(RCout#"128B"),
1317*9880d681SAndroid Build Coastguard Worker                   !cast<RegisterClass>(RCin1#"128B"),
1318*9880d681SAndroid Build Coastguard Worker                   !cast<RegisterClass>(RCin2#
1319*9880d681SAndroid Build Coastguard Worker                   !if(!eq (!cast<string>(RCin2), "IntRegs"), "", "128B"))>;
1320*9880d681SAndroid Build Coastguard Worker}
1321*9880d681SAndroid Build Coastguard Worker
1322*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_VVR <string asmString>:
1323*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VectorRegs, VectorRegs, IntRegs, CVI_VX>;
1324*9880d681SAndroid Build Coastguard Worker
1325*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_VWR <string asmString>:
1326*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VectorRegs, VecDblRegs, IntRegs, CVI_VX_DV>;
1327*9880d681SAndroid Build Coastguard Worker
1328*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_WVR <string asmString>:
1329*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VecDblRegs, VectorRegs, IntRegs, CVI_VX_DV>;
1330*9880d681SAndroid Build Coastguard Worker
1331*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_WWR <string asmString>:
1332*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VecDblRegs, VecDblRegs, IntRegs, CVI_VX_DV>;
1333*9880d681SAndroid Build Coastguard Worker
1334*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_VVV <string asmString>:
1335*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VectorRegs, VectorRegs, VectorRegs, CVI_VX_DV>;
1336*9880d681SAndroid Build Coastguard Worker
1337*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc_WVV <string asmString>:
1338*9880d681SAndroid Build Coastguard Worker  T_HVX_vmpyacc_both <asmString, VecDblRegs, VectorRegs, VectorRegs, CVI_VX_DV>;
1339*9880d681SAndroid Build Coastguard Worker
1340*9880d681SAndroid Build Coastguard Worker
1341*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpyb_acc :
1342*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.h += vtmpy($src1.b,$src2.b)">,
1343*9880d681SAndroid Build Coastguard Worker     V6_vtmpyb_acc_enc;
1344*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpybus_acc :
1345*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.h += vtmpy($src1.ub,$src2.b)">,
1346*9880d681SAndroid Build Coastguard Worker     V6_vtmpybus_acc_enc;
1347*9880d681SAndroid Build Coastguard Workerdefm V6_vtmpyhb_acc :
1348*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.w += vtmpy($src1.h,$src2.b)">,
1349*9880d681SAndroid Build Coastguard Worker     V6_vtmpyhb_acc_enc;
1350*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhb_acc :
1351*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vdmpy($src1.h,$src2.b)">,
1352*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhb_acc_enc;
1353*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyub_acc :
1354*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.uw += vrmpy($src1.ub,$src2.ub)">,
1355*9880d681SAndroid Build Coastguard Worker     V6_vrmpyub_acc_enc;
1356*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybus_acc :
1357*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vrmpy($src1.ub,$src2.b)">,
1358*9880d681SAndroid Build Coastguard Worker     V6_vrmpybus_acc_enc;
1359*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpybus_acc :
1360*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.h += vdmpy($src1.ub,$src2.b)">,
1361*9880d681SAndroid Build Coastguard Worker     V6_vdmpybus_acc_enc;
1362*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpybus_dv_acc :
1363*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.h += vdmpy($src1.ub,$src2.b)">,
1364*9880d681SAndroid Build Coastguard Worker     V6_vdmpybus_dv_acc_enc;
1365*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsuisat_acc :
1366*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VWR <"$dst.w += vdmpy($src1.h,$src2.uh,#1):sat">,
1367*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhsuisat_acc_enc;
1368*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhisat_acc :
1369*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VWR <"$dst.w += vdmpy($src1.h,$src2.h):sat">,
1370*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhisat_acc_enc;
1371*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhb_dv_acc :
1372*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.w += vdmpy($src1.h,$src2.b)">,
1373*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhb_dv_acc_enc;
1374*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybus_acc :
1375*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVR <"$dst.h += vmpy($src1.ub,$src2.b)">,
1376*9880d681SAndroid Build Coastguard Worker     V6_vmpybus_acc_enc;
1377*9880d681SAndroid Build Coastguard Workerdefm V6_vmpabus_acc :
1378*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.h += vmpa($src1.ub,$src2.b)">,
1379*9880d681SAndroid Build Coastguard Worker     V6_vmpabus_acc_enc;
1380*9880d681SAndroid Build Coastguard Workerdefm V6_vmpahb_acc :
1381*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.w += vmpa($src1.h,$src2.b)">,
1382*9880d681SAndroid Build Coastguard Worker     V6_vmpahb_acc_enc;
1383*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhsat_acc :
1384*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVR <"$dst.w += vmpy($src1.h,$src2.h):sat">,
1385*9880d681SAndroid Build Coastguard Worker     V6_vmpyhsat_acc_enc;
1386*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyuh_acc :
1387*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVR <"$dst.uw += vmpy($src1.uh,$src2.uh)">,
1388*9880d681SAndroid Build Coastguard Worker     V6_vmpyuh_acc_enc;
1389*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiwb_acc :
1390*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vmpyi($src1.w,$src2.b)">,
1391*9880d681SAndroid Build Coastguard Worker     V6_vmpyiwb_acc_enc;
1392*9880d681SAndroid Build Coastguard Workerdefm V6_vdsaduh_acc :
1393*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WWR <"$dst.uw += vdsad($src1.uh,$src2.uh)">,
1394*9880d681SAndroid Build Coastguard Worker     V6_vdsaduh_acc_enc;
1395*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyihb_acc :
1396*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.h += vmpyi($src1.h,$src2.b)">,
1397*9880d681SAndroid Build Coastguard Worker     V6_vmpyihb_acc_enc;
1398*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyub_acc :
1399*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVR <"$dst.uh += vmpy($src1.ub,$src2.ub)">,
1400*9880d681SAndroid Build Coastguard Worker     V6_vmpyub_acc_enc;
1401*9880d681SAndroid Build Coastguard Worker
1402*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_DV, Type = TypeCVI_VX_DV in {
1403*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsusat_acc :
1404*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vdmpy($src1.h,$src2.uh):sat">,
1405*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhsusat_acc_enc;
1406*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhsat_acc :
1407*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vdmpy($src1.h,$src2.h):sat">,
1408*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhsat_acc_enc;
1409*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiwh_acc : T_HVX_vmpyacc_VVR
1410*9880d681SAndroid Build Coastguard Worker     <"$dst.w += vmpyi($src1.w,$src2.h)">, V6_vmpyiwh_acc_enc;
1411*9880d681SAndroid Build Coastguard Worker}
1412*9880d681SAndroid Build Coastguard Worker
1413*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VS, Type = TypeCVI_VS in {
1414*9880d681SAndroid Build Coastguard Workerdefm V6_vaslw_acc :
1415*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vasl($src1.w,$src2)">, V6_vaslw_acc_enc;
1416*9880d681SAndroid Build Coastguard Workerdefm V6_vasrw_acc :
1417*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVR <"$dst.w += vasr($src1.w,$src2)">, V6_vasrw_acc_enc;
1418*9880d681SAndroid Build Coastguard Worker}
1419*9880d681SAndroid Build Coastguard Worker
1420*9880d681SAndroid Build Coastguard Workerdefm V6_vdmpyhvsat_acc :
1421*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vdmpy($src1.h,$src2.h):sat">,
1422*9880d681SAndroid Build Coastguard Worker     V6_vdmpyhvsat_acc_enc;
1423*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybusv_acc :
1424*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.h += vmpy($src1.ub,$src2.b)">,
1425*9880d681SAndroid Build Coastguard Worker     V6_vmpybusv_acc_enc;
1426*9880d681SAndroid Build Coastguard Workerdefm V6_vmpybv_acc :
1427*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.h += vmpy($src1.b,$src2.b)">, V6_vmpybv_acc_enc;
1428*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhus_acc :
1429*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.w += vmpy($src1.h,$src2.uh)">, V6_vmpyhus_acc_enc;
1430*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyhv_acc :
1431*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.w += vmpy($src1.h,$src2.h)">, V6_vmpyhv_acc_enc;
1432*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiewh_acc :
1433*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vmpyie($src1.w,$src2.h)">,
1434*9880d681SAndroid Build Coastguard Worker     V6_vmpyiewh_acc_enc;
1435*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiewuh_acc :
1436*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vmpyie($src1.w,$src2.uh)">,
1437*9880d681SAndroid Build Coastguard Worker     V6_vmpyiewuh_acc_enc;
1438*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyih_acc :
1439*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.h += vmpyi($src1.h,$src2.h)">, V6_vmpyih_acc_enc;
1440*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyowh_rnd_sacc :
1441*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vmpyo($src1.w,$src2.h):<<1:rnd:sat:shift">,
1442*9880d681SAndroid Build Coastguard Worker     V6_vmpyowh_rnd_sacc_enc;
1443*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyowh_sacc :
1444*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vmpyo($src1.w,$src2.h):<<1:sat:shift">,
1445*9880d681SAndroid Build Coastguard Worker     V6_vmpyowh_sacc_enc;
1446*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyubv_acc :
1447*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.uh += vmpy($src1.ub,$src2.ub)">,
1448*9880d681SAndroid Build Coastguard Worker     V6_vmpyubv_acc_enc;
1449*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyuhv_acc :
1450*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_WVV <"$dst.uw += vmpy($src1.uh,$src2.uh)">,
1451*9880d681SAndroid Build Coastguard Worker     V6_vmpyuhv_acc_enc;
1452*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybusv_acc :
1453*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vrmpy($src1.ub,$src2.b)">,
1454*9880d681SAndroid Build Coastguard Worker     V6_vrmpybusv_acc_enc;
1455*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybv_acc :
1456*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.w += vrmpy($src1.b,$src2.b)">, V6_vrmpybv_acc_enc;
1457*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyubv_acc :
1458*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc_VVV <"$dst.uw += vrmpy($src1.ub,$src2.ub)">,
1459*9880d681SAndroid Build Coastguard Worker     V6_vrmpyubv_acc_enc;
1460*9880d681SAndroid Build Coastguard Worker
1461*9880d681SAndroid Build Coastguard Worker
1462*9880d681SAndroid Build Coastguard Workerclass T_HVX_vcmp <string asmString, RegisterClass RCout, RegisterClass RCin>
1463*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RCout:$dst),
1464*9880d681SAndroid Build Coastguard Worker                      (ins RCout:$_src_, RCin:$src1, RCin:$src2), asmString,
1465*9880d681SAndroid Build Coastguard Worker                      [], "$dst = $_src_" > {
1466*9880d681SAndroid Build Coastguard Worker  let Itinerary = CVI_VA;
1467*9880d681SAndroid Build Coastguard Worker  let Type = TypeCVI_VA;
1468*9880d681SAndroid Build Coastguard Worker}
1469*9880d681SAndroid Build Coastguard Worker
1470*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vcmp <string asmString> {
1471*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vcmp <asmString, VecPredRegs, VectorRegs>;
1472*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1473*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vcmp <asmString, VecPredRegs128B, VectorRegs128B>;
1474*9880d681SAndroid Build Coastguard Worker}
1475*9880d681SAndroid Build Coastguard Worker
1476*9880d681SAndroid Build Coastguard Workerdefm V6_veqb_and :
1477*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.eq($src1.b,$src2.b)">, V6_veqb_and_enc;
1478*9880d681SAndroid Build Coastguard Workerdefm V6_veqh_and :
1479*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.eq($src1.h,$src2.h)">, V6_veqh_and_enc;
1480*9880d681SAndroid Build Coastguard Workerdefm V6_veqw_and :
1481*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.eq($src1.w,$src2.w)">, V6_veqw_and_enc;
1482*9880d681SAndroid Build Coastguard Workerdefm V6_vgtb_and :
1483*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.b,$src2.b)">, V6_vgtb_and_enc;
1484*9880d681SAndroid Build Coastguard Workerdefm V6_vgth_and :
1485*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.h,$src2.h)">, V6_vgth_and_enc;
1486*9880d681SAndroid Build Coastguard Workerdefm V6_vgtw_and :
1487*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.w,$src2.w)">, V6_vgtw_and_enc;
1488*9880d681SAndroid Build Coastguard Workerdefm V6_vgtub_and :
1489*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.ub,$src2.ub)">, V6_vgtub_and_enc;
1490*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuh_and :
1491*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.uh,$src2.uh)">, V6_vgtuh_and_enc;
1492*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuw_and :
1493*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst &= vcmp.gt($src1.uw,$src2.uw)">, V6_vgtuw_and_enc;
1494*9880d681SAndroid Build Coastguard Workerdefm V6_veqb_or :
1495*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.eq($src1.b,$src2.b)">, V6_veqb_or_enc;
1496*9880d681SAndroid Build Coastguard Workerdefm V6_veqh_or :
1497*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.eq($src1.h,$src2.h)">, V6_veqh_or_enc;
1498*9880d681SAndroid Build Coastguard Workerdefm V6_veqw_or :
1499*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.eq($src1.w,$src2.w)">, V6_veqw_or_enc;
1500*9880d681SAndroid Build Coastguard Workerdefm V6_vgtb_or :
1501*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.b,$src2.b)">, V6_vgtb_or_enc;
1502*9880d681SAndroid Build Coastguard Workerdefm V6_vgth_or :
1503*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.h,$src2.h)">, V6_vgth_or_enc;
1504*9880d681SAndroid Build Coastguard Workerdefm V6_vgtw_or :
1505*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.w,$src2.w)">, V6_vgtw_or_enc;
1506*9880d681SAndroid Build Coastguard Workerdefm V6_vgtub_or :
1507*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.ub,$src2.ub)">, V6_vgtub_or_enc;
1508*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuh_or :
1509*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.uh,$src2.uh)">, V6_vgtuh_or_enc;
1510*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuw_or :
1511*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst |= vcmp.gt($src1.uw,$src2.uw)">, V6_vgtuw_or_enc;
1512*9880d681SAndroid Build Coastguard Workerdefm V6_veqb_xor :
1513*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.eq($src1.b,$src2.b)">, V6_veqb_xor_enc;
1514*9880d681SAndroid Build Coastguard Workerdefm V6_veqh_xor :
1515*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.eq($src1.h,$src2.h)">, V6_veqh_xor_enc;
1516*9880d681SAndroid Build Coastguard Workerdefm V6_veqw_xor :
1517*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.eq($src1.w,$src2.w)">, V6_veqw_xor_enc;
1518*9880d681SAndroid Build Coastguard Workerdefm V6_vgtb_xor :
1519*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.b,$src2.b)">, V6_vgtb_xor_enc;
1520*9880d681SAndroid Build Coastguard Workerdefm V6_vgth_xor :
1521*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.h,$src2.h)">, V6_vgth_xor_enc;
1522*9880d681SAndroid Build Coastguard Workerdefm V6_vgtw_xor :
1523*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.w,$src2.w)">, V6_vgtw_xor_enc;
1524*9880d681SAndroid Build Coastguard Workerdefm V6_vgtub_xor :
1525*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.ub,$src2.ub)">, V6_vgtub_xor_enc;
1526*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuh_xor :
1527*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.uh,$src2.uh)">, V6_vgtuh_xor_enc;
1528*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuw_xor :
1529*9880d681SAndroid Build Coastguard Worker     T_HVX_vcmp <"$dst ^= vcmp.gt($src1.uw,$src2.uw)">, V6_vgtuw_xor_enc;
1530*9880d681SAndroid Build Coastguard Worker
1531*9880d681SAndroid Build Coastguard Workerdefm V6_vminub :
1532*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vmin($src1.ub,$src2.ub)">, V6_vminub_enc;
1533*9880d681SAndroid Build Coastguard Workerdefm V6_vminuh :
1534*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vmin($src1.uh,$src2.uh)">, V6_vminuh_enc;
1535*9880d681SAndroid Build Coastguard Workerdefm V6_vminh :
1536*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vmin($src1.h,$src2.h)">, V6_vminh_enc;
1537*9880d681SAndroid Build Coastguard Workerdefm V6_vminw :
1538*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmin($src1.w,$src2.w)">, V6_vminw_enc;
1539*9880d681SAndroid Build Coastguard Workerdefm V6_vmaxub :
1540*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vmax($src1.ub,$src2.ub)">, V6_vmaxub_enc;
1541*9880d681SAndroid Build Coastguard Workerdefm V6_vmaxuh :
1542*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vmax($src1.uh,$src2.uh)">, V6_vmaxuh_enc;
1543*9880d681SAndroid Build Coastguard Workerdefm V6_vmaxh :
1544*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vmax($src1.h,$src2.h)">, V6_vmaxh_enc;
1545*9880d681SAndroid Build Coastguard Workerdefm V6_vmaxw :
1546*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmax($src1.w,$src2.w)">, V6_vmaxw_enc;
1547*9880d681SAndroid Build Coastguard Workerdefm V6_vshuffeb :
1548*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vshuffe($src1.b,$src2.b)">, V6_vshuffeb_enc;
1549*9880d681SAndroid Build Coastguard Workerdefm V6_vshuffob :
1550*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vshuffo($src1.b,$src2.b)">, V6_vshuffob_enc;
1551*9880d681SAndroid Build Coastguard Workerdefm V6_vshufeh :
1552*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vshuffe($src1.h,$src2.h)">, V6_vshufeh_enc;
1553*9880d681SAndroid Build Coastguard Workerdefm V6_vshufoh :
1554*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vshuffo($src1.h,$src2.h)">, V6_vshufoh_enc;
1555*9880d681SAndroid Build Coastguard Worker
1556*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_DV, Type = TypeCVI_VX_DV in {
1557*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyowh_rnd :
1558*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpyo($src1.w,$src2.h):<<1:rnd:sat">,
1559*9880d681SAndroid Build Coastguard Worker     V6_vmpyowh_rnd_enc;
1560*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiewuh :
1561*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpyie($src1.w,$src2.uh)">, V6_vmpyiewuh_enc;
1562*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyewuh :
1563*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpye($src1.w,$src2.uh)">, V6_vmpyewuh_enc;
1564*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyowh :
1565*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpyo($src1.w,$src2.h):<<1:sat">, V6_vmpyowh_enc;
1566*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyiowh :
1567*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpyio($src1.w,$src2.h)">, V6_vmpyiowh_enc;
1568*9880d681SAndroid Build Coastguard Worker}
1569*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX, Type = TypeCVI_VX in
1570*9880d681SAndroid Build Coastguard Workerdefm V6_vmpyieoh :
1571*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vmpyieo($src1.h,$src2.h)">, V6_vmpyieoh_enc;
1572*9880d681SAndroid Build Coastguard Worker
1573*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA_DV, Type = TypeCVI_VA_DV in {
1574*9880d681SAndroid Build Coastguard Workerdefm V6_vshufoeh :
1575*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.h = vshuffoe($src1.h,$src2.h)">, V6_vshufoeh_enc;
1576*9880d681SAndroid Build Coastguard Workerdefm V6_vshufoeb :
1577*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst.b = vshuffoe($src1.b,$src2.b)">, V6_vshufoeb_enc;
1578*9880d681SAndroid Build Coastguard Worker}
1579*9880d681SAndroid Build Coastguard Worker
1580*9880d681SAndroid Build Coastguard Workerlet isRegSequence = 1, Itinerary = CVI_VA_DV, Type = TypeCVI_VA_DV in
1581*9880d681SAndroid Build Coastguard Workerdefm V6_vcombine :
1582*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_WV <"$dst = vcombine($src1,$src2)">, V6_vcombine_enc;
1583*9880d681SAndroid Build Coastguard Worker
1584*9880d681SAndroid Build Coastguard Workerdef SDTHexagonVCOMBINE: SDTypeProfile<1, 2, [SDTCisSameAs<1, 2>,
1585*9880d681SAndroid Build Coastguard Worker      SDTCisSubVecOfVec<1, 0>]>;
1586*9880d681SAndroid Build Coastguard Worker
1587*9880d681SAndroid Build Coastguard Workerdef HexagonVCOMBINE: SDNode<"HexagonISD::VCOMBINE", SDTHexagonVCOMBINE>;
1588*9880d681SAndroid Build Coastguard Worker
1589*9880d681SAndroid Build Coastguard Workerdef: Pat<(v32i32 (HexagonVCOMBINE (v16i32 VectorRegs:$Vs),
1590*9880d681SAndroid Build Coastguard Worker                                  (v16i32 VectorRegs:$Vt))),
1591*9880d681SAndroid Build Coastguard Worker         (V6_vcombine VectorRegs:$Vs, VectorRegs:$Vt)>,
1592*9880d681SAndroid Build Coastguard Worker         Requires<[UseHVXSgl]>;
1593*9880d681SAndroid Build Coastguard Workerdef: Pat<(v64i32 (HexagonVCOMBINE (v32i32 VecDblRegs:$Vs),
1594*9880d681SAndroid Build Coastguard Worker                                  (v32i32 VecDblRegs:$Vt))),
1595*9880d681SAndroid Build Coastguard Worker         (V6_vcombine_128B VecDblRegs:$Vs, VecDblRegs:$Vt)>,
1596*9880d681SAndroid Build Coastguard Worker         Requires<[UseHVXDbl]>;
1597*9880d681SAndroid Build Coastguard Worker
1598*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VINLANESAT, Type = TypeCVI_VINLANESAT in {
1599*9880d681SAndroid Build Coastguard Workerdefm V6_vsathub :
1600*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vsat($src1.h,$src2.h)">, V6_vsathub_enc;
1601*9880d681SAndroid Build Coastguard Workerdefm V6_vsatwh :
1602*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vsat($src1.w,$src2.w)">, V6_vsatwh_enc;
1603*9880d681SAndroid Build Coastguard Worker}
1604*9880d681SAndroid Build Coastguard Worker
1605*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VS, Type = TypeCVI_VS in {
1606*9880d681SAndroid Build Coastguard Workerdefm V6_vroundwh :
1607*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vround($src1.w,$src2.w):sat">, V6_vroundwh_enc;
1608*9880d681SAndroid Build Coastguard Workerdefm V6_vroundwuh :
1609*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vround($src1.w,$src2.w):sat">, V6_vroundwuh_enc;
1610*9880d681SAndroid Build Coastguard Workerdefm V6_vroundhb :
1611*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vround($src1.h,$src2.h):sat">, V6_vroundhb_enc;
1612*9880d681SAndroid Build Coastguard Workerdefm V6_vroundhub :
1613*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vround($src1.h,$src2.h):sat">, V6_vroundhub_enc;
1614*9880d681SAndroid Build Coastguard Workerdefm V6_vasrwv :
1615*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vasr($src1.w,$src2.w)">, V6_vasrwv_enc;
1616*9880d681SAndroid Build Coastguard Workerdefm V6_vlsrwv :
1617*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vlsr($src1.w,$src2.w)">, V6_vlsrwv_enc;
1618*9880d681SAndroid Build Coastguard Workerdefm V6_vlsrhv :
1619*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vlsr($src1.h,$src2.h)">, V6_vlsrhv_enc;
1620*9880d681SAndroid Build Coastguard Workerdefm V6_vasrhv :
1621*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vasr($src1.h,$src2.h)">, V6_vasrhv_enc;
1622*9880d681SAndroid Build Coastguard Workerdefm V6_vaslwv :
1623*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.w = vasl($src1.w,$src2.w)">, V6_vaslwv_enc;
1624*9880d681SAndroid Build Coastguard Workerdefm V6_vaslhv :
1625*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vasl($src1.h,$src2.h)">, V6_vaslhv_enc;
1626*9880d681SAndroid Build Coastguard Worker}
1627*9880d681SAndroid Build Coastguard Worker
1628*9880d681SAndroid Build Coastguard Workerdefm V6_vaddb :
1629*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vadd($src1.b,$src2.b)">, V6_vaddb_enc;
1630*9880d681SAndroid Build Coastguard Workerdefm V6_vaddh :
1631*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vadd($src1.h,$src2.h)">, V6_vaddh_enc;
1632*9880d681SAndroid Build Coastguard Worker
1633*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP, Type = TypeCVI_VP in {
1634*9880d681SAndroid Build Coastguard Workerdefm V6_vdelta :
1635*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst = vdelta($src1,$src2)">, V6_vdelta_enc;
1636*9880d681SAndroid Build Coastguard Workerdefm V6_vrdelta :
1637*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst = vrdelta($src1,$src2)">, V6_vrdelta_enc;
1638*9880d681SAndroid Build Coastguard Workerdefm V6_vdealb4w :
1639*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vdeale($src1.b,$src2.b)">, V6_vdealb4w_enc;
1640*9880d681SAndroid Build Coastguard Workerdefm V6_vpackeb :
1641*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vpacke($src1.h,$src2.h)">, V6_vpackeb_enc;
1642*9880d681SAndroid Build Coastguard Workerdefm V6_vpackeh :
1643*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vpacke($src1.w,$src2.w)">, V6_vpackeh_enc;
1644*9880d681SAndroid Build Coastguard Workerdefm V6_vpackhub_sat :
1645*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.ub = vpack($src1.h,$src2.h):sat">, V6_vpackhub_sat_enc;
1646*9880d681SAndroid Build Coastguard Workerdefm V6_vpackhb_sat :
1647*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vpack($src1.h,$src2.h):sat">, V6_vpackhb_sat_enc;
1648*9880d681SAndroid Build Coastguard Workerdefm V6_vpackwuh_sat :
1649*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.uh = vpack($src1.w,$src2.w):sat">, V6_vpackwuh_sat_enc;
1650*9880d681SAndroid Build Coastguard Workerdefm V6_vpackwh_sat :
1651*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vpack($src1.w,$src2.w):sat">, V6_vpackwh_sat_enc;
1652*9880d681SAndroid Build Coastguard Workerdefm V6_vpackob :
1653*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.b = vpacko($src1.h,$src2.h)">, V6_vpackob_enc;
1654*9880d681SAndroid Build Coastguard Workerdefm V6_vpackoh :
1655*9880d681SAndroid Build Coastguard Worker     T_HVX_alu_VV <"$dst.h = vpacko($src1.w,$src2.w)">, V6_vpackoh_enc;
1656*9880d681SAndroid Build Coastguard Worker}
1657*9880d681SAndroid Build Coastguard Worker
1658*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in
1659*9880d681SAndroid Build Coastguard Workerclass T_HVX_condALU <string asmString, RegisterClass RC1, RegisterClass RC2>
1660*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RC2:$dst),
1661*9880d681SAndroid Build Coastguard Worker                      (ins RC1:$src1, RC2:$_src_, RC2:$src2), asmString,
1662*9880d681SAndroid Build Coastguard Worker                      [], "$dst = $_src_" > {
1663*9880d681SAndroid Build Coastguard Worker  let Itinerary = CVI_VA;
1664*9880d681SAndroid Build Coastguard Worker  let Type = TypeCVI_VA;
1665*9880d681SAndroid Build Coastguard Worker}
1666*9880d681SAndroid Build Coastguard Worker
1667*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_condALU <string asmString> {
1668*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_condALU <asmString, VecPredRegs, VectorRegs>;
1669*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1670*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_condALU <asmString, VecPredRegs128B, VectorRegs128B>;
1671*9880d681SAndroid Build Coastguard Worker}
1672*9880d681SAndroid Build Coastguard Worker
1673*9880d681SAndroid Build Coastguard Workerdefm V6_vaddbq  : T_HVX_condALU <"if ($src1) $dst.b += $src2.b">,
1674*9880d681SAndroid Build Coastguard Worker                  V6_vaddbq_enc;
1675*9880d681SAndroid Build Coastguard Workerdefm V6_vaddhq  : T_HVX_condALU <"if ($src1) $dst.h += $src2.h">,
1676*9880d681SAndroid Build Coastguard Worker                  V6_vaddhq_enc;
1677*9880d681SAndroid Build Coastguard Workerdefm V6_vaddwq  : T_HVX_condALU <"if ($src1) $dst.w += $src2.w">,
1678*9880d681SAndroid Build Coastguard Worker                  V6_vaddwq_enc;
1679*9880d681SAndroid Build Coastguard Workerdefm V6_vsubbq  : T_HVX_condALU <"if ($src1) $dst.b -= $src2.b">,
1680*9880d681SAndroid Build Coastguard Worker                  V6_vsubbq_enc;
1681*9880d681SAndroid Build Coastguard Workerdefm V6_vsubhq  : T_HVX_condALU <"if ($src1) $dst.h -= $src2.h">,
1682*9880d681SAndroid Build Coastguard Worker                  V6_vsubhq_enc;
1683*9880d681SAndroid Build Coastguard Workerdefm V6_vsubwq  : T_HVX_condALU <"if ($src1) $dst.w -= $src2.w">,
1684*9880d681SAndroid Build Coastguard Worker                  V6_vsubwq_enc;
1685*9880d681SAndroid Build Coastguard Workerdefm V6_vaddbnq : T_HVX_condALU <"if (!$src1) $dst.b += $src2.b">,
1686*9880d681SAndroid Build Coastguard Worker                  V6_vaddbnq_enc;
1687*9880d681SAndroid Build Coastguard Workerdefm V6_vaddhnq : T_HVX_condALU <"if (!$src1) $dst.h += $src2.h">,
1688*9880d681SAndroid Build Coastguard Worker                  V6_vaddhnq_enc;
1689*9880d681SAndroid Build Coastguard Workerdefm V6_vaddwnq : T_HVX_condALU <"if (!$src1) $dst.w += $src2.w">,
1690*9880d681SAndroid Build Coastguard Worker                  V6_vaddwnq_enc;
1691*9880d681SAndroid Build Coastguard Workerdefm V6_vsubbnq : T_HVX_condALU <"if (!$src1) $dst.b -= $src2.b">,
1692*9880d681SAndroid Build Coastguard Worker                  V6_vsubbnq_enc;
1693*9880d681SAndroid Build Coastguard Workerdefm V6_vsubhnq : T_HVX_condALU <"if (!$src1) $dst.h -= $src2.h">,
1694*9880d681SAndroid Build Coastguard Worker                  V6_vsubhnq_enc;
1695*9880d681SAndroid Build Coastguard Workerdefm V6_vsubwnq : T_HVX_condALU <"if (!$src1) $dst.w -= $src2.w">,
1696*9880d681SAndroid Build Coastguard Worker                  V6_vsubwnq_enc;
1697*9880d681SAndroid Build Coastguard Worker
1698*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
1699*9880d681SAndroid Build Coastguard Workerclass T_HVX_alu_2op <string asmString, InstrItinClass itin,
1700*9880d681SAndroid Build Coastguard Worker                 RegisterClass RCout, RegisterClass RCin>
1701*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RCout:$dst), (ins RCin:$src1),
1702*9880d681SAndroid Build Coastguard Worker    asmString >{
1703*9880d681SAndroid Build Coastguard Worker  let Itinerary = itin;
1704*9880d681SAndroid Build Coastguard Worker  let Type = !cast<IType>("Type"#itin);
1705*9880d681SAndroid Build Coastguard Worker}
1706*9880d681SAndroid Build Coastguard Worker
1707*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_2op <string asmString, RegisterClass RCout,
1708*9880d681SAndroid Build Coastguard Worker           RegisterClass RCin, InstrItinClass itin> {
1709*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_alu_2op <asmString, itin, RCout, RCin>;
1710*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1711*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_alu_2op <asmString, itin,
1712*9880d681SAndroid Build Coastguard Worker                              !cast<RegisterClass>(RCout#"128B"),
1713*9880d681SAndroid Build Coastguard Worker                              !cast<RegisterClass>(RCin#"128B")>;
1714*9880d681SAndroid Build Coastguard Worker}
1715*9880d681SAndroid Build Coastguard Worker
1716*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
1717*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_2op_VV <string asmString>:
1718*9880d681SAndroid Build Coastguard Worker  T_HVX_alu_2op <asmString, VectorRegs, VectorRegs, CVI_VA>;
1719*9880d681SAndroid Build Coastguard Worker
1720*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu_2op_WV <string asmString>:
1721*9880d681SAndroid Build Coastguard Worker  T_HVX_alu_2op <asmString, VecDblRegs, VectorRegs, CVI_VA_DV>;
1722*9880d681SAndroid Build Coastguard Worker
1723*9880d681SAndroid Build Coastguard Worker
1724*9880d681SAndroid Build Coastguard Workerdefm V6_vabsh     : T_HVX_alu_2op_VV <"$dst.h = vabs($src1.h)">,
1725*9880d681SAndroid Build Coastguard Worker                    V6_vabsh_enc;
1726*9880d681SAndroid Build Coastguard Workerdefm V6_vabsw     : T_HVX_alu_2op_VV <"$dst.w = vabs($src1.w)">,
1727*9880d681SAndroid Build Coastguard Worker                    V6_vabsw_enc;
1728*9880d681SAndroid Build Coastguard Workerdefm V6_vabsh_sat : T_HVX_alu_2op_VV <"$dst.h = vabs($src1.h):sat">,
1729*9880d681SAndroid Build Coastguard Worker                    V6_vabsh_sat_enc;
1730*9880d681SAndroid Build Coastguard Workerdefm V6_vabsw_sat : T_HVX_alu_2op_VV <"$dst.w = vabs($src1.w):sat">,
1731*9880d681SAndroid Build Coastguard Worker                    V6_vabsw_sat_enc;
1732*9880d681SAndroid Build Coastguard Workerdefm V6_vnot      : T_HVX_alu_2op_VV <"$dst = vnot($src1)">,
1733*9880d681SAndroid Build Coastguard Worker                    V6_vnot_enc;
1734*9880d681SAndroid Build Coastguard Workerdefm V6_vassign   : T_HVX_alu_2op_VV <"$dst = $src1">,
1735*9880d681SAndroid Build Coastguard Worker                    V6_vassign_enc;
1736*9880d681SAndroid Build Coastguard Worker
1737*9880d681SAndroid Build Coastguard Workerdefm V6_vzb       : T_HVX_alu_2op_WV <"$dst.uh = vzxt($src1.ub)">,
1738*9880d681SAndroid Build Coastguard Worker                    V6_vzb_enc;
1739*9880d681SAndroid Build Coastguard Workerdefm V6_vzh       : T_HVX_alu_2op_WV <"$dst.uw = vzxt($src1.uh)">,
1740*9880d681SAndroid Build Coastguard Worker                    V6_vzh_enc;
1741*9880d681SAndroid Build Coastguard Workerdefm V6_vsb       : T_HVX_alu_2op_WV <"$dst.h = vsxt($src1.b)">,
1742*9880d681SAndroid Build Coastguard Worker                    V6_vsb_enc;
1743*9880d681SAndroid Build Coastguard Workerdefm V6_vsh       : T_HVX_alu_2op_WV <"$dst.w = vsxt($src1.h)">,
1744*9880d681SAndroid Build Coastguard Worker                    V6_vsh_enc;
1745*9880d681SAndroid Build Coastguard Worker
1746*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP, Type = TypeCVI_VP in {
1747*9880d681SAndroid Build Coastguard Workerdefm V6_vdealh    : T_HVX_alu_2op_VV <"$dst.h = vdeal($src1.h)">,
1748*9880d681SAndroid Build Coastguard Worker                    V6_vdealh_enc;
1749*9880d681SAndroid Build Coastguard Workerdefm V6_vdealb    : T_HVX_alu_2op_VV <"$dst.b = vdeal($src1.b)">,
1750*9880d681SAndroid Build Coastguard Worker                    V6_vdealb_enc;
1751*9880d681SAndroid Build Coastguard Workerdefm V6_vshuffh   : T_HVX_alu_2op_VV <"$dst.h = vshuff($src1.h)">,
1752*9880d681SAndroid Build Coastguard Worker                    V6_vshuffh_enc;
1753*9880d681SAndroid Build Coastguard Workerdefm V6_vshuffb   : T_HVX_alu_2op_VV <"$dst.b = vshuff($src1.b)">,
1754*9880d681SAndroid Build Coastguard Worker                    V6_vshuffb_enc;
1755*9880d681SAndroid Build Coastguard Worker}
1756*9880d681SAndroid Build Coastguard Worker
1757*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_VS, Type = TypeCVI_VP_VS in {
1758*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackub : T_HVX_alu_2op_WV <"$dst.uh = vunpack($src1.ub)">,
1759*9880d681SAndroid Build Coastguard Worker                    V6_vunpackub_enc;
1760*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackuh : T_HVX_alu_2op_WV <"$dst.uw = vunpack($src1.uh)">,
1761*9880d681SAndroid Build Coastguard Worker                    V6_vunpackuh_enc;
1762*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackb  : T_HVX_alu_2op_WV <"$dst.h = vunpack($src1.b)">,
1763*9880d681SAndroid Build Coastguard Worker                    V6_vunpackb_enc;
1764*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackh  : T_HVX_alu_2op_WV <"$dst.w = vunpack($src1.h)">,
1765*9880d681SAndroid Build Coastguard Worker                    V6_vunpackh_enc;
1766*9880d681SAndroid Build Coastguard Worker}
1767*9880d681SAndroid Build Coastguard Worker
1768*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VS, Type = TypeCVI_VS in {
1769*9880d681SAndroid Build Coastguard Workerdefm V6_vcl0w     : T_HVX_alu_2op_VV <"$dst.uw = vcl0($src1.uw)">,
1770*9880d681SAndroid Build Coastguard Worker                    V6_vcl0w_enc;
1771*9880d681SAndroid Build Coastguard Workerdefm V6_vcl0h     : T_HVX_alu_2op_VV <"$dst.uh = vcl0($src1.uh)">,
1772*9880d681SAndroid Build Coastguard Worker                    V6_vcl0h_enc;
1773*9880d681SAndroid Build Coastguard Workerdefm V6_vnormamtw : T_HVX_alu_2op_VV <"$dst.w = vnormamt($src1.w)">,
1774*9880d681SAndroid Build Coastguard Worker                    V6_vnormamtw_enc;
1775*9880d681SAndroid Build Coastguard Workerdefm V6_vnormamth : T_HVX_alu_2op_VV <"$dst.h = vnormamt($src1.h)">,
1776*9880d681SAndroid Build Coastguard Worker                    V6_vnormamth_enc;
1777*9880d681SAndroid Build Coastguard Workerdefm V6_vpopcounth : T_HVX_alu_2op_VV <"$dst.h = vpopcount($src1.h)">,
1778*9880d681SAndroid Build Coastguard Worker                     V6_vpopcounth_enc;
1779*9880d681SAndroid Build Coastguard Worker}
1780*9880d681SAndroid Build Coastguard Worker
1781*9880d681SAndroid Build Coastguard Workerlet isAccumulator = 1, hasNewValue = 1, Itinerary = CVI_VX_DV_LONG,
1782*9880d681SAndroid Build Coastguard Worker    Type = TypeCVI_VX_DV in
1783*9880d681SAndroid Build Coastguard Workerclass T_HVX_vmpyacc2 <string asmString, RegisterClass RC>
1784*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RC:$dst),
1785*9880d681SAndroid Build Coastguard Worker                      (ins RC:$_src_, RC:$src1, IntRegs:$src2, u1Imm:$src3),
1786*9880d681SAndroid Build Coastguard Worker    asmString, [], "$dst = $_src_" > ;
1787*9880d681SAndroid Build Coastguard Worker
1788*9880d681SAndroid Build Coastguard Worker
1789*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpyacc2 <string asmString> {
1790*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vmpyacc2 <asmString, VecDblRegs>;
1791*9880d681SAndroid Build Coastguard Worker
1792*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1793*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vmpyacc2 <asmString, VecDblRegs128B>;
1794*9880d681SAndroid Build Coastguard Worker}
1795*9880d681SAndroid Build Coastguard Worker
1796*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybusi_acc :
1797*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc2<"$dst.w += vrmpy($src1.ub,$src2.b,#$src3)">,
1798*9880d681SAndroid Build Coastguard Worker     V6_vrmpybusi_acc_enc;
1799*9880d681SAndroid Build Coastguard Workerdefm V6_vrsadubi_acc :
1800*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc2<"$dst.uw += vrsad($src1.ub,$src2.ub,#$src3)">,
1801*9880d681SAndroid Build Coastguard Worker     V6_vrsadubi_acc_enc;
1802*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyubi_acc :
1803*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpyacc2<"$dst.uw += vrmpy($src1.ub,$src2.ub,#$src3)">,
1804*9880d681SAndroid Build Coastguard Worker     V6_vrmpyubi_acc_enc;
1805*9880d681SAndroid Build Coastguard Worker
1806*9880d681SAndroid Build Coastguard Worker
1807*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VX_DV_LONG, Type = TypeCVI_VX_DV, hasNewValue = 1 in
1808*9880d681SAndroid Build Coastguard Workerclass T_HVX_vmpy2 <string asmString, RegisterClass RC>
1809*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RC:$dst), (ins RC:$src1, IntRegs:$src2, u1Imm:$src3),
1810*9880d681SAndroid Build Coastguard Worker    asmString>;
1811*9880d681SAndroid Build Coastguard Worker
1812*9880d681SAndroid Build Coastguard Worker
1813*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vmpy2 <string asmString> {
1814*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vmpy2 <asmString, VecDblRegs>;
1815*9880d681SAndroid Build Coastguard Worker
1816*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1817*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vmpy2 <asmString, VecDblRegs128B>;
1818*9880d681SAndroid Build Coastguard Worker}
1819*9880d681SAndroid Build Coastguard Worker
1820*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpybusi :
1821*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpy2 <"$dst.w = vrmpy($src1.ub,$src2.b,#$src3)">, V6_vrmpybusi_enc;
1822*9880d681SAndroid Build Coastguard Workerdefm V6_vrsadubi :
1823*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpy2 <"$dst.uw = vrsad($src1.ub,$src2.ub,#$src3)">, V6_vrsadubi_enc;
1824*9880d681SAndroid Build Coastguard Workerdefm V6_vrmpyubi :
1825*9880d681SAndroid Build Coastguard Worker     T_HVX_vmpy2 <"$dst.uw = vrmpy($src1.ub,$src2.ub,#$src3)">, V6_vrmpyubi_enc;
1826*9880d681SAndroid Build Coastguard Worker
1827*9880d681SAndroid Build Coastguard Worker
1828*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_VS_LONG_EARLY, Type = TypeCVI_VP_VS,
1829*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0, hasNewValue2 = 1, opNewValue2 = 1 in
1830*9880d681SAndroid Build Coastguard Workerclass T_HVX_perm <string asmString, RegisterClass RC>
1831*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RC:$_dst1_, RC:$_dst2_),
1832*9880d681SAndroid Build Coastguard Worker                      (ins RC:$src1, RC:$src2, IntRegs:$src3),
1833*9880d681SAndroid Build Coastguard Worker    asmString, [], "$_dst1_ = $src1, $_dst2_ = $src2" >;
1834*9880d681SAndroid Build Coastguard Worker
1835*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_perm <string asmString> {
1836*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_perm <asmString, VectorRegs>;
1837*9880d681SAndroid Build Coastguard Worker
1838*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1839*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_perm <asmString, VectorRegs128B>;
1840*9880d681SAndroid Build Coastguard Worker}
1841*9880d681SAndroid Build Coastguard Worker
1842*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0, hasNewValue2 = 1, opNewValue2 = 1 in {
1843*9880d681SAndroid Build Coastguard Worker  defm V6_vshuff : T_HVX_perm <"vshuff($src1,$src2,$src3)">, V6_vshuff_enc;
1844*9880d681SAndroid Build Coastguard Worker  defm V6_vdeal : T_HVX_perm <"vdeal($src1,$src2,$src3)">, V6_vdeal_enc;
1845*9880d681SAndroid Build Coastguard Worker}
1846*9880d681SAndroid Build Coastguard Worker
1847*9880d681SAndroid Build Coastguard Worker// Conditional vector move.
1848*9880d681SAndroid Build Coastguard Workerlet isPredicated = 1, hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
1849*9880d681SAndroid Build Coastguard Workerclass T_HVX_cmov <bit isPredNot, RegisterClass RC>
1850*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RC:$dst), (ins PredRegs:$src1, RC:$src2),
1851*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) $dst = $src2"> {
1852*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
1853*9880d681SAndroid Build Coastguard Worker}
1854*9880d681SAndroid Build Coastguard Worker
1855*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_cmov <bit isPredNot = 0> {
1856*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_cmov <isPredNot, VectorRegs>;
1857*9880d681SAndroid Build Coastguard Worker
1858*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1859*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_cmov <isPredNot, VectorRegs128B>;
1860*9880d681SAndroid Build Coastguard Worker}
1861*9880d681SAndroid Build Coastguard Worker
1862*9880d681SAndroid Build Coastguard Workerdefm V6_vcmov : T_HVX_cmov, V6_vcmov_enc;
1863*9880d681SAndroid Build Coastguard Workerdefm V6_vncmov : T_HVX_cmov<1>, V6_vncmov_enc;
1864*9880d681SAndroid Build Coastguard Worker
1865*9880d681SAndroid Build Coastguard Worker// Conditional vector combine.
1866*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA_DV, Type = TypeCVI_VA_DV, isPredicated = 1,
1867*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0, hasNewValue = 1, opNewValue = 0 in
1868*9880d681SAndroid Build Coastguard Workerclass T_HVX_ccombine <bit isPredNot, RegisterClass RCout, RegisterClass RCin>
1869*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 < (outs RCout:$dst),
1870*9880d681SAndroid Build Coastguard Worker    (ins PredRegs:$src1, RCin:$src2, RCin:$src3),
1871*9880d681SAndroid Build Coastguard Worker    "if ("#!if(isPredNot, "!", "")#"$src1) $dst = vcombine($src2,$src3)"> {
1872*9880d681SAndroid Build Coastguard Worker  let isPredicatedFalse = isPredNot;
1873*9880d681SAndroid Build Coastguard Worker}
1874*9880d681SAndroid Build Coastguard Worker
1875*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_ccombine <bit isPredNot = 0> {
1876*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_ccombine <isPredNot, VecDblRegs, VectorRegs>;
1877*9880d681SAndroid Build Coastguard Worker
1878*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1879*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_ccombine <isPredNot, VecDblRegs128B, VectorRegs128B>;
1880*9880d681SAndroid Build Coastguard Worker}
1881*9880d681SAndroid Build Coastguard Worker
1882*9880d681SAndroid Build Coastguard Workerdefm V6_vccombine : T_HVX_ccombine, V6_vccombine_enc;
1883*9880d681SAndroid Build Coastguard Workerdefm V6_vnccombine : T_HVX_ccombine<1>, V6_vnccombine_enc;
1884*9880d681SAndroid Build Coastguard Worker
1885*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
1886*9880d681SAndroid Build Coastguard Workerclass T_HVX_shift <string asmString, RegisterClass RCout, RegisterClass RCin>
1887*9880d681SAndroid Build Coastguard Worker  : CVI_VX_DV_Resource1<(outs RCout:$dst),
1888*9880d681SAndroid Build Coastguard Worker    (ins RCin:$src1, RCin:$src2, IntRegsLow8:$src3),
1889*9880d681SAndroid Build Coastguard Worker    asmString >;
1890*9880d681SAndroid Build Coastguard Worker
1891*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_shift <string asmString, RegisterClass RCout,
1892*9880d681SAndroid Build Coastguard Worker                        RegisterClass RCin> {
1893*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_shift <asmString, RCout, RCin>;
1894*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1895*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_shift <asmString, !cast<RegisterClass>(RCout#"128B"),
1896*9880d681SAndroid Build Coastguard Worker                                           !cast<RegisterClass>(RCin#"128B")>;
1897*9880d681SAndroid Build Coastguard Worker}
1898*9880d681SAndroid Build Coastguard Worker
1899*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_shift_VV <string asmString>:
1900*9880d681SAndroid Build Coastguard Worker  T_HVX_shift <asmString, VectorRegs, VectorRegs>;
1901*9880d681SAndroid Build Coastguard Worker
1902*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_shift_WV <string asmString>:
1903*9880d681SAndroid Build Coastguard Worker  T_HVX_shift <asmString, VecDblRegs, VectorRegs>;
1904*9880d681SAndroid Build Coastguard Worker
1905*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_LONG, Type = TypeCVI_VP in {
1906*9880d681SAndroid Build Coastguard Workerdefm V6_valignb :
1907*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst = valign($src1,$src2,$src3)">, V6_valignb_enc;
1908*9880d681SAndroid Build Coastguard Workerdefm V6_vlalignb :
1909*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst = vlalign($src1,$src2,$src3)">, V6_vlalignb_enc;
1910*9880d681SAndroid Build Coastguard Worker}
1911*9880d681SAndroid Build Coastguard Worker
1912*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VS, Type = TypeCVI_VS in {
1913*9880d681SAndroid Build Coastguard Workerdefm V6_vasrwh :
1914*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.h = vasr($src1.w,$src2.w,$src3)">, V6_vasrwh_enc;
1915*9880d681SAndroid Build Coastguard Workerdefm V6_vasrwhsat :
1916*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.h = vasr($src1.w,$src2.w,$src3):sat">,
1917*9880d681SAndroid Build Coastguard Worker     V6_vasrwhsat_enc;
1918*9880d681SAndroid Build Coastguard Workerdefm V6_vasrwhrndsat :
1919*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.h = vasr($src1.w,$src2.w,$src3):rnd:sat">,
1920*9880d681SAndroid Build Coastguard Worker     V6_vasrwhrndsat_enc;
1921*9880d681SAndroid Build Coastguard Workerdefm V6_vasrwuhsat :
1922*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.uh = vasr($src1.w,$src2.w,$src3):sat">,
1923*9880d681SAndroid Build Coastguard Worker     V6_vasrwuhsat_enc;
1924*9880d681SAndroid Build Coastguard Workerdefm V6_vasrhubsat :
1925*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.ub = vasr($src1.h,$src2.h,$src3):sat">,
1926*9880d681SAndroid Build Coastguard Worker     V6_vasrhubsat_enc;
1927*9880d681SAndroid Build Coastguard Workerdefm V6_vasrhubrndsat :
1928*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.ub = vasr($src1.h,$src2.h,$src3):rnd:sat">,
1929*9880d681SAndroid Build Coastguard Worker     V6_vasrhubrndsat_enc;
1930*9880d681SAndroid Build Coastguard Workerdefm V6_vasrhbrndsat :
1931*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_VV <"$dst.b = vasr($src1.h,$src2.h,$src3):rnd:sat">,
1932*9880d681SAndroid Build Coastguard Worker     V6_vasrhbrndsat_enc;
1933*9880d681SAndroid Build Coastguard Worker}
1934*9880d681SAndroid Build Coastguard Worker
1935*9880d681SAndroid Build Coastguard Worker// Assembler mapped -- alias?
1936*9880d681SAndroid Build Coastguard Worker//defm V6_vtran2x2vdd : T_HVX_shift_VV <"">, V6_vtran2x2vdd_enc;
1937*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_VS_LONG, Type = TypeCVI_VP_VS in {
1938*9880d681SAndroid Build Coastguard Workerdefm V6_vshuffvdd :
1939*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_WV <"$dst = vshuff($src1,$src2,$src3)">, V6_vshuffvdd_enc;
1940*9880d681SAndroid Build Coastguard Workerdefm V6_vdealvdd :
1941*9880d681SAndroid Build Coastguard Worker     T_HVX_shift_WV <"$dst = vdeal($src1,$src2,$src3)">, V6_vdealvdd_enc;
1942*9880d681SAndroid Build Coastguard Worker}
1943*9880d681SAndroid Build Coastguard Worker
1944*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, Itinerary = CVI_VP_VS_LONG, Type = TypeCVI_VP_VS in
1945*9880d681SAndroid Build Coastguard Workerclass T_HVX_unpack <string asmString, RegisterClass RCout, RegisterClass RCin>
1946*9880d681SAndroid Build Coastguard Worker  : CVI_VX_DV_Resource1<(outs RCout:$dst), (ins RCout:$_src_, RCin:$src1),
1947*9880d681SAndroid Build Coastguard Worker    asmString, [], "$dst = $_src_">;
1948*9880d681SAndroid Build Coastguard Worker
1949*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_unpack <string asmString> {
1950*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_unpack <asmString, VecDblRegs, VectorRegs>;
1951*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1952*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_unpack <asmString, VecDblRegs128B, VectorRegs128B>;
1953*9880d681SAndroid Build Coastguard Worker}
1954*9880d681SAndroid Build Coastguard Worker
1955*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackob : T_HVX_unpack <"$dst.h |= vunpacko($src1.b)">, V6_vunpackob_enc;
1956*9880d681SAndroid Build Coastguard Workerdefm V6_vunpackoh : T_HVX_unpack <"$dst.w |= vunpacko($src1.h)">, V6_vunpackoh_enc;
1957*9880d681SAndroid Build Coastguard Worker
1958*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_LONG, Type = TypeCVI_VP, hasNewValue = 1,
1959*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0 in
1960*9880d681SAndroid Build Coastguard Workerclass T_HVX_valign <string asmString, RegisterClass RC>
1961*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RC:$dst), (ins RC:$src1, RC:$src2, u3Imm:$src3),
1962*9880d681SAndroid Build Coastguard Worker    asmString>;
1963*9880d681SAndroid Build Coastguard Worker
1964*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_valign <string asmString> {
1965*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_valign <asmString, VectorRegs>;
1966*9880d681SAndroid Build Coastguard Worker
1967*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1968*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_valign <asmString, VectorRegs128B>;
1969*9880d681SAndroid Build Coastguard Worker}
1970*9880d681SAndroid Build Coastguard Worker
1971*9880d681SAndroid Build Coastguard Workerdefm V6_valignbi :
1972*9880d681SAndroid Build Coastguard Worker     T_HVX_valign <"$dst = valign($src1,$src2,#$src3)">, V6_valignbi_enc;
1973*9880d681SAndroid Build Coastguard Workerdefm V6_vlalignbi :
1974*9880d681SAndroid Build Coastguard Worker     T_HVX_valign <"$dst = vlalign($src1,$src2,#$src3)">, V6_vlalignbi_enc;
1975*9880d681SAndroid Build Coastguard Worker
1976*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA_DV, Type = TypeCVI_VA_DV in
1977*9880d681SAndroid Build Coastguard Workerclass T_HVX_predAlu <string asmString, RegisterClass RC>
1978*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RC:$dst), (ins RC:$src1, RC:$src2),
1979*9880d681SAndroid Build Coastguard Worker    asmString>;
1980*9880d681SAndroid Build Coastguard Worker
1981*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_predAlu <string asmString> {
1982*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_predAlu <asmString, VecPredRegs>;
1983*9880d681SAndroid Build Coastguard Worker
1984*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
1985*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_predAlu <asmString, VecPredRegs128B>;
1986*9880d681SAndroid Build Coastguard Worker}
1987*9880d681SAndroid Build Coastguard Worker
1988*9880d681SAndroid Build Coastguard Workerdefm V6_pred_and  : T_HVX_predAlu <"$dst = and($src1,$src2)">, V6_pred_and_enc;
1989*9880d681SAndroid Build Coastguard Workerdefm V6_pred_or   : T_HVX_predAlu <"$dst = or($src1,$src2)">, V6_pred_or_enc;
1990*9880d681SAndroid Build Coastguard Workerdefm V6_pred_xor  : T_HVX_predAlu <"$dst = xor($src1,$src2)">, V6_pred_xor_enc;
1991*9880d681SAndroid Build Coastguard Workerdefm V6_pred_or_n : T_HVX_predAlu <"$dst = or($src1,!$src2)">, V6_pred_or_n_enc;
1992*9880d681SAndroid Build Coastguard Workerdefm V6_pred_and_n :
1993*9880d681SAndroid Build Coastguard Worker     T_HVX_predAlu <"$dst = and($src1,!$src2)">, V6_pred_and_n_enc;
1994*9880d681SAndroid Build Coastguard Worker
1995*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA, Type = TypeCVI_VA in
1996*9880d681SAndroid Build Coastguard Workerclass T_HVX_prednot <RegisterClass RC>
1997*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RC:$dst), (ins RC:$src1),
1998*9880d681SAndroid Build Coastguard Worker    "$dst = not($src1)">, V6_pred_not_enc;
1999*9880d681SAndroid Build Coastguard Worker
2000*9880d681SAndroid Build Coastguard Workerdef V6_pred_not : T_HVX_prednot <VecPredRegs>;
2001*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly =  1 in
2002*9880d681SAndroid Build Coastguard Workerdef V6_pred_not_128B : T_HVX_prednot <VecPredRegs128B>;
2003*9880d681SAndroid Build Coastguard Worker
2004*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA, Type = TypeCVI_VA in
2005*9880d681SAndroid Build Coastguard Workerclass T_HVX_vcmp2 <string asmString, RegisterClass RCout, RegisterClass RCin>
2006*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1 <(outs RCout:$dst), (ins RCin:$src1, RCin:$src2),
2007*9880d681SAndroid Build Coastguard Worker    asmString >;
2008*9880d681SAndroid Build Coastguard Worker
2009*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vcmp2 <string asmString> {
2010*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vcmp2 <asmString, VecPredRegs, VectorRegs>;
2011*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
2012*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vcmp2 <asmString, VecPredRegs128B, VectorRegs128B>;
2013*9880d681SAndroid Build Coastguard Worker}
2014*9880d681SAndroid Build Coastguard Worker
2015*9880d681SAndroid Build Coastguard Workerdefm V6_veqb : T_HVX_vcmp2  <"$dst = vcmp.eq($src1.b,$src2.b)">, V6_veqb_enc;
2016*9880d681SAndroid Build Coastguard Workerdefm V6_veqh : T_HVX_vcmp2  <"$dst = vcmp.eq($src1.h,$src2.h)">, V6_veqh_enc;
2017*9880d681SAndroid Build Coastguard Workerdefm V6_veqw : T_HVX_vcmp2  <"$dst = vcmp.eq($src1.w,$src2.w)">, V6_veqw_enc;
2018*9880d681SAndroid Build Coastguard Workerdefm V6_vgtb : T_HVX_vcmp2  <"$dst = vcmp.gt($src1.b,$src2.b)">, V6_vgtb_enc;
2019*9880d681SAndroid Build Coastguard Workerdefm V6_vgth : T_HVX_vcmp2  <"$dst = vcmp.gt($src1.h,$src2.h)">, V6_vgth_enc;
2020*9880d681SAndroid Build Coastguard Workerdefm V6_vgtw : T_HVX_vcmp2  <"$dst = vcmp.gt($src1.w,$src2.w)">, V6_vgtw_enc;
2021*9880d681SAndroid Build Coastguard Workerdefm V6_vgtub : T_HVX_vcmp2 <"$dst = vcmp.gt($src1.ub,$src2.ub)">, V6_vgtub_enc;
2022*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuh : T_HVX_vcmp2 <"$dst = vcmp.gt($src1.uh,$src2.uh)">, V6_vgtuh_enc;
2023*9880d681SAndroid Build Coastguard Workerdefm V6_vgtuw : T_HVX_vcmp2 <"$dst = vcmp.gt($src1.uw,$src2.uw)">, V6_vgtuw_enc;
2024*9880d681SAndroid Build Coastguard Worker
2025*9880d681SAndroid Build Coastguard Workerlet isAccumulator = 1, hasNewValue = 1, hasSideEffects = 0 in
2026*9880d681SAndroid Build Coastguard Workerclass T_V6_vandqrt_acc <RegisterClass RCout, RegisterClass RCin>
2027*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RCout:$dst),
2028*9880d681SAndroid Build Coastguard Worker    (ins RCout:$_src_, RCin:$src1, IntRegs:$src2),
2029*9880d681SAndroid Build Coastguard Worker    "$dst |= vand($src1,$src2)", [], "$dst = $_src_">, V6_vandqrt_acc_enc;
2030*9880d681SAndroid Build Coastguard Worker
2031*9880d681SAndroid Build Coastguard Workerdef V6_vandqrt_acc : T_V6_vandqrt_acc <VectorRegs, VecPredRegs>;
2032*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2033*9880d681SAndroid Build Coastguard Workerdef V6_vandqrt_acc_128B : T_V6_vandqrt_acc <VectorRegs128B, VecPredRegs128B>;
2034*9880d681SAndroid Build Coastguard Worker
2035*9880d681SAndroid Build Coastguard Workerlet isAccumulator = 1 in
2036*9880d681SAndroid Build Coastguard Workerclass T_V6_vandvrt_acc <RegisterClass RCout, RegisterClass RCin>
2037*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RCout:$dst),
2038*9880d681SAndroid Build Coastguard Worker    (ins RCout:$_src_, RCin:$src1, IntRegs:$src2),
2039*9880d681SAndroid Build Coastguard Worker    "$dst |= vand($src1,$src2)", [], "$dst = $_src_">, V6_vandvrt_acc_enc;
2040*9880d681SAndroid Build Coastguard Worker
2041*9880d681SAndroid Build Coastguard Workerdef V6_vandvrt_acc : T_V6_vandvrt_acc <VecPredRegs, VectorRegs>;
2042*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2043*9880d681SAndroid Build Coastguard Workerdef V6_vandvrt_acc_128B : T_V6_vandvrt_acc <VecPredRegs128B, VectorRegs128B>;
2044*9880d681SAndroid Build Coastguard Worker
2045*9880d681SAndroid Build Coastguard Workerlet hasNewValue =  1, hasSideEffects = 0 in
2046*9880d681SAndroid Build Coastguard Workerclass T_V6_vandqrt <RegisterClass RCout, RegisterClass RCin>
2047*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RCout:$dst),
2048*9880d681SAndroid Build Coastguard Worker    (ins RCin:$src1, IntRegs:$src2),
2049*9880d681SAndroid Build Coastguard Worker    "$dst = vand($src1,$src2)" >, V6_vandqrt_enc;
2050*9880d681SAndroid Build Coastguard Worker
2051*9880d681SAndroid Build Coastguard Workerdef V6_vandqrt : T_V6_vandqrt <VectorRegs, VecPredRegs>;
2052*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2053*9880d681SAndroid Build Coastguard Workerdef V6_vandqrt_128B : T_V6_vandqrt <VectorRegs128B, VecPredRegs128B>;
2054*9880d681SAndroid Build Coastguard Worker
2055*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, hasSideEffects = 0 in
2056*9880d681SAndroid Build Coastguard Workerclass T_V6_lvsplatw <RegisterClass RC>
2057*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RC:$dst), (ins IntRegs:$src1),
2058*9880d681SAndroid Build Coastguard Worker    "$dst = vsplat($src1)" >, V6_lvsplatw_enc;
2059*9880d681SAndroid Build Coastguard Worker
2060*9880d681SAndroid Build Coastguard Workerdef V6_lvsplatw : T_V6_lvsplatw <VectorRegs>;
2061*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2062*9880d681SAndroid Build Coastguard Workerdef V6_lvsplatw_128B : T_V6_lvsplatw <VectorRegs128B>;
2063*9880d681SAndroid Build Coastguard Worker
2064*9880d681SAndroid Build Coastguard Worker
2065*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in
2066*9880d681SAndroid Build Coastguard Workerclass T_V6_vinsertwr <RegisterClass RC>
2067*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RC:$dst), (ins RC:$_src_, IntRegs:$src1),
2068*9880d681SAndroid Build Coastguard Worker    "$dst.w = vinsert($src1)", [], "$dst = $_src_">,
2069*9880d681SAndroid Build Coastguard Worker    V6_vinsertwr_enc;
2070*9880d681SAndroid Build Coastguard Worker
2071*9880d681SAndroid Build Coastguard Workerdef V6_vinsertwr : T_V6_vinsertwr <VectorRegs>;
2072*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2073*9880d681SAndroid Build Coastguard Workerdef V6_vinsertwr_128B : T_V6_vinsertwr <VectorRegs128B>;
2074*9880d681SAndroid Build Coastguard Worker
2075*9880d681SAndroid Build Coastguard Worker
2076*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_LONG, Type = TypeCVI_VP in
2077*9880d681SAndroid Build Coastguard Workerclass T_V6_pred_scalar2 <RegisterClass RC>
2078*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RC:$dst), (ins IntRegs:$src1),
2079*9880d681SAndroid Build Coastguard Worker    "$dst = vsetq($src1)">, V6_pred_scalar2_enc;
2080*9880d681SAndroid Build Coastguard Worker
2081*9880d681SAndroid Build Coastguard Workerdef V6_pred_scalar2 : T_V6_pred_scalar2 <VecPredRegs>;
2082*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2083*9880d681SAndroid Build Coastguard Workerdef V6_pred_scalar2_128B : T_V6_pred_scalar2 <VecPredRegs128B>;
2084*9880d681SAndroid Build Coastguard Worker
2085*9880d681SAndroid Build Coastguard Workerclass T_V6_vandvrt <RegisterClass RCout, RegisterClass RCin>
2086*9880d681SAndroid Build Coastguard Worker  : CVI_VX_Resource_late<(outs RCout:$dst), (ins RCin:$src1, IntRegs:$src2),
2087*9880d681SAndroid Build Coastguard Worker    "$dst = vand($src1,$src2)">, V6_vandvrt_enc;
2088*9880d681SAndroid Build Coastguard Worker
2089*9880d681SAndroid Build Coastguard Workerdef V6_vandvrt : T_V6_vandvrt <VecPredRegs, VectorRegs>;
2090*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2091*9880d681SAndroid Build Coastguard Workerdef V6_vandvrt_128B : T_V6_vandvrt <VecPredRegs128B, VectorRegs128B>;
2092*9880d681SAndroid Build Coastguard Worker
2093*9880d681SAndroid Build Coastguard Workerlet validSubTargets = HasV60SubT in
2094*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol <string asmString, RegisterClass RC, Operand ImmOp >
2095*9880d681SAndroid Build Coastguard Worker  : SInst2 <(outs RC:$dst), (ins  RC:$src1, ImmOp:$src2), asmString>;
2096*9880d681SAndroid Build Coastguard Worker
2097*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol_R <string asmString>
2098*9880d681SAndroid Build Coastguard Worker  : T_HVX_rol <asmString, IntRegs, u5Imm>;
2099*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol_P <string asmString>
2100*9880d681SAndroid Build Coastguard Worker  : T_HVX_rol <asmString, DoubleRegs, u6Imm>;
2101*9880d681SAndroid Build Coastguard Worker
2102*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p : T_HVX_rol_P <"$dst = rol($src1,#$src2)">, S6_rol_i_p_enc;
2103*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in
2104*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r : T_HVX_rol_R <"$dst = rol($src1,#$src2)">, S6_rol_i_r_enc;
2105*9880d681SAndroid Build Coastguard Worker
2106*9880d681SAndroid Build Coastguard Workerlet validSubTargets = HasV60SubT in
2107*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol_acc <string asmString, RegisterClass RC, Operand ImmOp>
2108*9880d681SAndroid Build Coastguard Worker  : SInst2 <(outs RC:$dst), (ins RC:$_src_, RC:$src1, ImmOp:$src2),
2109*9880d681SAndroid Build Coastguard Worker    asmString, [], "$dst = $_src_" >;
2110*9880d681SAndroid Build Coastguard Worker
2111*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol_acc_P <string asmString>
2112*9880d681SAndroid Build Coastguard Worker  : T_HVX_rol_acc <asmString, DoubleRegs, u6Imm>;
2113*9880d681SAndroid Build Coastguard Worker
2114*9880d681SAndroid Build Coastguard Workerclass T_HVX_rol_acc_R <string asmString>
2115*9880d681SAndroid Build Coastguard Worker  : T_HVX_rol_acc <asmString, IntRegs, u5Imm>;
2116*9880d681SAndroid Build Coastguard Worker
2117*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p_nac :
2118*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_P <"$dst -= rol($src1,#$src2)">, S6_rol_i_p_nac_enc;
2119*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p_acc :
2120*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_P <"$dst += rol($src1,#$src2)">, S6_rol_i_p_acc_enc;
2121*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p_and :
2122*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_P <"$dst &= rol($src1,#$src2)">, S6_rol_i_p_and_enc;
2123*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p_or  :
2124*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_P <"$dst |= rol($src1,#$src2)">, S6_rol_i_p_or_enc;
2125*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_p_xacc :
2126*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_P<"$dst ^= rol($src1,#$src2)">, S6_rol_i_p_xacc_enc;
2127*9880d681SAndroid Build Coastguard Worker
2128*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1, opNewValue = 0 in {
2129*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r_nac :
2130*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_R <"$dst -= rol($src1,#$src2)">, S6_rol_i_r_nac_enc;
2131*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r_acc :
2132*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_R <"$dst += rol($src1,#$src2)">, S6_rol_i_r_acc_enc;
2133*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r_and :
2134*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_R <"$dst &= rol($src1,#$src2)">, S6_rol_i_r_and_enc;
2135*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r_or :
2136*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_R <"$dst |= rol($src1,#$src2)">, S6_rol_i_r_or_enc;
2137*9880d681SAndroid Build Coastguard Workerdef S6_rol_i_r_xacc :
2138*9880d681SAndroid Build Coastguard Worker    T_HVX_rol_acc_R <"$dst ^= rol($src1,#$src2)">, S6_rol_i_r_xacc_enc;
2139*9880d681SAndroid Build Coastguard Worker}
2140*9880d681SAndroid Build Coastguard Worker
2141*9880d681SAndroid Build Coastguard Workerlet isSolo = 1, Itinerary = LD_tc_ld_SLOT0, Type = TypeLD in
2142*9880d681SAndroid Build Coastguard Workerclass T_V6_extractw <RegisterClass RC>
2143*9880d681SAndroid Build Coastguard Worker  : LD1Inst <(outs IntRegs:$dst), (ins RC:$src1, IntRegs:$src2),
2144*9880d681SAndroid Build Coastguard Worker    "$dst = vextract($src1,$src2)">, V6_extractw_enc;
2145*9880d681SAndroid Build Coastguard Worker
2146*9880d681SAndroid Build Coastguard Workerdef V6_extractw : T_V6_extractw <VectorRegs>;
2147*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1 in
2148*9880d681SAndroid Build Coastguard Workerdef V6_extractw_128B : T_V6_extractw <VectorRegs128B>;
2149*9880d681SAndroid Build Coastguard Worker
2150*9880d681SAndroid Build Coastguard Workerlet Itinerary = ST_tc_st_SLOT0, validSubTargets = HasV55SubT  in
2151*9880d681SAndroid Build Coastguard Workerclass T_sys0op <string asmString>
2152*9880d681SAndroid Build Coastguard Worker  : ST1Inst <(outs), (ins), asmString>;
2153*9880d681SAndroid Build Coastguard Worker
2154*9880d681SAndroid Build Coastguard Workerlet isSolo = 1, validSubTargets = HasV55SubT in {
2155*9880d681SAndroid Build Coastguard Workerdef Y5_l2gunlock   : T_sys0op <"l2gunlock">, Y5_l2gunlock_enc;
2156*9880d681SAndroid Build Coastguard Workerdef Y5_l2gclean    : T_sys0op <"l2gclean">, Y5_l2gclean_enc;
2157*9880d681SAndroid Build Coastguard Workerdef Y5_l2gcleaninv : T_sys0op <"l2gcleaninv">, Y5_l2gcleaninv_enc;
2158*9880d681SAndroid Build Coastguard Worker}
2159*9880d681SAndroid Build Coastguard Worker
2160*9880d681SAndroid Build Coastguard Workerclass T_sys1op <string asmString, RegisterClass RC>
2161*9880d681SAndroid Build Coastguard Worker  : ST1Inst <(outs), (ins RC:$src1), asmString>;
2162*9880d681SAndroid Build Coastguard Worker
2163*9880d681SAndroid Build Coastguard Workerclass T_sys1op_R <string asmString> : T_sys1op <asmString, IntRegs>;
2164*9880d681SAndroid Build Coastguard Workerclass T_sys1op_P <string asmString> : T_sys1op <asmString, DoubleRegs>;
2165*9880d681SAndroid Build Coastguard Worker
2166*9880d681SAndroid Build Coastguard Workerlet isSoloAX = 1, validSubTargets = HasV55SubT in
2167*9880d681SAndroid Build Coastguard Workerdef Y5_l2unlocka     : T_sys1op_R <"l2unlocka($src1)">, Y5_l2unlocka_enc;
2168*9880d681SAndroid Build Coastguard Worker
2169*9880d681SAndroid Build Coastguard Workerlet isSolo = 1, validSubTargets = HasV60SubT in {
2170*9880d681SAndroid Build Coastguard Workerdef Y6_l2gcleanpa    : T_sys1op_P <"l2gclean($src1)">, Y6_l2gcleanpa_enc;
2171*9880d681SAndroid Build Coastguard Workerdef Y6_l2gcleaninvpa : T_sys1op_P <"l2gcleaninv($src1)">, Y6_l2gcleaninvpa_enc;
2172*9880d681SAndroid Build Coastguard Worker}
2173*9880d681SAndroid Build Coastguard Worker
2174*9880d681SAndroid Build Coastguard Workerlet Itinerary = ST_tc_3stall_SLOT0, isPredicateLate = 1, isSoloAX = 1,
2175*9880d681SAndroid Build Coastguard Worker    validSubTargets = HasV55SubT in
2176*9880d681SAndroid Build Coastguard Workerdef Y5_l2locka : ST1Inst <(outs PredRegs:$dst), (ins IntRegs:$src1),
2177*9880d681SAndroid Build Coastguard Worker  "$dst = l2locka($src1)">, Y5_l2locka_enc;
2178*9880d681SAndroid Build Coastguard Worker
2179*9880d681SAndroid Build Coastguard Worker// not defined on etc side. why?
2180*9880d681SAndroid Build Coastguard Worker// defm S2_cabacencbin : _VV <"Rdd=encbin(Rss,$src2,Pu)">, S2_cabacencbin_enc;
2181*9880d681SAndroid Build Coastguard Worker
2182*9880d681SAndroid Build Coastguard Workerlet Defs = [USR_OVF], Itinerary = M_tc_3stall_SLOT23, isPredicateLate = 1,
2183*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0,
2184*9880d681SAndroid Build Coastguard WorkervalidSubTargets = HasV55SubT in
2185*9880d681SAndroid Build Coastguard Workerdef A5_ACS : MInst2 <(outs DoubleRegs:$dst1, PredRegs:$dst2),
2186*9880d681SAndroid Build Coastguard Worker  (ins DoubleRegs:$_src_, DoubleRegs:$src1, DoubleRegs:$src2),
2187*9880d681SAndroid Build Coastguard Worker  "$dst1,$dst2 = vacsh($src1,$src2)", [],
2188*9880d681SAndroid Build Coastguard Worker  "$dst1 = $_src_" >, Requires<[HasV55T]>, A5_ACS_enc;
2189*9880d681SAndroid Build Coastguard Worker
2190*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA_DV, Type = TypeCVI_VA_DV, hasNewValue = 1,
2191*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0 in
2192*9880d681SAndroid Build Coastguard Workerclass T_HVX_alu2 <string asmString, RegisterClass RCout, RegisterClass RCin1,
2193*9880d681SAndroid Build Coastguard Worker                  RegisterClass RCin2>
2194*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RCout:$dst),
2195*9880d681SAndroid Build Coastguard Worker    (ins RCin1:$src1, RCin2:$src2, RCin2:$src3), asmString>;
2196*9880d681SAndroid Build Coastguard Worker
2197*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu2 <string asmString, RegisterClass RC > {
2198*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_alu2 <asmString, RC, VecPredRegs, VectorRegs>;
2199*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
2200*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_alu2 <asmString, !cast<RegisterClass>(RC#"128B"),
2201*9880d681SAndroid Build Coastguard Worker                               VecPredRegs128B, VectorRegs128B>;
2202*9880d681SAndroid Build Coastguard Worker}
2203*9880d681SAndroid Build Coastguard Worker
2204*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu2_V <string asmString> :
2205*9880d681SAndroid Build Coastguard Worker  T_HVX_alu2 <asmString, VectorRegs>;
2206*9880d681SAndroid Build Coastguard Worker
2207*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_alu2_W <string asmString> :
2208*9880d681SAndroid Build Coastguard Worker  T_HVX_alu2 <asmString, VecDblRegs>;
2209*9880d681SAndroid Build Coastguard Worker
2210*9880d681SAndroid Build Coastguard Workerdefm V6_vswap : T_HVX_alu2_W <"$dst = vswap($src1,$src2,$src3)">, V6_vswap_enc;
2211*9880d681SAndroid Build Coastguard Worker
2212*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VA, Type = TypeCVI_VA, hasNewValue = 1,
2213*9880d681SAndroid Build Coastguard Worker    hasSideEffects = 0 in
2214*9880d681SAndroid Build Coastguard Workerdefm V6_vmux  : T_HVX_alu2_V <"$dst = vmux($src1,$src2,$src3)">, V6_vmux_enc;
2215*9880d681SAndroid Build Coastguard Worker
2216*9880d681SAndroid Build Coastguard Workerclass T_HVX_vlutb <string asmString, RegisterClass RCout, RegisterClass RCin>
2217*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RCout:$dst),
2218*9880d681SAndroid Build Coastguard Worker    (ins RCin:$src1, RCin:$src2, IntRegsLow8:$src3), asmString>;
2219*9880d681SAndroid Build Coastguard Worker
2220*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb <string asmString, RegisterClass RCout,
2221*9880d681SAndroid Build Coastguard Worker                        RegisterClass RCin> {
2222*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vlutb <asmString, RCout, RCin>;
2223*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
2224*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vlutb <asmString, !cast<RegisterClass>(RCout#"128B"),
2225*9880d681SAndroid Build Coastguard Worker                                           !cast<RegisterClass>(RCin#"128B")>;
2226*9880d681SAndroid Build Coastguard Worker}
2227*9880d681SAndroid Build Coastguard Worker
2228*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb_V <string asmString> :
2229*9880d681SAndroid Build Coastguard Worker  T_HVX_vlutb <asmString, VectorRegs, VectorRegs>;
2230*9880d681SAndroid Build Coastguard Worker
2231*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb_W <string asmString> :
2232*9880d681SAndroid Build Coastguard Worker  T_HVX_vlutb <asmString, VecDblRegs, VectorRegs>;
2233*9880d681SAndroid Build Coastguard Worker
2234*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_VS_LONG, Type = TypeCVI_VP_VS, isAccumulator = 1 in
2235*9880d681SAndroid Build Coastguard Workerclass T_HVX_vlutb_acc <string asmString, RegisterClass RCout,
2236*9880d681SAndroid Build Coastguard Worker                       RegisterClass RCin>
2237*9880d681SAndroid Build Coastguard Worker  : CVI_VA_Resource1<(outs RCout:$dst),
2238*9880d681SAndroid Build Coastguard Worker    (ins RCout:$_src_, RCin:$src1, RCin:$src2, IntRegsLow8:$src3),
2239*9880d681SAndroid Build Coastguard Worker    asmString, [], "$dst = $_src_">;
2240*9880d681SAndroid Build Coastguard Worker
2241*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb_acc <string asmString, RegisterClass RCout,
2242*9880d681SAndroid Build Coastguard Worker                            RegisterClass RCin> {
2243*9880d681SAndroid Build Coastguard Worker  def NAME : T_HVX_vlutb_acc <asmString, RCout, RCin>;
2244*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1 in
2245*9880d681SAndroid Build Coastguard Worker  def NAME#_128B : T_HVX_vlutb_acc<asmString,
2246*9880d681SAndroid Build Coastguard Worker                                   !cast<RegisterClass>(RCout#"128B"),
2247*9880d681SAndroid Build Coastguard Worker                                   !cast<RegisterClass>(RCin#"128B")>;
2248*9880d681SAndroid Build Coastguard Worker}
2249*9880d681SAndroid Build Coastguard Worker
2250*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb_acc_V <string asmString> :
2251*9880d681SAndroid Build Coastguard Worker  T_HVX_vlutb_acc <asmString, VectorRegs, VectorRegs>;
2252*9880d681SAndroid Build Coastguard Worker
2253*9880d681SAndroid Build Coastguard Workermulticlass T_HVX_vlutb_acc_W <string asmString> :
2254*9880d681SAndroid Build Coastguard Worker  T_HVX_vlutb_acc <asmString, VecDblRegs, VectorRegs>;
2255*9880d681SAndroid Build Coastguard Worker
2256*9880d681SAndroid Build Coastguard Worker
2257*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_LONG, Type = TypeCVI_VP, hasNewValue = 1 in
2258*9880d681SAndroid Build Coastguard Workerdefm V6_vlutvvb:
2259*9880d681SAndroid Build Coastguard Worker     T_HVX_vlutb_V <"$dst.b = vlut32($src1.b,$src2.b,$src3)">, V6_vlutvvb_enc;
2260*9880d681SAndroid Build Coastguard Worker
2261*9880d681SAndroid Build Coastguard Workerlet Itinerary = CVI_VP_VS_LONG, Type = TypeCVI_VP_VS, hasNewValue = 1 in
2262*9880d681SAndroid Build Coastguard Workerdefm V6_vlutvwh:
2263*9880d681SAndroid Build Coastguard Worker     T_HVX_vlutb_W <"$dst.h = vlut16($src1.b,$src2.h,$src3)">, V6_vlutvwh_enc;
2264*9880d681SAndroid Build Coastguard Worker
2265*9880d681SAndroid Build Coastguard Workerlet hasNewValue = 1 in {
2266*9880d681SAndroid Build Coastguard Worker  defm V6_vlutvvb_oracc:
2267*9880d681SAndroid Build Coastguard Worker       T_HVX_vlutb_acc_V <"$dst.b |= vlut32($src1.b,$src2.b,$src3)">,
2268*9880d681SAndroid Build Coastguard Worker       V6_vlutvvb_oracc_enc;
2269*9880d681SAndroid Build Coastguard Worker  defm V6_vlutvwh_oracc:
2270*9880d681SAndroid Build Coastguard Worker       T_HVX_vlutb_acc_W <"$dst.h |= vlut16($src1.b,$src2.h,$src3)">,
2271*9880d681SAndroid Build Coastguard Worker       V6_vlutvwh_oracc_enc;
2272*9880d681SAndroid Build Coastguard Worker}
2273*9880d681SAndroid Build Coastguard Worker
2274*9880d681SAndroid Build Coastguard Worker// It's a fake instruction and should not be defined?
2275*9880d681SAndroid Build Coastguard Workerdef S2_cabacencbin
2276*9880d681SAndroid Build Coastguard Worker  : SInst2<(outs DoubleRegs:$dst),
2277*9880d681SAndroid Build Coastguard Worker          (ins DoubleRegs:$src1, DoubleRegs:$src2, PredRegs:$src3),
2278*9880d681SAndroid Build Coastguard Worker    "$dst = encbin($src1,$src2,$src3)">, S2_cabacencbin_enc;
2279*9880d681SAndroid Build Coastguard Worker
2280*9880d681SAndroid Build Coastguard Worker// Vhist instructions
2281*9880d681SAndroid Build Coastguard Workerdef V6_vhistq
2282*9880d681SAndroid Build Coastguard Worker  : CVI_HIST_Resource1 <(outs), (ins VecPredRegs:$src1),
2283*9880d681SAndroid Build Coastguard Worker    "vhist($src1)">, V6_vhistq_enc;
2284*9880d681SAndroid Build Coastguard Worker
2285*9880d681SAndroid Build Coastguard Workerdef V6_vhist
2286*9880d681SAndroid Build Coastguard Worker  : CVI_HIST_Resource1 <(outs), (ins),
2287*9880d681SAndroid Build Coastguard Worker    "vhist" >, V6_vhist_enc;
2288