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