1;; Machine description of the Synopsys DesignWare ARC cpu for GNU C compiler
2;; Copyright (C) 2007-2020 Free Software Foundation, Inc.
3
4;; This file is part of GCC.
5
6;; GCC is free software; you can redistribute it and/or modify
7;; it under the terms of the GNU General Public License as published by
8;; the Free Software Foundation; either version 3, or (at your option)
9;; any later version.
10
11;; GCC is distributed in the hope that it will be useful,
12;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14;; GNU General Public License for more details.
15
16;; You should have received a copy of the GNU General Public License
17;; along with GCC; see the file COPYING3.  If not see
18;; <http://www.gnu.org/licenses/>.
19
20(define_c_enum "unspec" [
21  ;; Va, Vb, Vc builtins
22  UNSPEC_ARC_SIMD_VADDAW
23  UNSPEC_ARC_SIMD_VADDW
24  UNSPEC_ARC_SIMD_VAVB
25  UNSPEC_ARC_SIMD_VAVRB
26  UNSPEC_ARC_SIMD_VDIFAW
27  UNSPEC_ARC_SIMD_VDIFW
28  UNSPEC_ARC_SIMD_VMAXAW
29  UNSPEC_ARC_SIMD_VMAXW
30  UNSPEC_ARC_SIMD_VMINAW
31  UNSPEC_ARC_SIMD_VMINW
32  UNSPEC_ARC_SIMD_VMULAW
33  UNSPEC_ARC_SIMD_VMULFAW
34  UNSPEC_ARC_SIMD_VMULFW
35  UNSPEC_ARC_SIMD_VMULW
36  UNSPEC_ARC_SIMD_VSUBAW
37  UNSPEC_ARC_SIMD_VSUBW
38  UNSPEC_ARC_SIMD_VSUMMW
39  UNSPEC_ARC_SIMD_VAND
40  UNSPEC_ARC_SIMD_VANDAW
41  UNSPEC_ARC_SIMD_VBIC
42  UNSPEC_ARC_SIMD_VBICAW
43  UNSPEC_ARC_SIMD_VOR
44  UNSPEC_ARC_SIMD_VXOR
45  UNSPEC_ARC_SIMD_VXORAW
46  UNSPEC_ARC_SIMD_VEQW
47  UNSPEC_ARC_SIMD_VLEW
48  UNSPEC_ARC_SIMD_VLTW
49  UNSPEC_ARC_SIMD_VNEW
50  UNSPEC_ARC_SIMD_VMR1AW
51  UNSPEC_ARC_SIMD_VMR1W
52  UNSPEC_ARC_SIMD_VMR2AW
53  UNSPEC_ARC_SIMD_VMR2W
54  UNSPEC_ARC_SIMD_VMR3AW
55  UNSPEC_ARC_SIMD_VMR3W
56  UNSPEC_ARC_SIMD_VMR4AW
57  UNSPEC_ARC_SIMD_VMR4W
58  UNSPEC_ARC_SIMD_VMR5AW
59  UNSPEC_ARC_SIMD_VMR5W
60  UNSPEC_ARC_SIMD_VMR6AW
61  UNSPEC_ARC_SIMD_VMR6W
62  UNSPEC_ARC_SIMD_VMR7AW
63  UNSPEC_ARC_SIMD_VMR7W
64  UNSPEC_ARC_SIMD_VMRB
65  UNSPEC_ARC_SIMD_VH264F
66  UNSPEC_ARC_SIMD_VH264FT
67  UNSPEC_ARC_SIMD_VH264FW
68  UNSPEC_ARC_SIMD_VVC1F
69  UNSPEC_ARC_SIMD_VVC1FT
70  ;; Va, Vb, rc/limm builtins
71  UNSPEC_ARC_SIMD_VBADDW
72  UNSPEC_ARC_SIMD_VBMAXW
73  UNSPEC_ARC_SIMD_VBMINW
74  UNSPEC_ARC_SIMD_VBMULAW
75  UNSPEC_ARC_SIMD_VBMULFW
76  UNSPEC_ARC_SIMD_VBMULW
77  UNSPEC_ARC_SIMD_VBRSUBW
78  UNSPEC_ARC_SIMD_VBSUBW
79
80  ;; Va, Vb, Ic builtins
81  UNSPEC_ARC_SIMD_VASRW
82  UNSPEC_ARC_SIMD_VSR8
83  UNSPEC_ARC_SIMD_VSR8AW
84
85  ;; Va, Vb, Ic builtins
86  UNSPEC_ARC_SIMD_VASRRWi
87  UNSPEC_ARC_SIMD_VASRSRWi
88  UNSPEC_ARC_SIMD_VASRWi
89  UNSPEC_ARC_SIMD_VASRPWBi
90  UNSPEC_ARC_SIMD_VASRRPWBi
91  UNSPEC_ARC_SIMD_VSR8AWi
92  UNSPEC_ARC_SIMD_VSR8i
93
94  ;; Va, Vb, u8 (simm) builtins
95  UNSPEC_ARC_SIMD_VMVAW
96  UNSPEC_ARC_SIMD_VMVW
97  UNSPEC_ARC_SIMD_VMVZW
98  UNSPEC_ARC_SIMD_VD6TAPF
99
100  ;; Va, rlimm, u8 (simm) builtins
101  UNSPEC_ARC_SIMD_VMOVAW
102  UNSPEC_ARC_SIMD_VMOVW
103  UNSPEC_ARC_SIMD_VMOVZW
104
105  ;; Va, Vb builtins
106  UNSPEC_ARC_SIMD_VABSAW
107  UNSPEC_ARC_SIMD_VABSW
108  UNSPEC_ARC_SIMD_VADDSUW
109  UNSPEC_ARC_SIMD_VSIGNW
110  UNSPEC_ARC_SIMD_VEXCH1
111  UNSPEC_ARC_SIMD_VEXCH2
112  UNSPEC_ARC_SIMD_VEXCH4
113  UNSPEC_ARC_SIMD_VUPBAW
114  UNSPEC_ARC_SIMD_VUPBW
115  UNSPEC_ARC_SIMD_VUPSBAW
116  UNSPEC_ARC_SIMD_VUPSBW
117
118  UNSPEC_ARC_SIMD_VDIRUN
119  UNSPEC_ARC_SIMD_VDORUN
120  UNSPEC_ARC_SIMD_VDIWR
121  UNSPEC_ARC_SIMD_VDOWR
122
123  UNSPEC_ARC_SIMD_VREC
124  UNSPEC_ARC_SIMD_VRUN
125  UNSPEC_ARC_SIMD_VRECRUN
126  UNSPEC_ARC_SIMD_VENDREC
127
128  UNSPEC_ARC_SIMD_VCAST
129  UNSPEC_ARC_SIMD_VINTI
130  ])
131
132;; Scheduler descriptions for the simd instructions
133(define_insn_reservation "simd_lat_0_insn" 1
134  (eq_attr "type" "simd_dma, simd_vstore, simd_vcontrol")
135  "issue+simd_unit")
136
137(define_insn_reservation "simd_lat_1_insn" 2
138       (eq_attr "type" "simd_vcompare, simd_vlogic,
139			simd_vmove_else_zero, simd_varith_1cycle")
140  "issue+simd_unit, nothing")
141
142(define_insn_reservation "simd_lat_2_insn" 3
143       (eq_attr "type" "simd_valign, simd_vpermute,
144			simd_vpack, simd_varith_2cycle")
145  "issue+simd_unit, nothing*2")
146
147(define_insn_reservation "simd_lat_3_insn" 4
148       (eq_attr "type" "simd_valign_with_acc, simd_vpack_with_acc,
149			simd_vlogic_with_acc, simd_vload128,
150			simd_vmove_with_acc, simd_vspecial_3cycle,
151			simd_varith_with_acc")
152  "issue+simd_unit, nothing*3")
153
154(define_insn_reservation "simd_lat_4_insn" 5
155       (eq_attr "type" "simd_vload, simd_vmove, simd_vspecial_4cycle")
156  "issue+simd_unit, nothing*4")
157
158(define_expand "movv8hi"
159  [(set (match_operand:V8HI 0 "general_operand" "")
160	(match_operand:V8HI 1 "general_operand" ""))]
161  ""
162  "
163{
164  /* Everything except mem = const or mem = mem can be done easily.  */
165
166  if (GET_CODE (operands[0]) == MEM && GET_CODE(operands[1]) == MEM)
167    operands[1] = force_reg (V8HImode, operands[1]);
168}")
169
170;; This pattern should appear before the movv8hi_insn pattern
171(define_insn "vld128_insn"
172  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
173	(mem:V8HI (plus:SI (zero_extend:SI (vec_select:HI (match_operand:V8HI 1 "vector_register_operand"  "v")
174							  (parallel [(match_operand:SI 2 "immediate_operand" "L")])))
175			   (match_operand:SI 3 "immediate_operand" "P"))))]
176 "TARGET_SIMD_SET"
177 "vld128 %0, [i%2, %3]"
178 [(set_attr "type" "simd_vload128")
179  (set_attr "length" "4")
180  (set_attr "cond" "nocond")]
181)
182
183(define_insn "vst128_insn"
184  [(set	(mem:V8HI (plus:SI (zero_extend:SI (vec_select:HI (match_operand:V8HI 0 "vector_register_operand"  "v")
185							  (parallel [(match_operand:SI 1 "immediate_operand" "L")])))
186			   (match_operand:SI 2 "immediate_operand" "P")))
187	(match_operand:V8HI 3 "vector_register_operand" "=v"))]
188 "TARGET_SIMD_SET"
189 "vst128 %3, [i%1, %2]"
190 [(set_attr "type" "simd_vstore")
191  (set_attr "length" "4")
192  (set_attr "cond" "nocond")]
193)
194
195(define_insn "vst64_insn"
196  [(set	(mem:V4HI
197	 (plus:SI
198	  (zero_extend:SI
199	   (vec_select:HI (match_operand:V8HI 0 "vector_register_operand"  "v")
200			  (parallel
201			   [(match_operand:SI 1 "immediate_operand" "L")])))
202	  (match_operand:SI 2 "immediate_operand" "P")))
203	(vec_select:V4HI
204	 (match_operand:V8HI 3 "vector_register_operand" "=v")
205	 (parallel [(const_int 0) (const_int 1) (const_int 2) (const_int 3)])))]
206 "TARGET_SIMD_SET"
207 "vst64 %3, [i%1, %2]"
208 [(set_attr "type" "simd_vstore")
209  (set_attr "length" "4")
210  (set_attr "cond" "nocond")]
211)
212
213(define_insn "movv8hi_insn"
214  [(set (match_operand:V8HI 0 "vector_register_or_memory_operand" "=v,m,v")
215	(match_operand:V8HI 1 "vector_register_or_memory_operand" "m,v,v"))]
216  "TARGET_SIMD_SET && !(GET_CODE (operands[0]) == MEM && GET_CODE(operands[1]) == MEM)"
217  "@
218    vld128r %0, %1
219    vst128r %1, %0
220    vmvzw %0,%1,0xffff"
221  [(set_attr "type" "simd_vload128,simd_vstore,simd_vmove_else_zero")
222   (set_attr "length" "8,8,4")
223   (set_attr "cond" "nocond, nocond, nocond")])
224
225(define_insn "movti_insn"
226  [(set (match_operand:TI 0 "vector_register_or_memory_operand" "=v,m,v")
227	(match_operand:TI 1 "vector_register_or_memory_operand" "m,v,v"))]
228  ""
229  "@
230    vld128r %0, %1
231    vst128r %1, %0
232    vmvzw %0,%1,0xffff"
233  [(set_attr "type" "simd_vload128,simd_vstore,simd_vmove_else_zero")
234   (set_attr "length" "8,8,4")
235   (set_attr "cond" "nocond, nocond, nocond")])
236
237;; (define_insn "*movv8hi_insn_rr"
238;;   [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
239;; 	(match_operand:V8HI 1 "vector_register_operand" "v"))]
240;;   ""
241;;   "mov reg,reg"
242;;   [(set_attr "length" "8")
243;;   (set_attr "type" "move")])
244
245;; (define_insn "*movv8_out"
246;;   [(set (match_operand:V8HI 0 "memory_operand" "=m")
247;; 	(match_operand:V8HI 1 "vector_register_operand" "v"))]
248;;   ""
249;;   "mov out"
250;;   [(set_attr "length" "8")
251;;   (set_attr "type" "move")])
252
253
254;; (define_insn "addv8hi3"
255;;   [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
256;; 	(plus:V8HI (match_operand:V8HI 1 "vector_register_operand"  "v")
257;; 		   (match_operand:V8HI 2 "vector_register_operand" "v")))]
258;;   "TARGET_SIMD_SET"
259;;   "vaddw %0, %1, %2"
260;;   [(set_attr "length" "8")
261;;    (set_attr "cond" "nocond")])
262
263;; (define_insn "vaddw_insn"
264;;   [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
265;; 	(unspec [(match_operand:V8HI 1 "vector_register_operand"  "v")
266;; 			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VADDW))]
267;;   "TARGET_SIMD_SET"
268;;   "vaddw %0, %1, %2"
269;;   [(set_attr "length" "8")
270;;    (set_attr "cond" "nocond")])
271
272;; V V V Insns
273(define_insn "vaddaw_insn"
274  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
275	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
276			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VADDAW))]
277  "TARGET_SIMD_SET"
278  "vaddaw %0, %1, %2"
279  [(set_attr "type" "simd_varith_with_acc")
280   (set_attr "length" "4")
281   (set_attr "cond" "nocond")])
282
283(define_insn "vaddw_insn"
284  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
285	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
286			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VADDW))]
287  "TARGET_SIMD_SET"
288  "vaddw %0, %1, %2"
289  [(set_attr "type" "simd_varith_1cycle")
290   (set_attr "length" "4")
291   (set_attr "cond" "nocond")])
292
293(define_insn "vavb_insn"
294  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
295	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
296			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VAVB))]
297  "TARGET_SIMD_SET"
298  "vavb %0, %1, %2"
299  [(set_attr "type" "simd_varith_1cycle")
300   (set_attr "length" "4")
301   (set_attr "cond" "nocond")])
302
303(define_insn "vavrb_insn"
304  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
305	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
306			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VAVRB))]
307  "TARGET_SIMD_SET"
308  "vavrb %0, %1, %2"
309  [(set_attr "type" "simd_varith_1cycle")
310   (set_attr "length" "4")
311   (set_attr "cond" "nocond")])
312
313(define_insn "vdifaw_insn"
314  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
315	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
316			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VDIFAW))]
317  "TARGET_SIMD_SET"
318  "vdifaw %0, %1, %2"
319  [(set_attr "type" "simd_varith_with_acc")
320   (set_attr "length" "4")
321   (set_attr "cond" "nocond")])
322
323(define_insn "vdifw_insn"
324  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
325	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
326			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VDIFW))]
327  "TARGET_SIMD_SET"
328  "vdifw %0, %1, %2"
329  [(set_attr "type" "simd_varith_1cycle")
330   (set_attr "length" "4")
331   (set_attr "cond" "nocond")])
332
333(define_insn "vmaxaw_insn"
334  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
335	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
336			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMAXAW))]
337  "TARGET_SIMD_SET"
338  "vmaxaw %0, %1, %2"
339  [(set_attr "type" "simd_varith_with_acc")
340   (set_attr "length" "4")
341   (set_attr "cond" "nocond")])
342
343(define_insn "vmaxw_insn"
344  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
345	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
346			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMAXW))]
347  "TARGET_SIMD_SET"
348  "vmaxw %0, %1, %2"
349  [(set_attr "type" "simd_varith_1cycle")
350   (set_attr "length" "4")
351   (set_attr "cond" "nocond")])
352
353(define_insn "vminaw_insn"
354  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
355	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
356			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMINAW))]
357  "TARGET_SIMD_SET"
358  "vminaw %0, %1, %2"
359  [(set_attr "type" "simd_varith_with_acc")
360   (set_attr "length" "4")
361   (set_attr "cond" "nocond")])
362
363(define_insn "vminw_insn"
364  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
365	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
366			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMINW))]
367  "TARGET_SIMD_SET"
368  "vminw %0, %1, %2"
369  [(set_attr "type" "simd_varith_1cycle")
370   (set_attr "length" "4")
371   (set_attr "cond" "nocond")])
372
373(define_insn "vmulaw_insn"
374  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
375	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
376			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMULAW))]
377  "TARGET_SIMD_SET"
378  "vmulaw %0, %1, %2"
379  [(set_attr "type" "simd_varith_with_acc")
380   (set_attr "length" "4")
381   (set_attr "cond" "nocond")])
382
383(define_insn "vmulfaw_insn"
384  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
385	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
386			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMULFAW))]
387  "TARGET_SIMD_SET"
388  "vmulfaw %0, %1, %2"
389  [(set_attr "type" "simd_varith_with_acc")
390   (set_attr "length" "4")
391   (set_attr "cond" "nocond")])
392
393(define_insn "vmulfw_insn"
394  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
395	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
396			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMULFW))]
397  "TARGET_SIMD_SET"
398  "vmulfw %0, %1, %2"
399  [(set_attr "type" "simd_varith_2cycle")
400   (set_attr "length" "4")
401   (set_attr "cond" "nocond")])
402
403(define_insn "vmulw_insn"
404  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
405	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
406			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMULW))]
407  "TARGET_SIMD_SET"
408  "vmulw %0, %1, %2"
409  [(set_attr "type" "simd_varith_2cycle")
410   (set_attr "length" "4")
411   (set_attr "cond" "nocond")])
412
413(define_insn "vsubaw_insn"
414  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
415	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
416			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VSUBAW))]
417  "TARGET_SIMD_SET"
418  "vsubaw %0, %1, %2"
419  [(set_attr "type" "simd_varith_with_acc")
420   (set_attr "length" "4")
421   (set_attr "cond" "nocond")])
422
423(define_insn "vsubw_insn"
424  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
425	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
426			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VSUBW))]
427  "TARGET_SIMD_SET"
428  "vsubw %0, %1, %2"
429  [(set_attr "type" "simd_varith_1cycle")
430   (set_attr "length" "4")
431   (set_attr "cond" "nocond")])
432
433(define_insn "vsummw_insn"
434  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
435	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
436			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VSUMMW))]
437  "TARGET_SIMD_SET"
438  "vsummw %0, %1, %2"
439  [(set_attr "type" "simd_varith_2cycle")
440   (set_attr "length" "4")
441   (set_attr "cond" "nocond")])
442
443(define_insn "vand_insn"
444  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
445	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
446			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VAND))]
447  "TARGET_SIMD_SET"
448  "vand %0, %1, %2"
449  [(set_attr "type" "simd_vlogic")
450   (set_attr "length" "4")
451   (set_attr "cond" "nocond")])
452
453(define_insn "vandaw_insn"
454  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
455	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
456			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VANDAW))]
457  "TARGET_SIMD_SET"
458  "vandaw %0, %1, %2"
459  [(set_attr "type" "simd_vlogic_with_acc")
460   (set_attr "length" "4")
461   (set_attr "cond" "nocond")])
462
463(define_insn "vbic_insn"
464  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
465	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
466			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VBIC))]
467  "TARGET_SIMD_SET"
468  "vbic %0, %1, %2"
469  [(set_attr "type" "simd_vlogic")
470   (set_attr "length" "4")
471   (set_attr "cond" "nocond")])
472
473(define_insn "vbicaw_insn"
474  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
475	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
476			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VBICAW))]
477  "TARGET_SIMD_SET"
478  "vbicaw %0, %1, %2"
479  [(set_attr "type" "simd_vlogic_with_acc")
480   (set_attr "length" "4")
481   (set_attr "cond" "nocond")])
482
483(define_insn "vor_insn"
484  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
485	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
486			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VOR))]
487  "TARGET_SIMD_SET"
488  "vor %0, %1, %2"
489  [(set_attr "type" "simd_vlogic")
490   (set_attr "length" "4")
491   (set_attr "cond" "nocond")])
492
493(define_insn "vxor_insn"
494  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
495	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
496			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VXOR))]
497  "TARGET_SIMD_SET"
498  "vxor %0, %1, %2"
499  [(set_attr "type" "simd_vlogic")
500   (set_attr "length" "4")
501   (set_attr "cond" "nocond")])
502
503(define_insn "vxoraw_insn"
504  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
505	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
506			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VXORAW))]
507  "TARGET_SIMD_SET"
508  "vxoraw %0, %1, %2"
509  [(set_attr "type" "simd_vlogic_with_acc")
510   (set_attr "length" "4")
511   (set_attr "cond" "nocond")])
512
513(define_insn "veqw_insn"
514  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
515	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
516			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VEQW))]
517  "TARGET_SIMD_SET"
518  "veqw %0, %1, %2"
519  [(set_attr "type" "simd_vcompare")
520   (set_attr "length" "4")
521   (set_attr "cond" "nocond")])
522
523(define_insn "vlew_insn"
524  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
525	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
526			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VLEW))]
527  "TARGET_SIMD_SET"
528  "vlew %0, %1, %2"
529  [(set_attr "type" "simd_vcompare")
530   (set_attr "length" "4")
531   (set_attr "cond" "nocond")])
532
533(define_insn "vltw_insn"
534  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
535	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
536			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VLTW))]
537  "TARGET_SIMD_SET"
538  "vltw %0, %1, %2"
539  [(set_attr "type" "simd_vcompare")
540   (set_attr "length" "4")
541   (set_attr "cond" "nocond")])
542
543(define_insn "vnew_insn"
544  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
545	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
546			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VNEW))]
547  "TARGET_SIMD_SET"
548  "vnew %0, %1, %2"
549  [(set_attr "type" "simd_vcompare")
550   (set_attr "length" "4")
551   (set_attr "cond" "nocond")])
552
553(define_insn "vmr1aw_insn"
554  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
555	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
556			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR1AW))]
557  "TARGET_SIMD_SET"
558  "vmr1aw %0, %1, %2"
559  [(set_attr "type" "simd_valign_with_acc")
560   (set_attr "length" "4")
561   (set_attr "cond" "nocond")])
562
563(define_insn "vmr1w_insn"
564  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
565	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
566			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR1W))]
567  "TARGET_SIMD_SET"
568  "vmr1w %0, %1, %2"
569  [(set_attr "type" "simd_valign")
570   (set_attr "length" "4")
571   (set_attr "cond" "nocond")])
572
573(define_insn "vmr2aw_insn"
574  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
575	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
576			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR2AW))]
577  "TARGET_SIMD_SET"
578  "vmr2aw %0, %1, %2"
579  [(set_attr "type" "simd_valign_with_acc")
580   (set_attr "length" "4")
581   (set_attr "cond" "nocond")])
582
583(define_insn "vmr2w_insn"
584  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
585	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
586			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR2W))]
587  "TARGET_SIMD_SET"
588  "vmr2w %0, %1, %2"
589  [(set_attr "type" "simd_valign")
590   (set_attr "length" "4")
591   (set_attr "cond" "nocond")])
592
593(define_insn "vmr3aw_insn"
594  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
595	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
596			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR3AW))]
597  "TARGET_SIMD_SET"
598  "vmr3aw %0, %1, %2"
599  [(set_attr "type" "simd_valign_with_acc")
600   (set_attr "length" "4")
601   (set_attr "cond" "nocond")])
602
603(define_insn "vmr3w_insn"
604  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
605	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
606			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR3W))]
607  "TARGET_SIMD_SET"
608  "vmr3w %0, %1, %2"
609  [(set_attr "type" "simd_valign")
610   (set_attr "length" "4")
611   (set_attr "cond" "nocond")])
612
613(define_insn "vmr4aw_insn"
614  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
615	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
616			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR4AW))]
617  "TARGET_SIMD_SET"
618  "vmr4aw %0, %1, %2"
619  [(set_attr "type" "simd_valign_with_acc")
620   (set_attr "length" "4")
621   (set_attr "cond" "nocond")])
622
623(define_insn "vmr4w_insn"
624  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
625	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
626			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR4W))]
627  "TARGET_SIMD_SET"
628  "vmr4w %0, %1, %2"
629  [(set_attr "type" "simd_valign")
630   (set_attr "length" "4")
631   (set_attr "cond" "nocond")])
632
633(define_insn "vmr5aw_insn"
634  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
635	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
636			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR5AW))]
637  "TARGET_SIMD_SET"
638  "vmr5aw %0, %1, %2"
639  [(set_attr "type" "simd_valign_with_acc")
640   (set_attr "length" "4")
641   (set_attr "cond" "nocond")])
642
643(define_insn "vmr5w_insn"
644  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
645	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
646			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR5W))]
647  "TARGET_SIMD_SET"
648  "vmr5w %0, %1, %2"
649  [(set_attr "type" "simd_valign")
650   (set_attr "length" "4")
651   (set_attr "cond" "nocond")])
652
653(define_insn "vmr6aw_insn"
654  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
655	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
656			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR6AW))]
657  "TARGET_SIMD_SET"
658  "vmr6aw %0, %1, %2"
659  [(set_attr "type" "simd_valign_with_acc")
660   (set_attr "length" "4")
661   (set_attr "cond" "nocond")])
662
663(define_insn "vmr6w_insn"
664  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
665	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
666			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR6W))]
667  "TARGET_SIMD_SET"
668  "vmr6w %0, %1, %2"
669  [(set_attr "type" "simd_valign")
670   (set_attr "length" "4")
671   (set_attr "cond" "nocond")])
672
673(define_insn "vmr7aw_insn"
674  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
675	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
676			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR7AW))]
677  "TARGET_SIMD_SET"
678  "vmr7aw %0, %1, %2"
679  [(set_attr "type" "simd_valign_with_acc")
680   (set_attr "length" "4")
681   (set_attr "cond" "nocond")])
682
683(define_insn "vmr7w_insn"
684  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
685	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
686			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMR7W))]
687  "TARGET_SIMD_SET"
688  "vmr7w %0, %1, %2"
689  [(set_attr "type" "simd_valign")
690   (set_attr "length" "4")
691   (set_attr "cond" "nocond")])
692
693(define_insn "vmrb_insn"
694  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
695	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
696			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VMRB))]
697  "TARGET_SIMD_SET"
698  "vmrb %0, %1, %2"
699  [(set_attr "type" "simd_valign")
700   (set_attr "length" "4")
701   (set_attr "cond" "nocond")])
702
703(define_insn "vh264f_insn"
704  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
705	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
706			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VH264F))]
707  "TARGET_SIMD_SET"
708  "vh264f %0, %1, %2"
709  [(set_attr "type" "simd_vspecial_3cycle")
710   (set_attr "length" "4")
711   (set_attr "cond" "nocond")])
712
713(define_insn "vh264ft_insn"
714  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
715	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
716			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VH264FT))]
717  "TARGET_SIMD_SET"
718  "vh264ft %0, %1, %2"
719  [(set_attr "type" "simd_vspecial_3cycle")
720   (set_attr "length" "4")
721   (set_attr "cond" "nocond")])
722
723(define_insn "vh264fw_insn"
724  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
725	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
726			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VH264FW))]
727  "TARGET_SIMD_SET"
728  "vh264fw %0, %1, %2"
729  [(set_attr "type" "simd_vspecial_3cycle")
730   (set_attr "length" "4")
731   (set_attr "cond" "nocond")])
732
733(define_insn "vvc1f_insn"
734  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
735	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
736			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VVC1F))]
737  "TARGET_SIMD_SET"
738  "vvc1f %0, %1, %2"
739  [(set_attr "type" "simd_vspecial_3cycle")
740   (set_attr "length" "4")
741   (set_attr "cond" "nocond")])
742
743(define_insn "vvc1ft_insn"
744  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
745	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
746			 (match_operand:V8HI 2 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VVC1FT))]
747  "TARGET_SIMD_SET"
748  "vvc1ft %0, %1, %2"
749  [(set_attr "type" "simd_vspecial_3cycle")
750   (set_attr "length" "4")
751   (set_attr "cond" "nocond")])
752
753
754
755;;---
756;; V V r/limm Insns
757
758;; (define_insn "vbaddw_insn"
759;;   [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
760;; 	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
761;; 			      (match_operand:SI 2 "nonmemory_operand" "rCal")] UNSPEC_ARC_SIMD_VBADDW))]
762;;   "TARGET_SIMD_SET"
763;;   "vbaddw %0, %1, %2"
764;;   [(set_attr "length" "4")
765;;    (set_attr "cond" "nocond")])
766
767(define_insn "vbaddw_insn"
768  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
769	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
770		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBADDW))]
771  "TARGET_SIMD_SET"
772  "vbaddw %0, %1, %2"
773  [(set_attr "type" "simd_varith_1cycle")
774   (set_attr "length" "4")
775   (set_attr "cond" "nocond")])
776
777(define_insn "vbmaxw_insn"
778  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
779	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
780		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBMAXW))]
781  "TARGET_SIMD_SET"
782  "vbmaxw %0, %1, %2"
783  [(set_attr "type" "simd_varith_1cycle")
784   (set_attr "length" "4")
785   (set_attr "cond" "nocond")])
786
787(define_insn "vbminw_insn"
788  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
789	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
790		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBMINW))]
791  "TARGET_SIMD_SET"
792  "vbminw %0, %1, %2"
793  [(set_attr "type" "simd_varith_1cycle")
794   (set_attr "length" "4")
795   (set_attr "cond" "nocond")])
796
797(define_insn "vbmulaw_insn"
798  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
799	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
800		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBMULAW))]
801  "TARGET_SIMD_SET"
802  "vbmulaw %0, %1, %2"
803  [(set_attr "type" "simd_varith_with_acc")
804   (set_attr "length" "4")
805   (set_attr "cond" "nocond")])
806
807(define_insn "vbmulfw_insn"
808  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
809	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
810		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBMULFW))]
811  "TARGET_SIMD_SET"
812  "vbmulfw %0, %1, %2"
813  [(set_attr "type" "simd_varith_2cycle")
814   (set_attr "length" "4")
815   (set_attr "cond" "nocond")])
816
817(define_insn "vbmulw_insn"
818  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
819	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
820		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBMULW))]
821  "TARGET_SIMD_SET"
822  "vbmulw %0, %1, %2"
823  [(set_attr "type" "simd_varith_2cycle")
824   (set_attr "length" "4")
825   (set_attr "cond" "nocond")])
826
827(define_insn "vbrsubw_insn"
828  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
829	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
830		     (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBRSUBW))]
831  "TARGET_SIMD_SET"
832  "vbrsubw %0, %1, %2"
833  [(set_attr "type" "simd_varith_1cycle")
834   (set_attr "length" "4")
835   (set_attr "cond" "nocond")])
836
837(define_insn "vbsubw_insn"
838  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
839	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
840		      (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VBSUBW))]
841  "TARGET_SIMD_SET"
842  "vbsubw %0, %1, %2"
843  [(set_attr "type" "simd_varith_1cycle")
844   (set_attr "length" "4")
845   (set_attr "cond" "nocond")])
846; Va, Vb, Ic instructions
847
848; Va, Vb, u6 instructions
849(define_insn "vasrrwi_insn"
850  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
851	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
852		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VASRRWi))]
853  "TARGET_SIMD_SET"
854  "vasrrwi %0, %1, %2"
855  [(set_attr "type" "simd_varith_2cycle")
856   (set_attr "length" "4")
857   (set_attr "cond" "nocond")])
858
859(define_insn "vasrsrwi_insn"
860  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
861	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
862		     (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VASRSRWi))]
863  "TARGET_SIMD_SET"
864  "vasrsrwi %0, %1, %2"
865  [(set_attr "type" "simd_varith_2cycle")
866   (set_attr "length" "4")
867   (set_attr "cond" "nocond")])
868
869(define_insn "vasrwi_insn"
870  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
871	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
872		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VASRWi))]
873  "TARGET_SIMD_SET"
874  "vasrwi %0, %1, %2"
875  [(set_attr "type" "simd_varith_1cycle")
876   (set_attr "length" "4")
877   (set_attr "cond" "nocond")])
878
879(define_insn "vasrpwbi_insn"
880  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
881	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
882		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VASRPWBi))]
883  "TARGET_SIMD_SET"
884  "vasrpwbi %0, %1, %2"
885  [(set_attr "type" "simd_vpack")
886   (set_attr "length" "4")
887   (set_attr "cond" "nocond")])
888
889(define_insn "vasrrpwbi_insn"
890  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
891	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
892		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VASRRPWBi))]
893  "TARGET_SIMD_SET"
894  "vasrrpwbi %0, %1, %2"
895  [(set_attr "type" "simd_vpack")
896   (set_attr "length" "4")
897   (set_attr "cond" "nocond")])
898
899(define_insn "vsr8awi_insn"
900  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
901	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
902		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VSR8AWi))]
903  "TARGET_SIMD_SET"
904  "vsr8awi %0, %1, %2"
905  [(set_attr "type" "simd_valign_with_acc")
906   (set_attr "length" "4")
907   (set_attr "cond" "nocond")])
908
909(define_insn "vsr8i_insn"
910  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
911	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
912		      (match_operand:SI 2 "immediate_operand" "L")] UNSPEC_ARC_SIMD_VSR8i))]
913  "TARGET_SIMD_SET"
914  "vsr8i %0, %1, %2"
915  [(set_attr "type" "simd_valign")
916   (set_attr "length" "4")
917   (set_attr "cond" "nocond")])
918
919;; Va, Vb, u8 (simm) insns
920
921(define_insn "vmvaw_insn"
922  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
923	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
924		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMVAW))]
925  "TARGET_SIMD_SET"
926  "vmvaw %0, %1, %2"
927  [(set_attr "type" "simd_vmove_with_acc")
928   (set_attr "length" "4")
929   (set_attr "cond" "nocond")])
930
931(define_insn "vmvw_insn"
932  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
933	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
934		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMVW))]
935  "TARGET_SIMD_SET"
936  "vmvw %0, %1, %2"
937  [(set_attr "type" "simd_vmove")
938   (set_attr "length" "4")
939   (set_attr "cond" "nocond")])
940
941(define_insn "vmvzw_insn"
942  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
943	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
944		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMVZW))]
945  "TARGET_SIMD_SET"
946  "vmvzw %0, %1, %2"
947  [(set_attr "type" "simd_vmove_else_zero")
948   (set_attr "length" "4")
949   (set_attr "cond" "nocond")])
950
951(define_insn "vd6tapf_insn"
952  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
953	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
954		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VD6TAPF))]
955  "TARGET_SIMD_SET"
956  "vd6tapf %0, %1, %2"
957  [(set_attr "type" "simd_vspecial_4cycle")
958   (set_attr "length" "4")
959   (set_attr "cond" "nocond")])
960
961;; Va, rlimm, u8 (simm) insns
962(define_insn "vmovaw_insn"
963  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
964	(unspec:V8HI [(match_operand:SI 1 "nonmemory_operand"  "r")
965		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMOVAW))]
966  "TARGET_SIMD_SET"
967  "vmovaw %0, %1, %2"
968  [(set_attr "type" "simd_vmove_with_acc")
969   (set_attr "length" "4")
970   (set_attr "cond" "nocond")])
971
972(define_insn "vmovw_insn"
973  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
974	(unspec:V8HI [(match_operand:SI 1 "nonmemory_operand"  "r")
975		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMOVW))]
976  "TARGET_SIMD_SET"
977  "vmovw %0, %1, %2"
978  [(set_attr "type" "simd_vmove")
979   (set_attr "length" "4")
980   (set_attr "cond" "nocond")])
981
982(define_insn "vmovzw_insn"
983  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
984	(unspec:V8HI [(match_operand:SI 1 "nonmemory_operand"  "r")
985		      (match_operand:SI 2 "immediate_operand" "P")] UNSPEC_ARC_SIMD_VMOVZW))]
986  "TARGET_SIMD_SET"
987  "vmovzw %0, %1, %2"
988  [(set_attr "type" "simd_vmove_else_zero")
989   (set_attr "length" "4")
990   (set_attr "cond" "nocond")])
991
992;; Va, rlimm, Ic insns
993(define_insn "vsr8_insn"
994  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
995	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
996		      (match_operand:SI 2 "immediate_operand" "K")
997		      (match_operand:V8HI 3 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VSR8))]
998  "TARGET_SIMD_SET"
999  "vsr8 %0, %1, i%2"
1000  [(set_attr "type" "simd_valign")
1001   (set_attr "length" "4")
1002   (set_attr "cond" "nocond")])
1003
1004(define_insn "vasrw_insn"
1005  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
1006	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
1007		      (match_operand:SI 2 "immediate_operand" "K")
1008		      (match_operand:V8HI 3 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VASRW))]
1009  "TARGET_SIMD_SET"
1010  "vasrw %0, %1, i%2"
1011  [(set_attr "type" "simd_varith_1cycle")
1012   (set_attr "length" "4")
1013   (set_attr "cond" "nocond")])
1014
1015(define_insn "vsr8aw_insn"
1016  [(set (match_operand:V8HI 0 "vector_register_operand"           "=v")
1017	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")
1018		      (match_operand:SI 2 "immediate_operand" "K")
1019		      (match_operand:V8HI 3 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VSR8AW))]
1020  "TARGET_SIMD_SET"
1021  "vsr8aw %0, %1, i%2"
1022  [(set_attr "type" "simd_valign_with_acc")
1023   (set_attr "length" "4")
1024   (set_attr "cond" "nocond")])
1025
1026;; Va, Vb insns
1027(define_insn "vabsaw_insn"
1028  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1029	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VABSAW))]
1030  "TARGET_SIMD_SET"
1031  "vabsaw %0, %1"
1032  [(set_attr "type" "simd_varith_with_acc")
1033   (set_attr "length" "4")
1034   (set_attr "cond" "nocond")])
1035
1036(define_insn "vabsw_insn"
1037  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1038	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VABSW))]
1039  "TARGET_SIMD_SET"
1040  "vabsw %0, %1"
1041  [(set_attr "type" "simd_varith_1cycle")
1042   (set_attr "length" "4")
1043   (set_attr "cond" "nocond")])
1044
1045(define_insn "vaddsuw_insn"
1046  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1047	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VADDSUW))]
1048  "TARGET_SIMD_SET"
1049  "vaddsuw %0, %1"
1050  [(set_attr "type" "simd_varith_1cycle")
1051   (set_attr "length" "4")
1052   (set_attr "cond" "nocond")])
1053
1054(define_insn "vsignw_insn"
1055  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1056	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VSIGNW))]
1057  "TARGET_SIMD_SET"
1058  "vsignw %0, %1"
1059  [(set_attr "type" "simd_varith_1cycle")
1060   (set_attr "length" "4")
1061   (set_attr "cond" "nocond")])
1062
1063(define_insn "vexch1_insn"
1064  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1065	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VEXCH1))]
1066  "TARGET_SIMD_SET"
1067  "vexch1 %0, %1"
1068  [(set_attr "type" "simd_vpermute")
1069   (set_attr "length" "4")
1070   (set_attr "cond" "nocond")])
1071
1072(define_insn "vexch2_insn"
1073  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1074	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VEXCH2))]
1075  "TARGET_SIMD_SET"
1076  "vexch2 %0, %1"
1077  [(set_attr "type" "simd_vpermute")
1078   (set_attr "length" "4")
1079   (set_attr "cond" "nocond")])
1080
1081(define_insn "vexch4_insn"
1082  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1083	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VEXCH4))]
1084  "TARGET_SIMD_SET"
1085  "vexch4 %0, %1"
1086  [(set_attr "type" "simd_vpermute")
1087   (set_attr "length" "4")
1088   (set_attr "cond" "nocond")])
1089
1090(define_insn "vupbaw_insn"
1091  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1092	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VUPBAW))]
1093  "TARGET_SIMD_SET"
1094  "vupbaw %0, %1"
1095  [(set_attr "type" "simd_vpack_with_acc")
1096   (set_attr "length" "4")
1097   (set_attr "cond" "nocond")])
1098
1099(define_insn "vupbw_insn"
1100  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1101	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VUPBW))]
1102  "TARGET_SIMD_SET"
1103  "vupbw %0, %1"
1104  [(set_attr "type" "simd_vpack")
1105   (set_attr "length" "4")
1106   (set_attr "cond" "nocond")])
1107
1108(define_insn "vupsbaw_insn"
1109  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1110	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VUPSBAW))]
1111  "TARGET_SIMD_SET"
1112  "vupsbaw %0, %1"
1113  [(set_attr "type" "simd_vpack_with_acc")
1114   (set_attr "length" "4")
1115   (set_attr "cond" "nocond")])
1116
1117(define_insn "vupsbw_insn"
1118  [(set (match_operand:V8HI 0 "vector_register_operand"  "=v")
1119	(unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand"  "v")] UNSPEC_ARC_SIMD_VUPSBW))]
1120  "TARGET_SIMD_SET"
1121  "vupsbw %0, %1"
1122  [(set_attr "type" "simd_vpack")
1123   (set_attr "length" "4")
1124   (set_attr "cond" "nocond")])
1125
1126; DMA setup instructions
1127(define_insn "vdirun_insn"
1128  [(set (match_operand:SI 0 "arc_simd_dma_register_operand"           "=d")
1129	(unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand"  "r")
1130			     (match_operand:SI 2 "nonmemory_operand" "r")] UNSPEC_ARC_SIMD_VDIRUN))]
1131  "TARGET_SIMD_SET"
1132  "vdirun %1, %2"
1133  [(set_attr "type" "simd_dma")
1134   (set_attr "length" "4")
1135   (set_attr "cond" "nocond")])
1136
1137(define_insn "vdorun_insn"
1138  [(set (match_operand:SI 0 "arc_simd_dma_register_operand"              "=d")
1139	(unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand"     "r")
1140			     (match_operand:SI 2 "nonmemory_operand"     "r")] UNSPEC_ARC_SIMD_VDORUN))]
1141  "TARGET_SIMD_SET"
1142  "vdorun %1, %2"
1143  [(set_attr "type" "simd_dma")
1144   (set_attr "length" "4")
1145   (set_attr "cond" "nocond")])
1146
1147(define_insn "vdiwr_insn"
1148  [(set (match_operand:SI 0 "arc_simd_dma_register_operand"           "=d,d")
1149	(unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand"  "r,Cal")] UNSPEC_ARC_SIMD_VDIWR))]
1150  "TARGET_SIMD_SET"
1151  "vdiwr %0, %1"
1152  [(set_attr "type" "simd_dma")
1153   (set_attr "length" "4,8")
1154   (set_attr "cond" "nocond,nocond")])
1155
1156(define_insn "vdowr_insn"
1157  [(set (match_operand:SI 0 "arc_simd_dma_register_operand"           "=d,d")
1158	(unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand"  "r,Cal")] UNSPEC_ARC_SIMD_VDOWR))]
1159  "TARGET_SIMD_SET"
1160  "vdowr %0, %1"
1161  [(set_attr "type" "simd_dma")
1162   (set_attr "length" "4,8")
1163   (set_attr "cond" "nocond,nocond")])
1164
1165;; vector record and run instructions
1166(define_insn "vrec_insn"
1167  [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand"  "r")] UNSPEC_ARC_SIMD_VREC)]
1168  "TARGET_SIMD_SET"
1169  "vrec %0"
1170  [(set_attr "type" "simd_vcontrol")
1171   (set_attr "length" "4")
1172   (set_attr "cond" "nocond")])
1173
1174(define_insn "vrun_insn"
1175  [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand"  "r")] UNSPEC_ARC_SIMD_VRUN)]
1176  "TARGET_SIMD_SET"
1177  "vrun %0"
1178  [(set_attr "type" "simd_vcontrol")
1179   (set_attr "length" "4")
1180   (set_attr "cond" "nocond")])
1181
1182(define_insn "vrecrun_insn"
1183  [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand"  "r")] UNSPEC_ARC_SIMD_VRECRUN)]
1184  "TARGET_SIMD_SET"
1185  "vrecrun %0"
1186  [(set_attr "type" "simd_vcontrol")
1187   (set_attr "length" "4")
1188   (set_attr "cond" "nocond")])
1189
1190(define_insn "vendrec_insn"
1191  [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand"  "r")] UNSPEC_ARC_SIMD_VENDREC)]
1192  "TARGET_SIMD_SET"
1193  "vendrec %0"
1194  [(set_attr "type" "simd_vcontrol")
1195   (set_attr "length" "4")
1196   (set_attr "cond" "nocond")])
1197
1198(define_insn "vld32wh_insn"
1199  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1200	(vec_concat:V8HI
1201	 (zero_extend:V4HI
1202	  (mem:V4QI
1203	   (plus:SI
1204	    (match_operand:SI 1 "immediate_operand" "P")
1205	    (zero_extend:SI
1206	     (vec_select:HI
1207	      (match_operand:V8HI 2 "vector_register_operand"  "v")
1208	      (parallel [(match_operand:SI 3 "immediate_operand" "L")]))))))
1209	 (vec_select:V4HI
1210	  (match_dup 0)
1211	  (parallel [(const_int 0) (const_int 1) (const_int 2) (const_int 3)])
1212	  )))]
1213  "TARGET_SIMD_SET"
1214  "vld32wh %0, [i%3,%1]"
1215  [(set_attr "type" "simd_vload")
1216   (set_attr "length" "4")
1217   (set_attr "cond" "nocond")])
1218
1219(define_insn "vld32wl_insn"
1220  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1221	(vec_concat:V8HI
1222	 (vec_select:V4HI
1223	  (match_dup 0)
1224	  (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1225	 (zero_extend:V4HI
1226	  (mem:V4QI
1227	   (plus:SI
1228	    (match_operand:SI 1 "immediate_operand" "P")
1229	    (zero_extend:SI
1230	     (vec_select:HI (match_operand:V8HI 2 "vector_register_operand" "v")
1231			    (parallel
1232			     [(match_operand:SI 3 "immediate_operand" "L")]))
1233	     ))))))]
1234  "TARGET_SIMD_SET"
1235  "vld32wl %0, [i%3,%1]"
1236  [(set_attr "type" "simd_vload")
1237   (set_attr "length" "4")
1238   (set_attr "cond" "nocond")])
1239
1240(define_insn "vld64w_insn"
1241  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1242	(zero_extend:V8HI (mem:V4HI (plus:SI (zero_extend:SI (vec_select:HI (match_operand:V8HI 1 "vector_register_operand"  "v")
1243									    (parallel [(match_operand:SI 2 "immediate_operand" "L")])))
1244					     (match_operand:SI 3 "immediate_operand" "P")))))]
1245 "TARGET_SIMD_SET"
1246 "vld64w %0, [i%2, %3]"
1247 [(set_attr "type" "simd_vload")
1248  (set_attr "length" "4")
1249  (set_attr "cond" "nocond")]
1250)
1251
1252(define_insn "vld64_insn"
1253  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1254	(vec_concat:V8HI
1255	 (vec_select:V4HI
1256	  (match_dup 0)
1257	  (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1258	 (mem:V4HI
1259	  (plus:SI
1260	   (match_operand:SI 1 "immediate_operand" "P")
1261	   (zero_extend:SI
1262	    (vec_select:HI
1263	     (match_operand:V8HI 2 "vector_register_operand"  "v")
1264	     (parallel [(match_operand:SI 3 "immediate_operand" "L")]))
1265	    )))))]
1266  "TARGET_SIMD_SET"
1267  "vld64 %0, [i%3,%1]"
1268  [(set_attr "type" "simd_vload")
1269   (set_attr "length" "4")
1270   (set_attr "cond" "nocond")])
1271
1272(define_insn "vld32_insn"
1273  [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1274	(vec_concat:V8HI
1275	 (vec_select:V4HI
1276	  (match_dup 0)
1277	  (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1278	 (vec_concat:V4HI
1279	  (vec_select:V2HI
1280	   (match_dup 0)
1281	   (parallel [(const_int 2) (const_int 3)]))
1282	  (mem:V2HI
1283	   (plus:SI
1284	    (match_operand:SI 1 "immediate_operand" "P")
1285	    (zero_extend:SI
1286	     (vec_select:HI
1287	      (match_operand:V8HI 2 "vector_register_operand"  "v")
1288	      (parallel [(match_operand:SI 3 "immediate_operand" "L")]))))))))]
1289  "TARGET_SIMD_SET"
1290  "vld32 %0, [i%3,%1]"
1291  [(set_attr "type" "simd_vload")
1292   (set_attr "length" "4")
1293   (set_attr "cond" "nocond")])
1294
1295(define_insn "vst16_n_insn"
1296  [(set  (mem:HI (plus:SI (match_operand:SI 0 "immediate_operand" "P")
1297			  (zero_extend: SI (vec_select:HI (match_operand:V8HI 1 "vector_register_operand"  "v")
1298							  (parallel [(match_operand:SI 2 "immediate_operand" "L")])))))
1299	 (vec_select:HI (match_operand:V8HI 3 "vector_register_operand" "v")
1300			(parallel [(match_operand:SI 4 "immediate_operand" "L")])))]
1301 "TARGET_SIMD_SET"
1302 "vst16_%4 %3,[i%2, %0]"
1303 [(set_attr "type" "simd_vstore")
1304  (set_attr "length" "4")
1305  (set_attr "cond" "nocond")])
1306
1307(define_insn "vst32_n_insn"
1308  [(set  (mem:SI (plus:SI (match_operand:SI 0 "immediate_operand" "P")
1309			  (zero_extend: SI (vec_select:HI (match_operand:V8HI 1 "vector_register_operand"  "v")
1310							  (parallel [(match_operand:SI 2 "immediate_operand" "L")])))))
1311	 (vec_select:SI (unspec:V4SI [(match_operand:V8HI 3 "vector_register_operand" "v")] UNSPEC_ARC_SIMD_VCAST)
1312			(parallel [(match_operand:SI 4 "immediate_operand" "L")])))]
1313 "TARGET_SIMD_SET"
1314 "vst32_%4 %3,[i%2, %0]"
1315 [(set_attr "type" "simd_vstore")
1316  (set_attr "length" "4")
1317  (set_attr "cond" "nocond")])
1318
1319;; SIMD unit interrupt
1320(define_insn "vinti_insn"
1321  [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand"  "L")] UNSPEC_ARC_SIMD_VINTI)]
1322  "TARGET_SIMD_SET"
1323  "vinti %0"
1324  [(set_attr "type" "simd_vcontrol")
1325   (set_attr "length" "4")
1326   (set_attr "cond" "nocond")])
1327
1328;; New ARCv2 SIMD extensions
1329
1330;;64-bit vectors of halwords and words
1331(define_mode_iterator VWH [V4HI V2SI])
1332
1333;;double element vectors
1334(define_mode_iterator VDV [V2HI V2SI])
1335(define_mode_attr V_addsub [(V2HI "HI") (V2SI "SI")])
1336(define_mode_attr V_addsub_suffix [(V2HI "2h") (V2SI "")])
1337
1338;;all vectors
1339(define_mode_iterator VCT [V2HI V4HI V2SI])
1340(define_mode_attr V_suffix [(V2HI "2h") (V4HI "4h") (V2SI "2")])
1341
1342;; Widening operations.
1343(define_code_iterator SE [sign_extend zero_extend])
1344(define_code_attr V_US [(sign_extend "s") (zero_extend "u")])
1345(define_code_attr V_US_suffix [(sign_extend "") (zero_extend "u")])
1346
1347
1348;; Move patterns
1349(define_expand "movv2hi"
1350  [(set (match_operand:V2HI 0 "move_dest_operand" "")
1351	(match_operand:V2HI 1 "general_operand" ""))]
1352  ""
1353  "{
1354    if (prepare_move_operands (operands, V2HImode))
1355         DONE;
1356   }")
1357
1358(define_insn_and_split "*movv2hi_insn"
1359  [(set (match_operand:V2HI 0 "move_dest_operand" "=r,r,r,m")
1360	(match_operand:V2HI 1 "general_operand"       "i,r,m,r"))]
1361  "(register_operand (operands[0], V2HImode)
1362    || register_operand (operands[1], V2HImode))"
1363  "@
1364   #
1365   mov%? %0, %1
1366   ld%U1%V1 %0,%1
1367   st%U0%V0 %1,%0"
1368  "reload_completed && GET_CODE (operands[1]) == CONST_VECTOR"
1369  [(set (match_dup 0) (match_dup 2))]
1370  {
1371   HOST_WIDE_INT intval = INTVAL (XVECEXP (operands[1], 0, 1)) << 16;
1372   intval |= INTVAL (XVECEXP (operands[1], 0, 0)) & 0xFFFF;
1373
1374   operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
1375   operands[2] = GEN_INT (trunc_int_for_mode (intval, SImode));
1376  }
1377  [(set_attr "type" "move,move,load,store")
1378   (set_attr "predicable" "yes,yes,no,no")
1379   (set_attr "iscompact"  "false,false,false,false")
1380   ])
1381
1382(define_expand "movmisalignv2hi"
1383 [(set (match_operand:V2HI 0 "general_operand" "")
1384       (match_operand:V2HI 1 "general_operand" ""))]
1385 ""
1386 "{
1387   if (prepare_move_operands (operands, V2HImode))
1388     DONE;
1389  }")
1390
1391(define_expand "mov<mode>"
1392  [(set (match_operand:VWH 0 "move_dest_operand" "")
1393	(match_operand:VWH 1 "general_operand" ""))]
1394  ""
1395  "{
1396    if (prepare_move_operands (operands, <MODE>mode))
1397     DONE;
1398   }")
1399
1400(define_insn_and_split "*mov<mode>_insn"
1401  [(set (match_operand:VWH 0 "move_dest_operand" "=r,r,r,m")
1402	(match_operand:VWH 1 "general_operand"    "i,r,m,r"))]
1403  "TARGET_PLUS_QMACW
1404   && (register_operand (operands[0], <MODE>mode)
1405       || register_operand (operands[1], <MODE>mode))"
1406  "*
1407{
1408  switch (which_alternative)
1409    {
1410     default:
1411       return \"#\";
1412
1413     case 1:
1414       return \"vadd2 %0, %1, 0\";
1415
1416     case 2:
1417       if (TARGET_LL64)
1418         return \"ldd%U1%V1 %0,%1\";
1419       return \"#\";
1420
1421     case 3:
1422       if (TARGET_LL64)
1423	   return \"std%U0%V0 %1,%0\";
1424	 return \"#\";
1425    }
1426}"
1427  "reload_completed"
1428  [(const_int 0)]
1429  {
1430   arc_split_move (operands);
1431   DONE;
1432  }
1433  [(set_attr "type" "move,move,load,store")
1434   (set_attr "predicable" "yes,no,no,no")
1435   (set_attr "iscompact"  "false,false,false,false")
1436   ])
1437
1438(define_expand "movmisalign<mode>"
1439 [(set (match_operand:VWH 0 "general_operand" "")
1440       (match_operand:VWH 1 "general_operand" ""))]
1441 ""
1442 "{
1443   if (prepare_move_operands (operands, <MODE>mode))
1444     DONE;
1445  }")
1446
1447(define_insn "bswapv2hi2"
1448  [(set (match_operand:V2HI 0 "register_operand" "=r,r")
1449        (bswap:V2HI (match_operand:V2HI 1 "nonmemory_operand" "r,i")))]
1450  "TARGET_V2 && TARGET_SWAP"
1451  "swape %0, %1"
1452  [(set_attr "length" "4,8")
1453   (set_attr "type" "two_cycle_core")])
1454
1455;; Simple arithmetic insns
1456(define_insn "add<mode>3"
1457  [(set (match_operand:VCT 0 "register_operand"          "=r,r")
1458	(plus:VCT (match_operand:VCT 1 "register_operand" "0,r")
1459		  (match_operand:VCT 2 "register_operand" "r,r")))]
1460  "TARGET_PLUS_DMPY"
1461  "vadd<V_suffix>%? %0, %1, %2"
1462  [(set_attr "length" "4")
1463   (set_attr "type" "multi")
1464   (set_attr "predicable" "yes,no")
1465   (set_attr "cond" "canuse,nocond")])
1466
1467(define_insn "sub<mode>3"
1468  [(set (match_operand:VCT 0 "register_operand"           "=r,r")
1469	(minus:VCT (match_operand:VCT 1 "register_operand" "0,r")
1470		   (match_operand:VCT 2 "register_operand" "r,r")))]
1471  "TARGET_PLUS_DMPY"
1472  "vsub<V_suffix>%? %0, %1, %2"
1473  [(set_attr "length" "4")
1474   (set_attr "type" "multi")
1475   (set_attr "predicable" "yes,no")
1476   (set_attr "cond" "canuse,nocond")])
1477
1478;; Combined arithmetic ops
1479(define_insn "addsub<mode>3"
1480  [(set (match_operand:VDV 0 "register_operand" "=r,r")
1481	(vec_concat:VDV
1482	 (plus:<V_addsub> (vec_select:<V_addsub> (match_operand:VDV 1 "register_operand" "0,r")
1483						 (parallel [(const_int 0)]))
1484			  (vec_select:<V_addsub> (match_operand:VDV 2 "register_operand" "r,r")
1485						 (parallel [(const_int 0)])))
1486	 (minus:<V_addsub> (vec_select:<V_addsub> (match_dup 1) (parallel [(const_int 1)]))
1487			   (vec_select:<V_addsub> (match_dup 2) (parallel [(const_int 1)])))))]
1488  "TARGET_PLUS_DMPY"
1489  "vaddsub<V_addsub_suffix>%? %0, %1, %2"
1490  [(set_attr "length" "4")
1491   (set_attr "type" "multi")
1492   (set_attr "predicable" "yes,no")
1493   (set_attr "cond" "canuse,nocond")])
1494
1495(define_insn "subadd<mode>3"
1496  [(set (match_operand:VDV 0 "register_operand" "=r,r")
1497	(vec_concat:VDV
1498	 (minus:<V_addsub> (vec_select:<V_addsub> (match_operand:VDV 1 "register_operand" "0,r")
1499						  (parallel [(const_int 0)]))
1500			   (vec_select:<V_addsub> (match_operand:VDV 2 "register_operand" "r,r")
1501						  (parallel [(const_int 0)])))
1502	 (plus:<V_addsub> (vec_select:<V_addsub> (match_dup 1) (parallel [(const_int 1)]))
1503			  (vec_select:<V_addsub> (match_dup 2) (parallel [(const_int 1)])))))]
1504  "TARGET_PLUS_DMPY"
1505  "vsubadd<V_addsub_suffix>%? %0, %1, %2"
1506  [(set_attr "length" "4")
1507   (set_attr "type" "multi")
1508   (set_attr "predicable" "yes,no")
1509   (set_attr "cond" "canuse,nocond")])
1510
1511(define_insn "addsubv4hi3"
1512  [(set (match_operand:V4HI 0 "even_register_operand" "=r,r")
1513	(vec_concat:V4HI
1514	 (vec_concat:V2HI
1515	  (plus:HI (vec_select:HI (match_operand:V4HI 1 "even_register_operand" "0,r")
1516				  (parallel [(const_int 0)]))
1517		   (vec_select:HI (match_operand:V4HI 2 "even_register_operand" "r,r")
1518				  (parallel [(const_int 0)])))
1519	  (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))
1520		    (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))
1521	 (vec_concat:V2HI
1522	  (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
1523		   (vec_select:HI (match_dup 2) (parallel [(const_int 2)])))
1524	  (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))
1525		    (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
1526	 ))]
1527  "TARGET_PLUS_QMACW"
1528  "vaddsub4h%? %0, %1, %2"
1529  [(set_attr "length" "4")
1530   (set_attr "type" "multi")
1531   (set_attr "predicable" "yes,no")
1532   (set_attr "cond" "canuse,nocond")])
1533
1534(define_insn "subaddv4hi3"
1535  [(set (match_operand:V4HI 0 "even_register_operand" "=r,r")
1536	(vec_concat:V4HI
1537	 (vec_concat:V2HI
1538	  (minus:HI (vec_select:HI (match_operand:V4HI 1 "even_register_operand" "0,r")
1539				   (parallel [(const_int 0)]))
1540		    (vec_select:HI (match_operand:V4HI 2 "even_register_operand" "r,r")
1541				  (parallel [(const_int 0)])))
1542	  (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))
1543		   (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))
1544	 (vec_concat:V2HI
1545	  (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
1546		    (vec_select:HI (match_dup 2) (parallel [(const_int 2)])))
1547	  (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))
1548		   (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
1549	 ))]
1550  "TARGET_PLUS_QMACW"
1551  "vsubadd4h%? %0, %1, %2"
1552  [(set_attr "length" "4")
1553   (set_attr "type" "multi")
1554   (set_attr "predicable" "yes,no")
1555   (set_attr "cond" "canuse,nocond")])
1556
1557;; Multiplication
1558(define_insn "dmpyh<V_US_suffix>"
1559  [(set (match_operand:SI 0 "register_operand" "=r,r")
1560	(plus:SI
1561	 (mult:SI
1562	  (SE:SI
1563	   (vec_select:HI (match_operand:V2HI 1 "register_operand" "0,r")
1564			  (parallel [(const_int 0)])))
1565	  (SE:SI
1566	   (vec_select:HI (match_operand:V2HI 2 "register_operand" "r,r")
1567			  (parallel [(const_int 0)]))))
1568	 (mult:SI
1569	  (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
1570	  (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))))
1571   (set (reg:DI ARCV2_ACC)
1572	(zero_extend:DI
1573	 (plus:SI
1574	  (mult:SI
1575	   (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 0)])))
1576	   (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 0)]))))
1577	  (mult:SI
1578	   (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
1579	   (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))))))]
1580  "TARGET_PLUS_DMPY"
1581  "dmpyh<V_US_suffix>%? %0, %1, %2"
1582  [(set_attr "length" "4")
1583   (set_attr "type" "multi")
1584   (set_attr "predicable" "yes,no")
1585   (set_attr "cond" "canuse,nocond")])
1586
1587;; We can use dmac as well here.  To be investigated which version
1588;; brings more.
1589(define_expand "sdot_prodv2hi"
1590  [(match_operand:SI 0 "register_operand" "")
1591   (match_operand:V2HI 1 "register_operand" "")
1592   (match_operand:V2HI 2 "register_operand" "")
1593   (match_operand:SI 3 "register_operand" "")]
1594  "TARGET_PLUS_DMPY"
1595{
1596 rtx t = gen_reg_rtx (SImode);
1597 emit_insn (gen_dmpyh (t, operands[1], operands[2]));
1598 emit_insn (gen_addsi3 (operands[0], operands[3], t));
1599 DONE;
1600})
1601
1602(define_expand "udot_prodv2hi"
1603  [(match_operand:SI 0 "register_operand" "")
1604   (match_operand:V2HI 1 "register_operand" "")
1605   (match_operand:V2HI 2 "register_operand" "")
1606   (match_operand:SI 3 "register_operand" "")]
1607  "TARGET_PLUS_DMPY"
1608{
1609 rtx t = gen_reg_rtx (SImode);
1610 emit_insn (gen_dmpyhu (t, operands[1], operands[2]));
1611 emit_insn (gen_addsi3 (operands[0], operands[3], t));
1612 DONE;
1613})
1614
1615(define_insn "arc_vec_<V_US>mult_lo_v4hi"
1616 [(set (match_operand:V2SI 0 "even_register_operand"                     "=r,r")
1617       (mult:V2SI (SE:V2SI (vec_select:V2HI
1618			    (match_operand:V4HI 1 "even_register_operand" "0,r")
1619			    (parallel [(const_int 0) (const_int 1)])))
1620		  (SE:V2SI (vec_select:V2HI
1621			    (match_operand:V4HI 2 "even_register_operand" "r,r")
1622			    (parallel [(const_int 0) (const_int 1)])))))
1623  (set (reg:V2SI ARCV2_ACC)
1624       (mult:V2SI (SE:V2SI (vec_select:V2HI (match_dup 1)
1625					    (parallel [(const_int 0) (const_int 1)])))
1626		  (SE:V2SI (vec_select:V2HI (match_dup 2)
1627					    (parallel [(const_int 0) (const_int 1)])))))
1628  ]
1629  "TARGET_PLUS_MACD"
1630  "vmpy2h<V_US_suffix>%? %0, %1, %2"
1631  [(set_attr "length" "4")
1632   (set_attr "type" "multi")
1633   (set_attr "predicable" "yes,no")
1634   (set_attr "cond" "canuse,nocond")])
1635
1636(define_insn "arc_vec_<V_US>multacc_lo_v4hi"
1637  [(set (reg:V2SI ARCV2_ACC)
1638	(mult:V2SI (SE:V2SI (vec_select:V2HI
1639			     (match_operand:V4HI 0 "even_register_operand" "r")
1640			     (parallel [(const_int 0) (const_int 1)])))
1641		   (SE:V2SI (vec_select:V2HI
1642			     (match_operand:V4HI 1 "even_register_operand" "r")
1643			     (parallel [(const_int 0) (const_int 1)])))))
1644  ]
1645  "TARGET_PLUS_MACD"
1646  "vmpy2h<V_US_suffix>%? 0, %0, %1"
1647  [(set_attr "length" "4")
1648   (set_attr "type" "multi")
1649   (set_attr "predicable" "no")
1650   (set_attr "cond" "nocond")])
1651
1652(define_expand "vec_widen_<V_US>mult_lo_v4hi"
1653 [(set (match_operand:V2SI 0 "even_register_operand"                 "")
1654       (mult:V2SI (SE:V2SI (vec_select:V2HI
1655			    (match_operand:V4HI 1 "even_register_operand" "")
1656			    (parallel [(const_int 0) (const_int 1)])))
1657		  (SE:V2SI (vec_select:V2HI
1658			    (match_operand:V4HI 2 "even_register_operand" "")
1659			    (parallel [(const_int 0) (const_int 1)])))))]
1660  "TARGET_PLUS_QMACW"
1661  {
1662     emit_insn (gen_arc_vec_<V_US>mult_lo_v4hi (operands[0],
1663						operands[1],
1664						operands[2]));
1665     DONE;
1666  }
1667)
1668
1669(define_insn "arc_vec_<V_US>mult_hi_v4hi"
1670 [(set (match_operand:V2SI 0 "even_register_operand"                     "=r,r")
1671       (mult:V2SI (SE:V2SI (vec_select:V2HI
1672			    (match_operand:V4HI 1 "even_register_operand" "0,r")
1673			    (parallel [(const_int 2) (const_int 3)])))
1674		  (SE:V2SI (vec_select:V2HI
1675			    (match_operand:V4HI 2 "even_register_operand" "r,r")
1676			    (parallel [(const_int 2) (const_int 3)])))))
1677  (set (reg:V2SI ARCV2_ACC)
1678       (mult:V2SI (SE:V2SI (vec_select:V2HI (match_dup 1)
1679					    (parallel [(const_int 2) (const_int 3)])))
1680		  (SE:V2SI (vec_select:V2HI (match_dup 2)
1681					    (parallel [(const_int 2) (const_int 3)])))))
1682  ]
1683  "TARGET_PLUS_QMACW"
1684  "vmpy2h<V_US_suffix>%? %0, %R1, %R2"
1685  [(set_attr "length" "4")
1686   (set_attr "type" "multi")
1687   (set_attr "predicable" "yes,no")
1688   (set_attr "cond" "canuse,nocond")])
1689
1690(define_expand "vec_widen_<V_US>mult_hi_v4hi"
1691 [(set (match_operand:V2SI 0 "even_register_operand"                               "")
1692       (mult:V2SI (SE:V2SI (vec_select:V2HI
1693				     (match_operand:V4HI 1 "even_register_operand" "")
1694				     (parallel [(const_int 2) (const_int 3)])))
1695		  (SE:V2SI (vec_select:V2HI
1696				     (match_operand:V4HI 2 "even_register_operand" "")
1697				     (parallel [(const_int 2) (const_int 3)])))))]
1698  "TARGET_PLUS_MACD"
1699  {
1700     emit_insn (gen_arc_vec_<V_US>mult_hi_v4hi (operands[0],
1701						operands[1],
1702						operands[2]));
1703     DONE;
1704  }
1705)
1706
1707(define_insn "arc_vec_<V_US>mac_hi_v4hi"
1708 [(set (match_operand:V2SI 0 "even_register_operand"                     "=r,r")
1709       (plus:V2SI
1710	(reg:V2SI ARCV2_ACC)
1711	(mult:V2SI (SE:V2SI (vec_select:V2HI
1712			     (match_operand:V4HI 1 "even_register_operand" "0,r")
1713			     (parallel [(const_int 2) (const_int 3)])))
1714		   (SE:V2SI (vec_select:V2HI
1715			     (match_operand:V4HI 2 "even_register_operand" "r,r")
1716			     (parallel [(const_int 2) (const_int 3)]))))))
1717  (set (reg:V2SI ARCV2_ACC)
1718       (plus:V2SI
1719	(reg:V2SI ARCV2_ACC)
1720	(mult:V2SI (SE:V2SI (vec_select:V2HI (match_dup 1)
1721					     (parallel [(const_int 2) (const_int 3)])))
1722		   (SE:V2SI (vec_select:V2HI (match_dup 2)
1723					     (parallel [(const_int 2) (const_int 3)]))))))
1724  ]
1725  "TARGET_PLUS_MACD"
1726  "vmac2h<V_US_suffix>%? %0, %R1, %R2"
1727  [(set_attr "length" "4")
1728   (set_attr "type" "multi")
1729   (set_attr "predicable" "yes,no")
1730   (set_attr "cond" "canuse,nocond")])
1731
1732;; Builtins
1733(define_insn "dmach"
1734  [(set (match_operand:SI 0 "register_operand" "=r,r")
1735	(unspec:SI [(match_operand:V2HI 1 "register_operand" "0,r")
1736		    (match_operand:V2HI 2 "register_operand" "r,r")
1737		    (reg:DI ARCV2_ACC)]
1738		   UNSPEC_ARC_DMACH))
1739   (clobber (reg:DI ARCV2_ACC))]
1740  "TARGET_PLUS_DMPY"
1741  "dmach%? %0, %1, %2"
1742  [(set_attr "length" "4")
1743   (set_attr "type" "multi")
1744   (set_attr "predicable" "yes,no")
1745   (set_attr "cond" "canuse,nocond")])
1746
1747(define_insn "dmachu"
1748  [(set (match_operand:SI 0 "register_operand" "=r,r")
1749	(unspec:SI [(match_operand:V2HI 1 "register_operand" "0,r")
1750		    (match_operand:V2HI 2 "register_operand" "r,r")
1751		    (reg:DI ARCV2_ACC)]
1752		   UNSPEC_ARC_DMACHU))
1753   (clobber (reg:DI ARCV2_ACC))]
1754  "TARGET_PLUS_DMPY"
1755  "dmachu%? %0, %1, %2"
1756  [(set_attr "length" "4")
1757   (set_attr "type" "multi")
1758   (set_attr "predicable" "yes,no")
1759   (set_attr "cond" "canuse,nocond")])
1760
1761(define_insn "dmacwh"
1762  [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1763	(unspec:DI [(match_operand:V2SI 1 "even_register_operand" "0,r")
1764		    (match_operand:V2HI 2 "register_operand"      "r,r")
1765		    (reg:DI ARCV2_ACC)]
1766		   UNSPEC_ARC_DMACWH))
1767   (clobber (reg:DI ARCV2_ACC))]
1768  "TARGET_PLUS_QMACW"
1769  "dmacwh%? %0, %1, %2"
1770  [(set_attr "length" "4")
1771   (set_attr "type" "multi")
1772   (set_attr "predicable" "yes,no")
1773   (set_attr "cond" "canuse,nocond")])
1774
1775(define_insn "dmacwhu"
1776  [(set (match_operand:DI 0 "register_operand" "=r,r")
1777	(unspec:DI [(match_operand:V2SI 1 "even_register_operand" "0,r")
1778		    (match_operand:V2HI 2 "register_operand"      "r,r")
1779		    (reg:DI ARCV2_ACC)]
1780		   UNSPEC_ARC_DMACWHU))
1781   (clobber (reg:DI ARCV2_ACC))]
1782  "TARGET_PLUS_QMACW"
1783  "dmacwhu%? %0, %1, %2"
1784  [(set_attr "length" "4")
1785   (set_attr "type" "multi")
1786   (set_attr "predicable" "yes,no")
1787   (set_attr "cond" "canuse,nocond")])
1788
1789(define_insn "vmac2h"
1790  [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1791	(unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1792		      (match_operand:V2HI 2 "register_operand" "r,r")
1793		      (reg:DI ARCV2_ACC)]
1794		     UNSPEC_ARC_VMAC2H))
1795   (clobber (reg:DI ARCV2_ACC))]
1796  "TARGET_PLUS_MACD"
1797  "vmac2h%? %0, %1, %2"
1798  [(set_attr "length" "4")
1799   (set_attr "type" "multi")
1800   (set_attr "predicable" "yes,no")
1801   (set_attr "cond" "canuse,nocond")])
1802
1803(define_insn "vmac2hu"
1804  [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1805	(unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1806		      (match_operand:V2HI 2 "register_operand" "r,r")
1807		      (reg:DI ARCV2_ACC)]
1808		   UNSPEC_ARC_VMAC2HU))
1809   (clobber (reg:DI ARCV2_ACC))]
1810  "TARGET_PLUS_MACD"
1811  "vmac2hu%? %0, %1, %2"
1812  [(set_attr "length" "4")
1813   (set_attr "type" "multi")
1814   (set_attr "predicable" "yes,no")
1815   (set_attr "cond" "canuse,nocond")])
1816
1817(define_insn "vmpy2h"
1818  [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1819	(unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1820		      (match_operand:V2HI 2 "register_operand" "r,r")]
1821		     UNSPEC_ARC_VMPY2H))
1822   (clobber (reg:DI ARCV2_ACC))]
1823  "TARGET_PLUS_MACD"
1824  "vmpy2h%? %0, %1, %2"
1825  [(set_attr "length" "4")
1826   (set_attr "type" "multi")
1827   (set_attr "predicable" "yes,no")
1828   (set_attr "cond" "canuse,nocond")])
1829
1830(define_insn "vmpy2hu"
1831  [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1832	(unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1833		      (match_operand:V2HI 2 "register_operand" "r,r")]
1834		     UNSPEC_ARC_VMPY2HU))
1835   (clobber (reg:DI ARCV2_ACC))]
1836  "TARGET_PLUS_MACD"
1837  "vmpy2hu%? %0, %1, %2"
1838  [(set_attr "length" "4")
1839   (set_attr "type" "multi")
1840   (set_attr "predicable" "yes,no")
1841   (set_attr "cond" "canuse,nocond")])
1842
1843(define_insn "qmach"
1844  [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1845	(unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1846		    (match_operand:V4HI 2 "even_register_operand" "r,r")
1847		    (reg:DI ARCV2_ACC)]
1848		     UNSPEC_ARC_QMACH))
1849   (clobber (reg:DI ARCV2_ACC))]
1850  "TARGET_PLUS_QMACW"
1851  "qmach%? %0, %1, %2"
1852  [(set_attr "length" "4")
1853   (set_attr "type" "multi")
1854   (set_attr "predicable" "yes,no")
1855   (set_attr "cond" "canuse,nocond")])
1856
1857(define_insn "qmachu"
1858  [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1859	(unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1860		    (match_operand:V4HI 2 "even_register_operand" "r,r")
1861		    (reg:DI ARCV2_ACC)]
1862		   UNSPEC_ARC_QMACHU))
1863   (clobber (reg:DI ARCV2_ACC))]
1864  "TARGET_PLUS_QMACW"
1865  "qmachu%? %0, %1, %2"
1866  [(set_attr "length" "4")
1867   (set_attr "type" "multi")
1868   (set_attr "predicable" "yes,no")
1869   (set_attr "cond" "canuse,nocond")])
1870
1871(define_insn "qmpyh"
1872  [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1873	(unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1874		    (match_operand:V4HI 2 "even_register_operand" "r,r")]
1875		     UNSPEC_ARC_QMPYH))
1876   (clobber (reg:DI ARCV2_ACC))]
1877  "TARGET_PLUS_QMACW"
1878  "qmpyh%? %0, %1, %2"
1879  [(set_attr "length" "4")
1880   (set_attr "type" "multi")
1881   (set_attr "predicable" "yes,no")
1882   (set_attr "cond" "canuse,nocond")])
1883
1884(define_insn "qmpyhu"
1885  [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1886	(unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1887		    (match_operand:V4HI 2 "even_register_operand" "r,r")]
1888		   UNSPEC_ARC_QMPYHU))
1889   (clobber (reg:DI ARCV2_ACC))]
1890  "TARGET_PLUS_QMACW"
1891  "qmpyhu%? %0, %1, %2"
1892  [(set_attr "length" "4")
1893   (set_attr "type" "multi")
1894   (set_attr "predicable" "yes,no")
1895   (set_attr "cond" "canuse,nocond")])
1896