111
|
1 ;;- Instruction patterns for the System z vector facility builtins.
|
|
2 ;; Copyright (C) 2015-2017 Free Software Foundation, Inc.
|
|
3 ;; Contributed by Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
|
|
4
|
|
5 ;; This file is part of GCC.
|
|
6
|
|
7 ;; GCC is free software; you can redistribute it and/or modify it under
|
|
8 ;; the terms of the GNU General Public License as published by the Free
|
|
9 ;; Software Foundation; either version 3, or (at your option) any later
|
|
10 ;; version.
|
|
11
|
|
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
13 ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
14 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
15 ;; for more details.
|
|
16
|
|
17 ;; You should have received a copy of the GNU General Public License
|
|
18 ;; along with GCC; see the file COPYING3. If not see
|
|
19 ;; <http://www.gnu.org/licenses/>.
|
|
20
|
|
21 ; The patterns in this file are enabled with -mzvector
|
|
22
|
|
23 (define_mode_iterator V_HW_32_64 [V4SI V2DI V2DF (V4SF "TARGET_VXE")])
|
|
24 (define_mode_iterator VI_HW_SD [V4SI V2DI])
|
|
25 (define_mode_iterator V_HW_HSD [V8HI V4SI V2DI V2DF])
|
|
26 (define_mode_iterator V_HW_4 [V4SI V4SF])
|
|
27 ; Full size vector modes with more than one element which are directly supported in vector registers by the hardware.
|
|
28 (define_mode_iterator VEC_HW [V16QI V8HI V4SI V2DI V2DF (V4SF "TARGET_VXE")])
|
|
29 (define_mode_iterator VECF_HW [(V4SF "TARGET_VXE") V2DF])
|
|
30
|
|
31 ; The element type of the vector with floating point modes translated
|
|
32 ; to int modes of the same size.
|
|
33 (define_mode_attr non_vec_int[(V1QI "QI") (V2QI "QI") (V4QI "QI") (V8QI "QI") (V16QI "QI")
|
|
34 (V1HI "HI") (V2HI "HI") (V4HI "HI") (V8HI "HI")
|
|
35 (V1SI "SI") (V2SI "SI") (V4SI "SI")
|
|
36 (V1DI "DI") (V2DI "DI")
|
|
37 (V1SF "SI") (V2SF "SI") (V4SF "SI")
|
|
38 (V1DF "DI") (V2DF "DI")])
|
|
39
|
|
40 ; Condition code modes generated by int comparisons
|
|
41 (define_mode_iterator VICMP [CCVEQ CCVIH CCVIHU])
|
|
42
|
|
43 ; Comparisons supported by the vec_cmp* builtins
|
|
44 (define_code_iterator intcmp [eq gt gtu ge geu lt ltu le leu])
|
|
45 (define_code_iterator fpcmp [eq gt ge lt le])
|
|
46
|
|
47 ; Comparisons supported by the vec_all/any* builtins
|
|
48 (define_code_iterator intcmpcc [eq ne gt ge lt le gtu geu ltu leu])
|
|
49 (define_code_iterator fpcmpcc [eq ne gt ge unle unlt lt le])
|
|
50
|
|
51 ; Flags for vector string instructions (vfae all 4, vfee only ZS and CS, vstrc all 4)
|
|
52 (define_constants
|
|
53 [(VSTRING_FLAG_IN 8) ; invert result
|
|
54 (VSTRING_FLAG_RT 4) ; result type
|
|
55 (VSTRING_FLAG_ZS 2) ; zero search
|
|
56 (VSTRING_FLAG_CS 1)]) ; condition code set
|
|
57
|
|
58 ; Rounding modes as being used for e.g. VFI
|
|
59 (define_constants
|
|
60 [(VEC_RND_CURRENT 0)
|
|
61 (VEC_RND_NEAREST_AWAY_FROM_ZERO 1)
|
|
62 (VEC_RND_SHORT_PREC 3)
|
|
63 (VEC_RND_NEAREST_TO_EVEN 4)
|
|
64 (VEC_RND_TO_ZERO 5)
|
|
65 (VEC_RND_TO_INF 6)
|
|
66 (VEC_RND_TO_MINF 7)])
|
|
67
|
|
68 ; Inexact suppression facility flag as being used for e.g. VFI
|
|
69 (define_constants
|
|
70 [(VEC_INEXACT 0)
|
|
71 (VEC_NOINEXACT 4)])
|
|
72
|
|
73
|
|
74 ; Vector gather element
|
|
75
|
|
76 ; vgef, vgeg
|
|
77 (define_insn "vec_gather_element<mode>"
|
|
78 [(set (match_operand:V_HW_32_64 0 "register_operand" "=v")
|
|
79 (unspec:V_HW_32_64 [(match_operand:V_HW_32_64 1 "register_operand" "0")
|
|
80 (match_operand:<tointvec> 2 "register_operand" "v")
|
|
81 (match_operand:BLK 3 "memory_operand" "R")
|
|
82 (match_operand:QI 4 "const_mask_operand" "C")]
|
|
83 UNSPEC_VEC_GATHER))]
|
|
84 "TARGET_VX && UINTVAL (operands[4]) < GET_MODE_NUNITS (<V_HW_32_64:MODE>mode)"
|
|
85 "vge<bhfgq>\t%0,%O3(%v2,%R3),%b4"
|
|
86 [(set_attr "op_type" "VRV")])
|
|
87
|
|
88 (define_expand "vec_genmask<mode>"
|
|
89 [(match_operand:VI_HW 0 "register_operand" "=v")
|
|
90 (match_operand:QI 1 "const_int_operand" "C")
|
|
91 (match_operand:QI 2 "const_int_operand" "C")]
|
|
92 "TARGET_VX"
|
|
93 {
|
|
94 int nunits = GET_MODE_NUNITS (<VI_HW:MODE>mode);
|
|
95 int bitlen = GET_MODE_UNIT_BITSIZE (<VI_HW:MODE>mode);
|
|
96 /* To bit little endian style. */
|
|
97 int end = bitlen - 1 - INTVAL (operands[1]);
|
|
98 int start = bitlen - 1 - INTVAL (operands[2]);
|
|
99 rtx const_vec[16];
|
|
100 int i;
|
|
101 unsigned HOST_WIDE_INT mask;
|
|
102 bool swapped_p = false;
|
|
103
|
|
104 if (start > end)
|
|
105 {
|
|
106 i = start - 1; start = end + 1; end = i;
|
|
107 swapped_p = true;
|
|
108 }
|
|
109 if (end == 63)
|
|
110 mask = HOST_WIDE_INT_M1U;
|
|
111 else
|
|
112 mask = (HOST_WIDE_INT_1U << (end + 1)) - 1;
|
|
113
|
|
114 mask &= ~((HOST_WIDE_INT_1U << start) - 1);
|
|
115
|
|
116 if (swapped_p)
|
|
117 mask = ~mask;
|
|
118
|
|
119 for (i = 0; i < nunits; i++)
|
|
120 const_vec[i] = GEN_INT (trunc_int_for_mode (mask,
|
|
121 GET_MODE_INNER (<VI_HW:MODE>mode)));
|
|
122
|
|
123 emit_insn (gen_rtx_SET (operands[0],
|
|
124 gen_rtx_CONST_VECTOR (<VI_HW:MODE>mode,
|
|
125 gen_rtvec_v (nunits, const_vec))));
|
|
126 DONE;
|
|
127 })
|
|
128
|
|
129 (define_expand "vec_genbytemaskv16qi"
|
|
130 [(match_operand:V16QI 0 "register_operand" "")
|
|
131 (match_operand:HI 1 "const_int_operand" "")]
|
|
132 "TARGET_VX"
|
|
133 {
|
|
134 int i;
|
|
135 unsigned mask = 0x8000;
|
|
136 rtx const_vec[16];
|
|
137 unsigned HOST_WIDE_INT byte_mask = UINTVAL (operands[1]);
|
|
138
|
|
139 for (i = 0; i < 16; i++)
|
|
140 {
|
|
141 if (mask & byte_mask)
|
|
142 const_vec[i] = constm1_rtx;
|
|
143 else
|
|
144 const_vec[i] = const0_rtx;
|
|
145 mask = mask >> 1;
|
|
146 }
|
|
147 emit_insn (gen_rtx_SET (operands[0],
|
|
148 gen_rtx_CONST_VECTOR (V16QImode,
|
|
149 gen_rtvec_v (16, const_vec))));
|
|
150 DONE;
|
|
151 })
|
|
152
|
|
153 (define_expand "vec_splats<mode>"
|
|
154 [(set (match_operand:VEC_HW 0 "register_operand" "")
|
|
155 (vec_duplicate:VEC_HW (match_operand:<non_vec> 1 "general_operand" "")))]
|
|
156 "TARGET_VX")
|
|
157
|
|
158 (define_expand "vec_insert<mode>"
|
|
159 [(set (match_operand:VEC_HW 0 "register_operand" "")
|
|
160 (unspec:VEC_HW [(match_operand:<non_vec> 2 "register_operand" "")
|
|
161 (match_operand:SI 3 "nonmemory_operand" "")
|
|
162 (match_operand:VEC_HW 1 "register_operand" "")]
|
|
163 UNSPEC_VEC_SET))]
|
|
164 "TARGET_VX"
|
|
165 "")
|
|
166
|
|
167 ; This is vec_set + modulo arithmetic on the element selector (op 2)
|
|
168 (define_expand "vec_promote<mode>"
|
|
169 [(set (match_operand:VEC_HW 0 "register_operand" "")
|
|
170 (unspec:VEC_HW [(match_operand:<non_vec> 1 "register_operand" "")
|
|
171 (match_operand:SI 2 "nonmemory_operand" "")
|
|
172 (match_dup 0)]
|
|
173 UNSPEC_VEC_SET))]
|
|
174 "TARGET_VX"
|
|
175 "")
|
|
176
|
|
177 ; vec_extract is also an RTL standard name -> vector.md
|
|
178
|
|
179 ; vllezb, vllezh, vllezf, vllezg
|
|
180 (define_insn "vec_insert_and_zero<mode>"
|
|
181 [(set (match_operand:VEC_HW 0 "register_operand" "=v")
|
|
182 (unspec:VEC_HW [(match_operand:<non_vec> 1 "memory_operand" "R")]
|
|
183 UNSPEC_VEC_INSERT_AND_ZERO))]
|
|
184 "TARGET_VX"
|
|
185 "vllez<bhfgq>\t%v0,%1"
|
|
186 [(set_attr "op_type" "VRX")])
|
|
187
|
|
188 (define_insn "vlbb"
|
|
189 [(set (match_operand:V16QI 0 "register_operand" "=v")
|
|
190 (unspec:V16QI [(match_operand:BLK 1 "memory_operand" "R")
|
|
191 (match_operand:QI 2 "const_mask_operand" "C")]
|
|
192 UNSPEC_VEC_LOAD_BNDRY))]
|
|
193 "TARGET_VX && UINTVAL (operands[2]) < 7"
|
|
194 "vlbb\t%v0,%1,%2"
|
|
195 [(set_attr "op_type" "VRX")])
|
|
196
|
|
197 (define_insn "vlrlrv16qi"
|
|
198 [(set (match_operand:V16QI 0 "register_operand" "=v,v")
|
|
199 (unspec:V16QI [(match_operand:BLK 2 "memory_operand" "Q,Q")
|
|
200 (match_operand:SI 1 "nonmemory_operand" "d,C")]
|
|
201 UNSPEC_VEC_LOAD_LEN_R))]
|
|
202 "TARGET_VXE"
|
|
203 "@
|
|
204 vlrlr\t%v0,%1,%2
|
|
205 vlrl\t%v0,%2,%1"
|
|
206 [(set_attr "op_type" "VRS,VSI")])
|
|
207
|
|
208
|
|
209 ; FIXME: The following two patterns might using vec_merge. But what is
|
|
210 ; the canonical form: (vec_select (vec_merge op0 op1)) or (vec_merge
|
|
211 ; (vec_select op0) (vec_select op1)
|
|
212 ; vmrhb, vmrhh, vmrhf, vmrhg
|
|
213 (define_insn "vec_mergeh<mode>"
|
|
214 [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "=v")
|
|
215 (unspec:V_128_NOSINGLE [(match_operand:V_128_NOSINGLE 1 "register_operand" "v")
|
|
216 (match_operand:V_128_NOSINGLE 2 "register_operand" "v")]
|
|
217 UNSPEC_VEC_MERGEH))]
|
|
218 "TARGET_VX"
|
|
219 "vmrh<bhfgq>\t%v0,%1,%2"
|
|
220 [(set_attr "op_type" "VRR")])
|
|
221
|
|
222 ; vmrlb, vmrlh, vmrlf, vmrlg
|
|
223 (define_insn "vec_mergel<mode>"
|
|
224 [(set (match_operand:V_128_NOSINGLE 0 "register_operand" "=v")
|
|
225 (unspec:V_128_NOSINGLE [(match_operand:V_128_NOSINGLE 1 "register_operand" "v")
|
|
226 (match_operand:V_128_NOSINGLE 2 "register_operand" "v")]
|
|
227 UNSPEC_VEC_MERGEL))]
|
|
228 "TARGET_VX"
|
|
229 "vmrl<bhfgq>\t%v0,%1,%2"
|
|
230 [(set_attr "op_type" "VRR")])
|
|
231
|
|
232
|
|
233 ; Vector pack
|
|
234
|
|
235 ; vpkh, vpkf, vpkg
|
|
236 (define_insn "vec_pack<mode>"
|
|
237 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
238 (unspec:<vec_half> [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
239 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
240 UNSPEC_VEC_PACK))]
|
|
241 "TARGET_VX"
|
|
242 "vpk<bhfgq>\t%v0,%v1,%v2"
|
|
243 [(set_attr "op_type" "VRR")])
|
|
244
|
|
245
|
|
246 ; Vector pack saturate
|
|
247
|
|
248 ; vpksh, vpksf, vpksg
|
|
249 (define_insn "vec_packs<mode>"
|
|
250 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
251 (unspec:<vec_half> [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
252 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
253 UNSPEC_VEC_PACK_SATURATE))]
|
|
254 "TARGET_VX"
|
|
255 "vpks<bhfgq>\t%v0,%v1,%v2"
|
|
256 [(set_attr "op_type" "VRR")])
|
|
257
|
|
258
|
|
259 ; This is vec_packs_cc + loading cc into a caller specified memory location.
|
|
260 (define_expand "vec_packs_cc<mode>"
|
|
261 [(parallel
|
|
262 [(set (reg:CCRAW CC_REGNUM)
|
|
263 (unspec:CCRAW [(match_operand:VI_HW_HSD 1 "register_operand" "")
|
|
264 (match_operand:VI_HW_HSD 2 "register_operand" "")]
|
|
265 UNSPEC_VEC_PACK_SATURATE_GENCC))
|
|
266 (set (match_operand:<vec_half> 0 "register_operand" "")
|
|
267 (unspec:<vec_half> [(match_dup 1) (match_dup 2)]
|
|
268 UNSPEC_VEC_PACK_SATURATE_CC))])
|
|
269 (set (match_dup 4)
|
|
270 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))
|
|
271 (set (match_operand:SI 3 "memory_operand" "")
|
|
272 (match_dup 4))]
|
|
273 "TARGET_VX"
|
|
274 {
|
|
275 operands[4] = gen_reg_rtx (SImode);
|
|
276 })
|
|
277
|
|
278 ; vpksh, vpksf, vpksg
|
|
279 (define_insn "*vec_packs_cc<mode>"
|
|
280 [(set (reg:CCRAW CC_REGNUM)
|
|
281 (unspec:CCRAW [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
282 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
283 UNSPEC_VEC_PACK_SATURATE_GENCC))
|
|
284 (set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
285 (unspec:<vec_half> [(match_dup 1) (match_dup 2)]
|
|
286 UNSPEC_VEC_PACK_SATURATE_CC))]
|
|
287 "TARGET_VX"
|
|
288 "vpks<bhfgq>s\t%v0,%v1,%v2"
|
|
289 [(set_attr "op_type" "VRR")])
|
|
290
|
|
291
|
|
292 ; Vector pack logical saturate
|
|
293
|
|
294 ; vpklsh, vpklsf, vpklsg
|
|
295 (define_insn "vec_packsu<mode>"
|
|
296 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
297 (unspec:<vec_half> [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
298 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
299 UNSPEC_VEC_PACK_UNSIGNED_SATURATE))]
|
|
300 "TARGET_VX"
|
|
301 "vpkls<bhfgq>\t%v0,%v1,%v2"
|
|
302 [(set_attr "op_type" "VRR")])
|
|
303
|
|
304 ; Emulate saturate unsigned pack on signed operands.
|
|
305 ; Zero out negative elements and continue with the unsigned saturating pack.
|
|
306 (define_expand "vec_packsu_u<mode>"
|
|
307 [(set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
308 (unspec:<vec_half> [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
309 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
310 UNSPEC_VEC_PACK_UNSIGNED_SATURATE))]
|
|
311 "TARGET_VX"
|
|
312 {
|
|
313 rtx null_vec = CONST0_RTX(<MODE>mode);
|
|
314 machine_mode half_mode;
|
|
315 switch (<MODE>mode)
|
|
316 {
|
|
317 case E_V8HImode: half_mode = V16QImode; break;
|
|
318 case E_V4SImode: half_mode = V8HImode; break;
|
|
319 case E_V2DImode: half_mode = V4SImode; break;
|
|
320 default: gcc_unreachable ();
|
|
321 }
|
|
322 s390_expand_vcond (operands[1], operands[1], null_vec,
|
|
323 GE, operands[1], null_vec);
|
|
324 s390_expand_vcond (operands[2], operands[2], null_vec,
|
|
325 GE, operands[2], null_vec);
|
|
326 emit_insn (gen_rtx_SET (operands[0],
|
|
327 gen_rtx_UNSPEC (half_mode,
|
|
328 gen_rtvec (2, operands[1], operands[2]),
|
|
329 UNSPEC_VEC_PACK_UNSIGNED_SATURATE)));
|
|
330 DONE;
|
|
331 })
|
|
332
|
|
333 ; This is vec_packsu_cc + loading cc into a caller specified memory location.
|
|
334 ; FIXME: The reg to target mem copy should be issued by reload?!
|
|
335 (define_expand "vec_packsu_cc<mode>"
|
|
336 [(parallel
|
|
337 [(set (reg:CCRAW CC_REGNUM)
|
|
338 (unspec:CCRAW [(match_operand:VI_HW_HSD 1 "register_operand" "")
|
|
339 (match_operand:VI_HW_HSD 2 "register_operand" "")]
|
|
340 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_GENCC))
|
|
341 (set (match_operand:<vec_half> 0 "register_operand" "")
|
|
342 (unspec:<vec_half> [(match_dup 1) (match_dup 2)]
|
|
343 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_CC))])
|
|
344 (set (match_dup 4)
|
|
345 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))
|
|
346 (set (match_operand:SI 3 "memory_operand" "")
|
|
347 (match_dup 4))]
|
|
348 "TARGET_VX"
|
|
349 {
|
|
350 operands[4] = gen_reg_rtx (SImode);
|
|
351 })
|
|
352
|
|
353 ; vpklsh, vpklsf, vpklsg
|
|
354 (define_insn "*vec_packsu_cc<mode>"
|
|
355 [(set (reg:CCRAW CC_REGNUM)
|
|
356 (unspec:CCRAW [(match_operand:VI_HW_HSD 1 "register_operand" "v")
|
|
357 (match_operand:VI_HW_HSD 2 "register_operand" "v")]
|
|
358 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_GENCC))
|
|
359 (set (match_operand:<vec_half> 0 "register_operand" "=v")
|
|
360 (unspec:<vec_half> [(match_dup 1) (match_dup 2)]
|
|
361 UNSPEC_VEC_PACK_UNSIGNED_SATURATE_CC))]
|
|
362 "TARGET_VX"
|
|
363 "vpkls<bhfgq>s\t%v0,%v1,%v2"
|
|
364 [(set_attr "op_type" "VRR")])
|
|
365
|
|
366
|
|
367 ; Vector permute
|
|
368
|
|
369 ; vec_perm is also RTL standard name, but we can only use it for V16QI
|
|
370
|
|
371 (define_insn "vec_zperm<mode>"
|
|
372 [(set (match_operand:V_HW_HSD 0 "register_operand" "=v")
|
|
373 (unspec:V_HW_HSD [(match_operand:V_HW_HSD 1 "register_operand" "v")
|
|
374 (match_operand:V_HW_HSD 2 "register_operand" "v")
|
|
375 (match_operand:V16QI 3 "register_operand" "v")]
|
|
376 UNSPEC_VEC_PERM))]
|
|
377 "TARGET_VX"
|
|
378 "vperm\t%v0,%v1,%v2,%v3"
|
|
379 [(set_attr "op_type" "VRR")])
|
|
380
|
|
381 (define_expand "vec_permi<mode>"
|
|
382 [(set (match_operand:V_HW_64 0 "register_operand" "")
|
|
383 (unspec:V_HW_64 [(match_operand:V_HW_64 1 "register_operand" "")
|
|
384 (match_operand:V_HW_64 2 "register_operand" "")
|
|
385 (match_operand:QI 3 "const_mask_operand" "")]
|
|
386 UNSPEC_VEC_PERMI))]
|
|
387 "TARGET_VX"
|
|
388 {
|
|
389 HOST_WIDE_INT val = INTVAL (operands[3]);
|
|
390 operands[3] = GEN_INT ((val & 1) | (val & 2) << 1);
|
|
391 })
|
|
392
|
|
393 (define_insn "*vec_permi<mode>"
|
|
394 [(set (match_operand:V_HW_64 0 "register_operand" "=v")
|
|
395 (unspec:V_HW_64 [(match_operand:V_HW_64 1 "register_operand" "v")
|
|
396 (match_operand:V_HW_64 2 "register_operand" "v")
|
|
397 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
398 UNSPEC_VEC_PERMI))]
|
|
399 "TARGET_VX && (UINTVAL (operands[3]) & 10) == 0"
|
|
400 "vpdi\t%v0,%v1,%v2,%b3"
|
|
401 [(set_attr "op_type" "VRR")])
|
|
402
|
|
403
|
|
404 ; Vector replicate
|
|
405
|
|
406
|
|
407 ; Replicate from vector element
|
|
408 (define_expand "vec_splat<mode>"
|
|
409 [(set (match_operand:V_HW 0 "register_operand" "")
|
|
410 (vec_duplicate:V_HW (vec_select:<non_vec>
|
|
411 (match_operand:V_HW 1 "register_operand" "")
|
|
412 (parallel
|
|
413 [(match_operand:QI 2 "const_mask_operand" "")]))))]
|
|
414 "TARGET_VX")
|
|
415
|
|
416 ; Vector scatter element
|
|
417
|
|
418 ; vscef, vsceg
|
|
419
|
|
420 ; A 64 bit target address generated from 32 bit elements
|
|
421 (define_insn "vec_scatter_element<V_HW_4:mode>_DI"
|
|
422 [(set (mem:<non_vec>
|
|
423 (plus:DI (zero_extend:DI
|
|
424 (unspec:SI [(match_operand:V4SI 1 "register_operand" "v")
|
|
425 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
426 UNSPEC_VEC_EXTRACT))
|
|
427 (match_operand:SI 2 "address_operand" "ZQ")))
|
|
428 (unspec:<non_vec> [(match_operand:V_HW_4 0 "register_operand" "v")
|
|
429 (match_dup 3)] UNSPEC_VEC_EXTRACT))]
|
|
430 "TARGET_VX && TARGET_64BIT && UINTVAL (operands[3]) < 4"
|
|
431 "vscef\t%v0,%O2(%v1,%R2),%3"
|
|
432 [(set_attr "op_type" "VRV")])
|
|
433
|
|
434 ; A 31 bit target address is generated from 64 bit elements
|
|
435 ; vsceg
|
|
436 (define_insn "vec_scatter_element<V_HW_64:mode>_SI"
|
|
437 [(set (mem:<non_vec>
|
|
438 (plus:SI (subreg:SI
|
|
439 (unspec:<non_vec_int> [(match_operand:V_HW_64 1 "register_operand" "v")
|
|
440 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
441 UNSPEC_VEC_EXTRACT) 4)
|
|
442 (match_operand:SI 2 "address_operand" "ZQ")))
|
|
443 (unspec:<non_vec> [(match_operand:V_HW_64 0 "register_operand" "v")
|
|
444 (match_dup 3)] UNSPEC_VEC_EXTRACT))]
|
|
445 "TARGET_VX && !TARGET_64BIT && UINTVAL (operands[3]) < GET_MODE_NUNITS (<V_HW_64:MODE>mode)"
|
|
446 "vsce<V_HW_64:bhfgq>\t%v0,%O2(%v1,%R2),%3"
|
|
447 [(set_attr "op_type" "VRV")])
|
|
448
|
|
449 ; Element size and target address size is the same
|
|
450 ; vscef, vsceg
|
|
451 (define_insn "vec_scatter_element<mode>_<non_vec_int>"
|
|
452 [(set (mem:<non_vec>
|
|
453 (plus:<non_vec_int> (unspec:<non_vec_int>
|
|
454 [(match_operand:<tointvec> 1 "register_operand" "v")
|
|
455 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
456 UNSPEC_VEC_EXTRACT)
|
|
457 (match_operand:DI 2 "address_operand" "ZQ")))
|
|
458 (unspec:<non_vec> [(match_operand:V_HW_32_64 0 "register_operand" "v")
|
|
459 (match_dup 3)] UNSPEC_VEC_EXTRACT))]
|
|
460 "TARGET_VX && UINTVAL (operands[3]) < GET_MODE_NUNITS (<V_HW_32_64:MODE>mode)"
|
|
461 "vsce<bhfgq>\t%v0,%O2(%v1,%R2),%3"
|
|
462 [(set_attr "op_type" "VRV")])
|
|
463
|
|
464 ; Depending on the address size we have to expand a different pattern.
|
|
465 ; This however cannot be represented in s390-builtins.def so we do the
|
|
466 ; multiplexing here in the expander.
|
|
467 (define_expand "vec_scatter_element<V_HW_32_64:mode>"
|
|
468 [(match_operand:V_HW_32_64 0 "register_operand" "")
|
|
469 (match_operand:<tointvec> 1 "register_operand" "")
|
|
470 (match_operand 2 "address_operand" "")
|
|
471 (match_operand:QI 3 "const_mask_operand" "")]
|
|
472 "TARGET_VX"
|
|
473 {
|
|
474 if (TARGET_64BIT)
|
|
475 {
|
|
476 PUT_MODE (operands[2], DImode);
|
|
477 emit_insn (
|
|
478 gen_vec_scatter_element<V_HW_32_64:mode>_DI (operands[0], operands[1],
|
|
479 operands[2], operands[3]));
|
|
480 }
|
|
481 else
|
|
482 {
|
|
483 PUT_MODE (operands[2], SImode);
|
|
484 emit_insn (
|
|
485 gen_vec_scatter_element<V_HW_32_64:mode>_SI (operands[0], operands[1],
|
|
486 operands[2], operands[3]));
|
|
487 }
|
|
488 DONE;
|
|
489 })
|
|
490
|
|
491
|
|
492 ; Vector select
|
|
493
|
|
494 ; Operand 3 selects bits from either OP1 (0) or OP2 (1)
|
|
495
|
|
496 ; Comparison operator should not matter as long as we always use the same ?!
|
|
497
|
|
498 ; Operands 1 and 2 are swapped in order to match the altivec builtin.
|
|
499 ; If operand 3 is a const_int bitmask this would be vec_merge
|
|
500 (define_expand "vec_sel<mode>"
|
|
501 [(set (match_operand:V_HW 0 "register_operand" "")
|
|
502 (if_then_else:V_HW
|
|
503 (eq (match_operand:<tointvec> 3 "register_operand" "")
|
|
504 (match_dup 4))
|
|
505 (match_operand:V_HW 2 "register_operand" "")
|
|
506 (match_operand:V_HW 1 "register_operand" "")))]
|
|
507 "TARGET_VX"
|
|
508 {
|
|
509 operands[4] = CONST0_RTX (<tointvec>mode);
|
|
510 })
|
|
511
|
|
512
|
|
513 ; Vector sign extend to doubleword
|
|
514
|
|
515 ; Sign extend of right most vector element to respective double-word
|
|
516 ; vsegb, vsegh, vsegf
|
|
517 (define_insn "vec_extend<mode>"
|
|
518 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
519 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
520 UNSPEC_VEC_EXTEND))]
|
|
521 "TARGET_VX"
|
|
522 "vseg<bhfgq>\t%v0,%1"
|
|
523 [(set_attr "op_type" "VRR")])
|
|
524
|
|
525
|
|
526 ; Vector store with length
|
|
527
|
|
528 ; Store bytes in OP1 from OP0 with the highest indexed byte to be
|
|
529 ; stored from OP0 given by OP2
|
|
530 (define_insn "vstl<mode>"
|
|
531 [(set (match_operand:BLK 2 "memory_operand" "=Q")
|
|
532 (unspec:BLK [(match_operand:V 0 "register_operand" "v")
|
|
533 (match_operand:SI 1 "register_operand" "d")]
|
|
534 UNSPEC_VEC_STORE_LEN))]
|
|
535 "TARGET_VX"
|
|
536 "vstl\t%v0,%1,%2"
|
|
537 [(set_attr "op_type" "VRS")])
|
|
538
|
|
539 ; Vector store rightmost with length
|
|
540
|
|
541 (define_insn "vstrlrv16qi"
|
|
542 [(set (match_operand:BLK 2 "memory_operand" "=Q,Q")
|
|
543 (unspec:BLK [(match_operand:V16QI 0 "register_operand" "v,v")
|
|
544 (match_operand:SI 1 "nonmemory_operand" "d,C")]
|
|
545 UNSPEC_VEC_STORE_LEN_R))]
|
|
546 "TARGET_VXE"
|
|
547 "@
|
|
548 vstrlr\t%v0,%2,%1
|
|
549 vstrl\t%v0,%1,%2"
|
|
550 [(set_attr "op_type" "VRS,VSI")])
|
|
551
|
|
552
|
|
553
|
|
554 ; vector bit permute
|
|
555
|
|
556 (define_insn "vbpermv16qi"
|
|
557 [(set (match_operand:V2DI 0 "register_operand" "=v")
|
|
558 (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "v")
|
|
559 (match_operand:V16QI 2 "register_operand" "v")]
|
|
560 UNSPEC_VEC_VBPERM))]
|
|
561 "TARGET_VXE"
|
|
562 "vbperm\t%v0,%v1,%v2"
|
|
563 [(set_attr "op_type" "VRR")])
|
|
564
|
|
565 ; Vector unpack high
|
|
566
|
|
567 ; vuphb, vuphh, vuphf
|
|
568 (define_insn "vec_unpackh<mode>"
|
|
569 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
570 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
571 UNSPEC_VEC_UNPACKH))]
|
|
572 "TARGET_VX"
|
|
573 "vuph<bhfgq>\t%v0,%v1"
|
|
574 [(set_attr "op_type" "VRR")])
|
|
575
|
|
576 ; vuplhb, vuplhh, vuplhf
|
|
577 (define_insn "vec_unpackh_l<mode>"
|
|
578 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
579 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
580 UNSPEC_VEC_UNPACKH_L))]
|
|
581 "TARGET_VX"
|
|
582 "vuplh<bhfgq>\t%v0,%v1"
|
|
583 [(set_attr "op_type" "VRR")])
|
|
584
|
|
585
|
|
586 ; Vector unpack low
|
|
587
|
|
588 ; vuplb, vuplhw, vuplf
|
|
589 (define_insn "vec_unpackl<mode>"
|
|
590 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
591 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
592 UNSPEC_VEC_UNPACKL))]
|
|
593 "TARGET_VX"
|
|
594 "vupl<bhfgq><w>\t%v0,%v1"
|
|
595 [(set_attr "op_type" "VRR")])
|
|
596
|
|
597 ; vupllb, vupllh, vupllf
|
|
598 (define_insn "vec_unpackl_l<mode>"
|
|
599 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
600 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
601 UNSPEC_VEC_UNPACKL_L))]
|
|
602 "TARGET_VX"
|
|
603 "vupll<bhfgq>\t%v0,%v1"
|
|
604 [(set_attr "op_type" "VRR")])
|
|
605
|
|
606
|
|
607 ; Vector add
|
|
608
|
|
609 ; Vector add compute carry
|
|
610
|
|
611 ; vaccb, vacch, vaccf, vaccg, vaccq
|
|
612 (define_insn "vacc<bhfgq>_<mode>"
|
|
613 [(set (match_operand:VIT_HW 0 "register_operand" "=v")
|
|
614 (unspec:VIT_HW [(match_operand:VIT_HW 1 "register_operand" "%v")
|
|
615 (match_operand:VIT_HW 2 "register_operand" "v")]
|
|
616 UNSPEC_VEC_ADDC))]
|
|
617 "TARGET_VX"
|
|
618 "vacc<bhfgq>\t%v0,%v1,%v2"
|
|
619 [(set_attr "op_type" "VRR")])
|
|
620
|
|
621 ; Vector add with carry
|
|
622
|
|
623 (define_insn "vacq"
|
|
624 [(set (match_operand:TI 0 "register_operand" "=v")
|
|
625 (unspec:TI [(match_operand:TI 1 "register_operand" "%v")
|
|
626 (match_operand:TI 2 "register_operand" "v")
|
|
627 (match_operand:TI 3 "register_operand" "v")]
|
|
628 UNSPEC_VEC_ADDE_U128))]
|
|
629 "TARGET_VX"
|
|
630 "vacq\t%v0,%v1,%v2,%v3"
|
|
631 [(set_attr "op_type" "VRR")])
|
|
632
|
|
633
|
|
634 ; Vector add with carry compute carry
|
|
635
|
|
636 (define_insn "vacccq"
|
|
637 [(set (match_operand:TI 0 "register_operand" "=v")
|
|
638 (unspec:TI [(match_operand:TI 1 "register_operand" "%v")
|
|
639 (match_operand:TI 2 "register_operand" "v")
|
|
640 (match_operand:TI 3 "register_operand" "v")]
|
|
641 UNSPEC_VEC_ADDEC_U128))]
|
|
642 "TARGET_VX"
|
|
643 "vacccq\t%v0,%v1,%v2,%v3"
|
|
644 [(set_attr "op_type" "VRR")])
|
|
645
|
|
646
|
|
647 ; Vector and
|
|
648
|
|
649 ; Vector and with complement
|
|
650
|
|
651 ; vnc
|
|
652 (define_insn "vec_andc<mode>3"
|
|
653 [(set (match_operand:VT_HW 0 "register_operand" "=v")
|
|
654 (and:VT_HW (not:VT_HW (match_operand:VT_HW 2 "register_operand" "v"))
|
|
655 (match_operand:VT_HW 1 "register_operand" "v")))]
|
|
656 "TARGET_VX"
|
|
657 "vnc\t%v0,%v1,%v2"
|
|
658 [(set_attr "op_type" "VRR")])
|
|
659
|
|
660
|
|
661 ; Vector average
|
|
662
|
|
663 ; vavgb, vavgh, vavgf, vavgg
|
|
664 (define_insn "vec_avg<mode>"
|
|
665 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
666 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "%v")
|
|
667 (match_operand:VI_HW 2 "register_operand" "v")]
|
|
668 UNSPEC_VEC_AVG))]
|
|
669 "TARGET_VX"
|
|
670 "vavg<bhfgq>\t%v0,%v1,%v2"
|
|
671 [(set_attr "op_type" "VRR")])
|
|
672
|
|
673 ; Vector average logical
|
|
674
|
|
675 ; vavglb, vavglh, vavglf, vavglg
|
|
676 (define_insn "vec_avgu<mode>"
|
|
677 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
678 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "%v")
|
|
679 (match_operand:VI_HW 2 "register_operand" "v")]
|
|
680 UNSPEC_VEC_AVGU))]
|
|
681 "TARGET_VX"
|
|
682 "vavgl<bhfgq>\t%v0,%v1,%v2"
|
|
683 [(set_attr "op_type" "VRR")])
|
|
684
|
|
685
|
|
686 ; Vector checksum
|
|
687
|
|
688 (define_insn "vec_checksum"
|
|
689 [(set (match_operand:V4SI 0 "register_operand" "=v")
|
|
690 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
|
|
691 (match_operand:V4SI 2 "register_operand" "v")]
|
|
692 UNSPEC_VEC_CHECKSUM))]
|
|
693 "TARGET_VX"
|
|
694 "vcksm\t%v0,%v1,%v2"
|
|
695 [(set_attr "op_type" "VRR")])
|
|
696
|
|
697 ;;
|
|
698 ;; Vector compare
|
|
699 ;;
|
|
700
|
|
701 ; vec_all/any int compares
|
|
702
|
|
703 (define_expand "vec_all_<intcmpcc:code><VI_HW:mode>"
|
|
704 [(match_operand:SI 0 "register_operand" "")
|
|
705 (intcmpcc (match_operand:VI_HW 1 "register_operand" "")
|
|
706 (match_operand:VI_HW 2 "register_operand" ""))]
|
|
707 "TARGET_VX"
|
|
708 {
|
|
709 s390_expand_vec_compare_cc (operands[0],
|
|
710 <intcmpcc:CODE>,
|
|
711 operands[1],
|
|
712 operands[2],
|
|
713 true);
|
|
714 DONE;
|
|
715 })
|
|
716
|
|
717 (define_expand "vec_any_<intcmpcc:code><VI_HW:mode>"
|
|
718 [(match_operand:SI 0 "register_operand" "")
|
|
719 (intcmpcc (match_operand:VI_HW 1 "register_operand" "")
|
|
720 (match_operand:VI_HW 2 "register_operand" ""))]
|
|
721 "TARGET_VX"
|
|
722 {
|
|
723 s390_expand_vec_compare_cc (operands[0],
|
|
724 <intcmpcc:CODE>,
|
|
725 operands[1],
|
|
726 operands[2],
|
|
727 false);
|
|
728 DONE;
|
|
729 })
|
|
730
|
|
731 ; vec_all/any fp compares
|
|
732
|
|
733 (define_expand "vec_all_<fpcmpcc:code><mode>"
|
|
734 [(match_operand:SI 0 "register_operand" "")
|
|
735 (fpcmpcc (match_operand:VECF_HW 1 "register_operand" "")
|
|
736 (match_operand:VECF_HW 2 "register_operand" ""))]
|
|
737 "TARGET_VX"
|
|
738 {
|
|
739 s390_expand_vec_compare_cc (operands[0],
|
|
740 <fpcmpcc:CODE>,
|
|
741 operands[1],
|
|
742 operands[2],
|
|
743 true);
|
|
744 DONE;
|
|
745 })
|
|
746
|
|
747 (define_expand "vec_any_<fpcmpcc:code><mode>"
|
|
748 [(match_operand:SI 0 "register_operand" "")
|
|
749 (fpcmpcc (match_operand:VECF_HW 1 "register_operand" "")
|
|
750 (match_operand:VECF_HW 2 "register_operand" ""))]
|
|
751 "TARGET_VX"
|
|
752 {
|
|
753 s390_expand_vec_compare_cc (operands[0],
|
|
754 <fpcmpcc:CODE>,
|
|
755 operands[1],
|
|
756 operands[2],
|
|
757 false);
|
|
758 DONE;
|
|
759 })
|
|
760
|
|
761
|
|
762 ; Compare without generating CC
|
|
763
|
|
764 (define_expand "vec_cmp<intcmp:code><VI_HW:mode>"
|
|
765 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
766 (intcmp:VI_HW (match_operand:VI_HW 1 "register_operand" "v")
|
|
767 (match_operand:VI_HW 2 "register_operand" "v")))]
|
|
768 "TARGET_VX"
|
|
769 {
|
|
770 s390_expand_vec_compare (operands[0], <intcmp:CODE>, operands[1], operands[2]);
|
|
771 DONE;
|
|
772 })
|
|
773
|
|
774 (define_expand "vec_cmp<fpcmp:code><mode>"
|
|
775 [(set (match_operand:<tointvec> 0 "register_operand" "=v")
|
|
776 (fpcmp:<tointvec> (match_operand:VF_HW 1 "register_operand" "v")
|
|
777 (match_operand:VF_HW 2 "register_operand" "v")))]
|
|
778 "TARGET_VX"
|
|
779 {
|
|
780 s390_expand_vec_compare (operands[0], <fpcmp:CODE>, operands[1], operands[2]);
|
|
781 DONE;
|
|
782 })
|
|
783
|
|
784
|
|
785 ; Vector count leading zeros
|
|
786
|
|
787 ; vec_cntlz -> clz
|
|
788 ; vec_cnttz -> ctz
|
|
789
|
|
790 ; Vector xor
|
|
791
|
|
792 ; vec_xor -> xor
|
|
793
|
|
794 ; Vector Galois field multiply sum
|
|
795
|
|
796 ; vgfmb, vgfmh, vgfmf
|
|
797 (define_insn "vec_gfmsum<mode>"
|
|
798 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
799 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
800 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
801 UNSPEC_VEC_GFMSUM))]
|
|
802 "TARGET_VX"
|
|
803 "vgfm<bhfgq>\t%v0,%v1,%v2"
|
|
804 [(set_attr "op_type" "VRR")])
|
|
805
|
|
806 (define_insn "vec_gfmsum_128"
|
|
807 [(set (match_operand:V16QI 0 "register_operand" "=v")
|
|
808 (unspec:V16QI [(match_operand:V2DI 1 "register_operand" "v")
|
|
809 (match_operand:V2DI 2 "register_operand" "v")]
|
|
810 UNSPEC_VEC_GFMSUM_128))]
|
|
811 "TARGET_VX"
|
|
812 "vgfmg\t%v0,%v1,%v2"
|
|
813 [(set_attr "op_type" "VRR")])
|
|
814
|
|
815 ; vgfmab, vgfmah, vgfmaf
|
|
816 (define_insn "vec_gfmsum_accum<mode>"
|
|
817 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
818 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
819 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
820 (match_operand:<vec_double> 3 "register_operand" "v")]
|
|
821 UNSPEC_VEC_GFMSUM_ACCUM))]
|
|
822 "TARGET_VX"
|
|
823 "vgfma<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
824 [(set_attr "op_type" "VRR")])
|
|
825
|
|
826 (define_insn "vec_gfmsum_accum_128"
|
|
827 [(set (match_operand:V16QI 0 "register_operand" "=v")
|
|
828 (unspec:V16QI [(match_operand:V2DI 1 "register_operand" "v")
|
|
829 (match_operand:V2DI 2 "register_operand" "v")
|
|
830 (match_operand:V16QI 3 "register_operand" "v")]
|
|
831 UNSPEC_VEC_GFMSUM_ACCUM_128))]
|
|
832 "TARGET_VX"
|
|
833 "vgfmag\t%v0,%v1,%v2,%v3"
|
|
834 [(set_attr "op_type" "VRR")])
|
|
835
|
|
836
|
|
837 ; FIXME: vec_neg ?
|
|
838
|
|
839 ; Vector load positive: vec_abs -> abs
|
|
840 ; Vector maximum vec_max -> smax, logical vec_max -> umax
|
|
841 ; Vector maximum vec_min -> smin, logical vec_min -> umin
|
|
842
|
|
843
|
|
844 ; Vector multiply and add high
|
|
845
|
|
846 ; vec_mladd -> vec_vmal
|
|
847 ; vmalb, vmalh, vmalf, vmalg
|
|
848 (define_insn "vec_vmal<mode>"
|
|
849 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
850 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
851 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
852 (match_operand:VI_HW_QHS 3 "register_operand" "v")]
|
|
853 UNSPEC_VEC_VMAL))]
|
|
854 "TARGET_VX"
|
|
855 "vmal<bhfgq><w>\t%v0,%v1,%v2,%v3"
|
|
856 [(set_attr "op_type" "VRR")])
|
|
857
|
|
858 ; vec_mhadd -> vec_vmah/vec_vmalh
|
|
859
|
|
860 ; vmahb; vmahh, vmahf, vmahg
|
|
861 (define_insn "vec_vmah<mode>"
|
|
862 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
863 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
864 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
865 (match_operand:VI_HW_QHS 3 "register_operand" "v")]
|
|
866 UNSPEC_VEC_VMAH))]
|
|
867 "TARGET_VX"
|
|
868 "vmah<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
869 [(set_attr "op_type" "VRR")])
|
|
870
|
|
871 ; vmalhb; vmalhh, vmalhf, vmalhg
|
|
872 (define_insn "vec_vmalh<mode>"
|
|
873 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
874 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
875 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
876 (match_operand:VI_HW_QHS 3 "register_operand" "v")]
|
|
877 UNSPEC_VEC_VMALH))]
|
|
878 "TARGET_VX"
|
|
879 "vmalh<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
880 [(set_attr "op_type" "VRR")])
|
|
881
|
|
882 ; vec_meadd -> vec_vmae/vec_vmale
|
|
883
|
|
884 ; vmaeb; vmaeh, vmaef, vmaeg
|
|
885 (define_insn "vec_vmae<mode>"
|
|
886 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
887 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
888 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
889 (match_operand:<vec_double> 3 "register_operand" "v")]
|
|
890 UNSPEC_VEC_VMAE))]
|
|
891 "TARGET_VX"
|
|
892 "vmae<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
893 [(set_attr "op_type" "VRR")])
|
|
894
|
|
895 ; vmaleb; vmaleh, vmalef, vmaleg
|
|
896 (define_insn "vec_vmale<mode>"
|
|
897 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
898 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
899 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
900 (match_operand:<vec_double> 3 "register_operand" "v")]
|
|
901 UNSPEC_VEC_VMALE))]
|
|
902 "TARGET_VX"
|
|
903 "vmale<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
904 [(set_attr "op_type" "VRR")])
|
|
905
|
|
906 ; vec_moadd -> vec_vmao/vec_vmalo
|
|
907
|
|
908 ; vmaob; vmaoh, vmaof, vmaog
|
|
909 (define_insn "vec_vmao<mode>"
|
|
910 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
911 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
912 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
913 (match_operand:<vec_double> 3 "register_operand" "v")]
|
|
914 UNSPEC_VEC_VMAO))]
|
|
915 "TARGET_VX"
|
|
916 "vmao<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
917 [(set_attr "op_type" "VRR")])
|
|
918
|
|
919 ; vmalob; vmaloh, vmalof, vmalog
|
|
920 (define_insn "vec_vmalo<mode>"
|
|
921 [(set (match_operand:<vec_double> 0 "register_operand" "=v")
|
|
922 (unspec:<vec_double> [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
923 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
924 (match_operand:<vec_double> 3 "register_operand" "v")]
|
|
925 UNSPEC_VEC_VMALO))]
|
|
926 "TARGET_VX"
|
|
927 "vmalo<bhfgq>\t%v0,%v1,%v2,%v3"
|
|
928 [(set_attr "op_type" "VRR")])
|
|
929
|
|
930
|
|
931 ; Vector multiply high
|
|
932
|
|
933 ; vec_mulh -> vec_smulh/vec_umulh
|
|
934
|
|
935 ; vmhb, vmhh, vmhf
|
|
936 (define_insn "vec_smulh<mode>"
|
|
937 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
938 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
939 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
940 UNSPEC_VEC_SMULT_HI))]
|
|
941 "TARGET_VX"
|
|
942 "vmh<bhfgq>\t%v0,%v1,%v2"
|
|
943 [(set_attr "op_type" "VRR")])
|
|
944
|
|
945 ; vmlhb, vmlhh, vmlhf
|
|
946 (define_insn "vec_umulh<mode>"
|
|
947 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
948 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "%v")
|
|
949 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
950 UNSPEC_VEC_UMULT_HI))]
|
|
951 "TARGET_VX"
|
|
952 "vmlh<bhfgq>\t%v0,%v1,%v2"
|
|
953 [(set_attr "op_type" "VRR")])
|
|
954
|
|
955
|
|
956 ; Vector multiply low
|
|
957
|
|
958 ; vec_mule -> vec_widen_umult_even/vec_widen_smult_even
|
|
959 ; vec_mulo -> vec_widen_umult_odd/vec_widen_smult_odd
|
|
960
|
|
961
|
|
962 ; Vector nor
|
|
963
|
|
964 (define_insn "vec_nor<mode>3"
|
|
965 [(set (match_operand:VT_HW 0 "register_operand" "=v")
|
|
966 (not:VT_HW
|
|
967 (ior:VT_HW (match_operand:VT_HW 1 "register_operand" "%v")
|
|
968 (match_operand:VT_HW 2 "register_operand" "v"))))]
|
|
969 "TARGET_VX"
|
|
970 "vno\t%v0,%v1,%v2"
|
|
971 [(set_attr "op_type" "VRR")])
|
|
972
|
|
973
|
|
974 ; Vector or
|
|
975
|
|
976 ; Vector population count vec_popcnt -> popcount
|
|
977 ; Vector element rotate left logical vec_rl -> vrotl, vec_rli -> rot
|
|
978
|
|
979 ; Vector element rotate and insert under mask
|
|
980
|
|
981 ; verimb, verimh, verimf, verimg
|
|
982 (define_insn "verim<mode>"
|
|
983 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
984 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "0")
|
|
985 (match_operand:VI_HW 2 "register_operand" "v")
|
|
986 (match_operand:VI_HW 3 "register_operand" "v")
|
|
987 (match_operand:QI 4 "const_int_operand" "C")]
|
|
988 UNSPEC_VEC_RL_MASK))]
|
|
989 "TARGET_VX"
|
|
990 "verim<bhfgq>\t%v0,%v2,%v3,%b4"
|
|
991 [(set_attr "op_type" "VRI")])
|
|
992
|
|
993
|
|
994 ; Vector shift left
|
|
995
|
|
996 (define_insn "vec_sll<VI_HW:mode><VI_HW_QHS:mode>"
|
|
997 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
998 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v")
|
|
999 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
1000 UNSPEC_VEC_SLL))]
|
|
1001 "TARGET_VX"
|
|
1002 "vsl\t%v0,%v1,%v2"
|
|
1003 [(set_attr "op_type" "VRR")])
|
|
1004
|
|
1005
|
|
1006 ; Vector shift left by byte
|
|
1007
|
|
1008 ; Pattern definition in vector.md, see vec_vslb
|
|
1009 (define_expand "vec_slb<mode>"
|
|
1010 [(set (match_operand:V_HW 0 "register_operand" "")
|
|
1011 (unspec:V_HW [(match_operand:V_HW 1 "register_operand" "")
|
|
1012 (match_operand:<tointvec> 2 "register_operand" "")]
|
|
1013 UNSPEC_VEC_SLB))]
|
|
1014 "TARGET_VX"
|
|
1015 {
|
|
1016 PUT_MODE (operands[2], V16QImode);
|
|
1017 })
|
|
1018
|
|
1019 ; Vector shift left double by byte
|
|
1020
|
|
1021 (define_insn "vec_sld<mode>"
|
|
1022 [(set (match_operand:V_HW 0 "register_operand" "=v")
|
|
1023 (unspec:V_HW [(match_operand:V_HW 1 "register_operand" "v")
|
|
1024 (match_operand:V_HW 2 "register_operand" "v")
|
|
1025 (match_operand:QI 3 "const_int_operand" "C")]
|
|
1026 UNSPEC_VEC_SLDB))]
|
|
1027 "TARGET_VX"
|
|
1028 "vsldb\t%v0,%v1,%v2,%b3"
|
|
1029 [(set_attr "op_type" "VRI")])
|
|
1030
|
|
1031 (define_expand "vec_sldw<mode>"
|
|
1032 [(set (match_operand:V_HW 0 "register_operand" "")
|
|
1033 (unspec:V_HW [(match_operand:V_HW 1 "register_operand" "")
|
|
1034 (match_operand:V_HW 2 "register_operand" "")
|
|
1035 (match_operand:QI 3 "const_int_operand" "")]
|
|
1036 UNSPEC_VEC_SLDB))]
|
|
1037 "TARGET_VX"
|
|
1038 {
|
|
1039 operands[3] = GEN_INT (INTVAL (operands[3]) << 2);
|
|
1040 })
|
|
1041
|
|
1042 ; Vector shift right arithmetic
|
|
1043
|
|
1044 (define_insn "vec_sral<VI_HW:mode><VI_HW_QHS:mode>"
|
|
1045 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
1046 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v")
|
|
1047 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
1048 UNSPEC_VEC_SRAL))]
|
|
1049 "TARGET_VX"
|
|
1050 "vsra\t%v0,%v1,%v2"
|
|
1051 [(set_attr "op_type" "VRR")])
|
|
1052
|
|
1053
|
|
1054 ; Vector shift right arithmetic by byte
|
|
1055
|
|
1056 (define_insn "vec_srab<mode>"
|
|
1057 [(set (match_operand:V_HW 0 "register_operand" "=v")
|
|
1058 (unspec:V_HW [(match_operand:V_HW 1 "register_operand" "v")
|
|
1059 (match_operand:<tointvec> 2 "register_operand" "v")]
|
|
1060 UNSPEC_VEC_SRAB))]
|
|
1061 "TARGET_VX"
|
|
1062 "vsrab\t%v0,%v1,%v2"
|
|
1063 [(set_attr "op_type" "VRR")])
|
|
1064
|
|
1065
|
|
1066 ; Vector shift right logical
|
|
1067
|
|
1068 (define_insn "vec_srl<VI_HW:mode><VI_HW_QHS:mode>"
|
|
1069 [(set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
1070 (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v")
|
|
1071 (match_operand:VI_HW_QHS 2 "register_operand" "v")]
|
|
1072 UNSPEC_VEC_SRL))]
|
|
1073 "TARGET_VX"
|
|
1074 "vsrl\t%v0,%v1,%v2"
|
|
1075 [(set_attr "op_type" "VRR")])
|
|
1076
|
|
1077
|
|
1078 ; Vector shift right logical by byte
|
|
1079
|
|
1080 ; Pattern definition in vector.md, see vec_vsrb
|
|
1081 (define_expand "vec_srb<mode>"
|
|
1082 [(set (match_operand:V_HW 0 "register_operand" "")
|
|
1083 (unspec:V_HW [(match_operand:V_HW 1 "register_operand" "")
|
|
1084 (match_operand:<tointvec> 2 "register_operand" "")]
|
|
1085 UNSPEC_VEC_SRLB))]
|
|
1086 "TARGET_VX"
|
|
1087 {
|
|
1088 PUT_MODE (operands[2], V16QImode);
|
|
1089 })
|
|
1090
|
|
1091 ; Vector subtract
|
|
1092
|
|
1093 ; Vector subtract compute borrow indication
|
|
1094
|
|
1095 ; vscbib, vscbih, vscbif, vscbig, vscbiq
|
|
1096 (define_insn "vscbi<bhfgq>_<mode>"
|
|
1097 [(set (match_operand:VIT_HW 0 "register_operand" "=v")
|
|
1098 (unspec:VIT_HW [(match_operand:VIT_HW 1 "register_operand" "v")
|
|
1099 (match_operand:VIT_HW 2 "register_operand" "v")]
|
|
1100 UNSPEC_VEC_SUBC))]
|
|
1101 "TARGET_VX"
|
|
1102 "vscbi<bhfgq>\t%v0,%v1,%v2"
|
|
1103 [(set_attr "op_type" "VRR")])
|
|
1104
|
|
1105 ; Vector subtract with borrow indication
|
|
1106
|
|
1107 (define_insn "vsbiq"
|
|
1108 [(set (match_operand:TI 0 "register_operand" "=v")
|
|
1109 (unspec:TI [(match_operand:TI 1 "register_operand" "v")
|
|
1110 (match_operand:TI 2 "register_operand" "v")
|
|
1111 (match_operand:TI 3 "register_operand" "v")]
|
|
1112 UNSPEC_VEC_SUBE_U128))]
|
|
1113 "TARGET_VX"
|
|
1114 "vsbiq\t%v0,%v1,%v2,%v3"
|
|
1115 [(set_attr "op_type" "VRR")])
|
|
1116
|
|
1117
|
|
1118 ; Vector subtract with borrow compute and borrow indication
|
|
1119
|
|
1120 (define_insn "vsbcbiq"
|
|
1121 [(set (match_operand:TI 0 "register_operand" "=v")
|
|
1122 (unspec:TI [(match_operand:TI 1 "register_operand" "v")
|
|
1123 (match_operand:TI 2 "register_operand" "v")
|
|
1124 (match_operand:TI 3 "register_operand" "v")]
|
|
1125 UNSPEC_VEC_SUBEC_U128))]
|
|
1126 "TARGET_VX"
|
|
1127 "vsbcbiq\t%v0,%v1,%v2,%v3"
|
|
1128 [(set_attr "op_type" "VRR")])
|
|
1129
|
|
1130
|
|
1131 ; Vector sum across
|
|
1132
|
|
1133 ; Sum across DImode parts of the 1st operand and add the rightmost
|
|
1134 ; element of 2nd operand
|
|
1135 ; vsumgh, vsumgf
|
|
1136 (define_expand "vec_sum2<mode>"
|
|
1137 [(set (match_operand:V2DI 0 "register_operand" "")
|
|
1138 (unspec:V2DI [(match_operand:VI_HW_HS 1 "register_operand" "")
|
|
1139 (match_operand:VI_HW_HS 2 "register_operand" "")]
|
|
1140 UNSPEC_VEC_VSUMG))]
|
|
1141 "TARGET_VX")
|
|
1142
|
|
1143 ; vsumqh, vsumqf
|
|
1144 (define_insn "vec_sum_u128<mode>"
|
|
1145 [(set (match_operand:V2DI 0 "register_operand" "=v")
|
|
1146 (unspec:V2DI [(match_operand:VI_HW_SD 1 "register_operand" "v")
|
|
1147 (match_operand:VI_HW_SD 2 "register_operand" "v")]
|
|
1148 UNSPEC_VEC_VSUMQ))]
|
|
1149 "TARGET_VX"
|
|
1150 "vsumq<bhfgq>\t%v0,%v1,%v2"
|
|
1151 [(set_attr "op_type" "VRR")])
|
|
1152
|
|
1153 ; vsumb, vsumh
|
|
1154 (define_expand "vec_sum4<mode>"
|
|
1155 [(set (match_operand:V4SI 0 "register_operand" "")
|
|
1156 (unspec:V4SI [(match_operand:VI_HW_QH 1 "register_operand" "")
|
|
1157 (match_operand:VI_HW_QH 2 "register_operand" "")]
|
|
1158 UNSPEC_VEC_VSUM))]
|
|
1159 "TARGET_VX")
|
|
1160
|
|
1161
|
|
1162 ; Vector test under mask
|
|
1163
|
|
1164 (define_expand "vec_test_mask_int<mode>"
|
|
1165 [(set (reg:CCRAW CC_REGNUM)
|
|
1166 (unspec:CCRAW [(match_operand:V_HW 1 "register_operand" "")
|
|
1167 (match_operand:<tointvec> 2 "register_operand" "")]
|
|
1168 UNSPEC_VEC_TEST_MASK))
|
|
1169 (set (match_operand:SI 0 "register_operand" "")
|
|
1170 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1171 "TARGET_VX")
|
|
1172
|
|
1173 (define_insn "*vec_test_mask<mode>"
|
|
1174 [(set (reg:CCRAW CC_REGNUM)
|
|
1175 (unspec:CCRAW [(match_operand:V_HW 0 "register_operand" "v")
|
|
1176 (match_operand:<tointvec> 1 "register_operand" "v")]
|
|
1177 UNSPEC_VEC_TEST_MASK))]
|
|
1178 "TARGET_VX"
|
|
1179 "vtm\t%v0,%v1"
|
|
1180 [(set_attr "op_type" "VRR")])
|
|
1181
|
|
1182
|
|
1183 ; Vector multiply sum logical
|
|
1184
|
|
1185 (define_insn "vec_msumv2di"
|
|
1186 [(set (match_operand:V16QI 0 "register_operand" "=v")
|
|
1187 (unspec:V16QI [(match_operand:V2DI 1 "register_operand" "v")
|
|
1188 (match_operand:V2DI 2 "register_operand" "v")
|
|
1189 (match_operand:V16QI 3 "register_operand" "v")
|
|
1190 (match_operand:QI 4 "const_mask_operand" "C")]
|
|
1191 UNSPEC_VEC_MSUM))]
|
|
1192 "TARGET_VXE"
|
|
1193 "vmslg\t%v0,%v1,%v2,%v3,%4"
|
|
1194 [(set_attr "op_type" "VRR")])
|
|
1195
|
|
1196 (define_insn "vmslg"
|
|
1197 [(set (match_operand:TI 0 "register_operand" "=v")
|
|
1198 (unspec:TI [(match_operand:V2DI 1 "register_operand" "v")
|
|
1199 (match_operand:V2DI 2 "register_operand" "v")
|
|
1200 (match_operand:TI 3 "register_operand" "v")
|
|
1201 (match_operand:QI 4 "const_mask_operand" "C")]
|
|
1202 UNSPEC_VEC_MSUM))]
|
|
1203 "TARGET_VXE"
|
|
1204 "vmslg\t%v0,%v1,%v2,%v3,%4"
|
|
1205 [(set_attr "op_type" "VRR")])
|
|
1206
|
|
1207
|
|
1208 ; Vector find any element equal
|
|
1209
|
|
1210 ; vfaeb, vfaeh, vfaef
|
|
1211 ; vfaezb, vfaezh, vfaezf
|
|
1212 (define_insn "vfae<mode>"
|
|
1213 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1214 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1215 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1216 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1217 UNSPEC_VEC_VFAE))]
|
|
1218 "TARGET_VX"
|
|
1219 {
|
|
1220 unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
|
|
1221
|
|
1222 if (flags & VSTRING_FLAG_ZS)
|
|
1223 {
|
|
1224 flags &= ~VSTRING_FLAG_ZS;
|
|
1225 operands[3] = GEN_INT (flags);
|
|
1226 return "vfaez<bhfgq>\t%v0,%v1,%v2,%b3";
|
|
1227 }
|
|
1228 return "vfae<bhfgq>\t%v0,%v1,%v2,%b3";
|
|
1229 }
|
|
1230 [(set_attr "op_type" "VRR")])
|
|
1231
|
|
1232 ; vfaebs, vfaehs, vfaefs
|
|
1233 ; vfaezbs, vfaezhs, vfaezfs
|
|
1234 (define_insn "*vfaes<mode>"
|
|
1235 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1236 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1237 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1238 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1239 UNSPEC_VEC_VFAE))
|
|
1240 (set (reg:CCRAW CC_REGNUM)
|
|
1241 (unspec:CCRAW [(match_dup 1)
|
|
1242 (match_dup 2)
|
|
1243 (match_dup 3)]
|
|
1244 UNSPEC_VEC_VFAECC))]
|
|
1245 "TARGET_VX"
|
|
1246 {
|
|
1247 unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
|
|
1248
|
|
1249 if (flags & VSTRING_FLAG_ZS)
|
|
1250 {
|
|
1251 flags &= ~VSTRING_FLAG_ZS;
|
|
1252 operands[3] = GEN_INT (flags);
|
|
1253 return "vfaez<bhfgq>s\t%v0,%v1,%v2,%b3";
|
|
1254 }
|
|
1255 return "vfae<bhfgq>s\t%v0,%v1,%v2,%b3";
|
|
1256 }
|
|
1257 [(set_attr "op_type" "VRR")])
|
|
1258
|
|
1259 (define_expand "vfaez<mode>"
|
|
1260 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1261 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1262 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1263 (match_operand:QI 3 "const_mask_operand" "")]
|
|
1264 UNSPEC_VEC_VFAE))]
|
|
1265 "TARGET_VX"
|
|
1266 {
|
|
1267 operands[3] = GEN_INT (INTVAL (operands[3]) | VSTRING_FLAG_ZS);
|
|
1268 })
|
|
1269
|
|
1270 (define_expand "vfaes<mode>"
|
|
1271 [(parallel
|
|
1272 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1273 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1274 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1275 (match_operand:QI 3 "const_mask_operand" "")]
|
|
1276 UNSPEC_VEC_VFAE))
|
|
1277 (set (reg:CCRAW CC_REGNUM)
|
|
1278 (unspec:CCRAW [(match_dup 1)
|
|
1279 (match_dup 2)
|
|
1280 (match_dup 3)]
|
|
1281 UNSPEC_VEC_VFAECC))])
|
|
1282 (set (match_operand:SI 4 "memory_operand" "")
|
|
1283 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1284 "TARGET_VX"
|
|
1285 {
|
|
1286 operands[3] = GEN_INT (INTVAL (operands[3]) | VSTRING_FLAG_CS);
|
|
1287 })
|
|
1288
|
|
1289 (define_expand "vfaezs<mode>"
|
|
1290 [(parallel
|
|
1291 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1292 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1293 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1294 (match_operand:SI 3 "const_mask_operand" "")]
|
|
1295 UNSPEC_VEC_VFAE))
|
|
1296 (set (reg:CCRAW CC_REGNUM)
|
|
1297 (unspec:CCRAW [(match_dup 1)
|
|
1298 (match_dup 2)
|
|
1299 (match_dup 3)]
|
|
1300 UNSPEC_VEC_VFAECC))])
|
|
1301 (set (match_operand:SI 4 "memory_operand" "")
|
|
1302 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1303 "TARGET_VX"
|
|
1304 {
|
|
1305 operands[3] = GEN_INT (INTVAL (operands[3]) | VSTRING_FLAG_CS | VSTRING_FLAG_ZS);
|
|
1306 })
|
|
1307
|
|
1308
|
|
1309 ; Vector find element equal
|
|
1310
|
|
1311 ; vfeebs, vfeehs, vfeefs
|
|
1312 ; vfeezbs, vfeezhs, vfeezfs
|
|
1313 (define_insn "*vfees<mode>"
|
|
1314 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1315 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1316 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1317 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1318 UNSPEC_VEC_VFEE))
|
|
1319 (set (reg:CCRAW CC_REGNUM)
|
|
1320 (unspec:CCRAW [(match_dup 1)
|
|
1321 (match_dup 2)
|
|
1322 (match_dup 3)]
|
|
1323 UNSPEC_VEC_VFEECC))]
|
|
1324 "TARGET_VX"
|
|
1325 {
|
|
1326 unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
|
|
1327
|
|
1328 gcc_assert (!(flags & ~(VSTRING_FLAG_ZS | VSTRING_FLAG_CS)));
|
|
1329 flags &= ~VSTRING_FLAG_CS;
|
|
1330
|
|
1331 if (flags == VSTRING_FLAG_ZS)
|
|
1332 return "vfeez<bhfgq>s\t%v0,%v1,%v2";
|
|
1333 return "vfee<bhfgq>s\t%v0,%v1,%v2,%b3";
|
|
1334 }
|
|
1335 [(set_attr "op_type" "VRR")])
|
|
1336
|
|
1337 ; vfeeb, vfeeh, vfeef
|
|
1338 (define_insn "vfee<mode>"
|
|
1339 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1340 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1341 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1342 (const_int 0)]
|
|
1343 UNSPEC_VEC_VFEE))]
|
|
1344 "TARGET_VX"
|
|
1345 "vfee<bhfgq>\t%v0,%v1,%v2,0"
|
|
1346 [(set_attr "op_type" "VRR")])
|
|
1347
|
|
1348 ; vfeezb, vfeezh, vfeezf
|
|
1349 (define_insn "vfeez<mode>"
|
|
1350 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1351 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1352 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1353 (const_int VSTRING_FLAG_ZS)]
|
|
1354 UNSPEC_VEC_VFEE))]
|
|
1355 "TARGET_VX"
|
|
1356 "vfeez<bhfgq>s\t%v0,%v1,%v2,2"
|
|
1357 [(set_attr "op_type" "VRR")])
|
|
1358
|
|
1359 (define_expand "vfees<mode>"
|
|
1360 [(parallel
|
|
1361 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1362 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1363 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1364 (const_int VSTRING_FLAG_CS)]
|
|
1365 UNSPEC_VEC_VFEE))
|
|
1366 (set (reg:CCRAW CC_REGNUM)
|
|
1367 (unspec:CCRAW [(match_dup 1)
|
|
1368 (match_dup 2)
|
|
1369 (const_int VSTRING_FLAG_CS)]
|
|
1370 UNSPEC_VEC_VFEECC))])
|
|
1371 (set (match_operand:SI 3 "memory_operand" "")
|
|
1372 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1373 "TARGET_VX")
|
|
1374
|
|
1375 (define_expand "vfeezs<mode>"
|
|
1376 [(parallel
|
|
1377 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1378 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1379 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1380 (match_dup 4)]
|
|
1381 UNSPEC_VEC_VFEE))
|
|
1382 (set (reg:CCRAW CC_REGNUM)
|
|
1383 (unspec:CCRAW [(match_dup 1)
|
|
1384 (match_dup 2)
|
|
1385 (match_dup 4)]
|
|
1386 UNSPEC_VEC_VFEECC))])
|
|
1387 (set (match_operand:SI 3 "memory_operand" "")
|
|
1388 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1389 "TARGET_VX"
|
|
1390 {
|
|
1391 operands[4] = GEN_INT (VSTRING_FLAG_ZS | VSTRING_FLAG_CS);
|
|
1392 })
|
|
1393
|
|
1394 ; Vector find element not equal
|
|
1395
|
|
1396 ; vfeneb, vfeneh, vfenef
|
|
1397 (define_insn "vfene<mode>"
|
|
1398 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1399 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1400 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1401 (const_int 0)]
|
|
1402 UNSPEC_VEC_VFENE))]
|
|
1403 "TARGET_VX"
|
|
1404 "vfene<bhfgq>\t%v0,%v1,%v2,0"
|
|
1405 [(set_attr "op_type" "VRR")])
|
|
1406
|
|
1407 ; vec_vfenes can be found in vector.md since it is used for strlen
|
|
1408
|
|
1409 ; vfenezb, vfenezh, vfenezf
|
|
1410 (define_insn "vfenez<mode>"
|
|
1411 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1412 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1413 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1414 (const_int VSTRING_FLAG_ZS)]
|
|
1415 UNSPEC_VEC_VFENE))]
|
|
1416 "TARGET_VX"
|
|
1417 "vfenez<bhfgq>\t%v0,%v1,%v2"
|
|
1418 [(set_attr "op_type" "VRR")])
|
|
1419
|
|
1420 (define_expand "vfenes<mode>"
|
|
1421 [(parallel
|
|
1422 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1423 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1424 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1425 (const_int VSTRING_FLAG_CS)]
|
|
1426 UNSPEC_VEC_VFENE))
|
|
1427 (set (reg:CCRAW CC_REGNUM)
|
|
1428 (unspec:CCRAW [(match_dup 1)
|
|
1429 (match_dup 2)
|
|
1430 (const_int VSTRING_FLAG_CS)]
|
|
1431 UNSPEC_VEC_VFENECC))])
|
|
1432 (set (match_operand:SI 3 "memory_operand" "")
|
|
1433 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1434 "TARGET_VX")
|
|
1435
|
|
1436 (define_expand "vfenezs<mode>"
|
|
1437 [(parallel
|
|
1438 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1439 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1440 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1441 (match_dup 4)]
|
|
1442 UNSPEC_VEC_VFENE))
|
|
1443 (set (reg:CCRAW CC_REGNUM)
|
|
1444 (unspec:CCRAW [(match_dup 1)
|
|
1445 (match_dup 2)
|
|
1446 (match_dup 4)]
|
|
1447 UNSPEC_VEC_VFENECC))])
|
|
1448 (set (match_operand:SI 3 "memory_operand" "")
|
|
1449 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1450 "TARGET_VX"
|
|
1451 {
|
|
1452 operands[4] = GEN_INT (VSTRING_FLAG_ZS | VSTRING_FLAG_CS);
|
|
1453 })
|
|
1454
|
|
1455 ; Vector isolate string
|
|
1456
|
|
1457 ; vistrb, vistrh, vistrf
|
|
1458 (define_insn "vistr<mode>"
|
|
1459 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1460 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
1461 UNSPEC_VEC_VISTR))]
|
|
1462 "TARGET_VX"
|
|
1463 "vistr<bhfgq>\t%v0,%v1"
|
|
1464 [(set_attr "op_type" "VRR")])
|
|
1465
|
|
1466 ; vistrbs, vistrhs, vistrfs
|
|
1467 (define_insn "*vistrs<mode>"
|
|
1468 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1469 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")]
|
|
1470 UNSPEC_VEC_VISTR))
|
|
1471 (set (reg:CCRAW CC_REGNUM)
|
|
1472 (unspec:CCRAW [(match_dup 1)] UNSPEC_VEC_VISTRCC))]
|
|
1473 "TARGET_VX"
|
|
1474 "vistr<bhfgq>s\t%v0,%v1"
|
|
1475 [(set_attr "op_type" "VRR")])
|
|
1476
|
|
1477 (define_expand "vistrs<mode>"
|
|
1478 [(parallel
|
|
1479 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1480 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")]
|
|
1481 UNSPEC_VEC_VISTR))
|
|
1482 (set (reg:CCRAW CC_REGNUM)
|
|
1483 (unspec:CCRAW [(match_dup 1)]
|
|
1484 UNSPEC_VEC_VISTRCC))])
|
|
1485 (set (match_operand:SI 2 "memory_operand" "")
|
|
1486 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1487 "TARGET_VX")
|
|
1488
|
|
1489
|
|
1490 ; Vector compare range
|
|
1491
|
|
1492 ; vstrcb, vstrch, vstrcf
|
|
1493 ; vstrczb, vstrczh, vstrczf
|
|
1494 (define_insn "vstrc<mode>"
|
|
1495 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1496 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1497 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1498 (match_operand:VI_HW_QHS 3 "register_operand" "v")
|
|
1499 (match_operand:QI 4 "const_mask_operand" "C")]
|
|
1500 UNSPEC_VEC_VSTRC))]
|
|
1501 "TARGET_VX"
|
|
1502 {
|
|
1503 unsigned HOST_WIDE_INT flags = UINTVAL (operands[4]);
|
|
1504
|
|
1505 if (flags & VSTRING_FLAG_ZS)
|
|
1506 {
|
|
1507 flags &= ~VSTRING_FLAG_ZS;
|
|
1508 operands[4] = GEN_INT (flags);
|
|
1509 return "vstrcz<bhfgq>\t%v0,%v1,%v2,%v3,%b4";
|
|
1510 }
|
|
1511 return "vstrc<bhfgq>\t%v0,%v1,%v2,%v3,%b4";
|
|
1512 }
|
|
1513 [(set_attr "op_type" "VRR")])
|
|
1514
|
|
1515 ; vstrcbs, vstrchs, vstrcfs
|
|
1516 ; vstrczbs, vstrczhs, vstrczfs
|
|
1517 (define_insn "*vstrcs<mode>"
|
|
1518 [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
|
|
1519 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
|
|
1520 (match_operand:VI_HW_QHS 2 "register_operand" "v")
|
|
1521 (match_operand:VI_HW_QHS 3 "register_operand" "v")
|
|
1522 (match_operand:QI 4 "const_mask_operand" "C")]
|
|
1523 UNSPEC_VEC_VSTRC))
|
|
1524 (set (reg:CCRAW CC_REGNUM)
|
|
1525 (unspec:CCRAW [(match_dup 1)
|
|
1526 (match_dup 2)
|
|
1527 (match_dup 3)
|
|
1528 (match_dup 4)]
|
|
1529 UNSPEC_VEC_VSTRCCC))]
|
|
1530 "TARGET_VX"
|
|
1531 {
|
|
1532 unsigned HOST_WIDE_INT flags = UINTVAL (operands[4]);
|
|
1533
|
|
1534 if (flags & VSTRING_FLAG_ZS)
|
|
1535 {
|
|
1536 flags &= ~VSTRING_FLAG_ZS;
|
|
1537 operands[4] = GEN_INT (flags);
|
|
1538 return "vstrcz<bhfgq>s\t%v0,%v1,%v2,%v3,%b4";
|
|
1539 }
|
|
1540 return "vstrc<bhfgq>s\t%v0,%v1,%v2,%v3,%b4";
|
|
1541 }
|
|
1542 [(set_attr "op_type" "VRR")])
|
|
1543
|
|
1544 (define_expand "vstrcz<mode>"
|
|
1545 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1546 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1547 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1548 (match_operand:VI_HW_QHS 3 "register_operand" "")
|
|
1549 (match_operand:QI 4 "const_mask_operand" "")]
|
|
1550 UNSPEC_VEC_VSTRC))]
|
|
1551 "TARGET_VX"
|
|
1552 {
|
|
1553 operands[4] = GEN_INT (INTVAL (operands[4]) | VSTRING_FLAG_ZS);
|
|
1554 })
|
|
1555
|
|
1556 (define_expand "vstrcs<mode>"
|
|
1557 [(parallel
|
|
1558 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1559 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1560 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1561 (match_operand:VI_HW_QHS 3 "register_operand" "")
|
|
1562 (match_operand:QI 4 "const_mask_operand" "")]
|
|
1563 UNSPEC_VEC_VSTRC))
|
|
1564 (set (reg:CCRAW CC_REGNUM)
|
|
1565 (unspec:CCRAW [(match_dup 1)
|
|
1566 (match_dup 2)
|
|
1567 (match_dup 3)
|
|
1568 (match_dup 4)]
|
|
1569 UNSPEC_VEC_VSTRCCC))])
|
|
1570 (set (match_operand:SI 5 "memory_operand" "")
|
|
1571 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1572 "TARGET_VX"
|
|
1573 {
|
|
1574 operands[4] = GEN_INT (INTVAL (operands[4]) | VSTRING_FLAG_CS);
|
|
1575 })
|
|
1576
|
|
1577 (define_expand "vstrczs<mode>"
|
|
1578 [(parallel
|
|
1579 [(set (match_operand:VI_HW_QHS 0 "register_operand" "")
|
|
1580 (unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "")
|
|
1581 (match_operand:VI_HW_QHS 2 "register_operand" "")
|
|
1582 (match_operand:VI_HW_QHS 3 "register_operand" "")
|
|
1583 (match_operand:QI 4 "const_mask_operand" "")]
|
|
1584 UNSPEC_VEC_VSTRC))
|
|
1585 (set (reg:CCRAW CC_REGNUM)
|
|
1586 (unspec:CCRAW [(match_dup 1)
|
|
1587 (match_dup 2)
|
|
1588 (match_dup 3)
|
|
1589 (match_dup 4)]
|
|
1590 UNSPEC_VEC_VSTRCCC))])
|
|
1591 (set (match_operand:SI 5 "memory_operand" "")
|
|
1592 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1593 "TARGET_VX"
|
|
1594 {
|
|
1595 operands[4] = GEN_INT (INTVAL (operands[4]) | VSTRING_FLAG_CS | VSTRING_FLAG_ZS);
|
|
1596 })
|
|
1597
|
|
1598 (define_insn "vcdgb"
|
|
1599 [(set (match_operand:V2DF 0 "register_operand" "=v")
|
|
1600 (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "v")
|
|
1601 (match_operand:QI 2 "const_mask_operand" "C") ; inexact suppression
|
|
1602 (match_operand:QI 3 "const_mask_operand" "C")] ; rounding mode
|
|
1603 UNSPEC_VEC_VCDGB))]
|
|
1604 "TARGET_VX && UINTVAL (operands[3]) != 2 && UINTVAL (operands[3]) <= 7"
|
|
1605 "vcdgb\t%v0,%v1,%b2,%b3"
|
|
1606 [(set_attr "op_type" "VRR")])
|
|
1607
|
|
1608
|
|
1609 ; The result needs to be multiplied with 2**-op2
|
|
1610 (define_expand "vec_ctd_s64"
|
|
1611 [(set (match_operand:V2DF 0 "register_operand" "")
|
|
1612 (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "")
|
|
1613 (const_int 4) ; inexact suppressed
|
|
1614 (const_int VEC_RND_CURRENT)]
|
|
1615 UNSPEC_VEC_VCDGB))
|
|
1616 (use (match_operand:QI 2 "const_int_operand" ""))
|
|
1617 (set (match_dup 0) (mult:V2DF (match_dup 0) (match_dup 3)))]
|
|
1618 "TARGET_VX"
|
|
1619 {
|
|
1620 REAL_VALUE_TYPE f;
|
|
1621 rtx c;
|
|
1622
|
|
1623 real_2expN (&f, -INTVAL (operands[2]), DFmode);
|
|
1624 c = const_double_from_real_value (f, DFmode);
|
|
1625
|
|
1626 operands[3] = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, c, c));
|
|
1627 operands[3] = force_reg (V2DFmode, operands[3]);
|
|
1628 })
|
|
1629
|
|
1630 (define_insn "vcdlgb"
|
|
1631 [(set (match_operand:V2DF 0 "register_operand" "=v")
|
|
1632 (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "v")
|
|
1633 (match_operand:QI 2 "const_mask_operand" "C") ; inexact suppression
|
|
1634 (match_operand:QI 3 "const_mask_operand" "C")] ; rounding mode
|
|
1635 UNSPEC_VEC_VCDLGB))]
|
|
1636 "TARGET_VX && UINTVAL (operands[3]) != 2 && UINTVAL (operands[3]) <= 7"
|
|
1637 "vcdlgb\t%v0,%v1,%b2,%b3"
|
|
1638 [(set_attr "op_type" "VRR")])
|
|
1639
|
|
1640 ; The result needs to be multiplied with 2**-op2
|
|
1641 (define_expand "vec_ctd_u64"
|
|
1642 [(set (match_operand:V2DF 0 "register_operand" "")
|
|
1643 (unspec:V2DF [(match_operand:V2DI 1 "register_operand" "")
|
|
1644 (const_int 4) ; inexact suppressed
|
|
1645 (const_int VEC_RND_CURRENT)]
|
|
1646 UNSPEC_VEC_VCDLGB))
|
|
1647 (use (match_operand:QI 2 "const_int_operand" ""))
|
|
1648 (set (match_dup 0) (mult:V2DF (match_dup 0) (match_dup 3)))]
|
|
1649 "TARGET_VX"
|
|
1650 {
|
|
1651 REAL_VALUE_TYPE f;
|
|
1652 rtx c;
|
|
1653
|
|
1654 real_2expN (&f, -INTVAL (operands[2]), DFmode);
|
|
1655 c = const_double_from_real_value (f, DFmode);
|
|
1656
|
|
1657 operands[3] = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, c, c));
|
|
1658 operands[3] = force_reg (V2DFmode, operands[3]);
|
|
1659 })
|
|
1660
|
|
1661 (define_insn "vcgdb"
|
|
1662 [(set (match_operand:V2DI 0 "register_operand" "=v")
|
|
1663 (unspec:V2DI [(match_operand:V2DF 1 "register_operand" "v")
|
|
1664 (match_operand:QI 2 "const_mask_operand" "C")
|
|
1665 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1666 UNSPEC_VEC_VCGDB))]
|
|
1667 "TARGET_VX && UINTVAL (operands[3]) != 2 && UINTVAL (operands[3]) <= 7"
|
|
1668 "vcgdb\t%v0,%v1,%b2,%b3"
|
|
1669 [(set_attr "op_type" "VRR")])
|
|
1670
|
|
1671 ; The input needs to be multiplied with 2**op2
|
|
1672 (define_expand "vec_ctsl"
|
|
1673 [(use (match_operand:QI 2 "const_int_operand" ""))
|
|
1674 (set (match_dup 4) (mult:V2DF (match_operand:V2DF 1 "register_operand" "")
|
|
1675 (match_dup 3)))
|
|
1676 (set (match_operand:V2DI 0 "register_operand" "")
|
|
1677 (unspec:V2DI [(match_dup 4)
|
|
1678 (const_int 4) ; inexact suppressed
|
|
1679 (const_int VEC_RND_CURRENT)]
|
|
1680 UNSPEC_VEC_VCGDB))]
|
|
1681 "TARGET_VX"
|
|
1682 {
|
|
1683 REAL_VALUE_TYPE f;
|
|
1684 rtx c;
|
|
1685
|
|
1686 real_2expN (&f, INTVAL (operands[2]), DFmode);
|
|
1687 c = const_double_from_real_value (f, DFmode);
|
|
1688
|
|
1689 operands[3] = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, c, c));
|
|
1690 operands[3] = force_reg (V2DFmode, operands[3]);
|
|
1691 operands[4] = gen_reg_rtx (V2DFmode);
|
|
1692 })
|
|
1693
|
|
1694 (define_insn "vclgdb"
|
|
1695 [(set (match_operand:V2DI 0 "register_operand" "=v")
|
|
1696 (unspec:V2DI [(match_operand:V2DF 1 "register_operand" "v")
|
|
1697 (match_operand:QI 2 "const_mask_operand" "C")
|
|
1698 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1699 UNSPEC_VEC_VCLGDB))]
|
|
1700 "TARGET_VX && UINTVAL (operands[3]) != 2 && UINTVAL (operands[3]) <= 7"
|
|
1701 "vclgdb\t%v0,%v1,%b2,%b3"
|
|
1702 [(set_attr "op_type" "VRR")])
|
|
1703
|
|
1704 ; The input needs to be multiplied with 2**op2
|
|
1705 (define_expand "vec_ctul"
|
|
1706 [(use (match_operand:QI 2 "const_int_operand" ""))
|
|
1707 (set (match_dup 4) (mult:V2DF (match_operand:V2DF 1 "register_operand" "")
|
|
1708 (match_dup 3)))
|
|
1709 (set (match_operand:V2DI 0 "register_operand" "")
|
|
1710 (unspec:V2DI [(match_dup 4)
|
|
1711 (const_int 4) ; inexact suppressed
|
|
1712 (const_int VEC_RND_CURRENT)]
|
|
1713 UNSPEC_VEC_VCLGDB))]
|
|
1714 "TARGET_VX"
|
|
1715 {
|
|
1716 REAL_VALUE_TYPE f;
|
|
1717 rtx c;
|
|
1718
|
|
1719 real_2expN (&f, INTVAL (operands[2]), DFmode);
|
|
1720 c = const_double_from_real_value (f, DFmode);
|
|
1721
|
|
1722 operands[3] = gen_rtx_CONST_VECTOR (V2DFmode, gen_rtvec (2, c, c));
|
|
1723 operands[3] = force_reg (V2DFmode, operands[3]);
|
|
1724 operands[4] = gen_reg_rtx (V2DFmode);
|
|
1725 })
|
|
1726
|
|
1727 ; Vector load fp integer - IEEE inexact exception is suppressed
|
|
1728 ; vfisb, vfidb, wfisb, wfidb, wfixb
|
|
1729 (define_insn "vec_fpint<mode>"
|
|
1730 [(set (match_operand:VFT 0 "register_operand" "=v")
|
|
1731 (unspec:VFT [(match_operand:VFT 1 "register_operand" "v")
|
|
1732 (match_operand:QI 2 "const_mask_operand" "C") ; inexact suppression control
|
|
1733 (match_operand:QI 3 "const_mask_operand" "C")] ; rounding mode
|
|
1734 UNSPEC_VEC_VFI))]
|
|
1735 "TARGET_VX"
|
|
1736 "<vw>fi<sdx>b\t%v0,%v1,%b2,%b3"
|
|
1737 [(set_attr "op_type" "VRR")])
|
|
1738
|
|
1739
|
|
1740 ; Vector load lengthened - V4SF -> V2DF
|
|
1741
|
|
1742 (define_insn "vflls"
|
|
1743 [(set (match_operand:V2DF 0 "register_operand" "=v")
|
|
1744 (unspec:V2DF [(match_operand:V4SF 1 "register_operand" "v")]
|
|
1745 UNSPEC_VEC_VFLL))]
|
|
1746 "TARGET_VX"
|
|
1747 "vldeb\t%v0,%v1"
|
|
1748 [(set_attr "op_type" "VRR")])
|
|
1749
|
|
1750 (define_expand "vec_ld2f"
|
|
1751 [; Initialize a vector to all zeroes. FIXME: This should not be
|
|
1752 ; necessary since all elements of the vector will be set anyway.
|
|
1753 ; This is just to make it explicit to the data flow framework.
|
|
1754 (set (match_dup 2) (match_dup 3))
|
|
1755 (set (match_dup 2) (unspec:V4SF [(match_operand:SF 1 "memory_operand" "")
|
|
1756 (const_int 0)
|
|
1757 (match_dup 2)]
|
|
1758 UNSPEC_VEC_SET))
|
|
1759 (set (match_dup 2) (unspec:V4SF [(match_dup 4)
|
|
1760 (const_int 2)
|
|
1761 (match_dup 2)]
|
|
1762 UNSPEC_VEC_SET))
|
|
1763 (set (match_operand:V2DF 0 "register_operand" "")
|
|
1764 (unspec:V2DF [(match_dup 2)] UNSPEC_VEC_VFLL))]
|
|
1765 "TARGET_VX"
|
|
1766 {
|
|
1767 operands[2] = gen_reg_rtx (V4SFmode);
|
|
1768 operands[3] = CONST0_RTX (V4SFmode);
|
|
1769 operands[4] = adjust_address (operands[1], SFmode, 4);
|
|
1770 })
|
|
1771
|
|
1772
|
|
1773 ; Vector load rounded - V2DF -> V4SF
|
|
1774
|
|
1775 (define_insn "vflrd"
|
|
1776 [(set (match_operand:V4SF 0 "register_operand" "=v")
|
|
1777 (unspec:V4SF [(match_operand:V2DF 1 "register_operand" "v")
|
|
1778 (match_operand:QI 2 "const_mask_operand" "C")
|
|
1779 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
1780 UNSPEC_VEC_VFLR))]
|
|
1781 "TARGET_VX"
|
|
1782 "vledb\t%v0,%v1,%b2,%b3"
|
|
1783 [(set_attr "op_type" "VRR")])
|
|
1784
|
|
1785 (define_expand "vec_st2f"
|
|
1786 [(set (match_dup 2)
|
|
1787 (unspec:V4SF [(match_operand:V2DF 0 "register_operand" "")
|
|
1788 (const_int VEC_INEXACT)
|
|
1789 (const_int VEC_RND_CURRENT)]
|
|
1790 UNSPEC_VEC_VFLR))
|
|
1791 (set (match_operand:SF 1 "memory_operand" "")
|
|
1792 (unspec:SF [(match_dup 2) (const_int 0)] UNSPEC_VEC_EXTRACT))
|
|
1793 (set (match_dup 3)
|
|
1794 (unspec:SF [(match_dup 2) (const_int 2)] UNSPEC_VEC_EXTRACT))]
|
|
1795 "TARGET_VX"
|
|
1796 {
|
|
1797 operands[2] = gen_reg_rtx (V4SFmode);
|
|
1798 operands[3] = adjust_address (operands[1], SFmode, 4);
|
|
1799 })
|
|
1800
|
|
1801
|
|
1802 ; Vector square root fp vec_sqrt -> sqrt rtx standard name
|
|
1803
|
|
1804 ;; Vector FP test data class immediate
|
|
1805
|
|
1806 ; vec_all_nan, vec_all_numeric, vec_any_nan, vec_any_numeric
|
|
1807 ; These ignore the vector result and only want CC stored to an int
|
|
1808 ; pointer.
|
|
1809
|
|
1810 ; vftcisb, vftcidb
|
|
1811 (define_insn "*vftci<mode>_cconly"
|
|
1812 [(set (reg:CCRAW CC_REGNUM)
|
|
1813 (unspec:CCRAW [(match_operand:VECF_HW 1 "register_operand")
|
|
1814 (match_operand:HI 2 "const_int_operand")]
|
|
1815 UNSPEC_VEC_VFTCICC))
|
|
1816 (clobber (match_scratch:<tointvec> 0))]
|
|
1817 "TARGET_VX && CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'J', \"J\")"
|
|
1818 "vftci<sdx>b\t%v0,%v1,%x2"
|
|
1819 [(set_attr "op_type" "VRR")])
|
|
1820
|
|
1821 (define_expand "vftci<mode>_intcconly"
|
|
1822 [(parallel
|
|
1823 [(set (reg:CCRAW CC_REGNUM)
|
|
1824 (unspec:CCRAW [(match_operand:VECF_HW 0 "register_operand")
|
|
1825 (match_operand:HI 1 "const_int_operand")]
|
|
1826 UNSPEC_VEC_VFTCICC))
|
|
1827 (clobber (scratch:<tointvec>))])
|
|
1828 (set (match_operand:SI 2 "register_operand" "")
|
|
1829 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1830 "TARGET_VX && CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[1]), 'J', \"J\")")
|
|
1831
|
|
1832 ; vec_fp_test_data_class wants the result vector and the CC stored to
|
|
1833 ; an int pointer.
|
|
1834
|
|
1835 ; vftcisb, vftcidb
|
|
1836 (define_insn "*vftci<mode>"
|
|
1837 [(set (match_operand:VECF_HW 0 "register_operand" "=v")
|
|
1838 (unspec:VECF_HW [(match_operand:VECF_HW 1 "register_operand" "v")
|
|
1839 (match_operand:HI 2 "const_int_operand" "J")]
|
|
1840 UNSPEC_VEC_VFTCI))
|
|
1841 (set (reg:CCRAW CC_REGNUM)
|
|
1842 (unspec:CCRAW [(match_dup 1) (match_dup 2)] UNSPEC_VEC_VFTCICC))]
|
|
1843 "TARGET_VX && CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'J', \"J\")"
|
|
1844 "vftci<sdx>b\t%v0,%v1,%x2"
|
|
1845 [(set_attr "op_type" "VRR")])
|
|
1846
|
|
1847 (define_expand "vftci<mode>_intcc"
|
|
1848 [(parallel
|
|
1849 [(set (match_operand:VECF_HW 0 "register_operand")
|
|
1850 (unspec:VECF_HW [(match_operand:VECF_HW 1 "register_operand")
|
|
1851 (match_operand:HI 2 "const_int_operand")]
|
|
1852 UNSPEC_VEC_VFTCI))
|
|
1853 (set (reg:CCRAW CC_REGNUM)
|
|
1854 (unspec:CCRAW [(match_dup 1) (match_dup 2)] UNSPEC_VEC_VFTCICC))])
|
|
1855 (set (match_operand:SI 3 "memory_operand" "")
|
|
1856 (unspec:SI [(reg:CCRAW CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1857 "TARGET_VX && CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'J', \"J\")")
|
|
1858
|
|
1859 ;;
|
|
1860 ;; Integer compares
|
|
1861 ;;
|
|
1862
|
|
1863 ; All comparisons which produce a CC need fully populated (VI_HW)
|
|
1864 ; vector arguments. Otherwise the any/all CCs would be just bogus.
|
|
1865
|
|
1866 (define_insn "*vec_cmp<VICMP:insn_cmp><VI_HW:mode>_cconly"
|
|
1867 [(set (reg:VICMP CC_REGNUM)
|
|
1868 (compare:VICMP (match_operand:VI_HW 0 "register_operand" "v")
|
|
1869 (match_operand:VI_HW 1 "register_operand" "v")))
|
|
1870 (clobber (match_scratch:VI_HW 2 "=v"))]
|
|
1871 "TARGET_VX"
|
|
1872 "vc<VICMP:insn_cmp><VI_HW:bhfgq>s\t%v2,%v0,%v1"
|
|
1873 [(set_attr "op_type" "VRR")])
|
|
1874
|
|
1875 ; FIXME: The following 2x3 definitions should be merged into 2 with
|
|
1876 ; VICMP like above but I could not find a way to set the comparison
|
|
1877 ; operator (eq) depending on the mode CCVEQ (mode_iterator). Or the
|
|
1878 ; other way around - setting the mode depending on the code
|
|
1879 ; (code_iterator).
|
|
1880 (define_expand "vec_cmpeq<VI_HW:mode>_cc"
|
|
1881 [(parallel
|
|
1882 [(set (reg:CCVEQ CC_REGNUM)
|
|
1883 (compare:CCVEQ (match_operand:VI_HW 1 "register_operand" "v")
|
|
1884 (match_operand:VI_HW 2 "register_operand" "v")))
|
|
1885 (set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
1886 (eq:VI_HW (match_dup 1) (match_dup 2)))])
|
|
1887 (set (match_operand:SI 3 "memory_operand" "")
|
|
1888 (unspec:SI [(reg:CCVEQ CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1889 "TARGET_VX")
|
|
1890
|
|
1891 (define_expand "vec_cmph<VI_HW:mode>_cc"
|
|
1892 [(parallel
|
|
1893 [(set (reg:CCVIH CC_REGNUM)
|
|
1894 (compare:CCVIH (match_operand:VI_HW 1 "register_operand" "v")
|
|
1895 (match_operand:VI_HW 2 "register_operand" "v")))
|
|
1896 (set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
1897 (gt:VI_HW (match_dup 1) (match_dup 2)))])
|
|
1898 (set (match_operand:SI 3 "memory_operand" "")
|
|
1899 (unspec:SI [(reg:CCVIH CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1900 "TARGET_VX")
|
|
1901
|
|
1902 (define_expand "vec_cmphl<VI_HW:mode>_cc"
|
|
1903 [(parallel
|
|
1904 [(set (reg:CCVIHU CC_REGNUM)
|
|
1905 (compare:CCVIHU (match_operand:VI_HW 1 "register_operand" "v")
|
|
1906 (match_operand:VI_HW 2 "register_operand" "v")))
|
|
1907 (set (match_operand:VI_HW 0 "register_operand" "=v")
|
|
1908 (gtu:VI_HW (match_dup 1) (match_dup 2)))])
|
|
1909 (set (match_operand:SI 3 "memory_operand" "")
|
|
1910 (unspec:SI [(reg:CCVIHU CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1911 "TARGET_VX")
|
|
1912
|
|
1913
|
|
1914 (define_insn "*vec_cmpeq<VI_HW:mode>_cc"
|
|
1915 [(set (reg:CCVEQ CC_REGNUM)
|
|
1916 (compare:CCVEQ (match_operand:VI_HW 0 "register_operand" "v")
|
|
1917 (match_operand:VI_HW 1 "register_operand" "v")))
|
|
1918 (set (match_operand:VI_HW 2 "register_operand" "=v")
|
|
1919 (eq:VI_HW (match_dup 0) (match_dup 1)))]
|
|
1920 "TARGET_VX"
|
|
1921 "vceq<VI_HW:bhfgq>s\t%v2,%v0,%v1"
|
|
1922 [(set_attr "op_type" "VRR")])
|
|
1923
|
|
1924 (define_insn "*vec_cmph<VI_HW:mode>_cc"
|
|
1925 [(set (reg:CCVIH CC_REGNUM)
|
|
1926 (compare:CCVIH (match_operand:VI_HW 0 "register_operand" "v")
|
|
1927 (match_operand:VI_HW 1 "register_operand" "v")))
|
|
1928 (set (match_operand:VI_HW 2 "register_operand" "=v")
|
|
1929 (gt:VI_HW (match_dup 0) (match_dup 1)))]
|
|
1930 "TARGET_VX"
|
|
1931 "vch<VI_HW:bhfgq>s\t%v2,%v0,%v1"
|
|
1932 [(set_attr "op_type" "VRR")])
|
|
1933
|
|
1934 (define_insn "*vec_cmphl<VI_HW:mode>_cc"
|
|
1935 [(set (reg:CCVIHU CC_REGNUM)
|
|
1936 (compare:CCVIHU (match_operand:VI_HW 0 "register_operand" "v")
|
|
1937 (match_operand:VI_HW 1 "register_operand" "v")))
|
|
1938 (set (match_operand:VI_HW 2 "register_operand" "=v")
|
|
1939 (gtu:VI_HW (match_dup 0) (match_dup 1)))]
|
|
1940 "TARGET_VX"
|
|
1941 "vchl<VI_HW:bhfgq>s\t%v2,%v0,%v1"
|
|
1942 [(set_attr "op_type" "VRR")])
|
|
1943
|
|
1944 ;;
|
|
1945 ;; Floating point compares
|
|
1946 ;;
|
|
1947
|
|
1948 ; vfcesbs, vfcedbs, wfcexbs, vfchsbs, vfchdbs, wfchxbs, vfchesbs, vfchedbs, wfchexbs
|
|
1949 (define_insn "*vec_cmp<insn_cmp><mode>_cconly"
|
|
1950 [(set (reg:VFCMP CC_REGNUM)
|
|
1951 (compare:VFCMP (match_operand:VF_HW 0 "register_operand" "v")
|
|
1952 (match_operand:VF_HW 1 "register_operand" "v")))
|
|
1953 (clobber (match_scratch:<tointvec> 2 "=v"))]
|
|
1954 "TARGET_VX"
|
|
1955 "<vw>fc<asm_fcmp><sdx>bs\t%v2,%v0,%v1"
|
|
1956 [(set_attr "op_type" "VRR")])
|
|
1957
|
|
1958 ; FIXME: Merge the following 2x3 patterns with VFCMP
|
|
1959 (define_expand "vec_cmpeq<mode>_cc"
|
|
1960 [(parallel
|
|
1961 [(set (reg:CCVEQ CC_REGNUM)
|
|
1962 (compare:CCVEQ (match_operand:VF_HW 1 "register_operand" "v")
|
|
1963 (match_operand:VF_HW 2 "register_operand" "v")))
|
|
1964 (set (match_operand:<tointvec> 0 "register_operand" "=v")
|
|
1965 (eq:<tointvec> (match_dup 1) (match_dup 2)))])
|
|
1966 (set (match_operand:SI 3 "memory_operand" "")
|
|
1967 (unspec:SI [(reg:CCVEQ CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1968 "TARGET_VX")
|
|
1969
|
|
1970 (define_expand "vec_cmph<mode>_cc"
|
|
1971 [(parallel
|
|
1972 [(set (reg:CCVFH CC_REGNUM)
|
|
1973 (compare:CCVFH (match_operand:VF_HW 1 "register_operand" "v")
|
|
1974 (match_operand:VF_HW 2 "register_operand" "v")))
|
|
1975 (set (match_operand:<tointvec> 0 "register_operand" "=v")
|
|
1976 (gt:<tointvec> (match_dup 1) (match_dup 2)))])
|
|
1977 (set (match_operand:SI 3 "memory_operand" "")
|
|
1978 (unspec:SI [(reg:CCVIH CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1979 "TARGET_VX")
|
|
1980
|
|
1981 (define_expand "vec_cmphe<mode>_cc"
|
|
1982 [(parallel
|
|
1983 [(set (reg:CCVFHE CC_REGNUM)
|
|
1984 (compare:CCVFHE (match_operand:VF_HW 1 "register_operand" "v")
|
|
1985 (match_operand:VF_HW 2 "register_operand" "v")))
|
|
1986 (set (match_operand:<tointvec> 0 "register_operand" "=v")
|
|
1987 (ge:<tointvec> (match_dup 1) (match_dup 2)))])
|
|
1988 (set (match_operand:SI 3 "memory_operand" "")
|
|
1989 (unspec:SI [(reg:CCVFHE CC_REGNUM)] UNSPEC_CC_TO_INT))]
|
|
1990 "TARGET_VX")
|
|
1991
|
|
1992 ; These 3 cannot be merged as the insn defintion above since it also
|
|
1993 ; requires to rewrite the RTL equality operator that the same time as
|
|
1994 ; the CC mode.
|
|
1995
|
|
1996 ; vfcesbs, vfcedbs, wfcexbs
|
|
1997 (define_insn "*vec_cmpeq<mode>_cc"
|
|
1998 [(set (reg:CCVEQ CC_REGNUM)
|
|
1999 (compare:CCVEQ (match_operand:VF_HW 0 "register_operand" "v")
|
|
2000 (match_operand:VF_HW 1 "register_operand" "v")))
|
|
2001 (set (match_operand:<tointvec> 2 "register_operand" "=v")
|
|
2002 (eq:<tointvec> (match_dup 0) (match_dup 1)))]
|
|
2003 "TARGET_VX"
|
|
2004 "<vw>fce<sdx>bs\t%v2,%v0,%v1"
|
|
2005 [(set_attr "op_type" "VRR")])
|
|
2006
|
|
2007 ; vfchsbs, vfchdbs, wfchxbs
|
|
2008 (define_insn "*vec_cmph<mode>_cc"
|
|
2009 [(set (reg:CCVFH CC_REGNUM)
|
|
2010 (compare:CCVFH (match_operand:VF_HW 0 "register_operand" "v")
|
|
2011 (match_operand:VF_HW 1 "register_operand" "v")))
|
|
2012 (set (match_operand:<tointvec> 2 "register_operand" "=v")
|
|
2013 (gt:<tointvec> (match_dup 0) (match_dup 1)))]
|
|
2014 "TARGET_VX"
|
|
2015 "<vw>fch<sdx>bs\t%v2,%v0,%v1"
|
|
2016 [(set_attr "op_type" "VRR")])
|
|
2017
|
|
2018 ; vfchesbs, vfchedbs, wfchexbs
|
|
2019 (define_insn "*vec_cmphe<mode>_cc"
|
|
2020 [(set (reg:CCVFHE CC_REGNUM)
|
|
2021 (compare:CCVFHE (match_operand:VF_HW 0 "register_operand" "v")
|
|
2022 (match_operand:VF_HW 1 "register_operand" "v")))
|
|
2023 (set (match_operand:<tointvec> 2 "register_operand" "=v")
|
|
2024 (ge:<tointvec> (match_dup 0) (match_dup 1)))]
|
|
2025 "TARGET_VX"
|
|
2026 "<vw>fche<sdx>bs\t%v2,%v0,%v1"
|
|
2027 [(set_attr "op_type" "VRR")])
|
|
2028
|
|
2029 (define_expand "vec_double_s64"
|
|
2030 [(set (match_operand:V2DF 0 "register_operand")
|
|
2031 (unspec:V2DF [(match_operand:V2DI 1 "register_operand")
|
|
2032 (const_int 0) ; inexact suppression disabled
|
|
2033 (const_int VEC_RND_CURRENT)]
|
|
2034 UNSPEC_VEC_VCDGB))]
|
|
2035 "TARGET_VX")
|
|
2036
|
|
2037 (define_expand "vec_double_u64"
|
|
2038 [(set (match_operand:V2DF 0 "register_operand")
|
|
2039 (unspec:V2DF [(match_operand:V2DI 1 "register_operand")
|
|
2040 (const_int 0) ; inexact suppression disabled
|
|
2041 (const_int VEC_RND_CURRENT)]
|
|
2042 UNSPEC_VEC_VCDLGB))]
|
|
2043 "TARGET_VX")
|
|
2044
|
|
2045
|
|
2046 (define_insn "vfmin<mode>"
|
|
2047 [(set (match_operand:VF_HW 0 "register_operand" "=v")
|
|
2048 (unspec:VF_HW [(match_operand:VF_HW 1 "register_operand" "%v")
|
|
2049 (match_operand:VF_HW 2 "register_operand" "v")
|
|
2050 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
2051 UNSPEC_VEC_VFMIN))]
|
|
2052 "TARGET_VXE"
|
|
2053 "<vw>fmin<sdx>b\t%v0,%v1,%v2,%b3"
|
|
2054 [(set_attr "op_type" "VRR")])
|
|
2055
|
|
2056 (define_insn "vfmax<mode>"
|
|
2057 [(set (match_operand:VF_HW 0 "register_operand" "=v")
|
|
2058 (unspec:VF_HW [(match_operand:VF_HW 1 "register_operand" "%v")
|
|
2059 (match_operand:VF_HW 2 "register_operand" "v")
|
|
2060 (match_operand:QI 3 "const_mask_operand" "C")]
|
|
2061 UNSPEC_VEC_VFMAX))]
|
|
2062 "TARGET_VXE"
|
|
2063 "<vw>fmax<sdx>b\t%v0,%v1,%v2,%b3"
|
|
2064 [(set_attr "op_type" "VRR")])
|