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