]>
Commit | Line | Data |
---|---|---|
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")]) |