]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arc/simdext.md
testsuite: Fix gcc.dg/ipa/pr120295.c on Solaris
[thirdparty/gcc.git] / gcc / config / arc / simdext.md
CommitLineData
526b7aee 1;; Machine description of the Synopsys DesignWare ARC cpu for GNU C compiler
6441eb6d 2;; Copyright (C) 2007-2025 Free Software Foundation, Inc.
526b7aee
SV
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
c69899f0 20(define_c_enum "unspec" [
526b7aee 21 ;; Va, Vb, Vc builtins
c69899f0
CZ
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
526b7aee 70 ;; Va, Vb, rc/limm builtins
c69899f0
CZ
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
526b7aee
SV
79
80 ;; Va, Vb, Ic builtins
c69899f0
CZ
81 UNSPEC_ARC_SIMD_VASRW
82 UNSPEC_ARC_SIMD_VSR8
83 UNSPEC_ARC_SIMD_VSR8AW
526b7aee
SV
84
85 ;; Va, Vb, Ic builtins
c69899f0
CZ
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
526b7aee
SV
93
94 ;; Va, Vb, u8 (simm) builtins
c69899f0
CZ
95 UNSPEC_ARC_SIMD_VMVAW
96 UNSPEC_ARC_SIMD_VMVW
97 UNSPEC_ARC_SIMD_VMVZW
98 UNSPEC_ARC_SIMD_VD6TAPF
526b7aee
SV
99
100 ;; Va, rlimm, u8 (simm) builtins
c69899f0
CZ
101 UNSPEC_ARC_SIMD_VMOVAW
102 UNSPEC_ARC_SIMD_VMOVW
103 UNSPEC_ARC_SIMD_VMOVZW
526b7aee
SV
104
105 ;; Va, Vb builtins
c69899f0
CZ
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 ])
526b7aee
SV
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,
c69899f0 139 simd_vmove_else_zero, simd_varith_1cycle")
526b7aee
SV
140 "issue+simd_unit, nothing")
141
142(define_insn_reservation "simd_lat_2_insn" 3
143 (eq_attr "type" "simd_valign, simd_vpermute,
c69899f0 144 simd_vpack, simd_varith_2cycle")
526b7aee
SV
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,
c69899f0
CZ
149 simd_vlogic_with_acc, simd_vload128,
150 simd_vmove_with_acc, simd_vspecial_3cycle,
151 simd_varith_with_acc")
526b7aee
SV
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"
09ae0f6c 177 "vld128\\t%0,[i%2,%3]"
526b7aee
SV
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"
09ae0f6c 189 "vst128\\t%3,[i%1,%2]"
526b7aee
SV
190 [(set_attr "type" "simd_vstore")
191 (set_attr "length" "4")
192 (set_attr "cond" "nocond")]
193)
194
195(define_insn "vst64_insn"
d1ab0a32
CZ
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)])))]
526b7aee 206 "TARGET_SIMD_SET"
09ae0f6c 207 "vst64\\t%3,[i%1,%2]"
526b7aee
SV
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 "@
09ae0f6c
CZ
218 vld128r\\t%0,%1
219 vst128r\\t%1,%0
220 vmvzw\\t%0,%1,0xffff"
526b7aee
SV
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 "@
09ae0f6c
CZ
230 vld128r\\t%0,%1
231 vst128r\\t%1,%0
232 vmvzw\\t%0,%1,0xffff"
526b7aee
SV
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
526b7aee
SV
237;; V V V Insns
238(define_insn "vaddaw_insn"
239 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
240 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
241 (match_operand:V8HI 2 "vector_register_operand" "v")]
242 UNSPEC_ARC_SIMD_VADDAW))]
526b7aee 243 "TARGET_SIMD_SET"
09ae0f6c 244 "vaddaw\\t%0,%1,%2"
526b7aee
SV
245 [(set_attr "type" "simd_varith_with_acc")
246 (set_attr "length" "4")
247 (set_attr "cond" "nocond")])
248
249(define_insn "vaddw_insn"
250 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
251 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
252 (match_operand:V8HI 2 "vector_register_operand" "v")]
253 UNSPEC_ARC_SIMD_VADDW))]
526b7aee 254 "TARGET_SIMD_SET"
09ae0f6c 255 "vaddw\\t%0,%1,2"
526b7aee
SV
256 [(set_attr "type" "simd_varith_1cycle")
257 (set_attr "length" "4")
258 (set_attr "cond" "nocond")])
259
260(define_insn "vavb_insn"
261 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
262 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
263 (match_operand:V8HI 2 "vector_register_operand" "v")]
264 UNSPEC_ARC_SIMD_VAVB))]
526b7aee 265 "TARGET_SIMD_SET"
09ae0f6c 266 "vavb\\t%0,%1,%2"
526b7aee
SV
267 [(set_attr "type" "simd_varith_1cycle")
268 (set_attr "length" "4")
269 (set_attr "cond" "nocond")])
270
271(define_insn "vavrb_insn"
272 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
273 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
274 (match_operand:V8HI 2 "vector_register_operand" "v")]
275 UNSPEC_ARC_SIMD_VAVRB))]
526b7aee 276 "TARGET_SIMD_SET"
09ae0f6c 277 "vavrb\\t%0,%1,%2"
526b7aee
SV
278 [(set_attr "type" "simd_varith_1cycle")
279 (set_attr "length" "4")
280 (set_attr "cond" "nocond")])
281
282(define_insn "vdifaw_insn"
283 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
284 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
285 (match_operand:V8HI 2 "vector_register_operand" "v")]
286 UNSPEC_ARC_SIMD_VDIFAW))]
526b7aee 287 "TARGET_SIMD_SET"
09ae0f6c 288 "vdifaw\\t%0,%1,%2"
526b7aee
SV
289 [(set_attr "type" "simd_varith_with_acc")
290 (set_attr "length" "4")
291 (set_attr "cond" "nocond")])
292
293(define_insn "vdifw_insn"
294 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
295 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
296 (match_operand:V8HI 2 "vector_register_operand" "v")]
297 UNSPEC_ARC_SIMD_VDIFW))]
526b7aee 298 "TARGET_SIMD_SET"
09ae0f6c 299 "vdifw\\t%0,%1,%2"
526b7aee
SV
300 [(set_attr "type" "simd_varith_1cycle")
301 (set_attr "length" "4")
302 (set_attr "cond" "nocond")])
303
304(define_insn "vmaxaw_insn"
305 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
306 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
307 (match_operand:V8HI 2 "vector_register_operand" "v")]
308 UNSPEC_ARC_SIMD_VMAXAW))]
526b7aee 309 "TARGET_SIMD_SET"
09ae0f6c 310 "vmaxaw\\t%0,%1,2"
526b7aee
SV
311 [(set_attr "type" "simd_varith_with_acc")
312 (set_attr "length" "4")
313 (set_attr "cond" "nocond")])
314
315(define_insn "vmaxw_insn"
316 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
317 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
318 (match_operand:V8HI 2 "vector_register_operand" "v")]
319 UNSPEC_ARC_SIMD_VMAXW))]
526b7aee 320 "TARGET_SIMD_SET"
09ae0f6c 321 "vmaxw\\t%0,%1,%2"
526b7aee
SV
322 [(set_attr "type" "simd_varith_1cycle")
323 (set_attr "length" "4")
324 (set_attr "cond" "nocond")])
325
326(define_insn "vminaw_insn"
327 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
328 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
329 (match_operand:V8HI 2 "vector_register_operand" "v")]
330 UNSPEC_ARC_SIMD_VMINAW))]
526b7aee 331 "TARGET_SIMD_SET"
09ae0f6c 332 "vminaw\\t%0,%1,%2"
526b7aee
SV
333 [(set_attr "type" "simd_varith_with_acc")
334 (set_attr "length" "4")
335 (set_attr "cond" "nocond")])
336
337(define_insn "vminw_insn"
338 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
339 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
340 (match_operand:V8HI 2 "vector_register_operand" "v")]
341 UNSPEC_ARC_SIMD_VMINW))]
526b7aee 342 "TARGET_SIMD_SET"
09ae0f6c 343 "vminw\\t%0,%1,%2"
526b7aee
SV
344 [(set_attr "type" "simd_varith_1cycle")
345 (set_attr "length" "4")
346 (set_attr "cond" "nocond")])
347
348(define_insn "vmulaw_insn"
349 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
350 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
351 (match_operand:V8HI 2 "vector_register_operand" "v")]
352 UNSPEC_ARC_SIMD_VMULAW))]
526b7aee 353 "TARGET_SIMD_SET"
09ae0f6c 354 "vmulaw\\t%0,%1,%2"
526b7aee
SV
355 [(set_attr "type" "simd_varith_with_acc")
356 (set_attr "length" "4")
357 (set_attr "cond" "nocond")])
358
359(define_insn "vmulfaw_insn"
360 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
361 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
362 (match_operand:V8HI 2 "vector_register_operand" "v")]
363 UNSPEC_ARC_SIMD_VMULFAW))]
526b7aee 364 "TARGET_SIMD_SET"
09ae0f6c 365 "vmulfaw\\t%0,%1,%2"
526b7aee
SV
366 [(set_attr "type" "simd_varith_with_acc")
367 (set_attr "length" "4")
368 (set_attr "cond" "nocond")])
369
370(define_insn "vmulfw_insn"
371 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
372 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
373 (match_operand:V8HI 2 "vector_register_operand" "v")]
374 UNSPEC_ARC_SIMD_VMULFW))]
526b7aee 375 "TARGET_SIMD_SET"
09ae0f6c 376 "vmulfw\\t%0,%1,%2"
526b7aee
SV
377 [(set_attr "type" "simd_varith_2cycle")
378 (set_attr "length" "4")
379 (set_attr "cond" "nocond")])
380
381(define_insn "vmulw_insn"
382 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
383 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
384 (match_operand:V8HI 2 "vector_register_operand" "v")]
385 UNSPEC_ARC_SIMD_VMULW))]
526b7aee 386 "TARGET_SIMD_SET"
09ae0f6c 387 "vmulw\\t%0,%1,%2"
526b7aee
SV
388 [(set_attr "type" "simd_varith_2cycle")
389 (set_attr "length" "4")
390 (set_attr "cond" "nocond")])
391
392(define_insn "vsubaw_insn"
393 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
394 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
395 (match_operand:V8HI 2 "vector_register_operand" "v")]
396 UNSPEC_ARC_SIMD_VSUBAW))]
526b7aee 397 "TARGET_SIMD_SET"
09ae0f6c 398 "vsubaw\\t%0,%1,%2"
526b7aee
SV
399 [(set_attr "type" "simd_varith_with_acc")
400 (set_attr "length" "4")
401 (set_attr "cond" "nocond")])
402
403(define_insn "vsubw_insn"
404 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
405 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
406 (match_operand:V8HI 2 "vector_register_operand" "v")]
407 UNSPEC_ARC_SIMD_VSUBW))]
526b7aee 408 "TARGET_SIMD_SET"
09ae0f6c 409 "vsubw\\t%0,%1,%2"
526b7aee
SV
410 [(set_attr "type" "simd_varith_1cycle")
411 (set_attr "length" "4")
412 (set_attr "cond" "nocond")])
413
414(define_insn "vsummw_insn"
415 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
416 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
417 (match_operand:V8HI 2 "vector_register_operand" "v")]
418 UNSPEC_ARC_SIMD_VSUMMW))]
526b7aee 419 "TARGET_SIMD_SET"
09ae0f6c 420 "vsummw\\t%0,%1,%2"
526b7aee
SV
421 [(set_attr "type" "simd_varith_2cycle")
422 (set_attr "length" "4")
423 (set_attr "cond" "nocond")])
424
425(define_insn "vand_insn"
426 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
427 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
428 (match_operand:V8HI 2 "vector_register_operand" "v")]
429 UNSPEC_ARC_SIMD_VAND))]
526b7aee 430 "TARGET_SIMD_SET"
09ae0f6c 431 "vand\\t%0,%1,%2"
526b7aee
SV
432 [(set_attr "type" "simd_vlogic")
433 (set_attr "length" "4")
434 (set_attr "cond" "nocond")])
435
436(define_insn "vandaw_insn"
437 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
438 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
439 (match_operand:V8HI 2 "vector_register_operand" "v")]
440 UNSPEC_ARC_SIMD_VANDAW))]
526b7aee 441 "TARGET_SIMD_SET"
09ae0f6c 442 "vandaw\\t%0,%1,%2"
526b7aee
SV
443 [(set_attr "type" "simd_vlogic_with_acc")
444 (set_attr "length" "4")
445 (set_attr "cond" "nocond")])
446
447(define_insn "vbic_insn"
448 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
449 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
450 (match_operand:V8HI 2 "vector_register_operand" "v")]
451 UNSPEC_ARC_SIMD_VBIC))]
526b7aee 452 "TARGET_SIMD_SET"
09ae0f6c 453 "vbic\\t%0,%1,%2"
526b7aee
SV
454 [(set_attr "type" "simd_vlogic")
455 (set_attr "length" "4")
456 (set_attr "cond" "nocond")])
457
458(define_insn "vbicaw_insn"
459 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
460 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
461 (match_operand:V8HI 2 "vector_register_operand" "v")]
462 UNSPEC_ARC_SIMD_VBICAW))]
526b7aee 463 "TARGET_SIMD_SET"
09ae0f6c 464 "vbicaw\\t%0,%1,%2"
526b7aee
SV
465 [(set_attr "type" "simd_vlogic_with_acc")
466 (set_attr "length" "4")
467 (set_attr "cond" "nocond")])
468
469(define_insn "vor_insn"
470 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
471 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
472 (match_operand:V8HI 2 "vector_register_operand" "v")]
473 UNSPEC_ARC_SIMD_VOR))]
526b7aee 474 "TARGET_SIMD_SET"
09ae0f6c 475 "vor\\t%0,%1,%2"
526b7aee
SV
476 [(set_attr "type" "simd_vlogic")
477 (set_attr "length" "4")
478 (set_attr "cond" "nocond")])
479
480(define_insn "vxor_insn"
481 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
482 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
483 (match_operand:V8HI 2 "vector_register_operand" "v")]
484 UNSPEC_ARC_SIMD_VXOR))]
526b7aee 485 "TARGET_SIMD_SET"
09ae0f6c 486 "vxor\\t%0,%1,%2"
526b7aee
SV
487 [(set_attr "type" "simd_vlogic")
488 (set_attr "length" "4")
489 (set_attr "cond" "nocond")])
490
491(define_insn "vxoraw_insn"
492 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
493 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
494 (match_operand:V8HI 2 "vector_register_operand" "v")]
495 UNSPEC_ARC_SIMD_VXORAW))]
526b7aee 496 "TARGET_SIMD_SET"
09ae0f6c 497 "vxoraw\\t%0,%1,%2"
526b7aee
SV
498 [(set_attr "type" "simd_vlogic_with_acc")
499 (set_attr "length" "4")
500 (set_attr "cond" "nocond")])
501
502(define_insn "veqw_insn"
503 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
504 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
505 (match_operand:V8HI 2 "vector_register_operand" "v")]
506 UNSPEC_ARC_SIMD_VEQW))]
526b7aee 507 "TARGET_SIMD_SET"
09ae0f6c 508 "veqw\\t%0,%1,%2"
526b7aee
SV
509 [(set_attr "type" "simd_vcompare")
510 (set_attr "length" "4")
511 (set_attr "cond" "nocond")])
512
513(define_insn "vlew_insn"
514 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
515 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
516 (match_operand:V8HI 2 "vector_register_operand" "v")]
517 UNSPEC_ARC_SIMD_VLEW))]
526b7aee 518 "TARGET_SIMD_SET"
09ae0f6c 519 "vlew\\t%0,%1,%2"
526b7aee
SV
520 [(set_attr "type" "simd_vcompare")
521 (set_attr "length" "4")
522 (set_attr "cond" "nocond")])
523
524(define_insn "vltw_insn"
525 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
526 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
527 (match_operand:V8HI 2 "vector_register_operand" "v")]
528 UNSPEC_ARC_SIMD_VLTW))]
526b7aee 529 "TARGET_SIMD_SET"
09ae0f6c 530 "vltw\\t%0,%1,%2"
526b7aee
SV
531 [(set_attr "type" "simd_vcompare")
532 (set_attr "length" "4")
533 (set_attr "cond" "nocond")])
534
535(define_insn "vnew_insn"
536 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
537 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
538 (match_operand:V8HI 2 "vector_register_operand" "v")]
539 UNSPEC_ARC_SIMD_VNEW))]
526b7aee 540 "TARGET_SIMD_SET"
09ae0f6c 541 "vnew\\t%0,%1,%2"
526b7aee
SV
542 [(set_attr "type" "simd_vcompare")
543 (set_attr "length" "4")
544 (set_attr "cond" "nocond")])
545
546(define_insn "vmr1aw_insn"
547 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
548 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
549 (match_operand:V8HI 2 "vector_register_operand" "v")]
550 UNSPEC_ARC_SIMD_VMR1AW))]
526b7aee 551 "TARGET_SIMD_SET"
09ae0f6c 552 "vmr1aw\\t%0,%1,%2"
526b7aee
SV
553 [(set_attr "type" "simd_valign_with_acc")
554 (set_attr "length" "4")
555 (set_attr "cond" "nocond")])
556
557(define_insn "vmr1w_insn"
558 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
559 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
560 (match_operand:V8HI 2 "vector_register_operand" "v")]
561 UNSPEC_ARC_SIMD_VMR1W))]
526b7aee 562 "TARGET_SIMD_SET"
09ae0f6c 563 "vmr1w\\t%0,%1,%2"
526b7aee
SV
564 [(set_attr "type" "simd_valign")
565 (set_attr "length" "4")
566 (set_attr "cond" "nocond")])
567
568(define_insn "vmr2aw_insn"
569 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
570 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
571 (match_operand:V8HI 2 "vector_register_operand" "v")]
572 UNSPEC_ARC_SIMD_VMR2AW))]
526b7aee 573 "TARGET_SIMD_SET"
09ae0f6c 574 "vmr2aw\\t%0,%1,%2"
526b7aee
SV
575 [(set_attr "type" "simd_valign_with_acc")
576 (set_attr "length" "4")
577 (set_attr "cond" "nocond")])
578
579(define_insn "vmr2w_insn"
580 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
581 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
582 (match_operand:V8HI 2 "vector_register_operand" "v")]
583 UNSPEC_ARC_SIMD_VMR2W))]
526b7aee 584 "TARGET_SIMD_SET"
09ae0f6c 585 "vmr2w\\t%0,%1,%2"
526b7aee
SV
586 [(set_attr "type" "simd_valign")
587 (set_attr "length" "4")
588 (set_attr "cond" "nocond")])
589
590(define_insn "vmr3aw_insn"
591 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
592 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
593 (match_operand:V8HI 2 "vector_register_operand" "v")]
594 UNSPEC_ARC_SIMD_VMR3AW))]
526b7aee 595 "TARGET_SIMD_SET"
09ae0f6c 596 "vmr3aw\\t%0,%1,%2"
526b7aee
SV
597 [(set_attr "type" "simd_valign_with_acc")
598 (set_attr "length" "4")
599 (set_attr "cond" "nocond")])
600
601(define_insn "vmr3w_insn"
602 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
603 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
604 (match_operand:V8HI 2 "vector_register_operand" "v")]
605 UNSPEC_ARC_SIMD_VMR3W))]
526b7aee 606 "TARGET_SIMD_SET"
09ae0f6c 607 "vmr3w\\t%0,%1,%2"
526b7aee
SV
608 [(set_attr "type" "simd_valign")
609 (set_attr "length" "4")
610 (set_attr "cond" "nocond")])
611
612(define_insn "vmr4aw_insn"
613 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
614 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
615 (match_operand:V8HI 2 "vector_register_operand" "v")]
616 UNSPEC_ARC_SIMD_VMR4AW))]
526b7aee 617 "TARGET_SIMD_SET"
09ae0f6c 618 "vmr4aw\\t%0,%1,%2"
526b7aee
SV
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")
09ae0f6c
CZ
626 (match_operand:V8HI 2 "vector_register_operand" "v")]
627 UNSPEC_ARC_SIMD_VMR4W))]
526b7aee 628 "TARGET_SIMD_SET"
09ae0f6c 629 "vmr4w\\t%0,%1,%2"
526b7aee
SV
630 [(set_attr "type" "simd_valign")
631 (set_attr "length" "4")
632 (set_attr "cond" "nocond")])
633
634(define_insn "vmr5aw_insn"
635 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
636 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
637 (match_operand:V8HI 2 "vector_register_operand" "v")]
638 UNSPEC_ARC_SIMD_VMR5AW))]
526b7aee 639 "TARGET_SIMD_SET"
09ae0f6c 640 "vmr5aw\\t%0,%1,%2"
526b7aee
SV
641 [(set_attr "type" "simd_valign_with_acc")
642 (set_attr "length" "4")
643 (set_attr "cond" "nocond")])
644
645(define_insn "vmr5w_insn"
646 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
647 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
648 (match_operand:V8HI 2 "vector_register_operand" "v")]
649 UNSPEC_ARC_SIMD_VMR5W))]
526b7aee 650 "TARGET_SIMD_SET"
09ae0f6c 651 "vmr5w\\t%0,%1,%2"
526b7aee
SV
652 [(set_attr "type" "simd_valign")
653 (set_attr "length" "4")
654 (set_attr "cond" "nocond")])
655
656(define_insn "vmr6aw_insn"
657 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
658 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
659 (match_operand:V8HI 2 "vector_register_operand" "v")]
660 UNSPEC_ARC_SIMD_VMR6AW))]
526b7aee 661 "TARGET_SIMD_SET"
09ae0f6c 662 "vmr6aw\\t%0,%1,%2"
526b7aee
SV
663 [(set_attr "type" "simd_valign_with_acc")
664 (set_attr "length" "4")
665 (set_attr "cond" "nocond")])
666
667(define_insn "vmr6w_insn"
668 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
669 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
670 (match_operand:V8HI 2 "vector_register_operand" "v")]
671 UNSPEC_ARC_SIMD_VMR6W))]
526b7aee 672 "TARGET_SIMD_SET"
09ae0f6c 673 "vmr6w\\t%0,%1,%2"
526b7aee
SV
674 [(set_attr "type" "simd_valign")
675 (set_attr "length" "4")
676 (set_attr "cond" "nocond")])
677
678(define_insn "vmr7aw_insn"
679 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
680 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
681 (match_operand:V8HI 2 "vector_register_operand" "v")]
682 UNSPEC_ARC_SIMD_VMR7AW))]
526b7aee 683 "TARGET_SIMD_SET"
09ae0f6c 684 "vmr7aw\\t%0,%1,%2"
526b7aee
SV
685 [(set_attr "type" "simd_valign_with_acc")
686 (set_attr "length" "4")
687 (set_attr "cond" "nocond")])
688
689(define_insn "vmr7w_insn"
690 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
691 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
692 (match_operand:V8HI 2 "vector_register_operand" "v")]
693 UNSPEC_ARC_SIMD_VMR7W))]
526b7aee 694 "TARGET_SIMD_SET"
09ae0f6c 695 "vmr7w\\t%0,%1,%2"
526b7aee
SV
696 [(set_attr "type" "simd_valign")
697 (set_attr "length" "4")
698 (set_attr "cond" "nocond")])
699
700(define_insn "vmrb_insn"
701 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
702 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
703 (match_operand:V8HI 2 "vector_register_operand" "v")]
704 UNSPEC_ARC_SIMD_VMRB))]
526b7aee 705 "TARGET_SIMD_SET"
09ae0f6c 706 "vmrb\\t%0,%1,%2"
526b7aee
SV
707 [(set_attr "type" "simd_valign")
708 (set_attr "length" "4")
709 (set_attr "cond" "nocond")])
710
711(define_insn "vh264f_insn"
712 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
713 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
714 (match_operand:V8HI 2 "vector_register_operand" "v")]
715 UNSPEC_ARC_SIMD_VH264F))]
526b7aee 716 "TARGET_SIMD_SET"
09ae0f6c 717 "vh264f\\t%0,%1,%2"
526b7aee
SV
718 [(set_attr "type" "simd_vspecial_3cycle")
719 (set_attr "length" "4")
720 (set_attr "cond" "nocond")])
721
722(define_insn "vh264ft_insn"
723 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
724 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
725 (match_operand:V8HI 2 "vector_register_operand" "v")]
726 UNSPEC_ARC_SIMD_VH264FT))]
526b7aee 727 "TARGET_SIMD_SET"
09ae0f6c 728 "vh264ft\\t%0,%1,%2"
526b7aee
SV
729 [(set_attr "type" "simd_vspecial_3cycle")
730 (set_attr "length" "4")
731 (set_attr "cond" "nocond")])
732
733(define_insn "vh264fw_insn"
734 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
735 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
736 (match_operand:V8HI 2 "vector_register_operand" "v")]
737 UNSPEC_ARC_SIMD_VH264FW))]
526b7aee 738 "TARGET_SIMD_SET"
09ae0f6c 739 "vh264fw\\t%0,%1,%2"
526b7aee
SV
740 [(set_attr "type" "simd_vspecial_3cycle")
741 (set_attr "length" "4")
742 (set_attr "cond" "nocond")])
743
744(define_insn "vvc1f_insn"
745 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
746 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
747 (match_operand:V8HI 2 "vector_register_operand" "v")]
748 UNSPEC_ARC_SIMD_VVC1F))]
526b7aee 749 "TARGET_SIMD_SET"
09ae0f6c 750 "vvc1f\\t%0,%1,%2"
526b7aee
SV
751 [(set_attr "type" "simd_vspecial_3cycle")
752 (set_attr "length" "4")
753 (set_attr "cond" "nocond")])
754
755(define_insn "vvc1ft_insn"
756 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
757 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
758 (match_operand:V8HI 2 "vector_register_operand" "v")]
759 UNSPEC_ARC_SIMD_VVC1FT))]
526b7aee 760 "TARGET_SIMD_SET"
09ae0f6c 761 "vvc1ft\\t%0,%1,%2"
526b7aee
SV
762 [(set_attr "type" "simd_vspecial_3cycle")
763 (set_attr "length" "4")
764 (set_attr "cond" "nocond")])
765
766
767
768;;---
769;; V V r/limm Insns
526b7aee
SV
770(define_insn "vbaddw_insn"
771 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
772 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
773 (match_operand:SI 2 "nonmemory_operand" "r")]
774 UNSPEC_ARC_SIMD_VBADDW))]
526b7aee 775 "TARGET_SIMD_SET"
09ae0f6c 776 "vbaddw\\t%0,%1,%2"
526b7aee
SV
777 [(set_attr "type" "simd_varith_1cycle")
778 (set_attr "length" "4")
779 (set_attr "cond" "nocond")])
780
781(define_insn "vbmaxw_insn"
782 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
783 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
784 (match_operand:SI 2 "nonmemory_operand" "r")]
785 UNSPEC_ARC_SIMD_VBMAXW))]
526b7aee 786 "TARGET_SIMD_SET"
09ae0f6c 787 "vbmaxw\\t%0,%1,%2"
526b7aee
SV
788 [(set_attr "type" "simd_varith_1cycle")
789 (set_attr "length" "4")
790 (set_attr "cond" "nocond")])
791
792(define_insn "vbminw_insn"
793 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
794 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
795 (match_operand:SI 2 "nonmemory_operand" "r")]
796 UNSPEC_ARC_SIMD_VBMINW))]
526b7aee 797 "TARGET_SIMD_SET"
09ae0f6c 798 "vbminw\\t%0,%1,%2"
526b7aee
SV
799 [(set_attr "type" "simd_varith_1cycle")
800 (set_attr "length" "4")
801 (set_attr "cond" "nocond")])
802
803(define_insn "vbmulaw_insn"
804 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
805 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
806 (match_operand:SI 2 "nonmemory_operand" "r")]
807 UNSPEC_ARC_SIMD_VBMULAW))]
526b7aee 808 "TARGET_SIMD_SET"
09ae0f6c 809 "vbmulaw\\t%0,%1,%2"
526b7aee
SV
810 [(set_attr "type" "simd_varith_with_acc")
811 (set_attr "length" "4")
812 (set_attr "cond" "nocond")])
813
814(define_insn "vbmulfw_insn"
815 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
816 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
817 (match_operand:SI 2 "nonmemory_operand" "r")]
818 UNSPEC_ARC_SIMD_VBMULFW))]
526b7aee 819 "TARGET_SIMD_SET"
09ae0f6c 820 "vbmulfw\\t%0,%1,%2"
526b7aee
SV
821 [(set_attr "type" "simd_varith_2cycle")
822 (set_attr "length" "4")
823 (set_attr "cond" "nocond")])
824
825(define_insn "vbmulw_insn"
826 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
827 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
828 (match_operand:SI 2 "nonmemory_operand" "r")]
829 UNSPEC_ARC_SIMD_VBMULW))]
526b7aee 830 "TARGET_SIMD_SET"
09ae0f6c 831 "vbmulw\\t%0,%1,%2"
526b7aee
SV
832 [(set_attr "type" "simd_varith_2cycle")
833 (set_attr "length" "4")
834 (set_attr "cond" "nocond")])
835
836(define_insn "vbrsubw_insn"
837 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
838 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
839 (match_operand:SI 2 "nonmemory_operand" "r")]
840 UNSPEC_ARC_SIMD_VBRSUBW))]
526b7aee 841 "TARGET_SIMD_SET"
09ae0f6c 842 "vbrsubw\\t%0,%1,%2"
526b7aee
SV
843 [(set_attr "type" "simd_varith_1cycle")
844 (set_attr "length" "4")
845 (set_attr "cond" "nocond")])
846
847(define_insn "vbsubw_insn"
848 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
849 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
850 (match_operand:SI 2 "nonmemory_operand" "r")]
851 UNSPEC_ARC_SIMD_VBSUBW))]
526b7aee 852 "TARGET_SIMD_SET"
09ae0f6c 853 "vbsubw\\t%0,%1,%2"
526b7aee
SV
854 [(set_attr "type" "simd_varith_1cycle")
855 (set_attr "length" "4")
856 (set_attr "cond" "nocond")])
857; Va, Vb, Ic instructions
858
859; Va, Vb, u6 instructions
860(define_insn "vasrrwi_insn"
861 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
862 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
863 (match_operand:SI 2 "immediate_operand" "L")]
864 UNSPEC_ARC_SIMD_VASRRWi))]
526b7aee 865 "TARGET_SIMD_SET"
09ae0f6c 866 "vasrrwi\\t%0,%1,%2"
526b7aee
SV
867 [(set_attr "type" "simd_varith_2cycle")
868 (set_attr "length" "4")
869 (set_attr "cond" "nocond")])
870
871(define_insn "vasrsrwi_insn"
872 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
873 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
874 (match_operand:SI 2 "immediate_operand" "L")]
875 UNSPEC_ARC_SIMD_VASRSRWi))]
526b7aee 876 "TARGET_SIMD_SET"
09ae0f6c 877 "vasrsrwi\\t%0,%1,%2"
526b7aee
SV
878 [(set_attr "type" "simd_varith_2cycle")
879 (set_attr "length" "4")
880 (set_attr "cond" "nocond")])
881
882(define_insn "vasrwi_insn"
883 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
884 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
885 (match_operand:SI 2 "immediate_operand" "L")]
886 UNSPEC_ARC_SIMD_VASRWi))]
526b7aee 887 "TARGET_SIMD_SET"
09ae0f6c 888 "vasrwi\\t%0,%1,%2"
526b7aee
SV
889 [(set_attr "type" "simd_varith_1cycle")
890 (set_attr "length" "4")
891 (set_attr "cond" "nocond")])
892
893(define_insn "vasrpwbi_insn"
894 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
895 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
896 (match_operand:SI 2 "immediate_operand" "L")]
897 UNSPEC_ARC_SIMD_VASRPWBi))]
526b7aee 898 "TARGET_SIMD_SET"
09ae0f6c 899 "vasrpwbi\\t%0,%1,%2"
526b7aee
SV
900 [(set_attr "type" "simd_vpack")
901 (set_attr "length" "4")
902 (set_attr "cond" "nocond")])
903
904(define_insn "vasrrpwbi_insn"
905 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
906 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
907 (match_operand:SI 2 "immediate_operand" "L")]
908 UNSPEC_ARC_SIMD_VASRRPWBi))]
526b7aee 909 "TARGET_SIMD_SET"
09ae0f6c 910 "vasrrpwbi\\t%0,%1,%2"
526b7aee
SV
911 [(set_attr "type" "simd_vpack")
912 (set_attr "length" "4")
913 (set_attr "cond" "nocond")])
914
915(define_insn "vsr8awi_insn"
916 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
917 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
918 (match_operand:SI 2 "immediate_operand" "L")]
919 UNSPEC_ARC_SIMD_VSR8AWi))]
526b7aee 920 "TARGET_SIMD_SET"
09ae0f6c 921 "vsr8awi\\t%0,%1,%2"
526b7aee
SV
922 [(set_attr "type" "simd_valign_with_acc")
923 (set_attr "length" "4")
924 (set_attr "cond" "nocond")])
925
926(define_insn "vsr8i_insn"
927 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
928 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
929 (match_operand:SI 2 "immediate_operand" "L")]
930 UNSPEC_ARC_SIMD_VSR8i))]
526b7aee 931 "TARGET_SIMD_SET"
09ae0f6c 932 "vsr8i\\t%0,%1,%2"
526b7aee
SV
933 [(set_attr "type" "simd_valign")
934 (set_attr "length" "4")
935 (set_attr "cond" "nocond")])
936
937;; Va, Vb, u8 (simm) insns
938
939(define_insn "vmvaw_insn"
940 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 941 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
942 (match_operand:SI 2 "immediate_operand" "P")]
943 UNSPEC_ARC_SIMD_VMVAW))]
526b7aee 944 "TARGET_SIMD_SET"
09ae0f6c 945 "vmvaw\\t%0,%1,%2"
526b7aee
SV
946 [(set_attr "type" "simd_vmove_with_acc")
947 (set_attr "length" "4")
948 (set_attr "cond" "nocond")])
949
950(define_insn "vmvw_insn"
951 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 952 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
953 (match_operand:SI 2 "immediate_operand" "P")]
954 UNSPEC_ARC_SIMD_VMVW))]
526b7aee 955 "TARGET_SIMD_SET"
09ae0f6c 956 "vmvw\\t%0,%1,%2"
526b7aee
SV
957 [(set_attr "type" "simd_vmove")
958 (set_attr "length" "4")
959 (set_attr "cond" "nocond")])
960
961(define_insn "vmvzw_insn"
962 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 963 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
964 (match_operand:SI 2 "immediate_operand" "P")]
965 UNSPEC_ARC_SIMD_VMVZW))]
526b7aee 966 "TARGET_SIMD_SET"
09ae0f6c 967 "vmvzw\\t%0,%1,%2"
526b7aee
SV
968 [(set_attr "type" "simd_vmove_else_zero")
969 (set_attr "length" "4")
970 (set_attr "cond" "nocond")])
971
972(define_insn "vd6tapf_insn"
973 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 974 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
09ae0f6c
CZ
975 (match_operand:SI 2 "immediate_operand" "P")]
976 UNSPEC_ARC_SIMD_VD6TAPF))]
526b7aee 977 "TARGET_SIMD_SET"
09ae0f6c 978 "vd6tapf\\t%0,%1,%2"
526b7aee
SV
979 [(set_attr "type" "simd_vspecial_4cycle")
980 (set_attr "length" "4")
981 (set_attr "cond" "nocond")])
982
983;; Va, rlimm, u8 (simm) insns
984(define_insn "vmovaw_insn"
985 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 986 (unspec:V8HI [(match_operand:SI 1 "nonmemory_operand" "r")
09ae0f6c
CZ
987 (match_operand:SI 2 "immediate_operand" "P")]
988 UNSPEC_ARC_SIMD_VMOVAW))]
526b7aee 989 "TARGET_SIMD_SET"
09ae0f6c 990 "vmovaw\\t%0,%1,%2"
526b7aee
SV
991 [(set_attr "type" "simd_vmove_with_acc")
992 (set_attr "length" "4")
993 (set_attr "cond" "nocond")])
994
995(define_insn "vmovw_insn"
996 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 997 (unspec:V8HI [(match_operand:SI 1 "nonmemory_operand" "r")
09ae0f6c
CZ
998 (match_operand:SI 2 "immediate_operand" "P")]
999 UNSPEC_ARC_SIMD_VMOVW))]
526b7aee 1000 "TARGET_SIMD_SET"
09ae0f6c 1001 "vmovw\\t%0,%1,%2"
526b7aee
SV
1002 [(set_attr "type" "simd_vmove")
1003 (set_attr "length" "4")
1004 (set_attr "cond" "nocond")])
1005
1006(define_insn "vmovzw_insn"
1007 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
c69899f0 1008 (unspec:V8HI [(match_operand:SI 1 "nonmemory_operand" "r")
09ae0f6c
CZ
1009 (match_operand:SI 2 "immediate_operand" "P")]
1010 UNSPEC_ARC_SIMD_VMOVZW))]
526b7aee 1011 "TARGET_SIMD_SET"
09ae0f6c 1012 "vmovzw\\t%0,%1,%2"
526b7aee
SV
1013 [(set_attr "type" "simd_vmove_else_zero")
1014 (set_attr "length" "4")
1015 (set_attr "cond" "nocond")])
1016
1017;; Va, rlimm, Ic insns
1018(define_insn "vsr8_insn"
1019 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1020 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
1021 (match_operand:SI 2 "immediate_operand" "K")
09ae0f6c
CZ
1022 (match_operand:V8HI 3 "vector_register_operand" "v")]
1023 UNSPEC_ARC_SIMD_VSR8))]
526b7aee 1024 "TARGET_SIMD_SET"
09ae0f6c 1025 "vsr8\\t%0,%1,i%2"
526b7aee
SV
1026 [(set_attr "type" "simd_valign")
1027 (set_attr "length" "4")
1028 (set_attr "cond" "nocond")])
1029
1030(define_insn "vasrw_insn"
1031 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1032 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
1033 (match_operand:SI 2 "immediate_operand" "K")
09ae0f6c
CZ
1034 (match_operand:V8HI 3 "vector_register_operand" "v")]
1035 UNSPEC_ARC_SIMD_VASRW))]
526b7aee 1036 "TARGET_SIMD_SET"
09ae0f6c 1037 "vasrw\\t%0,%1,i%2"
526b7aee
SV
1038 [(set_attr "type" "simd_varith_1cycle")
1039 (set_attr "length" "4")
1040 (set_attr "cond" "nocond")])
1041
1042(define_insn "vsr8aw_insn"
1043 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1044 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")
1045 (match_operand:SI 2 "immediate_operand" "K")
09ae0f6c
CZ
1046 (match_operand:V8HI 3 "vector_register_operand" "v")]
1047 UNSPEC_ARC_SIMD_VSR8AW))]
526b7aee 1048 "TARGET_SIMD_SET"
09ae0f6c 1049 "vsr8aw\\t%0,%1,i%2"
526b7aee
SV
1050 [(set_attr "type" "simd_valign_with_acc")
1051 (set_attr "length" "4")
1052 (set_attr "cond" "nocond")])
1053
1054;; Va, Vb insns
1055(define_insn "vabsaw_insn"
1056 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1057 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1058 UNSPEC_ARC_SIMD_VABSAW))]
526b7aee 1059 "TARGET_SIMD_SET"
09ae0f6c 1060 "vabsaw\\t%0,%1"
526b7aee
SV
1061 [(set_attr "type" "simd_varith_with_acc")
1062 (set_attr "length" "4")
1063 (set_attr "cond" "nocond")])
1064
1065(define_insn "vabsw_insn"
1066 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1067 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1068 UNSPEC_ARC_SIMD_VABSW))]
526b7aee 1069 "TARGET_SIMD_SET"
09ae0f6c 1070 "vabsw\\t%0,%1"
526b7aee
SV
1071 [(set_attr "type" "simd_varith_1cycle")
1072 (set_attr "length" "4")
1073 (set_attr "cond" "nocond")])
1074
1075(define_insn "vaddsuw_insn"
1076 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1077 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1078 UNSPEC_ARC_SIMD_VADDSUW))]
526b7aee 1079 "TARGET_SIMD_SET"
09ae0f6c 1080 "vaddsuw\\t%0,%1"
526b7aee
SV
1081 [(set_attr "type" "simd_varith_1cycle")
1082 (set_attr "length" "4")
1083 (set_attr "cond" "nocond")])
1084
1085(define_insn "vsignw_insn"
1086 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1087 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1088 UNSPEC_ARC_SIMD_VSIGNW))]
526b7aee 1089 "TARGET_SIMD_SET"
09ae0f6c 1090 "vsignw\\t%0,%1"
526b7aee
SV
1091 [(set_attr "type" "simd_varith_1cycle")
1092 (set_attr "length" "4")
1093 (set_attr "cond" "nocond")])
1094
1095(define_insn "vexch1_insn"
1096 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1097 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1098 UNSPEC_ARC_SIMD_VEXCH1))]
526b7aee 1099 "TARGET_SIMD_SET"
09ae0f6c 1100 "vexch1\\t%0,%1"
526b7aee
SV
1101 [(set_attr "type" "simd_vpermute")
1102 (set_attr "length" "4")
1103 (set_attr "cond" "nocond")])
1104
1105(define_insn "vexch2_insn"
1106 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1107 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1108 UNSPEC_ARC_SIMD_VEXCH2))]
526b7aee 1109 "TARGET_SIMD_SET"
09ae0f6c 1110 "vexch2\\t%0,%1"
526b7aee
SV
1111 [(set_attr "type" "simd_vpermute")
1112 (set_attr "length" "4")
1113 (set_attr "cond" "nocond")])
1114
1115(define_insn "vexch4_insn"
1116 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1117 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1118 UNSPEC_ARC_SIMD_VEXCH4))]
526b7aee 1119 "TARGET_SIMD_SET"
09ae0f6c 1120 "vexch4\\t%0,%1"
526b7aee
SV
1121 [(set_attr "type" "simd_vpermute")
1122 (set_attr "length" "4")
1123 (set_attr "cond" "nocond")])
1124
1125(define_insn "vupbaw_insn"
1126 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1127 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1128 UNSPEC_ARC_SIMD_VUPBAW))]
526b7aee 1129 "TARGET_SIMD_SET"
09ae0f6c 1130 "vupbaw\\t%0,%1"
526b7aee
SV
1131 [(set_attr "type" "simd_vpack_with_acc")
1132 (set_attr "length" "4")
1133 (set_attr "cond" "nocond")])
1134
1135(define_insn "vupbw_insn"
1136 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1137 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1138 UNSPEC_ARC_SIMD_VUPBW))]
526b7aee 1139 "TARGET_SIMD_SET"
09ae0f6c 1140 "vupbw\\t%0,%1"
526b7aee
SV
1141 [(set_attr "type" "simd_vpack")
1142 (set_attr "length" "4")
1143 (set_attr "cond" "nocond")])
1144
1145(define_insn "vupsbaw_insn"
1146 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1147 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1148 UNSPEC_ARC_SIMD_VUPSBAW))]
526b7aee 1149 "TARGET_SIMD_SET"
09ae0f6c 1150 "vupsbaw\\t%0,%1"
526b7aee
SV
1151 [(set_attr "type" "simd_vpack_with_acc")
1152 (set_attr "length" "4")
1153 (set_attr "cond" "nocond")])
1154
1155(define_insn "vupsbw_insn"
1156 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1157 (unspec:V8HI [(match_operand:V8HI 1 "vector_register_operand" "v")]
1158 UNSPEC_ARC_SIMD_VUPSBW))]
526b7aee 1159 "TARGET_SIMD_SET"
09ae0f6c 1160 "vupsbw\\t%0,%1"
526b7aee
SV
1161 [(set_attr "type" "simd_vpack")
1162 (set_attr "length" "4")
1163 (set_attr "cond" "nocond")])
1164
1165; DMA setup instructions
1166(define_insn "vdirun_insn"
1167 [(set (match_operand:SI 0 "arc_simd_dma_register_operand" "=d")
c69899f0 1168 (unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand" "r")
09ae0f6c
CZ
1169 (match_operand:SI 2 "nonmemory_operand" "r")]
1170 UNSPEC_ARC_SIMD_VDIRUN))]
526b7aee 1171 "TARGET_SIMD_SET"
09ae0f6c 1172 "vdirun\\t%1,%2"
526b7aee
SV
1173 [(set_attr "type" "simd_dma")
1174 (set_attr "length" "4")
1175 (set_attr "cond" "nocond")])
1176
1177(define_insn "vdorun_insn"
1178 [(set (match_operand:SI 0 "arc_simd_dma_register_operand" "=d")
c69899f0 1179 (unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand" "r")
09ae0f6c
CZ
1180 (match_operand:SI 2 "nonmemory_operand" "r")]
1181 UNSPEC_ARC_SIMD_VDORUN))]
526b7aee 1182 "TARGET_SIMD_SET"
09ae0f6c 1183 "vdorun\\t%1,%2"
526b7aee
SV
1184 [(set_attr "type" "simd_dma")
1185 (set_attr "length" "4")
1186 (set_attr "cond" "nocond")])
1187
1188(define_insn "vdiwr_insn"
1189 [(set (match_operand:SI 0 "arc_simd_dma_register_operand" "=d,d")
09ae0f6c
CZ
1190 (unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand" "r,Cal")]
1191 UNSPEC_ARC_SIMD_VDIWR))]
526b7aee 1192 "TARGET_SIMD_SET"
09ae0f6c 1193 "vdiwr\\t%0,%1"
526b7aee
SV
1194 [(set_attr "type" "simd_dma")
1195 (set_attr "length" "4,8")
1196 (set_attr "cond" "nocond,nocond")])
1197
1198(define_insn "vdowr_insn"
1199 [(set (match_operand:SI 0 "arc_simd_dma_register_operand" "=d,d")
09ae0f6c
CZ
1200 (unspec_volatile:SI [(match_operand:SI 1 "nonmemory_operand" "r,Cal")]
1201 UNSPEC_ARC_SIMD_VDOWR))]
526b7aee 1202 "TARGET_SIMD_SET"
09ae0f6c 1203 "vdowr\\t%0,%1"
526b7aee
SV
1204 [(set_attr "type" "simd_dma")
1205 (set_attr "length" "4,8")
1206 (set_attr "cond" "nocond,nocond")])
1207
1208;; vector record and run instructions
1209(define_insn "vrec_insn"
09ae0f6c
CZ
1210 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "r")]
1211 UNSPEC_ARC_SIMD_VREC)]
526b7aee 1212 "TARGET_SIMD_SET"
09ae0f6c 1213 "vrec\\t%0"
526b7aee
SV
1214 [(set_attr "type" "simd_vcontrol")
1215 (set_attr "length" "4")
1216 (set_attr "cond" "nocond")])
1217
1218(define_insn "vrun_insn"
09ae0f6c
CZ
1219 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "r")]
1220 UNSPEC_ARC_SIMD_VRUN)]
526b7aee 1221 "TARGET_SIMD_SET"
09ae0f6c 1222 "vrun\\t%0"
526b7aee
SV
1223 [(set_attr "type" "simd_vcontrol")
1224 (set_attr "length" "4")
1225 (set_attr "cond" "nocond")])
1226
1227(define_insn "vrecrun_insn"
09ae0f6c
CZ
1228 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "r")]
1229 UNSPEC_ARC_SIMD_VRECRUN)]
526b7aee 1230 "TARGET_SIMD_SET"
09ae0f6c 1231 "vrecrun\\t%0"
526b7aee
SV
1232 [(set_attr "type" "simd_vcontrol")
1233 (set_attr "length" "4")
1234 (set_attr "cond" "nocond")])
1235
1236(define_insn "vendrec_insn"
09ae0f6c
CZ
1237 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "r")]
1238 UNSPEC_ARC_SIMD_VENDREC)]
526b7aee 1239 "TARGET_SIMD_SET"
09ae0f6c 1240 "vendrec\\t%0"
526b7aee
SV
1241 [(set_attr "type" "simd_vcontrol")
1242 (set_attr "length" "4")
1243 (set_attr "cond" "nocond")])
1244
526b7aee 1245(define_insn "vld32wh_insn"
d1ab0a32
CZ
1246 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1247 (vec_concat:V8HI
1248 (zero_extend:V4HI
1249 (mem:V4QI
1250 (plus:SI
1251 (match_operand:SI 1 "immediate_operand" "P")
1252 (zero_extend:SI
1253 (vec_select:HI
1254 (match_operand:V8HI 2 "vector_register_operand" "v")
1255 (parallel [(match_operand:SI 3 "immediate_operand" "L")]))))))
1256 (vec_select:V4HI
1257 (match_dup 0)
1258 (parallel [(const_int 0) (const_int 1) (const_int 2) (const_int 3)])
1259 )))]
526b7aee 1260 "TARGET_SIMD_SET"
09ae0f6c 1261 "vld32wh\\t%0,[i%3,%1]"
526b7aee
SV
1262 [(set_attr "type" "simd_vload")
1263 (set_attr "length" "4")
1264 (set_attr "cond" "nocond")])
1265
1266(define_insn "vld32wl_insn"
d1ab0a32
CZ
1267 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1268 (vec_concat:V8HI
1269 (vec_select:V4HI
1270 (match_dup 0)
1271 (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1272 (zero_extend:V4HI
1273 (mem:V4QI
1274 (plus:SI
1275 (match_operand:SI 1 "immediate_operand" "P")
1276 (zero_extend:SI
1277 (vec_select:HI (match_operand:V8HI 2 "vector_register_operand" "v")
1278 (parallel
1279 [(match_operand:SI 3 "immediate_operand" "L")]))
1280 ))))))]
526b7aee 1281 "TARGET_SIMD_SET"
09ae0f6c 1282 "vld32wl\\t%0,[i%3,%1]"
526b7aee
SV
1283 [(set_attr "type" "simd_vload")
1284 (set_attr "length" "4")
1285 (set_attr "cond" "nocond")])
1286
1287(define_insn "vld64w_insn"
1288 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
09ae0f6c
CZ
1289 (zero_extend:V8HI
1290 (mem:V4HI
1291 (plus:SI
1292 (zero_extend:SI
1293 (vec_select:HI (match_operand:V8HI 1 "vector_register_operand" "v")
1294 (parallel [(match_operand:SI 2 "immediate_operand" "L")])))
1295 (match_operand:SI 3 "immediate_operand" "P")))))]
526b7aee 1296 "TARGET_SIMD_SET"
09ae0f6c 1297 "vld64w\\t%0,[i%2,%3]"
526b7aee
SV
1298 [(set_attr "type" "simd_vload")
1299 (set_attr "length" "4")
1300 (set_attr "cond" "nocond")]
1301)
1302
1303(define_insn "vld64_insn"
d1ab0a32
CZ
1304 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1305 (vec_concat:V8HI
1306 (vec_select:V4HI
1307 (match_dup 0)
1308 (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1309 (mem:V4HI
1310 (plus:SI
1311 (match_operand:SI 1 "immediate_operand" "P")
1312 (zero_extend:SI
1313 (vec_select:HI
1314 (match_operand:V8HI 2 "vector_register_operand" "v")
1315 (parallel [(match_operand:SI 3 "immediate_operand" "L")]))
1316 )))))]
526b7aee 1317 "TARGET_SIMD_SET"
09ae0f6c 1318 "vld64\\t%0,[i%3,%1]"
526b7aee
SV
1319 [(set_attr "type" "simd_vload")
1320 (set_attr "length" "4")
1321 (set_attr "cond" "nocond")])
1322
1323(define_insn "vld32_insn"
d1ab0a32
CZ
1324 [(set (match_operand:V8HI 0 "vector_register_operand" "=v")
1325 (vec_concat:V8HI
1326 (vec_select:V4HI
1327 (match_dup 0)
1328 (parallel [(const_int 4) (const_int 5) (const_int 6) (const_int 7)]))
1329 (vec_concat:V4HI
1330 (vec_select:V2HI
1331 (match_dup 0)
1332 (parallel [(const_int 2) (const_int 3)]))
1333 (mem:V2HI
1334 (plus:SI
1335 (match_operand:SI 1 "immediate_operand" "P")
1336 (zero_extend:SI
1337 (vec_select:HI
1338 (match_operand:V8HI 2 "vector_register_operand" "v")
1339 (parallel [(match_operand:SI 3 "immediate_operand" "L")]))))))))]
526b7aee 1340 "TARGET_SIMD_SET"
09ae0f6c 1341 "vld32\\t%0,[i%3,%1]"
526b7aee
SV
1342 [(set_attr "type" "simd_vload")
1343 (set_attr "length" "4")
1344 (set_attr "cond" "nocond")])
1345
1346(define_insn "vst16_n_insn"
09ae0f6c
CZ
1347 [(set (mem:HI
1348 (plus:SI
1349 (match_operand:SI 0 "immediate_operand" "P")
1350 (zero_extend:SI
1351 (vec_select:HI (match_operand:V8HI 1 "vector_register_operand" "v")
1352 (parallel [(match_operand:SI 2 "immediate_operand" "L")])))))
526b7aee
SV
1353 (vec_select:HI (match_operand:V8HI 3 "vector_register_operand" "v")
1354 (parallel [(match_operand:SI 4 "immediate_operand" "L")])))]
1355 "TARGET_SIMD_SET"
09ae0f6c 1356 "vst16_%4\\t%3,[i%2,%0]"
526b7aee
SV
1357 [(set_attr "type" "simd_vstore")
1358 (set_attr "length" "4")
1359 (set_attr "cond" "nocond")])
1360
1361(define_insn "vst32_n_insn"
09ae0f6c
CZ
1362 [(set (mem:SI
1363 (plus:SI
1364 (match_operand:SI 0 "immediate_operand" "P")
1365 (zero_extend:SI
1366 (vec_select:HI (match_operand:V8HI 1 "vector_register_operand" "v")
1367 (parallel [(match_operand:SI 2 "immediate_operand" "L")])))))
1368 (vec_select:SI (unspec:V4SI [(match_operand:V8HI 3 "vector_register_operand" "v")]
1369 UNSPEC_ARC_SIMD_VCAST)
1370 (parallel [(match_operand:SI 4 "immediate_operand" "L")])))]
526b7aee 1371 "TARGET_SIMD_SET"
09ae0f6c 1372 "vst32_%4\\t%3,[i%2,%0]"
526b7aee
SV
1373 [(set_attr "type" "simd_vstore")
1374 (set_attr "length" "4")
1375 (set_attr "cond" "nocond")])
1376
1377;; SIMD unit interrupt
1378(define_insn "vinti_insn"
09ae0f6c
CZ
1379 [(unspec_volatile [(match_operand:SI 0 "nonmemory_operand" "L")]
1380 UNSPEC_ARC_SIMD_VINTI)]
526b7aee 1381 "TARGET_SIMD_SET"
09ae0f6c 1382 "vinti\\t%0"
526b7aee
SV
1383 [(set_attr "type" "simd_vcontrol")
1384 (set_attr "length" "4")
1385 (set_attr "cond" "nocond")])
00c072ae
CZ
1386
1387;; New ARCv2 SIMD extensions
1388
1389;;64-bit vectors of halwords and words
1390(define_mode_iterator VWH [V4HI V2SI])
1391
1392;;double element vectors
1393(define_mode_iterator VDV [V2HI V2SI])
1394(define_mode_attr V_addsub [(V2HI "HI") (V2SI "SI")])
1395(define_mode_attr V_addsub_suffix [(V2HI "2h") (V2SI "")])
1396
1397;;all vectors
79a27f32
CZ
1398(define_mode_iterator VCT [(V2HI "TARGET_PLUS_DMPY")
1399 (V4HI "TARGET_PLUS_QMACW")
1400 (V2SI "TARGET_PLUS_QMACW")])
00c072ae
CZ
1401(define_mode_attr V_suffix [(V2HI "2h") (V4HI "4h") (V2SI "2")])
1402
79a27f32
CZ
1403(define_code_iterator EMUVEC [(mult "TARGET_MPYW")
1404 (div "TARGET_DIVREM")
1405 smax smin])
1406
1407(define_code_attr voptab [(mult "mul")
1408 (div "div")
1409 (smin "smin")
1410 (smax "smax")])
1411
00c072ae
CZ
1412;; Widening operations.
1413(define_code_iterator SE [sign_extend zero_extend])
1414(define_code_attr V_US [(sign_extend "s") (zero_extend "u")])
1415(define_code_attr V_US_suffix [(sign_extend "") (zero_extend "u")])
1416
1417
1418;; Move patterns
1419(define_expand "movv2hi"
1420 [(set (match_operand:V2HI 0 "move_dest_operand" "")
1421 (match_operand:V2HI 1 "general_operand" ""))]
1422 ""
1423 "{
1424 if (prepare_move_operands (operands, V2HImode))
1425 DONE;
1426 }")
1427
1428(define_insn_and_split "*movv2hi_insn"
30c0df2a 1429 [(set (match_operand:V2HI 0 "move_dest_operand" "=r,r,r,m")
09ae0f6c 1430 (match_operand:V2HI 1 "general_operand" "i,r,m,r"))]
00c072ae
CZ
1431 "(register_operand (operands[0], V2HImode)
1432 || register_operand (operands[1], V2HImode))"
1433 "@
1434 #
09ae0f6c
CZ
1435 mov%?\\t%0,%1
1436 ld%U1%V1\\t%0,%1
1437 st%U0%V0\\t%1,%0"
00c072ae
CZ
1438 "reload_completed && GET_CODE (operands[1]) == CONST_VECTOR"
1439 [(set (match_dup 0) (match_dup 2))]
1440 {
1441 HOST_WIDE_INT intval = INTVAL (XVECEXP (operands[1], 0, 1)) << 16;
1442 intval |= INTVAL (XVECEXP (operands[1], 0, 0)) & 0xFFFF;
1443
1444 operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));
1445 operands[2] = GEN_INT (trunc_int_for_mode (intval, SImode));
1446 }
1447 [(set_attr "type" "move,move,load,store")
1448 (set_attr "predicable" "yes,yes,no,no")
1449 (set_attr "iscompact" "false,false,false,false")
1450 ])
1451
1452(define_expand "movmisalignv2hi"
09ae0f6c
CZ
1453 [(set (match_operand:V2HI 0 "general_operand" "")
1454 (match_operand:V2HI 1 "general_operand" ""))]
0c2f8805 1455 "unaligned_access"
9f532472
CZ
1456 "{
1457 if (prepare_move_operands (operands, V2HImode))
1458 DONE;
1459 }")
00c072ae
CZ
1460
1461(define_expand "mov<mode>"
1462 [(set (match_operand:VWH 0 "move_dest_operand" "")
1463 (match_operand:VWH 1 "general_operand" ""))]
1464 ""
1465 "{
9f532472
CZ
1466 if (prepare_move_operands (operands, <MODE>mode))
1467 DONE;
00c072ae
CZ
1468 }")
1469
1470(define_insn_and_split "*mov<mode>_insn"
1471 [(set (match_operand:VWH 0 "move_dest_operand" "=r,r,r,m")
1472 (match_operand:VWH 1 "general_operand" "i,r,m,r"))]
c5395d88 1473 "(register_operand (operands[0], <MODE>mode)
00c072ae 1474 || register_operand (operands[1], <MODE>mode))"
c0ba7a8a
CZ
1475 "@
1476 #
1477 vadd2\\t%0,%1,0
1478 ldd%U1%V1\\t%0,%1
1479 std%U0%V0\\t%1,%0"
1480 "&& reload_completed && arc_split_move_p (operands)"
00c072ae
CZ
1481 [(const_int 0)]
1482 {
1483 arc_split_move (operands);
1484 DONE;
1485 }
c0ba7a8a
CZ
1486 [(set_attr "type" "move,move,load,store")
1487 (set_attr "length" "16,8,16,16")])
00c072ae
CZ
1488
1489(define_expand "movmisalign<mode>"
09ae0f6c
CZ
1490 [(set (match_operand:VWH 0 "general_operand" "")
1491 (match_operand:VWH 1 "general_operand" ""))]
0c2f8805 1492 "unaligned_access"
9f532472
CZ
1493 "{
1494 if (prepare_move_operands (operands, <MODE>mode))
1495 DONE;
1496 }")
00c072ae
CZ
1497
1498(define_insn "bswapv2hi2"
1499 [(set (match_operand:V2HI 0 "register_operand" "=r,r")
09ae0f6c 1500 (bswap:V2HI (match_operand:V2HI 1 "nonmemory_operand" "r,i")))]
00c072ae 1501 "TARGET_V2 && TARGET_SWAP"
09ae0f6c 1502 "swape\\t%0,%1"
00c072ae
CZ
1503 [(set_attr "length" "4,8")
1504 (set_attr "type" "two_cycle_core")])
1505
1506;; Simple arithmetic insns
1507(define_insn "add<mode>3"
1508 [(set (match_operand:VCT 0 "register_operand" "=r,r")
1509 (plus:VCT (match_operand:VCT 1 "register_operand" "0,r")
1510 (match_operand:VCT 2 "register_operand" "r,r")))]
1511 "TARGET_PLUS_DMPY"
09ae0f6c 1512 "vadd<V_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1513 [(set_attr "length" "4")
1514 (set_attr "type" "multi")
1515 (set_attr "predicable" "yes,no")
1516 (set_attr "cond" "canuse,nocond")])
1517
1518(define_insn "sub<mode>3"
1519 [(set (match_operand:VCT 0 "register_operand" "=r,r")
1520 (minus:VCT (match_operand:VCT 1 "register_operand" "0,r")
1521 (match_operand:VCT 2 "register_operand" "r,r")))]
1522 "TARGET_PLUS_DMPY"
09ae0f6c 1523 "vsub<V_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1524 [(set_attr "length" "4")
1525 (set_attr "type" "multi")
1526 (set_attr "predicable" "yes,no")
1527 (set_attr "cond" "canuse,nocond")])
1528
1529;; Combined arithmetic ops
1530(define_insn "addsub<mode>3"
1531 [(set (match_operand:VDV 0 "register_operand" "=r,r")
1532 (vec_concat:VDV
09ae0f6c
CZ
1533 (plus:<V_addsub>
1534 (vec_select:<V_addsub> (match_operand:VDV 1 "register_operand" "0,r")
1535 (parallel [(const_int 0)]))
1536 (vec_select:<V_addsub> (match_operand:VDV 2 "register_operand" "r,r")
1537 (parallel [(const_int 0)])))
1538 (minus:<V_addsub>
1539 (vec_select:<V_addsub> (match_dup 1) (parallel [(const_int 1)]))
1540 (vec_select:<V_addsub> (match_dup 2) (parallel [(const_int 1)])))))]
00c072ae 1541 "TARGET_PLUS_DMPY"
09ae0f6c 1542 "vaddsub<V_addsub_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1543 [(set_attr "length" "4")
1544 (set_attr "type" "multi")
1545 (set_attr "predicable" "yes,no")
1546 (set_attr "cond" "canuse,nocond")])
1547
1548(define_insn "subadd<mode>3"
1549 [(set (match_operand:VDV 0 "register_operand" "=r,r")
1550 (vec_concat:VDV
09ae0f6c
CZ
1551 (minus:<V_addsub>
1552 (vec_select:<V_addsub> (match_operand:VDV 1 "register_operand" "0,r")
1553 (parallel [(const_int 0)]))
1554 (vec_select:<V_addsub> (match_operand:VDV 2 "register_operand" "r,r")
1555 (parallel [(const_int 0)])))
1556 (plus:<V_addsub>
1557 (vec_select:<V_addsub> (match_dup 1) (parallel [(const_int 1)]))
1558 (vec_select:<V_addsub> (match_dup 2) (parallel [(const_int 1)])))))]
00c072ae 1559 "TARGET_PLUS_DMPY"
09ae0f6c 1560 "vsubadd<V_addsub_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1561 [(set_attr "length" "4")
1562 (set_attr "type" "multi")
1563 (set_attr "predicable" "yes,no")
1564 (set_attr "cond" "canuse,nocond")])
1565
1566(define_insn "addsubv4hi3"
1567 [(set (match_operand:V4HI 0 "even_register_operand" "=r,r")
1568 (vec_concat:V4HI
1569 (vec_concat:V2HI
09ae0f6c
CZ
1570 (plus:HI
1571 (vec_select:HI (match_operand:V4HI 1 "even_register_operand" "0,r")
1572 (parallel [(const_int 0)]))
1573 (vec_select:HI (match_operand:V4HI 2 "even_register_operand" "r,r")
1574 (parallel [(const_int 0)])))
00c072ae
CZ
1575 (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))
1576 (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))
1577 (vec_concat:V2HI
1578 (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
1579 (vec_select:HI (match_dup 2) (parallel [(const_int 2)])))
1580 (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))
1581 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
1582 ))]
1583 "TARGET_PLUS_QMACW"
09ae0f6c 1584 "vaddsub4h%?\\t%0,%1,%2"
00c072ae
CZ
1585 [(set_attr "length" "4")
1586 (set_attr "type" "multi")
1587 (set_attr "predicable" "yes,no")
1588 (set_attr "cond" "canuse,nocond")])
1589
1590(define_insn "subaddv4hi3"
1591 [(set (match_operand:V4HI 0 "even_register_operand" "=r,r")
1592 (vec_concat:V4HI
1593 (vec_concat:V2HI
09ae0f6c
CZ
1594 (minus:HI
1595 (vec_select:HI (match_operand:V4HI 1 "even_register_operand" "0,r")
1596 (parallel [(const_int 0)]))
1597 (vec_select:HI (match_operand:V4HI 2 "even_register_operand" "r,r")
1598 (parallel [(const_int 0)])))
00c072ae
CZ
1599 (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 1)]))
1600 (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))
1601 (vec_concat:V2HI
1602 (minus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 2)]))
1603 (vec_select:HI (match_dup 2) (parallel [(const_int 2)])))
1604 (plus:HI (vec_select:HI (match_dup 1) (parallel [(const_int 3)]))
1605 (vec_select:HI (match_dup 2) (parallel [(const_int 3)]))))
1606 ))]
1607 "TARGET_PLUS_QMACW"
09ae0f6c 1608 "vsubadd4h%?\\t%0,%1,%2"
00c072ae
CZ
1609 [(set_attr "length" "4")
1610 (set_attr "type" "multi")
1611 (set_attr "predicable" "yes,no")
1612 (set_attr "cond" "canuse,nocond")])
1613
1614;; Multiplication
1615(define_insn "dmpyh<V_US_suffix>"
1616 [(set (match_operand:SI 0 "register_operand" "=r,r")
1617 (plus:SI
1618 (mult:SI
1619 (SE:SI
1620 (vec_select:HI (match_operand:V2HI 1 "register_operand" "0,r")
1621 (parallel [(const_int 0)])))
1622 (SE:SI
1623 (vec_select:HI (match_operand:V2HI 2 "register_operand" "r,r")
1624 (parallel [(const_int 0)]))))
1625 (mult:SI
1626 (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
1627 (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 1)]))))))
1628 (set (reg:DI ARCV2_ACC)
1629 (zero_extend:DI
1630 (plus:SI
1631 (mult:SI
1632 (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 0)])))
1633 (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 0)]))))
1634 (mult:SI
1635 (SE:SI (vec_select:HI (match_dup 1) (parallel [(const_int 1)])))
1636 (SE:SI (vec_select:HI (match_dup 2) (parallel [(const_int 1)])))))))]
1637 "TARGET_PLUS_DMPY"
09ae0f6c 1638 "dmpyh<V_US_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1639 [(set_attr "length" "4")
1640 (set_attr "type" "multi")
1641 (set_attr "predicable" "yes,no")
1642 (set_attr "cond" "canuse,nocond")])
1643
1644;; We can use dmac as well here. To be investigated which version
1645;; brings more.
85a2ed05 1646(define_expand "sdot_prodsiv2hi"
00c072ae
CZ
1647 [(match_operand:SI 0 "register_operand" "")
1648 (match_operand:V2HI 1 "register_operand" "")
1649 (match_operand:V2HI 2 "register_operand" "")
1650 (match_operand:SI 3 "register_operand" "")]
1651 "TARGET_PLUS_DMPY"
1652{
1653 rtx t = gen_reg_rtx (SImode);
1654 emit_insn (gen_dmpyh (t, operands[1], operands[2]));
1655 emit_insn (gen_addsi3 (operands[0], operands[3], t));
1656 DONE;
1657})
1658
85a2ed05 1659(define_expand "udot_prodsiv2hi"
00c072ae
CZ
1660 [(match_operand:SI 0 "register_operand" "")
1661 (match_operand:V2HI 1 "register_operand" "")
1662 (match_operand:V2HI 2 "register_operand" "")
1663 (match_operand:SI 3 "register_operand" "")]
1664 "TARGET_PLUS_DMPY"
1665{
1666 rtx t = gen_reg_rtx (SImode);
1667 emit_insn (gen_dmpyhu (t, operands[1], operands[2]));
1668 emit_insn (gen_addsi3 (operands[0], operands[3], t));
1669 DONE;
1670})
1671
85a2ed05 1672(define_expand "sdot_prodv2siv4hi"
c5395d88
CZ
1673 [(match_operand:V2SI 0 "register_operand" "")
1674 (match_operand:V4HI 1 "register_operand" "")
1675 (match_operand:V4HI 2 "register_operand" "")
1676 (match_operand:V2SI 3 "register_operand" "")]
1677 "TARGET_PLUS_MACD"
1678{
1679 rtx acc_reg = gen_rtx_REG (V2SImode, ACC_REG_FIRST);
1680 rtx op1_low = gen_lowpart (V2HImode, operands[1]);
1681 rtx op1_high = gen_highpart (V2HImode, operands[1]);
1682 rtx op2_low = gen_lowpart (V2HImode, operands[2]);
1683 rtx op2_high = gen_highpart (V2HImode, operands[2]);
1684
1685 emit_move_insn (acc_reg, operands[3]);
1686 emit_insn (gen_arc_vec_smac_v2hiv2si_zero (op1_low, op2_low));
1687 emit_insn (gen_arc_vec_smac_v2hiv2si (operands[0], op1_high, op2_high));
1688 DONE;
1689})
1690
85a2ed05 1691(define_expand "udot_prodv2siv4hi"
c5395d88
CZ
1692 [(match_operand:V2SI 0 "register_operand" "")
1693 (match_operand:V4HI 1 "register_operand" "")
1694 (match_operand:V4HI 2 "register_operand" "")
1695 (match_operand:V2SI 3 "register_operand" "")]
1696 "TARGET_PLUS_MACD"
1697{
1698 rtx acc_reg = gen_rtx_REG (V2SImode, ACC_REG_FIRST);
1699 rtx op1_low = gen_lowpart (V2HImode, operands[1]);
1700 rtx op1_high = gen_highpart (V2HImode, operands[1]);
1701 rtx op2_low = gen_lowpart (V2HImode, operands[2]);
1702 rtx op2_high = gen_highpart (V2HImode, operands[2]);
1703
1704 emit_move_insn (acc_reg, operands[3]);
1705 emit_insn (gen_arc_vec_umac_v2hiv2si_zero (op1_low, op2_low));
1706 emit_insn (gen_arc_vec_umac_v2hiv2si (operands[0], op1_high, op2_high));
1707 DONE;
1708})
1709
00c072ae
CZ
1710(define_insn "arc_vec_<V_US>mult_lo_v4hi"
1711 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1712 (mult:V2SI (SE:V2SI (vec_select:V2HI
1713 (match_operand:V4HI 1 "even_register_operand" "0,r")
1714 (parallel [(const_int 0) (const_int 1)])))
1715 (SE:V2SI (vec_select:V2HI
1716 (match_operand:V4HI 2 "even_register_operand" "r,r")
1717 (parallel [(const_int 0) (const_int 1)])))))
1718 (set (reg:V2SI ARCV2_ACC)
09ae0f6c
CZ
1719 (mult:V2SI (SE:V2SI
1720 (vec_select:V2HI (match_dup 1)
1721 (parallel [(const_int 0) (const_int 1)])))
1722 (SE:V2SI
1723 (vec_select:V2HI (match_dup 2)
1724 (parallel [(const_int 0) (const_int 1)])))))
00c072ae
CZ
1725 ]
1726 "TARGET_PLUS_MACD"
09ae0f6c 1727 "vmpy2h<V_US_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1728 [(set_attr "length" "4")
1729 (set_attr "type" "multi")
1730 (set_attr "predicable" "yes,no")
1731 (set_attr "cond" "canuse,nocond")])
1732
1733(define_insn "arc_vec_<V_US>multacc_lo_v4hi"
1734 [(set (reg:V2SI ARCV2_ACC)
1735 (mult:V2SI (SE:V2SI (vec_select:V2HI
1736 (match_operand:V4HI 0 "even_register_operand" "r")
1737 (parallel [(const_int 0) (const_int 1)])))
1738 (SE:V2SI (vec_select:V2HI
1739 (match_operand:V4HI 1 "even_register_operand" "r")
1740 (parallel [(const_int 0) (const_int 1)])))))
1741 ]
1742 "TARGET_PLUS_MACD"
09ae0f6c 1743 "vmpy2h<V_US_suffix>%?\\t0,%0,%1"
00c072ae
CZ
1744 [(set_attr "length" "4")
1745 (set_attr "type" "multi")
1746 (set_attr "predicable" "no")
1747 (set_attr "cond" "nocond")])
1748
1749(define_expand "vec_widen_<V_US>mult_lo_v4hi"
1750 [(set (match_operand:V2SI 0 "even_register_operand" "")
1751 (mult:V2SI (SE:V2SI (vec_select:V2HI
1752 (match_operand:V4HI 1 "even_register_operand" "")
1753 (parallel [(const_int 0) (const_int 1)])))
1754 (SE:V2SI (vec_select:V2HI
1755 (match_operand:V4HI 2 "even_register_operand" "")
1756 (parallel [(const_int 0) (const_int 1)])))))]
1757 "TARGET_PLUS_QMACW"
1758 {
1759 emit_insn (gen_arc_vec_<V_US>mult_lo_v4hi (operands[0],
1760 operands[1],
1761 operands[2]));
1762 DONE;
1763 }
1764)
1765
1766(define_insn "arc_vec_<V_US>mult_hi_v4hi"
1767 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1768 (mult:V2SI (SE:V2SI (vec_select:V2HI
1769 (match_operand:V4HI 1 "even_register_operand" "0,r")
1770 (parallel [(const_int 2) (const_int 3)])))
1771 (SE:V2SI (vec_select:V2HI
1772 (match_operand:V4HI 2 "even_register_operand" "r,r")
1773 (parallel [(const_int 2) (const_int 3)])))))
1774 (set (reg:V2SI ARCV2_ACC)
09ae0f6c
CZ
1775 (mult:V2SI (SE:V2SI
1776 (vec_select:V2HI (match_dup 1)
1777 (parallel [(const_int 2) (const_int 3)])))
1778 (SE:V2SI
1779 (vec_select:V2HI (match_dup 2)
1780 (parallel [(const_int 2) (const_int 3)])))))
00c072ae
CZ
1781 ]
1782 "TARGET_PLUS_QMACW"
09ae0f6c 1783 "vmpy2h<V_US_suffix>%?\\t%0,%R1,%R2"
00c072ae
CZ
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_expand "vec_widen_<V_US>mult_hi_v4hi"
09ae0f6c 1790 [(set (match_operand:V2SI 0 "even_register_operand")
00c072ae 1791 (mult:V2SI (SE:V2SI (vec_select:V2HI
09ae0f6c
CZ
1792 (match_operand:V4HI 1 "even_register_operand")
1793 (parallel [(const_int 2) (const_int 3)])))
00c072ae 1794 (SE:V2SI (vec_select:V2HI
09ae0f6c
CZ
1795 (match_operand:V4HI 2 "even_register_operand")
1796 (parallel [(const_int 2) (const_int 3)])))))]
79a27f32 1797 "TARGET_PLUS_QMACW"
00c072ae
CZ
1798 {
1799 emit_insn (gen_arc_vec_<V_US>mult_hi_v4hi (operands[0],
1800 operands[1],
1801 operands[2]));
1802 DONE;
1803 }
1804)
1805
c5395d88 1806(define_insn "arc_vec_<V_US>mac_v2hiv2si"
09ae0f6c 1807 [(set (match_operand:V2SI 0 "even_register_operand" "=r,Ral,r")
00c072ae 1808 (plus:V2SI
09ae0f6c
CZ
1809 (mult:V2SI
1810 (SE:V2SI (match_operand:V2HI 1 "register_operand" "0, r,r"))
1811 (SE:V2SI (match_operand:V2HI 2 "register_operand" "r, r,r")))
c5395d88 1812 (reg:V2SI ARCV2_ACC)))
00c072ae
CZ
1813 (set (reg:V2SI ARCV2_ACC)
1814 (plus:V2SI
c5395d88
CZ
1815 (mult:V2SI (SE:V2SI (match_dup 1))
1816 (SE:V2SI (match_dup 2)))
1817 (reg:V2SI ARCV2_ACC)))
00c072ae
CZ
1818 ]
1819 "TARGET_PLUS_MACD"
c5395d88
CZ
1820 "@
1821 vmac2h<V_US_suffix>%?\\t%0,%1,%2
1822 vmac2h<V_US_suffix>%?\\t0,%1,%2
1823 vmac2h<V_US_suffix>%?\\t%0,%1,%2"
00c072ae
CZ
1824 [(set_attr "length" "4")
1825 (set_attr "type" "multi")
c5395d88
CZ
1826 (set_attr "predicable" "yes,no,no")])
1827
1828(define_insn "arc_vec_<V_US>mac_v2hiv2si_zero"
1829 [(set (reg:V2SI ARCV2_ACC)
1830 (plus:V2SI
1831 (mult:V2SI (SE:V2SI (match_operand:V2HI 0 "register_operand" "r"))
1832 (SE:V2SI (match_operand:V2HI 1 "register_operand" "r")))
1833 (reg:V2SI ARCV2_ACC)))]
1834 "TARGET_PLUS_MACD"
1835 "vmac2h<V_US_suffix>%?\\t0,%0,%1"
1836 [(set_attr "length" "4")
1837 (set_attr "type" "multi")])
00c072ae
CZ
1838
1839;; Builtins
1840(define_insn "dmach"
1841 [(set (match_operand:SI 0 "register_operand" "=r,r")
1842 (unspec:SI [(match_operand:V2HI 1 "register_operand" "0,r")
1843 (match_operand:V2HI 2 "register_operand" "r,r")
1844 (reg:DI ARCV2_ACC)]
1845 UNSPEC_ARC_DMACH))
1846 (clobber (reg:DI ARCV2_ACC))]
1847 "TARGET_PLUS_DMPY"
09ae0f6c 1848 "dmach%?\\t%0,%1,%2"
00c072ae
CZ
1849 [(set_attr "length" "4")
1850 (set_attr "type" "multi")
1851 (set_attr "predicable" "yes,no")
1852 (set_attr "cond" "canuse,nocond")])
1853
1854(define_insn "dmachu"
1855 [(set (match_operand:SI 0 "register_operand" "=r,r")
1856 (unspec:SI [(match_operand:V2HI 1 "register_operand" "0,r")
1857 (match_operand:V2HI 2 "register_operand" "r,r")
1858 (reg:DI ARCV2_ACC)]
1859 UNSPEC_ARC_DMACHU))
1860 (clobber (reg:DI ARCV2_ACC))]
1861 "TARGET_PLUS_DMPY"
09ae0f6c 1862 "dmachu%?\\t%0,%1,%2"
00c072ae
CZ
1863 [(set_attr "length" "4")
1864 (set_attr "type" "multi")
1865 (set_attr "predicable" "yes,no")
1866 (set_attr "cond" "canuse,nocond")])
1867
1868(define_insn "dmacwh"
1869 [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1870 (unspec:DI [(match_operand:V2SI 1 "even_register_operand" "0,r")
1871 (match_operand:V2HI 2 "register_operand" "r,r")
1872 (reg:DI ARCV2_ACC)]
1873 UNSPEC_ARC_DMACWH))
1874 (clobber (reg:DI ARCV2_ACC))]
1875 "TARGET_PLUS_QMACW"
09ae0f6c 1876 "dmacwh%?\\t%0,%1,%2"
00c072ae
CZ
1877 [(set_attr "length" "4")
1878 (set_attr "type" "multi")
1879 (set_attr "predicable" "yes,no")
1880 (set_attr "cond" "canuse,nocond")])
1881
1882(define_insn "dmacwhu"
1883 [(set (match_operand:DI 0 "register_operand" "=r,r")
1884 (unspec:DI [(match_operand:V2SI 1 "even_register_operand" "0,r")
1885 (match_operand:V2HI 2 "register_operand" "r,r")
1886 (reg:DI ARCV2_ACC)]
1887 UNSPEC_ARC_DMACWHU))
1888 (clobber (reg:DI ARCV2_ACC))]
1889 "TARGET_PLUS_QMACW"
09ae0f6c 1890 "dmacwhu%?\\t%0,%1,%2"
00c072ae
CZ
1891 [(set_attr "length" "4")
1892 (set_attr "type" "multi")
1893 (set_attr "predicable" "yes,no")
1894 (set_attr "cond" "canuse,nocond")])
1895
1896(define_insn "vmac2h"
1897 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1898 (unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1899 (match_operand:V2HI 2 "register_operand" "r,r")
1900 (reg:DI ARCV2_ACC)]
1901 UNSPEC_ARC_VMAC2H))
1902 (clobber (reg:DI ARCV2_ACC))]
1903 "TARGET_PLUS_MACD"
09ae0f6c 1904 "vmac2h%?\\t%0,%1,%2"
00c072ae
CZ
1905 [(set_attr "length" "4")
1906 (set_attr "type" "multi")
1907 (set_attr "predicable" "yes,no")
1908 (set_attr "cond" "canuse,nocond")])
1909
1910(define_insn "vmac2hu"
1911 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1912 (unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1913 (match_operand:V2HI 2 "register_operand" "r,r")
1914 (reg:DI ARCV2_ACC)]
1915 UNSPEC_ARC_VMAC2HU))
1916 (clobber (reg:DI ARCV2_ACC))]
1917 "TARGET_PLUS_MACD"
09ae0f6c 1918 "vmac2hu%?\\t%0,%1,%2"
00c072ae
CZ
1919 [(set_attr "length" "4")
1920 (set_attr "type" "multi")
1921 (set_attr "predicable" "yes,no")
1922 (set_attr "cond" "canuse,nocond")])
1923
1924(define_insn "vmpy2h"
1925 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1926 (unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1927 (match_operand:V2HI 2 "register_operand" "r,r")]
1928 UNSPEC_ARC_VMPY2H))
1929 (clobber (reg:DI ARCV2_ACC))]
1930 "TARGET_PLUS_MACD"
09ae0f6c 1931 "vmpy2h%?\\t%0,%1,%2"
00c072ae
CZ
1932 [(set_attr "length" "4")
1933 (set_attr "type" "multi")
1934 (set_attr "predicable" "yes,no")
1935 (set_attr "cond" "canuse,nocond")])
1936
1937(define_insn "vmpy2hu"
1938 [(set (match_operand:V2SI 0 "even_register_operand" "=r,r")
1939 (unspec:V2SI [(match_operand:V2HI 1 "register_operand" "0,r")
1940 (match_operand:V2HI 2 "register_operand" "r,r")]
1941 UNSPEC_ARC_VMPY2HU))
1942 (clobber (reg:DI ARCV2_ACC))]
1943 "TARGET_PLUS_MACD"
09ae0f6c 1944 "vmpy2hu%?\\t%0,%1,%2"
00c072ae
CZ
1945 [(set_attr "length" "4")
1946 (set_attr "type" "multi")
1947 (set_attr "predicable" "yes,no")
1948 (set_attr "cond" "canuse,nocond")])
1949
1950(define_insn "qmach"
1951 [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1952 (unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1953 (match_operand:V4HI 2 "even_register_operand" "r,r")
1954 (reg:DI ARCV2_ACC)]
1955 UNSPEC_ARC_QMACH))
1956 (clobber (reg:DI ARCV2_ACC))]
1957 "TARGET_PLUS_QMACW"
09ae0f6c 1958 "qmach%?\\t%0,%1,%2"
00c072ae
CZ
1959 [(set_attr "length" "4")
1960 (set_attr "type" "multi")
1961 (set_attr "predicable" "yes,no")
1962 (set_attr "cond" "canuse,nocond")])
1963
1964(define_insn "qmachu"
1965 [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1966 (unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1967 (match_operand:V4HI 2 "even_register_operand" "r,r")
1968 (reg:DI ARCV2_ACC)]
1969 UNSPEC_ARC_QMACHU))
1970 (clobber (reg:DI ARCV2_ACC))]
1971 "TARGET_PLUS_QMACW"
09ae0f6c 1972 "qmachu%?\\t%0,%1,%2"
00c072ae
CZ
1973 [(set_attr "length" "4")
1974 (set_attr "type" "multi")
1975 (set_attr "predicable" "yes,no")
1976 (set_attr "cond" "canuse,nocond")])
1977
1978(define_insn "qmpyh"
1979 [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1980 (unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1981 (match_operand:V4HI 2 "even_register_operand" "r,r")]
1982 UNSPEC_ARC_QMPYH))
1983 (clobber (reg:DI ARCV2_ACC))]
1984 "TARGET_PLUS_QMACW"
09ae0f6c 1985 "qmpyh%?\\t%0,%1,%2"
00c072ae
CZ
1986 [(set_attr "length" "4")
1987 (set_attr "type" "multi")
1988 (set_attr "predicable" "yes,no")
1989 (set_attr "cond" "canuse,nocond")])
1990
1991(define_insn "qmpyhu"
1992 [(set (match_operand:DI 0 "even_register_operand" "=r,r")
1993 (unspec:DI [(match_operand:V4HI 1 "even_register_operand" "0,r")
1994 (match_operand:V4HI 2 "even_register_operand" "r,r")]
1995 UNSPEC_ARC_QMPYHU))
1996 (clobber (reg:DI ARCV2_ACC))]
1997 "TARGET_PLUS_QMACW"
09ae0f6c 1998 "qmpyhu%?\\t%0,%1,%2"
00c072ae
CZ
1999 [(set_attr "length" "4")
2000 (set_attr "type" "multi")
2001 (set_attr "predicable" "yes,no")
2002 (set_attr "cond" "canuse,nocond")])
79a27f32
CZ
2003
2004;; Emulated vector instructions.
2005(define_insn_and_split "<voptab>v2si3"
2006 [(set (match_operand:V2SI 0 "register_operand" "=r")
2007 (EMUVEC:V2SI (match_operand:V2SI 1 "register_operand" "r")
2008 (match_operand:V2SI 2 "nonmemory_operand" "ri")))]
2009 ""
2010 "#"
2011 "reload_completed"
2012 [(const_int 0)]
2013 {
2014 rtx high_dest = gen_highpart (SImode, operands[0]);
2015 rtx low_dest = gen_lowpart (SImode, operands[0]);
2016 rtx high_op1 = gen_highpart (SImode, operands[1]);
2017 rtx low_op1 = gen_lowpart (SImode, operands[1]);
2018 rtx high_op2 = gen_highpart (SImode, operands[2]);
2019 rtx low_op2 = gen_lowpart (SImode, operands[2]);
2020 emit_insn (gen_<voptab>si3 (low_dest, low_op1, low_op2));
2021 emit_insn (gen_<voptab>si3 (high_dest, high_op1, high_op2));
2022 DONE;
2023 }
2024 [(set_attr "length" "12")
2025 (set_attr "type" "multi")])
2026
2027(define_expand "neg<mode>2"
2028 [(set (match_operand:VCT 0 "register_operand")
2029 (neg:VCT (match_operand:VCT 1 "register_operand")))]
2030 "TARGET_PLUS_DMPY"
2031 "")
2032
2033(define_insn "*neg<mode>2"
2034 [(set (match_operand:VCT 0 "register_operand" "=r")
2035 (neg:VCT (match_operand:VCT 1 "register_operand" "r")))]
2036 "TARGET_PLUS_DMPY"
def010e4 2037 "vsub<V_suffix>\\t%0,0,%1"
79a27f32
CZ
2038 [(set_attr "length" "8")
2039 (set_attr "type" "multi")])
2040
2041(define_insn "reduc_plus_scal_v4hi"
2042 [(set (match_operand:HI 0 "even_register_operand" "=r")
2043 (unspec:HI [(match_operand:V4HI 1 "even_register_operand" "r")]
2044 UNSPEC_ARC_QMPYH))
2045 (clobber (reg:DI ARCV2_ACC))]
2046 "TARGET_PLUS_QMACW"
2047 "qmpyh\\t%0,%1,1"
2048 [(set_attr "length" "4")
2049 (set_attr "type" "multi")])
2050
2051(define_insn "reduc_plus_scal_v2si"
2052 [(set (match_operand:SI 0 "even_register_operand" "=r")
2053 (unspec:SI [(match_operand:V2SI 1 "even_register_operand" "r")]
2054 UNSPEC_ARC_DMPYWH))
2055 (clobber (reg:DI ARCV2_ACC))]
2056 "TARGET_PLUS_DMPY"
2057 "dmpywh\\t%0,%1,1"
2058 [(set_attr "length" "4")
2059 (set_attr "type" "multi")])
2060
2061(define_insn_and_split "vec_duplicatev2si"
2062 [(set (match_operand:V2SI 0 "register_operand" "=r")
2063 (vec_duplicate:V2SI
2064 (match_operand:SI 1 "nonmemory_operand" "ri")))]
2065 ""
2066 "#"
2067 "reload_completed"
2068 [(const_int 0)]
2069 {
2070 rtx high_dest = gen_highpart (SImode, operands[0]);
2071 rtx low_dest = gen_lowpart (SImode, operands[0]);
2072 emit_move_insn (high_dest, operands[1]);
2073 emit_move_insn (low_dest, operands[1]);
2074 DONE;
2075 }
2076 [(set_attr "length" "8")
2077 (set_attr "type" "multi")])
2078
2079(define_insn_and_split "vec_duplicatev4hi"
2080 [(set (match_operand:V4HI 0 "register_operand" "=r")
2081 (vec_duplicate:V4HI
2082 (match_operand:HI 1 "nonmemory_operand" "ri")))]
2083 "TARGET_BARREL_SHIFTER"
2084 "#"
2085 "reload_completed"
2086 [(const_int 0)]
2087 {
2088 rtx high_dest = gen_highpart (SImode, operands[0]);
2089 rtx low_dest = gen_lowpart (SImode, operands[0]);
2090 rtx tmp = gen_lowpart (SImode, operands[1]);
2091 emit_insn (gen_rtx_SET (high_dest,
2092 gen_rtx_ASHIFT (SImode, tmp, GEN_INT (16))));
2093 emit_insn (gen_rtx_SET (low_dest,
2094 gen_rtx_IOR (SImode, high_dest, tmp)));
2095 emit_move_insn (high_dest, low_dest);
2096 DONE;
2097 }
2098 [(set_attr "length" "12")
2099 (set_attr "type" "multi")])