OSDN Git Service

PR middle-end/35456
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / paired.md
1 ;; PowerPC paired single and double hummer description
2 ;; Copyright (C) 2007
3 ;; Free Software Foundation, Inc.
4 ;; Contributed by David Edelsohn <edelsohn@gnu.org> and Revital Eres
5 ;; <eres@il.ibm.com>
6
7 ;; This file is part of GCC.
8
9 ;; GCC is free software; you can redistribute it and/or modify it
10 ;; under the terms of the GNU General Public License as published
11 ;; by the Free Software Foundation; either version 2, or (at your
12 ;; option) any later version.
13
14 ;; GCC is distributed in the hope that it will be useful, but WITHOUT
15 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17 ;; License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GCC; see the file COPYING.  If not, write to the
21 ;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
22 ;; MA 02110-1301, USA.
23
24 (define_constants
25 [(UNSPEC_INTERHI_V2SF     330)
26  (UNSPEC_INTERLO_V2SF     331)
27  (UNSPEC_EXTEVEN_V2SF     332)
28  (UNSPEC_EXTODD_V2SF      333)
29 ])
30
31 (define_insn "negv2sf2"
32   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
33         (neg:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")))]
34   "TARGET_PAIRED_FLOAT"
35   "ps_neg %0,%1"
36   [(set_attr "type" "fp")])
37
38 (define_insn "sqrtv2sf2"
39   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
40         (sqrt:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")))]
41   "TARGET_PAIRED_FLOAT"
42   "ps_rsqrte %0,%1"
43   [(set_attr "type" "fp")])
44
45 (define_insn "absv2sf2"
46   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
47         (abs:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")))]
48   "TARGET_PAIRED_FLOAT"
49   "ps_abs %0,%1"
50   [(set_attr "type" "fp")])
51
52 (define_insn "nabsv2sf2"
53   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
54         (neg:V2SF (abs:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f"))))]
55   "TARGET_PAIRED_FLOAT"
56   "ps_nabs %0,%1"
57   [(set_attr "type" "fp")])
58
59 (define_insn "addv2sf3"
60   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
61         (plus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
62                    (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
63   "TARGET_PAIRED_FLOAT"
64   "ps_add %0,%1,%2"
65   [(set_attr "type" "fp")])
66
67 (define_insn "subv2sf3"
68   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
69         (minus:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
70                     (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
71   "TARGET_PAIRED_FLOAT"
72   "ps_sub %0,%1,%2"
73   [(set_attr "type" "fp")])
74
75 (define_insn "mulv2sf3"
76   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
77         (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
78                    (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
79   "TARGET_PAIRED_FLOAT"
80   "ps_mul %0,%1,%2"
81   [(set_attr "type" "fp")])
82
83 (define_insn "resv2sf2"
84   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
85         (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "f")] UNSPEC_FRES))]
86   "TARGET_PAIRED_FLOAT && flag_finite_math_only"
87   "ps_res %0,%1"
88   [(set_attr "type" "fp")])
89
90 (define_insn "divv2sf3"
91   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
92         (div:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
93                   (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
94   "TARGET_PAIRED_FLOAT"
95   "ps_div %0,%1,%2"
96   [(set_attr "type" "sdiv")])
97
98 (define_insn "paired_madds0"
99  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
100                  (vec_concat:V2SF
101                  (plus:SF (mult:SF (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
102                                                   (parallel [(const_int 0)]))
103                                    (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
104                                          (parallel [(const_int 0)])))
105                           (vec_select:SF (match_operand:V2SF 3 "gpc_reg_operand" "f")
106                                          (parallel [(const_int 0)])))
107                  (plus:SF (mult:SF (vec_select:SF (match_dup 1)
108                                          (parallel [(const_int 1)]))
109                                      (vec_select:SF (match_dup 2)
110                                          (parallel [(const_int 0)])))
111                           (vec_select:SF (match_dup 3)
112                                          (parallel [(const_int 1)])))))]
113   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD"
114   "ps_madds0 %0,%1,%2,%3"
115   [(set_attr "type" "fp")])
116
117 (define_insn "paired_madds1"
118  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
119                  (vec_concat:V2SF
120                  (plus:SF (mult:SF (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
121                                                   (parallel [(const_int 0)]))
122                                    (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
123                                          (parallel [(const_int 1)])))
124                           (vec_select:SF (match_operand:V2SF 3 "gpc_reg_operand" "f")
125                                          (parallel [(const_int 0)])))
126                  (plus:SF (mult:SF (vec_select:SF (match_dup 1)
127                                          (parallel [(const_int 1)]))
128                                      (vec_select:SF (match_dup 2)
129                                          (parallel [(const_int 1)])))
130                           (vec_select:SF (match_dup 3)
131                                          (parallel [(const_int 1)])))))]
132   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD"
133   "ps_madds1 %0,%1,%2,%3"
134   [(set_attr "type" "fp")])
135
136 (define_insn "paired_madd"
137   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
138         (plus:V2SF (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
139                               (match_operand:V2SF 2 "gpc_reg_operand" "f"))
140                    (match_operand:V2SF 3 "gpc_reg_operand" "f")))]
141   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD"
142   "ps_madd %0,%1,%2,%3"
143   [(set_attr "type" "fp")]) 
144
145 (define_insn "paired_msub"
146   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
147         (minus:V2SF (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
148                                (match_operand:V2SF 2 "gpc_reg_operand" "f"))
149                     (match_operand:V2SF 3 "gpc_reg_operand" "f")))]
150   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD"
151   "ps_msub %0,%1,%2,%3"
152   [(set_attr "type" "fp")])
153
154 (define_insn "paired_nmadd"
155   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
156         (neg:V2SF (plus:V2SF (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
157                                         (match_operand:V2SF 2 "gpc_reg_operand" "f"))
158                              (match_operand:V2SF 3 "gpc_reg_operand" "f"))))]
159   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD
160    && HONOR_SIGNED_ZEROS (SFmode)"
161   "ps_nmadd %0,%1,%2,%3"
162   [(set_attr "type" "fp")])
163
164 (define_insn "paired_nmsub"
165   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
166         (neg:V2SF (minus:V2SF (mult:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "%f")
167                                          (match_operand:V2SF 2 "gpc_reg_operand" "f"))
168                               (match_operand:V2SF 3 "gpc_reg_operand" "f"))))]
169   "TARGET_PAIRED_FLOAT && TARGET_FUSED_MADD
170    && HONOR_SIGNED_ZEROS (DFmode)"
171   "ps_nmsub %0,%1,%2,%3"
172   [(set_attr "type" "dmul")])
173
174 (define_insn "selv2sf4"
175   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
176         (vec_concat:V2SF
177          (if_then_else:SF (ge (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
178                                              (parallel [(const_int 0)]))
179                               (match_operand:SF 4 "zero_fp_constant" "F"))
180                           (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
181                                          (parallel [(const_int 0)]))
182                           (vec_select:SF (match_operand:V2SF 3 "gpc_reg_operand" "f")
183                                          (parallel [(const_int 0)])))
184          (if_then_else:SF (ge (vec_select:SF (match_dup 1)
185                                              (parallel [(const_int 1)]))
186                               (match_dup 4))
187                           (vec_select:SF (match_dup 2)
188                                          (parallel [(const_int 1)]))
189                           (vec_select:SF (match_dup 3)
190                                          (parallel [(const_int 1)])))))]
191
192   "TARGET_PAIRED_FLOAT"
193   "ps_sel %0,%1,%2,%3"
194   [(set_attr "type" "fp")])
195
196 (define_insn "*movv2sf_paired"
197   [(set (match_operand:V2SF 0 "nonimmediate_operand" "=Z,f,f,o,r,r,f")
198                  (match_operand:V2SF 1 "input_operand" "f,Z,f,r,o,r,W"))]
199   "TARGET_PAIRED_FLOAT
200    && (register_operand (operands[0], V2SFmode) 
201        || register_operand (operands[1], V2SFmode))"
202 {
203   switch (which_alternative)
204     {
205     case 0: return "psq_stx %1,%y0,0,0";
206     case 1: return "psq_lx %0,%y1,0,0";
207     case 2: return "ps_mr %0,%1";
208     case 3: return "#";
209     case 4: return "#";
210     case 5: return "#";
211     case 6: return "#"; 
212     default: gcc_unreachable ();
213     }
214 }
215   [(set_attr "type" "fpstore,fpload,fp,*,*,*,*")])
216
217 (define_insn "paired_stx"
218   [(set (match_operand:V2SF 0 "memory_operand" "=Z")
219         (match_operand:V2SF 1 "gpc_reg_operand" "f"))]
220   "TARGET_PAIRED_FLOAT"
221   "psq_stx %1,%y0,0,0"
222   [(set_attr "type" "fpstore")])
223
224 (define_insn "paired_lx"
225   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
226         (match_operand:V2SF 1 "memory_operand" "Z"))]
227   "TARGET_PAIRED_FLOAT"
228   "psq_lx %0,%y1,0,0"
229   [(set_attr "type" "fpload")])
230
231
232 (define_split
233   [(set (match_operand:V2SF 0 "nonimmediate_operand" "")
234         (match_operand:V2SF 1 "input_operand" ""))]
235   "TARGET_PAIRED_FLOAT && reload_completed
236    && gpr_or_gpr_p (operands[0], operands[1])"
237   [(pc)]
238   {
239   rs6000_split_multireg_move (operands[0], operands[1]); DONE;
240   })
241
242 (define_insn "paired_cmpu0"
243   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
244         (compare:CCFP (vec_select:SF
245                        (match_operand:V2SF 1 "gpc_reg_operand" "f")
246                        (parallel [(const_int 0)]))
247                       (vec_select:SF
248                        (match_operand:V2SF 2 "gpc_reg_operand" "f")
249                        (parallel [(const_int 0)]))))]
250   "TARGET_PAIRED_FLOAT"
251   "ps_cmpu0 %0,%1,%2"
252   [(set_attr "type" "fpcompare")])
253
254 (define_insn "paired_cmpu1"
255   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
256         (compare:CCFP (vec_select:SF
257                        (match_operand:V2SF 1 "gpc_reg_operand" "f")
258                        (parallel [(const_int 1)]))
259                       (vec_select:SF
260                        (match_operand:V2SF 2 "gpc_reg_operand" "f")
261                        (parallel [(const_int 1)]))))]
262   "TARGET_PAIRED_FLOAT"
263   "ps_cmpu1 %0,%1,%2"
264   [(set_attr "type" "fpcompare")])
265
266 (define_insn "paired_merge00"
267   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
268         (vec_concat:V2SF
269          (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
270                         (parallel [(const_int 0)]))
271          (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
272                         (parallel [(const_int 0)]))))]
273   "TARGET_PAIRED_FLOAT"
274   "ps_merge00 %0, %1, %2"
275   [(set_attr "type" "fp")])
276
277 (define_insn "paired_merge01"
278   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
279         (vec_concat:V2SF
280          (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
281                         (parallel [(const_int 0)]))
282          (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
283                         (parallel [(const_int 1)]))))]
284   "TARGET_PAIRED_FLOAT"
285   "ps_merge01 %0, %1, %2"
286   [(set_attr "type" "fp")])
287
288 (define_insn "paired_merge10"
289   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
290         (vec_concat:V2SF
291          (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
292                         (parallel [(const_int 1)]))
293          (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
294                         (parallel [(const_int 0)]))))]
295   "TARGET_PAIRED_FLOAT"
296   "ps_merge10 %0, %1, %2"
297   [(set_attr "type" "fp")])
298
299 (define_insn "paired_merge11"
300   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
301         (vec_concat:V2SF
302          (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
303                         (parallel [(const_int 1)]))
304          (vec_select:SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
305                         (parallel [(const_int 1)]))))]
306   "TARGET_PAIRED_FLOAT"
307   "ps_merge11 %0, %1, %2"
308   [(set_attr "type" "fp")])
309
310 (define_insn "paired_sum0"
311   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
312         (vec_concat:V2SF (plus:SF (vec_select:SF
313                                    (match_operand:V2SF 1 "gpc_reg_operand" "f")
314                                    (parallel [(const_int 0)]))
315                                   (vec_select:SF
316                                    (match_operand:V2SF 2 "gpc_reg_operand" "f")
317                                    (parallel [(const_int 1)])))
318                          (vec_select:SF
319                           (match_operand:V2SF 3 "gpc_reg_operand" "f")
320                           (parallel [(const_int 1)]))))]
321   "TARGET_PAIRED_FLOAT"
322   "ps_sum0 %0,%1,%2,%3"
323   [(set_attr "type" "fp")])
324
325 (define_insn "paired_sum1"
326   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
327         (vec_concat:V2SF (vec_select:SF
328                           (match_operand:V2SF 2 "gpc_reg_operand" "f")
329                           (parallel [(const_int 1)]))
330                          (plus:SF (vec_select:SF
331                                    (match_operand:V2SF 1 "gpc_reg_operand" "f")
332                                    (parallel [(const_int 0)]))
333                                   (vec_select:SF
334                                    (match_operand:V2SF 3 "gpc_reg_operand" "f")
335                                    (parallel [(const_int 1)])))))]
336   "TARGET_PAIRED_FLOAT"
337   "ps_sum1 %0,%1,%2,%3"
338   [(set_attr "type" "fp")])
339
340 (define_insn "paired_muls0"
341   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
342         (mult:V2SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
343                    (vec_duplicate:V2SF
344                     (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
345                                    (parallel [(const_int 0)])))))]
346   "TARGET_PAIRED_FLOAT"
347   "ps_muls0 %0, %1, %2"
348   [(set_attr "type" "fp")])
349
350
351 (define_insn "paired_muls1"
352   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
353         (mult:V2SF (match_operand:V2SF 2 "gpc_reg_operand" "f")
354                    (vec_duplicate:V2SF
355                     (vec_select:SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
356                                    (parallel [(const_int 1)])))))]
357   "TARGET_PAIRED_FLOAT"
358   "ps_muls1 %0, %1, %2"
359   [(set_attr "type" "fp")])
360
361 (define_expand "vec_initv2sf"
362   [(match_operand:V2SF 0 "gpc_reg_operand" "=f")
363    (match_operand 1 "" "")]
364   "TARGET_PAIRED_FLOAT"
365 {
366   paired_expand_vector_init (operands[0], operands[1]);
367   DONE;
368 })
369
370 (define_insn "*vconcatsf"
371   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
372         (vec_concat:V2SF
373          (match_operand:SF 1 "gpc_reg_operand" "f")
374          (match_operand:SF 2 "gpc_reg_operand" "f")))]
375   "TARGET_PAIRED_FLOAT"
376   "ps_merge00 %0, %1, %2"
377   [(set_attr "type" "fp")])
378
379 (define_expand "sminv2sf3"
380   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
381         (smin:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
382                    (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
383   "TARGET_PAIRED_FLOAT"
384 {
385   rtx tmp = gen_reg_rtx (V2SFmode);
386
387   emit_insn (gen_subv2sf3 (tmp, operands[1], operands[2]));
388   emit_insn (gen_selv2sf4 (operands[0], tmp, operands[2], operands[1], CONST0_RTX (SFmode)));
389   DONE;
390 })
391
392 (define_expand "smaxv2sf3"
393   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
394         (smax:V2SF (match_operand:V2SF 1 "gpc_reg_operand" "f")
395                    (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
396   "TARGET_PAIRED_FLOAT"
397 {
398   rtx tmp = gen_reg_rtx (V2SFmode);
399
400   emit_insn (gen_subv2sf3 (tmp, operands[1], operands[2]));
401   emit_insn (gen_selv2sf4 (operands[0], tmp, operands[1], operands[2], CONST0_RTX (SFmode)));
402   DONE;
403 })
404
405 (define_expand "reduc_smax_v2sf"
406   [(match_operand:V2SF 0 "gpc_reg_operand" "=f")
407    (match_operand:V2SF 1 "gpc_reg_operand" "f")]
408   "TARGET_PAIRED_FLOAT"
409 {
410   rtx tmp_swap = gen_reg_rtx (V2SFmode);
411   rtx tmp = gen_reg_rtx (V2SFmode);
412
413   emit_insn (gen_paired_merge10 (tmp_swap, operands[1], operands[1]));
414   emit_insn (gen_subv2sf3 (tmp, operands[1], tmp_swap));
415   emit_insn (gen_selv2sf4 (operands[0], tmp, operands[1], tmp_swap, CONST0_RTX (SFmode)));
416
417   DONE;
418 })
419
420 (define_expand "reduc_smin_v2sf"
421   [(match_operand:V2SF 0 "gpc_reg_operand" "=f")
422    (match_operand:V2SF 1 "gpc_reg_operand" "f")]
423   "TARGET_PAIRED_FLOAT"
424 {
425   rtx tmp_swap = gen_reg_rtx (V2SFmode);
426   rtx tmp = gen_reg_rtx (V2SFmode);
427
428   emit_insn (gen_paired_merge10 (tmp_swap, operands[1], operands[1]));
429   emit_insn (gen_subv2sf3 (tmp, operands[1], tmp_swap));
430   emit_insn (gen_selv2sf4 (operands[0], tmp, tmp_swap, operands[1], CONST0_RTX (SFmode)));
431
432   DONE;
433 })
434
435 (define_expand "vec_interleave_highv2sf"
436  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
437         (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "f")
438                       (match_operand:V2SF 2 "gpc_reg_operand" "f")]
439                       UNSPEC_INTERHI_V2SF))]
440   "TARGET_PAIRED_FLOAT"
441   "
442 {
443   emit_insn (gen_paired_merge00 (operands[0], operands[1], operands[2]));
444   DONE;
445 }")
446
447 (define_expand "vec_interleave_lowv2sf"
448  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
449         (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "f")
450                       (match_operand:V2SF 2 "gpc_reg_operand" "f")]
451                       UNSPEC_INTERLO_V2SF))]
452   "TARGET_PAIRED_FLOAT"
453   "
454 {
455   emit_insn (gen_paired_merge11 (operands[0], operands[1], operands[2]));
456   DONE;
457 }")
458
459 (define_expand "vec_extract_evenv2sf"
460  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
461         (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "f")
462                       (match_operand:V2SF 2 "gpc_reg_operand" "f")]
463                       UNSPEC_EXTEVEN_V2SF))]
464   "TARGET_PAIRED_FLOAT"
465   "
466 {
467   emit_insn (gen_paired_merge00 (operands[0], operands[1], operands[2]));
468   DONE;
469 }")
470
471 (define_expand "vec_extract_oddv2sf"
472  [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
473         (unspec:V2SF [(match_operand:V2SF 1 "gpc_reg_operand" "f")
474                       (match_operand:V2SF 2 "gpc_reg_operand" "f")]
475                       UNSPEC_EXTODD_V2SF))]
476   "TARGET_PAIRED_FLOAT"
477   "
478 {
479   emit_insn (gen_paired_merge11 (operands[0], operands[1], operands[2]));
480   DONE;
481 }")
482
483
484 (define_expand "reduc_splus_v2sf"
485   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
486         (match_operand:V2SF 1 "gpc_reg_operand" "f"))]
487   "TARGET_PAIRED_FLOAT"
488   "
489 {
490   emit_insn (gen_paired_sum1 (operands[0], operands[1], operands[1], operands[1]));
491   DONE;
492 }")
493
494 (define_expand "movmisalignv2sf"
495   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
496         (match_operand:V2SF 1 "gpc_reg_operand" "f"))]
497   "TARGET_PAIRED_FLOAT"
498 {
499   paired_expand_vector_move (operands);
500   DONE;
501 })
502
503 (define_expand "vcondv2sf"
504   [(set (match_operand:V2SF 0 "gpc_reg_operand" "=f")
505         (if_then_else:V2SF
506          (match_operator 3 "gpc_reg_operand"
507                          [(match_operand:V2SF 4 "gpc_reg_operand" "f")
508                           (match_operand:V2SF 5 "gpc_reg_operand" "f")])
509          (match_operand:V2SF 1 "gpc_reg_operand" "f")
510          (match_operand:V2SF 2 "gpc_reg_operand" "f")))]
511   "TARGET_PAIRED_FLOAT && flag_unsafe_math_optimizations"
512   "
513 {
514         if (paired_emit_vector_cond_expr (operands[0], operands[1], operands[2],
515                                           operands[3], operands[4], operands[5]))
516         DONE;
517         else
518         FAIL;
519 }")
520