annotate gcc/config/powerpcspe/altivec.md @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ;; AltiVec patterns.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 ;; Copyright (C) 2002-2018 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 ;; Contributed by Aldy Hernandez (aldy@quesejoda.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
kono
parents:
diff changeset
8 ;; under the terms of the GNU General Public License as published
kono
parents:
diff changeset
9 ;; by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
10 ;; option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
15 ;; License 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 (define_c_enum "unspec"
kono
parents:
diff changeset
22 [UNSPEC_VCMPBFP
kono
parents:
diff changeset
23 UNSPEC_VMSUMU
kono
parents:
diff changeset
24 UNSPEC_VMSUMM
kono
parents:
diff changeset
25 UNSPEC_VMSUMSHM
kono
parents:
diff changeset
26 UNSPEC_VMSUMUHS
kono
parents:
diff changeset
27 UNSPEC_VMSUMSHS
kono
parents:
diff changeset
28 UNSPEC_VMHADDSHS
kono
parents:
diff changeset
29 UNSPEC_VMHRADDSHS
kono
parents:
diff changeset
30 UNSPEC_VADDCUW
kono
parents:
diff changeset
31 UNSPEC_VADDU
kono
parents:
diff changeset
32 UNSPEC_VADDS
kono
parents:
diff changeset
33 UNSPEC_VAVGU
kono
parents:
diff changeset
34 UNSPEC_VAVGS
kono
parents:
diff changeset
35 UNSPEC_VMULEUB
kono
parents:
diff changeset
36 UNSPEC_VMULESB
kono
parents:
diff changeset
37 UNSPEC_VMULEUH
kono
parents:
diff changeset
38 UNSPEC_VMULESH
kono
parents:
diff changeset
39 UNSPEC_VMULOUB
kono
parents:
diff changeset
40 UNSPEC_VMULOSB
kono
parents:
diff changeset
41 UNSPEC_VMULOUH
kono
parents:
diff changeset
42 UNSPEC_VMULOSH
kono
parents:
diff changeset
43 UNSPEC_VPKPX
kono
parents:
diff changeset
44 UNSPEC_VPACK_SIGN_SIGN_SAT
kono
parents:
diff changeset
45 UNSPEC_VPACK_SIGN_UNS_SAT
kono
parents:
diff changeset
46 UNSPEC_VPACK_UNS_UNS_SAT
kono
parents:
diff changeset
47 UNSPEC_VPACK_UNS_UNS_MOD
kono
parents:
diff changeset
48 UNSPEC_VPACK_UNS_UNS_MOD_DIRECT
kono
parents:
diff changeset
49 UNSPEC_VSLV4SI
kono
parents:
diff changeset
50 UNSPEC_VSLO
kono
parents:
diff changeset
51 UNSPEC_VSR
kono
parents:
diff changeset
52 UNSPEC_VSRO
kono
parents:
diff changeset
53 UNSPEC_VSUBCUW
kono
parents:
diff changeset
54 UNSPEC_VSUBU
kono
parents:
diff changeset
55 UNSPEC_VSUBS
kono
parents:
diff changeset
56 UNSPEC_VSUM4UBS
kono
parents:
diff changeset
57 UNSPEC_VSUM4S
kono
parents:
diff changeset
58 UNSPEC_VSUM2SWS
kono
parents:
diff changeset
59 UNSPEC_VSUMSWS
kono
parents:
diff changeset
60 UNSPEC_VPERM
kono
parents:
diff changeset
61 UNSPEC_VPERMR
kono
parents:
diff changeset
62 UNSPEC_VPERM_UNS
kono
parents:
diff changeset
63 UNSPEC_VRFIN
kono
parents:
diff changeset
64 UNSPEC_VCFUX
kono
parents:
diff changeset
65 UNSPEC_VCFSX
kono
parents:
diff changeset
66 UNSPEC_VCTUXS
kono
parents:
diff changeset
67 UNSPEC_VCTSXS
kono
parents:
diff changeset
68 UNSPEC_VLOGEFP
kono
parents:
diff changeset
69 UNSPEC_VEXPTEFP
kono
parents:
diff changeset
70 UNSPEC_VSLDOI
kono
parents:
diff changeset
71 UNSPEC_VUNPACK_HI_SIGN
kono
parents:
diff changeset
72 UNSPEC_VUNPACK_LO_SIGN
kono
parents:
diff changeset
73 UNSPEC_VUNPACK_HI_SIGN_DIRECT
kono
parents:
diff changeset
74 UNSPEC_VUNPACK_LO_SIGN_DIRECT
kono
parents:
diff changeset
75 UNSPEC_VUPKHPX
kono
parents:
diff changeset
76 UNSPEC_VUPKLPX
kono
parents:
diff changeset
77 UNSPEC_DARN
kono
parents:
diff changeset
78 UNSPEC_DARN_32
kono
parents:
diff changeset
79 UNSPEC_DARN_RAW
kono
parents:
diff changeset
80 UNSPEC_DST
kono
parents:
diff changeset
81 UNSPEC_DSTT
kono
parents:
diff changeset
82 UNSPEC_DSTST
kono
parents:
diff changeset
83 UNSPEC_DSTSTT
kono
parents:
diff changeset
84 UNSPEC_LVSL
kono
parents:
diff changeset
85 UNSPEC_LVSR
kono
parents:
diff changeset
86 UNSPEC_LVE
kono
parents:
diff changeset
87 UNSPEC_STVX
kono
parents:
diff changeset
88 UNSPEC_STVXL
kono
parents:
diff changeset
89 UNSPEC_STVE
kono
parents:
diff changeset
90 UNSPEC_SET_VSCR
kono
parents:
diff changeset
91 UNSPEC_GET_VRSAVE
kono
parents:
diff changeset
92 UNSPEC_LVX
kono
parents:
diff changeset
93 UNSPEC_REDUC_PLUS
kono
parents:
diff changeset
94 UNSPEC_VECSH
kono
parents:
diff changeset
95 UNSPEC_EXTEVEN_V4SI
kono
parents:
diff changeset
96 UNSPEC_EXTEVEN_V8HI
kono
parents:
diff changeset
97 UNSPEC_EXTEVEN_V16QI
kono
parents:
diff changeset
98 UNSPEC_EXTEVEN_V4SF
kono
parents:
diff changeset
99 UNSPEC_EXTODD_V4SI
kono
parents:
diff changeset
100 UNSPEC_EXTODD_V8HI
kono
parents:
diff changeset
101 UNSPEC_EXTODD_V16QI
kono
parents:
diff changeset
102 UNSPEC_EXTODD_V4SF
kono
parents:
diff changeset
103 UNSPEC_INTERHI_V4SI
kono
parents:
diff changeset
104 UNSPEC_INTERHI_V8HI
kono
parents:
diff changeset
105 UNSPEC_INTERHI_V16QI
kono
parents:
diff changeset
106 UNSPEC_INTERLO_V4SI
kono
parents:
diff changeset
107 UNSPEC_INTERLO_V8HI
kono
parents:
diff changeset
108 UNSPEC_INTERLO_V16QI
kono
parents:
diff changeset
109 UNSPEC_LVLX
kono
parents:
diff changeset
110 UNSPEC_LVLXL
kono
parents:
diff changeset
111 UNSPEC_LVRX
kono
parents:
diff changeset
112 UNSPEC_LVRXL
kono
parents:
diff changeset
113 UNSPEC_STVLX
kono
parents:
diff changeset
114 UNSPEC_STVLXL
kono
parents:
diff changeset
115 UNSPEC_STVRX
kono
parents:
diff changeset
116 UNSPEC_STVRXL
kono
parents:
diff changeset
117 UNSPEC_VADU
kono
parents:
diff changeset
118 UNSPEC_VSLV
kono
parents:
diff changeset
119 UNSPEC_VSRV
kono
parents:
diff changeset
120 UNSPEC_VMULWHUB
kono
parents:
diff changeset
121 UNSPEC_VMULWLUB
kono
parents:
diff changeset
122 UNSPEC_VMULWHSB
kono
parents:
diff changeset
123 UNSPEC_VMULWLSB
kono
parents:
diff changeset
124 UNSPEC_VMULWHUH
kono
parents:
diff changeset
125 UNSPEC_VMULWLUH
kono
parents:
diff changeset
126 UNSPEC_VMULWHSH
kono
parents:
diff changeset
127 UNSPEC_VMULWLSH
kono
parents:
diff changeset
128 UNSPEC_VUPKHUB
kono
parents:
diff changeset
129 UNSPEC_VUPKHUH
kono
parents:
diff changeset
130 UNSPEC_VUPKLUB
kono
parents:
diff changeset
131 UNSPEC_VUPKLUH
kono
parents:
diff changeset
132 UNSPEC_VPERMSI
kono
parents:
diff changeset
133 UNSPEC_VPERMHI
kono
parents:
diff changeset
134 UNSPEC_INTERHI
kono
parents:
diff changeset
135 UNSPEC_INTERLO
kono
parents:
diff changeset
136 UNSPEC_VUPKHS_V4SF
kono
parents:
diff changeset
137 UNSPEC_VUPKLS_V4SF
kono
parents:
diff changeset
138 UNSPEC_VUPKHU_V4SF
kono
parents:
diff changeset
139 UNSPEC_VUPKLU_V4SF
kono
parents:
diff changeset
140 UNSPEC_VGBBD
kono
parents:
diff changeset
141 UNSPEC_VMRGH_DIRECT
kono
parents:
diff changeset
142 UNSPEC_VMRGL_DIRECT
kono
parents:
diff changeset
143 UNSPEC_VSPLT_DIRECT
kono
parents:
diff changeset
144 UNSPEC_VMRGEW_DIRECT
kono
parents:
diff changeset
145 UNSPEC_VSUMSWS_DIRECT
kono
parents:
diff changeset
146 UNSPEC_VADDCUQ
kono
parents:
diff changeset
147 UNSPEC_VADDEUQM
kono
parents:
diff changeset
148 UNSPEC_VADDECUQ
kono
parents:
diff changeset
149 UNSPEC_VSUBCUQ
kono
parents:
diff changeset
150 UNSPEC_VSUBEUQM
kono
parents:
diff changeset
151 UNSPEC_VSUBECUQ
kono
parents:
diff changeset
152 UNSPEC_VBPERMQ
kono
parents:
diff changeset
153 UNSPEC_VBPERMD
kono
parents:
diff changeset
154 UNSPEC_BCDADD
kono
parents:
diff changeset
155 UNSPEC_BCDSUB
kono
parents:
diff changeset
156 UNSPEC_BCD_OVERFLOW
kono
parents:
diff changeset
157 UNSPEC_CMPRB
kono
parents:
diff changeset
158 UNSPEC_CMPRB2
kono
parents:
diff changeset
159 UNSPEC_CMPEQB
kono
parents:
diff changeset
160 UNSPEC_VRLMI
kono
parents:
diff changeset
161 UNSPEC_VRLNM
kono
parents:
diff changeset
162 ])
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 (define_c_enum "unspecv"
kono
parents:
diff changeset
165 [UNSPECV_SET_VRSAVE
kono
parents:
diff changeset
166 UNSPECV_MTVSCR
kono
parents:
diff changeset
167 UNSPECV_MFVSCR
kono
parents:
diff changeset
168 UNSPECV_DSSALL
kono
parents:
diff changeset
169 UNSPECV_DSS
kono
parents:
diff changeset
170 ])
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 ;; Like VI, defined in vector.md, but add ISA 2.07 integer vector ops
kono
parents:
diff changeset
173 (define_mode_iterator VI2 [V4SI V8HI V16QI V2DI])
kono
parents:
diff changeset
174 ;; Short vec int modes
kono
parents:
diff changeset
175 (define_mode_iterator VIshort [V8HI V16QI])
kono
parents:
diff changeset
176 ;; Longer vec int modes for rotate/mask ops
kono
parents:
diff changeset
177 (define_mode_iterator VIlong [V2DI V4SI])
kono
parents:
diff changeset
178 ;; Vec float modes
kono
parents:
diff changeset
179 (define_mode_iterator VF [V4SF])
kono
parents:
diff changeset
180 ;; Vec modes, pity mode iterators are not composable
kono
parents:
diff changeset
181 (define_mode_iterator V [V4SI V8HI V16QI V4SF])
kono
parents:
diff changeset
182 ;; Vec modes for move/logical/permute ops, include vector types for move not
kono
parents:
diff changeset
183 ;; otherwise handled by altivec (v2df, v2di, ti)
kono
parents:
diff changeset
184 (define_mode_iterator VM [V4SI
kono
parents:
diff changeset
185 V8HI
kono
parents:
diff changeset
186 V16QI
kono
parents:
diff changeset
187 V4SF
kono
parents:
diff changeset
188 V2DF
kono
parents:
diff changeset
189 V2DI
kono
parents:
diff changeset
190 V1TI
kono
parents:
diff changeset
191 TI
kono
parents:
diff changeset
192 (KF "FLOAT128_VECTOR_P (KFmode)")
kono
parents:
diff changeset
193 (TF "FLOAT128_VECTOR_P (TFmode)")])
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 ;; Like VM, except don't do TImode
kono
parents:
diff changeset
196 (define_mode_iterator VM2 [V4SI
kono
parents:
diff changeset
197 V8HI
kono
parents:
diff changeset
198 V16QI
kono
parents:
diff changeset
199 V4SF
kono
parents:
diff changeset
200 V2DF
kono
parents:
diff changeset
201 V2DI
kono
parents:
diff changeset
202 V1TI
kono
parents:
diff changeset
203 (KF "FLOAT128_VECTOR_P (KFmode)")
kono
parents:
diff changeset
204 (TF "FLOAT128_VECTOR_P (TFmode)")])
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 ;; Specific iterator for parity which does not have a byte/half-word form, but
kono
parents:
diff changeset
207 ;; does have a quad word form
kono
parents:
diff changeset
208 (define_mode_iterator VParity [V4SI
kono
parents:
diff changeset
209 V2DI
kono
parents:
diff changeset
210 V1TI
kono
parents:
diff changeset
211 (TI "TARGET_VSX_TIMODE")])
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 (define_mode_attr VI_char [(V2DI "d") (V4SI "w") (V8HI "h") (V16QI "b")])
kono
parents:
diff changeset
214 (define_mode_attr VI_scalar [(V2DI "DI") (V4SI "SI") (V8HI "HI") (V16QI "QI")])
kono
parents:
diff changeset
215 (define_mode_attr VI_unit [(V16QI "VECTOR_UNIT_ALTIVEC_P (V16QImode)")
kono
parents:
diff changeset
216 (V8HI "VECTOR_UNIT_ALTIVEC_P (V8HImode)")
kono
parents:
diff changeset
217 (V4SI "VECTOR_UNIT_ALTIVEC_P (V4SImode)")
kono
parents:
diff changeset
218 (V2DI "VECTOR_UNIT_P8_VECTOR_P (V2DImode)")
kono
parents:
diff changeset
219 (V1TI "VECTOR_UNIT_ALTIVEC_P (V1TImode)")])
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 ;; Vector pack/unpack
kono
parents:
diff changeset
222 (define_mode_iterator VP [V2DI V4SI V8HI])
kono
parents:
diff changeset
223 (define_mode_attr VP_small [(V2DI "V4SI") (V4SI "V8HI") (V8HI "V16QI")])
kono
parents:
diff changeset
224 (define_mode_attr VP_small_lc [(V2DI "v4si") (V4SI "v8hi") (V8HI "v16qi")])
kono
parents:
diff changeset
225 (define_mode_attr VU_char [(V2DI "w") (V4SI "h") (V8HI "b")])
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 ;; Vector negate
kono
parents:
diff changeset
228 (define_mode_iterator VNEG [V4SI V2DI])
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 ;; Vector move instructions.
kono
parents:
diff changeset
231 (define_insn "*altivec_mov<mode>"
kono
parents:
diff changeset
232 [(set (match_operand:VM2 0 "nonimmediate_operand" "=Z,v,v,?Y,?*r,?*r,v,v,?*r")
kono
parents:
diff changeset
233 (match_operand:VM2 1 "input_operand" "v,Z,v,*r,Y,*r,j,W,W"))]
kono
parents:
diff changeset
234 "VECTOR_MEM_ALTIVEC_P (<MODE>mode)
kono
parents:
diff changeset
235 && (register_operand (operands[0], <MODE>mode)
kono
parents:
diff changeset
236 || register_operand (operands[1], <MODE>mode))"
kono
parents:
diff changeset
237 {
kono
parents:
diff changeset
238 switch (which_alternative)
kono
parents:
diff changeset
239 {
kono
parents:
diff changeset
240 case 0: return "stvx %1,%y0";
kono
parents:
diff changeset
241 case 1: return "lvx %0,%y1";
kono
parents:
diff changeset
242 case 2: return "vor %0,%1,%1";
kono
parents:
diff changeset
243 case 3: return "#";
kono
parents:
diff changeset
244 case 4: return "#";
kono
parents:
diff changeset
245 case 5: return "#";
kono
parents:
diff changeset
246 case 6: return "vxor %0,%0,%0";
kono
parents:
diff changeset
247 case 7: return output_vec_const_move (operands);
kono
parents:
diff changeset
248 case 8: return "#";
kono
parents:
diff changeset
249 default: gcc_unreachable ();
kono
parents:
diff changeset
250 }
kono
parents:
diff changeset
251 }
kono
parents:
diff changeset
252 [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*,*")
kono
parents:
diff changeset
253 (set_attr "length" "4,4,4,20,20,20,4,8,32")])
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 ;; Unlike other altivec moves, allow the GPRs, since a normal use of TImode
kono
parents:
diff changeset
256 ;; is for unions. However for plain data movement, slightly favor the vector
kono
parents:
diff changeset
257 ;; loads
kono
parents:
diff changeset
258 (define_insn "*altivec_movti"
kono
parents:
diff changeset
259 [(set (match_operand:TI 0 "nonimmediate_operand" "=Z,v,v,?Y,?r,?r,v,v")
kono
parents:
diff changeset
260 (match_operand:TI 1 "input_operand" "v,Z,v,r,Y,r,j,W"))]
kono
parents:
diff changeset
261 "VECTOR_MEM_ALTIVEC_P (TImode)
kono
parents:
diff changeset
262 && (register_operand (operands[0], TImode)
kono
parents:
diff changeset
263 || register_operand (operands[1], TImode))"
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 switch (which_alternative)
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 case 0: return "stvx %1,%y0";
kono
parents:
diff changeset
268 case 1: return "lvx %0,%y1";
kono
parents:
diff changeset
269 case 2: return "vor %0,%1,%1";
kono
parents:
diff changeset
270 case 3: return "#";
kono
parents:
diff changeset
271 case 4: return "#";
kono
parents:
diff changeset
272 case 5: return "#";
kono
parents:
diff changeset
273 case 6: return "vxor %0,%0,%0";
kono
parents:
diff changeset
274 case 7: return output_vec_const_move (operands);
kono
parents:
diff changeset
275 default: gcc_unreachable ();
kono
parents:
diff changeset
276 }
kono
parents:
diff changeset
277 }
kono
parents:
diff changeset
278 [(set_attr "type" "vecstore,vecload,veclogical,store,load,*,veclogical,*")])
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 ;; Load up a vector with the most significant bit set by loading up -1 and
kono
parents:
diff changeset
281 ;; doing a shift left
kono
parents:
diff changeset
282 (define_split
kono
parents:
diff changeset
283 [(set (match_operand:VM 0 "altivec_register_operand" "")
kono
parents:
diff changeset
284 (match_operand:VM 1 "easy_vector_constant_msb" ""))]
kono
parents:
diff changeset
285 "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode) && reload_completed"
kono
parents:
diff changeset
286 [(const_int 0)]
kono
parents:
diff changeset
287 {
kono
parents:
diff changeset
288 rtx dest = operands[0];
kono
parents:
diff changeset
289 machine_mode mode = GET_MODE (operands[0]);
kono
parents:
diff changeset
290 rtvec v;
kono
parents:
diff changeset
291 int i, num_elements;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 if (mode == V4SFmode)
kono
parents:
diff changeset
294 {
kono
parents:
diff changeset
295 mode = V4SImode;
kono
parents:
diff changeset
296 dest = gen_lowpart (V4SImode, dest);
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 num_elements = GET_MODE_NUNITS (mode);
kono
parents:
diff changeset
300 v = rtvec_alloc (num_elements);
kono
parents:
diff changeset
301 for (i = 0; i < num_elements; i++)
kono
parents:
diff changeset
302 RTVEC_ELT (v, i) = constm1_rtx;
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 emit_insn (gen_vec_initv4sisi (dest, gen_rtx_PARALLEL (mode, v)));
kono
parents:
diff changeset
305 emit_insn (gen_rtx_SET (dest, gen_rtx_ASHIFT (mode, dest, dest)));
kono
parents:
diff changeset
306 DONE;
kono
parents:
diff changeset
307 })
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 (define_split
kono
parents:
diff changeset
310 [(set (match_operand:VM 0 "altivec_register_operand" "")
kono
parents:
diff changeset
311 (match_operand:VM 1 "easy_vector_constant_add_self" ""))]
kono
parents:
diff changeset
312 "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode) && reload_completed"
kono
parents:
diff changeset
313 [(set (match_dup 0) (match_dup 3))
kono
parents:
diff changeset
314 (set (match_dup 0) (match_dup 4))]
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 rtx dup = gen_easy_altivec_constant (operands[1]);
kono
parents:
diff changeset
317 rtx const_vec;
kono
parents:
diff changeset
318 machine_mode op_mode = <MODE>mode;
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 /* Divide the operand of the resulting VEC_DUPLICATE, and use
kono
parents:
diff changeset
321 simplify_rtx to make a CONST_VECTOR. */
kono
parents:
diff changeset
322 XEXP (dup, 0) = simplify_const_binary_operation (ASHIFTRT, QImode,
kono
parents:
diff changeset
323 XEXP (dup, 0), const1_rtx);
kono
parents:
diff changeset
324 const_vec = simplify_rtx (dup);
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 if (op_mode == V4SFmode)
kono
parents:
diff changeset
327 {
kono
parents:
diff changeset
328 op_mode = V4SImode;
kono
parents:
diff changeset
329 operands[0] = gen_lowpart (op_mode, operands[0]);
kono
parents:
diff changeset
330 }
kono
parents:
diff changeset
331 if (GET_MODE (const_vec) == op_mode)
kono
parents:
diff changeset
332 operands[3] = const_vec;
kono
parents:
diff changeset
333 else
kono
parents:
diff changeset
334 operands[3] = gen_lowpart (op_mode, const_vec);
kono
parents:
diff changeset
335 operands[4] = gen_rtx_PLUS (op_mode, operands[0], operands[0]);
kono
parents:
diff changeset
336 })
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 (define_split
kono
parents:
diff changeset
339 [(set (match_operand:VM 0 "altivec_register_operand" "")
kono
parents:
diff changeset
340 (match_operand:VM 1 "easy_vector_constant_vsldoi" ""))]
kono
parents:
diff changeset
341 "VECTOR_UNIT_ALTIVEC_OR_VSX_P (<MODE>mode) && can_create_pseudo_p ()"
kono
parents:
diff changeset
342 [(set (match_dup 2) (match_dup 3))
kono
parents:
diff changeset
343 (set (match_dup 4) (match_dup 5))
kono
parents:
diff changeset
344 (set (match_dup 0)
kono
parents:
diff changeset
345 (unspec:VM [(match_dup 2)
kono
parents:
diff changeset
346 (match_dup 4)
kono
parents:
diff changeset
347 (match_dup 6)]
kono
parents:
diff changeset
348 UNSPEC_VSLDOI))]
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 rtx op1 = operands[1];
kono
parents:
diff changeset
351 int elt = (BYTES_BIG_ENDIAN) ? 0 : GET_MODE_NUNITS (<MODE>mode) - 1;
kono
parents:
diff changeset
352 HOST_WIDE_INT val = const_vector_elt_as_int (op1, elt);
kono
parents:
diff changeset
353 rtx rtx_val = GEN_INT (val);
kono
parents:
diff changeset
354 int shift = vspltis_shifted (op1);
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 gcc_assert (shift != 0);
kono
parents:
diff changeset
357 operands[2] = gen_reg_rtx (<MODE>mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 operands[3] = gen_const_vec_duplicate (<MODE>mode, rtx_val);
111
kono
parents:
diff changeset
359 operands[4] = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 if (shift < 0)
kono
parents:
diff changeset
362 {
kono
parents:
diff changeset
363 operands[5] = CONSTM1_RTX (<MODE>mode);
kono
parents:
diff changeset
364 operands[6] = GEN_INT (-shift);
kono
parents:
diff changeset
365 }
kono
parents:
diff changeset
366 else
kono
parents:
diff changeset
367 {
kono
parents:
diff changeset
368 operands[5] = CONST0_RTX (<MODE>mode);
kono
parents:
diff changeset
369 operands[6] = GEN_INT (shift);
kono
parents:
diff changeset
370 }
kono
parents:
diff changeset
371 })
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 (define_insn "get_vrsave_internal"
kono
parents:
diff changeset
374 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
375 (unspec:SI [(reg:SI VRSAVE_REGNO)] UNSPEC_GET_VRSAVE))]
kono
parents:
diff changeset
376 "TARGET_ALTIVEC"
kono
parents:
diff changeset
377 {
kono
parents:
diff changeset
378 if (TARGET_MACHO)
kono
parents:
diff changeset
379 return "mfspr %0,256";
kono
parents:
diff changeset
380 else
kono
parents:
diff changeset
381 return "mfvrsave %0";
kono
parents:
diff changeset
382 }
kono
parents:
diff changeset
383 [(set_attr "type" "*")])
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 (define_insn "*set_vrsave_internal"
kono
parents:
diff changeset
386 [(match_parallel 0 "vrsave_operation"
kono
parents:
diff changeset
387 [(set (reg:SI VRSAVE_REGNO)
kono
parents:
diff changeset
388 (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
389 (reg:SI VRSAVE_REGNO)] UNSPECV_SET_VRSAVE))])]
kono
parents:
diff changeset
390 "TARGET_ALTIVEC"
kono
parents:
diff changeset
391 {
kono
parents:
diff changeset
392 if (TARGET_MACHO)
kono
parents:
diff changeset
393 return "mtspr 256,%1";
kono
parents:
diff changeset
394 else
kono
parents:
diff changeset
395 return "mtvrsave %1";
kono
parents:
diff changeset
396 }
kono
parents:
diff changeset
397 [(set_attr "type" "*")])
kono
parents:
diff changeset
398
kono
parents:
diff changeset
399 (define_insn "*save_world"
kono
parents:
diff changeset
400 [(match_parallel 0 "save_world_operation"
kono
parents:
diff changeset
401 [(clobber (reg:SI LR_REGNO))
kono
parents:
diff changeset
402 (use (match_operand:SI 1 "call_operand" "s"))])]
kono
parents:
diff changeset
403 "TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT"
kono
parents:
diff changeset
404 "bl %z1"
kono
parents:
diff changeset
405 [(set_attr "type" "branch")
kono
parents:
diff changeset
406 (set_attr "length" "4")])
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 (define_insn "*restore_world"
kono
parents:
diff changeset
409 [(match_parallel 0 "restore_world_operation"
kono
parents:
diff changeset
410 [(return)
kono
parents:
diff changeset
411 (use (reg:SI LR_REGNO))
kono
parents:
diff changeset
412 (use (match_operand:SI 1 "call_operand" "s"))
kono
parents:
diff changeset
413 (clobber (match_operand:SI 2 "gpc_reg_operand" "=r"))])]
kono
parents:
diff changeset
414 "TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT"
kono
parents:
diff changeset
415 "b %z1")
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 ;; The save_vregs and restore_vregs patterns don't use memory_operand
kono
parents:
diff changeset
418 ;; because (plus (reg) (const_int)) is not a valid vector address.
kono
parents:
diff changeset
419 ;; This way is more compact than describing exactly what happens in
kono
parents:
diff changeset
420 ;; the out-of-line functions, ie. loading the constant into r11/r12
kono
parents:
diff changeset
421 ;; then using indexed addressing, and requires less editing of rtl
kono
parents:
diff changeset
422 ;; to describe the operation to dwarf2out_frame_debug_expr.
kono
parents:
diff changeset
423 (define_insn "*save_vregs_<mode>_r11"
kono
parents:
diff changeset
424 [(match_parallel 0 "any_parallel_operand"
kono
parents:
diff changeset
425 [(clobber (reg:P LR_REGNO))
kono
parents:
diff changeset
426 (use (match_operand:P 1 "symbol_ref_operand" "s"))
kono
parents:
diff changeset
427 (clobber (reg:P 11))
kono
parents:
diff changeset
428 (use (reg:P 0))
kono
parents:
diff changeset
429 (set (mem:V4SI (plus:P (match_operand:P 2 "gpc_reg_operand" "b")
kono
parents:
diff changeset
430 (match_operand:P 3 "short_cint_operand" "I")))
kono
parents:
diff changeset
431 (match_operand:V4SI 4 "altivec_register_operand" "v"))])]
kono
parents:
diff changeset
432 "TARGET_ALTIVEC"
kono
parents:
diff changeset
433 "bl %1"
kono
parents:
diff changeset
434 [(set_attr "type" "branch")
kono
parents:
diff changeset
435 (set_attr "length" "4")])
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 (define_insn "*save_vregs_<mode>_r12"
kono
parents:
diff changeset
438 [(match_parallel 0 "any_parallel_operand"
kono
parents:
diff changeset
439 [(clobber (reg:P LR_REGNO))
kono
parents:
diff changeset
440 (use (match_operand:P 1 "symbol_ref_operand" "s"))
kono
parents:
diff changeset
441 (clobber (reg:P 12))
kono
parents:
diff changeset
442 (use (reg:P 0))
kono
parents:
diff changeset
443 (set (mem:V4SI (plus:P (match_operand:P 2 "gpc_reg_operand" "b")
kono
parents:
diff changeset
444 (match_operand:P 3 "short_cint_operand" "I")))
kono
parents:
diff changeset
445 (match_operand:V4SI 4 "altivec_register_operand" "v"))])]
kono
parents:
diff changeset
446 "TARGET_ALTIVEC"
kono
parents:
diff changeset
447 "bl %1"
kono
parents:
diff changeset
448 [(set_attr "type" "branch")
kono
parents:
diff changeset
449 (set_attr "length" "4")])
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 (define_insn "*restore_vregs_<mode>_r11"
kono
parents:
diff changeset
452 [(match_parallel 0 "any_parallel_operand"
kono
parents:
diff changeset
453 [(clobber (reg:P LR_REGNO))
kono
parents:
diff changeset
454 (use (match_operand:P 1 "symbol_ref_operand" "s"))
kono
parents:
diff changeset
455 (clobber (reg:P 11))
kono
parents:
diff changeset
456 (use (reg:P 0))
kono
parents:
diff changeset
457 (set (match_operand:V4SI 2 "altivec_register_operand" "=v")
kono
parents:
diff changeset
458 (mem:V4SI (plus:P (match_operand:P 3 "gpc_reg_operand" "b")
kono
parents:
diff changeset
459 (match_operand:P 4 "short_cint_operand" "I"))))])]
kono
parents:
diff changeset
460 "TARGET_ALTIVEC"
kono
parents:
diff changeset
461 "bl %1"
kono
parents:
diff changeset
462 [(set_attr "type" "branch")
kono
parents:
diff changeset
463 (set_attr "length" "4")])
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 (define_insn "*restore_vregs_<mode>_r12"
kono
parents:
diff changeset
466 [(match_parallel 0 "any_parallel_operand"
kono
parents:
diff changeset
467 [(clobber (reg:P LR_REGNO))
kono
parents:
diff changeset
468 (use (match_operand:P 1 "symbol_ref_operand" "s"))
kono
parents:
diff changeset
469 (clobber (reg:P 12))
kono
parents:
diff changeset
470 (use (reg:P 0))
kono
parents:
diff changeset
471 (set (match_operand:V4SI 2 "altivec_register_operand" "=v")
kono
parents:
diff changeset
472 (mem:V4SI (plus:P (match_operand:P 3 "gpc_reg_operand" "b")
kono
parents:
diff changeset
473 (match_operand:P 4 "short_cint_operand" "I"))))])]
kono
parents:
diff changeset
474 "TARGET_ALTIVEC"
kono
parents:
diff changeset
475 "bl %1"
kono
parents:
diff changeset
476 [(set_attr "type" "branch")
kono
parents:
diff changeset
477 (set_attr "length" "4")])
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 ;; Simple binary operations.
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 ;; add
kono
parents:
diff changeset
482 (define_insn "add<mode>3"
kono
parents:
diff changeset
483 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
484 (plus:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
485 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
486 "<VI_unit>"
kono
parents:
diff changeset
487 "vaddu<VI_char>m %0,%1,%2"
kono
parents:
diff changeset
488 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 (define_insn "*altivec_addv4sf3"
kono
parents:
diff changeset
491 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
492 (plus:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
493 (match_operand:V4SF 2 "register_operand" "v")))]
kono
parents:
diff changeset
494 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
495 "vaddfp %0,%1,%2"
kono
parents:
diff changeset
496 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 (define_insn "altivec_vaddcuw"
kono
parents:
diff changeset
499 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
500 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
501 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
502 UNSPEC_VADDCUW))]
kono
parents:
diff changeset
503 "VECTOR_UNIT_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
504 "vaddcuw %0,%1,%2"
kono
parents:
diff changeset
505 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 (define_insn "altivec_vaddu<VI_char>s"
kono
parents:
diff changeset
508 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
509 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
510 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
511 UNSPEC_VADDU))
kono
parents:
diff changeset
512 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
513 "<VI_unit>"
kono
parents:
diff changeset
514 "vaddu<VI_char>s %0,%1,%2"
kono
parents:
diff changeset
515 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 (define_insn "altivec_vadds<VI_char>s"
kono
parents:
diff changeset
518 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
519 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
520 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
521 UNSPEC_VADDS))
kono
parents:
diff changeset
522 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
523 "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
524 "vadds<VI_char>s %0,%1,%2"
kono
parents:
diff changeset
525 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 ;; sub
kono
parents:
diff changeset
528 (define_insn "sub<mode>3"
kono
parents:
diff changeset
529 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
530 (minus:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
531 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
532 "<VI_unit>"
kono
parents:
diff changeset
533 "vsubu<VI_char>m %0,%1,%2"
kono
parents:
diff changeset
534 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 (define_insn "*altivec_subv4sf3"
kono
parents:
diff changeset
537 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
538 (minus:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
539 (match_operand:V4SF 2 "register_operand" "v")))]
kono
parents:
diff changeset
540 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
541 "vsubfp %0,%1,%2"
kono
parents:
diff changeset
542 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
543
kono
parents:
diff changeset
544 (define_insn "altivec_vsubcuw"
kono
parents:
diff changeset
545 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
546 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
547 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
548 UNSPEC_VSUBCUW))]
kono
parents:
diff changeset
549 "VECTOR_UNIT_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
550 "vsubcuw %0,%1,%2"
kono
parents:
diff changeset
551 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
552
kono
parents:
diff changeset
553 (define_insn "altivec_vsubu<VI_char>s"
kono
parents:
diff changeset
554 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
555 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
556 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
557 UNSPEC_VSUBU))
kono
parents:
diff changeset
558 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
559 "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
560 "vsubu<VI_char>s %0,%1,%2"
kono
parents:
diff changeset
561 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 (define_insn "altivec_vsubs<VI_char>s"
kono
parents:
diff changeset
564 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
565 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
566 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
567 UNSPEC_VSUBS))
kono
parents:
diff changeset
568 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
569 "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
570 "vsubs<VI_char>s %0,%1,%2"
kono
parents:
diff changeset
571 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 ;;
kono
parents:
diff changeset
574 (define_insn "altivec_vavgu<VI_char>"
kono
parents:
diff changeset
575 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
576 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
577 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
578 UNSPEC_VAVGU))]
kono
parents:
diff changeset
579 "TARGET_ALTIVEC"
kono
parents:
diff changeset
580 "vavgu<VI_char> %0,%1,%2"
kono
parents:
diff changeset
581 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
582
kono
parents:
diff changeset
583 (define_insn "altivec_vavgs<VI_char>"
kono
parents:
diff changeset
584 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
585 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
586 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
587 UNSPEC_VAVGS))]
kono
parents:
diff changeset
588 "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
589 "vavgs<VI_char> %0,%1,%2"
kono
parents:
diff changeset
590 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
591
kono
parents:
diff changeset
592 (define_insn "altivec_vcmpbfp"
kono
parents:
diff changeset
593 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
594 (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
595 (match_operand:V4SF 2 "register_operand" "v")]
kono
parents:
diff changeset
596 UNSPEC_VCMPBFP))]
kono
parents:
diff changeset
597 "VECTOR_UNIT_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
598 "vcmpbfp %0,%1,%2"
kono
parents:
diff changeset
599 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 (define_insn "*altivec_eq<mode>"
kono
parents:
diff changeset
602 [(set (match_operand:VI2 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
603 (eq:VI2 (match_operand:VI2 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
604 (match_operand:VI2 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
605 "<VI_unit>"
kono
parents:
diff changeset
606 "vcmpequ<VI_char> %0,%1,%2"
kono
parents:
diff changeset
607 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 (define_insn "*altivec_gt<mode>"
kono
parents:
diff changeset
610 [(set (match_operand:VI2 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
611 (gt:VI2 (match_operand:VI2 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
612 (match_operand:VI2 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
613 "<VI_unit>"
kono
parents:
diff changeset
614 "vcmpgts<VI_char> %0,%1,%2"
kono
parents:
diff changeset
615 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 (define_insn "*altivec_gtu<mode>"
kono
parents:
diff changeset
618 [(set (match_operand:VI2 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
619 (gtu:VI2 (match_operand:VI2 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
620 (match_operand:VI2 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
621 "<VI_unit>"
kono
parents:
diff changeset
622 "vcmpgtu<VI_char> %0,%1,%2"
kono
parents:
diff changeset
623 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 (define_insn "*altivec_eqv4sf"
kono
parents:
diff changeset
626 [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
627 (eq:V4SF (match_operand:V4SF 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
628 (match_operand:V4SF 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
629 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
630 "vcmpeqfp %0,%1,%2"
kono
parents:
diff changeset
631 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
632
kono
parents:
diff changeset
633 (define_insn "*altivec_gtv4sf"
kono
parents:
diff changeset
634 [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
635 (gt:V4SF (match_operand:V4SF 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
636 (match_operand:V4SF 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
637 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
638 "vcmpgtfp %0,%1,%2"
kono
parents:
diff changeset
639 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 (define_insn "*altivec_gev4sf"
kono
parents:
diff changeset
642 [(set (match_operand:V4SF 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
643 (ge:V4SF (match_operand:V4SF 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
644 (match_operand:V4SF 2 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
645 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
646 "vcmpgefp %0,%1,%2"
kono
parents:
diff changeset
647 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 (define_insn "*altivec_vsel<mode>"
kono
parents:
diff changeset
650 [(set (match_operand:VM 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
651 (if_then_else:VM
kono
parents:
diff changeset
652 (ne:CC (match_operand:VM 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
653 (match_operand:VM 4 "zero_constant" ""))
kono
parents:
diff changeset
654 (match_operand:VM 2 "altivec_register_operand" "v")
kono
parents:
diff changeset
655 (match_operand:VM 3 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
656 "VECTOR_MEM_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
657 "vsel %0,%3,%2,%1"
kono
parents:
diff changeset
658 [(set_attr "type" "vecmove")])
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 (define_insn "*altivec_vsel<mode>_uns"
kono
parents:
diff changeset
661 [(set (match_operand:VM 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
662 (if_then_else:VM
kono
parents:
diff changeset
663 (ne:CCUNS (match_operand:VM 1 "altivec_register_operand" "v")
kono
parents:
diff changeset
664 (match_operand:VM 4 "zero_constant" ""))
kono
parents:
diff changeset
665 (match_operand:VM 2 "altivec_register_operand" "v")
kono
parents:
diff changeset
666 (match_operand:VM 3 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
667 "VECTOR_MEM_ALTIVEC_P (<MODE>mode)"
kono
parents:
diff changeset
668 "vsel %0,%3,%2,%1"
kono
parents:
diff changeset
669 [(set_attr "type" "vecmove")])
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 ;; Fused multiply add.
kono
parents:
diff changeset
672
kono
parents:
diff changeset
673 (define_insn "*altivec_fmav4sf4"
kono
parents:
diff changeset
674 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
675 (fma:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
676 (match_operand:V4SF 2 "register_operand" "v")
kono
parents:
diff changeset
677 (match_operand:V4SF 3 "register_operand" "v")))]
kono
parents:
diff changeset
678 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
679 "vmaddfp %0,%1,%2,%3"
kono
parents:
diff changeset
680 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 ;; We do multiply as a fused multiply-add with an add of a -0.0 vector.
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 (define_expand "altivec_mulv4sf3"
kono
parents:
diff changeset
685 [(set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
686 (fma:V4SF (match_operand:V4SF 1 "register_operand" "")
kono
parents:
diff changeset
687 (match_operand:V4SF 2 "register_operand" "")
kono
parents:
diff changeset
688 (match_dup 3)))]
kono
parents:
diff changeset
689 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
690 {
kono
parents:
diff changeset
691 rtx neg0;
kono
parents:
diff changeset
692
kono
parents:
diff changeset
693 /* Generate [-0.0, -0.0, -0.0, -0.0]. */
kono
parents:
diff changeset
694 neg0 = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
695 emit_insn (gen_altivec_vspltisw (neg0, constm1_rtx));
kono
parents:
diff changeset
696 emit_insn (gen_vashlv4si3 (neg0, neg0, neg0));
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 operands[3] = gen_lowpart (V4SFmode, neg0);
kono
parents:
diff changeset
699 })
kono
parents:
diff changeset
700
kono
parents:
diff changeset
701 ;; 32-bit integer multiplication
kono
parents:
diff changeset
702 ;; A_high = Operand_0 & 0xFFFF0000 >> 16
kono
parents:
diff changeset
703 ;; A_low = Operand_0 & 0xFFFF
kono
parents:
diff changeset
704 ;; B_high = Operand_1 & 0xFFFF0000 >> 16
kono
parents:
diff changeset
705 ;; B_low = Operand_1 & 0xFFFF
kono
parents:
diff changeset
706 ;; result = A_low * B_low + (A_high * B_low + B_high * A_low) << 16
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 ;; (define_insn "mulv4si3"
kono
parents:
diff changeset
709 ;; [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
710 ;; (mult:V4SI (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
711 ;; (match_operand:V4SI 2 "register_operand" "v")))]
kono
parents:
diff changeset
712 (define_insn "mulv4si3_p8"
kono
parents:
diff changeset
713 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
714 (mult:V4SI (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
715 (match_operand:V4SI 2 "register_operand" "v")))]
kono
parents:
diff changeset
716 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
717 "vmuluwm %0,%1,%2"
kono
parents:
diff changeset
718 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
719
kono
parents:
diff changeset
720 (define_expand "mulv4si3"
kono
parents:
diff changeset
721 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
722 (use (match_operand:V4SI 1 "register_operand" ""))
kono
parents:
diff changeset
723 (use (match_operand:V4SI 2 "register_operand" ""))]
kono
parents:
diff changeset
724 "TARGET_ALTIVEC"
kono
parents:
diff changeset
725 {
kono
parents:
diff changeset
726 rtx zero;
kono
parents:
diff changeset
727 rtx swap;
kono
parents:
diff changeset
728 rtx small_swap;
kono
parents:
diff changeset
729 rtx sixteen;
kono
parents:
diff changeset
730 rtx one;
kono
parents:
diff changeset
731 rtx two;
kono
parents:
diff changeset
732 rtx low_product;
kono
parents:
diff changeset
733 rtx high_product;
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 if (TARGET_P8_VECTOR)
kono
parents:
diff changeset
736 {
kono
parents:
diff changeset
737 emit_insn (gen_mulv4si3_p8 (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
738 DONE;
kono
parents:
diff changeset
739 }
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 zero = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
742 emit_insn (gen_altivec_vspltisw (zero, const0_rtx));
kono
parents:
diff changeset
743
kono
parents:
diff changeset
744 sixteen = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
745 emit_insn (gen_altivec_vspltisw (sixteen, gen_rtx_CONST_INT (V4SImode, -16)));
kono
parents:
diff changeset
746
kono
parents:
diff changeset
747 swap = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
748 emit_insn (gen_vrotlv4si3 (swap, operands[2], sixteen));
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 one = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
751 convert_move (one, operands[1], 0);
kono
parents:
diff changeset
752
kono
parents:
diff changeset
753 two = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
754 convert_move (two, operands[2], 0);
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 small_swap = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
757 convert_move (small_swap, swap, 0);
kono
parents:
diff changeset
758
kono
parents:
diff changeset
759 low_product = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
760 emit_insn (gen_altivec_vmulouh (low_product, one, two));
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 high_product = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
763 emit_insn (gen_altivec_vmsumuhm (high_product, one, small_swap, zero));
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 emit_insn (gen_vashlv4si3 (high_product, high_product, sixteen));
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 emit_insn (gen_addv4si3 (operands[0], high_product, low_product));
kono
parents:
diff changeset
768
kono
parents:
diff changeset
769 DONE;
kono
parents:
diff changeset
770 })
kono
parents:
diff changeset
771
kono
parents:
diff changeset
772 (define_expand "mulv8hi3"
kono
parents:
diff changeset
773 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
774 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
775 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
776 "TARGET_ALTIVEC"
kono
parents:
diff changeset
777 {
kono
parents:
diff changeset
778 rtx zero = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 emit_insn (gen_altivec_vspltish (zero, const0_rtx));
kono
parents:
diff changeset
781 emit_insn (gen_altivec_vmladduhm(operands[0], operands[1], operands[2], zero));
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 DONE;
kono
parents:
diff changeset
784 })
kono
parents:
diff changeset
785
kono
parents:
diff changeset
786 ;; Fused multiply subtract
kono
parents:
diff changeset
787 (define_insn "*altivec_vnmsubfp"
kono
parents:
diff changeset
788 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
789 (neg:V4SF
kono
parents:
diff changeset
790 (fma:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
791 (match_operand:V4SF 2 "register_operand" "v")
kono
parents:
diff changeset
792 (neg:V4SF
kono
parents:
diff changeset
793 (match_operand:V4SF 3 "register_operand" "v")))))]
kono
parents:
diff changeset
794 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
795 "vnmsubfp %0,%1,%2,%3"
kono
parents:
diff changeset
796 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
797
kono
parents:
diff changeset
798 (define_insn "altivec_vmsumu<VI_char>m"
kono
parents:
diff changeset
799 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
800 (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
kono
parents:
diff changeset
801 (match_operand:VIshort 2 "register_operand" "v")
kono
parents:
diff changeset
802 (match_operand:V4SI 3 "register_operand" "v")]
kono
parents:
diff changeset
803 UNSPEC_VMSUMU))]
kono
parents:
diff changeset
804 "TARGET_ALTIVEC"
kono
parents:
diff changeset
805 "vmsumu<VI_char>m %0,%1,%2,%3"
kono
parents:
diff changeset
806 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 (define_insn "altivec_vmsumm<VI_char>m"
kono
parents:
diff changeset
809 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
810 (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
kono
parents:
diff changeset
811 (match_operand:VIshort 2 "register_operand" "v")
kono
parents:
diff changeset
812 (match_operand:V4SI 3 "register_operand" "v")]
kono
parents:
diff changeset
813 UNSPEC_VMSUMM))]
kono
parents:
diff changeset
814 "TARGET_ALTIVEC"
kono
parents:
diff changeset
815 "vmsumm<VI_char>m %0,%1,%2,%3"
kono
parents:
diff changeset
816 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
817
kono
parents:
diff changeset
818 (define_insn "altivec_vmsumshm"
kono
parents:
diff changeset
819 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
820 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
821 (match_operand:V8HI 2 "register_operand" "v")
kono
parents:
diff changeset
822 (match_operand:V4SI 3 "register_operand" "v")]
kono
parents:
diff changeset
823 UNSPEC_VMSUMSHM))]
kono
parents:
diff changeset
824 "TARGET_ALTIVEC"
kono
parents:
diff changeset
825 "vmsumshm %0,%1,%2,%3"
kono
parents:
diff changeset
826 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 (define_insn "altivec_vmsumuhs"
kono
parents:
diff changeset
829 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
830 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
831 (match_operand:V8HI 2 "register_operand" "v")
kono
parents:
diff changeset
832 (match_operand:V4SI 3 "register_operand" "v")]
kono
parents:
diff changeset
833 UNSPEC_VMSUMUHS))
kono
parents:
diff changeset
834 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
835 "TARGET_ALTIVEC"
kono
parents:
diff changeset
836 "vmsumuhs %0,%1,%2,%3"
kono
parents:
diff changeset
837 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 (define_insn "altivec_vmsumshs"
kono
parents:
diff changeset
840 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
841 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
842 (match_operand:V8HI 2 "register_operand" "v")
kono
parents:
diff changeset
843 (match_operand:V4SI 3 "register_operand" "v")]
kono
parents:
diff changeset
844 UNSPEC_VMSUMSHS))
kono
parents:
diff changeset
845 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
846 "TARGET_ALTIVEC"
kono
parents:
diff changeset
847 "vmsumshs %0,%1,%2,%3"
kono
parents:
diff changeset
848 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 ;; max
kono
parents:
diff changeset
851
kono
parents:
diff changeset
852 (define_insn "umax<mode>3"
kono
parents:
diff changeset
853 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
854 (umax:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
855 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
856 "<VI_unit>"
kono
parents:
diff changeset
857 "vmaxu<VI_char> %0,%1,%2"
kono
parents:
diff changeset
858 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 (define_insn "smax<mode>3"
kono
parents:
diff changeset
861 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
862 (smax:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
863 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
864 "<VI_unit>"
kono
parents:
diff changeset
865 "vmaxs<VI_char> %0,%1,%2"
kono
parents:
diff changeset
866 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 (define_insn "*altivec_smaxv4sf3"
kono
parents:
diff changeset
869 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
870 (smax:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
871 (match_operand:V4SF 2 "register_operand" "v")))]
kono
parents:
diff changeset
872 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
873 "vmaxfp %0,%1,%2"
kono
parents:
diff changeset
874 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
875
kono
parents:
diff changeset
876 (define_insn "umin<mode>3"
kono
parents:
diff changeset
877 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
878 (umin:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
879 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
880 "<VI_unit>"
kono
parents:
diff changeset
881 "vminu<VI_char> %0,%1,%2"
kono
parents:
diff changeset
882 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 (define_insn "smin<mode>3"
kono
parents:
diff changeset
885 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
886 (smin:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
887 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
888 "<VI_unit>"
kono
parents:
diff changeset
889 "vmins<VI_char> %0,%1,%2"
kono
parents:
diff changeset
890 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
891
kono
parents:
diff changeset
892 (define_insn "*altivec_sminv4sf3"
kono
parents:
diff changeset
893 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
894 (smin:V4SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
895 (match_operand:V4SF 2 "register_operand" "v")))]
kono
parents:
diff changeset
896 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
897 "vminfp %0,%1,%2"
kono
parents:
diff changeset
898 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
899
kono
parents:
diff changeset
900 (define_insn "altivec_vmhaddshs"
kono
parents:
diff changeset
901 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
902 (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
903 (match_operand:V8HI 2 "register_operand" "v")
kono
parents:
diff changeset
904 (match_operand:V8HI 3 "register_operand" "v")]
kono
parents:
diff changeset
905 UNSPEC_VMHADDSHS))
kono
parents:
diff changeset
906 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
907 "TARGET_ALTIVEC"
kono
parents:
diff changeset
908 "vmhaddshs %0,%1,%2,%3"
kono
parents:
diff changeset
909 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
910
kono
parents:
diff changeset
911 (define_insn "altivec_vmhraddshs"
kono
parents:
diff changeset
912 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
913 (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
914 (match_operand:V8HI 2 "register_operand" "v")
kono
parents:
diff changeset
915 (match_operand:V8HI 3 "register_operand" "v")]
kono
parents:
diff changeset
916 UNSPEC_VMHRADDSHS))
kono
parents:
diff changeset
917 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
918 "TARGET_ALTIVEC"
kono
parents:
diff changeset
919 "vmhraddshs %0,%1,%2,%3"
kono
parents:
diff changeset
920 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 (define_insn "altivec_vmladduhm"
kono
parents:
diff changeset
923 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
924 (plus:V8HI (mult:V8HI (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
925 (match_operand:V8HI 2 "register_operand" "v"))
kono
parents:
diff changeset
926 (match_operand:V8HI 3 "register_operand" "v")))]
kono
parents:
diff changeset
927 "TARGET_ALTIVEC"
kono
parents:
diff changeset
928 "vmladduhm %0,%1,%2,%3"
kono
parents:
diff changeset
929 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 (define_expand "altivec_vmrghb"
kono
parents:
diff changeset
932 [(use (match_operand:V16QI 0 "register_operand" ""))
kono
parents:
diff changeset
933 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
934 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
935 "TARGET_ALTIVEC"
kono
parents:
diff changeset
936 {
kono
parents:
diff changeset
937 rtvec v;
kono
parents:
diff changeset
938 rtx x;
kono
parents:
diff changeset
939
kono
parents:
diff changeset
940 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
941 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
942 {
kono
parents:
diff changeset
943 v = gen_rtvec (16, GEN_INT (8), GEN_INT (24), GEN_INT (9), GEN_INT (25),
kono
parents:
diff changeset
944 GEN_INT (10), GEN_INT (26), GEN_INT (11), GEN_INT (27),
kono
parents:
diff changeset
945 GEN_INT (12), GEN_INT (28), GEN_INT (13), GEN_INT (29),
kono
parents:
diff changeset
946 GEN_INT (14), GEN_INT (30), GEN_INT (15), GEN_INT (31));
kono
parents:
diff changeset
947 x = gen_rtx_VEC_CONCAT (V32QImode, operands[2], operands[1]);
kono
parents:
diff changeset
948 }
kono
parents:
diff changeset
949 else
kono
parents:
diff changeset
950 {
kono
parents:
diff changeset
951 v = gen_rtvec (16, GEN_INT (0), GEN_INT (16), GEN_INT (1), GEN_INT (17),
kono
parents:
diff changeset
952 GEN_INT (2), GEN_INT (18), GEN_INT (3), GEN_INT (19),
kono
parents:
diff changeset
953 GEN_INT (4), GEN_INT (20), GEN_INT (5), GEN_INT (21),
kono
parents:
diff changeset
954 GEN_INT (6), GEN_INT (22), GEN_INT (7), GEN_INT (23));
kono
parents:
diff changeset
955 x = gen_rtx_VEC_CONCAT (V32QImode, operands[1], operands[2]);
kono
parents:
diff changeset
956 }
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 x = gen_rtx_VEC_SELECT (V16QImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
959 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
960 DONE;
kono
parents:
diff changeset
961 })
kono
parents:
diff changeset
962
kono
parents:
diff changeset
963 (define_insn "*altivec_vmrghb_internal"
kono
parents:
diff changeset
964 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
965 (vec_select:V16QI
kono
parents:
diff changeset
966 (vec_concat:V32QI
kono
parents:
diff changeset
967 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
968 (match_operand:V16QI 2 "register_operand" "v"))
kono
parents:
diff changeset
969 (parallel [(const_int 0) (const_int 16)
kono
parents:
diff changeset
970 (const_int 1) (const_int 17)
kono
parents:
diff changeset
971 (const_int 2) (const_int 18)
kono
parents:
diff changeset
972 (const_int 3) (const_int 19)
kono
parents:
diff changeset
973 (const_int 4) (const_int 20)
kono
parents:
diff changeset
974 (const_int 5) (const_int 21)
kono
parents:
diff changeset
975 (const_int 6) (const_int 22)
kono
parents:
diff changeset
976 (const_int 7) (const_int 23)])))]
kono
parents:
diff changeset
977 "TARGET_ALTIVEC"
kono
parents:
diff changeset
978 {
kono
parents:
diff changeset
979 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
980 return "vmrghb %0,%1,%2";
kono
parents:
diff changeset
981 else
kono
parents:
diff changeset
982 return "vmrglb %0,%2,%1";
kono
parents:
diff changeset
983 }
kono
parents:
diff changeset
984 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
985
kono
parents:
diff changeset
986 (define_insn "altivec_vmrghb_direct"
kono
parents:
diff changeset
987 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
988 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
989 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
990 UNSPEC_VMRGH_DIRECT))]
kono
parents:
diff changeset
991 "TARGET_ALTIVEC"
kono
parents:
diff changeset
992 "vmrghb %0,%1,%2"
kono
parents:
diff changeset
993 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 (define_expand "altivec_vmrghh"
kono
parents:
diff changeset
996 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
997 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
998 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
999 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1000 {
kono
parents:
diff changeset
1001 rtvec v;
kono
parents:
diff changeset
1002 rtx x;
kono
parents:
diff changeset
1003
kono
parents:
diff changeset
1004 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
1005 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1006 {
kono
parents:
diff changeset
1007 v = gen_rtvec (8, GEN_INT (4), GEN_INT (12), GEN_INT (5), GEN_INT (13),
kono
parents:
diff changeset
1008 GEN_INT (6), GEN_INT (14), GEN_INT (7), GEN_INT (15));
kono
parents:
diff changeset
1009 x = gen_rtx_VEC_CONCAT (V16HImode, operands[2], operands[1]);
kono
parents:
diff changeset
1010 }
kono
parents:
diff changeset
1011 else
kono
parents:
diff changeset
1012 {
kono
parents:
diff changeset
1013 v = gen_rtvec (8, GEN_INT (0), GEN_INT (8), GEN_INT (1), GEN_INT (9),
kono
parents:
diff changeset
1014 GEN_INT (2), GEN_INT (10), GEN_INT (3), GEN_INT (11));
kono
parents:
diff changeset
1015 x = gen_rtx_VEC_CONCAT (V16HImode, operands[1], operands[2]);
kono
parents:
diff changeset
1016 }
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 x = gen_rtx_VEC_SELECT (V8HImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1019 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1020 DONE;
kono
parents:
diff changeset
1021 })
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023 (define_insn "*altivec_vmrghh_internal"
kono
parents:
diff changeset
1024 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1025 (vec_select:V8HI
kono
parents:
diff changeset
1026 (vec_concat:V16HI
kono
parents:
diff changeset
1027 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1028 (match_operand:V8HI 2 "register_operand" "v"))
kono
parents:
diff changeset
1029 (parallel [(const_int 0) (const_int 8)
kono
parents:
diff changeset
1030 (const_int 1) (const_int 9)
kono
parents:
diff changeset
1031 (const_int 2) (const_int 10)
kono
parents:
diff changeset
1032 (const_int 3) (const_int 11)])))]
kono
parents:
diff changeset
1033 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1034 {
kono
parents:
diff changeset
1035 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1036 return "vmrghh %0,%1,%2";
kono
parents:
diff changeset
1037 else
kono
parents:
diff changeset
1038 return "vmrglh %0,%2,%1";
kono
parents:
diff changeset
1039 }
kono
parents:
diff changeset
1040 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1041
kono
parents:
diff changeset
1042 (define_insn "altivec_vmrghh_direct"
kono
parents:
diff changeset
1043 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1044 (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1045 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1046 UNSPEC_VMRGH_DIRECT))]
kono
parents:
diff changeset
1047 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1048 "vmrghh %0,%1,%2"
kono
parents:
diff changeset
1049 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1050
kono
parents:
diff changeset
1051 (define_expand "altivec_vmrghw"
kono
parents:
diff changeset
1052 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1053 (use (match_operand:V4SI 1 "register_operand" ""))
kono
parents:
diff changeset
1054 (use (match_operand:V4SI 2 "register_operand" ""))]
kono
parents:
diff changeset
1055 "VECTOR_MEM_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
1056 {
kono
parents:
diff changeset
1057 rtvec v;
kono
parents:
diff changeset
1058 rtx x;
kono
parents:
diff changeset
1059
kono
parents:
diff changeset
1060 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
1061 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1062 {
kono
parents:
diff changeset
1063 v = gen_rtvec (4, GEN_INT (2), GEN_INT (6), GEN_INT (3), GEN_INT (7));
kono
parents:
diff changeset
1064 x = gen_rtx_VEC_CONCAT (V8SImode, operands[2], operands[1]);
kono
parents:
diff changeset
1065 }
kono
parents:
diff changeset
1066 else
kono
parents:
diff changeset
1067 {
kono
parents:
diff changeset
1068 v = gen_rtvec (4, GEN_INT (0), GEN_INT (4), GEN_INT (1), GEN_INT (5));
kono
parents:
diff changeset
1069 x = gen_rtx_VEC_CONCAT (V8SImode, operands[1], operands[2]);
kono
parents:
diff changeset
1070 }
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 x = gen_rtx_VEC_SELECT (V4SImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1073 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1074 DONE;
kono
parents:
diff changeset
1075 })
kono
parents:
diff changeset
1076
kono
parents:
diff changeset
1077 (define_insn "*altivec_vmrghw_internal"
kono
parents:
diff changeset
1078 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1079 (vec_select:V4SI
kono
parents:
diff changeset
1080 (vec_concat:V8SI
kono
parents:
diff changeset
1081 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1082 (match_operand:V4SI 2 "register_operand" "v"))
kono
parents:
diff changeset
1083 (parallel [(const_int 0) (const_int 4)
kono
parents:
diff changeset
1084 (const_int 1) (const_int 5)])))]
kono
parents:
diff changeset
1085 "VECTOR_MEM_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
1086 {
kono
parents:
diff changeset
1087 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1088 return "vmrghw %0,%1,%2";
kono
parents:
diff changeset
1089 else
kono
parents:
diff changeset
1090 return "vmrglw %0,%2,%1";
kono
parents:
diff changeset
1091 }
kono
parents:
diff changeset
1092 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1093
kono
parents:
diff changeset
1094 (define_insn "altivec_vmrghw_direct"
kono
parents:
diff changeset
1095 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1096 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1097 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1098 UNSPEC_VMRGH_DIRECT))]
kono
parents:
diff changeset
1099 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1100 "vmrghw %0,%1,%2"
kono
parents:
diff changeset
1101 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1102
kono
parents:
diff changeset
1103 (define_insn "*altivec_vmrghsf"
kono
parents:
diff changeset
1104 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
1105 (vec_select:V4SF
kono
parents:
diff changeset
1106 (vec_concat:V8SF
kono
parents:
diff changeset
1107 (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
1108 (match_operand:V4SF 2 "register_operand" "v"))
kono
parents:
diff changeset
1109 (parallel [(const_int 0) (const_int 4)
kono
parents:
diff changeset
1110 (const_int 1) (const_int 5)])))]
kono
parents:
diff changeset
1111 "VECTOR_MEM_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
1112 {
kono
parents:
diff changeset
1113 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1114 return "vmrghw %0,%1,%2";
kono
parents:
diff changeset
1115 else
kono
parents:
diff changeset
1116 return "vmrglw %0,%2,%1";
kono
parents:
diff changeset
1117 }
kono
parents:
diff changeset
1118 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1119
kono
parents:
diff changeset
1120 (define_expand "altivec_vmrglb"
kono
parents:
diff changeset
1121 [(use (match_operand:V16QI 0 "register_operand" ""))
kono
parents:
diff changeset
1122 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1123 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
1124 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1125 {
kono
parents:
diff changeset
1126 rtvec v;
kono
parents:
diff changeset
1127 rtx x;
kono
parents:
diff changeset
1128
kono
parents:
diff changeset
1129 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
1130 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1131 {
kono
parents:
diff changeset
1132 v = gen_rtvec (16, GEN_INT (0), GEN_INT (16), GEN_INT (1), GEN_INT (17),
kono
parents:
diff changeset
1133 GEN_INT (2), GEN_INT (18), GEN_INT (3), GEN_INT (19),
kono
parents:
diff changeset
1134 GEN_INT (4), GEN_INT (20), GEN_INT (5), GEN_INT (21),
kono
parents:
diff changeset
1135 GEN_INT (6), GEN_INT (22), GEN_INT (7), GEN_INT (23));
kono
parents:
diff changeset
1136 x = gen_rtx_VEC_CONCAT (V32QImode, operands[2], operands[1]);
kono
parents:
diff changeset
1137 }
kono
parents:
diff changeset
1138 else
kono
parents:
diff changeset
1139 {
kono
parents:
diff changeset
1140 v = gen_rtvec (16, GEN_INT (8), GEN_INT (24), GEN_INT (9), GEN_INT (25),
kono
parents:
diff changeset
1141 GEN_INT (10), GEN_INT (26), GEN_INT (11), GEN_INT (27),
kono
parents:
diff changeset
1142 GEN_INT (12), GEN_INT (28), GEN_INT (13), GEN_INT (29),
kono
parents:
diff changeset
1143 GEN_INT (14), GEN_INT (30), GEN_INT (15), GEN_INT (31));
kono
parents:
diff changeset
1144 x = gen_rtx_VEC_CONCAT (V32QImode, operands[1], operands[2]);
kono
parents:
diff changeset
1145 }
kono
parents:
diff changeset
1146
kono
parents:
diff changeset
1147 x = gen_rtx_VEC_SELECT (V16QImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1148 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1149 DONE;
kono
parents:
diff changeset
1150 })
kono
parents:
diff changeset
1151
kono
parents:
diff changeset
1152 (define_insn "*altivec_vmrglb_internal"
kono
parents:
diff changeset
1153 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1154 (vec_select:V16QI
kono
parents:
diff changeset
1155 (vec_concat:V32QI
kono
parents:
diff changeset
1156 (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1157 (match_operand:V16QI 2 "register_operand" "v"))
kono
parents:
diff changeset
1158 (parallel [(const_int 8) (const_int 24)
kono
parents:
diff changeset
1159 (const_int 9) (const_int 25)
kono
parents:
diff changeset
1160 (const_int 10) (const_int 26)
kono
parents:
diff changeset
1161 (const_int 11) (const_int 27)
kono
parents:
diff changeset
1162 (const_int 12) (const_int 28)
kono
parents:
diff changeset
1163 (const_int 13) (const_int 29)
kono
parents:
diff changeset
1164 (const_int 14) (const_int 30)
kono
parents:
diff changeset
1165 (const_int 15) (const_int 31)])))]
kono
parents:
diff changeset
1166 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1167 {
kono
parents:
diff changeset
1168 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1169 return "vmrglb %0,%1,%2";
kono
parents:
diff changeset
1170 else
kono
parents:
diff changeset
1171 return "vmrghb %0,%2,%1";
kono
parents:
diff changeset
1172 }
kono
parents:
diff changeset
1173 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1174
kono
parents:
diff changeset
1175 (define_insn "altivec_vmrglb_direct"
kono
parents:
diff changeset
1176 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1177 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1178 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1179 UNSPEC_VMRGL_DIRECT))]
kono
parents:
diff changeset
1180 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1181 "vmrglb %0,%1,%2"
kono
parents:
diff changeset
1182 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1183
kono
parents:
diff changeset
1184 (define_expand "altivec_vmrglh"
kono
parents:
diff changeset
1185 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1186 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1187 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
1188 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1189 {
kono
parents:
diff changeset
1190 rtvec v;
kono
parents:
diff changeset
1191 rtx x;
kono
parents:
diff changeset
1192
kono
parents:
diff changeset
1193 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
1194 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1195 {
kono
parents:
diff changeset
1196 v = gen_rtvec (8, GEN_INT (0), GEN_INT (8), GEN_INT (1), GEN_INT (9),
kono
parents:
diff changeset
1197 GEN_INT (2), GEN_INT (10), GEN_INT (3), GEN_INT (11));
kono
parents:
diff changeset
1198 x = gen_rtx_VEC_CONCAT (V16HImode, operands[2], operands[1]);
kono
parents:
diff changeset
1199 }
kono
parents:
diff changeset
1200 else
kono
parents:
diff changeset
1201 {
kono
parents:
diff changeset
1202 v = gen_rtvec (8, GEN_INT (4), GEN_INT (12), GEN_INT (5), GEN_INT (13),
kono
parents:
diff changeset
1203 GEN_INT (6), GEN_INT (14), GEN_INT (7), GEN_INT (15));
kono
parents:
diff changeset
1204 x = gen_rtx_VEC_CONCAT (V16HImode, operands[1], operands[2]);
kono
parents:
diff changeset
1205 }
kono
parents:
diff changeset
1206
kono
parents:
diff changeset
1207 x = gen_rtx_VEC_SELECT (V8HImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1208 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1209 DONE;
kono
parents:
diff changeset
1210 })
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 (define_insn "*altivec_vmrglh_internal"
kono
parents:
diff changeset
1213 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1214 (vec_select:V8HI
kono
parents:
diff changeset
1215 (vec_concat:V16HI
kono
parents:
diff changeset
1216 (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1217 (match_operand:V8HI 2 "register_operand" "v"))
kono
parents:
diff changeset
1218 (parallel [(const_int 4) (const_int 12)
kono
parents:
diff changeset
1219 (const_int 5) (const_int 13)
kono
parents:
diff changeset
1220 (const_int 6) (const_int 14)
kono
parents:
diff changeset
1221 (const_int 7) (const_int 15)])))]
kono
parents:
diff changeset
1222 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1223 {
kono
parents:
diff changeset
1224 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1225 return "vmrglh %0,%1,%2";
kono
parents:
diff changeset
1226 else
kono
parents:
diff changeset
1227 return "vmrghh %0,%2,%1";
kono
parents:
diff changeset
1228 }
kono
parents:
diff changeset
1229 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1230
kono
parents:
diff changeset
1231 (define_insn "altivec_vmrglh_direct"
kono
parents:
diff changeset
1232 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1233 (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1234 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1235 UNSPEC_VMRGL_DIRECT))]
kono
parents:
diff changeset
1236 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1237 "vmrglh %0,%1,%2"
kono
parents:
diff changeset
1238 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1239
kono
parents:
diff changeset
1240 (define_expand "altivec_vmrglw"
kono
parents:
diff changeset
1241 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1242 (use (match_operand:V4SI 1 "register_operand" ""))
kono
parents:
diff changeset
1243 (use (match_operand:V4SI 2 "register_operand" ""))]
kono
parents:
diff changeset
1244 "VECTOR_MEM_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
1245 {
kono
parents:
diff changeset
1246 rtvec v;
kono
parents:
diff changeset
1247 rtx x;
kono
parents:
diff changeset
1248
kono
parents:
diff changeset
1249 /* Special handling for LE with -maltivec=be. */
kono
parents:
diff changeset
1250 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1251 {
kono
parents:
diff changeset
1252 v = gen_rtvec (4, GEN_INT (0), GEN_INT (4), GEN_INT (1), GEN_INT (5));
kono
parents:
diff changeset
1253 x = gen_rtx_VEC_CONCAT (V8SImode, operands[2], operands[1]);
kono
parents:
diff changeset
1254 }
kono
parents:
diff changeset
1255 else
kono
parents:
diff changeset
1256 {
kono
parents:
diff changeset
1257 v = gen_rtvec (4, GEN_INT (2), GEN_INT (6), GEN_INT (3), GEN_INT (7));
kono
parents:
diff changeset
1258 x = gen_rtx_VEC_CONCAT (V8SImode, operands[1], operands[2]);
kono
parents:
diff changeset
1259 }
kono
parents:
diff changeset
1260
kono
parents:
diff changeset
1261 x = gen_rtx_VEC_SELECT (V4SImode, x, gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1262 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1263 DONE;
kono
parents:
diff changeset
1264 })
kono
parents:
diff changeset
1265
kono
parents:
diff changeset
1266 (define_insn "*altivec_vmrglw_internal"
kono
parents:
diff changeset
1267 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1268 (vec_select:V4SI
kono
parents:
diff changeset
1269 (vec_concat:V8SI
kono
parents:
diff changeset
1270 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1271 (match_operand:V4SI 2 "register_operand" "v"))
kono
parents:
diff changeset
1272 (parallel [(const_int 2) (const_int 6)
kono
parents:
diff changeset
1273 (const_int 3) (const_int 7)])))]
kono
parents:
diff changeset
1274 "VECTOR_MEM_ALTIVEC_P (V4SImode)"
kono
parents:
diff changeset
1275 {
kono
parents:
diff changeset
1276 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1277 return "vmrglw %0,%1,%2";
kono
parents:
diff changeset
1278 else
kono
parents:
diff changeset
1279 return "vmrghw %0,%2,%1";
kono
parents:
diff changeset
1280 }
kono
parents:
diff changeset
1281 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1282
kono
parents:
diff changeset
1283 (define_insn "altivec_vmrglw_direct"
kono
parents:
diff changeset
1284 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1285 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1286 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1287 UNSPEC_VMRGL_DIRECT))]
kono
parents:
diff changeset
1288 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1289 "vmrglw %0,%1,%2"
kono
parents:
diff changeset
1290 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1291
kono
parents:
diff changeset
1292 (define_insn "*altivec_vmrglsf"
kono
parents:
diff changeset
1293 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
1294 (vec_select:V4SF
kono
parents:
diff changeset
1295 (vec_concat:V8SF
kono
parents:
diff changeset
1296 (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
1297 (match_operand:V4SF 2 "register_operand" "v"))
kono
parents:
diff changeset
1298 (parallel [(const_int 2) (const_int 6)
kono
parents:
diff changeset
1299 (const_int 3) (const_int 7)])))]
kono
parents:
diff changeset
1300 "VECTOR_MEM_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
1301 {
kono
parents:
diff changeset
1302 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1303 return "vmrglw %0,%1,%2";
kono
parents:
diff changeset
1304 else
kono
parents:
diff changeset
1305 return "vmrghw %0,%2,%1";
kono
parents:
diff changeset
1306 }
kono
parents:
diff changeset
1307 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1308
kono
parents:
diff changeset
1309 ;; Power8 vector merge even/odd
kono
parents:
diff changeset
1310 (define_insn "p8_vmrgew"
kono
parents:
diff changeset
1311 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1312 (vec_select:V4SI
kono
parents:
diff changeset
1313 (vec_concat:V8SI
kono
parents:
diff changeset
1314 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1315 (match_operand:V4SI 2 "register_operand" "v"))
kono
parents:
diff changeset
1316 (parallel [(const_int 0) (const_int 4)
kono
parents:
diff changeset
1317 (const_int 2) (const_int 6)])))]
kono
parents:
diff changeset
1318 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
1319 {
kono
parents:
diff changeset
1320 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1321 return "vmrgew %0,%1,%2";
kono
parents:
diff changeset
1322 else
kono
parents:
diff changeset
1323 return "vmrgow %0,%2,%1";
kono
parents:
diff changeset
1324 }
kono
parents:
diff changeset
1325 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1326
kono
parents:
diff changeset
1327 (define_insn "p8_vmrgow"
kono
parents:
diff changeset
1328 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1329 (vec_select:V4SI
kono
parents:
diff changeset
1330 (vec_concat:V8SI
kono
parents:
diff changeset
1331 (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1332 (match_operand:V4SI 2 "register_operand" "v"))
kono
parents:
diff changeset
1333 (parallel [(const_int 1) (const_int 5)
kono
parents:
diff changeset
1334 (const_int 3) (const_int 7)])))]
kono
parents:
diff changeset
1335 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
1336 {
kono
parents:
diff changeset
1337 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1338 return "vmrgow %0,%1,%2";
kono
parents:
diff changeset
1339 else
kono
parents:
diff changeset
1340 return "vmrgew %0,%2,%1";
kono
parents:
diff changeset
1341 }
kono
parents:
diff changeset
1342 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1343
kono
parents:
diff changeset
1344 (define_insn "p8_vmrgew_v4sf_direct"
kono
parents:
diff changeset
1345 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
1346 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
1347 (match_operand:V4SF 2 "register_operand" "v")]
kono
parents:
diff changeset
1348 UNSPEC_VMRGEW_DIRECT))]
kono
parents:
diff changeset
1349 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
1350 "vmrgew %0,%1,%2"
kono
parents:
diff changeset
1351 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 (define_expand "vec_widen_umult_even_v16qi"
kono
parents:
diff changeset
1354 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1355 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1356 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
1357 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1358 {
kono
parents:
diff changeset
1359 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1360 emit_insn (gen_altivec_vmuleub (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1361 else
kono
parents:
diff changeset
1362 emit_insn (gen_altivec_vmuloub (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1363 DONE;
kono
parents:
diff changeset
1364 })
kono
parents:
diff changeset
1365
kono
parents:
diff changeset
1366 (define_expand "vec_widen_smult_even_v16qi"
kono
parents:
diff changeset
1367 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1368 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1369 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
1370 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1371 {
kono
parents:
diff changeset
1372 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1373 emit_insn (gen_altivec_vmulesb (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1374 else
kono
parents:
diff changeset
1375 emit_insn (gen_altivec_vmulosb (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1376 DONE;
kono
parents:
diff changeset
1377 })
kono
parents:
diff changeset
1378
kono
parents:
diff changeset
1379 (define_expand "vec_widen_umult_even_v8hi"
kono
parents:
diff changeset
1380 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1381 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1382 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
1383 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1384 {
kono
parents:
diff changeset
1385 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1386 emit_insn (gen_altivec_vmuleuh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1387 else
kono
parents:
diff changeset
1388 emit_insn (gen_altivec_vmulouh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1389 DONE;
kono
parents:
diff changeset
1390 })
kono
parents:
diff changeset
1391
kono
parents:
diff changeset
1392 (define_expand "vec_widen_smult_even_v8hi"
kono
parents:
diff changeset
1393 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1394 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1395 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
1396 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1397 {
kono
parents:
diff changeset
1398 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1399 emit_insn (gen_altivec_vmulesh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1400 else
kono
parents:
diff changeset
1401 emit_insn (gen_altivec_vmulosh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1402 DONE;
kono
parents:
diff changeset
1403 })
kono
parents:
diff changeset
1404
kono
parents:
diff changeset
1405 (define_expand "vec_widen_umult_odd_v16qi"
kono
parents:
diff changeset
1406 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1407 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1408 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
1409 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1410 {
kono
parents:
diff changeset
1411 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1412 emit_insn (gen_altivec_vmuloub (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1413 else
kono
parents:
diff changeset
1414 emit_insn (gen_altivec_vmuleub (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1415 DONE;
kono
parents:
diff changeset
1416 })
kono
parents:
diff changeset
1417
kono
parents:
diff changeset
1418 (define_expand "vec_widen_smult_odd_v16qi"
kono
parents:
diff changeset
1419 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1420 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1421 (use (match_operand:V16QI 2 "register_operand" ""))]
kono
parents:
diff changeset
1422 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1423 {
kono
parents:
diff changeset
1424 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1425 emit_insn (gen_altivec_vmulosb (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1426 else
kono
parents:
diff changeset
1427 emit_insn (gen_altivec_vmulesb (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1428 DONE;
kono
parents:
diff changeset
1429 })
kono
parents:
diff changeset
1430
kono
parents:
diff changeset
1431 (define_expand "vec_widen_umult_odd_v8hi"
kono
parents:
diff changeset
1432 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1433 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1434 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
1435 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1436 {
kono
parents:
diff changeset
1437 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1438 emit_insn (gen_altivec_vmulouh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1439 else
kono
parents:
diff changeset
1440 emit_insn (gen_altivec_vmuleuh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1441 DONE;
kono
parents:
diff changeset
1442 })
kono
parents:
diff changeset
1443
kono
parents:
diff changeset
1444 (define_expand "vec_widen_smult_odd_v8hi"
kono
parents:
diff changeset
1445 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1446 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1447 (use (match_operand:V8HI 2 "register_operand" ""))]
kono
parents:
diff changeset
1448 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1449 {
kono
parents:
diff changeset
1450 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1451 emit_insn (gen_altivec_vmulosh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1452 else
kono
parents:
diff changeset
1453 emit_insn (gen_altivec_vmulesh (operands[0], operands[1], operands[2]));
kono
parents:
diff changeset
1454 DONE;
kono
parents:
diff changeset
1455 })
kono
parents:
diff changeset
1456
kono
parents:
diff changeset
1457 (define_insn "altivec_vmuleub"
kono
parents:
diff changeset
1458 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1459 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1460 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1461 UNSPEC_VMULEUB))]
kono
parents:
diff changeset
1462 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1463 "vmuleub %0,%1,%2"
kono
parents:
diff changeset
1464 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 (define_insn "altivec_vmuloub"
kono
parents:
diff changeset
1467 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1468 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1469 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1470 UNSPEC_VMULOUB))]
kono
parents:
diff changeset
1471 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1472 "vmuloub %0,%1,%2"
kono
parents:
diff changeset
1473 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1474
kono
parents:
diff changeset
1475 (define_insn "altivec_vmulesb"
kono
parents:
diff changeset
1476 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1477 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1478 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1479 UNSPEC_VMULESB))]
kono
parents:
diff changeset
1480 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1481 "vmulesb %0,%1,%2"
kono
parents:
diff changeset
1482 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1483
kono
parents:
diff changeset
1484 (define_insn "altivec_vmulosb"
kono
parents:
diff changeset
1485 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1486 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1487 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1488 UNSPEC_VMULOSB))]
kono
parents:
diff changeset
1489 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1490 "vmulosb %0,%1,%2"
kono
parents:
diff changeset
1491 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1492
kono
parents:
diff changeset
1493 (define_insn "altivec_vmuleuh"
kono
parents:
diff changeset
1494 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1495 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1496 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1497 UNSPEC_VMULEUH))]
kono
parents:
diff changeset
1498 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1499 "vmuleuh %0,%1,%2"
kono
parents:
diff changeset
1500 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1501
kono
parents:
diff changeset
1502 (define_insn "altivec_vmulouh"
kono
parents:
diff changeset
1503 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1504 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1505 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1506 UNSPEC_VMULOUH))]
kono
parents:
diff changeset
1507 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1508 "vmulouh %0,%1,%2"
kono
parents:
diff changeset
1509 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1510
kono
parents:
diff changeset
1511 (define_insn "altivec_vmulesh"
kono
parents:
diff changeset
1512 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1513 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1514 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1515 UNSPEC_VMULESH))]
kono
parents:
diff changeset
1516 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1517 "vmulesh %0,%1,%2"
kono
parents:
diff changeset
1518 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1519
kono
parents:
diff changeset
1520 (define_insn "altivec_vmulosh"
kono
parents:
diff changeset
1521 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1522 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1523 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
1524 UNSPEC_VMULOSH))]
kono
parents:
diff changeset
1525 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1526 "vmulosh %0,%1,%2"
kono
parents:
diff changeset
1527 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1528
kono
parents:
diff changeset
1529
kono
parents:
diff changeset
1530 ;; Vector pack/unpack
kono
parents:
diff changeset
1531 (define_insn "altivec_vpkpx"
kono
parents:
diff changeset
1532 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1533 (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1534 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1535 UNSPEC_VPKPX))]
kono
parents:
diff changeset
1536 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1537 "*
kono
parents:
diff changeset
1538 {
kono
parents:
diff changeset
1539 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1540 return \"vpkpx %0,%1,%2\";
kono
parents:
diff changeset
1541 else
kono
parents:
diff changeset
1542 return \"vpkpx %0,%2,%1\";
kono
parents:
diff changeset
1543 }"
kono
parents:
diff changeset
1544 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1545
kono
parents:
diff changeset
1546 (define_insn "altivec_vpks<VI_char>ss"
kono
parents:
diff changeset
1547 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
1548 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
1549 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
1550 UNSPEC_VPACK_SIGN_SIGN_SAT))]
kono
parents:
diff changeset
1551 "<VI_unit>"
kono
parents:
diff changeset
1552 "*
kono
parents:
diff changeset
1553 {
kono
parents:
diff changeset
1554 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1555 return \"vpks<VI_char>ss %0,%1,%2\";
kono
parents:
diff changeset
1556 else
kono
parents:
diff changeset
1557 return \"vpks<VI_char>ss %0,%2,%1\";
kono
parents:
diff changeset
1558 }"
kono
parents:
diff changeset
1559 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1560
kono
parents:
diff changeset
1561 (define_insn "altivec_vpks<VI_char>us"
kono
parents:
diff changeset
1562 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
1563 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
1564 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
1565 UNSPEC_VPACK_SIGN_UNS_SAT))]
kono
parents:
diff changeset
1566 "<VI_unit>"
kono
parents:
diff changeset
1567 "*
kono
parents:
diff changeset
1568 {
kono
parents:
diff changeset
1569 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1570 return \"vpks<VI_char>us %0,%1,%2\";
kono
parents:
diff changeset
1571 else
kono
parents:
diff changeset
1572 return \"vpks<VI_char>us %0,%2,%1\";
kono
parents:
diff changeset
1573 }"
kono
parents:
diff changeset
1574 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1575
kono
parents:
diff changeset
1576 (define_insn "altivec_vpku<VI_char>us"
kono
parents:
diff changeset
1577 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
1578 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
1579 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
1580 UNSPEC_VPACK_UNS_UNS_SAT))]
kono
parents:
diff changeset
1581 "<VI_unit>"
kono
parents:
diff changeset
1582 "*
kono
parents:
diff changeset
1583 {
kono
parents:
diff changeset
1584 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1585 return \"vpku<VI_char>us %0,%1,%2\";
kono
parents:
diff changeset
1586 else
kono
parents:
diff changeset
1587 return \"vpku<VI_char>us %0,%2,%1\";
kono
parents:
diff changeset
1588 }"
kono
parents:
diff changeset
1589 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1590
kono
parents:
diff changeset
1591 (define_insn "altivec_vpku<VI_char>um"
kono
parents:
diff changeset
1592 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
1593 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
1594 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
1595 UNSPEC_VPACK_UNS_UNS_MOD))]
kono
parents:
diff changeset
1596 "<VI_unit>"
kono
parents:
diff changeset
1597 "*
kono
parents:
diff changeset
1598 {
kono
parents:
diff changeset
1599 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1600 return \"vpku<VI_char>um %0,%1,%2\";
kono
parents:
diff changeset
1601 else
kono
parents:
diff changeset
1602 return \"vpku<VI_char>um %0,%2,%1\";
kono
parents:
diff changeset
1603 }"
kono
parents:
diff changeset
1604 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1605
kono
parents:
diff changeset
1606 (define_insn "altivec_vpku<VI_char>um_direct"
kono
parents:
diff changeset
1607 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
1608 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
1609 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
1610 UNSPEC_VPACK_UNS_UNS_MOD_DIRECT))]
kono
parents:
diff changeset
1611 "<VI_unit>"
kono
parents:
diff changeset
1612 "*
kono
parents:
diff changeset
1613 {
kono
parents:
diff changeset
1614 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1615 return \"vpku<VI_char>um %0,%1,%2\";
kono
parents:
diff changeset
1616 else
kono
parents:
diff changeset
1617 return \"vpku<VI_char>um %0,%2,%1\";
kono
parents:
diff changeset
1618 }"
kono
parents:
diff changeset
1619 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1620
kono
parents:
diff changeset
1621 (define_insn "*altivec_vrl<VI_char>"
kono
parents:
diff changeset
1622 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
1623 (rotate:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
1624 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
1625 "<VI_unit>"
kono
parents:
diff changeset
1626 "vrl<VI_char> %0,%1,%2"
kono
parents:
diff changeset
1627 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1628
kono
parents:
diff changeset
1629 (define_insn "altivec_vrl<VI_char>mi"
kono
parents:
diff changeset
1630 [(set (match_operand:VIlong 0 "register_operand" "=v")
kono
parents:
diff changeset
1631 (unspec:VIlong [(match_operand:VIlong 1 "register_operand" "0")
kono
parents:
diff changeset
1632 (match_operand:VIlong 2 "register_operand" "v")
kono
parents:
diff changeset
1633 (match_operand:VIlong 3 "register_operand" "v")]
kono
parents:
diff changeset
1634 UNSPEC_VRLMI))]
kono
parents:
diff changeset
1635 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
1636 "vrl<VI_char>mi %0,%2,%3"
kono
parents:
diff changeset
1637 [(set_attr "type" "veclogical")])
kono
parents:
diff changeset
1638
kono
parents:
diff changeset
1639 (define_insn "altivec_vrl<VI_char>nm"
kono
parents:
diff changeset
1640 [(set (match_operand:VIlong 0 "register_operand" "=v")
kono
parents:
diff changeset
1641 (unspec:VIlong [(match_operand:VIlong 1 "register_operand" "v")
kono
parents:
diff changeset
1642 (match_operand:VIlong 2 "register_operand" "v")]
kono
parents:
diff changeset
1643 UNSPEC_VRLNM))]
kono
parents:
diff changeset
1644 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
1645 "vrl<VI_char>nm %0,%1,%2"
kono
parents:
diff changeset
1646 [(set_attr "type" "veclogical")])
kono
parents:
diff changeset
1647
kono
parents:
diff changeset
1648 (define_insn "altivec_vsl"
kono
parents:
diff changeset
1649 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1650 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1651 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1652 UNSPEC_VSLV4SI))]
kono
parents:
diff changeset
1653 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1654 "vsl %0,%1,%2"
kono
parents:
diff changeset
1655 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 (define_insn "altivec_vslo"
kono
parents:
diff changeset
1658 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1659 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1660 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1661 UNSPEC_VSLO))]
kono
parents:
diff changeset
1662 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1663 "vslo %0,%1,%2"
kono
parents:
diff changeset
1664 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1665
kono
parents:
diff changeset
1666 (define_insn "vslv"
kono
parents:
diff changeset
1667 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1668 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1669 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1670 UNSPEC_VSLV))]
kono
parents:
diff changeset
1671 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
1672 "vslv %0,%1,%2"
kono
parents:
diff changeset
1673 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1674
kono
parents:
diff changeset
1675 (define_insn "vsrv"
kono
parents:
diff changeset
1676 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1677 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1678 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
1679 UNSPEC_VSRV))]
kono
parents:
diff changeset
1680 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
1681 "vsrv %0,%1,%2"
kono
parents:
diff changeset
1682 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1683
kono
parents:
diff changeset
1684 (define_insn "*altivec_vsl<VI_char>"
kono
parents:
diff changeset
1685 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
1686 (ashift:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
1687 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
1688 "<VI_unit>"
kono
parents:
diff changeset
1689 "vsl<VI_char> %0,%1,%2"
kono
parents:
diff changeset
1690 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1691
kono
parents:
diff changeset
1692 (define_insn "*altivec_vsr<VI_char>"
kono
parents:
diff changeset
1693 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
1694 (lshiftrt:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
1695 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
1696 "<VI_unit>"
kono
parents:
diff changeset
1697 "vsr<VI_char> %0,%1,%2"
kono
parents:
diff changeset
1698 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1699
kono
parents:
diff changeset
1700 (define_insn "*altivec_vsra<VI_char>"
kono
parents:
diff changeset
1701 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
1702 (ashiftrt:VI2 (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
1703 (match_operand:VI2 2 "register_operand" "v")))]
kono
parents:
diff changeset
1704 "<VI_unit>"
kono
parents:
diff changeset
1705 "vsra<VI_char> %0,%1,%2"
kono
parents:
diff changeset
1706 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
1707
kono
parents:
diff changeset
1708 (define_insn "altivec_vsr"
kono
parents:
diff changeset
1709 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1710 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1711 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1712 UNSPEC_VSR))]
kono
parents:
diff changeset
1713 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1714 "vsr %0,%1,%2"
kono
parents:
diff changeset
1715 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1716
kono
parents:
diff changeset
1717 (define_insn "altivec_vsro"
kono
parents:
diff changeset
1718 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1719 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1720 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1721 UNSPEC_VSRO))]
kono
parents:
diff changeset
1722 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1723 "vsro %0,%1,%2"
kono
parents:
diff changeset
1724 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1725
kono
parents:
diff changeset
1726 (define_insn "altivec_vsum4ubs"
kono
parents:
diff changeset
1727 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1728 (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1729 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1730 UNSPEC_VSUM4UBS))
kono
parents:
diff changeset
1731 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
1732 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1733 "vsum4ubs %0,%1,%2"
kono
parents:
diff changeset
1734 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1735
kono
parents:
diff changeset
1736 (define_insn "altivec_vsum4s<VI_char>s"
kono
parents:
diff changeset
1737 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1738 (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
kono
parents:
diff changeset
1739 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1740 UNSPEC_VSUM4S))
kono
parents:
diff changeset
1741 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
1742 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1743 "vsum4s<VI_char>s %0,%1,%2"
kono
parents:
diff changeset
1744 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1745
kono
parents:
diff changeset
1746 ;; FIXME: For the following two patterns, the scratch should only be
kono
parents:
diff changeset
1747 ;; allocated for !VECTOR_ELT_ORDER_BIG, and the instructions should
kono
parents:
diff changeset
1748 ;; be emitted separately.
kono
parents:
diff changeset
1749 (define_insn "altivec_vsum2sws"
kono
parents:
diff changeset
1750 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1751 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1752 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1753 UNSPEC_VSUM2SWS))
kono
parents:
diff changeset
1754 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))
kono
parents:
diff changeset
1755 (clobber (match_scratch:V4SI 3 "=v"))]
kono
parents:
diff changeset
1756 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1757 {
kono
parents:
diff changeset
1758 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1759 return "vsum2sws %0,%1,%2";
kono
parents:
diff changeset
1760 else
kono
parents:
diff changeset
1761 return "vsldoi %3,%2,%2,12\n\tvsum2sws %3,%1,%3\n\tvsldoi %0,%3,%3,4";
kono
parents:
diff changeset
1762 }
kono
parents:
diff changeset
1763 [(set_attr "type" "veccomplex")
kono
parents:
diff changeset
1764 (set (attr "length")
kono
parents:
diff changeset
1765 (if_then_else
kono
parents:
diff changeset
1766 (match_test "VECTOR_ELT_ORDER_BIG")
kono
parents:
diff changeset
1767 (const_string "4")
kono
parents:
diff changeset
1768 (const_string "12")))])
kono
parents:
diff changeset
1769
kono
parents:
diff changeset
1770 (define_insn "altivec_vsumsws"
kono
parents:
diff changeset
1771 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1772 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1773 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1774 UNSPEC_VSUMSWS))
kono
parents:
diff changeset
1775 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))
kono
parents:
diff changeset
1776 (clobber (match_scratch:V4SI 3 "=v"))]
kono
parents:
diff changeset
1777 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1778 {
kono
parents:
diff changeset
1779 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1780 return "vsumsws %0,%1,%2";
kono
parents:
diff changeset
1781 else
kono
parents:
diff changeset
1782 return "vspltw %3,%2,0\n\tvsumsws %3,%1,%3\n\tvsldoi %0,%3,%3,12";
kono
parents:
diff changeset
1783 }
kono
parents:
diff changeset
1784 [(set_attr "type" "veccomplex")
kono
parents:
diff changeset
1785 (set (attr "length")
kono
parents:
diff changeset
1786 (if_then_else
kono
parents:
diff changeset
1787 (match_test "(VECTOR_ELT_ORDER_BIG)")
kono
parents:
diff changeset
1788 (const_string "4")
kono
parents:
diff changeset
1789 (const_string "12")))])
kono
parents:
diff changeset
1790
kono
parents:
diff changeset
1791 (define_insn "altivec_vsumsws_direct"
kono
parents:
diff changeset
1792 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1793 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1794 (match_operand:V4SI 2 "register_operand" "v")]
kono
parents:
diff changeset
1795 UNSPEC_VSUMSWS_DIRECT))
kono
parents:
diff changeset
1796 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
1797 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1798 "vsumsws %0,%1,%2"
kono
parents:
diff changeset
1799 [(set_attr "type" "veccomplex")])
kono
parents:
diff changeset
1800
kono
parents:
diff changeset
1801 (define_expand "altivec_vspltb"
kono
parents:
diff changeset
1802 [(use (match_operand:V16QI 0 "register_operand" ""))
kono
parents:
diff changeset
1803 (use (match_operand:V16QI 1 "register_operand" ""))
kono
parents:
diff changeset
1804 (use (match_operand:QI 2 "u5bit_cint_operand" ""))]
kono
parents:
diff changeset
1805 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1806 {
kono
parents:
diff changeset
1807 rtvec v;
kono
parents:
diff changeset
1808 rtx x;
kono
parents:
diff changeset
1809
kono
parents:
diff changeset
1810 /* Special handling for LE with -maltivec=be. We have to reflect
kono
parents:
diff changeset
1811 the actual selected index for the splat in the RTL. */
kono
parents:
diff changeset
1812 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1813 operands[2] = GEN_INT (15 - INTVAL (operands[2]));
kono
parents:
diff changeset
1814
kono
parents:
diff changeset
1815 v = gen_rtvec (1, operands[2]);
kono
parents:
diff changeset
1816 x = gen_rtx_VEC_SELECT (QImode, operands[1], gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1817 x = gen_rtx_VEC_DUPLICATE (V16QImode, x);
kono
parents:
diff changeset
1818 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1819 DONE;
kono
parents:
diff changeset
1820 })
kono
parents:
diff changeset
1821
kono
parents:
diff changeset
1822 (define_insn "*altivec_vspltb_internal"
kono
parents:
diff changeset
1823 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1824 (vec_duplicate:V16QI
kono
parents:
diff changeset
1825 (vec_select:QI (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1826 (parallel
kono
parents:
diff changeset
1827 [(match_operand:QI 2 "u5bit_cint_operand" "")]))))]
kono
parents:
diff changeset
1828 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1829 {
kono
parents:
diff changeset
1830 /* For true LE, this adjusts the selected index. For LE with
kono
parents:
diff changeset
1831 -maltivec=be, this reverses what was done in the define_expand
kono
parents:
diff changeset
1832 because the instruction already has big-endian bias. */
kono
parents:
diff changeset
1833 if (!BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1834 operands[2] = GEN_INT (15 - INTVAL (operands[2]));
kono
parents:
diff changeset
1835
kono
parents:
diff changeset
1836 return "vspltb %0,%1,%2";
kono
parents:
diff changeset
1837 }
kono
parents:
diff changeset
1838 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1839
kono
parents:
diff changeset
1840 (define_insn "altivec_vspltb_direct"
kono
parents:
diff changeset
1841 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
1842 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
1843 (match_operand:QI 2 "u5bit_cint_operand" "i")]
kono
parents:
diff changeset
1844 UNSPEC_VSPLT_DIRECT))]
kono
parents:
diff changeset
1845 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1846 "vspltb %0,%1,%2"
kono
parents:
diff changeset
1847 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1848
kono
parents:
diff changeset
1849 (define_expand "altivec_vsplth"
kono
parents:
diff changeset
1850 [(use (match_operand:V8HI 0 "register_operand" ""))
kono
parents:
diff changeset
1851 (use (match_operand:V8HI 1 "register_operand" ""))
kono
parents:
diff changeset
1852 (use (match_operand:QI 2 "u5bit_cint_operand" ""))]
kono
parents:
diff changeset
1853 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1854 {
kono
parents:
diff changeset
1855 rtvec v;
kono
parents:
diff changeset
1856 rtx x;
kono
parents:
diff changeset
1857
kono
parents:
diff changeset
1858 /* Special handling for LE with -maltivec=be. We have to reflect
kono
parents:
diff changeset
1859 the actual selected index for the splat in the RTL. */
kono
parents:
diff changeset
1860 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1861 operands[2] = GEN_INT (7 - INTVAL (operands[2]));
kono
parents:
diff changeset
1862
kono
parents:
diff changeset
1863 v = gen_rtvec (1, operands[2]);
kono
parents:
diff changeset
1864 x = gen_rtx_VEC_SELECT (HImode, operands[1], gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1865 x = gen_rtx_VEC_DUPLICATE (V8HImode, x);
kono
parents:
diff changeset
1866 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1867 DONE;
kono
parents:
diff changeset
1868 })
kono
parents:
diff changeset
1869
kono
parents:
diff changeset
1870 (define_insn "*altivec_vsplth_internal"
kono
parents:
diff changeset
1871 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1872 (vec_duplicate:V8HI
kono
parents:
diff changeset
1873 (vec_select:HI (match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1874 (parallel
kono
parents:
diff changeset
1875 [(match_operand:QI 2 "u5bit_cint_operand" "")]))))]
kono
parents:
diff changeset
1876 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1877 {
kono
parents:
diff changeset
1878 /* For true LE, this adjusts the selected index. For LE with
kono
parents:
diff changeset
1879 -maltivec=be, this reverses what was done in the define_expand
kono
parents:
diff changeset
1880 because the instruction already has big-endian bias. */
kono
parents:
diff changeset
1881 if (!BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1882 operands[2] = GEN_INT (7 - INTVAL (operands[2]));
kono
parents:
diff changeset
1883
kono
parents:
diff changeset
1884 return "vsplth %0,%1,%2";
kono
parents:
diff changeset
1885 }
kono
parents:
diff changeset
1886 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1887
kono
parents:
diff changeset
1888 (define_insn "altivec_vsplth_direct"
kono
parents:
diff changeset
1889 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
1890 (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
1891 (match_operand:QI 2 "u5bit_cint_operand" "i")]
kono
parents:
diff changeset
1892 UNSPEC_VSPLT_DIRECT))]
kono
parents:
diff changeset
1893 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1894 "vsplth %0,%1,%2"
kono
parents:
diff changeset
1895 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1896
kono
parents:
diff changeset
1897 (define_expand "altivec_vspltw"
kono
parents:
diff changeset
1898 [(use (match_operand:V4SI 0 "register_operand" ""))
kono
parents:
diff changeset
1899 (use (match_operand:V4SI 1 "register_operand" ""))
kono
parents:
diff changeset
1900 (use (match_operand:QI 2 "u5bit_cint_operand" ""))]
kono
parents:
diff changeset
1901 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1902 {
kono
parents:
diff changeset
1903 rtvec v;
kono
parents:
diff changeset
1904 rtx x;
kono
parents:
diff changeset
1905
kono
parents:
diff changeset
1906 /* Special handling for LE with -maltivec=be. We have to reflect
kono
parents:
diff changeset
1907 the actual selected index for the splat in the RTL. */
kono
parents:
diff changeset
1908 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1909 operands[2] = GEN_INT (3 - INTVAL (operands[2]));
kono
parents:
diff changeset
1910
kono
parents:
diff changeset
1911 v = gen_rtvec (1, operands[2]);
kono
parents:
diff changeset
1912 x = gen_rtx_VEC_SELECT (SImode, operands[1], gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1913 x = gen_rtx_VEC_DUPLICATE (V4SImode, x);
kono
parents:
diff changeset
1914 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1915 DONE;
kono
parents:
diff changeset
1916 })
kono
parents:
diff changeset
1917
kono
parents:
diff changeset
1918 (define_insn "*altivec_vspltw_internal"
kono
parents:
diff changeset
1919 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1920 (vec_duplicate:V4SI
kono
parents:
diff changeset
1921 (vec_select:SI (match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1922 (parallel
kono
parents:
diff changeset
1923 [(match_operand:QI 2 "u5bit_cint_operand" "i")]))))]
kono
parents:
diff changeset
1924 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1925 {
kono
parents:
diff changeset
1926 /* For true LE, this adjusts the selected index. For LE with
kono
parents:
diff changeset
1927 -maltivec=be, this reverses what was done in the define_expand
kono
parents:
diff changeset
1928 because the instruction already has big-endian bias. */
kono
parents:
diff changeset
1929 if (!BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1930 operands[2] = GEN_INT (3 - INTVAL (operands[2]));
kono
parents:
diff changeset
1931
kono
parents:
diff changeset
1932 return "vspltw %0,%1,%2";
kono
parents:
diff changeset
1933 }
kono
parents:
diff changeset
1934 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1935
kono
parents:
diff changeset
1936 (define_insn "altivec_vspltw_direct"
kono
parents:
diff changeset
1937 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
1938 (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
1939 (match_operand:QI 2 "u5bit_cint_operand" "i")]
kono
parents:
diff changeset
1940 UNSPEC_VSPLT_DIRECT))]
kono
parents:
diff changeset
1941 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1942 "vspltw %0,%1,%2"
kono
parents:
diff changeset
1943 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1944
kono
parents:
diff changeset
1945 (define_expand "altivec_vspltsf"
kono
parents:
diff changeset
1946 [(use (match_operand:V4SF 0 "register_operand" ""))
kono
parents:
diff changeset
1947 (use (match_operand:V4SF 1 "register_operand" ""))
kono
parents:
diff changeset
1948 (use (match_operand:QI 2 "u5bit_cint_operand" ""))]
kono
parents:
diff changeset
1949 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1950 {
kono
parents:
diff changeset
1951 rtvec v;
kono
parents:
diff changeset
1952 rtx x;
kono
parents:
diff changeset
1953
kono
parents:
diff changeset
1954 /* Special handling for LE with -maltivec=be. We have to reflect
kono
parents:
diff changeset
1955 the actual selected index for the splat in the RTL. */
kono
parents:
diff changeset
1956 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
1957 operands[2] = GEN_INT (3 - INTVAL (operands[2]));
kono
parents:
diff changeset
1958
kono
parents:
diff changeset
1959 v = gen_rtvec (1, operands[2]);
kono
parents:
diff changeset
1960 x = gen_rtx_VEC_SELECT (SFmode, operands[1], gen_rtx_PARALLEL (VOIDmode, v));
kono
parents:
diff changeset
1961 x = gen_rtx_VEC_DUPLICATE (V4SFmode, x);
kono
parents:
diff changeset
1962 emit_insn (gen_rtx_SET (operands[0], x));
kono
parents:
diff changeset
1963 DONE;
kono
parents:
diff changeset
1964 })
kono
parents:
diff changeset
1965
kono
parents:
diff changeset
1966 (define_insn "*altivec_vspltsf_internal"
kono
parents:
diff changeset
1967 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
1968 (vec_duplicate:V4SF
kono
parents:
diff changeset
1969 (vec_select:SF (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
1970 (parallel
kono
parents:
diff changeset
1971 [(match_operand:QI 2 "u5bit_cint_operand" "i")]))))]
kono
parents:
diff changeset
1972 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
1973 {
kono
parents:
diff changeset
1974 /* For true LE, this adjusts the selected index. For LE with
kono
parents:
diff changeset
1975 -maltivec=be, this reverses what was done in the define_expand
kono
parents:
diff changeset
1976 because the instruction already has big-endian bias. */
kono
parents:
diff changeset
1977 if (!BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
1978 operands[2] = GEN_INT (3 - INTVAL (operands[2]));
kono
parents:
diff changeset
1979
kono
parents:
diff changeset
1980 return "vspltw %0,%1,%2";
kono
parents:
diff changeset
1981 }
kono
parents:
diff changeset
1982 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1983
kono
parents:
diff changeset
1984 (define_insn "altivec_vspltis<VI_char>"
kono
parents:
diff changeset
1985 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
1986 (vec_duplicate:VI
kono
parents:
diff changeset
1987 (match_operand:QI 1 "s5bit_cint_operand" "i")))]
kono
parents:
diff changeset
1988 "TARGET_ALTIVEC"
kono
parents:
diff changeset
1989 "vspltis<VI_char> %0,%1"
kono
parents:
diff changeset
1990 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
1991
kono
parents:
diff changeset
1992 (define_insn "*altivec_vrfiz"
kono
parents:
diff changeset
1993 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
1994 (fix:V4SF (match_operand:V4SF 1 "register_operand" "v")))]
kono
parents:
diff changeset
1995 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
1996 "vrfiz %0,%1"
kono
parents:
diff changeset
1997 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
1998
kono
parents:
diff changeset
1999 (define_expand "altivec_vperm_<mode>"
kono
parents:
diff changeset
2000 [(set (match_operand:VM 0 "register_operand" "")
kono
parents:
diff changeset
2001 (unspec:VM [(match_operand:VM 1 "register_operand" "")
kono
parents:
diff changeset
2002 (match_operand:VM 2 "register_operand" "")
kono
parents:
diff changeset
2003 (match_operand:V16QI 3 "register_operand" "")]
kono
parents:
diff changeset
2004 UNSPEC_VPERM))]
kono
parents:
diff changeset
2005 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2006 {
kono
parents:
diff changeset
2007 if (!VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2008 {
kono
parents:
diff changeset
2009 altivec_expand_vec_perm_le (operands);
kono
parents:
diff changeset
2010 DONE;
kono
parents:
diff changeset
2011 }
kono
parents:
diff changeset
2012 })
kono
parents:
diff changeset
2013
kono
parents:
diff changeset
2014 ;; Slightly prefer vperm, since the target does not overlap the source
kono
parents:
diff changeset
2015 (define_insn "*altivec_vperm_<mode>_internal"
kono
parents:
diff changeset
2016 [(set (match_operand:VM 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2017 (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2018 (match_operand:VM 2 "register_operand" "v,0")
kono
parents:
diff changeset
2019 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2020 UNSPEC_VPERM))]
kono
parents:
diff changeset
2021 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2022 "@
kono
parents:
diff changeset
2023 vperm %0,%1,%2,%3
kono
parents:
diff changeset
2024 xxperm %x0,%x1,%x3"
kono
parents:
diff changeset
2025 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2026 (set_attr "length" "4")])
kono
parents:
diff changeset
2027
kono
parents:
diff changeset
2028 (define_insn "altivec_vperm_v8hiv16qi"
kono
parents:
diff changeset
2029 [(set (match_operand:V16QI 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2030 (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2031 (match_operand:V8HI 2 "register_operand" "v,0")
kono
parents:
diff changeset
2032 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2033 UNSPEC_VPERM))]
kono
parents:
diff changeset
2034 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2035 "@
kono
parents:
diff changeset
2036 vperm %0,%1,%2,%3
kono
parents:
diff changeset
2037 xxperm %x0,%x1,%x3"
kono
parents:
diff changeset
2038 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2039 (set_attr "length" "4")])
kono
parents:
diff changeset
2040
kono
parents:
diff changeset
2041 (define_expand "altivec_vperm_<mode>_uns"
kono
parents:
diff changeset
2042 [(set (match_operand:VM 0 "register_operand" "")
kono
parents:
diff changeset
2043 (unspec:VM [(match_operand:VM 1 "register_operand" "")
kono
parents:
diff changeset
2044 (match_operand:VM 2 "register_operand" "")
kono
parents:
diff changeset
2045 (match_operand:V16QI 3 "register_operand" "")]
kono
parents:
diff changeset
2046 UNSPEC_VPERM_UNS))]
kono
parents:
diff changeset
2047 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2048 {
kono
parents:
diff changeset
2049 if (!VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2050 {
kono
parents:
diff changeset
2051 altivec_expand_vec_perm_le (operands);
kono
parents:
diff changeset
2052 DONE;
kono
parents:
diff changeset
2053 }
kono
parents:
diff changeset
2054 })
kono
parents:
diff changeset
2055
kono
parents:
diff changeset
2056 (define_insn "*altivec_vperm_<mode>_uns_internal"
kono
parents:
diff changeset
2057 [(set (match_operand:VM 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2058 (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2059 (match_operand:VM 2 "register_operand" "v,0")
kono
parents:
diff changeset
2060 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2061 UNSPEC_VPERM_UNS))]
kono
parents:
diff changeset
2062 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2063 "@
kono
parents:
diff changeset
2064 vperm %0,%1,%2,%3
kono
parents:
diff changeset
2065 xxperm %x0,%x1,%x3"
kono
parents:
diff changeset
2066 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2067 (set_attr "length" "4")])
kono
parents:
diff changeset
2068
kono
parents:
diff changeset
2069 (define_expand "vec_permv16qi"
kono
parents:
diff changeset
2070 [(set (match_operand:V16QI 0 "register_operand" "")
kono
parents:
diff changeset
2071 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "")
kono
parents:
diff changeset
2072 (match_operand:V16QI 2 "register_operand" "")
kono
parents:
diff changeset
2073 (match_operand:V16QI 3 "register_operand" "")]
kono
parents:
diff changeset
2074 UNSPEC_VPERM))]
kono
parents:
diff changeset
2075 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2076 {
kono
parents:
diff changeset
2077 if (!BYTES_BIG_ENDIAN) {
kono
parents:
diff changeset
2078 altivec_expand_vec_perm_le (operands);
kono
parents:
diff changeset
2079 DONE;
kono
parents:
diff changeset
2080 }
kono
parents:
diff changeset
2081 })
kono
parents:
diff changeset
2082
kono
parents:
diff changeset
2083 (define_insn "*altivec_vpermr_<mode>_internal"
kono
parents:
diff changeset
2084 [(set (match_operand:VM 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2085 (unspec:VM [(match_operand:VM 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2086 (match_operand:VM 2 "register_operand" "v,0")
kono
parents:
diff changeset
2087 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2088 UNSPEC_VPERMR))]
kono
parents:
diff changeset
2089 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
2090 "@
kono
parents:
diff changeset
2091 vpermr %0,%2,%1,%3
kono
parents:
diff changeset
2092 xxpermr %x0,%x1,%x3"
kono
parents:
diff changeset
2093 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2094 (set_attr "length" "4")])
kono
parents:
diff changeset
2095
kono
parents:
diff changeset
2096 (define_insn "altivec_vrfip" ; ceil
kono
parents:
diff changeset
2097 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2098 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2099 UNSPEC_FRIP))]
kono
parents:
diff changeset
2100 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2101 "vrfip %0,%1"
kono
parents:
diff changeset
2102 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2103
kono
parents:
diff changeset
2104 (define_insn "altivec_vrfin"
kono
parents:
diff changeset
2105 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2106 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2107 UNSPEC_VRFIN))]
kono
parents:
diff changeset
2108 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2109 "vrfin %0,%1"
kono
parents:
diff changeset
2110 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2111
kono
parents:
diff changeset
2112 (define_insn "*altivec_vrfim" ; floor
kono
parents:
diff changeset
2113 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2114 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2115 UNSPEC_FRIM))]
kono
parents:
diff changeset
2116 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2117 "vrfim %0,%1"
kono
parents:
diff changeset
2118 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2119
kono
parents:
diff changeset
2120 (define_insn "altivec_vcfux"
kono
parents:
diff changeset
2121 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2122 (unspec:V4SF [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
2123 (match_operand:QI 2 "immediate_operand" "i")]
kono
parents:
diff changeset
2124 UNSPEC_VCFUX))]
kono
parents:
diff changeset
2125 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2126 "vcfux %0,%1,%2"
kono
parents:
diff changeset
2127 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2128
kono
parents:
diff changeset
2129 (define_insn "altivec_vcfsx"
kono
parents:
diff changeset
2130 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2131 (unspec:V4SF [(match_operand:V4SI 1 "register_operand" "v")
kono
parents:
diff changeset
2132 (match_operand:QI 2 "immediate_operand" "i")]
kono
parents:
diff changeset
2133 UNSPEC_VCFSX))]
kono
parents:
diff changeset
2134 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2135 "vcfsx %0,%1,%2"
kono
parents:
diff changeset
2136 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2137
kono
parents:
diff changeset
2138 (define_insn "altivec_vctuxs"
kono
parents:
diff changeset
2139 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2140 (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2141 (match_operand:QI 2 "immediate_operand" "i")]
kono
parents:
diff changeset
2142 UNSPEC_VCTUXS))
kono
parents:
diff changeset
2143 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
2144 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2145 "vctuxs %0,%1,%2"
kono
parents:
diff changeset
2146 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2147
kono
parents:
diff changeset
2148 (define_insn "altivec_vctsxs"
kono
parents:
diff changeset
2149 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2150 (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2151 (match_operand:QI 2 "immediate_operand" "i")]
kono
parents:
diff changeset
2152 UNSPEC_VCTSXS))
kono
parents:
diff changeset
2153 (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
kono
parents:
diff changeset
2154 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2155 "vctsxs %0,%1,%2"
kono
parents:
diff changeset
2156 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2157
kono
parents:
diff changeset
2158 (define_insn "altivec_vlogefp"
kono
parents:
diff changeset
2159 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2160 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2161 UNSPEC_VLOGEFP))]
kono
parents:
diff changeset
2162 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2163 "vlogefp %0,%1"
kono
parents:
diff changeset
2164 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2165
kono
parents:
diff changeset
2166 (define_insn "altivec_vexptefp"
kono
parents:
diff changeset
2167 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2168 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2169 UNSPEC_VEXPTEFP))]
kono
parents:
diff changeset
2170 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2171 "vexptefp %0,%1"
kono
parents:
diff changeset
2172 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2173
kono
parents:
diff changeset
2174 (define_insn "*altivec_vrsqrtefp"
kono
parents:
diff changeset
2175 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2176 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2177 UNSPEC_RSQRT))]
kono
parents:
diff changeset
2178 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2179 "vrsqrtefp %0,%1"
kono
parents:
diff changeset
2180 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2181
kono
parents:
diff changeset
2182 (define_insn "altivec_vrefp"
kono
parents:
diff changeset
2183 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2184 (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
kono
parents:
diff changeset
2185 UNSPEC_FRES))]
kono
parents:
diff changeset
2186 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2187 "vrefp %0,%1"
kono
parents:
diff changeset
2188 [(set_attr "type" "vecfloat")])
kono
parents:
diff changeset
2189
kono
parents:
diff changeset
2190 (define_expand "altivec_copysign_v4sf3"
kono
parents:
diff changeset
2191 [(use (match_operand:V4SF 0 "register_operand" ""))
kono
parents:
diff changeset
2192 (use (match_operand:V4SF 1 "register_operand" ""))
kono
parents:
diff changeset
2193 (use (match_operand:V4SF 2 "register_operand" ""))]
kono
parents:
diff changeset
2194 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2195 "
kono
parents:
diff changeset
2196 {
kono
parents:
diff changeset
2197 rtx mask = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2198 rtvec v = rtvec_alloc (4);
kono
parents:
diff changeset
2199 unsigned HOST_WIDE_INT mask_val = ((unsigned HOST_WIDE_INT)1) << 31;
kono
parents:
diff changeset
2200
kono
parents:
diff changeset
2201 RTVEC_ELT (v, 0) = GEN_INT (mask_val);
kono
parents:
diff changeset
2202 RTVEC_ELT (v, 1) = GEN_INT (mask_val);
kono
parents:
diff changeset
2203 RTVEC_ELT (v, 2) = GEN_INT (mask_val);
kono
parents:
diff changeset
2204 RTVEC_ELT (v, 3) = GEN_INT (mask_val);
kono
parents:
diff changeset
2205
kono
parents:
diff changeset
2206 emit_insn (gen_vec_initv4sisi (mask, gen_rtx_PARALLEL (V4SImode, v)));
kono
parents:
diff changeset
2207 emit_insn (gen_vector_select_v4sf (operands[0], operands[1], operands[2],
kono
parents:
diff changeset
2208 gen_lowpart (V4SFmode, mask)));
kono
parents:
diff changeset
2209 DONE;
kono
parents:
diff changeset
2210 }")
kono
parents:
diff changeset
2211
kono
parents:
diff changeset
2212 (define_insn "altivec_vsldoi_<mode>"
kono
parents:
diff changeset
2213 [(set (match_operand:VM 0 "register_operand" "=v")
kono
parents:
diff changeset
2214 (unspec:VM [(match_operand:VM 1 "register_operand" "v")
kono
parents:
diff changeset
2215 (match_operand:VM 2 "register_operand" "v")
kono
parents:
diff changeset
2216 (match_operand:QI 3 "immediate_operand" "i")]
kono
parents:
diff changeset
2217 UNSPEC_VSLDOI))]
kono
parents:
diff changeset
2218 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2219 "vsldoi %0,%1,%2,%3"
kono
parents:
diff changeset
2220 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2221
kono
parents:
diff changeset
2222 (define_insn "altivec_vupkhs<VU_char>"
kono
parents:
diff changeset
2223 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2224 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2225 UNSPEC_VUNPACK_HI_SIGN))]
kono
parents:
diff changeset
2226 "<VI_unit>"
kono
parents:
diff changeset
2227 {
kono
parents:
diff changeset
2228 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2229 return "vupkhs<VU_char> %0,%1";
kono
parents:
diff changeset
2230 else
kono
parents:
diff changeset
2231 return "vupkls<VU_char> %0,%1";
kono
parents:
diff changeset
2232 }
kono
parents:
diff changeset
2233 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2234
kono
parents:
diff changeset
2235 (define_insn "*altivec_vupkhs<VU_char>_direct"
kono
parents:
diff changeset
2236 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2237 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2238 UNSPEC_VUNPACK_HI_SIGN_DIRECT))]
kono
parents:
diff changeset
2239 "<VI_unit>"
kono
parents:
diff changeset
2240 "vupkhs<VU_char> %0,%1"
kono
parents:
diff changeset
2241 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2242
kono
parents:
diff changeset
2243 (define_insn "altivec_vupkls<VU_char>"
kono
parents:
diff changeset
2244 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2245 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2246 UNSPEC_VUNPACK_LO_SIGN))]
kono
parents:
diff changeset
2247 "<VI_unit>"
kono
parents:
diff changeset
2248 {
kono
parents:
diff changeset
2249 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2250 return "vupkls<VU_char> %0,%1";
kono
parents:
diff changeset
2251 else
kono
parents:
diff changeset
2252 return "vupkhs<VU_char> %0,%1";
kono
parents:
diff changeset
2253 }
kono
parents:
diff changeset
2254 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2255
kono
parents:
diff changeset
2256 (define_insn "*altivec_vupkls<VU_char>_direct"
kono
parents:
diff changeset
2257 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2258 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2259 UNSPEC_VUNPACK_LO_SIGN_DIRECT))]
kono
parents:
diff changeset
2260 "<VI_unit>"
kono
parents:
diff changeset
2261 "vupkls<VU_char> %0,%1"
kono
parents:
diff changeset
2262 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2263
kono
parents:
diff changeset
2264 (define_insn "altivec_vupkhpx"
kono
parents:
diff changeset
2265 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2266 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
kono
parents:
diff changeset
2267 UNSPEC_VUPKHPX))]
kono
parents:
diff changeset
2268 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2269 {
kono
parents:
diff changeset
2270 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2271 return "vupkhpx %0,%1";
kono
parents:
diff changeset
2272 else
kono
parents:
diff changeset
2273 return "vupklpx %0,%1";
kono
parents:
diff changeset
2274 }
kono
parents:
diff changeset
2275 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2276
kono
parents:
diff changeset
2277 (define_insn "altivec_vupklpx"
kono
parents:
diff changeset
2278 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2279 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
kono
parents:
diff changeset
2280 UNSPEC_VUPKLPX))]
kono
parents:
diff changeset
2281 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2282 {
kono
parents:
diff changeset
2283 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2284 return "vupklpx %0,%1";
kono
parents:
diff changeset
2285 else
kono
parents:
diff changeset
2286 return "vupkhpx %0,%1";
kono
parents:
diff changeset
2287 }
kono
parents:
diff changeset
2288 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
2289
kono
parents:
diff changeset
2290 ;; Compare vectors producing a vector result and a predicate, setting CR6 to
kono
parents:
diff changeset
2291 ;; indicate a combined status
kono
parents:
diff changeset
2292 (define_insn "*altivec_vcmpequ<VI_char>_p"
kono
parents:
diff changeset
2293 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2294 (unspec:CC [(eq:CC (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
2295 (match_operand:VI2 2 "register_operand" "v"))]
kono
parents:
diff changeset
2296 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2297 (set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
2298 (eq:VI2 (match_dup 1)
kono
parents:
diff changeset
2299 (match_dup 2)))]
kono
parents:
diff changeset
2300 "<VI_unit>"
kono
parents:
diff changeset
2301 "vcmpequ<VI_char>. %0,%1,%2"
kono
parents:
diff changeset
2302 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
2303
kono
parents:
diff changeset
2304 (define_insn "*altivec_vcmpgts<VI_char>_p"
kono
parents:
diff changeset
2305 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2306 (unspec:CC [(gt:CC (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
2307 (match_operand:VI2 2 "register_operand" "v"))]
kono
parents:
diff changeset
2308 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2309 (set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
2310 (gt:VI2 (match_dup 1)
kono
parents:
diff changeset
2311 (match_dup 2)))]
kono
parents:
diff changeset
2312 "<VI_unit>"
kono
parents:
diff changeset
2313 "vcmpgts<VI_char>. %0,%1,%2"
kono
parents:
diff changeset
2314 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
2315
kono
parents:
diff changeset
2316 (define_insn "*altivec_vcmpgtu<VI_char>_p"
kono
parents:
diff changeset
2317 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2318 (unspec:CC [(gtu:CC (match_operand:VI2 1 "register_operand" "v")
kono
parents:
diff changeset
2319 (match_operand:VI2 2 "register_operand" "v"))]
kono
parents:
diff changeset
2320 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2321 (set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
2322 (gtu:VI2 (match_dup 1)
kono
parents:
diff changeset
2323 (match_dup 2)))]
kono
parents:
diff changeset
2324 "<VI_unit>"
kono
parents:
diff changeset
2325 "vcmpgtu<VI_char>. %0,%1,%2"
kono
parents:
diff changeset
2326 [(set_attr "type" "veccmpfx")])
kono
parents:
diff changeset
2327
kono
parents:
diff changeset
2328 (define_insn "*altivec_vcmpeqfp_p"
kono
parents:
diff changeset
2329 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2330 (unspec:CC [(eq:CC (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2331 (match_operand:V4SF 2 "register_operand" "v"))]
kono
parents:
diff changeset
2332 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2333 (set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2334 (eq:V4SF (match_dup 1)
kono
parents:
diff changeset
2335 (match_dup 2)))]
kono
parents:
diff changeset
2336 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2337 "vcmpeqfp. %0,%1,%2"
kono
parents:
diff changeset
2338 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
2339
kono
parents:
diff changeset
2340 (define_insn "*altivec_vcmpgtfp_p"
kono
parents:
diff changeset
2341 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2342 (unspec:CC [(gt:CC (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2343 (match_operand:V4SF 2 "register_operand" "v"))]
kono
parents:
diff changeset
2344 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2345 (set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2346 (gt:V4SF (match_dup 1)
kono
parents:
diff changeset
2347 (match_dup 2)))]
kono
parents:
diff changeset
2348 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2349 "vcmpgtfp. %0,%1,%2"
kono
parents:
diff changeset
2350 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
2351
kono
parents:
diff changeset
2352 (define_insn "*altivec_vcmpgefp_p"
kono
parents:
diff changeset
2353 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2354 (unspec:CC [(ge:CC (match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2355 (match_operand:V4SF 2 "register_operand" "v"))]
kono
parents:
diff changeset
2356 UNSPEC_PREDICATE))
kono
parents:
diff changeset
2357 (set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2358 (ge:V4SF (match_dup 1)
kono
parents:
diff changeset
2359 (match_dup 2)))]
kono
parents:
diff changeset
2360 "VECTOR_UNIT_ALTIVEC_P (V4SFmode)"
kono
parents:
diff changeset
2361 "vcmpgefp. %0,%1,%2"
kono
parents:
diff changeset
2362 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
2363
kono
parents:
diff changeset
2364 (define_insn "altivec_vcmpbfp_p"
kono
parents:
diff changeset
2365 [(set (reg:CC CR6_REGNO)
kono
parents:
diff changeset
2366 (unspec:CC [(match_operand:V4SF 1 "register_operand" "v")
kono
parents:
diff changeset
2367 (match_operand:V4SF 2 "register_operand" "v")]
kono
parents:
diff changeset
2368 UNSPEC_VCMPBFP))
kono
parents:
diff changeset
2369 (set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2370 (unspec:V4SF [(match_dup 1)
kono
parents:
diff changeset
2371 (match_dup 2)]
kono
parents:
diff changeset
2372 UNSPEC_VCMPBFP))]
kono
parents:
diff changeset
2373 "VECTOR_UNIT_ALTIVEC_OR_VSX_P (V4SFmode)"
kono
parents:
diff changeset
2374 "vcmpbfp. %0,%1,%2"
kono
parents:
diff changeset
2375 [(set_attr "type" "veccmp")])
kono
parents:
diff changeset
2376
kono
parents:
diff changeset
2377 (define_insn "altivec_mtvscr"
kono
parents:
diff changeset
2378 [(set (reg:SI VSCR_REGNO)
kono
parents:
diff changeset
2379 (unspec_volatile:SI
kono
parents:
diff changeset
2380 [(match_operand:V4SI 0 "register_operand" "v")] UNSPECV_MTVSCR))]
kono
parents:
diff changeset
2381 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2382 "mtvscr %0"
kono
parents:
diff changeset
2383 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2384
kono
parents:
diff changeset
2385 (define_insn "altivec_mfvscr"
kono
parents:
diff changeset
2386 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
2387 (unspec_volatile:V8HI [(reg:SI VSCR_REGNO)] UNSPECV_MFVSCR))]
kono
parents:
diff changeset
2388 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2389 "mfvscr %0"
kono
parents:
diff changeset
2390 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2391
kono
parents:
diff changeset
2392 (define_insn "altivec_dssall"
kono
parents:
diff changeset
2393 [(unspec_volatile [(const_int 0)] UNSPECV_DSSALL)]
kono
parents:
diff changeset
2394 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2395 "dssall"
kono
parents:
diff changeset
2396 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2397
kono
parents:
diff changeset
2398 (define_insn "altivec_dss"
kono
parents:
diff changeset
2399 [(unspec_volatile [(match_operand:QI 0 "immediate_operand" "i")]
kono
parents:
diff changeset
2400 UNSPECV_DSS)]
kono
parents:
diff changeset
2401 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2402 "dss %0"
kono
parents:
diff changeset
2403 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2404
kono
parents:
diff changeset
2405 (define_insn "altivec_dst"
kono
parents:
diff changeset
2406 [(unspec [(match_operand 0 "register_operand" "b")
kono
parents:
diff changeset
2407 (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2408 (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DST)]
kono
parents:
diff changeset
2409 "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
kono
parents:
diff changeset
2410 "dst %0,%1,%2"
kono
parents:
diff changeset
2411 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2412
kono
parents:
diff changeset
2413 (define_insn "altivec_dstt"
kono
parents:
diff changeset
2414 [(unspec [(match_operand 0 "register_operand" "b")
kono
parents:
diff changeset
2415 (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2416 (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTT)]
kono
parents:
diff changeset
2417 "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
kono
parents:
diff changeset
2418 "dstt %0,%1,%2"
kono
parents:
diff changeset
2419 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2420
kono
parents:
diff changeset
2421 (define_insn "altivec_dstst"
kono
parents:
diff changeset
2422 [(unspec [(match_operand 0 "register_operand" "b")
kono
parents:
diff changeset
2423 (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2424 (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTST)]
kono
parents:
diff changeset
2425 "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
kono
parents:
diff changeset
2426 "dstst %0,%1,%2"
kono
parents:
diff changeset
2427 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2428
kono
parents:
diff changeset
2429 (define_insn "altivec_dststt"
kono
parents:
diff changeset
2430 [(unspec [(match_operand 0 "register_operand" "b")
kono
parents:
diff changeset
2431 (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2432 (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTSTT)]
kono
parents:
diff changeset
2433 "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
kono
parents:
diff changeset
2434 "dststt %0,%1,%2"
kono
parents:
diff changeset
2435 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2436
kono
parents:
diff changeset
2437 (define_expand "altivec_lvsl"
kono
parents:
diff changeset
2438 [(use (match_operand:V16QI 0 "register_operand" ""))
kono
parents:
diff changeset
2439 (use (match_operand:V16QI 1 "memory_operand" ""))]
kono
parents:
diff changeset
2440 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2441 {
kono
parents:
diff changeset
2442 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2443 emit_insn (gen_altivec_lvsl_direct (operands[0], operands[1]));
kono
parents:
diff changeset
2444 else
kono
parents:
diff changeset
2445 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2446 rtx mask, constv, vperm;
111
kono
parents:
diff changeset
2447 mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2448 emit_insn (gen_altivec_lvsl_direct (mask, operands[1]));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2449 constv = gen_const_vec_series (V16QImode, const0_rtx, const1_rtx);
111
kono
parents:
diff changeset
2450 constv = force_reg (V16QImode, constv);
kono
parents:
diff changeset
2451 vperm = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, mask, mask, constv),
kono
parents:
diff changeset
2452 UNSPEC_VPERM);
kono
parents:
diff changeset
2453 emit_insn (gen_rtx_SET (operands[0], vperm));
kono
parents:
diff changeset
2454 }
kono
parents:
diff changeset
2455 DONE;
kono
parents:
diff changeset
2456 })
kono
parents:
diff changeset
2457
kono
parents:
diff changeset
2458 (define_insn "altivec_lvsl_direct"
kono
parents:
diff changeset
2459 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
2460 (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "Z")]
kono
parents:
diff changeset
2461 UNSPEC_LVSL))]
kono
parents:
diff changeset
2462 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2463 "lvsl %0,%y1"
kono
parents:
diff changeset
2464 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2465
kono
parents:
diff changeset
2466 (define_expand "altivec_lvsr"
kono
parents:
diff changeset
2467 [(use (match_operand:V16QI 0 "register_operand" ""))
kono
parents:
diff changeset
2468 (use (match_operand:V16QI 1 "memory_operand" ""))]
kono
parents:
diff changeset
2469 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2470 {
kono
parents:
diff changeset
2471 if (VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2472 emit_insn (gen_altivec_lvsr_direct (operands[0], operands[1]));
kono
parents:
diff changeset
2473 else
kono
parents:
diff changeset
2474 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2475 rtx mask, constv, vperm;
111
kono
parents:
diff changeset
2476 mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2477 emit_insn (gen_altivec_lvsr_direct (mask, operands[1]));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2478 constv = gen_const_vec_series (V16QImode, const0_rtx, const1_rtx);
111
kono
parents:
diff changeset
2479 constv = force_reg (V16QImode, constv);
kono
parents:
diff changeset
2480 vperm = gen_rtx_UNSPEC (V16QImode, gen_rtvec (3, mask, mask, constv),
kono
parents:
diff changeset
2481 UNSPEC_VPERM);
kono
parents:
diff changeset
2482 emit_insn (gen_rtx_SET (operands[0], vperm));
kono
parents:
diff changeset
2483 }
kono
parents:
diff changeset
2484 DONE;
kono
parents:
diff changeset
2485 })
kono
parents:
diff changeset
2486
kono
parents:
diff changeset
2487 (define_insn "altivec_lvsr_direct"
kono
parents:
diff changeset
2488 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
2489 (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "Z")]
kono
parents:
diff changeset
2490 UNSPEC_LVSR))]
kono
parents:
diff changeset
2491 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2492 "lvsr %0,%y1"
kono
parents:
diff changeset
2493 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2494
kono
parents:
diff changeset
2495 (define_expand "build_vector_mask_for_load"
kono
parents:
diff changeset
2496 [(set (match_operand:V16QI 0 "register_operand" "")
kono
parents:
diff changeset
2497 (unspec:V16QI [(match_operand 1 "memory_operand" "")] UNSPEC_LVSR))]
kono
parents:
diff changeset
2498 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2499 "
kono
parents:
diff changeset
2500 {
kono
parents:
diff changeset
2501 rtx addr;
kono
parents:
diff changeset
2502 rtx temp;
kono
parents:
diff changeset
2503
kono
parents:
diff changeset
2504 gcc_assert (GET_CODE (operands[1]) == MEM);
kono
parents:
diff changeset
2505
kono
parents:
diff changeset
2506 addr = XEXP (operands[1], 0);
kono
parents:
diff changeset
2507 temp = gen_reg_rtx (GET_MODE (addr));
kono
parents:
diff changeset
2508 emit_insn (gen_rtx_SET (temp, gen_rtx_NEG (GET_MODE (addr), addr)));
kono
parents:
diff changeset
2509 emit_insn (gen_altivec_lvsr (operands[0],
kono
parents:
diff changeset
2510 replace_equiv_address (operands[1], temp)));
kono
parents:
diff changeset
2511 DONE;
kono
parents:
diff changeset
2512 }")
kono
parents:
diff changeset
2513
kono
parents:
diff changeset
2514 ;; Parallel some of the LVE* and STV*'s with unspecs because some have
kono
parents:
diff changeset
2515 ;; identical rtl but different instructions-- and gcc gets confused.
kono
parents:
diff changeset
2516
kono
parents:
diff changeset
2517 (define_expand "altivec_lve<VI_char>x"
kono
parents:
diff changeset
2518 [(parallel
kono
parents:
diff changeset
2519 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
2520 (match_operand:VI 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2521 (unspec [(const_int 0)] UNSPEC_LVE)])]
kono
parents:
diff changeset
2522 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2523 {
kono
parents:
diff changeset
2524 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2525 {
kono
parents:
diff changeset
2526 altivec_expand_lvx_be (operands[0], operands[1], <MODE>mode, UNSPEC_LVE);
kono
parents:
diff changeset
2527 DONE;
kono
parents:
diff changeset
2528 }
kono
parents:
diff changeset
2529 })
kono
parents:
diff changeset
2530
kono
parents:
diff changeset
2531 (define_insn "*altivec_lve<VI_char>x_internal"
kono
parents:
diff changeset
2532 [(parallel
kono
parents:
diff changeset
2533 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
2534 (match_operand:VI 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2535 (unspec [(const_int 0)] UNSPEC_LVE)])]
kono
parents:
diff changeset
2536 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2537 "lve<VI_char>x %0,%y1"
kono
parents:
diff changeset
2538 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2539
kono
parents:
diff changeset
2540 (define_insn "*altivec_lvesfx"
kono
parents:
diff changeset
2541 [(parallel
kono
parents:
diff changeset
2542 [(set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2543 (match_operand:V4SF 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2544 (unspec [(const_int 0)] UNSPEC_LVE)])]
kono
parents:
diff changeset
2545 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2546 "lvewx %0,%y1"
kono
parents:
diff changeset
2547 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2548
kono
parents:
diff changeset
2549 (define_expand "altivec_lvxl_<mode>"
kono
parents:
diff changeset
2550 [(parallel
kono
parents:
diff changeset
2551 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2552 (match_operand:VM2 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2553 (unspec [(const_int 0)] UNSPEC_SET_VSCR)])]
kono
parents:
diff changeset
2554 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2555 {
kono
parents:
diff changeset
2556 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2557 {
kono
parents:
diff changeset
2558 altivec_expand_lvx_be (operands[0], operands[1], <MODE>mode, UNSPEC_SET_VSCR);
kono
parents:
diff changeset
2559 DONE;
kono
parents:
diff changeset
2560 }
kono
parents:
diff changeset
2561 })
kono
parents:
diff changeset
2562
kono
parents:
diff changeset
2563 (define_insn "*altivec_lvxl_<mode>_internal"
kono
parents:
diff changeset
2564 [(parallel
kono
parents:
diff changeset
2565 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2566 (match_operand:VM2 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2567 (unspec [(const_int 0)] UNSPEC_SET_VSCR)])]
kono
parents:
diff changeset
2568 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2569 "lvxl %0,%y1"
kono
parents:
diff changeset
2570 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2571
kono
parents:
diff changeset
2572 ; This version of lvx is used only in cases where we need to force an lvx
kono
parents:
diff changeset
2573 ; over any other load, and we don't care about losing CSE opportunities.
kono
parents:
diff changeset
2574 ; Its primary use is for prologue register saves.
kono
parents:
diff changeset
2575 (define_insn "altivec_lvx_<mode>_internal"
kono
parents:
diff changeset
2576 [(parallel
kono
parents:
diff changeset
2577 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2578 (match_operand:VM2 1 "memory_operand" "Z"))
kono
parents:
diff changeset
2579 (unspec [(const_int 0)] UNSPEC_LVX)])]
kono
parents:
diff changeset
2580 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2581 "lvx %0,%y1"
kono
parents:
diff changeset
2582 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2583
kono
parents:
diff changeset
2584 ; The next two patterns embody what lvx should usually look like.
kono
parents:
diff changeset
2585 (define_insn "altivec_lvx_<mode>_2op"
kono
parents:
diff changeset
2586 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2587 (mem:VM2 (and:DI (plus:DI (match_operand:DI 1 "register_operand" "b")
kono
parents:
diff changeset
2588 (match_operand:DI 2 "register_operand" "r"))
kono
parents:
diff changeset
2589 (const_int -16))))]
kono
parents:
diff changeset
2590 "TARGET_ALTIVEC && TARGET_64BIT"
kono
parents:
diff changeset
2591 "lvx %0,%1,%2"
kono
parents:
diff changeset
2592 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2593
kono
parents:
diff changeset
2594 (define_insn "altivec_lvx_<mode>_1op"
kono
parents:
diff changeset
2595 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2596 (mem:VM2 (and:DI (match_operand:DI 1 "register_operand" "r")
kono
parents:
diff changeset
2597 (const_int -16))))]
kono
parents:
diff changeset
2598 "TARGET_ALTIVEC && TARGET_64BIT"
kono
parents:
diff changeset
2599 "lvx %0,0,%1"
kono
parents:
diff changeset
2600 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2601
kono
parents:
diff changeset
2602 ; 32-bit versions of the above.
kono
parents:
diff changeset
2603 (define_insn "altivec_lvx_<mode>_2op_si"
kono
parents:
diff changeset
2604 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2605 (mem:VM2 (and:SI (plus:SI (match_operand:SI 1 "register_operand" "b")
kono
parents:
diff changeset
2606 (match_operand:SI 2 "register_operand" "r"))
kono
parents:
diff changeset
2607 (const_int -16))))]
kono
parents:
diff changeset
2608 "TARGET_ALTIVEC && TARGET_32BIT"
kono
parents:
diff changeset
2609 "lvx %0,%1,%2"
kono
parents:
diff changeset
2610 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2611
kono
parents:
diff changeset
2612 (define_insn "altivec_lvx_<mode>_1op_si"
kono
parents:
diff changeset
2613 [(set (match_operand:VM2 0 "register_operand" "=v")
kono
parents:
diff changeset
2614 (mem:VM2 (and:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2615 (const_int -16))))]
kono
parents:
diff changeset
2616 "TARGET_ALTIVEC && TARGET_32BIT"
kono
parents:
diff changeset
2617 "lvx %0,0,%1"
kono
parents:
diff changeset
2618 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
2619
kono
parents:
diff changeset
2620 ; This version of stvx is used only in cases where we need to force an stvx
kono
parents:
diff changeset
2621 ; over any other store, and we don't care about losing CSE opportunities.
kono
parents:
diff changeset
2622 ; Its primary use is for epilogue register restores.
kono
parents:
diff changeset
2623 (define_insn "altivec_stvx_<mode>_internal"
kono
parents:
diff changeset
2624 [(parallel
kono
parents:
diff changeset
2625 [(set (match_operand:VM2 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2626 (match_operand:VM2 1 "register_operand" "v"))
kono
parents:
diff changeset
2627 (unspec [(const_int 0)] UNSPEC_STVX)])]
kono
parents:
diff changeset
2628 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2629 "stvx %1,%y0"
kono
parents:
diff changeset
2630 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2631
kono
parents:
diff changeset
2632 ; The next two patterns embody what stvx should usually look like.
kono
parents:
diff changeset
2633 (define_insn "altivec_stvx_<mode>_2op"
kono
parents:
diff changeset
2634 [(set (mem:VM2 (and:DI (plus:DI (match_operand:DI 1 "register_operand" "b")
kono
parents:
diff changeset
2635 (match_operand:DI 2 "register_operand" "r"))
kono
parents:
diff changeset
2636 (const_int -16)))
kono
parents:
diff changeset
2637 (match_operand:VM2 0 "register_operand" "v"))]
kono
parents:
diff changeset
2638 "TARGET_ALTIVEC && TARGET_64BIT"
kono
parents:
diff changeset
2639 "stvx %0,%1,%2"
kono
parents:
diff changeset
2640 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2641
kono
parents:
diff changeset
2642 (define_insn "altivec_stvx_<mode>_1op"
kono
parents:
diff changeset
2643 [(set (mem:VM2 (and:DI (match_operand:DI 1 "register_operand" "r")
kono
parents:
diff changeset
2644 (const_int -16)))
kono
parents:
diff changeset
2645 (match_operand:VM2 0 "register_operand" "v"))]
kono
parents:
diff changeset
2646 "TARGET_ALTIVEC && TARGET_64BIT"
kono
parents:
diff changeset
2647 "stvx %0,0,%1"
kono
parents:
diff changeset
2648 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2649
kono
parents:
diff changeset
2650 ; 32-bit versions of the above.
kono
parents:
diff changeset
2651 (define_insn "altivec_stvx_<mode>_2op_si"
kono
parents:
diff changeset
2652 [(set (mem:VM2 (and:SI (plus:SI (match_operand:SI 1 "register_operand" "b")
kono
parents:
diff changeset
2653 (match_operand:SI 2 "register_operand" "r"))
kono
parents:
diff changeset
2654 (const_int -16)))
kono
parents:
diff changeset
2655 (match_operand:VM2 0 "register_operand" "v"))]
kono
parents:
diff changeset
2656 "TARGET_ALTIVEC && TARGET_32BIT"
kono
parents:
diff changeset
2657 "stvx %0,%1,%2"
kono
parents:
diff changeset
2658 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2659
kono
parents:
diff changeset
2660 (define_insn "altivec_stvx_<mode>_1op_si"
kono
parents:
diff changeset
2661 [(set (mem:VM2 (and:SI (match_operand:SI 1 "register_operand" "r")
kono
parents:
diff changeset
2662 (const_int -16)))
kono
parents:
diff changeset
2663 (match_operand:VM2 0 "register_operand" "v"))]
kono
parents:
diff changeset
2664 "TARGET_ALTIVEC && TARGET_32BIT"
kono
parents:
diff changeset
2665 "stvx %0,0,%1"
kono
parents:
diff changeset
2666 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2667
kono
parents:
diff changeset
2668 (define_expand "altivec_stvxl_<mode>"
kono
parents:
diff changeset
2669 [(parallel
kono
parents:
diff changeset
2670 [(set (match_operand:VM2 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2671 (match_operand:VM2 1 "register_operand" "v"))
kono
parents:
diff changeset
2672 (unspec [(const_int 0)] UNSPEC_STVXL)])]
kono
parents:
diff changeset
2673 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2674 {
kono
parents:
diff changeset
2675 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2676 {
kono
parents:
diff changeset
2677 altivec_expand_stvx_be (operands[0], operands[1], <MODE>mode, UNSPEC_STVXL);
kono
parents:
diff changeset
2678 DONE;
kono
parents:
diff changeset
2679 }
kono
parents:
diff changeset
2680 })
kono
parents:
diff changeset
2681
kono
parents:
diff changeset
2682 (define_insn "*altivec_stvxl_<mode>_internal"
kono
parents:
diff changeset
2683 [(parallel
kono
parents:
diff changeset
2684 [(set (match_operand:VM2 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2685 (match_operand:VM2 1 "register_operand" "v"))
kono
parents:
diff changeset
2686 (unspec [(const_int 0)] UNSPEC_STVXL)])]
kono
parents:
diff changeset
2687 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2688 "stvxl %1,%y0"
kono
parents:
diff changeset
2689 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2690
kono
parents:
diff changeset
2691 (define_expand "altivec_stve<VI_char>x"
kono
parents:
diff changeset
2692 [(set (match_operand:<VI_scalar> 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2693 (unspec:<VI_scalar> [(match_operand:VI 1 "register_operand" "v")] UNSPEC_STVE))]
kono
parents:
diff changeset
2694 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2695 {
kono
parents:
diff changeset
2696 if (!BYTES_BIG_ENDIAN && VECTOR_ELT_ORDER_BIG)
kono
parents:
diff changeset
2697 {
kono
parents:
diff changeset
2698 altivec_expand_stvex_be (operands[0], operands[1], <MODE>mode, UNSPEC_STVE);
kono
parents:
diff changeset
2699 DONE;
kono
parents:
diff changeset
2700 }
kono
parents:
diff changeset
2701 })
kono
parents:
diff changeset
2702
kono
parents:
diff changeset
2703 (define_insn "*altivec_stve<VI_char>x_internal"
kono
parents:
diff changeset
2704 [(set (match_operand:<VI_scalar> 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2705 (unspec:<VI_scalar> [(match_operand:VI 1 "register_operand" "v")] UNSPEC_STVE))]
kono
parents:
diff changeset
2706 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2707 "stve<VI_char>x %1,%y0"
kono
parents:
diff changeset
2708 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2709
kono
parents:
diff changeset
2710 (define_insn "*altivec_stvesfx"
kono
parents:
diff changeset
2711 [(set (match_operand:SF 0 "memory_operand" "=Z")
kono
parents:
diff changeset
2712 (unspec:SF [(match_operand:V4SF 1 "register_operand" "v")] UNSPEC_STVE))]
kono
parents:
diff changeset
2713 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2714 "stvewx %1,%y0"
kono
parents:
diff changeset
2715 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
2716
kono
parents:
diff changeset
2717 ;; Generate
kono
parents:
diff changeset
2718 ;; xxlxor/vxor SCRATCH0,SCRATCH0,SCRATCH0
kono
parents:
diff changeset
2719 ;; vsubu?m SCRATCH2,SCRATCH1,%1
kono
parents:
diff changeset
2720 ;; vmaxs? %0,%1,SCRATCH2"
kono
parents:
diff changeset
2721 (define_expand "abs<mode>2"
kono
parents:
diff changeset
2722 [(set (match_dup 2) (match_dup 3))
kono
parents:
diff changeset
2723 (set (match_dup 4)
kono
parents:
diff changeset
2724 (minus:VI2 (match_dup 2)
kono
parents:
diff changeset
2725 (match_operand:VI2 1 "register_operand" "v")))
kono
parents:
diff changeset
2726 (set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
2727 (smax:VI2 (match_dup 1) (match_dup 4)))]
kono
parents:
diff changeset
2728 "<VI_unit>"
kono
parents:
diff changeset
2729 {
kono
parents:
diff changeset
2730 operands[2] = gen_reg_rtx (<MODE>mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2731 operands[3] = CONST0_RTX (<MODE>mode);
111
kono
parents:
diff changeset
2732 operands[4] = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
2733 })
kono
parents:
diff changeset
2734
kono
parents:
diff changeset
2735 ;; Generate
kono
parents:
diff changeset
2736 ;; vspltisw SCRATCH1,0
kono
parents:
diff changeset
2737 ;; vsubu?m SCRATCH2,SCRATCH1,%1
kono
parents:
diff changeset
2738 ;; vmins? %0,%1,SCRATCH2"
kono
parents:
diff changeset
2739 (define_expand "nabs<mode>2"
kono
parents:
diff changeset
2740 [(set (match_dup 2) (match_dup 3))
kono
parents:
diff changeset
2741 (set (match_dup 4)
kono
parents:
diff changeset
2742 (minus:VI2 (match_dup 2)
kono
parents:
diff changeset
2743 (match_operand:VI2 1 "register_operand" "v")))
kono
parents:
diff changeset
2744 (set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
2745 (smin:VI2 (match_dup 1) (match_dup 4)))]
kono
parents:
diff changeset
2746 "<VI_unit>"
kono
parents:
diff changeset
2747 {
kono
parents:
diff changeset
2748 operands[2] = gen_reg_rtx (<MODE>mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2749 operands[3] = CONST0_RTX (<MODE>mode);
111
kono
parents:
diff changeset
2750 operands[4] = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
2751 })
kono
parents:
diff changeset
2752
kono
parents:
diff changeset
2753 ;; Generate
kono
parents:
diff changeset
2754 ;; vspltisw SCRATCH1,-1
kono
parents:
diff changeset
2755 ;; vslw SCRATCH2,SCRATCH1,SCRATCH1
kono
parents:
diff changeset
2756 ;; vandc %0,%1,SCRATCH2
kono
parents:
diff changeset
2757 (define_expand "altivec_absv4sf2"
kono
parents:
diff changeset
2758 [(set (match_dup 2)
kono
parents:
diff changeset
2759 (vec_duplicate:V4SI (const_int -1)))
kono
parents:
diff changeset
2760 (set (match_dup 3)
kono
parents:
diff changeset
2761 (ashift:V4SI (match_dup 2) (match_dup 2)))
kono
parents:
diff changeset
2762 (set (match_operand:V4SF 0 "register_operand" "=v")
kono
parents:
diff changeset
2763 (and:V4SF (not:V4SF (subreg:V4SF (match_dup 3) 0))
kono
parents:
diff changeset
2764 (match_operand:V4SF 1 "register_operand" "v")))]
kono
parents:
diff changeset
2765 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2766 {
kono
parents:
diff changeset
2767 operands[2] = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2768 operands[3] = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2769 })
kono
parents:
diff changeset
2770
kono
parents:
diff changeset
2771 ;; Generate
kono
parents:
diff changeset
2772 ;; vspltis? SCRATCH0,0
kono
parents:
diff changeset
2773 ;; vsubs?s SCRATCH2,SCRATCH1,%1
kono
parents:
diff changeset
2774 ;; vmaxs? %0,%1,SCRATCH2"
kono
parents:
diff changeset
2775 (define_expand "altivec_abss_<mode>"
kono
parents:
diff changeset
2776 [(set (match_dup 2) (vec_duplicate:VI (const_int 0)))
kono
parents:
diff changeset
2777 (parallel [(set (match_dup 3)
kono
parents:
diff changeset
2778 (unspec:VI [(match_dup 2)
kono
parents:
diff changeset
2779 (match_operand:VI 1 "register_operand" "v")]
kono
parents:
diff changeset
2780 UNSPEC_VSUBS))
kono
parents:
diff changeset
2781 (set (reg:SI VSCR_REGNO)
kono
parents:
diff changeset
2782 (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))])
kono
parents:
diff changeset
2783 (set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
2784 (smax:VI (match_dup 1) (match_dup 3)))]
kono
parents:
diff changeset
2785 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2786 {
kono
parents:
diff changeset
2787 operands[2] = gen_reg_rtx (GET_MODE (operands[0]));
kono
parents:
diff changeset
2788 operands[3] = gen_reg_rtx (GET_MODE (operands[0]));
kono
parents:
diff changeset
2789 })
kono
parents:
diff changeset
2790
kono
parents:
diff changeset
2791 (define_expand "reduc_plus_scal_<mode>"
kono
parents:
diff changeset
2792 [(set (match_operand:<VI_scalar> 0 "register_operand" "=v")
kono
parents:
diff changeset
2793 (unspec:VIshort [(match_operand:VIshort 1 "register_operand" "v")]
kono
parents:
diff changeset
2794 UNSPEC_REDUC_PLUS))]
kono
parents:
diff changeset
2795 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2796 {
kono
parents:
diff changeset
2797 rtx vzero = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2798 rtx vtmp1 = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2799 rtx vtmp2 = gen_reg_rtx (<MODE>mode);
kono
parents:
diff changeset
2800 rtx dest = gen_lowpart (V4SImode, vtmp2);
kono
parents:
diff changeset
2801 int elt = VECTOR_ELT_ORDER_BIG ? GET_MODE_NUNITS (<MODE>mode) - 1 : 0;
kono
parents:
diff changeset
2802
kono
parents:
diff changeset
2803 emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
kono
parents:
diff changeset
2804 emit_insn (gen_altivec_vsum4s<VI_char>s (vtmp1, operands[1], vzero));
kono
parents:
diff changeset
2805 emit_insn (gen_altivec_vsumsws_direct (dest, vtmp1, vzero));
kono
parents:
diff changeset
2806 rs6000_expand_vector_extract (operands[0], vtmp2, GEN_INT (elt));
kono
parents:
diff changeset
2807 DONE;
kono
parents:
diff changeset
2808 })
kono
parents:
diff changeset
2809
kono
parents:
diff changeset
2810 (define_insn "*p9_neg<mode>2"
kono
parents:
diff changeset
2811 [(set (match_operand:VNEG 0 "altivec_register_operand" "=v")
kono
parents:
diff changeset
2812 (neg:VNEG (match_operand:VNEG 1 "altivec_register_operand" "v")))]
kono
parents:
diff changeset
2813 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
2814 "vneg<VI_char> %0,%1"
kono
parents:
diff changeset
2815 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
2816
kono
parents:
diff changeset
2817 (define_expand "neg<mode>2"
kono
parents:
diff changeset
2818 [(set (match_operand:VI2 0 "register_operand" "")
kono
parents:
diff changeset
2819 (neg:VI2 (match_operand:VI2 1 "register_operand" "")))]
kono
parents:
diff changeset
2820 "<VI_unit>"
kono
parents:
diff changeset
2821 {
kono
parents:
diff changeset
2822 if (!TARGET_P9_VECTOR || (<MODE>mode != V4SImode && <MODE>mode != V2DImode))
kono
parents:
diff changeset
2823 {
kono
parents:
diff changeset
2824 rtx vzero;
kono
parents:
diff changeset
2825
kono
parents:
diff changeset
2826 vzero = gen_reg_rtx (GET_MODE (operands[0]));
kono
parents:
diff changeset
2827 emit_move_insn (vzero, CONST0_RTX (<MODE>mode));
kono
parents:
diff changeset
2828 emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1]));
kono
parents:
diff changeset
2829 DONE;
kono
parents:
diff changeset
2830 }
kono
parents:
diff changeset
2831 })
kono
parents:
diff changeset
2832
kono
parents:
diff changeset
2833 (define_expand "udot_prod<mode>"
kono
parents:
diff changeset
2834 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2835 (plus:V4SI (match_operand:V4SI 3 "register_operand" "v")
kono
parents:
diff changeset
2836 (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
kono
parents:
diff changeset
2837 (match_operand:VIshort 2 "register_operand" "v")]
kono
parents:
diff changeset
2838 UNSPEC_VMSUMU)))]
kono
parents:
diff changeset
2839 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2840 "
kono
parents:
diff changeset
2841 {
kono
parents:
diff changeset
2842 emit_insn (gen_altivec_vmsumu<VI_char>m (operands[0], operands[1], operands[2], operands[3]));
kono
parents:
diff changeset
2843 DONE;
kono
parents:
diff changeset
2844 }")
kono
parents:
diff changeset
2845
kono
parents:
diff changeset
2846 (define_expand "sdot_prodv8hi"
kono
parents:
diff changeset
2847 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2848 (plus:V4SI (match_operand:V4SI 3 "register_operand" "v")
kono
parents:
diff changeset
2849 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
2850 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
2851 UNSPEC_VMSUMSHM)))]
kono
parents:
diff changeset
2852 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2853 "
kono
parents:
diff changeset
2854 {
kono
parents:
diff changeset
2855 emit_insn (gen_altivec_vmsumshm (operands[0], operands[1], operands[2], operands[3]));
kono
parents:
diff changeset
2856 DONE;
kono
parents:
diff changeset
2857 }")
kono
parents:
diff changeset
2858
kono
parents:
diff changeset
2859 (define_expand "widen_usum<mode>3"
kono
parents:
diff changeset
2860 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2861 (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
kono
parents:
diff changeset
2862 (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")]
kono
parents:
diff changeset
2863 UNSPEC_VMSUMU)))]
kono
parents:
diff changeset
2864 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2865 "
kono
parents:
diff changeset
2866 {
kono
parents:
diff changeset
2867 rtx vones = gen_reg_rtx (GET_MODE (operands[1]));
kono
parents:
diff changeset
2868
kono
parents:
diff changeset
2869 emit_insn (gen_altivec_vspltis<VI_char> (vones, const1_rtx));
kono
parents:
diff changeset
2870 emit_insn (gen_altivec_vmsumu<VI_char>m (operands[0], operands[1], vones, operands[2]));
kono
parents:
diff changeset
2871 DONE;
kono
parents:
diff changeset
2872 }")
kono
parents:
diff changeset
2873
kono
parents:
diff changeset
2874 (define_expand "widen_ssumv16qi3"
kono
parents:
diff changeset
2875 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2876 (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
kono
parents:
diff changeset
2877 (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")]
kono
parents:
diff changeset
2878 UNSPEC_VMSUMM)))]
kono
parents:
diff changeset
2879 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2880 "
kono
parents:
diff changeset
2881 {
kono
parents:
diff changeset
2882 rtx vones = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2883
kono
parents:
diff changeset
2884 emit_insn (gen_altivec_vspltisb (vones, const1_rtx));
kono
parents:
diff changeset
2885 emit_insn (gen_altivec_vmsummbm (operands[0], operands[1], vones, operands[2]));
kono
parents:
diff changeset
2886 DONE;
kono
parents:
diff changeset
2887 }")
kono
parents:
diff changeset
2888
kono
parents:
diff changeset
2889 (define_expand "widen_ssumv8hi3"
kono
parents:
diff changeset
2890 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2891 (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
kono
parents:
diff changeset
2892 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
kono
parents:
diff changeset
2893 UNSPEC_VMSUMSHM)))]
kono
parents:
diff changeset
2894 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2895 "
kono
parents:
diff changeset
2896 {
kono
parents:
diff changeset
2897 rtx vones = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
2898
kono
parents:
diff changeset
2899 emit_insn (gen_altivec_vspltish (vones, const1_rtx));
kono
parents:
diff changeset
2900 emit_insn (gen_altivec_vmsumshm (operands[0], operands[1], vones, operands[2]));
kono
parents:
diff changeset
2901 DONE;
kono
parents:
diff changeset
2902 }")
kono
parents:
diff changeset
2903
kono
parents:
diff changeset
2904 (define_expand "vec_unpacks_hi_<VP_small_lc>"
kono
parents:
diff changeset
2905 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2906 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2907 UNSPEC_VUNPACK_HI_SIGN_DIRECT))]
kono
parents:
diff changeset
2908 "<VI_unit>"
kono
parents:
diff changeset
2909 "")
kono
parents:
diff changeset
2910
kono
parents:
diff changeset
2911 (define_expand "vec_unpacks_lo_<VP_small_lc>"
kono
parents:
diff changeset
2912 [(set (match_operand:VP 0 "register_operand" "=v")
kono
parents:
diff changeset
2913 (unspec:VP [(match_operand:<VP_small> 1 "register_operand" "v")]
kono
parents:
diff changeset
2914 UNSPEC_VUNPACK_LO_SIGN_DIRECT))]
kono
parents:
diff changeset
2915 "<VI_unit>"
kono
parents:
diff changeset
2916 "")
kono
parents:
diff changeset
2917
kono
parents:
diff changeset
2918 (define_insn "vperm_v8hiv4si"
kono
parents:
diff changeset
2919 [(set (match_operand:V4SI 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2920 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2921 (match_operand:V4SI 2 "register_operand" "v,0")
kono
parents:
diff changeset
2922 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2923 UNSPEC_VPERMSI))]
kono
parents:
diff changeset
2924 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2925 "@
kono
parents:
diff changeset
2926 vperm %0,%1,%2,%3
kono
parents:
diff changeset
2927 xxperm %x0,%x1,%x3"
kono
parents:
diff changeset
2928 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2929 (set_attr "length" "4")])
kono
parents:
diff changeset
2930
kono
parents:
diff changeset
2931 (define_insn "vperm_v16qiv8hi"
kono
parents:
diff changeset
2932 [(set (match_operand:V8HI 0 "register_operand" "=v,?wo")
kono
parents:
diff changeset
2933 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v,wo")
kono
parents:
diff changeset
2934 (match_operand:V8HI 2 "register_operand" "v,0")
kono
parents:
diff changeset
2935 (match_operand:V16QI 3 "register_operand" "v,wo")]
kono
parents:
diff changeset
2936 UNSPEC_VPERMHI))]
kono
parents:
diff changeset
2937 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2938 "@
kono
parents:
diff changeset
2939 vperm %0,%1,%2,%3
kono
parents:
diff changeset
2940 xxperm %x0,%x1,%x3"
kono
parents:
diff changeset
2941 [(set_attr "type" "vecperm")
kono
parents:
diff changeset
2942 (set_attr "length" "4")])
kono
parents:
diff changeset
2943
kono
parents:
diff changeset
2944
kono
parents:
diff changeset
2945 (define_expand "vec_unpacku_hi_v16qi"
kono
parents:
diff changeset
2946 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
2947 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
kono
parents:
diff changeset
2948 UNSPEC_VUPKHUB))]
kono
parents:
diff changeset
2949 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2950 "
kono
parents:
diff changeset
2951 {
kono
parents:
diff changeset
2952 rtx vzero = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
2953 rtx mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2954 rtvec v = rtvec_alloc (16);
kono
parents:
diff changeset
2955 bool be = BYTES_BIG_ENDIAN;
kono
parents:
diff changeset
2956
kono
parents:
diff changeset
2957 emit_insn (gen_altivec_vspltish (vzero, const0_rtx));
kono
parents:
diff changeset
2958
kono
parents:
diff changeset
2959 RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, be ? 16 : 7);
kono
parents:
diff changeset
2960 RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, be ? 0 : 16);
kono
parents:
diff changeset
2961 RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, be ? 16 : 6);
kono
parents:
diff changeset
2962 RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, be ? 1 : 16);
kono
parents:
diff changeset
2963 RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, be ? 16 : 5);
kono
parents:
diff changeset
2964 RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, be ? 2 : 16);
kono
parents:
diff changeset
2965 RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, be ? 16 : 4);
kono
parents:
diff changeset
2966 RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, be ? 3 : 16);
kono
parents:
diff changeset
2967 RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, be ? 16 : 3);
kono
parents:
diff changeset
2968 RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, be ? 4 : 16);
kono
parents:
diff changeset
2969 RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, be ? 16 : 2);
kono
parents:
diff changeset
2970 RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, be ? 5 : 16);
kono
parents:
diff changeset
2971 RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, be ? 16 : 1);
kono
parents:
diff changeset
2972 RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, be ? 6 : 16);
kono
parents:
diff changeset
2973 RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, be ? 16 : 0);
kono
parents:
diff changeset
2974 RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, be ? 7 : 16);
kono
parents:
diff changeset
2975
kono
parents:
diff changeset
2976 emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
kono
parents:
diff changeset
2977 emit_insn (gen_vperm_v16qiv8hi (operands[0], operands[1], vzero, mask));
kono
parents:
diff changeset
2978 DONE;
kono
parents:
diff changeset
2979 }")
kono
parents:
diff changeset
2980
kono
parents:
diff changeset
2981 (define_expand "vec_unpacku_hi_v8hi"
kono
parents:
diff changeset
2982 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
2983 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
kono
parents:
diff changeset
2984 UNSPEC_VUPKHUH))]
kono
parents:
diff changeset
2985 "TARGET_ALTIVEC"
kono
parents:
diff changeset
2986 "
kono
parents:
diff changeset
2987 {
kono
parents:
diff changeset
2988 rtx vzero = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
2989 rtx mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
2990 rtvec v = rtvec_alloc (16);
kono
parents:
diff changeset
2991 bool be = BYTES_BIG_ENDIAN;
kono
parents:
diff changeset
2992
kono
parents:
diff changeset
2993 emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
kono
parents:
diff changeset
2994
kono
parents:
diff changeset
2995 RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, be ? 16 : 7);
kono
parents:
diff changeset
2996 RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, be ? 17 : 6);
kono
parents:
diff changeset
2997 RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, be ? 0 : 17);
kono
parents:
diff changeset
2998 RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, be ? 1 : 16);
kono
parents:
diff changeset
2999 RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, be ? 16 : 5);
kono
parents:
diff changeset
3000 RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, be ? 17 : 4);
kono
parents:
diff changeset
3001 RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, be ? 2 : 17);
kono
parents:
diff changeset
3002 RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, be ? 3 : 16);
kono
parents:
diff changeset
3003 RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, be ? 16 : 3);
kono
parents:
diff changeset
3004 RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, be ? 17 : 2);
kono
parents:
diff changeset
3005 RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, be ? 4 : 17);
kono
parents:
diff changeset
3006 RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, be ? 5 : 16);
kono
parents:
diff changeset
3007 RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, be ? 16 : 1);
kono
parents:
diff changeset
3008 RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, be ? 17 : 0);
kono
parents:
diff changeset
3009 RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, be ? 6 : 17);
kono
parents:
diff changeset
3010 RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, be ? 7 : 16);
kono
parents:
diff changeset
3011
kono
parents:
diff changeset
3012 emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
kono
parents:
diff changeset
3013 emit_insn (gen_vperm_v8hiv4si (operands[0], operands[1], vzero, mask));
kono
parents:
diff changeset
3014 DONE;
kono
parents:
diff changeset
3015 }")
kono
parents:
diff changeset
3016
kono
parents:
diff changeset
3017 (define_expand "vec_unpacku_lo_v16qi"
kono
parents:
diff changeset
3018 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
3019 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
kono
parents:
diff changeset
3020 UNSPEC_VUPKLUB))]
kono
parents:
diff changeset
3021 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3022 "
kono
parents:
diff changeset
3023 {
kono
parents:
diff changeset
3024 rtx vzero = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3025 rtx mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
3026 rtvec v = rtvec_alloc (16);
kono
parents:
diff changeset
3027 bool be = BYTES_BIG_ENDIAN;
kono
parents:
diff changeset
3028
kono
parents:
diff changeset
3029 emit_insn (gen_altivec_vspltish (vzero, const0_rtx));
kono
parents:
diff changeset
3030
kono
parents:
diff changeset
3031 RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, be ? 16 : 15);
kono
parents:
diff changeset
3032 RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, be ? 8 : 16);
kono
parents:
diff changeset
3033 RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, be ? 16 : 14);
kono
parents:
diff changeset
3034 RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, be ? 9 : 16);
kono
parents:
diff changeset
3035 RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, be ? 16 : 13);
kono
parents:
diff changeset
3036 RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, be ? 10 : 16);
kono
parents:
diff changeset
3037 RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, be ? 16 : 12);
kono
parents:
diff changeset
3038 RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, be ? 11 : 16);
kono
parents:
diff changeset
3039 RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, be ? 16 : 11);
kono
parents:
diff changeset
3040 RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, be ? 12 : 16);
kono
parents:
diff changeset
3041 RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, be ? 16 : 10);
kono
parents:
diff changeset
3042 RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, be ? 13 : 16);
kono
parents:
diff changeset
3043 RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, be ? 16 : 9);
kono
parents:
diff changeset
3044 RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, be ? 14 : 16);
kono
parents:
diff changeset
3045 RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, be ? 16 : 8);
kono
parents:
diff changeset
3046 RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, be ? 15 : 16);
kono
parents:
diff changeset
3047
kono
parents:
diff changeset
3048 emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
kono
parents:
diff changeset
3049 emit_insn (gen_vperm_v16qiv8hi (operands[0], operands[1], vzero, mask));
kono
parents:
diff changeset
3050 DONE;
kono
parents:
diff changeset
3051 }")
kono
parents:
diff changeset
3052
kono
parents:
diff changeset
3053 (define_expand "vec_unpacku_lo_v8hi"
kono
parents:
diff changeset
3054 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
3055 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
kono
parents:
diff changeset
3056 UNSPEC_VUPKLUH))]
kono
parents:
diff changeset
3057 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3058 "
kono
parents:
diff changeset
3059 {
kono
parents:
diff changeset
3060 rtx vzero = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3061 rtx mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
3062 rtvec v = rtvec_alloc (16);
kono
parents:
diff changeset
3063 bool be = BYTES_BIG_ENDIAN;
kono
parents:
diff changeset
3064
kono
parents:
diff changeset
3065 emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
kono
parents:
diff changeset
3066
kono
parents:
diff changeset
3067 RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, be ? 16 : 15);
kono
parents:
diff changeset
3068 RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, be ? 17 : 14);
kono
parents:
diff changeset
3069 RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, be ? 8 : 17);
kono
parents:
diff changeset
3070 RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, be ? 9 : 16);
kono
parents:
diff changeset
3071 RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, be ? 16 : 13);
kono
parents:
diff changeset
3072 RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, be ? 17 : 12);
kono
parents:
diff changeset
3073 RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, be ? 10 : 17);
kono
parents:
diff changeset
3074 RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, be ? 11 : 16);
kono
parents:
diff changeset
3075 RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, be ? 16 : 11);
kono
parents:
diff changeset
3076 RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, be ? 17 : 10);
kono
parents:
diff changeset
3077 RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, be ? 12 : 17);
kono
parents:
diff changeset
3078 RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, be ? 13 : 16);
kono
parents:
diff changeset
3079 RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, be ? 16 : 9);
kono
parents:
diff changeset
3080 RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, be ? 17 : 8);
kono
parents:
diff changeset
3081 RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, be ? 14 : 17);
kono
parents:
diff changeset
3082 RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, be ? 15 : 16);
kono
parents:
diff changeset
3083
kono
parents:
diff changeset
3084 emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
kono
parents:
diff changeset
3085 emit_insn (gen_vperm_v8hiv4si (operands[0], operands[1], vzero, mask));
kono
parents:
diff changeset
3086 DONE;
kono
parents:
diff changeset
3087 }")
kono
parents:
diff changeset
3088
kono
parents:
diff changeset
3089 (define_expand "vec_widen_umult_hi_v16qi"
kono
parents:
diff changeset
3090 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
3091 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3092 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3093 UNSPEC_VMULWHUB))]
kono
parents:
diff changeset
3094 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3095 "
kono
parents:
diff changeset
3096 {
kono
parents:
diff changeset
3097 rtx ve = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3098 rtx vo = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3099
kono
parents:
diff changeset
3100 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3101 {
kono
parents:
diff changeset
3102 emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3103 emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3104 emit_insn (gen_altivec_vmrghh_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3105 }
kono
parents:
diff changeset
3106 else
kono
parents:
diff changeset
3107 {
kono
parents:
diff changeset
3108 emit_insn (gen_altivec_vmuloub (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3109 emit_insn (gen_altivec_vmuleub (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3110 emit_insn (gen_altivec_vmrghh_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3111 }
kono
parents:
diff changeset
3112 DONE;
kono
parents:
diff changeset
3113 }")
kono
parents:
diff changeset
3114
kono
parents:
diff changeset
3115 (define_expand "vec_widen_umult_lo_v16qi"
kono
parents:
diff changeset
3116 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
3117 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3118 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3119 UNSPEC_VMULWLUB))]
kono
parents:
diff changeset
3120 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3121 "
kono
parents:
diff changeset
3122 {
kono
parents:
diff changeset
3123 rtx ve = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3124 rtx vo = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3125
kono
parents:
diff changeset
3126 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3127 {
kono
parents:
diff changeset
3128 emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3129 emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3130 emit_insn (gen_altivec_vmrglh_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3131 }
kono
parents:
diff changeset
3132 else
kono
parents:
diff changeset
3133 {
kono
parents:
diff changeset
3134 emit_insn (gen_altivec_vmuloub (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3135 emit_insn (gen_altivec_vmuleub (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3136 emit_insn (gen_altivec_vmrglh_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3137 }
kono
parents:
diff changeset
3138 DONE;
kono
parents:
diff changeset
3139 }")
kono
parents:
diff changeset
3140
kono
parents:
diff changeset
3141 (define_expand "vec_widen_smult_hi_v16qi"
kono
parents:
diff changeset
3142 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
3143 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3144 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3145 UNSPEC_VMULWHSB))]
kono
parents:
diff changeset
3146 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3147 "
kono
parents:
diff changeset
3148 {
kono
parents:
diff changeset
3149 rtx ve = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3150 rtx vo = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3151
kono
parents:
diff changeset
3152 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3153 {
kono
parents:
diff changeset
3154 emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3155 emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3156 emit_insn (gen_altivec_vmrghh_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3157 }
kono
parents:
diff changeset
3158 else
kono
parents:
diff changeset
3159 {
kono
parents:
diff changeset
3160 emit_insn (gen_altivec_vmulosb (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3161 emit_insn (gen_altivec_vmulesb (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3162 emit_insn (gen_altivec_vmrghh_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3163 }
kono
parents:
diff changeset
3164 DONE;
kono
parents:
diff changeset
3165 }")
kono
parents:
diff changeset
3166
kono
parents:
diff changeset
3167 (define_expand "vec_widen_smult_lo_v16qi"
kono
parents:
diff changeset
3168 [(set (match_operand:V8HI 0 "register_operand" "=v")
kono
parents:
diff changeset
3169 (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3170 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3171 UNSPEC_VMULWLSB))]
kono
parents:
diff changeset
3172 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3173 "
kono
parents:
diff changeset
3174 {
kono
parents:
diff changeset
3175 rtx ve = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3176 rtx vo = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3177
kono
parents:
diff changeset
3178 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3179 {
kono
parents:
diff changeset
3180 emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3181 emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3182 emit_insn (gen_altivec_vmrglh_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3183 }
kono
parents:
diff changeset
3184 else
kono
parents:
diff changeset
3185 {
kono
parents:
diff changeset
3186 emit_insn (gen_altivec_vmulosb (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3187 emit_insn (gen_altivec_vmulesb (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3188 emit_insn (gen_altivec_vmrglh_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3189 }
kono
parents:
diff changeset
3190 DONE;
kono
parents:
diff changeset
3191 }")
kono
parents:
diff changeset
3192
kono
parents:
diff changeset
3193 (define_expand "vec_widen_umult_hi_v8hi"
kono
parents:
diff changeset
3194 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
3195 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
3196 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
3197 UNSPEC_VMULWHUH))]
kono
parents:
diff changeset
3198 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3199 "
kono
parents:
diff changeset
3200 {
kono
parents:
diff changeset
3201 rtx ve = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3202 rtx vo = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3203
kono
parents:
diff changeset
3204 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3205 {
kono
parents:
diff changeset
3206 emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3207 emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3208 emit_insn (gen_altivec_vmrghw_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3209 }
kono
parents:
diff changeset
3210 else
kono
parents:
diff changeset
3211 {
kono
parents:
diff changeset
3212 emit_insn (gen_altivec_vmulouh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3213 emit_insn (gen_altivec_vmuleuh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3214 emit_insn (gen_altivec_vmrghw_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3215 }
kono
parents:
diff changeset
3216 DONE;
kono
parents:
diff changeset
3217 }")
kono
parents:
diff changeset
3218
kono
parents:
diff changeset
3219 (define_expand "vec_widen_umult_lo_v8hi"
kono
parents:
diff changeset
3220 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
3221 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
3222 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
3223 UNSPEC_VMULWLUH))]
kono
parents:
diff changeset
3224 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3225 "
kono
parents:
diff changeset
3226 {
kono
parents:
diff changeset
3227 rtx ve = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3228 rtx vo = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3229
kono
parents:
diff changeset
3230 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3231 {
kono
parents:
diff changeset
3232 emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3233 emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3234 emit_insn (gen_altivec_vmrglw_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3235 }
kono
parents:
diff changeset
3236 else
kono
parents:
diff changeset
3237 {
kono
parents:
diff changeset
3238 emit_insn (gen_altivec_vmulouh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3239 emit_insn (gen_altivec_vmuleuh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3240 emit_insn (gen_altivec_vmrglw_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3241 }
kono
parents:
diff changeset
3242 DONE;
kono
parents:
diff changeset
3243 }")
kono
parents:
diff changeset
3244
kono
parents:
diff changeset
3245 (define_expand "vec_widen_smult_hi_v8hi"
kono
parents:
diff changeset
3246 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
3247 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
3248 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
3249 UNSPEC_VMULWHSH))]
kono
parents:
diff changeset
3250 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3251 "
kono
parents:
diff changeset
3252 {
kono
parents:
diff changeset
3253 rtx ve = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3254 rtx vo = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3255
kono
parents:
diff changeset
3256 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3257 {
kono
parents:
diff changeset
3258 emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3259 emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3260 emit_insn (gen_altivec_vmrghw_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3261 }
kono
parents:
diff changeset
3262 else
kono
parents:
diff changeset
3263 {
kono
parents:
diff changeset
3264 emit_insn (gen_altivec_vmulosh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3265 emit_insn (gen_altivec_vmulesh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3266 emit_insn (gen_altivec_vmrghw_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3267 }
kono
parents:
diff changeset
3268 DONE;
kono
parents:
diff changeset
3269 }")
kono
parents:
diff changeset
3270
kono
parents:
diff changeset
3271 (define_expand "vec_widen_smult_lo_v8hi"
kono
parents:
diff changeset
3272 [(set (match_operand:V4SI 0 "register_operand" "=v")
kono
parents:
diff changeset
3273 (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
kono
parents:
diff changeset
3274 (match_operand:V8HI 2 "register_operand" "v")]
kono
parents:
diff changeset
3275 UNSPEC_VMULWLSH))]
kono
parents:
diff changeset
3276 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3277 "
kono
parents:
diff changeset
3278 {
kono
parents:
diff changeset
3279 rtx ve = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3280 rtx vo = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3281
kono
parents:
diff changeset
3282 if (BYTES_BIG_ENDIAN)
kono
parents:
diff changeset
3283 {
kono
parents:
diff changeset
3284 emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3285 emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3286 emit_insn (gen_altivec_vmrglw_direct (operands[0], ve, vo));
kono
parents:
diff changeset
3287 }
kono
parents:
diff changeset
3288 else
kono
parents:
diff changeset
3289 {
kono
parents:
diff changeset
3290 emit_insn (gen_altivec_vmulosh (ve, operands[1], operands[2]));
kono
parents:
diff changeset
3291 emit_insn (gen_altivec_vmulesh (vo, operands[1], operands[2]));
kono
parents:
diff changeset
3292 emit_insn (gen_altivec_vmrglw_direct (operands[0], vo, ve));
kono
parents:
diff changeset
3293 }
kono
parents:
diff changeset
3294 DONE;
kono
parents:
diff changeset
3295 }")
kono
parents:
diff changeset
3296
kono
parents:
diff changeset
3297 (define_expand "vec_pack_trunc_<mode>"
kono
parents:
diff changeset
3298 [(set (match_operand:<VP_small> 0 "register_operand" "=v")
kono
parents:
diff changeset
3299 (unspec:<VP_small> [(match_operand:VP 1 "register_operand" "v")
kono
parents:
diff changeset
3300 (match_operand:VP 2 "register_operand" "v")]
kono
parents:
diff changeset
3301 UNSPEC_VPACK_UNS_UNS_MOD))]
kono
parents:
diff changeset
3302 "<VI_unit>"
kono
parents:
diff changeset
3303 "")
kono
parents:
diff changeset
3304
kono
parents:
diff changeset
3305 (define_expand "mulv16qi3"
kono
parents:
diff changeset
3306 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3307 (mult:V16QI (match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3308 (match_operand:V16QI 2 "register_operand" "v")))]
kono
parents:
diff changeset
3309 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3310 "
kono
parents:
diff changeset
3311 {
kono
parents:
diff changeset
3312 rtx even = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3313 rtx odd = gen_reg_rtx (V8HImode);
kono
parents:
diff changeset
3314 rtx mask = gen_reg_rtx (V16QImode);
kono
parents:
diff changeset
3315 rtvec v = rtvec_alloc (16);
kono
parents:
diff changeset
3316 int i;
kono
parents:
diff changeset
3317
kono
parents:
diff changeset
3318 for (i = 0; i < 8; ++i) {
kono
parents:
diff changeset
3319 RTVEC_ELT (v, 2 * i)
kono
parents:
diff changeset
3320 = gen_rtx_CONST_INT (QImode, BYTES_BIG_ENDIAN ? 2 * i + 1 : 31 - 2 * i);
kono
parents:
diff changeset
3321 RTVEC_ELT (v, 2 * i + 1)
kono
parents:
diff changeset
3322 = gen_rtx_CONST_INT (QImode, BYTES_BIG_ENDIAN ? 2 * i + 17 : 15 - 2 * i);
kono
parents:
diff changeset
3323 }
kono
parents:
diff changeset
3324
kono
parents:
diff changeset
3325 emit_insn (gen_vec_initv16qiqi (mask, gen_rtx_PARALLEL (V16QImode, v)));
kono
parents:
diff changeset
3326 emit_insn (gen_altivec_vmulesb (even, operands[1], operands[2]));
kono
parents:
diff changeset
3327 emit_insn (gen_altivec_vmulosb (odd, operands[1], operands[2]));
kono
parents:
diff changeset
3328 emit_insn (gen_altivec_vperm_v8hiv16qi (operands[0], even, odd, mask));
kono
parents:
diff changeset
3329 DONE;
kono
parents:
diff changeset
3330 }")
kono
parents:
diff changeset
3331
kono
parents:
diff changeset
3332 (define_expand "altivec_negv4sf2"
kono
parents:
diff changeset
3333 [(use (match_operand:V4SF 0 "register_operand" ""))
kono
parents:
diff changeset
3334 (use (match_operand:V4SF 1 "register_operand" ""))]
kono
parents:
diff changeset
3335 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3336 "
kono
parents:
diff changeset
3337 {
kono
parents:
diff changeset
3338 rtx neg0;
kono
parents:
diff changeset
3339
kono
parents:
diff changeset
3340 /* Generate [-0.0, -0.0, -0.0, -0.0]. */
kono
parents:
diff changeset
3341 neg0 = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3342 emit_insn (gen_altivec_vspltisw (neg0, constm1_rtx));
kono
parents:
diff changeset
3343 emit_insn (gen_vashlv4si3 (neg0, neg0, neg0));
kono
parents:
diff changeset
3344
kono
parents:
diff changeset
3345 /* XOR */
kono
parents:
diff changeset
3346 emit_insn (gen_xorv4sf3 (operands[0],
kono
parents:
diff changeset
3347 gen_lowpart (V4SFmode, neg0), operands[1]));
kono
parents:
diff changeset
3348
kono
parents:
diff changeset
3349 DONE;
kono
parents:
diff changeset
3350 }")
kono
parents:
diff changeset
3351
kono
parents:
diff changeset
3352 ;; Vector SIMD PEM v2.06c defines LVLX, LVLXL, LVRX, LVRXL,
kono
parents:
diff changeset
3353 ;; STVLX, STVLXL, STVVRX, STVRXL are available only on Cell.
kono
parents:
diff changeset
3354 (define_insn "altivec_lvlx"
kono
parents:
diff changeset
3355 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3356 (unspec:V16QI [(match_operand:BLK 1 "memory_operand" "Z")]
kono
parents:
diff changeset
3357 UNSPEC_LVLX))]
kono
parents:
diff changeset
3358 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3359 "lvlx %0,%y1"
kono
parents:
diff changeset
3360 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
3361
kono
parents:
diff changeset
3362 (define_insn "altivec_lvlxl"
kono
parents:
diff changeset
3363 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3364 (unspec:V16QI [(match_operand:BLK 1 "memory_operand" "Z")]
kono
parents:
diff changeset
3365 UNSPEC_LVLXL))]
kono
parents:
diff changeset
3366 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3367 "lvlxl %0,%y1"
kono
parents:
diff changeset
3368 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
3369
kono
parents:
diff changeset
3370 (define_insn "altivec_lvrx"
kono
parents:
diff changeset
3371 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3372 (unspec:V16QI [(match_operand:BLK 1 "memory_operand" "Z")]
kono
parents:
diff changeset
3373 UNSPEC_LVRX))]
kono
parents:
diff changeset
3374 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3375 "lvrx %0,%y1"
kono
parents:
diff changeset
3376 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
3377
kono
parents:
diff changeset
3378 (define_insn "altivec_lvrxl"
kono
parents:
diff changeset
3379 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3380 (unspec:V16QI [(match_operand:BLK 1 "memory_operand" "Z")]
kono
parents:
diff changeset
3381 UNSPEC_LVRXL))]
kono
parents:
diff changeset
3382 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3383 "lvrxl %0,%y1"
kono
parents:
diff changeset
3384 [(set_attr "type" "vecload")])
kono
parents:
diff changeset
3385
kono
parents:
diff changeset
3386 (define_insn "altivec_stvlx"
kono
parents:
diff changeset
3387 [(parallel
kono
parents:
diff changeset
3388 [(set (match_operand:V16QI 0 "memory_operand" "=Z")
kono
parents:
diff changeset
3389 (match_operand:V16QI 1 "register_operand" "v"))
kono
parents:
diff changeset
3390 (unspec [(const_int 0)] UNSPEC_STVLX)])]
kono
parents:
diff changeset
3391 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3392 "stvlx %1,%y0"
kono
parents:
diff changeset
3393 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
3394
kono
parents:
diff changeset
3395 (define_insn "altivec_stvlxl"
kono
parents:
diff changeset
3396 [(parallel
kono
parents:
diff changeset
3397 [(set (match_operand:V16QI 0 "memory_operand" "=Z")
kono
parents:
diff changeset
3398 (match_operand:V16QI 1 "register_operand" "v"))
kono
parents:
diff changeset
3399 (unspec [(const_int 0)] UNSPEC_STVLXL)])]
kono
parents:
diff changeset
3400 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3401 "stvlxl %1,%y0"
kono
parents:
diff changeset
3402 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
3403
kono
parents:
diff changeset
3404 (define_insn "altivec_stvrx"
kono
parents:
diff changeset
3405 [(parallel
kono
parents:
diff changeset
3406 [(set (match_operand:V16QI 0 "memory_operand" "=Z")
kono
parents:
diff changeset
3407 (match_operand:V16QI 1 "register_operand" "v"))
kono
parents:
diff changeset
3408 (unspec [(const_int 0)] UNSPEC_STVRX)])]
kono
parents:
diff changeset
3409 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3410 "stvrx %1,%y0"
kono
parents:
diff changeset
3411 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
3412
kono
parents:
diff changeset
3413 (define_insn "altivec_stvrxl"
kono
parents:
diff changeset
3414 [(parallel
kono
parents:
diff changeset
3415 [(set (match_operand:V16QI 0 "memory_operand" "=Z")
kono
parents:
diff changeset
3416 (match_operand:V16QI 1 "register_operand" "v"))
kono
parents:
diff changeset
3417 (unspec [(const_int 0)] UNSPEC_STVRXL)])]
kono
parents:
diff changeset
3418 "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
kono
parents:
diff changeset
3419 "stvrxl %1,%y0"
kono
parents:
diff changeset
3420 [(set_attr "type" "vecstore")])
kono
parents:
diff changeset
3421
kono
parents:
diff changeset
3422 (define_expand "vec_unpacks_float_hi_v8hi"
kono
parents:
diff changeset
3423 [(set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
3424 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
kono
parents:
diff changeset
3425 UNSPEC_VUPKHS_V4SF))]
kono
parents:
diff changeset
3426 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3427 "
kono
parents:
diff changeset
3428 {
kono
parents:
diff changeset
3429 rtx tmp = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3430
kono
parents:
diff changeset
3431 emit_insn (gen_vec_unpacks_hi_v8hi (tmp, operands[1]));
kono
parents:
diff changeset
3432 emit_insn (gen_altivec_vcfsx (operands[0], tmp, const0_rtx));
kono
parents:
diff changeset
3433 DONE;
kono
parents:
diff changeset
3434 }")
kono
parents:
diff changeset
3435
kono
parents:
diff changeset
3436 (define_expand "vec_unpacks_float_lo_v8hi"
kono
parents:
diff changeset
3437 [(set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
3438 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
kono
parents:
diff changeset
3439 UNSPEC_VUPKLS_V4SF))]
kono
parents:
diff changeset
3440 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3441 "
kono
parents:
diff changeset
3442 {
kono
parents:
diff changeset
3443 rtx tmp = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3444
kono
parents:
diff changeset
3445 emit_insn (gen_vec_unpacks_lo_v8hi (tmp, operands[1]));
kono
parents:
diff changeset
3446 emit_insn (gen_altivec_vcfsx (operands[0], tmp, const0_rtx));
kono
parents:
diff changeset
3447 DONE;
kono
parents:
diff changeset
3448 }")
kono
parents:
diff changeset
3449
kono
parents:
diff changeset
3450 (define_expand "vec_unpacku_float_hi_v8hi"
kono
parents:
diff changeset
3451 [(set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
3452 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
kono
parents:
diff changeset
3453 UNSPEC_VUPKHU_V4SF))]
kono
parents:
diff changeset
3454 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3455 "
kono
parents:
diff changeset
3456 {
kono
parents:
diff changeset
3457 rtx tmp = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3458
kono
parents:
diff changeset
3459 emit_insn (gen_vec_unpacku_hi_v8hi (tmp, operands[1]));
kono
parents:
diff changeset
3460 emit_insn (gen_altivec_vcfux (operands[0], tmp, const0_rtx));
kono
parents:
diff changeset
3461 DONE;
kono
parents:
diff changeset
3462 }")
kono
parents:
diff changeset
3463
kono
parents:
diff changeset
3464 (define_expand "vec_unpacku_float_lo_v8hi"
kono
parents:
diff changeset
3465 [(set (match_operand:V4SF 0 "register_operand" "")
kono
parents:
diff changeset
3466 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
kono
parents:
diff changeset
3467 UNSPEC_VUPKLU_V4SF))]
kono
parents:
diff changeset
3468 "TARGET_ALTIVEC"
kono
parents:
diff changeset
3469 "
kono
parents:
diff changeset
3470 {
kono
parents:
diff changeset
3471 rtx tmp = gen_reg_rtx (V4SImode);
kono
parents:
diff changeset
3472
kono
parents:
diff changeset
3473 emit_insn (gen_vec_unpacku_lo_v8hi (tmp, operands[1]));
kono
parents:
diff changeset
3474 emit_insn (gen_altivec_vcfux (operands[0], tmp, const0_rtx));
kono
parents:
diff changeset
3475 DONE;
kono
parents:
diff changeset
3476 }")
kono
parents:
diff changeset
3477
kono
parents:
diff changeset
3478
kono
parents:
diff changeset
3479 ;; Power8/power9 vector instructions encoded as Altivec instructions
kono
parents:
diff changeset
3480
kono
parents:
diff changeset
3481 ;; Vector count leading zeros
kono
parents:
diff changeset
3482 (define_insn "*p8v_clz<mode>2"
kono
parents:
diff changeset
3483 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
3484 (clz:VI2 (match_operand:VI2 1 "register_operand" "v")))]
kono
parents:
diff changeset
3485 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3486 "vclz<wd> %0,%1"
kono
parents:
diff changeset
3487 [(set_attr "length" "4")
kono
parents:
diff changeset
3488 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3489
kono
parents:
diff changeset
3490 ;; Vector absolute difference unsigned
kono
parents:
diff changeset
3491 (define_expand "vadu<mode>3"
kono
parents:
diff changeset
3492 [(set (match_operand:VI 0 "register_operand")
kono
parents:
diff changeset
3493 (unspec:VI [(match_operand:VI 1 "register_operand")
kono
parents:
diff changeset
3494 (match_operand:VI 2 "register_operand")]
kono
parents:
diff changeset
3495 UNSPEC_VADU))]
kono
parents:
diff changeset
3496 "TARGET_P9_VECTOR")
kono
parents:
diff changeset
3497
kono
parents:
diff changeset
3498 ;; Vector absolute difference unsigned
kono
parents:
diff changeset
3499 (define_insn "*p9_vadu<mode>3"
kono
parents:
diff changeset
3500 [(set (match_operand:VI 0 "register_operand" "=v")
kono
parents:
diff changeset
3501 (unspec:VI [(match_operand:VI 1 "register_operand" "v")
kono
parents:
diff changeset
3502 (match_operand:VI 2 "register_operand" "v")]
kono
parents:
diff changeset
3503 UNSPEC_VADU))]
kono
parents:
diff changeset
3504 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
3505 "vabsdu<wd> %0,%1,%2"
kono
parents:
diff changeset
3506 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3507
kono
parents:
diff changeset
3508 ;; Vector count trailing zeros
kono
parents:
diff changeset
3509 (define_insn "*p9v_ctz<mode>2"
kono
parents:
diff changeset
3510 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
3511 (ctz:VI2 (match_operand:VI2 1 "register_operand" "v")))]
kono
parents:
diff changeset
3512 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
3513 "vctz<wd> %0,%1"
kono
parents:
diff changeset
3514 [(set_attr "length" "4")
kono
parents:
diff changeset
3515 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3516
kono
parents:
diff changeset
3517 ;; Vector population count
kono
parents:
diff changeset
3518 (define_insn "*p8v_popcount<mode>2"
kono
parents:
diff changeset
3519 [(set (match_operand:VI2 0 "register_operand" "=v")
kono
parents:
diff changeset
3520 (popcount:VI2 (match_operand:VI2 1 "register_operand" "v")))]
kono
parents:
diff changeset
3521 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3522 "vpopcnt<wd> %0,%1"
kono
parents:
diff changeset
3523 [(set_attr "length" "4")
kono
parents:
diff changeset
3524 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3525
kono
parents:
diff changeset
3526 ;; Vector parity
kono
parents:
diff changeset
3527 (define_insn "*p9v_parity<mode>2"
kono
parents:
diff changeset
3528 [(set (match_operand:VParity 0 "register_operand" "=v")
kono
parents:
diff changeset
3529 (parity:VParity (match_operand:VParity 1 "register_operand" "v")))]
kono
parents:
diff changeset
3530 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
3531 "vprtyb<wd> %0,%1"
kono
parents:
diff changeset
3532 [(set_attr "length" "4")
kono
parents:
diff changeset
3533 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3534
kono
parents:
diff changeset
3535 ;; Vector Gather Bits by Bytes by Doubleword
kono
parents:
diff changeset
3536 (define_insn "p8v_vgbbd"
kono
parents:
diff changeset
3537 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3538 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")]
kono
parents:
diff changeset
3539 UNSPEC_VGBBD))]
kono
parents:
diff changeset
3540 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3541 "vgbbd %0,%1"
kono
parents:
diff changeset
3542 [(set_attr "length" "4")
kono
parents:
diff changeset
3543 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3544
kono
parents:
diff changeset
3545
kono
parents:
diff changeset
3546 ;; 128-bit binary integer arithmetic
kono
parents:
diff changeset
3547 ;; We have a special container type (V1TImode) to allow operations using the
kono
parents:
diff changeset
3548 ;; ISA 2.07 128-bit binary support to target the VMX/altivec registers without
kono
parents:
diff changeset
3549 ;; having to worry about the register allocator deciding GPRs are better.
kono
parents:
diff changeset
3550
kono
parents:
diff changeset
3551 (define_insn "altivec_vadduqm"
kono
parents:
diff changeset
3552 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3553 (plus:V1TI (match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3554 (match_operand:V1TI 2 "register_operand" "v")))]
kono
parents:
diff changeset
3555 "TARGET_VADDUQM"
kono
parents:
diff changeset
3556 "vadduqm %0,%1,%2"
kono
parents:
diff changeset
3557 [(set_attr "length" "4")
kono
parents:
diff changeset
3558 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3559
kono
parents:
diff changeset
3560 (define_insn "altivec_vaddcuq"
kono
parents:
diff changeset
3561 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3562 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3563 (match_operand:V1TI 2 "register_operand" "v")]
kono
parents:
diff changeset
3564 UNSPEC_VADDCUQ))]
kono
parents:
diff changeset
3565 "TARGET_VADDUQM"
kono
parents:
diff changeset
3566 "vaddcuq %0,%1,%2"
kono
parents:
diff changeset
3567 [(set_attr "length" "4")
kono
parents:
diff changeset
3568 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3569
kono
parents:
diff changeset
3570 (define_insn "altivec_vsubuqm"
kono
parents:
diff changeset
3571 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3572 (minus:V1TI (match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3573 (match_operand:V1TI 2 "register_operand" "v")))]
kono
parents:
diff changeset
3574 "TARGET_VADDUQM"
kono
parents:
diff changeset
3575 "vsubuqm %0,%1,%2"
kono
parents:
diff changeset
3576 [(set_attr "length" "4")
kono
parents:
diff changeset
3577 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3578
kono
parents:
diff changeset
3579 (define_insn "altivec_vsubcuq"
kono
parents:
diff changeset
3580 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3581 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3582 (match_operand:V1TI 2 "register_operand" "v")]
kono
parents:
diff changeset
3583 UNSPEC_VSUBCUQ))]
kono
parents:
diff changeset
3584 "TARGET_VADDUQM"
kono
parents:
diff changeset
3585 "vsubcuq %0,%1,%2"
kono
parents:
diff changeset
3586 [(set_attr "length" "4")
kono
parents:
diff changeset
3587 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3588
kono
parents:
diff changeset
3589 (define_insn "altivec_vaddeuqm"
kono
parents:
diff changeset
3590 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3591 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3592 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3593 (match_operand:V1TI 3 "register_operand" "v")]
kono
parents:
diff changeset
3594 UNSPEC_VADDEUQM))]
kono
parents:
diff changeset
3595 "TARGET_VADDUQM"
kono
parents:
diff changeset
3596 "vaddeuqm %0,%1,%2,%3"
kono
parents:
diff changeset
3597 [(set_attr "length" "4")
kono
parents:
diff changeset
3598 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3599
kono
parents:
diff changeset
3600 (define_insn "altivec_vaddecuq"
kono
parents:
diff changeset
3601 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3602 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3603 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3604 (match_operand:V1TI 3 "register_operand" "v")]
kono
parents:
diff changeset
3605 UNSPEC_VADDECUQ))]
kono
parents:
diff changeset
3606 "TARGET_VADDUQM"
kono
parents:
diff changeset
3607 "vaddecuq %0,%1,%2,%3"
kono
parents:
diff changeset
3608 [(set_attr "length" "4")
kono
parents:
diff changeset
3609 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3610
kono
parents:
diff changeset
3611 (define_insn "altivec_vsubeuqm"
kono
parents:
diff changeset
3612 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3613 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3614 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3615 (match_operand:V1TI 3 "register_operand" "v")]
kono
parents:
diff changeset
3616 UNSPEC_VSUBEUQM))]
kono
parents:
diff changeset
3617 "TARGET_VADDUQM"
kono
parents:
diff changeset
3618 "vsubeuqm %0,%1,%2,%3"
kono
parents:
diff changeset
3619 [(set_attr "length" "4")
kono
parents:
diff changeset
3620 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3621
kono
parents:
diff changeset
3622 (define_insn "altivec_vsubecuq"
kono
parents:
diff changeset
3623 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3624 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3625 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3626 (match_operand:V1TI 3 "register_operand" "v")]
kono
parents:
diff changeset
3627 UNSPEC_VSUBECUQ))]
kono
parents:
diff changeset
3628 "TARGET_VADDUQM"
kono
parents:
diff changeset
3629 "vsubecuq %0,%1,%2,%3"
kono
parents:
diff changeset
3630 [(set_attr "length" "4")
kono
parents:
diff changeset
3631 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3632
kono
parents:
diff changeset
3633 ;; We use V2DI as the output type to simplify converting the permute
kono
parents:
diff changeset
3634 ;; bits into an integer
kono
parents:
diff changeset
3635 (define_insn "altivec_vbpermq"
kono
parents:
diff changeset
3636 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
3637 (unspec:V2DI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3638 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3639 UNSPEC_VBPERMQ))]
kono
parents:
diff changeset
3640 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3641 "vbpermq %0,%1,%2"
kono
parents:
diff changeset
3642 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
3643
kono
parents:
diff changeset
3644 ; One of the vector API interfaces requires returning vector unsigned char.
kono
parents:
diff changeset
3645 (define_insn "altivec_vbpermq2"
kono
parents:
diff changeset
3646 [(set (match_operand:V16QI 0 "register_operand" "=v")
kono
parents:
diff changeset
3647 (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
kono
parents:
diff changeset
3648 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3649 UNSPEC_VBPERMQ))]
kono
parents:
diff changeset
3650 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3651 "vbpermq %0,%1,%2"
kono
parents:
diff changeset
3652 [(set_attr "type" "vecperm")])
kono
parents:
diff changeset
3653
kono
parents:
diff changeset
3654 (define_insn "altivec_vbpermd"
kono
parents:
diff changeset
3655 [(set (match_operand:V2DI 0 "register_operand" "=v")
kono
parents:
diff changeset
3656 (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "v")
kono
parents:
diff changeset
3657 (match_operand:V16QI 2 "register_operand" "v")]
kono
parents:
diff changeset
3658 UNSPEC_VBPERMD))]
kono
parents:
diff changeset
3659 "TARGET_P9_VECTOR"
kono
parents:
diff changeset
3660 "vbpermd %0,%1,%2"
kono
parents:
diff changeset
3661 [(set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3662
kono
parents:
diff changeset
3663 ;; Decimal Integer operations
kono
parents:
diff changeset
3664 (define_int_iterator UNSPEC_BCD_ADD_SUB [UNSPEC_BCDADD UNSPEC_BCDSUB])
kono
parents:
diff changeset
3665
kono
parents:
diff changeset
3666 (define_int_attr bcd_add_sub [(UNSPEC_BCDADD "add")
kono
parents:
diff changeset
3667 (UNSPEC_BCDSUB "sub")])
kono
parents:
diff changeset
3668
kono
parents:
diff changeset
3669 (define_code_iterator BCD_TEST [eq lt gt unordered])
kono
parents:
diff changeset
3670
kono
parents:
diff changeset
3671 (define_insn "bcd<bcd_add_sub>"
kono
parents:
diff changeset
3672 [(set (match_operand:V1TI 0 "gpc_reg_operand" "=v")
kono
parents:
diff changeset
3673 (unspec:V1TI [(match_operand:V1TI 1 "gpc_reg_operand" "v")
kono
parents:
diff changeset
3674 (match_operand:V1TI 2 "gpc_reg_operand" "v")
kono
parents:
diff changeset
3675 (match_operand:QI 3 "const_0_to_1_operand" "n")]
kono
parents:
diff changeset
3676 UNSPEC_BCD_ADD_SUB))
kono
parents:
diff changeset
3677 (clobber (reg:CCFP CR6_REGNO))]
kono
parents:
diff changeset
3678 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3679 "bcd<bcd_add_sub>. %0,%1,%2,%3"
kono
parents:
diff changeset
3680 [(set_attr "length" "4")
kono
parents:
diff changeset
3681 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3682
kono
parents:
diff changeset
3683 ;; Use a floating point type (V2DFmode) for the compare to set CR6 so that we
kono
parents:
diff changeset
3684 ;; can use the unordered test for BCD nans and add/subtracts that overflow. An
kono
parents:
diff changeset
3685 ;; UNORDERED test on an integer type (like V1TImode) is not defined. The type
kono
parents:
diff changeset
3686 ;; probably should be one that can go in the VMX (Altivec) registers, so we
kono
parents:
diff changeset
3687 ;; can't use DDmode or DFmode.
kono
parents:
diff changeset
3688 (define_insn "*bcd<bcd_add_sub>_test"
kono
parents:
diff changeset
3689 [(set (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3690 (compare:CCFP
kono
parents:
diff changeset
3691 (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3692 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3693 (match_operand:QI 3 "const_0_to_1_operand" "i")]
kono
parents:
diff changeset
3694 UNSPEC_BCD_ADD_SUB)
kono
parents:
diff changeset
3695 (match_operand:V2DF 4 "zero_constant" "j")))
kono
parents:
diff changeset
3696 (clobber (match_scratch:V1TI 0 "=v"))]
kono
parents:
diff changeset
3697 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3698 "bcd<bcd_add_sub>. %0,%1,%2,%3"
kono
parents:
diff changeset
3699 [(set_attr "length" "4")
kono
parents:
diff changeset
3700 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3701
kono
parents:
diff changeset
3702 (define_insn "*bcd<bcd_add_sub>_test2"
kono
parents:
diff changeset
3703 [(set (match_operand:V1TI 0 "register_operand" "=v")
kono
parents:
diff changeset
3704 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "v")
kono
parents:
diff changeset
3705 (match_operand:V1TI 2 "register_operand" "v")
kono
parents:
diff changeset
3706 (match_operand:QI 3 "const_0_to_1_operand" "i")]
kono
parents:
diff changeset
3707 UNSPEC_BCD_ADD_SUB))
kono
parents:
diff changeset
3708 (set (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3709 (compare:CCFP
kono
parents:
diff changeset
3710 (unspec:V2DF [(match_dup 1)
kono
parents:
diff changeset
3711 (match_dup 2)
kono
parents:
diff changeset
3712 (match_dup 3)]
kono
parents:
diff changeset
3713 UNSPEC_BCD_ADD_SUB)
kono
parents:
diff changeset
3714 (match_operand:V2DF 4 "zero_constant" "j")))]
kono
parents:
diff changeset
3715 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3716 "bcd<bcd_add_sub>. %0,%1,%2,%3"
kono
parents:
diff changeset
3717 [(set_attr "length" "4")
kono
parents:
diff changeset
3718 (set_attr "type" "vecsimple")])
kono
parents:
diff changeset
3719
kono
parents:
diff changeset
3720 (define_insn "darn_32"
kono
parents:
diff changeset
3721 [(set (match_operand:SI 0 "register_operand" "=r")
kono
parents:
diff changeset
3722 (unspec:SI [(const_int 0)] UNSPEC_DARN_32))]
kono
parents:
diff changeset
3723 "TARGET_P9_MISC"
kono
parents:
diff changeset
3724 "darn %0,0"
kono
parents:
diff changeset
3725 [(set_attr "type" "integer")])
kono
parents:
diff changeset
3726
kono
parents:
diff changeset
3727 (define_insn "darn_raw"
kono
parents:
diff changeset
3728 [(set (match_operand:DI 0 "register_operand" "=r")
kono
parents:
diff changeset
3729 (unspec:DI [(const_int 0)] UNSPEC_DARN_RAW))]
kono
parents:
diff changeset
3730 "TARGET_P9_MISC && TARGET_64BIT"
kono
parents:
diff changeset
3731 "darn %0,2"
kono
parents:
diff changeset
3732 [(set_attr "type" "integer")])
kono
parents:
diff changeset
3733
kono
parents:
diff changeset
3734 (define_insn "darn"
kono
parents:
diff changeset
3735 [(set (match_operand:DI 0 "register_operand" "=r")
kono
parents:
diff changeset
3736 (unspec:DI [(const_int 0)] UNSPEC_DARN))]
kono
parents:
diff changeset
3737 "TARGET_P9_MISC && TARGET_64BIT"
kono
parents:
diff changeset
3738 "darn %0,1"
kono
parents:
diff changeset
3739 [(set_attr "type" "integer")])
kono
parents:
diff changeset
3740
kono
parents:
diff changeset
3741 ;; Test byte within range.
kono
parents:
diff changeset
3742 ;;
kono
parents:
diff changeset
3743 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3744 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3745 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3746 ;; be tested for membership within the range specified by operand 2.
kono
parents:
diff changeset
3747 ;; The bytes of operand 2 are organized as xx:xx:hi:lo.
kono
parents:
diff changeset
3748 ;;
kono
parents:
diff changeset
3749 ;; Return in target register operand 0 a value of 1 if lo <= vv and
kono
parents:
diff changeset
3750 ;; vv <= hi. Otherwise, set register operand 0 to 0.
kono
parents:
diff changeset
3751 ;;
kono
parents:
diff changeset
3752 ;; Though the instructions to which this expansion maps operate on
kono
parents:
diff changeset
3753 ;; 64-bit registers, the current implementation only operates on
kono
parents:
diff changeset
3754 ;; SI-mode operands as the high-order bits provide no information
kono
parents:
diff changeset
3755 ;; that is not already available in the low-order bits. To avoid the
kono
parents:
diff changeset
3756 ;; costs of data widening operations, future enhancements might allow
kono
parents:
diff changeset
3757 ;; DI mode for operand 0 and/or might allow operand 1 to be QI mode.
kono
parents:
diff changeset
3758 (define_expand "cmprb"
kono
parents:
diff changeset
3759 [(set (match_dup 3)
kono
parents:
diff changeset
3760 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3761 (match_operand:SI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3762 UNSPEC_CMPRB))
kono
parents:
diff changeset
3763 (set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
3764 (if_then_else:SI (lt (match_dup 3)
kono
parents:
diff changeset
3765 (const_int 0))
kono
parents:
diff changeset
3766 (const_int -1)
kono
parents:
diff changeset
3767 (if_then_else (gt (match_dup 3)
kono
parents:
diff changeset
3768 (const_int 0))
kono
parents:
diff changeset
3769 (const_int 1)
kono
parents:
diff changeset
3770 (const_int 0))))]
kono
parents:
diff changeset
3771 "TARGET_P9_MISC"
kono
parents:
diff changeset
3772 {
kono
parents:
diff changeset
3773 operands[3] = gen_reg_rtx (CCmode);
kono
parents:
diff changeset
3774 })
kono
parents:
diff changeset
3775
kono
parents:
diff changeset
3776 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3777 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3778 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3779 ;; be tested for membership within the range specified by operand 2.
kono
parents:
diff changeset
3780 ;; The bytes of operand 2 are organized as xx:xx:hi:lo.
kono
parents:
diff changeset
3781 ;;
kono
parents:
diff changeset
3782 ;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if
kono
parents:
diff changeset
3783 ;; lo <= vv and vv <= hi. Otherwise, set the GT bit to 0. The other
kono
parents:
diff changeset
3784 ;; 3 bits of the target CR register are all set to 0.
kono
parents:
diff changeset
3785 (define_insn "*cmprb_internal"
kono
parents:
diff changeset
3786 [(set (match_operand:CC 0 "cc_reg_operand" "=y")
kono
parents:
diff changeset
3787 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3788 (match_operand:SI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3789 UNSPEC_CMPRB))]
kono
parents:
diff changeset
3790 "TARGET_P9_MISC"
kono
parents:
diff changeset
3791 "cmprb %0,0,%1,%2"
kono
parents:
diff changeset
3792 [(set_attr "type" "logical")])
kono
parents:
diff changeset
3793
kono
parents:
diff changeset
3794 ;; Set operand 0 register to -1 if the LT bit (0x8) of condition
kono
parents:
diff changeset
3795 ;; register operand 1 is on. Otherwise, set operand 0 register to 1
kono
parents:
diff changeset
3796 ;; if the GT bit (0x4) of condition register operand 1 is on.
kono
parents:
diff changeset
3797 ;; Otherwise, set operand 0 to 0. Note that the result stored into
kono
parents:
diff changeset
3798 ;; register operand 0 is non-zero iff either the LT or GT bits are on
kono
parents:
diff changeset
3799 ;; within condition register operand 1.
kono
parents:
diff changeset
3800 (define_insn "setb_signed"
kono
parents:
diff changeset
3801 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
3802 (if_then_else:SI (lt (match_operand:CC 1 "cc_reg_operand" "y")
kono
parents:
diff changeset
3803 (const_int 0))
kono
parents:
diff changeset
3804 (const_int -1)
kono
parents:
diff changeset
3805 (if_then_else (gt (match_dup 1)
kono
parents:
diff changeset
3806 (const_int 0))
kono
parents:
diff changeset
3807 (const_int 1)
kono
parents:
diff changeset
3808 (const_int 0))))]
kono
parents:
diff changeset
3809 "TARGET_P9_MISC"
kono
parents:
diff changeset
3810 "setb %0,%1"
kono
parents:
diff changeset
3811 [(set_attr "type" "logical")])
kono
parents:
diff changeset
3812
kono
parents:
diff changeset
3813 (define_insn "setb_unsigned"
kono
parents:
diff changeset
3814 [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
3815 (if_then_else:SI (ltu (match_operand:CCUNS 1 "cc_reg_operand" "y")
kono
parents:
diff changeset
3816 (const_int 0))
kono
parents:
diff changeset
3817 (const_int -1)
kono
parents:
diff changeset
3818 (if_then_else (gtu (match_dup 1)
kono
parents:
diff changeset
3819 (const_int 0))
kono
parents:
diff changeset
3820 (const_int 1)
kono
parents:
diff changeset
3821 (const_int 0))))]
kono
parents:
diff changeset
3822 "TARGET_P9_MISC"
kono
parents:
diff changeset
3823 "setb %0,%1"
kono
parents:
diff changeset
3824 [(set_attr "type" "logical")])
kono
parents:
diff changeset
3825
kono
parents:
diff changeset
3826 ;; Test byte within two ranges.
kono
parents:
diff changeset
3827 ;;
kono
parents:
diff changeset
3828 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3829 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3830 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3831 ;; be tested for membership within the range specified by operand 2.
kono
parents:
diff changeset
3832 ;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2.
kono
parents:
diff changeset
3833 ;;
kono
parents:
diff changeset
3834 ;; Return in target register operand 0 a value of 1 if (lo_1 <= vv and
kono
parents:
diff changeset
3835 ;; vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2). Otherwise, set register
kono
parents:
diff changeset
3836 ;; operand 0 to 0.
kono
parents:
diff changeset
3837 ;;
kono
parents:
diff changeset
3838 ;; Though the instructions to which this expansion maps operate on
kono
parents:
diff changeset
3839 ;; 64-bit registers, the current implementation only operates on
kono
parents:
diff changeset
3840 ;; SI-mode operands as the high-order bits provide no information
kono
parents:
diff changeset
3841 ;; that is not already available in the low-order bits. To avoid the
kono
parents:
diff changeset
3842 ;; costs of data widening operations, future enhancements might allow
kono
parents:
diff changeset
3843 ;; DI mode for operand 0 and/or might allow operand 1 to be QI mode.
kono
parents:
diff changeset
3844 (define_expand "cmprb2"
kono
parents:
diff changeset
3845 [(set (match_dup 3)
kono
parents:
diff changeset
3846 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3847 (match_operand:SI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3848 UNSPEC_CMPRB2))
kono
parents:
diff changeset
3849 (set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
3850 (if_then_else:SI (lt (match_dup 3)
kono
parents:
diff changeset
3851 (const_int 0))
kono
parents:
diff changeset
3852 (const_int -1)
kono
parents:
diff changeset
3853 (if_then_else (gt (match_dup 3)
kono
parents:
diff changeset
3854 (const_int 0))
kono
parents:
diff changeset
3855 (const_int 1)
kono
parents:
diff changeset
3856 (const_int 0))))]
kono
parents:
diff changeset
3857 "TARGET_P9_MISC"
kono
parents:
diff changeset
3858 {
kono
parents:
diff changeset
3859 operands[3] = gen_reg_rtx (CCmode);
kono
parents:
diff changeset
3860 })
kono
parents:
diff changeset
3861
kono
parents:
diff changeset
3862 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3863 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3864 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3865 ;; be tested for membership within the ranges specified by operand 2.
kono
parents:
diff changeset
3866 ;; The bytes of operand 2 are organized as hi_1:lo_1:hi_2:lo_2.
kono
parents:
diff changeset
3867 ;;
kono
parents:
diff changeset
3868 ;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if
kono
parents:
diff changeset
3869 ;; (lo_1 <= vv and vv <= hi_1) or if (lo_2 <= vv and vv <= hi_2).
kono
parents:
diff changeset
3870 ;; Otherwise, set the GT bit to 0. The other 3 bits of the target
kono
parents:
diff changeset
3871 ;; CR register are all set to 0.
kono
parents:
diff changeset
3872 (define_insn "*cmprb2_internal"
kono
parents:
diff changeset
3873 [(set (match_operand:CC 0 "cc_reg_operand" "=y")
kono
parents:
diff changeset
3874 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3875 (match_operand:SI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3876 UNSPEC_CMPRB2))]
kono
parents:
diff changeset
3877 "TARGET_P9_MISC"
kono
parents:
diff changeset
3878 "cmprb %0,1,%1,%2"
kono
parents:
diff changeset
3879 [(set_attr "type" "logical")])
kono
parents:
diff changeset
3880
kono
parents:
diff changeset
3881 ;; Test byte membership within set of 8 bytes.
kono
parents:
diff changeset
3882 ;;
kono
parents:
diff changeset
3883 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3884 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3885 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3886 ;; be tested for membership within the set specified by operand 2.
kono
parents:
diff changeset
3887 ;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7.
kono
parents:
diff changeset
3888 ;;
kono
parents:
diff changeset
3889 ;; Return in target register operand 0 a value of 1 if vv equals one
kono
parents:
diff changeset
3890 ;; of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise, set
kono
parents:
diff changeset
3891 ;; register operand 0 to 0. Note that the 8 byte values held within
kono
parents:
diff changeset
3892 ;; operand 2 need not be unique.
kono
parents:
diff changeset
3893 ;;
kono
parents:
diff changeset
3894 ;; Though the instructions to which this expansion maps operate on
kono
parents:
diff changeset
3895 ;; 64-bit registers, the current implementation requires that operands
kono
parents:
diff changeset
3896 ;; 0 and 1 have mode SI as the high-order bits provide no information
kono
parents:
diff changeset
3897 ;; that is not already available in the low-order bits. To avoid the
kono
parents:
diff changeset
3898 ;; costs of data widening operations, future enhancements might allow
kono
parents:
diff changeset
3899 ;; DI mode for operand 0 and/or might allow operand 1 to be QI mode.
kono
parents:
diff changeset
3900 (define_expand "cmpeqb"
kono
parents:
diff changeset
3901 [(set (match_dup 3)
kono
parents:
diff changeset
3902 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3903 (match_operand:DI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3904 UNSPEC_CMPEQB))
kono
parents:
diff changeset
3905 (set (match_operand:SI 0 "gpc_reg_operand" "=r")
kono
parents:
diff changeset
3906 (if_then_else:SI (lt (match_dup 3)
kono
parents:
diff changeset
3907 (const_int 0))
kono
parents:
diff changeset
3908 (const_int -1)
kono
parents:
diff changeset
3909 (if_then_else (gt (match_dup 3)
kono
parents:
diff changeset
3910 (const_int 0))
kono
parents:
diff changeset
3911 (const_int 1)
kono
parents:
diff changeset
3912 (const_int 0))))]
kono
parents:
diff changeset
3913 "TARGET_P9_MISC && TARGET_64BIT"
kono
parents:
diff changeset
3914 {
kono
parents:
diff changeset
3915 operands[3] = gen_reg_rtx (CCmode);
kono
parents:
diff changeset
3916 })
kono
parents:
diff changeset
3917
kono
parents:
diff changeset
3918 ;; The bytes of operand 1 are organized as xx:xx:xx:vv, where xx
kono
parents:
diff changeset
3919 ;; represents a byte whose value is ignored in this context and
kono
parents:
diff changeset
3920 ;; vv, the least significant byte, holds the byte value that is to
kono
parents:
diff changeset
3921 ;; be tested for membership within the set specified by operand 2.
kono
parents:
diff changeset
3922 ;; The bytes of operand 2 are organized as e0:e1:e2:e3:e4:e5:e6:e7.
kono
parents:
diff changeset
3923 ;;
kono
parents:
diff changeset
3924 ;; Set bit 1 (the GT bit, 0x4) of CR register operand 0 to 1 if vv
kono
parents:
diff changeset
3925 ;; equals one of the values e0, e1, e2, e3, e4, e5, e6, or e7. Otherwise,
kono
parents:
diff changeset
3926 ;; set the GT bit to zero. The other 3 bits of the target CR register
kono
parents:
diff changeset
3927 ;; are all set to 0.
kono
parents:
diff changeset
3928 (define_insn "*cmpeqb_internal"
kono
parents:
diff changeset
3929 [(set (match_operand:CC 0 "cc_reg_operand" "=y")
kono
parents:
diff changeset
3930 (unspec:CC [(match_operand:SI 1 "gpc_reg_operand" "r")
kono
parents:
diff changeset
3931 (match_operand:DI 2 "gpc_reg_operand" "r")]
kono
parents:
diff changeset
3932 UNSPEC_CMPEQB))]
kono
parents:
diff changeset
3933 "TARGET_P9_MISC && TARGET_64BIT"
kono
parents:
diff changeset
3934 "cmpeqb %0,%1,%2"
kono
parents:
diff changeset
3935 [(set_attr "type" "logical")])
kono
parents:
diff changeset
3936
kono
parents:
diff changeset
3937 (define_expand "bcd<bcd_add_sub>_<code>"
kono
parents:
diff changeset
3938 [(parallel [(set (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3939 (compare:CCFP
kono
parents:
diff changeset
3940 (unspec:V2DF [(match_operand:V1TI 1 "register_operand" "")
kono
parents:
diff changeset
3941 (match_operand:V1TI 2 "register_operand" "")
kono
parents:
diff changeset
3942 (match_operand:QI 3 "const_0_to_1_operand" "")]
kono
parents:
diff changeset
3943 UNSPEC_BCD_ADD_SUB)
kono
parents:
diff changeset
3944 (match_dup 4)))
kono
parents:
diff changeset
3945 (clobber (match_scratch:V1TI 5 ""))])
kono
parents:
diff changeset
3946 (set (match_operand:SI 0 "register_operand" "")
kono
parents:
diff changeset
3947 (BCD_TEST:SI (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3948 (const_int 0)))]
kono
parents:
diff changeset
3949 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3950 {
kono
parents:
diff changeset
3951 operands[4] = CONST0_RTX (V2DFmode);
kono
parents:
diff changeset
3952 })
kono
parents:
diff changeset
3953
kono
parents:
diff changeset
3954 ;; Peephole2 pattern to combine a bcdadd/bcdsub that calculates the value and
kono
parents:
diff changeset
3955 ;; the bcdadd/bcdsub that tests the value. The combiner won't work since
kono
parents:
diff changeset
3956 ;; CR6 is a hard coded register. Unfortunately, all of the Altivec predicate
kono
parents:
diff changeset
3957 ;; support is hard coded to use the fixed register CR6 instead of creating
kono
parents:
diff changeset
3958 ;; a register class for CR6.
kono
parents:
diff changeset
3959
kono
parents:
diff changeset
3960 (define_peephole2
kono
parents:
diff changeset
3961 [(parallel [(set (match_operand:V1TI 0 "register_operand" "")
kono
parents:
diff changeset
3962 (unspec:V1TI [(match_operand:V1TI 1 "register_operand" "")
kono
parents:
diff changeset
3963 (match_operand:V1TI 2 "register_operand" "")
kono
parents:
diff changeset
3964 (match_operand:QI 3 "const_0_to_1_operand" "")]
kono
parents:
diff changeset
3965 UNSPEC_BCD_ADD_SUB))
kono
parents:
diff changeset
3966 (clobber (reg:CCFP CR6_REGNO))])
kono
parents:
diff changeset
3967 (parallel [(set (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3968 (compare:CCFP
kono
parents:
diff changeset
3969 (unspec:V2DF [(match_dup 1)
kono
parents:
diff changeset
3970 (match_dup 2)
kono
parents:
diff changeset
3971 (match_dup 3)]
kono
parents:
diff changeset
3972 UNSPEC_BCD_ADD_SUB)
kono
parents:
diff changeset
3973 (match_operand:V2DF 4 "zero_constant" "")))
kono
parents:
diff changeset
3974 (clobber (match_operand:V1TI 5 "register_operand" ""))])]
kono
parents:
diff changeset
3975 "TARGET_P8_VECTOR"
kono
parents:
diff changeset
3976 [(parallel [(set (match_dup 0)
kono
parents:
diff changeset
3977 (unspec:V1TI [(match_dup 1)
kono
parents:
diff changeset
3978 (match_dup 2)
kono
parents:
diff changeset
3979 (match_dup 3)]
kono
parents:
diff changeset
3980 UNSPEC_BCD_ADD_SUB))
kono
parents:
diff changeset
3981 (set (reg:CCFP CR6_REGNO)
kono
parents:
diff changeset
3982 (compare:CCFP
kono
parents:
diff changeset
3983 (unspec:V2DF [(match_dup 1)
kono
parents:
diff changeset
3984 (match_dup 2)
kono
parents:
diff changeset
3985 (match_dup 3)]
kono
parents:
diff changeset
3986 UNSPEC_BCD_ADD_SUB)
kono
parents:
diff changeset
3987 (match_dup 4)))])])