Enable auto-vectorization for PowerPC 750CL paired-single instructions
[gcc.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