diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2011-08-04 02:57:47 -0500 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2011-08-05 17:16:01 +0100 |
commit | 7d3c85eb5eee3e7980c7c3f52db17df666953cd5 (patch) | |
tree | 1135fc5bcbc5089f7d7dfb6b68156a4aa865388b /meta/recipes-devtools/gcc | |
parent | 06aee01aa0b21bb1f647be731df49b480026c80f (diff) | |
download | poky-7d3c85eb5eee3e7980c7c3f52db17df666953cd5.tar.gz |
gcc-4.6: Add support for the e5500 PowerPC core
Implements basic e5500 enablement in gcc, with a scheduler, -mcpu
flag, etc...
(From OE-Core rev: b4f6fb7033d3798cae32d42bce5a0f8402ad57c1)
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/recipes-devtools/gcc')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.inc | 3 | ||||
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6/powerpc-e5500.patch | 465 |
2 files changed, 467 insertions, 1 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.inc b/meta/recipes-devtools/gcc/gcc-4.6.inc index 7d8170cd33..f952ac88d9 100644 --- a/meta/recipes-devtools/gcc/gcc-4.6.inc +++ b/meta/recipes-devtools/gcc/gcc-4.6.inc | |||
@@ -1,6 +1,6 @@ | |||
1 | require gcc-common.inc | 1 | require gcc-common.inc |
2 | 2 | ||
3 | PR = "r3" | 3 | PR = "r4" |
4 | 4 | ||
5 | # Third digit in PV should be incremented after a minor release | 5 | # Third digit in PV should be incremented after a minor release |
6 | # happens from this branch on gcc e.g. currently its 4.6.0 | 6 | # happens from this branch on gcc e.g. currently its 4.6.0 |
@@ -67,6 +67,7 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH};proto=http \ | |||
67 | file://COLLECT_GCC_OPTIONS.patch \ | 67 | file://COLLECT_GCC_OPTIONS.patch \ |
68 | file://volatile_access_backport.patch \ | 68 | file://volatile_access_backport.patch \ |
69 | file://use-defaults.h-and-t-oe-in-B.patch \ | 69 | file://use-defaults.h-and-t-oe-in-B.patch \ |
70 | file://powerpc-e5500.patch \ | ||
70 | " | 71 | " |
71 | 72 | ||
72 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " | 73 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " |
diff --git a/meta/recipes-devtools/gcc/gcc-4.6/powerpc-e5500.patch b/meta/recipes-devtools/gcc/gcc-4.6/powerpc-e5500.patch new file mode 100644 index 0000000000..1f478f3ea7 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6/powerpc-e5500.patch | |||
@@ -0,0 +1,465 @@ | |||
1 | Upstream-Status: Pending | ||
2 | |||
3 | Implements basic e5500 enablement in gcc, with a scheduler, -mcpu | ||
4 | flag, etc... | ||
5 | |||
6 | Also splits the masks for popcntb, popcntd, and cmpb. Originally those | ||
7 | masks would also control other instructions that e5500 does not | ||
8 | support (so, we either get none or all). | ||
9 | |||
10 | For the lack of means to do tests, those instructions were never | ||
11 | enabled until now. The new instructions enabled with this patch are: | ||
12 | popcntb, popcntw, popcntd, bpermd, prtyw, prtyd, cmpb, ldbrx, and | ||
13 | stdbrx. | ||
14 | |||
15 | Signed-off-by: Edmar Wienskoski <edmar@freescale.com> | ||
16 | Signed-off-by: Kumar Gala <galak@kernel.crashing.org> | ||
17 | |||
18 | Index: gcc-4_6-branch/gcc/config.gcc | ||
19 | =================================================================== | ||
20 | --- gcc-4_6-branch.orig/gcc/config.gcc | ||
21 | +++ gcc-4_6-branch/gcc/config.gcc | ||
22 | @@ -395,7 +395,7 @@ powerpc*-*-*) | ||
23 | extra_headers="ppc-asm.h altivec.h spe.h ppu_intrinsics.h paired.h spu2vmx.h vec_types.h si2vmx.h" | ||
24 | need_64bit_hwint=yes | ||
25 | case x$with_cpu in | ||
26 | - xpowerpc64|xdefault64|x6[23]0|x970|xG5|xpower[34567]|xpower6x|xrs64a|xcell|xa2|xe500mc64) | ||
27 | + xpowerpc64|xdefault64|x6[23]0|x970|xG5|xpower[34567]|xpower6x|xrs64a|xcell|xa2|xe500mc64|xe5500) | ||
28 | cpu_is_64bit=yes | ||
29 | ;; | ||
30 | esac | ||
31 | @@ -3493,7 +3493,7 @@ case "${target}" in | ||
32 | | 401 | 403 | 405 | 405fp | 440 | 440fp | 464 | 464fp \ | ||
33 | | 476 | 476fp | 505 | 601 | 602 | 603 | 603e | ec603e \ | ||
34 | | 604 | 604e | 620 | 630 | 740 | 750 | 7400 | 7450 \ | ||
35 | - | a2 | e300c[23] | 854[08] | e500mc | e500mc64 | titan\ | ||
36 | + | a2 | e300c[23] | 854[08] | e500mc | e500mc64 | e5500 | titan\ | ||
37 | | 801 | 821 | 823 | 860 | 970 | G3 | G4 | G5 | cell) | ||
38 | # OK | ||
39 | ;; | ||
40 | Index: gcc-4_6-branch/gcc/config/rs6000/e5500.md | ||
41 | =================================================================== | ||
42 | --- /dev/null | ||
43 | +++ gcc-4_6-branch/gcc/config/rs6000/e5500.md | ||
44 | @@ -0,0 +1,176 @@ | ||
45 | +;; Pipeline description for Freescale PowerPC e5500 core. | ||
46 | +;; Copyright (C) 2011 Free Software Foundation, Inc. | ||
47 | +;; Contributed by Edmar Wienskoski (edmar@freescale.com) | ||
48 | +;; | ||
49 | +;; This file is part of GCC. | ||
50 | +;; | ||
51 | +;; GCC is free software; you can redistribute it and/or modify it | ||
52 | +;; under the terms of the GNU General Public License as published | ||
53 | +;; by the Free Software Foundation; either version 3, or (at your | ||
54 | +;; option) any later version. | ||
55 | +;; | ||
56 | +;; GCC is distributed in the hope that it will be useful, but WITHOUT | ||
57 | +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | ||
58 | +;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public | ||
59 | +;; License for more details. | ||
60 | +;; | ||
61 | +;; You should have received a copy of the GNU General Public License | ||
62 | +;; along with GCC; see the file COPYING3. If not see | ||
63 | +;; <http://www.gnu.org/licenses/>. | ||
64 | +;; | ||
65 | +;; e5500 64-bit SFX(2), CFX, LSU, FPU, BU | ||
66 | +;; Max issue 3 insns/clock cycle (includes 1 branch) | ||
67 | + | ||
68 | +(define_automaton "e5500_most,e5500_long") | ||
69 | +(define_cpu_unit "e5500_decode_0,e5500_decode_1" "e5500_most") | ||
70 | + | ||
71 | +;; SFX. | ||
72 | +(define_cpu_unit "e5500_sfx_0,e5500_sfx_1" "e5500_most") | ||
73 | + | ||
74 | +;; CFX. | ||
75 | +(define_cpu_unit "e5500_cfx_stage0,e5500_cfx_stage1" "e5500_most") | ||
76 | + | ||
77 | +;; Non-pipelined division. | ||
78 | +(define_cpu_unit "e5500_cfx_div" "e5500_long") | ||
79 | + | ||
80 | +;; LSU. | ||
81 | +(define_cpu_unit "e5500_lsu" "e5500_most") | ||
82 | + | ||
83 | +;; FPU. | ||
84 | +(define_cpu_unit "e5500_fpu" "e5500_long") | ||
85 | + | ||
86 | +;; BU. | ||
87 | +(define_cpu_unit "e5500_bu" "e5500_most") | ||
88 | + | ||
89 | +;; The following units are used to make the automata deterministic. | ||
90 | +(define_cpu_unit "present_e5500_decode_0" "e5500_most") | ||
91 | +(define_cpu_unit "present_e5500_sfx_0" "e5500_most") | ||
92 | +(presence_set "present_e5500_decode_0" "e5500_decode_0") | ||
93 | +(presence_set "present_e5500_sfx_0" "e5500_sfx_0") | ||
94 | + | ||
95 | +;; Some useful abbreviations. | ||
96 | +(define_reservation "e5500_decode" | ||
97 | + "e5500_decode_0|e5500_decode_1+present_e5500_decode_0") | ||
98 | +(define_reservation "e5500_sfx" | ||
99 | + "e5500_sfx_0|e5500_sfx_1+present_e5500_sfx_0") | ||
100 | + | ||
101 | +;; SFX. | ||
102 | +(define_insn_reservation "e5500_sfx" 1 | ||
103 | + (and (eq_attr "type" "integer,insert_word,insert_dword,delayed_compare,\ | ||
104 | + shift,cntlz,exts") | ||
105 | + (eq_attr "cpu" "ppce5500")) | ||
106 | + "e5500_decode,e5500_sfx") | ||
107 | + | ||
108 | +(define_insn_reservation "e5500_sfx2" 2 | ||
109 | + (and (eq_attr "type" "cmp,compare,fast_compare,trap") | ||
110 | + (eq_attr "cpu" "ppce5500")) | ||
111 | + "e5500_decode,e5500_sfx") | ||
112 | + | ||
113 | +(define_insn_reservation "e5500_delayed" 2 | ||
114 | + (and (eq_attr "type" "var_shift_rotate,var_delayed_compare,popcnt") | ||
115 | + (eq_attr "cpu" "ppce5500")) | ||
116 | + "e5500_decode,e5500_sfx*2") | ||
117 | + | ||
118 | +(define_insn_reservation "e5500_two" 2 | ||
119 | + (and (eq_attr "type" "two") | ||
120 | + (eq_attr "cpu" "ppce5500")) | ||
121 | + "e5500_decode,e5500_decode+e5500_sfx,e5500_sfx") | ||
122 | + | ||
123 | +(define_insn_reservation "e5500_three" 3 | ||
124 | + (and (eq_attr "type" "three") | ||
125 | + (eq_attr "cpu" "ppce5500")) | ||
126 | + "e5500_decode,(e5500_decode+e5500_sfx)*2,e5500_sfx") | ||
127 | + | ||
128 | +;; SFX - Mfcr. | ||
129 | +(define_insn_reservation "e5500_mfcr" 4 | ||
130 | + (and (eq_attr "type" "mfcr") | ||
131 | + (eq_attr "cpu" "ppce5500")) | ||
132 | + "e5500_decode,e5500_sfx_0*4") | ||
133 | + | ||
134 | +;; SFX - Mtcrf. | ||
135 | +(define_insn_reservation "e5500_mtcrf" 1 | ||
136 | + (and (eq_attr "type" "mtcr") | ||
137 | + (eq_attr "cpu" "ppce5500")) | ||
138 | + "e5500_decode,e5500_sfx_0") | ||
139 | + | ||
140 | +;; SFX - Mtjmpr. | ||
141 | +(define_insn_reservation "e5500_mtjmpr" 1 | ||
142 | + (and (eq_attr "type" "mtjmpr,mfjmpr") | ||
143 | + (eq_attr "cpu" "ppce5500")) | ||
144 | + "e5500_decode,e5500_sfx") | ||
145 | + | ||
146 | +;; CFX - Multiply. | ||
147 | +(define_insn_reservation "e5500_multiply" 4 | ||
148 | + (and (eq_attr "type" "imul") | ||
149 | + (eq_attr "cpu" "ppce5500")) | ||
150 | + "e5500_decode,e5500_cfx_stage0,e5500_cfx_stage1") | ||
151 | + | ||
152 | +(define_insn_reservation "e5500_multiply_i" 5 | ||
153 | + (and (eq_attr "type" "imul2,imul3,imul_compare") | ||
154 | + (eq_attr "cpu" "ppce5500")) | ||
155 | + "e5500_decode,e5500_cfx_stage0,\ | ||
156 | + e5500_cfx_stage0+e5500_cfx_stage1,e5500_cfx_stage1") | ||
157 | + | ||
158 | +;; CFX - Divide. | ||
159 | +(define_insn_reservation "e5500_divide" 16 | ||
160 | + (and (eq_attr "type" "idiv") | ||
161 | + (eq_attr "cpu" "ppce5500")) | ||
162 | + "e5500_decode,e5500_cfx_stage0+e5500_cfx_div,\ | ||
163 | + e5500_cfx_div*15") | ||
164 | + | ||
165 | +(define_insn_reservation "e5500_divide_d" 26 | ||
166 | + (and (eq_attr "type" "ldiv") | ||
167 | + (eq_attr "cpu" "ppce5500")) | ||
168 | + "e5500_decode,e5500_cfx_stage0+e5500_cfx_div,\ | ||
169 | + e5500_cfx_div*25") | ||
170 | + | ||
171 | +;; LSU - Loads. | ||
172 | +(define_insn_reservation "e5500_load" 3 | ||
173 | + (and (eq_attr "type" "load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u,\ | ||
174 | + load_l,sync") | ||
175 | + (eq_attr "cpu" "ppce5500")) | ||
176 | + "e5500_decode,e5500_lsu") | ||
177 | + | ||
178 | +(define_insn_reservation "e5500_fpload" 4 | ||
179 | + (and (eq_attr "type" "fpload,fpload_ux,fpload_u") | ||
180 | + (eq_attr "cpu" "ppce5500")) | ||
181 | + "e5500_decode,e5500_lsu") | ||
182 | + | ||
183 | +;; LSU - Stores. | ||
184 | +(define_insn_reservation "e5500_store" 3 | ||
185 | + (and (eq_attr "type" "store,store_ux,store_u,store_c") | ||
186 | + (eq_attr "cpu" "ppce5500")) | ||
187 | + "e5500_decode,e5500_lsu") | ||
188 | + | ||
189 | +(define_insn_reservation "e5500_fpstore" 3 | ||
190 | + (and (eq_attr "type" "fpstore,fpstore_ux,fpstore_u") | ||
191 | + (eq_attr "cpu" "ppce5500")) | ||
192 | + "e5500_decode,e5500_lsu") | ||
193 | + | ||
194 | +;; FP. | ||
195 | +(define_insn_reservation "e5500_float" 7 | ||
196 | + (and (eq_attr "type" "fpsimple,fp,fpcompare,dmul") | ||
197 | + (eq_attr "cpu" "ppce5500")) | ||
198 | + "e5500_decode,e5500_fpu") | ||
199 | + | ||
200 | +(define_insn_reservation "e5500_sdiv" 20 | ||
201 | + (and (eq_attr "type" "sdiv") | ||
202 | + (eq_attr "cpu" "ppce5500")) | ||
203 | + "e5500_decode,e5500_fpu*20") | ||
204 | + | ||
205 | +(define_insn_reservation "e5500_ddiv" 35 | ||
206 | + (and (eq_attr "type" "ddiv") | ||
207 | + (eq_attr "cpu" "ppce5500")) | ||
208 | + "e5500_decode,e5500_fpu*35") | ||
209 | + | ||
210 | +;; BU. | ||
211 | +(define_insn_reservation "e5500_branch" 1 | ||
212 | + (and (eq_attr "type" "jmpreg,branch,isync") | ||
213 | + (eq_attr "cpu" "ppce5500")) | ||
214 | + "e5500_decode,e5500_bu") | ||
215 | + | ||
216 | +;; BU - CR logical. | ||
217 | +(define_insn_reservation "e5500_cr_logical" 1 | ||
218 | + (and (eq_attr "type" "cr_logical,delayed_cr") | ||
219 | + (eq_attr "cpu" "ppce5500")) | ||
220 | + "e5500_decode,e5500_bu") | ||
221 | Index: gcc-4_6-branch/gcc/config/rs6000/rs6000-opts.h | ||
222 | =================================================================== | ||
223 | --- gcc-4_6-branch.orig/gcc/config/rs6000/rs6000-opts.h | ||
224 | +++ gcc-4_6-branch/gcc/config/rs6000/rs6000-opts.h | ||
225 | @@ -53,6 +53,7 @@ enum processor_type | ||
226 | PROCESSOR_PPCE300C3, | ||
227 | PROCESSOR_PPCE500MC, | ||
228 | PROCESSOR_PPCE500MC64, | ||
229 | + PROCESSOR_PPCE5500, | ||
230 | PROCESSOR_POWER4, | ||
231 | PROCESSOR_POWER5, | ||
232 | PROCESSOR_POWER6, | ||
233 | Index: gcc-4_6-branch/gcc/config/rs6000/rs6000.c | ||
234 | =================================================================== | ||
235 | --- gcc-4_6-branch.orig/gcc/config/rs6000/rs6000.c | ||
236 | +++ gcc-4_6-branch/gcc/config/rs6000/rs6000.c | ||
237 | @@ -779,6 +779,25 @@ struct processor_costs ppce500mc64_cost | ||
238 | 1, /* prefetch streams /*/ | ||
239 | }; | ||
240 | |||
241 | +/* Instruction costs on PPCE5500 processors. */ | ||
242 | +static const | ||
243 | +struct processor_costs ppce5500_cost = { | ||
244 | + COSTS_N_INSNS (5), /* mulsi */ | ||
245 | + COSTS_N_INSNS (5), /* mulsi_const */ | ||
246 | + COSTS_N_INSNS (5), /* mulsi_const9 */ | ||
247 | + COSTS_N_INSNS (5), /* muldi */ | ||
248 | + COSTS_N_INSNS (14), /* divsi */ | ||
249 | + COSTS_N_INSNS (14), /* divdi */ | ||
250 | + COSTS_N_INSNS (7), /* fp */ | ||
251 | + COSTS_N_INSNS (10), /* dmul */ | ||
252 | + COSTS_N_INSNS (36), /* sdiv */ | ||
253 | + COSTS_N_INSNS (66), /* ddiv */ | ||
254 | + 64, /* cache line size */ | ||
255 | + 32, /* l1 cache */ | ||
256 | + 128, /* l2 cache */ | ||
257 | + 1, /* prefetch streams /*/ | ||
258 | +}; | ||
259 | + | ||
260 | /* Instruction costs on AppliedMicro Titan processors. */ | ||
261 | static const | ||
262 | struct processor_costs titan_cost = { | ||
263 | @@ -1784,6 +1803,9 @@ static struct rs6000_ptt const processor | ||
264 | | MASK_ISEL}, | ||
265 | {"e500mc64", PROCESSOR_PPCE500MC64, POWERPC_BASE_MASK | MASK_POWERPC64 | ||
266 | | MASK_PPC_GFXOPT | MASK_ISEL}, | ||
267 | + {"e5500", PROCESSOR_PPCE5500, POWERPC_BASE_MASK | MASK_POWERPC64 | ||
268 | + | MASK_PPC_GFXOPT | MASK_ISEL | MASK_CMPB | MASK_POPCNTB | ||
269 | + | MASK_POPCNTD}, | ||
270 | {"860", PROCESSOR_MPCCORE, POWERPC_BASE_MASK | MASK_SOFT_FLOAT}, | ||
271 | {"970", PROCESSOR_POWER4, | ||
272 | POWERPC_7400_MASK | MASK_PPC_GPOPT | MASK_MFCRF | MASK_POWERPC64}, | ||
273 | @@ -2741,7 +2763,8 @@ rs6000_option_override_internal (bool gl | ||
274 | : PROCESSOR_DEFAULT)); | ||
275 | |||
276 | if (rs6000_cpu == PROCESSOR_PPCE300C2 || rs6000_cpu == PROCESSOR_PPCE300C3 | ||
277 | - || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64) | ||
278 | + || rs6000_cpu == PROCESSOR_PPCE500MC || rs6000_cpu == PROCESSOR_PPCE500MC64 | ||
279 | + || rs6000_cpu == PROCESSOR_PPCE5500) | ||
280 | { | ||
281 | if (TARGET_ALTIVEC) | ||
282 | error ("AltiVec not supported in this target"); | ||
283 | @@ -2842,9 +2865,14 @@ rs6000_option_override_internal (bool gl | ||
284 | user's opinion, though. */ | ||
285 | if (rs6000_block_move_inline_limit == 0 | ||
286 | && (rs6000_cpu == PROCESSOR_PPCE500MC | ||
287 | - || rs6000_cpu == PROCESSOR_PPCE500MC64)) | ||
288 | + || rs6000_cpu == PROCESSOR_PPCE500MC64 | ||
289 | + || rs6000_cpu == PROCESSOR_PPCE5500)) | ||
290 | rs6000_block_move_inline_limit = 128; | ||
291 | |||
292 | + /* Those machines does not have fsqrt instruction */ | ||
293 | + if (rs6000_cpu == PROCESSOR_PPCE5500) | ||
294 | + target_flags &= ~MASK_PPC_GPOPT; | ||
295 | + | ||
296 | /* store_one_arg depends on expand_block_move to handle at least the | ||
297 | size of reg_parm_stack_space. */ | ||
298 | if (rs6000_block_move_inline_limit < (TARGET_POWERPC64 ? 64 : 32)) | ||
299 | @@ -2976,7 +3004,8 @@ rs6000_option_override_internal (bool gl | ||
300 | #endif | ||
301 | |||
302 | if (TARGET_E500 || rs6000_cpu == PROCESSOR_PPCE500MC | ||
303 | - || rs6000_cpu == PROCESSOR_PPCE500MC64) | ||
304 | + || rs6000_cpu == PROCESSOR_PPCE500MC64 | ||
305 | + || rs6000_cpu == PROCESSOR_PPCE5500) | ||
306 | { | ||
307 | /* The e500 and e500mc do not have string instructions, and we set | ||
308 | MASK_STRING above when optimizing for size. */ | ||
309 | @@ -3023,7 +3052,8 @@ rs6000_option_override_internal (bool gl | ||
310 | || rs6000_cpu == PROCESSOR_POWER6 | ||
311 | || rs6000_cpu == PROCESSOR_POWER7 | ||
312 | || rs6000_cpu == PROCESSOR_PPCE500MC | ||
313 | - || rs6000_cpu == PROCESSOR_PPCE500MC64); | ||
314 | + || rs6000_cpu == PROCESSOR_PPCE500MC64 | ||
315 | + || rs6000_cpu == PROCESSOR_PPCE5500); | ||
316 | |||
317 | /* Allow debug switches to override the above settings. These are set to -1 | ||
318 | in rs6000.opt to indicate the user hasn't directly set the switch. */ | ||
319 | @@ -3245,6 +3275,10 @@ rs6000_option_override_internal (bool gl | ||
320 | rs6000_cost = &ppce500mc64_cost; | ||
321 | break; | ||
322 | |||
323 | + case PROCESSOR_PPCE5500: | ||
324 | + rs6000_cost = &ppce5500_cost; | ||
325 | + break; | ||
326 | + | ||
327 | case PROCESSOR_TITAN: | ||
328 | rs6000_cost = &titan_cost; | ||
329 | break; | ||
330 | @@ -23227,6 +23261,7 @@ rs6000_adjust_cost (rtx insn, rtx link, | ||
331 | || rs6000_cpu_attr == CPU_PPC750 | ||
332 | || rs6000_cpu_attr == CPU_PPC7400 | ||
333 | || rs6000_cpu_attr == CPU_PPC7450 | ||
334 | + || rs6000_cpu_attr == CPU_PPCE5500 | ||
335 | || rs6000_cpu_attr == CPU_POWER4 | ||
336 | || rs6000_cpu_attr == CPU_POWER5 | ||
337 | || rs6000_cpu_attr == CPU_POWER7 | ||
338 | @@ -23771,6 +23806,7 @@ rs6000_issue_rate (void) | ||
339 | case CPU_PPCE300C3: | ||
340 | case CPU_PPCE500MC: | ||
341 | case CPU_PPCE500MC64: | ||
342 | + case CPU_PPCE5500: | ||
343 | case CPU_TITAN: | ||
344 | return 2; | ||
345 | case CPU_RIOS2: | ||
346 | Index: gcc-4_6-branch/gcc/config/rs6000/rs6000.h | ||
347 | =================================================================== | ||
348 | --- gcc-4_6-branch.orig/gcc/config/rs6000/rs6000.h | ||
349 | +++ gcc-4_6-branch/gcc/config/rs6000/rs6000.h | ||
350 | @@ -168,6 +168,7 @@ | ||
351 | %{mcpu=e300c3: -me300} \ | ||
352 | %{mcpu=e500mc: -me500mc} \ | ||
353 | %{mcpu=e500mc64: -me500mc64} \ | ||
354 | +%{mcpu=e5500: -me5500} \ | ||
355 | %{maltivec: -maltivec} \ | ||
356 | %{mvsx: -mvsx %{!maltivec: -maltivec} %{!mcpu*: %(asm_cpu_power7)}} \ | ||
357 | -many" | ||
358 | @@ -477,13 +478,13 @@ extern int rs6000_vector_align[]; | ||
359 | |||
360 | #define TARGET_FCTIDZ TARGET_FCFID | ||
361 | #define TARGET_STFIWX TARGET_PPC_GFXOPT | ||
362 | -#define TARGET_LFIWAX TARGET_CMPB | ||
363 | -#define TARGET_LFIWZX TARGET_POPCNTD | ||
364 | -#define TARGET_FCFIDS TARGET_POPCNTD | ||
365 | -#define TARGET_FCFIDU TARGET_POPCNTD | ||
366 | -#define TARGET_FCFIDUS TARGET_POPCNTD | ||
367 | -#define TARGET_FCTIDUZ TARGET_POPCNTD | ||
368 | -#define TARGET_FCTIWUZ TARGET_POPCNTD | ||
369 | +#define TARGET_LFIWAX (TARGET_CMPB && rs6000_cpu != PROCESSOR_PPCE5500) | ||
370 | +#define TARGET_LFIWZX (TARGET_POPCNTD && rs6000_cpu != PROCESSOR_PPCE5500) | ||
371 | +#define TARGET_FCFIDS TARGET_LFIWZX | ||
372 | +#define TARGET_FCFIDU TARGET_LFIWZX | ||
373 | +#define TARGET_FCFIDUS TARGET_LFIWZX | ||
374 | +#define TARGET_FCTIDUZ TARGET_LFIWZX | ||
375 | +#define TARGET_FCTIWUZ TARGET_LFIWZX | ||
376 | |||
377 | /* E500 processors only support plain "sync", not lwsync. */ | ||
378 | #define TARGET_NO_LWSYNC TARGET_E500 | ||
379 | @@ -494,10 +495,12 @@ extern int rs6000_vector_align[]; | ||
380 | |||
381 | #define TARGET_FRE (TARGET_HARD_FLOAT && TARGET_FPRS \ | ||
382 | && TARGET_DOUBLE_FLOAT \ | ||
383 | - && (TARGET_POPCNTB || VECTOR_UNIT_VSX_P (DFmode))) | ||
384 | + && (TARGET_POPCNTB || VECTOR_UNIT_VSX_P (DFmode)) \ | ||
385 | + && rs6000_cpu != PROCESSOR_PPCE5500) | ||
386 | |||
387 | #define TARGET_FRSQRTES (TARGET_HARD_FLOAT && TARGET_POPCNTB \ | ||
388 | - && TARGET_FPRS && TARGET_SINGLE_FLOAT) | ||
389 | + && TARGET_FPRS && TARGET_SINGLE_FLOAT \ | ||
390 | + && rs6000_cpu != PROCESSOR_PPCE5500) | ||
391 | |||
392 | #define TARGET_FRSQRTE (TARGET_HARD_FLOAT && TARGET_FPRS \ | ||
393 | && TARGET_DOUBLE_FLOAT \ | ||
394 | Index: gcc-4_6-branch/gcc/config/rs6000/rs6000.md | ||
395 | =================================================================== | ||
396 | --- gcc-4_6-branch.orig/gcc/config/rs6000/rs6000.md | ||
397 | +++ gcc-4_6-branch/gcc/config/rs6000/rs6000.md | ||
398 | @@ -126,7 +126,7 @@ | ||
399 | |||
400 | ;; Define an insn type attribute. This is used in function unit delay | ||
401 | ;; computations. | ||
402 | -(define_attr "type" "integer,two,three,load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u,store,store_ux,store_u,fpload,fpload_ux,fpload_u,fpstore,fpstore_ux,fpstore_u,vecload,vecstore,imul,imul2,imul3,lmul,idiv,ldiv,insert_word,branch,cmp,fast_compare,compare,var_delayed_compare,delayed_compare,imul_compare,lmul_compare,fpcompare,cr_logical,delayed_cr,mfcr,mfcrf,mtcr,mfjmpr,mtjmpr,fp,fpsimple,dmul,sdiv,ddiv,ssqrt,dsqrt,jmpreg,brinc,vecsimple,veccomplex,vecdiv,veccmp,veccmpsimple,vecperm,vecfloat,vecfdiv,isync,sync,load_l,store_c,shift,trap,insert_dword,var_shift_rotate,cntlz,exts,mffgpr,mftgpr,isel" | ||
403 | +(define_attr "type" "integer,two,three,load,load_ext,load_ext_u,load_ext_ux,load_ux,load_u,store,store_ux,store_u,fpload,fpload_ux,fpload_u,fpstore,fpstore_ux,fpstore_u,vecload,vecstore,imul,imul2,imul3,lmul,idiv,ldiv,insert_word,branch,cmp,fast_compare,compare,var_delayed_compare,delayed_compare,imul_compare,lmul_compare,fpcompare,cr_logical,delayed_cr,mfcr,mfcrf,mtcr,mfjmpr,mtjmpr,fp,fpsimple,dmul,sdiv,ddiv,ssqrt,dsqrt,jmpreg,brinc,vecsimple,veccomplex,vecdiv,veccmp,veccmpsimple,vecperm,vecfloat,vecfdiv,isync,sync,load_l,store_c,shift,trap,insert_dword,var_shift_rotate,cntlz,exts,mffgpr,mftgpr,isel,popcnt" | ||
404 | (const_string "integer")) | ||
405 | |||
406 | ;; Define floating point instruction sub-types for use with Xfpu.md | ||
407 | @@ -148,7 +148,7 @@ | ||
408 | ;; Processor type -- this attribute must exactly match the processor_type | ||
409 | ;; enumeration in rs6000.h. | ||
410 | |||
411 | -(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc476,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,ppce300c2,ppce300c3,ppce500mc,ppce500mc64,power4,power5,power6,power7,cell,ppca2,titan" | ||
412 | +(define_attr "cpu" "rios1,rios2,rs64a,mpccore,ppc403,ppc405,ppc440,ppc476,ppc601,ppc603,ppc604,ppc604e,ppc620,ppc630,ppc750,ppc7400,ppc7450,ppc8540,ppce300c2,ppce300c3,ppce500mc,ppce500mc64,ppce5500,power4,power5,power6,power7,cell,ppca2,titan" | ||
413 | (const (symbol_ref "rs6000_cpu_attr"))) | ||
414 | |||
415 | |||
416 | @@ -176,6 +176,7 @@ | ||
417 | (include "e300c2c3.md") | ||
418 | (include "e500mc.md") | ||
419 | (include "e500mc64.md") | ||
420 | +(include "e5500.md") | ||
421 | (include "power4.md") | ||
422 | (include "power5.md") | ||
423 | (include "power6.md") | ||
424 | @@ -2302,13 +2303,17 @@ | ||
425 | (unspec:GPR [(match_operand:GPR 1 "gpc_reg_operand" "r")] | ||
426 | UNSPEC_POPCNTB))] | ||
427 | "TARGET_POPCNTB" | ||
428 | - "popcntb %0,%1") | ||
429 | + "popcntb %0,%1" | ||
430 | + [(set_attr "length" "4") | ||
431 | + (set_attr "type" "popcnt")]) | ||
432 | |||
433 | (define_insn "popcntd<mode>2" | ||
434 | [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") | ||
435 | (popcount:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")))] | ||
436 | "TARGET_POPCNTD" | ||
437 | - "popcnt<wd> %0,%1") | ||
438 | + "popcnt<wd> %0,%1" | ||
439 | + [(set_attr "length" "4") | ||
440 | + (set_attr "type" "popcnt")]) | ||
441 | |||
442 | (define_expand "popcount<mode>2" | ||
443 | [(set (match_operand:GPR 0 "gpc_reg_operand" "") | ||
444 | @@ -5957,10 +5962,10 @@ | ||
445 | && ((TARGET_PPC_GFXOPT | ||
446 | && !HONOR_NANS (<MODE>mode) | ||
447 | && !HONOR_SIGNED_ZEROS (<MODE>mode)) | ||
448 | - || TARGET_CMPB | ||
449 | + || TARGET_LFIWAX | ||
450 | || VECTOR_UNIT_VSX_P (<MODE>mode))" | ||
451 | { | ||
452 | - if (TARGET_CMPB || VECTOR_UNIT_VSX_P (<MODE>mode)) | ||
453 | + if (TARGET_LFIWAX || VECTOR_UNIT_VSX_P (<MODE>mode)) | ||
454 | { | ||
455 | emit_insn (gen_copysign<mode>3_fcpsgn (operands[0], operands[1], | ||
456 | operands[2])); | ||
457 | @@ -5979,7 +5984,7 @@ | ||
458 | (unspec:SFDF [(match_operand:SFDF 1 "gpc_reg_operand" "<rreg2>") | ||
459 | (match_operand:SFDF 2 "gpc_reg_operand" "<rreg2>")] | ||
460 | UNSPEC_COPYSIGN))] | ||
461 | - "TARGET_CMPB && !VECTOR_UNIT_VSX_P (<MODE>mode)" | ||
462 | + "TARGET_LFIWAX && !VECTOR_UNIT_VSX_P (<MODE>mode)" | ||
463 | "fcpsgn %0,%2,%1" | ||
464 | [(set_attr "type" "fp")]) | ||
465 | |||