2009-07-17 Richard Guenther <rguenther@suse.de>
[official-gcc.git] / gcc / config / rs6000 / altivec.md
blob9c6245ae8ac785c7750f96b87ed1650a9444d074
1 ;; AltiVec patterns.
2 ;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 ;; Free Software Foundation, Inc.
4 ;; Contributed by Aldy Hernandez (aldy@quesejoda.com)
6 ;; This file is part of GCC.
8 ;; GCC is free software; you can redistribute it and/or modify it
9 ;; under the terms of the GNU General Public License as published
10 ;; by the Free Software Foundation; either version 3, or (at your
11 ;; option) any later version.
13 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
14 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16 ;; License for more details.
18 ;; You should have received a copy of the GNU General Public License
19 ;; along with GCC; see the file COPYING3.  If not see
20 ;; <http://www.gnu.org/licenses/>.
22 (define_constants
23   [(UNSPEC_VCMPBFP       50)
24    (UNSPEC_VCMPEQUB      51)
25    (UNSPEC_VCMPEQUH      52)
26    (UNSPEC_VCMPEQUW      53)
27    (UNSPEC_VCMPEQFP      54)
28    (UNSPEC_VCMPGEFP      55)
29    (UNSPEC_VCMPGTUB      56)
30    (UNSPEC_VCMPGTSB      57)
31    (UNSPEC_VCMPGTUH      58)
32    (UNSPEC_VCMPGTSH      59)
33    (UNSPEC_VCMPGTUW      60)
34    (UNSPEC_VCMPGTSW      61)
35    (UNSPEC_VCMPGTFP      62)
36    (UNSPEC_VMSUMU        65)
37    (UNSPEC_VMSUMM        66)
38    (UNSPEC_VMSUMSHM      68)
39    (UNSPEC_VMSUMUHS      69)
40    (UNSPEC_VMSUMSHS      70)
41    (UNSPEC_VMHADDSHS     71)
42    (UNSPEC_VMHRADDSHS    72)
43    (UNSPEC_VMLADDUHM     73)
44    (UNSPEC_VADDCUW       75)
45    (UNSPEC_VADDU         76)
46    (UNSPEC_VADDS         77)
47    (UNSPEC_VAVGU         80)
48    (UNSPEC_VAVGS         81)
49    (UNSPEC_VMULEUB       83)
50    (UNSPEC_VMULESB       84)
51    (UNSPEC_VMULEUH       85)
52    (UNSPEC_VMULESH       86)
53    (UNSPEC_VMULOUB       87)
54    (UNSPEC_VMULOSB       88)
55    (UNSPEC_VMULOUH       89)
56    (UNSPEC_VMULOSH       90)
57    (UNSPEC_VPKUHUM       93)
58    (UNSPEC_VPKUWUM       94)
59    (UNSPEC_VPKPX         95)
60    (UNSPEC_VPKSHSS       97)
61    (UNSPEC_VPKSWSS       99)
62    (UNSPEC_VPKUHUS      100)
63    (UNSPEC_VPKSHUS      101)
64    (UNSPEC_VPKUWUS      102)
65    (UNSPEC_VPKSWUS      103)
66    (UNSPEC_VRL          104)
67    (UNSPEC_VSLV4SI      110)
68    (UNSPEC_VSLO         111)
69    (UNSPEC_VSR          118)
70    (UNSPEC_VSRO         119)
71    (UNSPEC_VSUBCUW      124)
72    (UNSPEC_VSUBU        125)
73    (UNSPEC_VSUBS        126)
74    (UNSPEC_VSUM4UBS     131)
75    (UNSPEC_VSUM4S       132)
76    (UNSPEC_VSUM2SWS     134)
77    (UNSPEC_VSUMSWS      135)
78    (UNSPEC_VPERM        144)
79    (UNSPEC_VRFIP        148)
80    (UNSPEC_VRFIN        149)
81    (UNSPEC_VRFIM        150)
82    (UNSPEC_VCFUX        151)
83    (UNSPEC_VCFSX        152)
84    (UNSPEC_VCTUXS       153)
85    (UNSPEC_VCTSXS       154)
86    (UNSPEC_VLOGEFP      155)
87    (UNSPEC_VEXPTEFP     156)
88    (UNSPEC_VRSQRTEFP    157)
89    (UNSPEC_VREFP        158)
90    (UNSPEC_VSEL4SI      159)
91    (UNSPEC_VSEL4SF      160)
92    (UNSPEC_VSEL8HI      161)
93    (UNSPEC_VSEL16QI     162)
94    (UNSPEC_VLSDOI       163)
95    (UNSPEC_VUPKHSB      167)
96    (UNSPEC_VUPKHPX      168)
97    (UNSPEC_VUPKHSH      169)
98    (UNSPEC_VUPKLSB      170)
99    (UNSPEC_VUPKLPX      171)
100    (UNSPEC_VUPKLSH      172)
101    (UNSPEC_PREDICATE    173)
102    (UNSPEC_DST          190)
103    (UNSPEC_DSTT         191)
104    (UNSPEC_DSTST        192)
105    (UNSPEC_DSTSTT       193)
106    (UNSPEC_LVSL         194)
107    (UNSPEC_LVSR         195)
108    (UNSPEC_LVE          196)
109    (UNSPEC_STVX         201)
110    (UNSPEC_STVXL        202)
111    (UNSPEC_STVE         203)
112    (UNSPEC_SET_VSCR     213)
113    (UNSPEC_GET_VRSAVE   214)
114    (UNSPEC_REALIGN_LOAD 215)
115    (UNSPEC_REDUC_PLUS   217)
116    (UNSPEC_VECSH        219)
117    (UNSPEC_EXTEVEN_V4SI 220)
118    (UNSPEC_EXTEVEN_V8HI 221)
119    (UNSPEC_EXTEVEN_V16QI 222)
120    (UNSPEC_EXTEVEN_V4SF 223)
121    (UNSPEC_EXTODD_V4SI  224)
122    (UNSPEC_EXTODD_V8HI  225)
123    (UNSPEC_EXTODD_V16QI 226)
124    (UNSPEC_EXTODD_V4SF  227)
125    (UNSPEC_INTERHI_V4SI 228)
126    (UNSPEC_INTERHI_V8HI 229)
127    (UNSPEC_INTERHI_V16QI 230)
128    (UNSPEC_INTERHI_V4SF 231)
129    (UNSPEC_INTERLO_V4SI 232)
130    (UNSPEC_INTERLO_V8HI 233)
131    (UNSPEC_INTERLO_V16QI 234)
132    (UNSPEC_INTERLO_V4SF 235)
133    (UNSPEC_LVLX         236)
134    (UNSPEC_LVLXL        237)
135    (UNSPEC_LVRX         238)
136    (UNSPEC_LVRXL        239)
137    (UNSPEC_STVLX        240)
138    (UNSPEC_STVLXL       241)
139    (UNSPEC_STVRX        242)
140    (UNSPEC_STVRXL       243)
141    (UNSPEC_VMULWHUB     308)
142    (UNSPEC_VMULWLUB     309)
143    (UNSPEC_VMULWHSB     310)
144    (UNSPEC_VMULWLSB     311)
145    (UNSPEC_VMULWHUH     312)
146    (UNSPEC_VMULWLUH     313)
147    (UNSPEC_VMULWHSH     314)
148    (UNSPEC_VMULWLSH     315)
149    (UNSPEC_VUPKHUB      316)
150    (UNSPEC_VUPKHUH      317)
151    (UNSPEC_VUPKLUB      318)
152    (UNSPEC_VUPKLUH      319)
153    (UNSPEC_VPERMSI      320)
154    (UNSPEC_VPERMHI      321)
155    (UNSPEC_INTERHI      322)
156    (UNSPEC_INTERLO      323)
157    (UNSPEC_VUPKHS_V4SF   324)
158    (UNSPEC_VUPKLS_V4SF   325)
159    (UNSPEC_VUPKHU_V4SF   326)
160    (UNSPEC_VUPKLU_V4SF   327)
163 (define_constants
164   [(UNSPECV_SET_VRSAVE   30)
165    (UNSPECV_MTVSCR      186)
166    (UNSPECV_MFVSCR      187)
167    (UNSPECV_DSSALL      188)
168    (UNSPECV_DSS         189)
169   ])
171 ;; Vec int modes
172 (define_mode_iterator VI [V4SI V8HI V16QI])
173 ;; Short vec in modes
174 (define_mode_iterator VIshort [V8HI V16QI])
175 ;; Vec float modes
176 (define_mode_iterator VF [V4SF])
177 ;; Vec modes, pity mode iterators are not composable
178 (define_mode_iterator V [V4SI V8HI V16QI V4SF])
180 (define_mode_attr VI_char [(V4SI "w") (V8HI "h") (V16QI "b")])
182 ;; Generic LVX load instruction.
183 (define_insn "altivec_lvx_<mode>"
184   [(set (match_operand:V 0 "altivec_register_operand" "=v")
185         (match_operand:V 1 "memory_operand" "Z"))]
186   "TARGET_ALTIVEC"
187   "lvx %0,%y1"
188   [(set_attr "type" "vecload")])
190 ;; Generic STVX store instruction.
191 (define_insn "altivec_stvx_<mode>"
192   [(set (match_operand:V 0 "memory_operand" "=Z")
193         (match_operand:V 1 "altivec_register_operand" "v"))]
194   "TARGET_ALTIVEC"
195   "stvx %1,%y0"
196   [(set_attr "type" "vecstore")])
198 ;; Vector move instructions.
199 (define_expand "mov<mode>"
200   [(set (match_operand:V 0 "nonimmediate_operand" "")
201         (match_operand:V 1 "any_operand" ""))]
202   "TARGET_ALTIVEC"
204   rs6000_emit_move (operands[0], operands[1], <MODE>mode);
205   DONE;
208 (define_insn "*mov<mode>_internal"
209   [(set (match_operand:V 0 "nonimmediate_operand" "=Z,v,v,o,r,r,v")
210         (match_operand:V 1 "input_operand" "v,Z,v,r,o,r,W"))]
211   "TARGET_ALTIVEC 
212    && (register_operand (operands[0], <MODE>mode) 
213        || register_operand (operands[1], <MODE>mode))"
215   switch (which_alternative)
216     {
217     case 0: return "stvx %1,%y0";
218     case 1: return "lvx %0,%y1";
219     case 2: return "vor %0,%1,%1";
220     case 3: return "#";
221     case 4: return "#";
222     case 5: return "#";
223     case 6: return output_vec_const_move (operands);
224     default: gcc_unreachable ();
225     }
227   [(set_attr "type" "vecstore,vecload,vecsimple,store,load,*,*")])
229 (define_split
230   [(set (match_operand:V4SI 0 "nonimmediate_operand" "")
231         (match_operand:V4SI 1 "input_operand" ""))]
232   "TARGET_ALTIVEC && reload_completed
233    && gpr_or_gpr_p (operands[0], operands[1])"
234   [(pc)]
236   rs6000_split_multireg_move (operands[0], operands[1]); DONE;
239 (define_split
240   [(set (match_operand:V8HI 0 "nonimmediate_operand" "")
241         (match_operand:V8HI 1 "input_operand" ""))]
242   "TARGET_ALTIVEC && reload_completed
243    && gpr_or_gpr_p (operands[0], operands[1])"
244   [(pc)]
245 { rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
247 (define_split
248   [(set (match_operand:V16QI 0 "nonimmediate_operand" "")
249         (match_operand:V16QI 1 "input_operand" ""))]
250   "TARGET_ALTIVEC && reload_completed
251    && gpr_or_gpr_p (operands[0], operands[1])"
252   [(pc)]
253 { rs6000_split_multireg_move (operands[0], operands[1]); DONE; })
255 (define_split
256   [(set (match_operand:V4SF 0 "nonimmediate_operand" "")
257         (match_operand:V4SF 1 "input_operand" ""))]
258   "TARGET_ALTIVEC && reload_completed
259    && gpr_or_gpr_p (operands[0], operands[1])"
260   [(pc)]
262   rs6000_split_multireg_move (operands[0], operands[1]); DONE;
265 (define_split
266   [(set (match_operand:V 0 "altivec_register_operand" "")
267         (match_operand:V 1 "easy_vector_constant_add_self" ""))]
268   "TARGET_ALTIVEC && reload_completed"
269   [(set (match_dup 0) (match_dup 3))
270    (set (match_dup 0) (match_dup 4))]
272   rtx dup = gen_easy_altivec_constant (operands[1]);
273   rtx const_vec;
274   enum machine_mode op_mode = <MODE>mode;
276   /* Divide the operand of the resulting VEC_DUPLICATE, and use
277      simplify_rtx to make a CONST_VECTOR.  */
278   XEXP (dup, 0) = simplify_const_binary_operation (ASHIFTRT, QImode,
279                                                    XEXP (dup, 0), const1_rtx);
280   const_vec = simplify_rtx (dup);
282   if (op_mode == V4SFmode)
283     {
284       op_mode = V4SImode;
285       operands[0] = gen_lowpart (op_mode, operands[0]);
286     }
287   if (GET_MODE (const_vec) == op_mode)
288     operands[3] = const_vec;
289   else
290     operands[3] = gen_lowpart (op_mode, const_vec);
291   operands[4] = gen_rtx_PLUS (op_mode, operands[0], operands[0]);
294 (define_insn "get_vrsave_internal"
295   [(set (match_operand:SI 0 "register_operand" "=r")
296         (unspec:SI [(reg:SI 109)] UNSPEC_GET_VRSAVE))]
297   "TARGET_ALTIVEC"
299   if (TARGET_MACHO)
300      return "mfspr %0,256";
301   else
302      return "mfvrsave %0";
304   [(set_attr "type" "*")])
306 (define_insn "*set_vrsave_internal"
307   [(match_parallel 0 "vrsave_operation"
308      [(set (reg:SI 109)
309            (unspec_volatile:SI [(match_operand:SI 1 "register_operand" "r")
310                                 (reg:SI 109)] UNSPECV_SET_VRSAVE))])]
311   "TARGET_ALTIVEC"
313   if (TARGET_MACHO)
314     return "mtspr 256,%1";
315   else
316     return "mtvrsave %1";
318   [(set_attr "type" "*")])
320 (define_insn "*save_world"
321  [(match_parallel 0 "save_world_operation"
322                   [(clobber (reg:SI 65))
323                    (use (match_operand:SI 1 "call_operand" "s"))])]
324  "TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT"         
325  "bl %z1"
326   [(set_attr "type" "branch")
327    (set_attr "length" "4")])
329 (define_insn "*restore_world"
330  [(match_parallel 0 "restore_world_operation"
331                   [(return)
332                    (use (reg:SI 65))
333                    (use (match_operand:SI 1 "call_operand" "s"))
334                    (clobber (match_operand:SI 2 "gpc_reg_operand" "=r"))])]
335  "TARGET_MACHO && (DEFAULT_ABI == ABI_DARWIN) && TARGET_32BIT"
336  "b %z1")
338 ;; Simple binary operations.
340 ;; add
341 (define_insn "add<mode>3"
342   [(set (match_operand:VI 0 "register_operand" "=v")
343         (plus:VI (match_operand:VI 1 "register_operand" "v")
344                  (match_operand:VI 2 "register_operand" "v")))]
345   "TARGET_ALTIVEC"
346   "vaddu<VI_char>m %0,%1,%2"
347   [(set_attr "type" "vecsimple")])
349 (define_insn "addv4sf3"
350   [(set (match_operand:V4SF 0 "register_operand" "=v")
351         (plus:V4SF (match_operand:V4SF 1 "register_operand" "v")
352                    (match_operand:V4SF 2 "register_operand" "v")))]
353   "TARGET_ALTIVEC"
354   "vaddfp %0,%1,%2"
355   [(set_attr "type" "vecfloat")])
357 (define_insn "altivec_vaddcuw"
358   [(set (match_operand:V4SI 0 "register_operand" "=v")
359         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
360                       (match_operand:V4SI 2 "register_operand" "v")]
361                      UNSPEC_VADDCUW))]
362   "TARGET_ALTIVEC"
363   "vaddcuw %0,%1,%2"
364   [(set_attr "type" "vecsimple")])
366 (define_insn "altivec_vaddu<VI_char>s"
367   [(set (match_operand:VI 0 "register_operand" "=v")
368         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
369                     (match_operand:VI 2 "register_operand" "v")]
370                    UNSPEC_VADDU))
371    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
372   "TARGET_ALTIVEC"
373   "vaddu<VI_char>s %0,%1,%2"
374   [(set_attr "type" "vecsimple")])
376 (define_insn "altivec_vadds<VI_char>s"
377   [(set (match_operand:VI 0 "register_operand" "=v")
378         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
379                     (match_operand:VI 2 "register_operand" "v")]
380                    UNSPEC_VADDS))
381    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
382   "TARGET_ALTIVEC"
383   "vadds<VI_char>s %0,%1,%2"
384   [(set_attr "type" "vecsimple")])
386 ;; sub
387 (define_insn "sub<mode>3"
388   [(set (match_operand:VI 0 "register_operand" "=v")
389         (minus:VI (match_operand:VI 1 "register_operand" "v")
390                   (match_operand:VI 2 "register_operand" "v")))]
391   "TARGET_ALTIVEC"
392   "vsubu<VI_char>m %0,%1,%2"
393   [(set_attr "type" "vecsimple")])
395 (define_insn "subv4sf3"
396   [(set (match_operand:V4SF 0 "register_operand" "=v")
397         (minus:V4SF (match_operand:V4SF 1 "register_operand" "v")
398                     (match_operand:V4SF 2 "register_operand" "v")))]
399   "TARGET_ALTIVEC"
400   "vsubfp %0,%1,%2"
401   [(set_attr "type" "vecfloat")])
403 (define_insn "altivec_vsubcuw"
404   [(set (match_operand:V4SI 0 "register_operand" "=v")
405         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
406                       (match_operand:V4SI 2 "register_operand" "v")]
407                      UNSPEC_VSUBCUW))]
408   "TARGET_ALTIVEC"
409   "vsubcuw %0,%1,%2"
410   [(set_attr "type" "vecsimple")])
412 (define_insn "altivec_vsubu<VI_char>s"
413   [(set (match_operand:VI 0 "register_operand" "=v")
414         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
415                     (match_operand:VI 2 "register_operand" "v")]
416                    UNSPEC_VSUBU))
417    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
418   "TARGET_ALTIVEC"
419   "vsubu<VI_char>s %0,%1,%2"
420   [(set_attr "type" "vecsimple")])
422 (define_insn "altivec_vsubs<VI_char>s"
423   [(set (match_operand:VI 0 "register_operand" "=v")
424         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
425                     (match_operand:VI 2 "register_operand" "v")]
426                    UNSPEC_VSUBS))
427    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
428   "TARGET_ALTIVEC"
429   "vsubs<VI_char>s %0,%1,%2"
430   [(set_attr "type" "vecsimple")])
433 (define_insn "altivec_vavgu<VI_char>"
434   [(set (match_operand:VI 0 "register_operand" "=v")
435         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
436                     (match_operand:VI 2 "register_operand" "v")]
437                    UNSPEC_VAVGU))]
438   "TARGET_ALTIVEC"
439   "vavgu<VI_char> %0,%1,%2"
440   [(set_attr "type" "vecsimple")])
442 (define_insn "altivec_vavgs<VI_char>"
443   [(set (match_operand:VI 0 "register_operand" "=v")
444         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
445                     (match_operand:VI 2 "register_operand" "v")]
446                    UNSPEC_VAVGS))]
447   "TARGET_ALTIVEC"
448   "vavgs<VI_char> %0,%1,%2"
449   [(set_attr "type" "vecsimple")])
451 (define_insn "altivec_vcmpbfp"
452   [(set (match_operand:V4SI 0 "register_operand" "=v")
453         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
454                       (match_operand:V4SF 2 "register_operand" "v")] 
455                       UNSPEC_VCMPBFP))]
456   "TARGET_ALTIVEC"
457   "vcmpbfp %0,%1,%2"
458   [(set_attr "type" "veccmp")])
460 (define_insn "altivec_vcmpequb"
461   [(set (match_operand:V16QI 0 "register_operand" "=v")
462         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
463                        (match_operand:V16QI 2 "register_operand" "v")] 
464                        UNSPEC_VCMPEQUB))]
465   "TARGET_ALTIVEC"
466   "vcmpequb %0,%1,%2"
467   [(set_attr "type" "vecsimple")])
469 (define_insn "altivec_vcmpequh"
470   [(set (match_operand:V8HI 0 "register_operand" "=v")
471         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
472                       (match_operand:V8HI 2 "register_operand" "v")] 
473                       UNSPEC_VCMPEQUH))]
474   "TARGET_ALTIVEC"
475   "vcmpequh %0,%1,%2"
476   [(set_attr "type" "vecsimple")])
478 (define_insn "altivec_vcmpequw"
479   [(set (match_operand:V4SI 0 "register_operand" "=v")
480         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
481                       (match_operand:V4SI 2 "register_operand" "v")] 
482                       UNSPEC_VCMPEQUW))]
483   "TARGET_ALTIVEC"
484   "vcmpequw %0,%1,%2"
485   [(set_attr "type" "vecsimple")])
487 (define_insn "altivec_vcmpeqfp"
488   [(set (match_operand:V4SI 0 "register_operand" "=v")
489         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
490                       (match_operand:V4SF 2 "register_operand" "v")] 
491                       UNSPEC_VCMPEQFP))]
492   "TARGET_ALTIVEC"
493   "vcmpeqfp %0,%1,%2"
494   [(set_attr "type" "veccmp")])
496 (define_insn "altivec_vcmpgefp"
497   [(set (match_operand:V4SI 0 "register_operand" "=v")
498         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
499                       (match_operand:V4SF 2 "register_operand" "v")] 
500                      UNSPEC_VCMPGEFP))]
501   "TARGET_ALTIVEC"
502   "vcmpgefp %0,%1,%2"
503   [(set_attr "type" "veccmp")])
505 (define_insn "altivec_vcmpgtub"
506   [(set (match_operand:V16QI 0 "register_operand" "=v")
507         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
508                        (match_operand:V16QI 2 "register_operand" "v")] 
509                       UNSPEC_VCMPGTUB))]
510   "TARGET_ALTIVEC"
511   "vcmpgtub %0,%1,%2"
512   [(set_attr "type" "vecsimple")])
514 (define_insn "altivec_vcmpgtsb"
515   [(set (match_operand:V16QI 0 "register_operand" "=v")
516         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
517                        (match_operand:V16QI 2 "register_operand" "v")] 
518                       UNSPEC_VCMPGTSB))]
519   "TARGET_ALTIVEC"
520   "vcmpgtsb %0,%1,%2"
521   [(set_attr "type" "vecsimple")])
523 (define_insn "altivec_vcmpgtuh"
524   [(set (match_operand:V8HI 0 "register_operand" "=v")
525         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
526                       (match_operand:V8HI 2 "register_operand" "v")] 
527                      UNSPEC_VCMPGTUH))]
528   "TARGET_ALTIVEC"
529   "vcmpgtuh %0,%1,%2"
530   [(set_attr "type" "vecsimple")])
532 (define_insn "altivec_vcmpgtsh"
533   [(set (match_operand:V8HI 0 "register_operand" "=v")
534         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
535                       (match_operand:V8HI 2 "register_operand" "v")] 
536                      UNSPEC_VCMPGTSH))]
537   "TARGET_ALTIVEC"
538   "vcmpgtsh %0,%1,%2"
539   [(set_attr "type" "vecsimple")])
541 (define_insn "altivec_vcmpgtuw"
542   [(set (match_operand:V4SI 0 "register_operand" "=v")
543         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
544                       (match_operand:V4SI 2 "register_operand" "v")] 
545                      UNSPEC_VCMPGTUW))]
546   "TARGET_ALTIVEC"
547   "vcmpgtuw %0,%1,%2"
548   [(set_attr "type" "vecsimple")])
550 (define_insn "altivec_vcmpgtsw"
551   [(set (match_operand:V4SI 0 "register_operand" "=v")
552         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
553                       (match_operand:V4SI 2 "register_operand" "v")] 
554                      UNSPEC_VCMPGTSW))]
555   "TARGET_ALTIVEC"
556   "vcmpgtsw %0,%1,%2"
557   [(set_attr "type" "vecsimple")])
559 (define_insn "altivec_vcmpgtfp"
560   [(set (match_operand:V4SI 0 "register_operand" "=v")
561         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
562                       (match_operand:V4SF 2 "register_operand" "v")] 
563                      UNSPEC_VCMPGTFP))]
564   "TARGET_ALTIVEC"
565   "vcmpgtfp %0,%1,%2"
566   [(set_attr "type" "veccmp")])
568 ;; Fused multiply add
569 (define_insn "altivec_vmaddfp"
570   [(set (match_operand:V4SF 0 "register_operand" "=v")
571         (plus:V4SF (mult:V4SF (match_operand:V4SF 1 "register_operand" "v")
572                               (match_operand:V4SF 2 "register_operand" "v"))
573                    (match_operand:V4SF 3 "register_operand" "v")))]
574   "TARGET_ALTIVEC"
575   "vmaddfp %0,%1,%2,%3"
576   [(set_attr "type" "vecfloat")])
578 ;; We do multiply as a fused multiply-add with an add of a -0.0 vector.
580 (define_expand "mulv4sf3"
581   [(use (match_operand:V4SF 0 "register_operand" ""))
582    (use (match_operand:V4SF 1 "register_operand" ""))
583    (use (match_operand:V4SF 2 "register_operand" ""))]
584   "TARGET_ALTIVEC && TARGET_FUSED_MADD"
585   "
587   rtx neg0;
589   /* Generate [-0.0, -0.0, -0.0, -0.0].  */
590   neg0 = gen_reg_rtx (V4SImode);
591   emit_insn (gen_altivec_vspltisw (neg0, constm1_rtx));
592   emit_insn (gen_vashlv4si3 (neg0, neg0, neg0));
594   /* Use the multiply-add.  */
595   emit_insn (gen_altivec_vmaddfp (operands[0], operands[1], operands[2],
596                                   gen_lowpart (V4SFmode, neg0)));
597   DONE;
600 ;; 32-bit integer multiplication
601 ;; A_high = Operand_0 & 0xFFFF0000 >> 16
602 ;; A_low = Operand_0 & 0xFFFF
603 ;; B_high = Operand_1 & 0xFFFF0000 >> 16
604 ;; B_low = Operand_1 & 0xFFFF
605 ;; result = A_low * B_low + (A_high * B_low + B_high * A_low) << 16
607 ;; (define_insn "mulv4si3"
608 ;;   [(set (match_operand:V4SI 0 "register_operand" "=v")
609 ;;         (mult:V4SI (match_operand:V4SI 1 "register_operand" "v")
610 ;;                    (match_operand:V4SI 2 "register_operand" "v")))]
611 (define_expand "mulv4si3"
612   [(use (match_operand:V4SI 0 "register_operand" ""))
613    (use (match_operand:V4SI 1 "register_operand" ""))
614    (use (match_operand:V4SI 2 "register_operand" ""))]
615    "TARGET_ALTIVEC"
616    "
618    rtx zero;
619    rtx swap;
620    rtx small_swap;
621    rtx sixteen;
622    rtx one;
623    rtx two;
624    rtx low_product;
625    rtx high_product;
626        
627    zero = gen_reg_rtx (V4SImode);
628    emit_insn (gen_altivec_vspltisw (zero, const0_rtx));
630    sixteen = gen_reg_rtx (V4SImode);   
631    emit_insn (gen_altivec_vspltisw (sixteen,  gen_rtx_CONST_INT (V4SImode, -16)));
633    swap = gen_reg_rtx (V4SImode);
634    emit_insn (gen_altivec_vrlw (swap, operands[2], sixteen));
636    one = gen_reg_rtx (V8HImode);
637    convert_move (one, operands[1], 0);
639    two = gen_reg_rtx (V8HImode);
640    convert_move (two, operands[2], 0);
642    small_swap = gen_reg_rtx (V8HImode);
643    convert_move (small_swap, swap, 0);
645    low_product = gen_reg_rtx (V4SImode);
646    emit_insn (gen_altivec_vmulouh (low_product, one, two));
648    high_product = gen_reg_rtx (V4SImode);
649    emit_insn (gen_altivec_vmsumuhm (high_product, one, small_swap, zero));
651    emit_insn (gen_vashlv4si3 (high_product, high_product, sixteen));
653    emit_insn (gen_addv4si3 (operands[0], high_product, low_product));
654    
655    DONE;
656  }")
658 (define_expand "mulv8hi3"
659   [(use (match_operand:V8HI 0 "register_operand" ""))
660    (use (match_operand:V8HI 1 "register_operand" ""))
661    (use (match_operand:V8HI 2 "register_operand" ""))]
662    "TARGET_ALTIVEC"
663    "
665    rtx odd = gen_reg_rtx (V4SImode);
666    rtx even = gen_reg_rtx (V4SImode);
667    rtx high = gen_reg_rtx (V4SImode);
668    rtx low = gen_reg_rtx (V4SImode);
670    emit_insn (gen_altivec_vmulesh (even, operands[1], operands[2]));
671    emit_insn (gen_altivec_vmulosh (odd, operands[1], operands[2]));
673    emit_insn (gen_altivec_vmrghw (high, even, odd));
674    emit_insn (gen_altivec_vmrglw (low, even, odd));
676    emit_insn (gen_altivec_vpkuwum (operands[0], high, low));
678    DONE;
681 ;; Fused multiply subtract 
682 (define_insn "altivec_vnmsubfp"
683   [(set (match_operand:V4SF 0 "register_operand" "=v")
684         (neg:V4SF (minus:V4SF (mult:V4SF (match_operand:V4SF 1 "register_operand" "v")
685                                (match_operand:V4SF 2 "register_operand" "v"))
686                     (match_operand:V4SF 3 "register_operand" "v"))))]
687   "TARGET_ALTIVEC"
688   "vnmsubfp %0,%1,%2,%3"
689   [(set_attr "type" "vecfloat")])
691 (define_insn "altivec_vmsumu<VI_char>m"
692   [(set (match_operand:V4SI 0 "register_operand" "=v")
693         (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
694                       (match_operand:VIshort 2 "register_operand" "v")
695                       (match_operand:V4SI 3 "register_operand" "v")]
696                      UNSPEC_VMSUMU))]
697   "TARGET_ALTIVEC"
698   "vmsumu<VI_char>m %0,%1,%2,%3"
699   [(set_attr "type" "veccomplex")])
701 (define_insn "altivec_vmsumm<VI_char>m"
702   [(set (match_operand:V4SI 0 "register_operand" "=v")
703         (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
704                       (match_operand:VIshort 2 "register_operand" "v")
705                       (match_operand:V4SI 3 "register_operand" "v")]
706                      UNSPEC_VMSUMM))]
707   "TARGET_ALTIVEC"
708   "vmsumm<VI_char>m %0,%1,%2,%3"
709   [(set_attr "type" "veccomplex")])
711 (define_insn "altivec_vmsumshm"
712   [(set (match_operand:V4SI 0 "register_operand" "=v")
713         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
714                       (match_operand:V8HI 2 "register_operand" "v")
715                       (match_operand:V4SI 3 "register_operand" "v")]
716                      UNSPEC_VMSUMSHM))]
717   "TARGET_ALTIVEC"
718   "vmsumshm %0,%1,%2,%3"
719   [(set_attr "type" "veccomplex")])
721 (define_insn "altivec_vmsumuhs"
722   [(set (match_operand:V4SI 0 "register_operand" "=v")
723         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
724                       (match_operand:V8HI 2 "register_operand" "v")
725                       (match_operand:V4SI 3 "register_operand" "v")]
726                      UNSPEC_VMSUMUHS))
727    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
728   "TARGET_ALTIVEC"
729   "vmsumuhs %0,%1,%2,%3"
730   [(set_attr "type" "veccomplex")])
732 (define_insn "altivec_vmsumshs"
733   [(set (match_operand:V4SI 0 "register_operand" "=v")
734         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
735                       (match_operand:V8HI 2 "register_operand" "v")
736                       (match_operand:V4SI 3 "register_operand" "v")]
737                      UNSPEC_VMSUMSHS))
738    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
739   "TARGET_ALTIVEC"
740   "vmsumshs %0,%1,%2,%3"
741   [(set_attr "type" "veccomplex")])
743 ;; max
745 (define_insn "umax<mode>3"
746   [(set (match_operand:VI 0 "register_operand" "=v")
747         (umax:VI (match_operand:VI 1 "register_operand" "v")
748                  (match_operand:VI 2 "register_operand" "v")))]
749   "TARGET_ALTIVEC"
750   "vmaxu<VI_char> %0,%1,%2"
751   [(set_attr "type" "vecsimple")])
753 (define_insn "smax<mode>3"
754   [(set (match_operand:VI 0 "register_operand" "=v")
755         (smax:VI (match_operand:VI 1 "register_operand" "v")
756                  (match_operand:VI 2 "register_operand" "v")))]
757   "TARGET_ALTIVEC"
758   "vmaxs<VI_char> %0,%1,%2"
759   [(set_attr "type" "vecsimple")])
761 (define_insn "smaxv4sf3"
762   [(set (match_operand:V4SF 0 "register_operand" "=v")
763         (smax:V4SF (match_operand:V4SF 1 "register_operand" "v")
764                    (match_operand:V4SF 2 "register_operand" "v")))]
765   "TARGET_ALTIVEC"
766   "vmaxfp %0,%1,%2"
767   [(set_attr "type" "veccmp")])
769 (define_insn "umin<mode>3"
770   [(set (match_operand:VI 0 "register_operand" "=v")
771         (umin:VI (match_operand:VI 1 "register_operand" "v")
772                  (match_operand:VI 2 "register_operand" "v")))]
773   "TARGET_ALTIVEC"
774   "vminu<VI_char> %0,%1,%2"
775   [(set_attr "type" "vecsimple")])
777 (define_insn "smin<mode>3"
778   [(set (match_operand:VI 0 "register_operand" "=v")
779         (smin:VI (match_operand:VI 1 "register_operand" "v")
780                  (match_operand:VI 2 "register_operand" "v")))]
781   "TARGET_ALTIVEC"
782   "vmins<VI_char> %0,%1,%2"
783   [(set_attr "type" "vecsimple")])
785 (define_insn "sminv4sf3"
786   [(set (match_operand:V4SF 0 "register_operand" "=v")
787         (smin:V4SF (match_operand:V4SF 1 "register_operand" "v")
788                    (match_operand:V4SF 2 "register_operand" "v")))]
789   "TARGET_ALTIVEC"
790   "vminfp %0,%1,%2"
791   [(set_attr "type" "veccmp")])
793 (define_insn "altivec_vmhaddshs"
794   [(set (match_operand:V8HI 0 "register_operand" "=v")
795         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
796                       (match_operand:V8HI 2 "register_operand" "v")
797                       (match_operand:V8HI 3 "register_operand" "v")]
798                      UNSPEC_VMHADDSHS))
799    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
800   "TARGET_ALTIVEC"
801   "vmhaddshs %0,%1,%2,%3"
802   [(set_attr "type" "veccomplex")])
804 (define_insn "altivec_vmhraddshs"
805   [(set (match_operand:V8HI 0 "register_operand" "=v")
806         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
807                       (match_operand:V8HI 2 "register_operand" "v")
808                       (match_operand:V8HI 3 "register_operand" "v")]
809                      UNSPEC_VMHRADDSHS))
810    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
811   "TARGET_ALTIVEC"
812   "vmhraddshs %0,%1,%2,%3"
813   [(set_attr "type" "veccomplex")])
815 (define_insn "altivec_vmladduhm"
816   [(set (match_operand:V8HI 0 "register_operand" "=v")
817         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
818                       (match_operand:V8HI 2 "register_operand" "v")
819                       (match_operand:V8HI 3 "register_operand" "v")]
820                      UNSPEC_VMLADDUHM))]
821   "TARGET_ALTIVEC"
822   "vmladduhm %0,%1,%2,%3"
823   [(set_attr "type" "veccomplex")])
825 (define_insn "altivec_vmrghb"
826   [(set (match_operand:V16QI 0 "register_operand" "=v")
827         (vec_merge:V16QI (vec_select:V16QI (match_operand:V16QI 1 "register_operand" "v")
828                                            (parallel [(const_int 0)
829                                                       (const_int 8)
830                                                       (const_int 1)
831                                                       (const_int 9)
832                                                       (const_int 2)
833                                                       (const_int 10)
834                                                       (const_int 3)
835                                                       (const_int 11)
836                                                       (const_int 4)
837                                                       (const_int 12)
838                                                       (const_int 5)
839                                                       (const_int 13)
840                                                       (const_int 6)
841                                                       (const_int 14)
842                                                       (const_int 7)
843                                                       (const_int 15)]))
844                         (vec_select:V16QI (match_operand:V16QI 2 "register_operand" "v")
845                                            (parallel [(const_int 8)
846                                                       (const_int 0)
847                                                       (const_int 9)
848                                                       (const_int 1)
849                                                       (const_int 10)
850                                                       (const_int 2)
851                                                       (const_int 11)
852                                                       (const_int 3)
853                                                       (const_int 12)
854                                                       (const_int 4)
855                                                       (const_int 13)
856                                                       (const_int 5)
857                                                       (const_int 14)
858                                                       (const_int 6)
859                                                       (const_int 15)
860                                                       (const_int 7)]))
861                       (const_int 21845)))]
862   "TARGET_ALTIVEC"
863   "vmrghb %0,%1,%2"
864   [(set_attr "type" "vecperm")])
866 (define_insn "altivec_vmrghh"
867   [(set (match_operand:V8HI 0 "register_operand" "=v")
868         (vec_merge:V8HI (vec_select:V8HI (match_operand:V8HI 1 "register_operand" "v")
869                                            (parallel [(const_int 0)
870                                                       (const_int 4)
871                                                       (const_int 1)
872                                                       (const_int 5)
873                                                       (const_int 2)
874                                                       (const_int 6)
875                                                       (const_int 3)
876                                                       (const_int 7)]))
877                         (vec_select:V8HI (match_operand:V8HI 2 "register_operand" "v")
878                                            (parallel [(const_int 4)
879                                                       (const_int 0)
880                                                       (const_int 5)
881                                                       (const_int 1)
882                                                       (const_int 6)
883                                                       (const_int 2)
884                                                       (const_int 7)
885                                                       (const_int 3)]))
886                       (const_int 85)))]
887   "TARGET_ALTIVEC"
888   "vmrghh %0,%1,%2"
889   [(set_attr "type" "vecperm")])
891 (define_insn "altivec_vmrghw"
892   [(set (match_operand:V4SI 0 "register_operand" "=v")
893         (vec_merge:V4SI (vec_select:V4SI (match_operand:V4SI 1 "register_operand" "v")
894                                          (parallel [(const_int 0)
895                                                     (const_int 2)
896                                                     (const_int 1)
897                                                     (const_int 3)]))
898                         (vec_select:V4SI (match_operand:V4SI 2 "register_operand" "v")
899                                          (parallel [(const_int 2)
900                                                     (const_int 0)
901                                                     (const_int 3)
902                                                     (const_int 1)]))
903                       (const_int 5)))]
904   "TARGET_ALTIVEC"
905   "vmrghw %0,%1,%2"
906   [(set_attr "type" "vecperm")])
908 (define_insn "altivec_vmrghsf"
909   [(set (match_operand:V4SF 0 "register_operand" "=v")
910         (vec_merge:V4SF (vec_select:V4SF (match_operand:V4SF 1 "register_operand" "v")
911                                          (parallel [(const_int 0)
912                                                     (const_int 2)
913                                                     (const_int 1)
914                                                     (const_int 3)]))
915                         (vec_select:V4SF (match_operand:V4SF 2 "register_operand" "v")
916                                          (parallel [(const_int 2)
917                                                     (const_int 0)
918                                                     (const_int 3)
919                                                     (const_int 1)]))
920                       (const_int 5)))]
921   "TARGET_ALTIVEC"
922   "vmrghw %0,%1,%2"
923   [(set_attr "type" "vecperm")])
925 (define_insn "altivec_vmrglb"
926   [(set (match_operand:V16QI 0 "register_operand" "=v")
927         (vec_merge:V16QI (vec_select:V16QI (match_operand:V16QI 1 "register_operand" "v")
928                                            (parallel [(const_int 8)
929                                                       (const_int 0)
930                                                       (const_int 9)
931                                                       (const_int 1)
932                                                       (const_int 10)
933                                                       (const_int 2)
934                                                       (const_int 11)
935                                                       (const_int 3)
936                                                       (const_int 12)
937                                                       (const_int 4)
938                                                       (const_int 13)
939                                                       (const_int 5)
940                                                       (const_int 14)
941                                                       (const_int 6)
942                                                       (const_int 15)
943                                                       (const_int 7)]))
944                       (vec_select:V16QI (match_operand:V16QI 2 "register_operand" "v")
945                                            (parallel [(const_int 0)
946                                                       (const_int 8)
947                                                       (const_int 1)
948                                                       (const_int 9)
949                                                       (const_int 2)
950                                                       (const_int 10)
951                                                       (const_int 3)
952                                                       (const_int 11)
953                                                       (const_int 4)
954                                                       (const_int 12)
955                                                       (const_int 5)
956                                                       (const_int 13)
957                                                       (const_int 6)
958                                                       (const_int 14)
959                                                       (const_int 7)
960                                                       (const_int 15)]))
961                       (const_int 21845)))]
962   "TARGET_ALTIVEC"
963   "vmrglb %0,%1,%2"
964   [(set_attr "type" "vecperm")])
966 (define_insn "altivec_vmrglh"
967   [(set (match_operand:V8HI 0 "register_operand" "=v")
968         (vec_merge:V8HI (vec_select:V8HI (match_operand:V8HI 1 "register_operand" "v")
969                                            (parallel [(const_int 4)
970                                                       (const_int 0)
971                                                       (const_int 5)
972                                                       (const_int 1)
973                                                       (const_int 6)
974                                                       (const_int 2)
975                                                       (const_int 7)
976                                                       (const_int 3)]))
977                         (vec_select:V8HI (match_operand:V8HI 2 "register_operand" "v")
978                                            (parallel [(const_int 0)
979                                                       (const_int 4)
980                                                       (const_int 1)
981                                                       (const_int 5)
982                                                       (const_int 2)
983                                                       (const_int 6)
984                                                       (const_int 3)
985                                                       (const_int 7)]))
986                       (const_int 85)))]
987   "TARGET_ALTIVEC"
988   "vmrglh %0,%1,%2"
989   [(set_attr "type" "vecperm")])
991 (define_insn "altivec_vmrglw"
992   [(set (match_operand:V4SI 0 "register_operand" "=v")
993         (vec_merge:V4SI (vec_select:V4SI (match_operand:V4SI 1 "register_operand" "v")
994                                          (parallel [(const_int 2)
995                                                     (const_int 0)
996                                                     (const_int 3)
997                                                     (const_int 1)]))
998                         (vec_select:V4SI (match_operand:V4SI 2 "register_operand" "v")
999                                          (parallel [(const_int 0)
1000                                                     (const_int 2)
1001                                                     (const_int 1)
1002                                                     (const_int 3)]))
1003                       (const_int 5)))]
1004   "TARGET_ALTIVEC"
1005   "vmrglw %0,%1,%2"
1006   [(set_attr "type" "vecperm")])
1008 (define_insn "altivec_vmrglsf"
1009   [(set (match_operand:V4SF 0 "register_operand" "=v")
1010         (vec_merge:V4SF (vec_select:V4SF (match_operand:V4SF 1 "register_operand" "v")
1011                                          (parallel [(const_int 2)
1012                                                     (const_int 0)
1013                                                     (const_int 3)
1014                                                     (const_int 1)]))
1015                         (vec_select:V4SF (match_operand:V4SF 2 "register_operand" "v")
1016                                          (parallel [(const_int 0)
1017                                                     (const_int 2)
1018                                                     (const_int 1)
1019                                                     (const_int 3)]))
1020                       (const_int 5)))]
1021   "TARGET_ALTIVEC"
1022   "vmrglw %0,%1,%2"
1023   [(set_attr "type" "vecperm")])
1025 (define_insn "altivec_vmuleub"
1026   [(set (match_operand:V8HI 0 "register_operand" "=v")
1027         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
1028                       (match_operand:V16QI 2 "register_operand" "v")]
1029                      UNSPEC_VMULEUB))]
1030   "TARGET_ALTIVEC"
1031   "vmuleub %0,%1,%2"
1032   [(set_attr "type" "veccomplex")])
1034 (define_insn "altivec_vmulesb"
1035   [(set (match_operand:V8HI 0 "register_operand" "=v")
1036         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
1037                       (match_operand:V16QI 2 "register_operand" "v")]
1038                      UNSPEC_VMULESB))]
1039   "TARGET_ALTIVEC"
1040   "vmulesb %0,%1,%2"
1041   [(set_attr "type" "veccomplex")])
1043 (define_insn "altivec_vmuleuh"
1044   [(set (match_operand:V4SI 0 "register_operand" "=v")
1045         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
1046                       (match_operand:V8HI 2 "register_operand" "v")]
1047                      UNSPEC_VMULEUH))]
1048   "TARGET_ALTIVEC"
1049   "vmuleuh %0,%1,%2"
1050   [(set_attr "type" "veccomplex")])
1052 (define_insn "altivec_vmulesh"
1053   [(set (match_operand:V4SI 0 "register_operand" "=v")
1054         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
1055                       (match_operand:V8HI 2 "register_operand" "v")]
1056                      UNSPEC_VMULESH))]
1057   "TARGET_ALTIVEC"
1058   "vmulesh %0,%1,%2"
1059   [(set_attr "type" "veccomplex")])
1061 (define_insn "altivec_vmuloub"
1062   [(set (match_operand:V8HI 0 "register_operand" "=v")
1063         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
1064                       (match_operand:V16QI 2 "register_operand" "v")]
1065                      UNSPEC_VMULOUB))]
1066   "TARGET_ALTIVEC"
1067   "vmuloub %0,%1,%2"
1068   [(set_attr "type" "veccomplex")])
1070 (define_insn "altivec_vmulosb"
1071   [(set (match_operand:V8HI 0 "register_operand" "=v")
1072         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
1073                       (match_operand:V16QI 2 "register_operand" "v")]
1074                      UNSPEC_VMULOSB))]
1075   "TARGET_ALTIVEC"
1076   "vmulosb %0,%1,%2"
1077   [(set_attr "type" "veccomplex")])
1079 (define_insn "altivec_vmulouh"
1080   [(set (match_operand:V4SI 0 "register_operand" "=v")
1081         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
1082                       (match_operand:V8HI 2 "register_operand" "v")]
1083                      UNSPEC_VMULOUH))]
1084   "TARGET_ALTIVEC"
1085   "vmulouh %0,%1,%2"
1086   [(set_attr "type" "veccomplex")])
1088 (define_insn "altivec_vmulosh"
1089   [(set (match_operand:V4SI 0 "register_operand" "=v")
1090         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
1091                       (match_operand:V8HI 2 "register_operand" "v")]
1092                      UNSPEC_VMULOSH))]
1093   "TARGET_ALTIVEC"
1094   "vmulosh %0,%1,%2"
1095   [(set_attr "type" "veccomplex")])
1098 ;; logical ops
1100 (define_insn "and<mode>3"
1101   [(set (match_operand:VI 0 "register_operand" "=v")
1102         (and:VI (match_operand:VI 1 "register_operand" "v")
1103                 (match_operand:VI 2 "register_operand" "v")))]
1104   "TARGET_ALTIVEC"
1105   "vand %0,%1,%2"
1106   [(set_attr "type" "vecsimple")])
1108 (define_insn "ior<mode>3"
1109   [(set (match_operand:VI 0 "register_operand" "=v")
1110         (ior:VI (match_operand:VI 1 "register_operand" "v")
1111                 (match_operand:VI 2 "register_operand" "v")))]
1112   "TARGET_ALTIVEC"
1113   "vor %0,%1,%2"
1114   [(set_attr "type" "vecsimple")])
1116 (define_insn "xor<mode>3"
1117   [(set (match_operand:VI 0 "register_operand" "=v")
1118         (xor:VI (match_operand:VI 1 "register_operand" "v")
1119                 (match_operand:VI 2 "register_operand" "v")))]
1120   "TARGET_ALTIVEC"
1121   "vxor %0,%1,%2"
1122   [(set_attr "type" "vecsimple")])
1124 (define_insn "xorv4sf3"
1125   [(set (match_operand:V4SF 0 "register_operand" "=v")
1126         (xor:V4SF (match_operand:V4SF 1 "register_operand" "v")
1127                   (match_operand:V4SF 2 "register_operand" "v")))]
1128   "TARGET_ALTIVEC"
1129   "vxor %0,%1,%2" 
1130   [(set_attr "type" "vecsimple")])
1132 (define_insn "one_cmpl<mode>2"
1133   [(set (match_operand:VI 0 "register_operand" "=v")
1134         (not:VI (match_operand:VI 1 "register_operand" "v")))]
1135   "TARGET_ALTIVEC"
1136   "vnor %0,%1,%1"
1137   [(set_attr "type" "vecsimple")])
1138   
1139 (define_insn "altivec_nor<mode>3"
1140   [(set (match_operand:VI 0 "register_operand" "=v")
1141         (not:VI (ior:VI (match_operand:VI 1 "register_operand" "v")
1142                         (match_operand:VI 2 "register_operand" "v"))))]
1143   "TARGET_ALTIVEC"
1144   "vnor %0,%1,%2"
1145   [(set_attr "type" "vecsimple")])
1147 (define_insn "andc<mode>3"
1148   [(set (match_operand:VI 0 "register_operand" "=v")
1149         (and:VI (not:VI (match_operand:VI 2 "register_operand" "v"))
1150                 (match_operand:VI 1 "register_operand" "v")))]
1151   "TARGET_ALTIVEC"
1152   "vandc %0,%1,%2"
1153   [(set_attr "type" "vecsimple")])
1155 (define_insn "*andc3_v4sf"
1156   [(set (match_operand:V4SF 0 "register_operand" "=v")
1157         (and:V4SF (not:V4SF (match_operand:V4SF 2 "register_operand" "v"))
1158                   (match_operand:V4SF 1 "register_operand" "v")))]
1159   "TARGET_ALTIVEC"
1160   "vandc %0,%1,%2"
1161   [(set_attr "type" "vecsimple")])
1163 (define_insn "altivec_vpkuhum"
1164   [(set (match_operand:V16QI 0 "register_operand" "=v")
1165         (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")
1166                        (match_operand:V8HI 2 "register_operand" "v")]
1167                       UNSPEC_VPKUHUM))]
1168   "TARGET_ALTIVEC"
1169   "vpkuhum %0,%1,%2"
1170   [(set_attr "type" "vecperm")])
1172 (define_insn "altivec_vpkuwum"
1173   [(set (match_operand:V8HI 0 "register_operand" "=v")
1174         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
1175                       (match_operand:V4SI 2 "register_operand" "v")]
1176                      UNSPEC_VPKUWUM))]
1177   "TARGET_ALTIVEC"
1178   "vpkuwum %0,%1,%2"
1179   [(set_attr "type" "vecperm")])
1181 (define_insn "altivec_vpkpx"
1182   [(set (match_operand:V8HI 0 "register_operand" "=v")
1183         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
1184                       (match_operand:V4SI 2 "register_operand" "v")]
1185                      UNSPEC_VPKPX))]
1186   "TARGET_ALTIVEC"
1187   "vpkpx %0,%1,%2"
1188   [(set_attr "type" "vecperm")])
1190 (define_insn "altivec_vpkshss"
1191   [(set (match_operand:V16QI 0 "register_operand" "=v")
1192         (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")
1193                        (match_operand:V8HI 2 "register_operand" "v")]
1194                       UNSPEC_VPKSHSS))
1195    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1196   "TARGET_ALTIVEC"
1197   "vpkshss %0,%1,%2"
1198   [(set_attr "type" "vecperm")])
1200 (define_insn "altivec_vpkswss"
1201   [(set (match_operand:V8HI 0 "register_operand" "=v")
1202         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
1203                       (match_operand:V4SI 2 "register_operand" "v")]
1204                      UNSPEC_VPKSWSS))
1205    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1206   "TARGET_ALTIVEC"
1207   "vpkswss %0,%1,%2"
1208   [(set_attr "type" "vecperm")])
1210 (define_insn "altivec_vpkuhus"
1211   [(set (match_operand:V16QI 0 "register_operand" "=v")
1212         (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")
1213                        (match_operand:V8HI 2 "register_operand" "v")]
1214                       UNSPEC_VPKUHUS))
1215    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1216   "TARGET_ALTIVEC"
1217   "vpkuhus %0,%1,%2"
1218   [(set_attr "type" "vecperm")])
1220 (define_insn "altivec_vpkshus"
1221   [(set (match_operand:V16QI 0 "register_operand" "=v")
1222         (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")
1223                        (match_operand:V8HI 2 "register_operand" "v")]
1224                       UNSPEC_VPKSHUS))
1225    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1226   "TARGET_ALTIVEC"
1227   "vpkshus %0,%1,%2"
1228   [(set_attr "type" "vecperm")])
1230 (define_insn "altivec_vpkuwus"
1231   [(set (match_operand:V8HI 0 "register_operand" "=v")
1232         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
1233                       (match_operand:V4SI 2 "register_operand" "v")]
1234                      UNSPEC_VPKUWUS))
1235    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1236   "TARGET_ALTIVEC"
1237   "vpkuwus %0,%1,%2"
1238   [(set_attr "type" "vecperm")])
1240 (define_insn "altivec_vpkswus"
1241   [(set (match_operand:V8HI 0 "register_operand" "=v")
1242         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
1243                       (match_operand:V4SI 2 "register_operand" "v")]
1244                      UNSPEC_VPKSWUS))
1245    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1246   "TARGET_ALTIVEC"
1247   "vpkswus %0,%1,%2"
1248   [(set_attr "type" "vecperm")])
1250 (define_insn "altivec_vrl<VI_char>"
1251   [(set (match_operand:VI 0 "register_operand" "=v")
1252         (unspec:VI [(match_operand:VI 1 "register_operand" "v")
1253                     (match_operand:VI 2 "register_operand" "v")]
1254                    UNSPEC_VRL))]
1255   "TARGET_ALTIVEC"
1256   "vrl<VI_char> %0,%1,%2"
1257   [(set_attr "type" "vecsimple")])
1259 (define_insn "altivec_vsl"
1260   [(set (match_operand:V4SI 0 "register_operand" "=v")
1261         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1262                       (match_operand:V4SI 2 "register_operand" "v")]
1263                      UNSPEC_VSLV4SI))]
1264   "TARGET_ALTIVEC"
1265   "vsl %0,%1,%2"
1266   [(set_attr "type" "vecperm")])
1268 (define_insn "altivec_vslo"
1269   [(set (match_operand:V4SI 0 "register_operand" "=v")
1270         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1271                       (match_operand:V4SI 2 "register_operand" "v")]
1272                      UNSPEC_VSLO))]
1273   "TARGET_ALTIVEC"
1274   "vslo %0,%1,%2"
1275   [(set_attr "type" "vecperm")])
1277 (define_insn "vashl<mode>3"
1278   [(set (match_operand:VI 0 "register_operand" "=v")
1279         (ashift:VI (match_operand:VI 1 "register_operand" "v")
1280                    (match_operand:VI 2 "register_operand" "v") ))]
1281   "TARGET_ALTIVEC"
1282   "vsl<VI_char> %0,%1,%2"
1283   [(set_attr "type" "vecsimple")])
1285 (define_insn "vlshr<mode>3"
1286   [(set (match_operand:VI 0 "register_operand" "=v")
1287         (lshiftrt:VI (match_operand:VI 1 "register_operand" "v")
1288                     (match_operand:VI 2 "register_operand" "v") ))]
1289   "TARGET_ALTIVEC"
1290   "vsr<VI_char> %0,%1,%2"
1291   [(set_attr "type" "vecsimple")])
1293 (define_insn "vashr<mode>3"
1294   [(set (match_operand:VI 0 "register_operand" "=v")
1295         (ashiftrt:VI (match_operand:VI 1 "register_operand" "v")
1296                     (match_operand:VI 2 "register_operand" "v") ))]
1297   "TARGET_ALTIVEC"
1298   "vsra<VI_char> %0,%1,%2"
1299   [(set_attr "type" "vecsimple")])
1301 (define_insn "altivec_vsr"
1302   [(set (match_operand:V4SI 0 "register_operand" "=v")
1303         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1304                       (match_operand:V4SI 2 "register_operand" "v")]
1305                      UNSPEC_VSR))]
1306   "TARGET_ALTIVEC"
1307   "vsr %0,%1,%2"
1308   [(set_attr "type" "vecperm")])
1310 (define_insn "altivec_vsro"
1311   [(set (match_operand:V4SI 0 "register_operand" "=v")
1312         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1313                       (match_operand:V4SI 2 "register_operand" "v")]
1314                      UNSPEC_VSRO))]
1315   "TARGET_ALTIVEC"
1316   "vsro %0,%1,%2"
1317   [(set_attr "type" "vecperm")])
1319 (define_insn "altivec_vsum4ubs"
1320   [(set (match_operand:V4SI 0 "register_operand" "=v")
1321         (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")
1322                       (match_operand:V4SI 2 "register_operand" "v")]
1323                      UNSPEC_VSUM4UBS))
1324    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1325   "TARGET_ALTIVEC"
1326   "vsum4ubs %0,%1,%2"
1327   [(set_attr "type" "veccomplex")])
1329 (define_insn "altivec_vsum4s<VI_char>s"
1330   [(set (match_operand:V4SI 0 "register_operand" "=v")
1331         (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")
1332                       (match_operand:V4SI 2 "register_operand" "v")]
1333                      UNSPEC_VSUM4S))
1334    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1335   "TARGET_ALTIVEC"
1336   "vsum4s<VI_char>s %0,%1,%2"
1337   [(set_attr "type" "veccomplex")])
1339 (define_insn "altivec_vsum2sws"
1340   [(set (match_operand:V4SI 0 "register_operand" "=v")
1341         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1342                       (match_operand:V4SI 2 "register_operand" "v")]
1343                      UNSPEC_VSUM2SWS))
1344    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1345   "TARGET_ALTIVEC"
1346   "vsum2sws %0,%1,%2"
1347   [(set_attr "type" "veccomplex")])
1349 (define_insn "altivec_vsumsws"
1350   [(set (match_operand:V4SI 0 "register_operand" "=v")
1351         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1352                       (match_operand:V4SI 2 "register_operand" "v")]
1353                      UNSPEC_VSUMSWS))
1354    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1355   "TARGET_ALTIVEC"
1356   "vsumsws %0,%1,%2"
1357   [(set_attr "type" "veccomplex")])
1359 (define_insn "altivec_vspltb"
1360   [(set (match_operand:V16QI 0 "register_operand" "=v")
1361         (vec_duplicate:V16QI
1362          (vec_select:QI (match_operand:V16QI 1 "register_operand" "v")
1363                         (parallel
1364                          [(match_operand:QI 2 "u5bit_cint_operand" "")]))))]
1365   "TARGET_ALTIVEC"
1366   "vspltb %0,%1,%2"
1367   [(set_attr "type" "vecperm")])
1369 (define_insn "altivec_vsplth"
1370   [(set (match_operand:V8HI 0 "register_operand" "=v")
1371         (vec_duplicate:V8HI
1372          (vec_select:HI (match_operand:V8HI 1 "register_operand" "v")
1373                         (parallel
1374                          [(match_operand:QI 2 "u5bit_cint_operand" "")]))))]
1375   "TARGET_ALTIVEC"
1376   "vsplth %0,%1,%2"
1377   [(set_attr "type" "vecperm")])
1379 (define_insn "altivec_vspltw"
1380   [(set (match_operand:V4SI 0 "register_operand" "=v")
1381         (vec_duplicate:V4SI
1382          (vec_select:SI (match_operand:V4SI 1 "register_operand" "v")
1383                         (parallel
1384                          [(match_operand:QI 2 "u5bit_cint_operand" "i")]))))]
1385   "TARGET_ALTIVEC"
1386   "vspltw %0,%1,%2"
1387   [(set_attr "type" "vecperm")])
1389 (define_insn "*altivec_vspltsf"
1390   [(set (match_operand:V4SF 0 "register_operand" "=v")
1391         (vec_duplicate:V4SF
1392          (vec_select:SF (match_operand:V4SF 1 "register_operand" "v")
1393                         (parallel
1394                          [(match_operand:QI 2 "u5bit_cint_operand" "i")]))))]
1395   "TARGET_ALTIVEC"
1396   "vspltw %0,%1,%2"
1397   [(set_attr "type" "vecperm")])
1399 (define_insn "altivec_vspltis<VI_char>"
1400   [(set (match_operand:VI 0 "register_operand" "=v")
1401         (vec_duplicate:VI
1402          (match_operand:QI 1 "s5bit_cint_operand" "i")))]
1403   "TARGET_ALTIVEC"
1404   "vspltis<VI_char> %0,%1"
1405   [(set_attr "type" "vecperm")])
1407 (define_insn "ftruncv4sf2"
1408   [(set (match_operand:V4SF 0 "register_operand" "=v")
1409         (fix:V4SF (match_operand:V4SF 1 "register_operand" "v")))]
1410   "TARGET_ALTIVEC"
1411   "vrfiz %0,%1"
1412   [(set_attr "type" "vecfloat")])
1414 (define_insn "altivec_vperm_<mode>"
1415   [(set (match_operand:V 0 "register_operand" "=v")
1416         (unspec:V [(match_operand:V 1 "register_operand" "v")
1417                    (match_operand:V 2 "register_operand" "v")
1418                    (match_operand:V16QI 3 "register_operand" "v")]
1419                   UNSPEC_VPERM))]
1420   "TARGET_ALTIVEC"
1421   "vperm %0,%1,%2,%3"
1422   [(set_attr "type" "vecperm")])
1424 (define_insn "altivec_vrfip"
1425   [(set (match_operand:V4SF 0 "register_operand" "=v")
1426         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1427                      UNSPEC_VRFIP))]
1428   "TARGET_ALTIVEC"
1429   "vrfip %0,%1"
1430   [(set_attr "type" "vecfloat")])
1432 (define_insn "altivec_vrfin"
1433   [(set (match_operand:V4SF 0 "register_operand" "=v")
1434         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1435                      UNSPEC_VRFIN))]
1436   "TARGET_ALTIVEC"
1437   "vrfin %0,%1"
1438   [(set_attr "type" "vecfloat")])
1440 (define_insn "altivec_vrfim"
1441   [(set (match_operand:V4SF 0 "register_operand" "=v")
1442         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1443                      UNSPEC_VRFIM))]
1444   "TARGET_ALTIVEC"
1445   "vrfim %0,%1"
1446   [(set_attr "type" "vecfloat")])
1448 (define_insn "altivec_vcfux"
1449   [(set (match_operand:V4SF 0 "register_operand" "=v")
1450         (unspec:V4SF [(match_operand:V4SI 1 "register_operand" "v")
1451                       (match_operand:QI 2 "immediate_operand" "i")]
1452                      UNSPEC_VCFUX))]
1453   "TARGET_ALTIVEC"
1454   "vcfux %0,%1,%2"
1455   [(set_attr "type" "vecfloat")])
1457 (define_insn "altivec_vcfsx"
1458   [(set (match_operand:V4SF 0 "register_operand" "=v")
1459         (unspec:V4SF [(match_operand:V4SI 1 "register_operand" "v")
1460                       (match_operand:QI 2 "immediate_operand" "i")]
1461                      UNSPEC_VCFSX))]
1462   "TARGET_ALTIVEC"
1463   "vcfsx %0,%1,%2"
1464   [(set_attr "type" "vecfloat")])
1466 (define_insn "altivec_vctuxs"
1467   [(set (match_operand:V4SI 0 "register_operand" "=v")
1468         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
1469                       (match_operand:QI 2 "immediate_operand" "i")]
1470                      UNSPEC_VCTUXS))
1471    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1472   "TARGET_ALTIVEC"
1473   "vctuxs %0,%1,%2"
1474   [(set_attr "type" "vecfloat")])
1476 (define_insn "altivec_vctsxs"
1477   [(set (match_operand:V4SI 0 "register_operand" "=v")
1478         (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v")
1479                       (match_operand:QI 2 "immediate_operand" "i")]
1480                      UNSPEC_VCTSXS))
1481    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
1482   "TARGET_ALTIVEC"
1483   "vctsxs %0,%1,%2"
1484   [(set_attr "type" "vecfloat")])
1486 (define_insn "altivec_vlogefp"
1487   [(set (match_operand:V4SF 0 "register_operand" "=v")
1488         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1489                      UNSPEC_VLOGEFP))]
1490   "TARGET_ALTIVEC"
1491   "vlogefp %0,%1"
1492   [(set_attr "type" "vecfloat")])
1494 (define_insn "altivec_vexptefp"
1495   [(set (match_operand:V4SF 0 "register_operand" "=v")
1496         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1497                      UNSPEC_VEXPTEFP))]
1498   "TARGET_ALTIVEC"
1499   "vexptefp %0,%1"
1500   [(set_attr "type" "vecfloat")])
1502 (define_insn "altivec_vrsqrtefp"
1503   [(set (match_operand:V4SF 0 "register_operand" "=v")
1504         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1505                      UNSPEC_VRSQRTEFP))]
1506   "TARGET_ALTIVEC"
1507   "vrsqrtefp %0,%1"
1508   [(set_attr "type" "vecfloat")])
1510 (define_insn "altivec_vrefp"
1511   [(set (match_operand:V4SF 0 "register_operand" "=v")
1512         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")]
1513                      UNSPEC_VREFP))]
1514   "TARGET_ALTIVEC"
1515   "vrefp %0,%1"
1516   [(set_attr "type" "vecfloat")])
1518 (define_expand "vcondv4si"
1519         [(set (match_operand:V4SI 0 "register_operand" "=v")
1520               (if_then_else:V4SI
1521                 (match_operator 3 "comparison_operator"
1522                   [(match_operand:V4SI 4 "register_operand" "v")
1523                    (match_operand:V4SI 5 "register_operand" "v")])
1524                (match_operand:V4SI 1 "register_operand" "v")
1525                (match_operand:V4SI 2 "register_operand" "v")))]
1526         "TARGET_ALTIVEC"
1527         "
1529         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1530                                           operands[3], operands[4], operands[5]))
1531         DONE;
1532         else
1533         FAIL;
1535         ")
1537 (define_expand "vconduv4si"
1538         [(set (match_operand:V4SI 0 "register_operand" "=v")
1539               (if_then_else:V4SI
1540                 (match_operator 3 "comparison_operator"
1541                   [(match_operand:V4SI 4 "register_operand" "v")
1542                    (match_operand:V4SI 5 "register_operand" "v")])
1543                (match_operand:V4SI 1 "register_operand" "v")
1544                (match_operand:V4SI 2 "register_operand" "v")))]
1545         "TARGET_ALTIVEC"
1546         "
1548         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1549                                           operands[3], operands[4], operands[5]))
1550         DONE;
1551         else
1552         FAIL;
1554         ")
1556 (define_expand "vcondv4sf"
1557         [(set (match_operand:V4SF 0 "register_operand" "=v")
1558               (if_then_else:V4SF
1559                 (match_operator 3 "comparison_operator"
1560                   [(match_operand:V4SF 4 "register_operand" "v")
1561                    (match_operand:V4SF 5 "register_operand" "v")])
1562                (match_operand:V4SF 1 "register_operand" "v")
1563                (match_operand:V4SF 2 "register_operand" "v")))]
1564         "TARGET_ALTIVEC"
1565         "
1567         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1568                                           operands[3], operands[4], operands[5]))
1569         DONE;
1570         else
1571         FAIL;
1573         ")
1575 (define_expand "vcondv8hi"
1576         [(set (match_operand:V8HI 0 "register_operand" "=v")
1577               (if_then_else:V8HI
1578                 (match_operator 3 "comparison_operator"
1579                   [(match_operand:V8HI 4 "register_operand" "v")
1580                    (match_operand:V8HI 5 "register_operand" "v")])
1581                (match_operand:V8HI 1 "register_operand" "v")
1582                (match_operand:V8HI 2 "register_operand" "v")))]
1583         "TARGET_ALTIVEC"
1584         "
1586         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1587                                           operands[3], operands[4], operands[5]))
1588         DONE;
1589         else
1590         FAIL;
1592         ")
1594 (define_expand "vconduv8hi"
1595         [(set (match_operand:V8HI 0 "register_operand" "=v")
1596               (if_then_else:V8HI
1597                 (match_operator 3 "comparison_operator"
1598                   [(match_operand:V8HI 4 "register_operand" "v")
1599                    (match_operand:V8HI 5 "register_operand" "v")])
1600                (match_operand:V8HI 1 "register_operand" "v")
1601                (match_operand:V8HI 2 "register_operand" "v")))]
1602         "TARGET_ALTIVEC"
1603         "
1605         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1606                                           operands[3], operands[4], operands[5]))
1607         DONE;
1608         else
1609         FAIL;
1611         ")
1613 (define_expand "vcondv16qi"
1614         [(set (match_operand:V16QI 0 "register_operand" "=v")
1615               (if_then_else:V16QI
1616                 (match_operator 3 "comparison_operator"
1617                   [(match_operand:V16QI 4 "register_operand" "v")
1618                    (match_operand:V16QI 5 "register_operand" "v")])
1619                (match_operand:V16QI 1 "register_operand" "v")
1620                (match_operand:V16QI 2 "register_operand" "v")))]
1621         "TARGET_ALTIVEC"
1622         "
1624         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1625                                           operands[3], operands[4], operands[5]))
1626         DONE;
1627         else
1628         FAIL;
1630         ")
1632 (define_expand "vconduv16qi"
1633         [(set (match_operand:V16QI 0 "register_operand" "=v")
1634               (if_then_else:V16QI
1635                 (match_operator 3 "comparison_operator"
1636                   [(match_operand:V16QI 4 "register_operand" "v")
1637                    (match_operand:V16QI 5 "register_operand" "v")])
1638                (match_operand:V16QI 1 "register_operand" "v")
1639                (match_operand:V16QI 2 "register_operand" "v")))]
1640         "TARGET_ALTIVEC"
1641         "
1643         if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2],
1644                                           operands[3], operands[4], operands[5]))
1645         DONE;
1646         else
1647         FAIL;
1649         ")
1652 (define_insn "altivec_vsel_v4si"
1653   [(set (match_operand:V4SI 0 "register_operand" "=v")
1654         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
1655                       (match_operand:V4SI 2 "register_operand" "v")
1656                       (match_operand:V4SI 3 "register_operand" "v")] 
1657                      UNSPEC_VSEL4SI))]
1658   "TARGET_ALTIVEC"
1659   "vsel %0,%1,%2,%3"
1660   [(set_attr "type" "vecperm")])
1662 (define_insn "altivec_vsel_v4sf"
1663   [(set (match_operand:V4SF 0 "register_operand" "=v")
1664         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v")
1665                       (match_operand:V4SF 2 "register_operand" "v")
1666                       (match_operand:V4SI 3 "register_operand" "v")] 
1667                       UNSPEC_VSEL4SF))]
1668   "TARGET_ALTIVEC"
1669   "vsel %0,%1,%2,%3"
1670   [(set_attr "type" "vecperm")])
1672 (define_insn "altivec_vsel_v8hi"
1673   [(set (match_operand:V8HI 0 "register_operand" "=v")
1674         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
1675                       (match_operand:V8HI 2 "register_operand" "v")
1676                       (match_operand:V8HI 3 "register_operand" "v")] 
1677                      UNSPEC_VSEL8HI))]
1678   "TARGET_ALTIVEC"
1679   "vsel %0,%1,%2,%3"
1680   [(set_attr "type" "vecperm")])
1682 (define_insn "altivec_vsel_v16qi"
1683   [(set (match_operand:V16QI 0 "register_operand" "=v")
1684         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
1685                        (match_operand:V16QI 2 "register_operand" "v")
1686                        (match_operand:V16QI 3 "register_operand" "v")] 
1687                       UNSPEC_VSEL16QI))]
1688   "TARGET_ALTIVEC"
1689   "vsel %0,%1,%2,%3"
1690   [(set_attr "type" "vecperm")])
1692 (define_insn "altivec_vsldoi_<mode>"
1693   [(set (match_operand:V 0 "register_operand" "=v")
1694         (unspec:V [(match_operand:V 1 "register_operand" "v")
1695                    (match_operand:V 2 "register_operand" "v")
1696                    (match_operand:QI 3 "immediate_operand" "i")]
1697                   UNSPEC_VLSDOI))]
1698   "TARGET_ALTIVEC"
1699   "vsldoi %0,%1,%2,%3"
1700   [(set_attr "type" "vecperm")])
1702 (define_insn "altivec_vupkhsb"
1703   [(set (match_operand:V8HI 0 "register_operand" "=v")
1704         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
1705                      UNSPEC_VUPKHSB))]
1706   "TARGET_ALTIVEC"
1707   "vupkhsb %0,%1"
1708   [(set_attr "type" "vecperm")])
1710 (define_insn "altivec_vupkhpx"
1711   [(set (match_operand:V4SI 0 "register_operand" "=v")
1712         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
1713                      UNSPEC_VUPKHPX))]
1714   "TARGET_ALTIVEC"
1715   "vupkhpx %0,%1"
1716   [(set_attr "type" "vecperm")])
1718 (define_insn "altivec_vupkhsh"
1719   [(set (match_operand:V4SI 0 "register_operand" "=v")
1720         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
1721                      UNSPEC_VUPKHSH))]
1722   "TARGET_ALTIVEC"
1723   "vupkhsh %0,%1"
1724   [(set_attr "type" "vecperm")])
1726 (define_insn "altivec_vupklsb"
1727   [(set (match_operand:V8HI 0 "register_operand" "=v")
1728         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
1729                      UNSPEC_VUPKLSB))]
1730   "TARGET_ALTIVEC"
1731   "vupklsb %0,%1"
1732   [(set_attr "type" "vecperm")])
1734 (define_insn "altivec_vupklpx"
1735   [(set (match_operand:V4SI 0 "register_operand" "=v")
1736         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
1737                      UNSPEC_VUPKLPX))]
1738   "TARGET_ALTIVEC"
1739   "vupklpx %0,%1"
1740   [(set_attr "type" "vecperm")])
1742 (define_insn "altivec_vupklsh"
1743   [(set (match_operand:V4SI 0 "register_operand" "=v")
1744         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
1745                      UNSPEC_VUPKLSH))]
1746   "TARGET_ALTIVEC"
1747   "vupklsh %0,%1"
1748   [(set_attr "type" "vecperm")])
1750 ;; AltiVec predicates.
1752 (define_expand "cr6_test_for_zero"
1753   [(set (match_operand:SI 0 "register_operand" "=r")
1754         (eq:SI (reg:CC 74)
1755                (const_int 0)))]
1756   "TARGET_ALTIVEC"
1757   "")   
1759 (define_expand "cr6_test_for_zero_reverse"
1760   [(set (match_operand:SI 0 "register_operand" "=r")
1761         (eq:SI (reg:CC 74)
1762                (const_int 0)))
1763    (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
1764   "TARGET_ALTIVEC"
1765   "")
1767 (define_expand "cr6_test_for_lt"
1768   [(set (match_operand:SI 0 "register_operand" "=r")
1769         (lt:SI (reg:CC 74)
1770                (const_int 0)))]
1771   "TARGET_ALTIVEC"
1772   "")
1774 (define_expand "cr6_test_for_lt_reverse"
1775   [(set (match_operand:SI 0 "register_operand" "=r")
1776         (lt:SI (reg:CC 74)
1777                (const_int 0)))
1778    (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
1779   "TARGET_ALTIVEC"
1780   "")
1782 ;; We can get away with generating the opcode on the fly (%3 below)
1783 ;; because all the predicates have the same scheduling parameters.
1785 (define_insn "altivec_predicate_<mode>"
1786   [(set (reg:CC 74)
1787         (unspec:CC [(match_operand:V 1 "register_operand" "v")
1788                     (match_operand:V 2 "register_operand" "v")
1789                     (match_operand 3 "any_operand" "")] UNSPEC_PREDICATE))
1790    (clobber (match_scratch:V 0 "=v"))]
1791   "TARGET_ALTIVEC"
1792   "%3 %0,%1,%2"
1793 [(set_attr "type" "veccmp")])
1795 (define_insn "altivec_mtvscr"
1796   [(set (reg:SI 110)
1797         (unspec_volatile:SI
1798          [(match_operand:V4SI 0 "register_operand" "v")] UNSPECV_MTVSCR))]
1799   "TARGET_ALTIVEC"
1800   "mtvscr %0"
1801   [(set_attr "type" "vecsimple")])
1803 (define_insn "altivec_mfvscr"
1804   [(set (match_operand:V8HI 0 "register_operand" "=v")
1805         (unspec_volatile:V8HI [(reg:SI 110)] UNSPECV_MFVSCR))]
1806   "TARGET_ALTIVEC"
1807   "mfvscr %0"
1808   [(set_attr "type" "vecsimple")])
1810 (define_insn "altivec_dssall"
1811   [(unspec_volatile [(const_int 0)] UNSPECV_DSSALL)]
1812   "TARGET_ALTIVEC"
1813   "dssall"
1814   [(set_attr "type" "vecsimple")])
1816 (define_insn "altivec_dss"
1817   [(unspec_volatile [(match_operand:QI 0 "immediate_operand" "i")]
1818                     UNSPECV_DSS)]
1819   "TARGET_ALTIVEC"
1820   "dss %0"
1821   [(set_attr "type" "vecsimple")])
1823 (define_insn "altivec_dst"
1824   [(unspec [(match_operand 0 "register_operand" "b")
1825             (match_operand:SI 1 "register_operand" "r")
1826             (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DST)]
1827   "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
1828   "dst %0,%1,%2"
1829   [(set_attr "type" "vecsimple")])
1831 (define_insn "altivec_dstt"
1832   [(unspec [(match_operand 0 "register_operand" "b")
1833             (match_operand:SI 1 "register_operand" "r")
1834             (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTT)]
1835   "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
1836   "dstt %0,%1,%2"
1837   [(set_attr "type" "vecsimple")])
1839 (define_insn "altivec_dstst"
1840   [(unspec [(match_operand 0 "register_operand" "b")
1841             (match_operand:SI 1 "register_operand" "r")
1842             (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTST)]
1843   "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
1844   "dstst %0,%1,%2"
1845   [(set_attr "type" "vecsimple")])
1847 (define_insn "altivec_dststt"
1848   [(unspec [(match_operand 0 "register_operand" "b")
1849             (match_operand:SI 1 "register_operand" "r")
1850             (match_operand:QI 2 "immediate_operand" "i")] UNSPEC_DSTSTT)]
1851   "TARGET_ALTIVEC && GET_MODE (operands[0]) == Pmode"
1852   "dststt %0,%1,%2"
1853   [(set_attr "type" "vecsimple")])
1855 (define_insn "altivec_lvsl"
1856   [(set (match_operand:V16QI 0 "register_operand" "=v")
1857         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] UNSPEC_LVSL))]
1858   "TARGET_ALTIVEC"
1859   "lvsl %0,%y1"
1860   [(set_attr "type" "vecload")])
1862 (define_insn "altivec_lvsr"
1863   [(set (match_operand:V16QI 0 "register_operand" "=v")
1864         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] UNSPEC_LVSR))]
1865   "TARGET_ALTIVEC"
1866   "lvsr %0,%y1"
1867   [(set_attr "type" "vecload")])
1869 (define_expand "build_vector_mask_for_load"
1870   [(set (match_operand:V16QI 0 "register_operand" "")
1871         (unspec:V16QI [(match_operand 1 "memory_operand" "")] UNSPEC_LVSR))]
1872   "TARGET_ALTIVEC"
1873   "
1875   rtx addr;
1876   rtx temp;
1878   gcc_assert (GET_CODE (operands[1]) == MEM);
1880   addr = XEXP (operands[1], 0);
1881   temp = gen_reg_rtx (GET_MODE (addr));
1882   emit_insn (gen_rtx_SET (VOIDmode, temp, 
1883                           gen_rtx_NEG (GET_MODE (addr), addr)));
1884   emit_insn (gen_altivec_lvsr (operands[0], 
1885                                replace_equiv_address (operands[1], temp)));
1886   DONE;
1889 ;; Parallel some of the LVE* and STV*'s with unspecs because some have
1890 ;; identical rtl but different instructions-- and gcc gets confused.
1892 (define_insn "altivec_lve<VI_char>x"
1893   [(parallel
1894     [(set (match_operand:VI 0 "register_operand" "=v")
1895           (match_operand:VI 1 "memory_operand" "Z"))
1896      (unspec [(const_int 0)] UNSPEC_LVE)])]
1897   "TARGET_ALTIVEC"
1898   "lve<VI_char>x %0,%y1"
1899   [(set_attr "type" "vecload")])
1901 (define_insn "*altivec_lvesfx"
1902   [(parallel
1903     [(set (match_operand:V4SF 0 "register_operand" "=v")
1904           (match_operand:V4SF 1 "memory_operand" "Z"))
1905      (unspec [(const_int 0)] UNSPEC_LVE)])]
1906   "TARGET_ALTIVEC"
1907   "lvewx %0,%y1"
1908   [(set_attr "type" "vecload")])
1910 (define_insn "altivec_lvxl"
1911   [(parallel
1912     [(set (match_operand:V4SI 0 "register_operand" "=v")
1913           (match_operand:V4SI 1 "memory_operand" "Z"))
1914      (unspec [(const_int 0)] UNSPEC_SET_VSCR)])]
1915   "TARGET_ALTIVEC"
1916   "lvxl %0,%y1"
1917   [(set_attr "type" "vecload")])
1919 (define_insn "altivec_lvx"
1920   [(set (match_operand:V4SI 0 "register_operand" "=v")
1921         (match_operand:V4SI 1 "memory_operand" "Z"))]
1922   "TARGET_ALTIVEC"
1923   "lvx %0,%y1"
1924   [(set_attr "type" "vecload")])
1926 (define_insn "altivec_stvx"
1927   [(parallel
1928     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
1929           (match_operand:V4SI 1 "register_operand" "v"))
1930      (unspec [(const_int 0)] UNSPEC_STVX)])]
1931   "TARGET_ALTIVEC"
1932   "stvx %1,%y0"
1933   [(set_attr "type" "vecstore")])
1935 (define_insn "altivec_stvxl"
1936   [(parallel
1937     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
1938           (match_operand:V4SI 1 "register_operand" "v"))
1939      (unspec [(const_int 0)] UNSPEC_STVXL)])]
1940   "TARGET_ALTIVEC"
1941   "stvxl %1,%y0"
1942   [(set_attr "type" "vecstore")])
1944 (define_insn "altivec_stve<VI_char>x"
1945   [(parallel
1946     [(set (match_operand:VI 0 "memory_operand" "=Z")
1947           (match_operand:VI 1 "register_operand" "v"))
1948      (unspec [(const_int 0)] UNSPEC_STVE)])]
1949   "TARGET_ALTIVEC"
1950   "stve<VI_char>x %1,%y0"
1951   [(set_attr "type" "vecstore")])
1953 (define_insn "*altivec_stvesfx"
1954   [(parallel
1955     [(set (match_operand:V4SF 0 "memory_operand" "=Z")
1956           (match_operand:V4SF 1 "register_operand" "v"))
1957      (unspec [(const_int 0)] UNSPEC_STVE)])]
1958   "TARGET_ALTIVEC"
1959   "stvewx %1,%y0"
1960   [(set_attr "type" "vecstore")])
1962 (define_expand "vec_init<mode>"
1963   [(match_operand:V 0 "register_operand" "")
1964    (match_operand 1 "" "")]
1965   "TARGET_ALTIVEC"
1967   rs6000_expand_vector_init (operands[0], operands[1]);
1968   DONE;
1971 (define_expand "vec_setv4si"
1972   [(match_operand:V4SI 0 "register_operand" "")
1973    (match_operand:SI 1 "register_operand" "")
1974    (match_operand 2 "const_int_operand" "")]
1975   "TARGET_ALTIVEC"
1977   rs6000_expand_vector_set (operands[0], operands[1], INTVAL (operands[2]));
1978   DONE;
1981 (define_expand "vec_setv8hi"
1982   [(match_operand:V8HI 0 "register_operand" "")
1983    (match_operand:HI 1 "register_operand" "")
1984    (match_operand 2 "const_int_operand" "")]
1985   "TARGET_ALTIVEC"
1987   rs6000_expand_vector_set (operands[0], operands[1], INTVAL (operands[2]));
1988   DONE;
1991 (define_expand "vec_setv16qi"
1992   [(match_operand:V16QI 0 "register_operand" "")
1993    (match_operand:QI 1 "register_operand" "")
1994    (match_operand 2 "const_int_operand" "")]
1995   "TARGET_ALTIVEC"
1997   rs6000_expand_vector_set (operands[0], operands[1], INTVAL (operands[2]));
1998   DONE;
2001 (define_expand "vec_setv4sf"
2002   [(match_operand:V4SF 0 "register_operand" "")
2003    (match_operand:SF 1 "register_operand" "")
2004    (match_operand 2 "const_int_operand" "")]
2005   "TARGET_ALTIVEC"
2007   rs6000_expand_vector_set (operands[0], operands[1], INTVAL (operands[2]));
2008   DONE;
2011 (define_expand "vec_extractv4si"
2012   [(match_operand:SI 0 "register_operand" "")
2013    (match_operand:V4SI 1 "register_operand" "")
2014    (match_operand 2 "const_int_operand" "")]
2015   "TARGET_ALTIVEC"
2017   rs6000_expand_vector_extract (operands[0], operands[1], INTVAL (operands[2]));
2018   DONE;
2021 (define_expand "vec_extractv8hi"
2022   [(match_operand:HI 0 "register_operand" "")
2023    (match_operand:V8HI 1 "register_operand" "")
2024    (match_operand 2 "const_int_operand" "")]
2025   "TARGET_ALTIVEC"
2027   rs6000_expand_vector_extract (operands[0], operands[1], INTVAL (operands[2]));
2028   DONE;
2031 (define_expand "vec_extractv16qi"
2032   [(match_operand:QI 0 "register_operand" "")
2033    (match_operand:V16QI 1 "register_operand" "")
2034    (match_operand 2 "const_int_operand" "")]
2035   "TARGET_ALTIVEC"
2037   rs6000_expand_vector_extract (operands[0], operands[1], INTVAL (operands[2]));
2038   DONE;
2041 (define_expand "vec_extractv4sf"
2042   [(match_operand:SF 0 "register_operand" "")
2043    (match_operand:V4SF 1 "register_operand" "")
2044    (match_operand 2 "const_int_operand" "")]
2045   "TARGET_ALTIVEC"
2047   rs6000_expand_vector_extract (operands[0], operands[1], INTVAL (operands[2]));
2048   DONE;
2051 ;; Generate
2052 ;;    vspltis? SCRATCH0,0
2053 ;;    vsubu?m SCRATCH2,SCRATCH1,%1
2054 ;;    vmaxs? %0,%1,SCRATCH2"
2055 (define_expand "abs<mode>2"
2056   [(set (match_dup 2) (vec_duplicate:VI (const_int 0)))
2057    (set (match_dup 3)
2058         (minus:VI (match_dup 2)
2059                   (match_operand:VI 1 "register_operand" "v")))
2060    (set (match_operand:VI 0 "register_operand" "=v")
2061         (smax:VI (match_dup 1) (match_dup 3)))]
2062   "TARGET_ALTIVEC"
2064   operands[2] = gen_reg_rtx (GET_MODE (operands[0]));
2065   operands[3] = gen_reg_rtx (GET_MODE (operands[0]));
2068 ;; Generate
2069 ;;    vspltisw SCRATCH1,-1
2070 ;;    vslw SCRATCH2,SCRATCH1,SCRATCH1
2071 ;;    vandc %0,%1,SCRATCH2
2072 (define_expand "absv4sf2"
2073   [(set (match_dup 2)
2074         (vec_duplicate:V4SI (const_int -1)))
2075    (set (match_dup 3)
2076         (ashift:V4SI (match_dup 2) (match_dup 2)))
2077    (set (match_operand:V4SF 0 "register_operand" "=v")
2078         (and:V4SF (not:V4SF (subreg:V4SF (match_dup 3) 0))
2079                   (match_operand:V4SF 1 "register_operand" "v")))]
2080   "TARGET_ALTIVEC"
2082   operands[2] = gen_reg_rtx (V4SImode);
2083   operands[3] = gen_reg_rtx (V4SImode);
2086 ;; Generate
2087 ;;    vspltis? SCRATCH0,0
2088 ;;    vsubs?s SCRATCH2,SCRATCH1,%1
2089 ;;    vmaxs? %0,%1,SCRATCH2"
2090 (define_expand "altivec_abss_<mode>"
2091   [(set (match_dup 2) (vec_duplicate:VI (const_int 0)))
2092    (parallel [(set (match_dup 3)
2093                    (unspec:VI [(match_dup 2)
2094                                (match_operand:VI 1 "register_operand" "v")]
2095                               UNSPEC_VSUBS))
2096               (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))])
2097    (set (match_operand:VI 0 "register_operand" "=v")
2098         (smax:VI (match_dup 1) (match_dup 3)))]
2099   "TARGET_ALTIVEC"
2101   operands[2] = gen_reg_rtx (GET_MODE (operands[0]));
2102   operands[3] = gen_reg_rtx (GET_MODE (operands[0]));
2105 ;; Vector shift left in bits. Currently supported ony for shift
2106 ;; amounts that can be expressed as byte shifts (divisible by 8).
2107 ;; General shift amounts can be supported using vslo + vsl. We're
2108 ;; not expecting to see these yet (the vectorizer currently
2109 ;; generates only shifts divisible by byte_size).
2110 (define_expand "vec_shl_<mode>"
2111   [(set (match_operand:V 0 "register_operand" "=v")
2112         (unspec:V [(match_operand:V 1 "register_operand" "v")
2113                    (match_operand:QI 2 "reg_or_short_operand" "")]
2114                   UNSPEC_VECSH))]
2115   "TARGET_ALTIVEC"
2116   "
2118   rtx bitshift = operands[2];
2119   rtx byteshift = gen_reg_rtx (QImode);
2120   HOST_WIDE_INT bitshift_val;
2121   HOST_WIDE_INT byteshift_val;
2123   if (! CONSTANT_P (bitshift))
2124     FAIL;
2125   bitshift_val = INTVAL (bitshift);
2126   if (bitshift_val & 0x7)
2127     FAIL;
2128   byteshift_val = bitshift_val >> 3;
2129   byteshift = gen_rtx_CONST_INT (QImode, byteshift_val);
2130   emit_insn (gen_altivec_vsldoi_<mode> (operands[0], operands[1], operands[1],
2131                                         byteshift));
2132   DONE;
2135 ;; Vector shift left in bits. Currently supported ony for shift
2136 ;; amounts that can be expressed as byte shifts (divisible by 8).
2137 ;; General shift amounts can be supported using vsro + vsr. We're
2138 ;; not expecting to see these yet (the vectorizer currently
2139 ;; generates only shifts divisible by byte_size).
2140 (define_expand "vec_shr_<mode>"
2141   [(set (match_operand:V 0 "register_operand" "=v")
2142         (unspec:V [(match_operand:V 1 "register_operand" "v")
2143                    (match_operand:QI 2 "reg_or_short_operand" "")]
2144                   UNSPEC_VECSH))]
2145   "TARGET_ALTIVEC"
2146   "
2148   rtx bitshift = operands[2];
2149   rtx byteshift = gen_reg_rtx (QImode);
2150   HOST_WIDE_INT bitshift_val;
2151   HOST_WIDE_INT byteshift_val;
2153   if (! CONSTANT_P (bitshift))
2154     FAIL;
2155   bitshift_val = INTVAL (bitshift);
2156   if (bitshift_val & 0x7)
2157     FAIL;
2158   byteshift_val = 16 - (bitshift_val >> 3);
2159   byteshift = gen_rtx_CONST_INT (QImode, byteshift_val);
2160   emit_insn (gen_altivec_vsldoi_<mode> (operands[0], operands[1], operands[1],
2161                                         byteshift));
2162   DONE;
2165 (define_insn "altivec_vsumsws_nomode"
2166   [(set (match_operand 0 "register_operand" "=v")
2167         (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v")
2168                       (match_operand:V4SI 2 "register_operand" "v")]
2169                      UNSPEC_VSUMSWS))
2170    (set (reg:SI 110) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
2171   "TARGET_ALTIVEC"
2172   "vsumsws %0,%1,%2"
2173   [(set_attr "type" "veccomplex")])
2175 (define_expand "reduc_splus_<mode>"
2176   [(set (match_operand:VIshort 0 "register_operand" "=v")
2177         (unspec:VIshort [(match_operand:VIshort 1 "register_operand" "v")]
2178                         UNSPEC_REDUC_PLUS))]
2179   "TARGET_ALTIVEC"
2180   "
2182   rtx vzero = gen_reg_rtx (V4SImode);
2183   rtx vtmp1 = gen_reg_rtx (V4SImode);
2185   emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
2186   emit_insn (gen_altivec_vsum4s<VI_char>s (vtmp1, operands[1], vzero));
2187   emit_insn (gen_altivec_vsumsws_nomode (operands[0], vtmp1, vzero));
2188   DONE;
2191 (define_expand "reduc_uplus_v16qi"
2192   [(set (match_operand:V16QI 0 "register_operand" "=v")
2193         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")]
2194                       UNSPEC_REDUC_PLUS))]
2195   "TARGET_ALTIVEC"
2196   "
2198   rtx vzero = gen_reg_rtx (V4SImode);
2199   rtx vtmp1 = gen_reg_rtx (V4SImode);
2201   emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
2202   emit_insn (gen_altivec_vsum4ubs (vtmp1, operands[1], vzero));
2203   emit_insn (gen_altivec_vsumsws_nomode (operands[0], vtmp1, vzero));
2204   DONE;
2207 (define_insn "vec_realign_load_<mode>"
2208   [(set (match_operand:V 0 "register_operand" "=v")
2209         (unspec:V [(match_operand:V 1 "register_operand" "v")
2210                    (match_operand:V 2 "register_operand" "v")
2211                    (match_operand:V16QI 3 "register_operand" "v")]
2212                   UNSPEC_REALIGN_LOAD))]
2213   "TARGET_ALTIVEC"
2214   "vperm %0,%1,%2,%3"
2215   [(set_attr "type" "vecperm")])
2217 (define_expand "neg<mode>2"
2218   [(use (match_operand:VI 0 "register_operand" ""))
2219    (use (match_operand:VI 1 "register_operand" ""))]
2220   "TARGET_ALTIVEC"
2221   "
2223   rtx vzero;
2225   vzero = gen_reg_rtx (GET_MODE (operands[0]));
2226   emit_insn (gen_altivec_vspltis<VI_char> (vzero, const0_rtx));
2227   emit_insn (gen_sub<mode>3 (operands[0], vzero, operands[1])); 
2228   
2229   DONE;
2232 (define_expand "udot_prod<mode>"
2233   [(set (match_operand:V4SI 0 "register_operand" "=v")
2234         (plus:V4SI (match_operand:V4SI 3 "register_operand" "v")
2235                    (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")  
2236                                  (match_operand:VIshort 2 "register_operand" "v")] 
2237                                 UNSPEC_VMSUMU)))]
2238   "TARGET_ALTIVEC"
2239   "
2240 {  
2241   emit_insn (gen_altivec_vmsumu<VI_char>m (operands[0], operands[1], operands[2], operands[3]));
2242   DONE;
2244    
2245 (define_expand "sdot_prodv8hi"
2246   [(set (match_operand:V4SI 0 "register_operand" "=v")
2247         (plus:V4SI (match_operand:V4SI 3 "register_operand" "v")
2248                    (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2249                                  (match_operand:V8HI 2 "register_operand" "v")]
2250                                 UNSPEC_VMSUMSHM)))]
2251   "TARGET_ALTIVEC"
2252   "
2254   emit_insn (gen_altivec_vmsumshm (operands[0], operands[1], operands[2], operands[3]));
2255   DONE;
2258 (define_expand "widen_usum<mode>3"
2259   [(set (match_operand:V4SI 0 "register_operand" "=v")
2260         (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
2261                    (unspec:V4SI [(match_operand:VIshort 1 "register_operand" "v")]
2262                                 UNSPEC_VMSUMU)))]
2263   "TARGET_ALTIVEC"
2264   "
2266   rtx vones = gen_reg_rtx (GET_MODE (operands[1]));
2268   emit_insn (gen_altivec_vspltis<VI_char> (vones, const1_rtx));
2269   emit_insn (gen_altivec_vmsumu<VI_char>m (operands[0], operands[1], vones, operands[2]));
2270   DONE;
2273 (define_expand "widen_ssumv16qi3"
2274   [(set (match_operand:V4SI 0 "register_operand" "=v")
2275         (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
2276                    (unspec:V4SI [(match_operand:V16QI 1 "register_operand" "v")]
2277                                 UNSPEC_VMSUMM)))]
2278   "TARGET_ALTIVEC"
2279   "
2281   rtx vones = gen_reg_rtx (V16QImode);
2283   emit_insn (gen_altivec_vspltisb (vones, const1_rtx));
2284   emit_insn (gen_altivec_vmsummbm (operands[0], operands[1], vones, operands[2]));
2285   DONE;
2288 (define_expand "widen_ssumv8hi3"
2289   [(set (match_operand:V4SI 0 "register_operand" "=v")
2290         (plus:V4SI (match_operand:V4SI 2 "register_operand" "v")
2291                    (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
2292                                 UNSPEC_VMSUMSHM)))]
2293   "TARGET_ALTIVEC"
2294   "
2296   rtx vones = gen_reg_rtx (V8HImode);
2298   emit_insn (gen_altivec_vspltish (vones, const1_rtx));
2299   emit_insn (gen_altivec_vmsumshm (operands[0], operands[1], vones, operands[2]));
2300   DONE;
2303 (define_expand "vec_unpacks_hi_v16qi"
2304   [(set (match_operand:V8HI 0 "register_operand" "=v")
2305         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
2306                      UNSPEC_VUPKHSB))]
2307   "TARGET_ALTIVEC"
2308   "
2310   emit_insn (gen_altivec_vupkhsb (operands[0], operands[1]));
2311   DONE;
2314 (define_expand "vec_unpacks_hi_v8hi"
2315   [(set (match_operand:V4SI 0 "register_operand" "=v")
2316         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
2317                      UNSPEC_VUPKHSH))]
2318   "TARGET_ALTIVEC"
2319   "
2321   emit_insn (gen_altivec_vupkhsh (operands[0], operands[1]));
2322   DONE;
2325 (define_expand "vec_unpacks_lo_v16qi"
2326   [(set (match_operand:V8HI 0 "register_operand" "=v")
2327         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
2328                      UNSPEC_VUPKLSB))]
2329   "TARGET_ALTIVEC"
2330   "
2332   emit_insn (gen_altivec_vupklsb (operands[0], operands[1]));
2333   DONE;
2336 (define_expand "vec_unpacks_lo_v8hi"
2337   [(set (match_operand:V4SI 0 "register_operand" "=v")
2338         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
2339                      UNSPEC_VUPKLSH))]
2340   "TARGET_ALTIVEC"
2341   "
2343   emit_insn (gen_altivec_vupklsh (operands[0], operands[1]));
2344   DONE;
2347 (define_insn "vperm_v8hiv4si"
2348   [(set (match_operand:V4SI 0 "register_operand" "=v")
2349         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2350                    (match_operand:V4SI 2 "register_operand" "v")
2351                    (match_operand:V16QI 3 "register_operand" "v")]
2352                   UNSPEC_VPERMSI))]
2353   "TARGET_ALTIVEC"
2354   "vperm %0,%1,%2,%3"
2355   [(set_attr "type" "vecperm")])
2357 (define_insn "vperm_v16qiv8hi"
2358   [(set (match_operand:V8HI 0 "register_operand" "=v")
2359         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
2360                    (match_operand:V8HI 2 "register_operand" "v")
2361                    (match_operand:V16QI 3 "register_operand" "v")]
2362                   UNSPEC_VPERMHI))]
2363   "TARGET_ALTIVEC"
2364   "vperm %0,%1,%2,%3"
2365   [(set_attr "type" "vecperm")])
2368 (define_expand "vec_unpacku_hi_v16qi"
2369   [(set (match_operand:V8HI 0 "register_operand" "=v")
2370         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
2371                      UNSPEC_VUPKHUB))]
2372   "TARGET_ALTIVEC"      
2373   "
2374 {  
2375   rtx vzero = gen_reg_rtx (V8HImode);
2376   rtx mask = gen_reg_rtx (V16QImode);
2377   rtvec v = rtvec_alloc (16);
2378    
2379   emit_insn (gen_altivec_vspltish (vzero, const0_rtx));
2380    
2381   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 16);
2382   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 0);
2383   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 16);
2384   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 1);
2385   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 16);
2386   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 2);
2387   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 16);
2388   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 3);
2389   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2390   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 4);
2391   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 16);
2392   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 5);
2393   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 16);
2394   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 6);
2395   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 16);
2396   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 7);
2398   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2399   emit_insn (gen_vperm_v16qiv8hi (operands[0], operands[1], vzero, mask));
2400   DONE;
2403 (define_expand "vec_unpacku_hi_v8hi"
2404   [(set (match_operand:V4SI 0 "register_operand" "=v")
2405         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
2406                      UNSPEC_VUPKHUH))]
2407   "TARGET_ALTIVEC"
2408   "
2410   rtx vzero = gen_reg_rtx (V4SImode);
2411   rtx mask = gen_reg_rtx (V16QImode);
2412   rtvec v = rtvec_alloc (16);
2414   emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
2416   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 16);
2417   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 17);
2418   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 0);
2419   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 1);
2420   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 16);
2421   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 17);
2422   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 2);
2423   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 3);
2424   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2425   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 17);
2426   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 4);
2427   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 5);
2428   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 16);
2429   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 17);
2430   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 6);
2431   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 7);
2433   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2434   emit_insn (gen_vperm_v8hiv4si (operands[0], operands[1], vzero, mask));
2435   DONE;
2438 (define_expand "vec_unpacku_lo_v16qi"
2439   [(set (match_operand:V8HI 0 "register_operand" "=v")
2440         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")]
2441                      UNSPEC_VUPKLUB))]
2442   "TARGET_ALTIVEC"
2443   "
2445   rtx vzero = gen_reg_rtx (V8HImode);
2446   rtx mask = gen_reg_rtx (V16QImode);
2447   rtvec v = rtvec_alloc (16);
2449   emit_insn (gen_altivec_vspltish (vzero, const0_rtx));
2451   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 16);
2452   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 8);
2453   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 16);
2454   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 9);
2455   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 16);
2456   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 10);
2457   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 16);
2458   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 11);
2459   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2460   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 12);
2461   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 16);
2462   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 13);
2463   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 16);
2464   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 14);
2465   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 16);
2466   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 15);
2468   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2469   emit_insn (gen_vperm_v16qiv8hi (operands[0], operands[1], vzero, mask));
2470   DONE;
2473 (define_expand "vec_unpacku_lo_v8hi"
2474   [(set (match_operand:V4SI 0 "register_operand" "=v")
2475         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")]
2476                      UNSPEC_VUPKLUH))]
2477   "TARGET_ALTIVEC"
2478   "
2480   rtx vzero = gen_reg_rtx (V4SImode);
2481   rtx mask = gen_reg_rtx (V16QImode);
2482   rtvec v = rtvec_alloc (16);
2484   emit_insn (gen_altivec_vspltisw (vzero, const0_rtx));
2486   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 16);
2487   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 17);
2488   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 8);
2489   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 9);
2490   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 16);
2491   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 17);
2492   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 10);
2493   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 11);
2494   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2495   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 17);
2496   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 12);
2497   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 13);
2498   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 16);
2499   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 17);
2500   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 14);
2501   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 15);
2503   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2504   emit_insn (gen_vperm_v8hiv4si (operands[0], operands[1], vzero, mask));
2505   DONE;
2508 (define_expand "vec_widen_umult_hi_v16qi"
2509   [(set (match_operand:V8HI 0 "register_operand" "=v")
2510         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
2511                       (match_operand:V16QI 2 "register_operand" "v")]
2512                      UNSPEC_VMULWHUB))]
2513   "TARGET_ALTIVEC"
2514   "
2516   rtx ve = gen_reg_rtx (V8HImode);
2517   rtx vo = gen_reg_rtx (V8HImode);
2518   
2519   emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
2520   emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
2521   emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
2522   DONE;
2525 (define_expand "vec_widen_umult_lo_v16qi"
2526   [(set (match_operand:V8HI 0 "register_operand" "=v")
2527         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
2528                       (match_operand:V16QI 2 "register_operand" "v")]
2529                      UNSPEC_VMULWLUB))]
2530   "TARGET_ALTIVEC"
2531   "
2533   rtx ve = gen_reg_rtx (V8HImode);
2534   rtx vo = gen_reg_rtx (V8HImode);
2535   
2536   emit_insn (gen_altivec_vmuleub (ve, operands[1], operands[2]));
2537   emit_insn (gen_altivec_vmuloub (vo, operands[1], operands[2]));
2538   emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
2539   DONE;
2542 (define_expand "vec_widen_smult_hi_v16qi"
2543   [(set (match_operand:V8HI 0 "register_operand" "=v")
2544         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
2545                       (match_operand:V16QI 2 "register_operand" "v")]
2546                      UNSPEC_VMULWHSB))]
2547   "TARGET_ALTIVEC"
2548   "
2550   rtx ve = gen_reg_rtx (V8HImode);
2551   rtx vo = gen_reg_rtx (V8HImode);
2552   
2553   emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
2554   emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
2555   emit_insn (gen_altivec_vmrghh (operands[0], ve, vo));
2556   DONE;
2559 (define_expand "vec_widen_smult_lo_v16qi"
2560   [(set (match_operand:V8HI 0 "register_operand" "=v")
2561         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "v")
2562                       (match_operand:V16QI 2 "register_operand" "v")]
2563                      UNSPEC_VMULWLSB))]
2564   "TARGET_ALTIVEC"
2565   "
2567   rtx ve = gen_reg_rtx (V8HImode);
2568   rtx vo = gen_reg_rtx (V8HImode);
2569   
2570   emit_insn (gen_altivec_vmulesb (ve, operands[1], operands[2]));
2571   emit_insn (gen_altivec_vmulosb (vo, operands[1], operands[2]));
2572   emit_insn (gen_altivec_vmrglh (operands[0], ve, vo));
2573   DONE;
2576 (define_expand "vec_widen_umult_hi_v8hi"
2577   [(set (match_operand:V4SI 0 "register_operand" "=v")
2578         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2579                       (match_operand:V8HI 2 "register_operand" "v")]
2580                      UNSPEC_VMULWHUH))]
2581   "TARGET_ALTIVEC"
2582   "
2584   rtx ve = gen_reg_rtx (V4SImode);
2585   rtx vo = gen_reg_rtx (V4SImode);
2586   
2587   emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
2588   emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
2589   emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
2590   DONE;
2593 (define_expand "vec_widen_umult_lo_v8hi"
2594   [(set (match_operand:V4SI 0 "register_operand" "=v")
2595         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2596                       (match_operand:V8HI 2 "register_operand" "v")]
2597                      UNSPEC_VMULWLUH))]
2598   "TARGET_ALTIVEC"
2599   "
2601   rtx ve = gen_reg_rtx (V4SImode);
2602   rtx vo = gen_reg_rtx (V4SImode);
2603   
2604   emit_insn (gen_altivec_vmuleuh (ve, operands[1], operands[2]));
2605   emit_insn (gen_altivec_vmulouh (vo, operands[1], operands[2]));
2606   emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
2607   DONE;
2610 (define_expand "vec_widen_smult_hi_v8hi"
2611   [(set (match_operand:V4SI 0 "register_operand" "=v")
2612         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2613                       (match_operand:V8HI 2 "register_operand" "v")]
2614                      UNSPEC_VMULWHSH))]
2615   "TARGET_ALTIVEC"
2616   "
2618   rtx ve = gen_reg_rtx (V4SImode);
2619   rtx vo = gen_reg_rtx (V4SImode);
2620   
2621   emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
2622   emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
2623   emit_insn (gen_altivec_vmrghw (operands[0], ve, vo));
2624   DONE;
2627 (define_expand "vec_widen_smult_lo_v8hi"
2628   [(set (match_operand:V4SI 0 "register_operand" "=v")
2629         (unspec:V4SI [(match_operand:V8HI 1 "register_operand" "v")
2630                       (match_operand:V8HI 2 "register_operand" "v")]
2631                      UNSPEC_VMULWLSH))]
2632   "TARGET_ALTIVEC"
2633   "
2635   rtx ve = gen_reg_rtx (V4SImode);
2636   rtx vo = gen_reg_rtx (V4SImode);
2637   
2638   emit_insn (gen_altivec_vmulesh (ve, operands[1], operands[2]));
2639   emit_insn (gen_altivec_vmulosh (vo, operands[1], operands[2]));
2640   emit_insn (gen_altivec_vmrglw (operands[0], ve, vo));
2641   DONE;
2644 (define_expand "vec_pack_trunc_v8hi"
2645   [(set (match_operand:V16QI 0 "register_operand" "=v")
2646         (unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")
2647                        (match_operand:V8HI 2 "register_operand" "v")]
2648                       UNSPEC_VPKUHUM))]
2649   "TARGET_ALTIVEC"
2650   "
2652   emit_insn (gen_altivec_vpkuhum (operands[0], operands[1], operands[2]));
2653   DONE;
2655                                                                                 
2656 (define_expand "vec_pack_trunc_v4si"
2657   [(set (match_operand:V8HI 0 "register_operand" "=v")
2658         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v")
2659                       (match_operand:V4SI 2 "register_operand" "v")]
2660                      UNSPEC_VPKUWUM))]
2661   "TARGET_ALTIVEC"
2662   "
2664   emit_insn (gen_altivec_vpkuwum (operands[0], operands[1], operands[2]));
2665   DONE;
2668 (define_expand "negv4sf2"
2669   [(use (match_operand:V4SF 0 "register_operand" ""))
2670    (use (match_operand:V4SF 1 "register_operand" ""))]
2671   "TARGET_ALTIVEC"
2672   "
2674   rtx neg0;
2676   /* Generate [-0.0, -0.0, -0.0, -0.0].  */
2677   neg0 = gen_reg_rtx (V4SImode);
2678   emit_insn (gen_altivec_vspltisw (neg0, constm1_rtx));
2679   emit_insn (gen_vashlv4si3 (neg0, neg0, neg0));
2681   /* XOR */
2682   emit_insn (gen_xorv4sf3 (operands[0],
2683                            gen_lowpart (V4SFmode, neg0), operands[1])); 
2684     
2685   DONE;
2688 ;; Vector SIMD PEM v2.06c defines LVLX, LVLXL, LVRX, LVRXL,
2689 ;; STVLX, STVLXL, STVVRX, STVRXL are available only on Cell.
2690 (define_insn "altivec_lvlx"
2691   [(set (match_operand:V16QI 0 "register_operand" "=v")
2692         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] 
2693                       UNSPEC_LVLX))]
2694   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2695   "lvlx %0,%y1"
2696   [(set_attr "type" "vecload")])
2698 (define_insn "altivec_lvlxl"
2699   [(set (match_operand:V16QI 0 "register_operand" "=v")
2700         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] 
2701                       UNSPEC_LVLXL))]
2702   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2703   "lvlxl %0,%y1"
2704   [(set_attr "type" "vecload")])
2706 (define_insn "altivec_lvrx"
2707   [(set (match_operand:V16QI 0 "register_operand" "=v")
2708         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] 
2709                       UNSPEC_LVRX))]
2710   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2711   "lvrx %0,%y1"
2712   [(set_attr "type" "vecload")])
2714 (define_insn "altivec_lvrxl"
2715   [(set (match_operand:V16QI 0 "register_operand" "=v")
2716         (unspec:V16QI [(match_operand 1 "memory_operand" "Z")] 
2717                       UNSPEC_LVRXL))]
2718   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2719   "lvrxl %0,%y1"
2720   [(set_attr "type" "vecload")])
2722 (define_insn "altivec_stvlx"
2723   [(parallel
2724     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
2725           (match_operand:V4SI 1 "register_operand" "v"))
2726      (unspec [(const_int 0)] UNSPEC_STVLX)])]
2727   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2728   "stvlx %1,%y0"
2729   [(set_attr "type" "vecstore")])
2731 (define_insn "altivec_stvlxl"
2732   [(parallel
2733     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
2734           (match_operand:V4SI 1 "register_operand" "v"))
2735      (unspec [(const_int 0)] UNSPEC_STVLXL)])]
2736   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2737   "stvlxl %1,%y0"
2738   [(set_attr "type" "vecstore")])
2740 (define_insn "altivec_stvrx"
2741   [(parallel
2742     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
2743           (match_operand:V4SI 1 "register_operand" "v"))
2744      (unspec [(const_int 0)] UNSPEC_STVRX)])]
2745   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2746   "stvrx %1,%y0"
2747   [(set_attr "type" "vecstore")])
2749 (define_insn "altivec_stvrxl"
2750   [(parallel
2751     [(set (match_operand:V4SI 0 "memory_operand" "=Z")
2752           (match_operand:V4SI 1 "register_operand" "v"))
2753      (unspec [(const_int 0)] UNSPEC_STVRXL)])]
2754   "TARGET_ALTIVEC && rs6000_cpu == PROCESSOR_CELL"
2755   "stvrxl %1,%y0"
2756   [(set_attr "type" "vecstore")])
2758 (define_expand "vec_extract_evenv4si"
2759  [(set (match_operand:V4SI 0 "register_operand" "")
2760         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "")
2761                       (match_operand:V4SI 2 "register_operand" "")]
2762                       UNSPEC_EXTEVEN_V4SI))]
2763   "TARGET_ALTIVEC"
2764   "
2766   rtx mask = gen_reg_rtx (V16QImode);
2767   rtvec v = rtvec_alloc (16);
2769   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 0);
2770   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 1);
2771   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 2);
2772   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 3);
2773   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 8);
2774   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 9);
2775   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 10);
2776   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 11);
2777   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2778   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 17);
2779   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 18);
2780   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 19);
2781   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 24);
2782   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 25);
2783   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 26);
2784   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 27);
2785   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2786   emit_insn (gen_altivec_vperm_v4si (operands[0], operands[1], operands[2], mask));
2787   
2788   DONE;
2791 (define_expand "vec_extract_evenv4sf"
2792  [(set (match_operand:V4SF 0 "register_operand" "")
2793         (unspec:V8HI [(match_operand:V4SF 1 "register_operand" "")
2794                       (match_operand:V4SF 2 "register_operand" "")]
2795                       UNSPEC_EXTEVEN_V4SF))]
2796   "TARGET_ALTIVEC"
2797   "
2799   rtx mask = gen_reg_rtx (V16QImode);
2800   rtvec v = rtvec_alloc (16);
2801   
2802   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 0);
2803   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 1);
2804   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 2);
2805   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 3);
2806   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 8);
2807   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 9);
2808   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 10);
2809   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 11);
2810   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2811   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 17);
2812   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 18);
2813   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 19);
2814   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 24);
2815   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 25);
2816   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 26);
2817   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 27);
2818   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2819   emit_insn (gen_altivec_vperm_v4sf (operands[0], operands[1], operands[2], mask));
2820   
2821   DONE;
2824 (define_expand "vec_extract_evenv8hi"
2825  [(set (match_operand:V4SI 0 "register_operand" "")
2826         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "")
2827                       (match_operand:V8HI 2 "register_operand" "")]
2828                       UNSPEC_EXTEVEN_V8HI))]
2829   "TARGET_ALTIVEC"
2830   "
2832   rtx mask = gen_reg_rtx (V16QImode);
2833   rtvec v = rtvec_alloc (16);
2834   
2835   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 0);
2836   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 1);
2837   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 4);
2838   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 5);
2839   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 8);
2840   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 9);
2841   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 12);
2842   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 13);
2843   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2844   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 17);
2845   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 20);
2846   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 21);
2847   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 24);
2848   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 25);
2849   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 28);
2850   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 29);
2851   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2852   emit_insn (gen_altivec_vperm_v8hi (operands[0], operands[1], operands[2], mask));
2853   
2854   DONE;
2857 (define_expand "vec_extract_evenv16qi"
2858  [(set (match_operand:V4SI 0 "register_operand" "")
2859         (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "")
2860                       (match_operand:V16QI 2 "register_operand" "")]
2861                       UNSPEC_EXTEVEN_V16QI))]
2862   "TARGET_ALTIVEC"
2863   "
2865   rtx mask = gen_reg_rtx (V16QImode);
2866   rtvec v = rtvec_alloc (16);
2867   
2868   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 0);
2869   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 2);
2870   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 4);
2871   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 6);
2872   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 8);
2873   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 10);
2874   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 12);
2875   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 14);
2876   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 16);
2877   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 18);
2878   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 20);
2879   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 22);
2880   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 24);
2881   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 26);
2882   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 28);
2883   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 30);
2884   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2885   emit_insn (gen_altivec_vperm_v16qi (operands[0], operands[1], operands[2], mask));
2886   
2887   DONE;
2890 (define_expand "vec_extract_oddv4si"
2891  [(set (match_operand:V4SI 0 "register_operand" "")
2892         (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "")
2893                       (match_operand:V4SI 2 "register_operand" "")]
2894                       UNSPEC_EXTODD_V4SI))]
2895   "TARGET_ALTIVEC"
2896   "
2898   rtx mask = gen_reg_rtx (V16QImode);
2899   rtvec v = rtvec_alloc (16);
2901   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 4);
2902   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 5);
2903   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 6);
2904   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 7);
2905   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 12);
2906   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 13);
2907   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 14);
2908   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 15);
2909   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 20);
2910   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 21);
2911   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 22);
2912   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 23);
2913   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 28);
2914   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 29);
2915   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 30);
2916   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 31);
2917   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2918   emit_insn (gen_altivec_vperm_v4si (operands[0], operands[1], operands[2], mask));
2919   
2920   DONE;
2923 (define_expand "vec_extract_oddv4sf"
2924  [(set (match_operand:V4SF 0 "register_operand" "")
2925         (unspec:V8HI [(match_operand:V4SF 1 "register_operand" "")
2926                       (match_operand:V4SF 2 "register_operand" "")]
2927                       UNSPEC_EXTODD_V4SF))]
2928   "TARGET_ALTIVEC"
2929   "
2931   rtx mask = gen_reg_rtx (V16QImode);
2932   rtvec v = rtvec_alloc (16);
2934   RTVEC_ELT (v, 0) = gen_rtx_CONST_INT (QImode, 4);
2935   RTVEC_ELT (v, 1) = gen_rtx_CONST_INT (QImode, 5);
2936   RTVEC_ELT (v, 2) = gen_rtx_CONST_INT (QImode, 6);
2937   RTVEC_ELT (v, 3) = gen_rtx_CONST_INT (QImode, 7);
2938   RTVEC_ELT (v, 4) = gen_rtx_CONST_INT (QImode, 12);
2939   RTVEC_ELT (v, 5) = gen_rtx_CONST_INT (QImode, 13);
2940   RTVEC_ELT (v, 6) = gen_rtx_CONST_INT (QImode, 14);
2941   RTVEC_ELT (v, 7) = gen_rtx_CONST_INT (QImode, 15);
2942   RTVEC_ELT (v, 8) = gen_rtx_CONST_INT (QImode, 20);
2943   RTVEC_ELT (v, 9) = gen_rtx_CONST_INT (QImode, 21);
2944   RTVEC_ELT (v, 10) = gen_rtx_CONST_INT (QImode, 22);
2945   RTVEC_ELT (v, 11) = gen_rtx_CONST_INT (QImode, 23);
2946   RTVEC_ELT (v, 12) = gen_rtx_CONST_INT (QImode, 28);
2947   RTVEC_ELT (v, 13) = gen_rtx_CONST_INT (QImode, 29);
2948   RTVEC_ELT (v, 14) = gen_rtx_CONST_INT (QImode, 30);
2949   RTVEC_ELT (v, 15) = gen_rtx_CONST_INT (QImode, 31);
2950   emit_insn (gen_vec_initv16qi (mask, gen_rtx_PARALLEL (V16QImode, v)));
2951   emit_insn (gen_altivec_vperm_v4sf (operands[0], operands[1], operands[2], mask));
2953   DONE;
2956 (define_insn "vpkuhum_nomode"
2957   [(set (match_operand:V16QI 0 "register_operand" "=v")
2958         (unspec:V16QI [(match_operand 1 "register_operand" "v")
2959                        (match_operand 2 "register_operand" "v")]
2960                       UNSPEC_VPKUHUM))] 
2961   "TARGET_ALTIVEC"
2962   "vpkuhum %0,%1,%2"
2963   [(set_attr "type" "vecperm")])
2965 (define_insn "vpkuwum_nomode"
2966   [(set (match_operand:V8HI 0 "register_operand" "=v")
2967         (unspec:V8HI [(match_operand 1 "register_operand" "v")
2968                       (match_operand 2 "register_operand" "v")]
2969                      UNSPEC_VPKUWUM))]
2970   "TARGET_ALTIVEC"
2971   "vpkuwum %0,%1,%2"
2972   [(set_attr "type" "vecperm")])
2974 (define_expand "vec_extract_oddv8hi"
2975  [(set (match_operand:V8HI 0 "register_operand" "")
2976         (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "")
2977                       (match_operand:V8HI 2 "register_operand" "")]
2978                       UNSPEC_EXTODD_V8HI))]
2979   "TARGET_ALTIVEC"
2980   "
2982   emit_insn (gen_vpkuwum_nomode (operands[0], operands[1], operands[2]));
2983   DONE;
2986 (define_expand "vec_extract_oddv16qi"
2987  [(set (match_operand:V16QI 0 "register_operand" "")
2988         (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "")
2989                       (match_operand:V16QI 2 "register_operand" "")]
2990                       UNSPEC_EXTODD_V16QI))]
2991   "TARGET_ALTIVEC"
2992   "
2994   emit_insn (gen_vpkuhum_nomode (operands[0], operands[1], operands[2]));
2995   DONE;
2997 (define_expand "vec_interleave_highv4sf"
2998  [(set (match_operand:V4SF 0 "register_operand" "")
2999         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "")
3000                       (match_operand:V4SF 2 "register_operand" "")]
3001                       UNSPEC_INTERHI_V4SF))]
3002   "TARGET_ALTIVEC"
3003   "
3005   emit_insn (gen_altivec_vmrghsf (operands[0], operands[1], operands[2]));
3006   DONE;
3009 (define_expand "vec_interleave_lowv4sf"
3010  [(set (match_operand:V4SF 0 "register_operand" "")
3011         (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "")
3012                       (match_operand:V4SF 2 "register_operand" "")]
3013                       UNSPEC_INTERLO_V4SF))]
3014   "TARGET_ALTIVEC"
3015   "
3017   emit_insn (gen_altivec_vmrglsf (operands[0], operands[1], operands[2]));
3018   DONE;
3021 (define_expand "vec_interleave_high<mode>"
3022  [(set (match_operand:VI 0 "register_operand" "")
3023         (unspec:VI [(match_operand:VI 1 "register_operand" "")
3024                     (match_operand:VI 2 "register_operand" "")]
3025                      UNSPEC_INTERHI))]
3026   "TARGET_ALTIVEC"
3027   "
3029   emit_insn (gen_altivec_vmrgh<VI_char> (operands[0], operands[1], operands[2]));
3030   DONE;
3033 (define_expand "vec_interleave_low<mode>"
3034  [(set (match_operand:VI 0 "register_operand" "")
3035         (unspec:VI [(match_operand:VI 1 "register_operand" "")
3036                     (match_operand:VI 2 "register_operand" "")]
3037                      UNSPEC_INTERLO))]
3038   "TARGET_ALTIVEC"
3039   "
3041   emit_insn (gen_altivec_vmrgl<VI_char> (operands[0], operands[1], operands[2]));
3042   DONE;
3045 (define_expand "vec_unpacks_float_hi_v8hi"
3046  [(set (match_operand:V4SF 0 "register_operand" "")
3047         (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
3048                      UNSPEC_VUPKHS_V4SF))]
3049   "TARGET_ALTIVEC"
3050   "
3052   rtx tmp = gen_reg_rtx (V4SImode);
3054   emit_insn (gen_vec_unpacks_hi_v8hi (tmp, operands[1]));
3055   emit_insn (gen_altivec_vcfsx (operands[0], tmp, const0_rtx));
3056   DONE;
3059 (define_expand "vec_unpacks_float_lo_v8hi"
3060  [(set (match_operand:V4SF 0 "register_operand" "")
3061         (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
3062                      UNSPEC_VUPKLS_V4SF))]
3063   "TARGET_ALTIVEC"
3064   "
3066   rtx tmp = gen_reg_rtx (V4SImode);
3068   emit_insn (gen_vec_unpacks_lo_v8hi (tmp, operands[1]));
3069   emit_insn (gen_altivec_vcfsx (operands[0], tmp, const0_rtx));
3070   DONE;
3073 (define_expand "vec_unpacku_float_hi_v8hi"
3074  [(set (match_operand:V4SF 0 "register_operand" "")
3075         (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
3076                      UNSPEC_VUPKHU_V4SF))]
3077   "TARGET_ALTIVEC"
3078   "
3080   rtx tmp = gen_reg_rtx (V4SImode);
3082   emit_insn (gen_vec_unpacku_hi_v8hi (tmp, operands[1]));
3083   emit_insn (gen_altivec_vcfux (operands[0], tmp, const0_rtx));
3084   DONE;
3087 (define_expand "vec_unpacku_float_lo_v8hi"
3088  [(set (match_operand:V4SF 0 "register_operand" "")
3089         (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "")]
3090                      UNSPEC_VUPKLU_V4SF))]
3091   "TARGET_ALTIVEC"
3092   "
3094   rtx tmp = gen_reg_rtx (V4SImode);
3096   emit_insn (gen_vec_unpacku_lo_v8hi (tmp, operands[1]));
3097   emit_insn (gen_altivec_vcfux (operands[0], tmp, const0_rtx));
3098   DONE;