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