annotate gcc/config/s390/vx-builtins.md @ 111:04ced10e8804

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