diff options
Diffstat (limited to 'meta/packages/gcc')
95 files changed, 22779 insertions, 16962 deletions
diff --git a/meta/packages/gcc/gcc-3.4.3/15342.patch b/meta/packages/gcc/gcc-3.4.3/15342.patch deleted file mode 100644 index d0f3e72d47..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/15342.patch +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | --- gcc/gcc/regrename.c~ 2004-01-14 17:55:20.000000000 +0000 | ||
2 | +++ gcc/gcc/regrename.c 2005-02-28 07:24:25.893015200 +0000 | ||
3 | @@ -671,7 +671,8 @@ | ||
4 | |||
5 | case SET: | ||
6 | scan_rtx (insn, &SET_SRC (x), class, action, OP_IN, 0); | ||
7 | - scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 0); | ||
8 | + scan_rtx (insn, &SET_DEST (x), class, action, | ||
9 | + GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 0); | ||
10 | return; | ||
11 | |||
12 | case STRICT_LOW_PART: | ||
13 | @@ -696,7 +697,8 @@ | ||
14 | abort (); | ||
15 | |||
16 | case CLOBBER: | ||
17 | - scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 1); | ||
18 | + scan_rtx (insn, &SET_DEST (x), class, action, | ||
19 | + GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 0); | ||
20 | return; | ||
21 | |||
22 | case EXPR_LIST: | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/GCC3.4.0VisibilityPatch.diff b/meta/packages/gcc/gcc-3.4.3/GCC3.4.0VisibilityPatch.diff deleted file mode 100644 index d51da7157d..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/GCC3.4.0VisibilityPatch.diff +++ /dev/null | |||
@@ -1,1100 +0,0 @@ | |||
1 | |||
2 | diff -aur gcc-3.4.0orig/gcc/c-common.c gcc-3.4.0/gcc/c-common.c | ||
3 | --- gcc-3.4.0orig/gcc/c-common.c 2004-03-19 01:32:59.000000000 +0000 | ||
4 | +++ gcc-3.4.0/gcc/c-common.c 2004-05-10 21:05:33.000000000 +0100 | ||
5 | @@ -833,7 +833,7 @@ | ||
6 | handle_deprecated_attribute }, | ||
7 | { "vector_size", 1, 1, false, true, false, | ||
8 | handle_vector_size_attribute }, | ||
9 | - { "visibility", 1, 1, true, false, false, | ||
10 | + { "visibility", 1, 1, false, false, false, | ||
11 | handle_visibility_attribute }, | ||
12 | { "tls_model", 1, 1, true, false, false, | ||
13 | handle_tls_model_attribute }, | ||
14 | @@ -4886,7 +4886,16 @@ | ||
15 | |||
16 | *no_add_attrs = true; | ||
17 | |||
18 | - if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl)) | ||
19 | + if (TYPE_P (*node)) | ||
20 | + { | ||
21 | + if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE) | ||
22 | + { | ||
23 | + warning ("`%s' attribute ignored on non-class types", | ||
24 | + IDENTIFIER_POINTER (name)); | ||
25 | + return NULL_TREE; | ||
26 | + } | ||
27 | + } | ||
28 | + else if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl)) | ||
29 | { | ||
30 | warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | ||
31 | return NULL_TREE; | ||
32 | @@ -4897,6 +4906,14 @@ | ||
33 | error ("visibility arg not a string"); | ||
34 | return NULL_TREE; | ||
35 | } | ||
36 | + | ||
37 | + /* If this is a type, set the visibility on the type decl. */ | ||
38 | + if (TYPE_P (decl)) | ||
39 | + { | ||
40 | + decl = TYPE_NAME (decl); | ||
41 | + if (! decl) | ||
42 | + return NULL_TREE; | ||
43 | + } | ||
44 | |||
45 | if (strcmp (TREE_STRING_POINTER (id), "default") == 0) | ||
46 | DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; | ||
47 | @@ -4908,6 +4925,14 @@ | ||
48 | DECL_VISIBILITY (decl) = VISIBILITY_PROTECTED; | ||
49 | else | ||
50 | error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\""); | ||
51 | + DECL_VISIBILITYSPECIFIED (decl) = 1; | ||
52 | + | ||
53 | + /* For decls only, go ahead and attach the attribute to the node as well. | ||
54 | + This is needed so we can determine whether we have VISIBILITY_DEFAULT | ||
55 | + because the visibility was not specified, or because it was explicitly | ||
56 | + overridden from the class visibility. */ | ||
57 | + if (DECL_P (*node)) | ||
58 | + *no_add_attrs = false; | ||
59 | |||
60 | return NULL_TREE; | ||
61 | } | ||
62 | |||
63 | diff -aur gcc-3.4.0orig/gcc/c-decl.c gcc-3.4.0/gcc/c-decl.c | ||
64 | --- gcc-3.4.0orig/gcc/c-decl.c 2004-03-22 17:58:18.000000000 +0000 | ||
65 | +++ gcc-3.4.0/gcc/c-decl.c 2004-05-10 15:16:27.000000000 +0100 | ||
66 | @@ -1164,9 +1164,8 @@ | ||
67 | } | ||
68 | |||
69 | /* warnings */ | ||
70 | - /* All decls must agree on a non-default visibility. */ | ||
71 | - if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT | ||
72 | - && DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT | ||
73 | + /* All decls must agree on a visibility. */ | ||
74 | + if (DECL_VISIBILITYSPECIFIED (newdecl) && DECL_VISIBILITYSPECIFIED (olddecl) | ||
75 | && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) | ||
76 | { | ||
77 | warning ("%Jredeclaration of '%D' with different visibility " | ||
78 | @@ -1361,9 +1360,12 @@ | ||
79 | Currently, it can only be defined in the prototype. */ | ||
80 | COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); | ||
81 | |||
82 | - /* If either declaration has a nondefault visibility, use it. */ | ||
83 | - if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT) | ||
84 | - DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); | ||
85 | + /* Use visibility of whichever declaration had it specified */ | ||
86 | + if (DECL_VISIBILITYSPECIFIED (olddecl)) | ||
87 | + { | ||
88 | + DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); | ||
89 | + DECL_VISIBILITYSPECIFIED (newdecl) = 1; | ||
90 | + } | ||
91 | |||
92 | if (TREE_CODE (newdecl) == FUNCTION_DECL) | ||
93 | { | ||
94 | |||
95 | diff -aur gcc-3.4.0orig/gcc/common.opt gcc-3.4.0/gcc/common.opt | ||
96 | --- gcc-3.4.0orig/gcc/common.opt 2004-02-18 00:09:04.000000000 +0000 | ||
97 | +++ gcc-3.4.0/gcc/common.opt 2004-05-09 08:10:50.000000000 +0100 | ||
98 | @@ -718,6 +718,11 @@ | ||
99 | Common | ||
100 | Add extra commentary to assembler output | ||
101 | |||
102 | +fvisibility= | ||
103 | +Common Joined RejectNegative | ||
104 | +-fvisibility=[default|internal|hidden|protected] Set the default symbol visibility | ||
105 | + | ||
106 | + | ||
107 | fvpt | ||
108 | Common | ||
109 | Use expression value profiles in optimizations | ||
110 | |||
111 | diff -aur gcc-3.4.0orig/gcc/c.opt gcc-3.4.0/gcc/c.opt | ||
112 | --- gcc-3.4.0orig/gcc/c.opt 2004-02-18 00:09:03.000000000 +0000 | ||
113 | +++ gcc-3.4.0/gcc/c.opt 2004-05-09 08:10:50.000000000 +0100 | ||
114 | @@ -656,6 +656,10 @@ | ||
115 | C++ ObjC++ | ||
116 | Use __cxa_atexit to register destructors | ||
117 | |||
118 | +fvisibility-inlines-hidden | ||
119 | +C++ | ||
120 | +Marks all inlined methods as having hidden visibility | ||
121 | + | ||
122 | fvtable-gc | ||
123 | C++ ObjC++ | ||
124 | Discard unused virtual functions | ||
125 | diff -aur gcc-3.4.0orig/gcc/c-opts.c gcc-3.4.0/gcc/c-opts.c | ||
126 | --- gcc-3.4.0orig/gcc/c-opts.c 2004-02-18 00:09:03.000000000 +0000 | ||
127 | +++ gcc-3.4.0/gcc/c-opts.c 2004-05-09 08:10:50.000000000 +0100 | ||
128 | @@ -912,6 +912,10 @@ | ||
129 | case OPT_fuse_cxa_atexit: | ||
130 | flag_use_cxa_atexit = value; | ||
131 | break; | ||
132 | + | ||
133 | + case OPT_fvisibility_inlines_hidden: | ||
134 | + visibility_options.inlineshidden = value; | ||
135 | + break; | ||
136 | |||
137 | case OPT_fweak: | ||
138 | flag_weak = value; | ||
139 | |||
140 | diff -aur gcc-3.4.0orig/gcc/cp/class.c gcc-3.4.0/gcc/cp/class.c | ||
141 | --- gcc-3.4.0orig/gcc/cp/class.c 2004-03-09 07:27:23.000000000 +0000 | ||
142 | +++ gcc-3.4.0/gcc/cp/class.c 2004-05-10 21:06:50.000000000 +0100 | ||
143 | @@ -524,6 +524,10 @@ | ||
144 | DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node), | ||
145 | DECL_ALIGN (decl)); | ||
146 | |||
147 | + /* The vtable's visibility is the class visibility. There is no way | ||
148 | + to override the visibility for just the vtable. */ | ||
149 | + DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type); | ||
150 | + DECL_VISIBILITYSPECIFIED (decl) = CLASSTYPE_VISIBILITYSPECIFIED (class_type); | ||
151 | import_export_vtable (decl, class_type, 0); | ||
152 | |||
153 | return decl; | ||
154 | @@ -2971,7 +2975,25 @@ | ||
155 | continue; | ||
156 | |||
157 | if (TREE_CODE (x) == CONST_DECL || TREE_CODE (x) == VAR_DECL) | ||
158 | - continue; | ||
159 | + { | ||
160 | + /* Apply the class's visibility attribute to static members | ||
161 | + which do not have a visibility attribute. */ | ||
162 | + if (! lookup_attribute ("visibility", DECL_ATTRIBUTES (x))) | ||
163 | + { | ||
164 | + if (visibility_options.inlineshidden && DECL_INLINE (x)) | ||
165 | + { | ||
166 | + DECL_VISIBILITY (x) = VISIBILITY_HIDDEN; | ||
167 | + DECL_VISIBILITYSPECIFIED (x) = 1; | ||
168 | + } | ||
169 | + else | ||
170 | + { | ||
171 | + DECL_VISIBILITY (x) = CLASSTYPE_VISIBILITY (current_class_type); | ||
172 | + DECL_VISIBILITYSPECIFIED (x) = CLASSTYPE_VISIBILITYSPECIFIED (current_class_type); | ||
173 | + } | ||
174 | + } | ||
175 | + | ||
176 | + continue; | ||
177 | + } | ||
178 | |||
179 | /* Now it can only be a FIELD_DECL. */ | ||
180 | |||
181 | @@ -3708,6 +3730,22 @@ | ||
182 | check_for_override (x, t); | ||
183 | if (DECL_PURE_VIRTUAL_P (x) && ! DECL_VINDEX (x)) | ||
184 | cp_error_at ("initializer specified for non-virtual method `%D'", x); | ||
185 | + | ||
186 | + /* Apply the class's visibility attribute to methods which do | ||
187 | + not have a visibility attribute. */ | ||
188 | + if (! lookup_attribute ("visibility", DECL_ATTRIBUTES (x))) | ||
189 | + { | ||
190 | + if (visibility_options.inlineshidden && DECL_INLINE (x)) | ||
191 | + { | ||
192 | + DECL_VISIBILITY (x) = VISIBILITY_HIDDEN; | ||
193 | + DECL_VISIBILITYSPECIFIED (x) = 1; | ||
194 | + } | ||
195 | + else | ||
196 | + { | ||
197 | + DECL_VISIBILITY (x) = CLASSTYPE_VISIBILITY (current_class_type); | ||
198 | + DECL_VISIBILITYSPECIFIED (x) = CLASSTYPE_VISIBILITYSPECIFIED (current_class_type); | ||
199 | + } | ||
200 | + } | ||
201 | |||
202 | /* The name of the field is the original field name | ||
203 | Save this in auxiliary field for later overloading. */ | ||
204 | @@ -7830,3 +7868,4 @@ | ||
205 | *vid->last_init = build_tree_list (NULL_TREE, init); | ||
206 | vid->last_init = &TREE_CHAIN (*vid->last_init); | ||
207 | } | ||
208 | + | ||
209 | |||
210 | diff -aur gcc-3.4.0orig/gcc/cp/cp-tree.h gcc-3.4.0/gcc/cp/cp-tree.h | ||
211 | --- gcc-3.4.0orig/gcc/cp/cp-tree.h 2004-03-20 00:13:08.000000000 +0000 | ||
212 | +++ gcc-3.4.0/gcc/cp/cp-tree.h 2004-05-10 20:56:56.000000000 +0100 | ||
213 | @@ -1008,7 +1008,12 @@ | ||
214 | #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ | ||
215 | (lookup_base ((TYPE), (PARENT), ba_not_special | ba_quiet, NULL) \ | ||
216 | != NULL_TREE) | ||
217 | - | ||
218 | + | ||
219 | +/* Gives the visibility specification for a class type. */ | ||
220 | +#define CLASSTYPE_VISIBILITY(TYPE) DECL_VISIBILITY (TYPE_NAME (TYPE)) | ||
221 | +#define CLASSTYPE_VISIBILITYSPECIFIED(TYPE) DECL_VISIBILITYSPECIFIED (TYPE_NAME (TYPE)) | ||
222 | + | ||
223 | + | ||
224 | /* This is a few header flags for 'struct lang_type'. Actually, | ||
225 | all but the first are used only for lang_type_class; they | ||
226 | are put in this structure to save space. */ | ||
227 | |||
228 | diff -aur gcc-3.4.0orig/gcc/cp/decl.c gcc-3.4.0/gcc/cp/decl.c | ||
229 | --- gcc-3.4.0orig/gcc/cp/decl.c 2004-04-01 21:47:21.000000000 +0100 | ||
230 | +++ gcc-3.4.0/gcc/cp/decl.c 2004-05-28 21:16:11.000000000 +0100 | ||
231 | @@ -1869,17 +1869,34 @@ | ||
232 | DECL_COMMON (newdecl) = DECL_COMMON (olddecl); | ||
233 | COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); | ||
234 | |||
235 | - /* If either declaration has a nondefault visibility, use it. */ | ||
236 | - if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT) | ||
237 | + /* Warn about conflicting visibility specifications. */ | ||
238 | + if (DECL_VISIBILITYSPECIFIED (olddecl) && DECL_VISIBILITYSPECIFIED (newdecl) | ||
239 | + && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) | ||
240 | + { | ||
241 | + warning ("%J'%D': visibility attribute ignored because it", | ||
242 | + newdecl, newdecl); | ||
243 | + warning ("%Jconflicts with previous declaration here", olddecl); | ||
244 | + } | ||
245 | + /* Choose the declaration which specified visibility. */ | ||
246 | + if (DECL_VISIBILITYSPECIFIED (olddecl)) | ||
247 | { | ||
248 | - if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT | ||
249 | - && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) | ||
250 | - { | ||
251 | - warning ("%J'%D': visibility attribute ignored because it", | ||
252 | - newdecl, newdecl); | ||
253 | - warning ("%Jconflicts with previous declaration here", olddecl); | ||
254 | - } | ||
255 | DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); | ||
256 | + DECL_VISIBILITYSPECIFIED (newdecl) = 1; | ||
257 | + } | ||
258 | + /* If it's a definition of a global operator new or operator | ||
259 | + delete, it must be default visibility. */ | ||
260 | + if (NEW_DELETE_OPNAME_P (DECL_NAME (newdecl)) && DECL_INITIAL (newdecl) != NULL_TREE) | ||
261 | + { | ||
262 | + if (!DECL_FUNCTION_MEMBER_P (newdecl) && VISIBILITY_DEFAULT != DECL_VISIBILITY (newdecl)) | ||
263 | + { | ||
264 | + warning ("%J`%D': ignoring non-default symbol", | ||
265 | + newdecl, newdecl); | ||
266 | + warning ("%Jvisibility on global operator new or delete", newdecl); | ||
267 | + DECL_VISIBILITY (olddecl) = VISIBILITY_DEFAULT; | ||
268 | + DECL_VISIBILITYSPECIFIED (olddecl) = 1; | ||
269 | + DECL_VISIBILITY (newdecl) = VISIBILITY_DEFAULT; | ||
270 | + DECL_VISIBILITYSPECIFIED (newdecl) = 1; | ||
271 | + } | ||
272 | } | ||
273 | |||
274 | if (TREE_CODE (newdecl) == FUNCTION_DECL) | ||
275 | |||
276 | diff -aur gcc-3.4.0orig/gcc/cp/method.c gcc-3.4.0/gcc/cp/method.c | ||
277 | --- gcc-3.4.0orig/gcc/cp/method.c 2004-04-08 23:15:58.000000000 +0100 | ||
278 | +++ gcc-3.4.0/gcc/cp/method.c 2004-05-09 08:10:52.000000000 +0100 | ||
279 | @@ -394,6 +394,7 @@ | ||
280 | rewrite. */ | ||
281 | TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function); | ||
282 | DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function); | ||
283 | + DECL_VISIBILITYSPECIFIED (thunk_fndecl) = DECL_VISIBILITYSPECIFIED (function); | ||
284 | |||
285 | if (flag_syntax_only) | ||
286 | { | ||
287 | |||
288 | diff -aur gcc-3.4.0orig/gcc/cp/optimize.c gcc-3.4.0/gcc/cp/optimize.c | ||
289 | --- gcc-3.4.0orig/gcc/cp/optimize.c 2004-02-08 01:52:50.000000000 +0000 | ||
290 | +++ gcc-3.4.0/gcc/cp/optimize.c 2004-05-09 08:10:52.000000000 +0100 | ||
291 | @@ -155,6 +155,7 @@ | ||
292 | DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn); | ||
293 | TREE_PUBLIC (clone) = TREE_PUBLIC (fn); | ||
294 | DECL_VISIBILITY (clone) = DECL_VISIBILITY (fn); | ||
295 | + DECL_VISIBILITYSPECIFIED (clone) = DECL_VISIBILITYSPECIFIED (fn); | ||
296 | |||
297 | /* Adjust the parameter names and locations. */ | ||
298 | parm = DECL_ARGUMENTS (fn); | ||
299 | |||
300 | diff -aur gcc-3.4.0orig/gcc/cp/rtti.c gcc-3.4.0/gcc/cp/rtti.c | ||
301 | --- gcc-3.4.0orig/gcc/cp/rtti.c 2004-03-08 23:00:26.000000000 +0000 | ||
302 | +++ gcc-3.4.0/gcc/cp/rtti.c 2004-05-10 21:09:21.000000000 +0100 | ||
303 | @@ -361,7 +361,11 @@ | ||
304 | pushdecl_top_level_and_finish (d, NULL_TREE); | ||
305 | |||
306 | if (CLASS_TYPE_P (type)) | ||
307 | - CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d; | ||
308 | + { | ||
309 | + CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d; | ||
310 | + DECL_VISIBILITY (d) = CLASSTYPE_VISIBILITY (type); | ||
311 | + DECL_VISIBILITYSPECIFIED (d) = CLASSTYPE_VISIBILITYSPECIFIED (type); | ||
312 | + } | ||
313 | |||
314 | /* Remember the type it is for. */ | ||
315 | TREE_TYPE (name) = type; | ||
316 | @@ -759,6 +763,11 @@ | ||
317 | TREE_STATIC (name_decl) = 1; | ||
318 | DECL_EXTERNAL (name_decl) = 0; | ||
319 | TREE_PUBLIC (name_decl) = 1; | ||
320 | + if (CLASS_TYPE_P (target)) | ||
321 | + { | ||
322 | + DECL_VISIBILITY (name_decl) = CLASSTYPE_VISIBILITY (target); | ||
323 | + DECL_VISIBILITYSPECIFIED (name_decl) = CLASSTYPE_VISIBILITYSPECIFIED (target); | ||
324 | + } | ||
325 | import_export_tinfo (name_decl, target, typeinfo_in_lib_p (target)); | ||
326 | /* External name of the string containing the type's name has a | ||
327 | special name. */ | ||
328 | |||
329 | diff -aur gcc-3.4.0orig/gcc/c-pragma.c gcc-3.4.0/gcc/c-pragma.c | ||
330 | --- gcc-3.4.0orig/gcc/c-pragma.c 2004-01-23 23:35:53.000000000 +0000 | ||
331 | +++ gcc-3.4.0/gcc/c-pragma.c 2004-05-09 08:10:52.000000000 +0100 | ||
332 | @@ -480,6 +480,86 @@ | ||
333 | return asmname; | ||
334 | } | ||
335 | |||
336 | + | ||
337 | +#ifdef HANDLE_PRAGMA_VISIBILITY | ||
338 | +static void handle_pragma_visibility (cpp_reader *); | ||
339 | + | ||
340 | +/* Sets the default visibility for symbols to something other than that | ||
341 | + specified on the command line. */ | ||
342 | +static void | ||
343 | +handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED) | ||
344 | +{ /* Form is #pragma GCC visibility push(hidden)|pop */ | ||
345 | + static int visstack [16], visidx; | ||
346 | + tree x; | ||
347 | + enum cpp_ttype token; | ||
348 | + enum { bad, push, pop } action = bad; | ||
349 | + | ||
350 | + token = c_lex (&x); | ||
351 | + if (token == CPP_NAME) | ||
352 | + { | ||
353 | + const char *op = IDENTIFIER_POINTER (x); | ||
354 | + if (!strcmp (op, "push")) | ||
355 | + action = push; | ||
356 | + else if (!strcmp (op, "pop")) | ||
357 | + action = pop; | ||
358 | + } | ||
359 | + if (bad == action) | ||
360 | + GCC_BAD ("#pragma GCC visibility must be followed by push or pop"); | ||
361 | + else | ||
362 | + { | ||
363 | + if (pop == action) | ||
364 | + { | ||
365 | + if (!visidx) | ||
366 | + { | ||
367 | + GCC_BAD ("No matching push for '#pragma GCC visibility pop'"); | ||
368 | + } | ||
369 | + else | ||
370 | + { | ||
371 | + default_visibility = visstack[--visidx]; | ||
372 | + visibility_options.inpragma = (visidx>0); | ||
373 | + } | ||
374 | + } | ||
375 | + else | ||
376 | + { | ||
377 | + if (c_lex (&x) != CPP_OPEN_PAREN) | ||
378 | + GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored"); | ||
379 | + token = c_lex (&x); | ||
380 | + if (token != CPP_NAME) | ||
381 | + { | ||
382 | + GCC_BAD ("malformed #pragma GCC visibility push"); | ||
383 | + } | ||
384 | + else if (visidx >= 16) | ||
385 | + { | ||
386 | + GCC_BAD ("No more than sixteen #pragma GCC visibility pushes allowed at once"); | ||
387 | + } | ||
388 | + else | ||
389 | + { | ||
390 | + const char *str = IDENTIFIER_POINTER (x); | ||
391 | + visstack[visidx++] = default_visibility; | ||
392 | + if (!strcmp (str, "default")) | ||
393 | + default_visibility = VISIBILITY_DEFAULT; | ||
394 | + else if (!strcmp (str, "internal")) | ||
395 | + default_visibility = VISIBILITY_INTERNAL; | ||
396 | + else if (!strcmp (str, "hidden")) | ||
397 | + default_visibility = VISIBILITY_HIDDEN; | ||
398 | + else if (!strcmp (str, "protected")) | ||
399 | + default_visibility = VISIBILITY_PROTECTED; | ||
400 | + else | ||
401 | + { | ||
402 | + GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected"); | ||
403 | + } | ||
404 | + visibility_options.inpragma = 1; | ||
405 | + } | ||
406 | + if (c_lex (&x) != CPP_CLOSE_PAREN) | ||
407 | + GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored"); | ||
408 | + } | ||
409 | + } | ||
410 | + if (c_lex (&x) != CPP_EOF) | ||
411 | + warning ("junk at end of '#pragma GCC visibility'"); | ||
412 | +} | ||
413 | + | ||
414 | +#endif | ||
415 | + | ||
416 | /* Front-end wrapper for pragma registration to avoid dragging | ||
417 | cpplib.h in almost everywhere. */ | ||
418 | void | ||
419 | @@ -505,6 +585,9 @@ | ||
420 | #ifdef HANDLE_PRAGMA_EXTERN_PREFIX | ||
421 | c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix); | ||
422 | #endif | ||
423 | +#ifdef HANDLE_PRAGMA_VISIBILITY | ||
424 | + c_register_pragma ("GCC", "visibility", handle_pragma_visibility); | ||
425 | +#endif | ||
426 | |||
427 | #ifdef REGISTER_TARGET_PRAGMAS | ||
428 | REGISTER_TARGET_PRAGMAS (); | ||
429 | diff -aur gcc-3.4.0orig/gcc/c-pragma.h gcc-3.4.0/gcc/c-pragma.h | ||
430 | --- gcc-3.4.0orig/gcc/c-pragma.h 2004-01-31 06:18:05.000000000 +0000 | ||
431 | +++ gcc-3.4.0/gcc/c-pragma.h 2004-05-09 08:10:53.000000000 +0100 | ||
432 | @@ -44,6 +44,11 @@ | ||
433 | #define HANDLE_PRAGMA_PACK 1 | ||
434 | #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */ | ||
435 | |||
436 | +/* It's safe to always leave visibility pragma enabled as if | ||
437 | + visibility is not supported on the host OS platform the | ||
438 | + statements are ignored. */ | ||
439 | +#define HANDLE_PRAGMA_VISIBILITY 1 | ||
440 | + | ||
441 | extern void init_pragma (void); | ||
442 | |||
443 | /* Front-end wrapper for pragma registration to avoid dragging | ||
444 | |||
445 | |||
446 | diff -aur gcc-3.4.0orig/gcc/doc/invoke.texi gcc-3.4.0/gcc/doc/invoke.texi | ||
447 | --- gcc-3.4.0orig/gcc/doc/invoke.texi 2004-04-19 00:05:36.000000000 +0100 | ||
448 | +++ gcc-3.4.0/gcc/doc/invoke.texi 2004-05-28 21:29:36.000000000 +0100 | ||
449 | @@ -183,7 +183,8 @@ | ||
450 | -fno-optional-diags -fpermissive @gol | ||
451 | -frepo -fno-rtti -fstats -ftemplate-depth-@var{n} @gol | ||
452 | -fuse-cxa-atexit -fno-weak -nostdinc++ @gol | ||
453 | --fno-default-inline -Wabi -Wctor-dtor-privacy @gol | ||
454 | +-fno-default-inline -fvisibility-inlines-hidden @gol | ||
455 | +-Wabi -Wctor-dtor-privacy @gol | ||
456 | -Wnon-virtual-dtor -Wreorder @gol | ||
457 | -Weffc++ -Wno-deprecated @gol | ||
458 | -Wno-non-template-friend -Wold-style-cast @gol | ||
459 | @@ -674,7 +675,8 @@ | ||
460 | -fargument-alias -fargument-noalias @gol | ||
461 | -fargument-noalias-global -fleading-underscore @gol | ||
462 | -ftls-model=@var{model} @gol | ||
463 | --ftrapv -fwrapv -fbounds-check} | ||
464 | +-ftrapv -fwrapv -fbounds-check @gol | ||
465 | +-fvisibility} | ||
466 | @end table | ||
467 | |||
468 | @menu | ||
469 | @@ -1433,6 +1435,20 @@ | ||
470 | destructors, but will only work if your C library supports | ||
471 | @code{__cxa_atexit}. | ||
472 | |||
473 | +@item -fvisibility-inlines-hidden | ||
474 | +@opindex fvisibility-inlines-hidden | ||
475 | +Causes all inlined methods to be marked with | ||
476 | +@code{__attribute__ ((visibility ("hidden")))} so that they do not | ||
477 | +appear in the export table of a DSO and do not require a PLT indirection | ||
478 | +when used within the DSO. Enabling this option can have a dramatic effect | ||
479 | +on load and link times of a DSO as it massively reduces the size of the | ||
480 | +dynamic export table when the library makes heavy use of templates. While | ||
481 | +it can cause bloating through duplication of code within each DSO where | ||
482 | +it is used, often the wastage is less than the considerable space occupied | ||
483 | +by a long symbol name in the export table which is typical when using | ||
484 | +templates and namespaces. For even more savings, combine with the | ||
485 | +@code{-fvisibility=hidden} switch. | ||
486 | + | ||
487 | @item -fno-weak | ||
488 | @opindex fno-weak | ||
489 | Do not use weak symbol support, even if it is provided by the linker. | ||
490 | @@ -11198,6 +11214,54 @@ | ||
491 | |||
492 | The default without @option{-fpic} is @code{initial-exec}; with | ||
493 | @option{-fpic} the default is @code{global-dynamic}. | ||
494 | + | ||
495 | +@item -fvisibility=@var{default|internal|hidden|protected} | ||
496 | +@opindex fvisibility | ||
497 | +Set the default ELF image symbol visibility to the specified option - all | ||
498 | +symbols will be marked with this unless overrided within the code. | ||
499 | +Using this feature can very substantially improve linking and | ||
500 | +load times of shared object libraries, produce more optimised | ||
501 | +code, provide near-perfect API export and prevent symbol clashes. | ||
502 | +It is @strong{strongly} recommended that you use this in any shared objects | ||
503 | +you distribute. | ||
504 | + | ||
505 | +Despite the nomenclature, @code{default} always means public ie; | ||
506 | +available to be linked against from outside the shared object. | ||
507 | +@code{protected} and @code{internal} are pretty useless in real-world | ||
508 | +usage so the only other commonly used option will be @code{hidden}. | ||
509 | +The default if -fvisibility isn't specified is @code{default} ie; make every | ||
510 | +symbol public - this causes the same behaviour as previous versions of | ||
511 | +GCC. | ||
512 | + | ||
513 | +A good explanation of the benefits offered by ensuring ELF | ||
514 | +symbols have the correct visibility is given by ``How To Write | ||
515 | +Shared Libraries'' by Ulrich Drepper (which can be found at | ||
516 | +@w{@uref{http://people.redhat.com/~drepper/}}) - however a superior | ||
517 | +solution made possible by this option to marking things hidden when | ||
518 | +the default is public is to make the default hidden and mark things | ||
519 | +public. This is the norm with DLL's on Windows and with @option{-fvisibility=hidden} | ||
520 | +and @code{__attribute__ ((visibility("default")))} instead of | ||
521 | +@code{__declspec(dllexport)} you get almost identical semantics with | ||
522 | +identical syntax. This is a great boon to those working with | ||
523 | +cross-platform projects. | ||
524 | + | ||
525 | +For those adding visibility support to existing code, you may find | ||
526 | +@samp{#pragma GCC visibility} of use. This works by you enclosing | ||
527 | +the declarations you wish to set visibility for with (for example) | ||
528 | +@samp{#pragma GCC visibility push(hidden)} and | ||
529 | +@samp{#pragma GCC visibility pop}. These can be nested up to sixteen | ||
530 | +times. Bear in mind that symbol visibility should be viewed @strong{as | ||
531 | +part of the API interface contract} and thus all new code should | ||
532 | +always specify visibility when it is not the default ie; declarations | ||
533 | +only for use within the local DSO should @strong{always} be marked explicitly | ||
534 | +as hidden as so to avoid PLT indirection overheads - making this | ||
535 | +abundantly clear also aids readability and self-documentation of the code. | ||
536 | +Note that due to ISO C++ specification requirements, operator new and | ||
537 | +operator delete must always be of default visibility. | ||
538 | + | ||
539 | +An overview of these techniques, their benefits and how to use them | ||
540 | +is at @w{@uref{http://www.nedprod.com/programs/gccvisibility.html}}. | ||
541 | + | ||
542 | @end table | ||
543 | |||
544 | @c man end | ||
545 | |||
546 | diff -aur gcc-3.4.0orig/gcc/flags.h gcc-3.4.0/gcc/flags.h | ||
547 | --- gcc-3.4.0orig/gcc/flags.h 2004-02-18 00:09:04.000000000 +0000 | ||
548 | +++ gcc-3.4.0/gcc/flags.h 2004-05-09 08:10:53.000000000 +0100 | ||
549 | @@ -60,6 +60,30 @@ | ||
550 | /* Nonzero means emit debugging information only for symbols which are used. */ | ||
551 | extern int flag_debug_only_used_symbols; | ||
552 | |||
553 | +/* Enumerate visibility settings. */ | ||
554 | +#ifndef SYMBOL_VISIBILITY_DEFINED | ||
555 | +#define SYMBOL_VISIBILITY_DEFINED | ||
556 | +enum symbol_visibility | ||
557 | +{ | ||
558 | + VISIBILITY_DEFAULT, | ||
559 | + VISIBILITY_INTERNAL, | ||
560 | + VISIBILITY_HIDDEN, | ||
561 | + VISIBILITY_PROTECTED | ||
562 | +}; | ||
563 | +#endif | ||
564 | + | ||
565 | +/* The default visibility for all symbols (unless overridden). */ | ||
566 | +extern enum symbol_visibility default_visibility; | ||
567 | + | ||
568 | +struct visibility_flags | ||
569 | +{ | ||
570 | + unsigned inpragma : 1; /* True when in #pragma GCC visibility. */ | ||
571 | + unsigned inlineshidden : 1; /* True when -finlineshidden in effect. */ | ||
572 | +}; | ||
573 | + | ||
574 | +/* Global visibility options. */ | ||
575 | +extern struct visibility_flags visibility_options; | ||
576 | + | ||
577 | /* Nonzero means do optimizations. -opt. */ | ||
578 | |||
579 | extern int optimize; | ||
580 | |||
581 | diff -aur gcc-3.4.0orig/gcc/opts.c gcc-3.4.0/gcc/opts.c | ||
582 | --- gcc-3.4.0orig/gcc/opts.c 2004-02-18 00:09:04.000000000 +0000 | ||
583 | +++ gcc-3.4.0/gcc/opts.c 2004-05-09 08:10:53.000000000 +0100 | ||
584 | @@ -142,6 +142,12 @@ | ||
585 | write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */ | ||
586 | bool use_gnu_debug_info_extensions; | ||
587 | |||
588 | +/* The default visibility for all symbols (unless overridden) */ | ||
589 | +enum symbol_visibility default_visibility = VISIBILITY_DEFAULT; | ||
590 | + | ||
591 | +/* Global visibility options. */ | ||
592 | +struct visibility_flags visibility_options; | ||
593 | + | ||
594 | /* Columns of --help display. */ | ||
595 | static unsigned int columns = 80; | ||
596 | |||
597 | @@ -1440,6 +1446,21 @@ | ||
598 | flag_verbose_asm = value; | ||
599 | break; | ||
600 | |||
601 | + case OPT_fvisibility_: | ||
602 | + { | ||
603 | + if(!strcmp(arg, "default")) | ||
604 | + default_visibility=VISIBILITY_DEFAULT; | ||
605 | + else if(!strcmp(arg, "internal")) | ||
606 | + default_visibility=VISIBILITY_INTERNAL; | ||
607 | + else if(!strcmp(arg, "hidden")) | ||
608 | + default_visibility=VISIBILITY_HIDDEN; | ||
609 | + else if(!strcmp(arg, "protected")) | ||
610 | + default_visibility=VISIBILITY_PROTECTED; | ||
611 | + else | ||
612 | + error("unrecognised visibility value \"%s\"", arg); | ||
613 | + } | ||
614 | + break; | ||
615 | + | ||
616 | case OPT_fweb: | ||
617 | flag_web = value; | ||
618 | break; | ||
619 | |||
620 | diff -aur gcc-3.4.0orig/gcc/tree.c gcc-3.4.0/gcc/tree.c | ||
621 | --- gcc-3.4.0orig/gcc/tree.c 2004-02-05 22:01:35.000000000 +0000 | ||
622 | +++ gcc-3.4.0/gcc/tree.c 2004-05-10 15:22:52.000000000 +0100 | ||
623 | @@ -2563,6 +2563,11 @@ | ||
624 | layout_decl (t, 0); | ||
625 | else if (code == FUNCTION_DECL) | ||
626 | DECL_MODE (t) = FUNCTION_MODE; | ||
627 | + | ||
628 | + /* Set default visibility to whatever the user supplied with | ||
629 | + visibility_specified depending on #pragma GCC visibility. */ | ||
630 | + DECL_VISIBILITY (t) = default_visibility; | ||
631 | + DECL_VISIBILITYSPECIFIED (t) = visibility_options.inpragma; | ||
632 | |||
633 | return t; | ||
634 | } | ||
635 | |||
636 | diff -aur gcc-3.4.0orig/gcc/tree.h gcc-3.4.0/gcc/tree.h | ||
637 | --- gcc-3.4.0orig/gcc/tree.h 2004-02-08 01:52:43.000000000 +0000 | ||
638 | +++ gcc-3.4.0/gcc/tree.h 2004-05-09 08:10:54.000000000 +0100 | ||
639 | @@ -1499,6 +1499,10 @@ | ||
640 | /* Value of the decls's visibility attribute */ | ||
641 | #define DECL_VISIBILITY(NODE) (DECL_CHECK (NODE)->decl.visibility) | ||
642 | |||
643 | +/* Nonzero means that the decl had its visibility specified rather than | ||
644 | + being inferred. */ | ||
645 | +#define DECL_VISIBILITYSPECIFIED(NODE) (DECL_CHECK (NODE)->decl.visibility_specified) | ||
646 | + | ||
647 | /* In a FUNCTION_DECL, nonzero if the function cannot be inlined. */ | ||
648 | #define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.uninlinable) | ||
649 | |||
650 | @@ -1633,7 +1637,8 @@ | ||
651 | || TREE_CODE (DECL_CONTEXT (EXP)) == TRANSLATION_UNIT_DECL) | ||
652 | |||
653 | /* Enumerate visibility settings. */ | ||
654 | - | ||
655 | +#ifndef SYMBOL_VISIBILITY_DEFINED | ||
656 | +#define SYMBOL_VISIBILITY_DEFINED | ||
657 | enum symbol_visibility | ||
658 | { | ||
659 | VISIBILITY_DEFAULT, | ||
660 | @@ -1641,6 +1646,7 @@ | ||
661 | VISIBILITY_HIDDEN, | ||
662 | VISIBILITY_PROTECTED | ||
663 | }; | ||
664 | +#endif | ||
665 | |||
666 | struct function; | ||
667 | |||
668 | @@ -1684,8 +1690,7 @@ | ||
669 | unsigned thread_local_flag : 1; | ||
670 | unsigned declared_inline_flag : 1; | ||
671 | ENUM_BITFIELD(symbol_visibility) visibility : 2; | ||
672 | - unsigned unused : 1; | ||
673 | - /* one unused bit. */ | ||
674 | + unsigned visibility_specified : 1; | ||
675 | |||
676 | unsigned lang_flag_0 : 1; | ||
677 | unsigned lang_flag_1 : 1; | ||
678 | |||
679 | diff -aur gcc-3.4.0orig/gcc/varasm.c gcc-3.4.0/gcc/varasm.c | ||
680 | --- gcc-3.4.0orig/gcc/varasm.c 2004-04-14 22:14:08.000000000 +0100 | ||
681 | +++ gcc-3.4.0/gcc/varasm.c 2004-05-09 08:10:54.000000000 +0100 | ||
682 | @@ -5150,8 +5150,8 @@ | ||
683 | /* Static variables are always local. */ | ||
684 | else if (! TREE_PUBLIC (exp)) | ||
685 | local_p = true; | ||
686 | - /* A variable is local if the user tells us so. */ | ||
687 | - else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) | ||
688 | + /* A variable is local if the user explicitly tells us so. */ | ||
689 | + else if (DECL_VISIBILITYSPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) | ||
690 | local_p = true; | ||
691 | /* Otherwise, variables defined outside this object may not be local. */ | ||
692 | else if (DECL_EXTERNAL (exp)) | ||
693 | @@ -5159,6 +5159,9 @@ | ||
694 | /* Linkonce and weak data are never local. */ | ||
695 | else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp)) | ||
696 | local_p = false; | ||
697 | + /* If none of the above and visibility is not default, make local. */ | ||
698 | + else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) | ||
699 | + local_p = true; | ||
700 | /* If PIC, then assume that any global name can be overridden by | ||
701 | symbols resolved from other modules. */ | ||
702 | else if (shlib) | ||
703 | |||
704 | diff -Naur gcc-3.4.0orig/gcc/testsuite/gcc.dg/visibility-9.c gcc-3.4.0/gcc/testsuite/gcc.dg/visibility-9.c | ||
705 | --- gcc-3.4.0orig/gcc/testsuite/gcc.dg/visibility-9.c 1970-01-01 01:00:00.000000000 +0100 | ||
706 | +++ gcc-3.4.0/gcc/testsuite/gcc.dg/visibility-9.c 2004-05-09 12:40:39.000000000 +0100 | ||
707 | @@ -0,0 +1,9 @@ | ||
708 | +/* Test that -fvisibility works. */ | ||
709 | +/* { dg-do compile } */ | ||
710 | +/* { dg-require-visibility "" } */ | ||
711 | +/* { dg-options "-fvisibility=hidden" } */ | ||
712 | +/* { dg-final { scan-assembler "\\.hidden.*foo" } } */ | ||
713 | + | ||
714 | +void foo(); | ||
715 | + | ||
716 | +void foo() { } | ||
717 | diff -Naur gcc-3.4.0orig/gcc/testsuite/gcc.dg/visibility-a.c gcc-3.4.0/gcc/testsuite/gcc.dg/visibility-a.c | ||
718 | --- gcc-3.4.0orig/gcc/testsuite/gcc.dg/visibility-a.c 1970-01-01 01:00:00.000000000 +0100 | ||
719 | +++ gcc-3.4.0/gcc/testsuite/gcc.dg/visibility-a.c 2004-05-09 12:55:04.000000000 +0100 | ||
720 | @@ -0,0 +1,10 @@ | ||
721 | +/* Test that #pragma GCC visibility works. */ | ||
722 | +/* { dg-do compile } */ | ||
723 | +/* { dg-require-visibility "" } */ | ||
724 | +/* { dg-final { scan-assembler "\\.hidden.*foo" } } */ | ||
725 | + | ||
726 | +#pragma GCC visibility push(hidden) | ||
727 | +void foo(); | ||
728 | +#pragma GCC visibility pop | ||
729 | + | ||
730 | +void foo() { } | ||
731 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C | ||
732 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C 1970-01-01 01:00:00.000000000 +0100 | ||
733 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C 2004-05-09 19:17:13.000000000 +0100 | ||
734 | @@ -0,0 +1,12 @@ | ||
735 | +/* Test that -fvisibility affects class members. */ | ||
736 | +/* { dg-do compile } */ | ||
737 | +/* { dg-require-visibility "" } */ | ||
738 | +/* { dg-options "-fvisibility=hidden" } */ | ||
739 | +/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ | ||
740 | + | ||
741 | +class Foo | ||
742 | +{ | ||
743 | + void method(); | ||
744 | +}; | ||
745 | + | ||
746 | +void Foo::method() { } | ||
747 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C | ||
748 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C 1970-01-01 01:00:00.000000000 +0100 | ||
749 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C 2004-05-09 19:17:59.000000000 +0100 | ||
750 | @@ -0,0 +1,18 @@ | ||
751 | +/* Test that -fvisibility-inlines-hidden affects class members. */ | ||
752 | +/* { dg-do compile } */ | ||
753 | +/* { dg-require-visibility "" } */ | ||
754 | +/* { dg-options "-fvisibility-inlines-hidden" } */ | ||
755 | +/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ | ||
756 | + | ||
757 | +class Foo | ||
758 | +{ | ||
759 | +public: | ||
760 | + void method() { } | ||
761 | +}; | ||
762 | + | ||
763 | +int main(void) | ||
764 | +{ | ||
765 | + Foo f; | ||
766 | + f.method(); | ||
767 | + return 0; | ||
768 | +} | ||
769 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C | ||
770 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C 1970-01-01 01:00:00.000000000 +0100 | ||
771 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C 2004-05-09 19:18:06.000000000 +0100 | ||
772 | @@ -0,0 +1,12 @@ | ||
773 | +/* Test that -fvisibility does not override class member specific settings. */ | ||
774 | +/* { dg-do compile } */ | ||
775 | +/* { dg-require-visibility "" } */ | ||
776 | +/* { dg-options "-fvisibility=hidden" } */ | ||
777 | +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ | ||
778 | + | ||
779 | +class __attribute__ ((visibility ("internal"))) Foo | ||
780 | +{ | ||
781 | + void method(); | ||
782 | +}; | ||
783 | + | ||
784 | +void Foo::method() { } | ||
785 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C | ||
786 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C 1970-01-01 01:00:00.000000000 +0100 | ||
787 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C 2004-05-09 19:18:12.000000000 +0100 | ||
788 | @@ -0,0 +1,12 @@ | ||
789 | +/* Test that -fvisibility does not override class member specific settings. */ | ||
790 | +/* { dg-do compile } */ | ||
791 | +/* { dg-require-visibility "" } */ | ||
792 | +/* { dg-options "-fvisibility=hidden" } */ | ||
793 | +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ | ||
794 | + | ||
795 | +class Foo | ||
796 | +{ | ||
797 | + __attribute__ ((visibility ("internal"))) void method(); | ||
798 | +}; | ||
799 | + | ||
800 | +void Foo::method() { } | ||
801 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C | ||
802 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C 1970-01-01 01:00:00.000000000 +0100 | ||
803 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C 2004-05-09 19:18:19.000000000 +0100 | ||
804 | @@ -0,0 +1,11 @@ | ||
805 | +/* Test that setting visibility for class member functions works. */ | ||
806 | +/* { dg-do compile } */ | ||
807 | +/* { dg-require-visibility "" } */ | ||
808 | +/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ | ||
809 | + | ||
810 | +class __attribute__ ((visibility ("hidden"))) Foo | ||
811 | +{ | ||
812 | + void method(); | ||
813 | +}; | ||
814 | + | ||
815 | +void Foo::method() { } | ||
816 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/noPLT.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/noPLT.C | ||
817 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/noPLT.C 1970-01-01 01:00:00.000000000 +0100 | ||
818 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/noPLT.C 2004-05-09 19:21:49.000000000 +0100 | ||
819 | @@ -0,0 +1,20 @@ | ||
820 | +/* Test that -fvisibility=hidden prevents PLT. */ | ||
821 | +/* { dg-do compile } */ | ||
822 | +/* { dg-require-visibility "" } */ | ||
823 | +/* { dg-options "-fPIC -fvisibility=hidden" } */ | ||
824 | +/* { dg-final { scan-assembler-not "methodEv@PLT" } } */ | ||
825 | + | ||
826 | +class Foo | ||
827 | +{ | ||
828 | +public: | ||
829 | + void method(); | ||
830 | +}; | ||
831 | + | ||
832 | +void Foo::method() { } | ||
833 | + | ||
834 | +int main(void) | ||
835 | +{ | ||
836 | + Foo f; | ||
837 | + f.method(); | ||
838 | + return 0; | ||
839 | +} | ||
840 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma.C | ||
841 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma.C 1970-01-01 01:00:00.000000000 +0100 | ||
842 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma.C 2004-05-09 19:18:30.000000000 +0100 | ||
843 | @@ -0,0 +1,13 @@ | ||
844 | +/* Test that #pragma GCC visibility affects class members. */ | ||
845 | +/* { dg-do compile } */ | ||
846 | +/* { dg-require-visibility "" } */ | ||
847 | +/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ | ||
848 | + | ||
849 | +#pragma GCC visibility push(hidden) | ||
850 | +class Foo | ||
851 | +{ | ||
852 | + void method(); | ||
853 | +}; | ||
854 | +#pragma GCC visibility pop | ||
855 | + | ||
856 | +void Foo::method() { } | ||
857 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C | ||
858 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C 1970-01-01 01:00:00.000000000 +0100 | ||
859 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C 2004-05-09 19:18:36.000000000 +0100 | ||
860 | @@ -0,0 +1,13 @@ | ||
861 | +/* Test that #pragma GCC visibility does not override class member specific settings. */ | ||
862 | +/* { dg-do compile } */ | ||
863 | +/* { dg-require-visibility "" } */ | ||
864 | +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ | ||
865 | + | ||
866 | +#pragma GCC visibility push(hidden) | ||
867 | +class __attribute__ ((visibility ("internal"))) Foo | ||
868 | +{ | ||
869 | + void method(); | ||
870 | +}; | ||
871 | +#pragma GCC visibility pop | ||
872 | + | ||
873 | +void Foo::method() { } | ||
874 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C | ||
875 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C 1970-01-01 01:00:00.000000000 +0100 | ||
876 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C 2004-05-09 19:18:44.000000000 +0100 | ||
877 | @@ -0,0 +1,13 @@ | ||
878 | +/* Test that #pragma GCC visibility does not override class member specific settings. */ | ||
879 | +/* { dg-do compile } */ | ||
880 | +/* { dg-require-visibility "" } */ | ||
881 | +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ | ||
882 | + | ||
883 | +#pragma GCC visibility push(hidden) | ||
884 | +class Foo | ||
885 | +{ | ||
886 | + __attribute__ ((visibility ("internal"))) void method(); | ||
887 | +}; | ||
888 | +#pragma GCC visibility pop | ||
889 | + | ||
890 | +void Foo::method() { } | ||
891 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C | ||
892 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C 1970-01-01 01:00:00.000000000 +0100 | ||
893 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C 2004-05-09 19:18:50.000000000 +0100 | ||
894 | @@ -0,0 +1,11 @@ | ||
895 | +/* Test that setting visibility for static class member functions works. */ | ||
896 | +/* { dg-do compile } */ | ||
897 | +/* { dg-require-visibility "" } */ | ||
898 | +/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ | ||
899 | + | ||
900 | +class __attribute__ ((visibility ("hidden"))) Foo | ||
901 | +{ | ||
902 | + static void method(); | ||
903 | +}; | ||
904 | + | ||
905 | +void Foo::method() { } | ||
906 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/virtual.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/virtual.C | ||
907 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/virtual.C 1970-01-01 01:00:00.000000000 +0100 | ||
908 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/virtual.C 2004-05-09 13:24:06.000000000 +0100 | ||
909 | @@ -0,0 +1,11 @@ | ||
910 | +/* Test that setting visibility for class affects virtual table. */ | ||
911 | +/* { dg-do compile } */ | ||
912 | +/* { dg-require-visibility "" } */ | ||
913 | +/* { dg-final { scan-assembler "\\.hidden.*ZTV3Foo" } } */ | ||
914 | + | ||
915 | +class __attribute__ ((visibility ("hidden"))) Foo | ||
916 | +{ | ||
917 | + virtual void method(); | ||
918 | +}; | ||
919 | + | ||
920 | +void Foo::method() { } | ||
921 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C | ||
922 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C 1970-01-01 01:00:00.000000000 +0100 | ||
923 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C 2003-12-10 06:34:44.000000000 +0000 | ||
924 | @@ -0,0 +1,8 @@ | ||
925 | +/* Test visibility attribute on function definition. */ | ||
926 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
927 | +/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
928 | + | ||
929 | +void | ||
930 | +__attribute__((visibility ("hidden"))) | ||
931 | +foo() | ||
932 | +{ } | ||
933 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C | ||
934 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C 1970-01-01 01:00:00.000000000 +0100 | ||
935 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C 2003-12-10 06:34:44.000000000 +0000 | ||
936 | @@ -0,0 +1,7 @@ | ||
937 | +/* Test that visibility attribute on declaration extends to definition. */ | ||
938 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
939 | +/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
940 | + | ||
941 | +void __attribute__((visibility ("hidden"))) foo(); | ||
942 | + | ||
943 | +void foo() { } | ||
944 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C | ||
945 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C 1970-01-01 01:00:00.000000000 +0100 | ||
946 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C 2003-12-10 06:34:45.000000000 +0000 | ||
947 | @@ -0,0 +1,7 @@ | ||
948 | +/* Test visibility attribute on forward declaration of global variable */ | ||
949 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
950 | +/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
951 | + | ||
952 | +int | ||
953 | +__attribute__((visibility ("hidden"))) | ||
954 | +xyzzy = 5; | ||
955 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C | ||
956 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C 1970-01-01 01:00:00.000000000 +0100 | ||
957 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C 2003-12-10 06:34:45.000000000 +0000 | ||
958 | @@ -0,0 +1,8 @@ | ||
959 | +/* Test visibility attribute on forward declaration of global variable */ | ||
960 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
961 | +/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
962 | + | ||
963 | +extern int __attribute__ ((visibility ("hidden"))) | ||
964 | +xyzzy; | ||
965 | + | ||
966 | +int xyzzy = 5; | ||
967 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C | ||
968 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C 1970-01-01 01:00:00.000000000 +0100 | ||
969 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C 2003-12-10 06:34:45.000000000 +0000 | ||
970 | @@ -0,0 +1,11 @@ | ||
971 | +/* Test visibility attribute on definition of a function that has | ||
972 | + already had a forward declaration. */ | ||
973 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
974 | +/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
975 | + | ||
976 | +void foo(); | ||
977 | + | ||
978 | +void | ||
979 | + __attribute__((visibility ("hidden"))) | ||
980 | +foo() | ||
981 | +{ } | ||
982 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C | ||
983 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C 1970-01-01 01:00:00.000000000 +0100 | ||
984 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C 2003-12-10 06:34:45.000000000 +0000 | ||
985 | @@ -0,0 +1,10 @@ | ||
986 | +/* Test visibility attribute on definition of global variable that has | ||
987 | + already had a forward declaration. */ | ||
988 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
989 | +/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
990 | + | ||
991 | +extern int xyzzy; | ||
992 | + | ||
993 | +int | ||
994 | +__attribute__((visibility ("hidden"))) | ||
995 | +xyzzy = 5; | ||
996 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C | ||
997 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C 1970-01-01 01:00:00.000000000 +0100 | ||
998 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C 2003-12-10 06:34:45.000000000 +0000 | ||
999 | @@ -0,0 +1,11 @@ | ||
1000 | +/* Test warning from conflicting visibility specifications. */ | ||
1001 | +/* { dg-do compile { target *86-*-linux* } } */ | ||
1002 | +/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
1003 | + | ||
1004 | +extern int | ||
1005 | +__attribute__((visibility ("hidden"))) | ||
1006 | +xyzzy; /* { dg-warning "previous declaration here" "" } */ | ||
1007 | + | ||
1008 | +int | ||
1009 | +__attribute__((visibility ("protected"))) | ||
1010 | +xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */ | ||
1011 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-1.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-1.C | ||
1012 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-1.C 2003-12-10 06:34:44.000000000 +0000 | ||
1013 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-1.C 1970-01-01 01:00:00.000000000 +0100 | ||
1014 | @@ -1,8 +0,0 @@ | ||
1015 | -/* Test visibility attribute on function definition. */ | ||
1016 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1017 | -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
1018 | - | ||
1019 | -void | ||
1020 | -__attribute__((visibility ("hidden"))) | ||
1021 | -foo() | ||
1022 | -{ } | ||
1023 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-2.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-2.C | ||
1024 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-2.C 2003-12-10 06:34:44.000000000 +0000 | ||
1025 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-2.C 1970-01-01 01:00:00.000000000 +0100 | ||
1026 | @@ -1,7 +0,0 @@ | ||
1027 | -/* Test that visibility attribute on declaration extends to definition. */ | ||
1028 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1029 | -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
1030 | - | ||
1031 | -void __attribute__((visibility ("hidden"))) foo(); | ||
1032 | - | ||
1033 | -void foo() { } | ||
1034 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-3.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-3.C | ||
1035 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-3.C 2003-12-10 06:34:45.000000000 +0000 | ||
1036 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-3.C 1970-01-01 01:00:00.000000000 +0100 | ||
1037 | @@ -1,7 +0,0 @@ | ||
1038 | -/* Test visibility attribute on forward declaration of global variable */ | ||
1039 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1040 | -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
1041 | - | ||
1042 | -int | ||
1043 | -__attribute__((visibility ("hidden"))) | ||
1044 | -xyzzy = 5; | ||
1045 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-4.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-4.C | ||
1046 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-4.C 2003-12-10 06:34:45.000000000 +0000 | ||
1047 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-4.C 1970-01-01 01:00:00.000000000 +0100 | ||
1048 | @@ -1,8 +0,0 @@ | ||
1049 | -/* Test visibility attribute on forward declaration of global variable */ | ||
1050 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1051 | -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
1052 | - | ||
1053 | -extern int __attribute__ ((visibility ("hidden"))) | ||
1054 | -xyzzy; | ||
1055 | - | ||
1056 | -int xyzzy = 5; | ||
1057 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-5.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-5.C | ||
1058 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-5.C 2003-12-10 06:34:45.000000000 +0000 | ||
1059 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-5.C 1970-01-01 01:00:00.000000000 +0100 | ||
1060 | @@ -1,11 +0,0 @@ | ||
1061 | -/* Test visibility attribute on definition of a function that has | ||
1062 | - already had a forward declaration. */ | ||
1063 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1064 | -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ | ||
1065 | - | ||
1066 | -void foo(); | ||
1067 | - | ||
1068 | -void | ||
1069 | - __attribute__((visibility ("hidden"))) | ||
1070 | -foo() | ||
1071 | -{ } | ||
1072 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-6.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-6.C | ||
1073 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-6.C 2003-12-10 06:34:45.000000000 +0000 | ||
1074 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-6.C 1970-01-01 01:00:00.000000000 +0100 | ||
1075 | @@ -1,10 +0,0 @@ | ||
1076 | -/* Test visibility attribute on definition of global variable that has | ||
1077 | - already had a forward declaration. */ | ||
1078 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1079 | -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
1080 | - | ||
1081 | -extern int xyzzy; | ||
1082 | - | ||
1083 | -int | ||
1084 | -__attribute__((visibility ("hidden"))) | ||
1085 | -xyzzy = 5; | ||
1086 | diff -Naur gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-7.C gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-7.C | ||
1087 | --- gcc-3.4.0orig/gcc/testsuite/g++.dg/ext/visibility-7.C 2003-12-10 06:34:45.000000000 +0000 | ||
1088 | +++ gcc-3.4.0/gcc/testsuite/g++.dg/ext/visibility-7.C 1970-01-01 01:00:00.000000000 +0100 | ||
1089 | @@ -1,11 +0,0 @@ | ||
1090 | -/* Test warning from conflicting visibility specifications. */ | ||
1091 | -/* { dg-do compile { target *86-*-linux* } } */ | ||
1092 | -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ | ||
1093 | - | ||
1094 | -extern int | ||
1095 | -__attribute__((visibility ("hidden"))) | ||
1096 | -xyzzy; /* { dg-warning "previous declaration here" "" } */ | ||
1097 | - | ||
1098 | -int | ||
1099 | -__attribute__((visibility ("protected"))) | ||
1100 | -xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */ | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/always-fixincperm.patch b/meta/packages/gcc/gcc-3.4.3/always-fixincperm.patch deleted file mode 100644 index 59e5e2edeb..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/always-fixincperm.patch +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | Index: gcc-3.4.3/gcc/configure | ||
2 | =================================================================== | ||
3 | --- gcc-3.4.3.orig/gcc/configure 2004-11-04 23:14:05.000000000 -0500 | ||
4 | +++ gcc-3.4.3/gcc/configure 2005-03-11 14:41:06.373910320 -0500 | ||
5 | @@ -9916,11 +9916,6 @@ | ||
6 | BUILD_PREFIX=build- | ||
7 | BUILD_PREFIX_1=build- | ||
8 | BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)' | ||
9 | - | ||
10 | - if test "x$TARGET_SYSTEM_ROOT" = x; then | ||
11 | - STMP_FIXINC= | ||
12 | - STMP_FIXPROTO= | ||
13 | - fi | ||
14 | fi | ||
15 | |||
16 | # Expand extra_headers to include complete path. | ||
17 | Index: gcc-3.4.3/gcc/configure.ac | ||
18 | =================================================================== | ||
19 | --- gcc-3.4.3.orig/gcc/configure.ac 2004-09-23 20:43:53.000000000 -0400 | ||
20 | +++ gcc-3.4.3/gcc/configure.ac 2005-03-11 14:40:55.256600408 -0500 | ||
21 | @@ -1524,11 +1524,6 @@ | ||
22 | BUILD_PREFIX=build- | ||
23 | BUILD_PREFIX_1=build- | ||
24 | BUILD_CFLAGS='$(INTERNAL_CFLAGS) $(T_CFLAGS) $(CFLAGS_FOR_BUILD)' | ||
25 | - | ||
26 | - if test "x$TARGET_SYSTEM_ROOT" = x; then | ||
27 | - STMP_FIXINC= | ||
28 | - STMP_FIXPROTO= | ||
29 | - fi | ||
30 | fi | ||
31 | |||
32 | # Expand extra_headers to include complete path. | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian-uclibc.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian-uclibc.patch deleted file mode 100644 index 8fa9af880a..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian-uclibc.patch +++ /dev/null | |||
@@ -1,30 +0,0 @@ | |||
1 | |||
2 | # | ||
3 | # Patch managed by http://www.holgerschurig.de/patcher.html | ||
4 | # | ||
5 | |||
6 | --- gcc-3.4.1/gcc/config.gcc~gcc-3.4.0-arm-bigendian-uclibc | ||
7 | +++ gcc-3.4.1/gcc/config.gcc | ||
8 | @@ -666,6 +666,11 @@ | ||
9 | ;; | ||
10 | arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc | ||
11 | tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" | ||
12 | + case $target in | ||
13 | + arm*b-*) | ||
14 | + tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" | ||
15 | + ;; | ||
16 | + esac | ||
17 | tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" | ||
18 | extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" | ||
19 | gnu_ld=yes | ||
20 | --- gcc-3.4.1/gcc/config/arm/linux-elf.h~gcc-3.4.0-arm-bigendian-uclibc | ||
21 | +++ gcc-3.4.1/gcc/config/arm/linux-elf.h | ||
22 | @@ -120,7 +120,7 @@ | ||
23 | %{rdynamic:-export-dynamic} \ | ||
24 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ | ||
25 | -X \ | ||
26 | - %{mbig-endian:-EB}" \ | ||
27 | + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ | ||
28 | SUBTARGET_EXTRA_LINK_SPEC | ||
29 | #endif | ||
30 | |||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian.patch deleted file mode 100644 index c9288c6c15..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-bigendian.patch +++ /dev/null | |||
@@ -1,70 +0,0 @@ | |||
1 | By Lennert Buytenhek <buytenh@wantstofly.org> | ||
2 | Adds support for arm*b-linux* big-endian ARM targets | ||
3 | |||
4 | See http://gcc.gnu.org/PR16350 | ||
5 | |||
6 | diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h | ||
7 | --- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 | ||
8 | +++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 | ||
9 | @@ -30,17 +30,34 @@ | ||
10 | /* Do not assume anything about header files. */ | ||
11 | #define NO_IMPLICIT_EXTERN_C | ||
12 | |||
13 | +/* | ||
14 | + * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* | ||
15 | + * (big endian) configurations. | ||
16 | + */ | ||
17 | +#if TARGET_BIG_ENDIAN_DEFAULT | ||
18 | +#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END | ||
19 | +#define TARGET_ENDIAN_OPTION "mbig-endian" | ||
20 | +#define TARGET_LINKER_EMULATION "armelfb_linux" | ||
21 | +#else | ||
22 | +#define TARGET_ENDIAN_DEFAULT 0 | ||
23 | +#define TARGET_ENDIAN_OPTION "mlittle-endian" | ||
24 | +#define TARGET_LINKER_EMULATION "armelf_linux" | ||
25 | +#endif | ||
26 | + | ||
27 | /* Default is to use APCS-32 mode. */ | ||
28 | #undef TARGET_DEFAULT | ||
29 | -#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) | ||
30 | +#define TARGET_DEFAULT \ | ||
31 | + ( ARM_FLAG_APCS_32 | \ | ||
32 | + ARM_FLAG_MMU_TRAPS | \ | ||
33 | + TARGET_ENDIAN_DEFAULT ) | ||
34 | |||
35 | #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 | ||
36 | |||
37 | -#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" | ||
38 | +#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" | ||
39 | |||
40 | #undef MULTILIB_DEFAULTS | ||
41 | #define MULTILIB_DEFAULTS \ | ||
42 | - { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } | ||
43 | + { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } | ||
44 | |||
45 | #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" | ||
46 | |||
47 | @@ -89,7 +106,7 @@ | ||
48 | %{rdynamic:-export-dynamic} \ | ||
49 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ | ||
50 | -X \ | ||
51 | - %{mbig-endian:-EB}" \ | ||
52 | + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ | ||
53 | SUBTARGET_EXTRA_LINK_SPEC | ||
54 | |||
55 | #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() | ||
56 | diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc | ||
57 | --- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 | ||
58 | +++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 | ||
59 | @@ -666,6 +666,11 @@ | ||
60 | ;; | ||
61 | arm*-*-linux*) # ARM GNU/Linux with ELF | ||
62 | tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" | ||
63 | + case $target in | ||
64 | + arm*b-*) | ||
65 | + tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" | ||
66 | + ;; | ||
67 | + esac | ||
68 | tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" | ||
69 | extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" | ||
70 | gnu_ld=yes | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-lib1asm.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-lib1asm.patch deleted file mode 100644 index ca42bfbc0a..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-lib1asm.patch +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | # Fixes errors like the following when building glibc (or any other executable | ||
2 | # or shared library) when using gcc 3.4.0 for ARM with softfloat: | ||
3 | # | ||
4 | # .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' | ||
5 | # .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' | ||
6 | # .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' | ||
7 | # .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' | ||
8 | # .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' | ||
9 | |||
10 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux | ||
11 | --- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 | ||
12 | +++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 | ||
13 | @@ -4,7 +4,10 @@ | ||
14 | LIBGCC2_DEBUG_CFLAGS = -g0 | ||
15 | |||
16 | LIB1ASMSRC = arm/lib1funcs.asm | ||
17 | -LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx | ||
18 | +LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ | ||
19 | + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ | ||
20 | + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ | ||
21 | + _fixsfsi _fixunssfsi | ||
22 | |||
23 | # MULTILIB_OPTIONS = mhard-float/msoft-float | ||
24 | # MULTILIB_DIRNAMES = hard-float soft-float | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-nolibfloat.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-nolibfloat.patch deleted file mode 100644 index 43eed3ef28..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-nolibfloat.patch +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | # Dimitry Andric <dimitry@andric.com>, 2004-05-01 | ||
2 | # | ||
3 | # * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed | ||
4 | # anymore. (The required functions are now in libgcc.) | ||
5 | # | ||
6 | # Fixes errors like | ||
7 | # arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat | ||
8 | # collect2: ld returned 1 exit status | ||
9 | # make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 | ||
10 | # when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat | ||
11 | |||
12 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h | ||
13 | --- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 | ||
14 | +++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 | ||
15 | @@ -55,7 +73,7 @@ | ||
16 | %{shared:-lc} \ | ||
17 | %{!shared:%{profile:-lc_p}%{!profile:-lc}}" | ||
18 | |||
19 | -#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" | ||
20 | +#define LIBGCC_SPEC "-lgcc" | ||
21 | |||
22 | /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add | ||
23 | the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | ||
24 | |||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-softfloat.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-softfloat.patch deleted file mode 100644 index f53d64b374..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.0-arm-softfloat.patch +++ /dev/null | |||
@@ -1,256 +0,0 @@ | |||
1 | # | ||
2 | # Submitted: | ||
3 | # | ||
4 | # Dimitry Andric <dimitry@andric.com>, 2004-05-01 | ||
5 | # | ||
6 | # Description: | ||
7 | # | ||
8 | # Nicholas Pitre released this patch for gcc soft-float support here: | ||
9 | # http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html | ||
10 | # | ||
11 | # This version has been adapted to work with gcc 3.4.0. | ||
12 | # | ||
13 | # The original patch doesn't distinguish between softfpa and softvfp modes | ||
14 | # in the way Nicholas Pitre probably meant. His description is: | ||
15 | # | ||
16 | # "Default is to use APCS-32 mode with soft-vfp. The old Linux default for | ||
17 | # floats can be achieved with -mhard-float or with the configure | ||
18 | # --with-float=hard option. If -msoft-float or --with-float=soft is used then | ||
19 | # software float support will be used just like the default but with the legacy | ||
20 | # big endian word ordering for double float representation instead." | ||
21 | # | ||
22 | # Which means the following: | ||
23 | # | ||
24 | # * If you compile without -mhard-float or -msoft-float, you should get | ||
25 | # software floating point, using the VFP format. The produced object file | ||
26 | # should have these flags in its header: | ||
27 | # | ||
28 | # private flags = 600: [APCS-32] [VFP float format] [software FP] | ||
29 | # | ||
30 | # * If you compile with -mhard-float, you should get hardware floating point, | ||
31 | # which always uses the FPA format. Object file header flags should be: | ||
32 | # | ||
33 | # private flags = 0: [APCS-32] [FPA float format] | ||
34 | # | ||
35 | # * If you compile with -msoft-float, you should get software floating point, | ||
36 | # using the FPA format. This is done for compatibility reasons with many | ||
37 | # existing distributions. Object file header flags should be: | ||
38 | # | ||
39 | # private flags = 200: [APCS-32] [FPA float format] [software FP] | ||
40 | # | ||
41 | # The original patch from Nicholas Pitre contained the following constructs: | ||
42 | # | ||
43 | # #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ | ||
44 | # %{mhard-float:-mfpu=fpa} \ | ||
45 | # %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" | ||
46 | # | ||
47 | # However, gcc doesn't accept this ";:" notation, used in the 3rd line. This | ||
48 | # is probably the reason Robert Schwebel modified it to: | ||
49 | # | ||
50 | # #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ | ||
51 | # %{mhard-float:-mfpu=fpa} \ | ||
52 | # %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" | ||
53 | # | ||
54 | # But this causes the following behaviour: | ||
55 | # | ||
56 | # * If you compile without -mhard-float or -msoft-float, the compiler generates | ||
57 | # software floating point instructions, but *nothing* is passed to the | ||
58 | # assembler, which results in an object file which has flags: | ||
59 | # | ||
60 | # private flags = 0: [APCS-32] [FPA float format] | ||
61 | # | ||
62 | # This is not correct! | ||
63 | # | ||
64 | # * If you compile with -mhard-float, the compiler generates hardware floating | ||
65 | # point instructions, and passes "-mfpu=fpa" to the assembler, which results | ||
66 | # in an object file which has the same flags as in the previous item, but now | ||
67 | # those *are* correct. | ||
68 | # | ||
69 | # * If you compile with -msoft-float, the compiler generates software floating | ||
70 | # point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that | ||
71 | # order) to the assembler, which results in an object file with flags: | ||
72 | # | ||
73 | # private flags = 600: [APCS-32] [VFP float format] [software FP] | ||
74 | # | ||
75 | # This is not correct, because the last "-mfpu=" option on the assembler | ||
76 | # command line determines the actual FPU convention used (which should be FPA | ||
77 | # in this case). | ||
78 | # | ||
79 | # Therefore, I modified this patch to get the desired behaviour. Every | ||
80 | # instance of the notation: | ||
81 | # | ||
82 | # %{msoft-float:-mfpu=softfpa -mfpu=softvfp} | ||
83 | # | ||
84 | # was changed to: | ||
85 | # | ||
86 | # %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} | ||
87 | # | ||
88 | # I also did the following: | ||
89 | # | ||
90 | # * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to | ||
91 | # be consistent with Nicholas' original patch. | ||
92 | # * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS | ||
93 | # macros I could find. I think that if you compile without any options, you | ||
94 | # would like to get the defaults. :) | ||
95 | # * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed | ||
96 | # anymore. (The required functions are now in libgcc.) | ||
97 | |||
98 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/coff.h gcc-3.4.0/gcc/config/arm/coff.h | ||
99 | --- gcc-3.4.0-orig/gcc/config/arm/coff.h 2004-02-24 15:25:22.000000000 +0100 | ||
100 | +++ gcc-3.4.0/gcc/config/arm/coff.h 2004-05-01 19:07:06.059409600 +0200 | ||
101 | @@ -31,11 +31,16 @@ | ||
102 | #define TARGET_VERSION fputs (" (ARM/coff)", stderr) | ||
103 | |||
104 | #undef TARGET_DEFAULT | ||
105 | -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) | ||
106 | +#define TARGET_DEFAULT \ | ||
107 | + ( ARM_FLAG_SOFT_FLOAT \ | ||
108 | + | ARM_FLAG_VFP \ | ||
109 | + | ARM_FLAG_APCS_32 \ | ||
110 | + | ARM_FLAG_APCS_FRAME \ | ||
111 | + | ARM_FLAG_MMU_TRAPS ) | ||
112 | |||
113 | #ifndef MULTILIB_DEFAULTS | ||
114 | #define MULTILIB_DEFAULTS \ | ||
115 | - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } | ||
116 | + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } | ||
117 | #endif | ||
118 | |||
119 | /* This is COFF, but prefer stabs. */ | ||
120 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/elf.h gcc-3.4.0/gcc/config/arm/elf.h | ||
121 | --- gcc-3.4.0-orig/gcc/config/arm/elf.h 2004-02-24 15:25:22.000000000 +0100 | ||
122 | +++ gcc-3.4.0/gcc/config/arm/elf.h 2004-05-01 19:12:16.976486400 +0200 | ||
123 | @@ -46,7 +46,9 @@ | ||
124 | |||
125 | #ifndef SUBTARGET_ASM_FLOAT_SPEC | ||
126 | #define SUBTARGET_ASM_FLOAT_SPEC "\ | ||
127 | -%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" | ||
128 | +%{mapcs-float:-mfloat} \ | ||
129 | +%{mhard-float:-mfpu=fpa} \ | ||
130 | +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" | ||
131 | #endif | ||
132 | |||
133 | #ifndef ASM_SPEC | ||
134 | @@ -106,12 +108,17 @@ | ||
135 | #endif | ||
136 | |||
137 | #ifndef TARGET_DEFAULT | ||
138 | -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) | ||
139 | +#define TARGET_DEFAULT \ | ||
140 | + ( ARM_FLAG_SOFT_FLOAT \ | ||
141 | + | ARM_FLAG_VFP \ | ||
142 | + | ARM_FLAG_APCS_32 \ | ||
143 | + | ARM_FLAG_APCS_FRAME \ | ||
144 | + | ARM_FLAG_MMU_TRAPS ) | ||
145 | #endif | ||
146 | |||
147 | #ifndef MULTILIB_DEFAULTS | ||
148 | #define MULTILIB_DEFAULTS \ | ||
149 | - { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } | ||
150 | + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } | ||
151 | #endif | ||
152 | |||
153 | #define TARGET_ASM_FILE_START_APP_OFF true | ||
154 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h | ||
155 | --- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 | ||
156 | +++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 | ||
157 | @@ -30,9 +30,27 @@ | ||
158 | /* Do not assume anything about header files. */ | ||
159 | #define NO_IMPLICIT_EXTERN_C | ||
160 | |||
161 | -/* Default is to use APCS-32 mode. */ | ||
162 | +/* | ||
163 | + * Default is to use APCS-32 mode with soft-vfp. | ||
164 | + * The old Linux default for floats can be achieved with -mhard-float | ||
165 | + * or with the configure --with-float=hard option. | ||
166 | + * If -msoft-float or --with-float=soft is used then software float | ||
167 | + * support will be used just like the default but with the legacy | ||
168 | + * big endian word ordering for double float representation instead. | ||
169 | + */ | ||
170 | + | ||
171 | #undef TARGET_DEFAULT | ||
172 | -#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) | ||
173 | +#define TARGET_DEFAULT \ | ||
174 | + ( ARM_FLAG_APCS_32 \ | ||
175 | + | ARM_FLAG_SOFT_FLOAT \ | ||
176 | + | ARM_FLAG_VFP \ | ||
177 | + | ARM_FLAG_MMU_TRAPS ) | ||
178 | + | ||
179 | +#undef SUBTARGET_EXTRA_ASM_SPEC | ||
180 | +#define SUBTARGET_EXTRA_ASM_SPEC "\ | ||
181 | +%{!mcpu=*:-mcpu=xscale} \ | ||
182 | +%{mhard-float:-mfpu=fpa} \ | ||
183 | +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" | ||
184 | |||
185 | #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 | ||
186 | |||
187 | @@ -40,7 +58,7 @@ | ||
188 | |||
189 | #undef MULTILIB_DEFAULTS | ||
190 | #define MULTILIB_DEFAULTS \ | ||
191 | - { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } | ||
192 | + { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } | ||
193 | |||
194 | #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" | ||
195 | |||
196 | @@ -55,7 +73,7 @@ | ||
197 | %{shared:-lc} \ | ||
198 | %{!shared:%{profile:-lc_p}%{!profile:-lc}}" | ||
199 | |||
200 | -#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" | ||
201 | +#define LIBGCC_SPEC "-lgcc" | ||
202 | |||
203 | /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add | ||
204 | the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | ||
205 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux | ||
206 | --- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 | ||
207 | +++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 | ||
208 | @@ -4,7 +4,10 @@ | ||
209 | LIBGCC2_DEBUG_CFLAGS = -g0 | ||
210 | |||
211 | LIB1ASMSRC = arm/lib1funcs.asm | ||
212 | -LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx | ||
213 | +LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ | ||
214 | + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ | ||
215 | + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ | ||
216 | + _fixsfsi _fixunssfsi | ||
217 | |||
218 | # MULTILIB_OPTIONS = mhard-float/msoft-float | ||
219 | # MULTILIB_DIRNAMES = hard-float soft-float | ||
220 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h gcc-3.4.0/gcc/config/arm/unknown-elf.h | ||
221 | --- gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h 2004-02-24 15:25:22.000000000 +0100 | ||
222 | +++ gcc-3.4.0/gcc/config/arm/unknown-elf.h 2004-05-01 19:09:09.016212800 +0200 | ||
223 | @@ -30,7 +30,12 @@ | ||
224 | |||
225 | /* Default to using APCS-32 and software floating point. */ | ||
226 | #ifndef TARGET_DEFAULT | ||
227 | -#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) | ||
228 | +#define TARGET_DEFAULT \ | ||
229 | + ( ARM_FLAG_SOFT_FLOAT \ | ||
230 | + | ARM_FLAG_VFP \ | ||
231 | + | ARM_FLAG_APCS_32 \ | ||
232 | + | ARM_FLAG_APCS_FRAME \ | ||
233 | + | ARM_FLAG_MMU_TRAPS ) | ||
234 | #endif | ||
235 | |||
236 | /* Now we define the strings used to build the spec file. */ | ||
237 | diff -urNd gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h gcc-3.4.0/gcc/config/arm/xscale-elf.h | ||
238 | --- gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h 2003-07-02 01:26:43.000000000 +0200 | ||
239 | +++ gcc-3.4.0/gcc/config/arm/xscale-elf.h 2004-05-01 20:15:36.620105600 +0200 | ||
240 | @@ -49,11 +49,12 @@ | ||
241 | endian, regardless of the endian-ness of the memory | ||
242 | system. */ | ||
243 | |||
244 | -#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ | ||
245 | - %{mhard-float:-mfpu=fpa} \ | ||
246 | - %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" | ||
247 | +#define SUBTARGET_EXTRA_ASM_SPEC "\ | ||
248 | +%{!mcpu=*:-mcpu=xscale} \ | ||
249 | +%{mhard-float:-mfpu=fpa} \ | ||
250 | +%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" | ||
251 | |||
252 | #ifndef MULTILIB_DEFAULTS | ||
253 | #define MULTILIB_DEFAULTS \ | ||
254 | - { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } | ||
255 | + { "mlittle-endian", "mno-thumb-interwork", "marm" } | ||
256 | #endif | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-100-conf.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-100-conf.patch deleted file mode 100644 index 29e4c802e2..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-100-conf.patch +++ /dev/null | |||
@@ -1,442 +0,0 @@ | |||
1 | diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure | ||
2 | --- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 | ||
3 | +++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 | ||
4 | @@ -1947,6 +1947,11 @@ | ||
5 | lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` | ||
6 | ;; | ||
7 | |||
8 | +linux-uclibc*) | ||
9 | + lt_cv_deplibs_check_method=pass_all | ||
10 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
11 | + ;; | ||
12 | + | ||
13 | netbsd*) | ||
14 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
15 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
16 | diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig | ||
17 | --- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 | ||
18 | +++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 | ||
19 | @@ -1981,6 +1981,23 @@ | ||
20 | fi | ||
21 | ;; | ||
22 | |||
23 | +linux-uclibc*) | ||
24 | + version_type=linux | ||
25 | + need_lib_prefix=no | ||
26 | + need_version=no | ||
27 | + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' | ||
28 | + soname_spec='${libname}${release}.so$major' | ||
29 | + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' | ||
30 | + shlibpath_var=LD_LIBRARY_PATH | ||
31 | + shlibpath_overrides_runpath=no | ||
32 | + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' | ||
33 | + file_magic_cmd=/usr/bin/file | ||
34 | + file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
35 | + | ||
36 | + # Assume using the uClibc dynamic linker. | ||
37 | + dynamic_linker="uClibc ld.so" | ||
38 | + ;; | ||
39 | + | ||
40 | netbsd*) | ||
41 | version_type=sunos | ||
42 | if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then | ||
43 | diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h | ||
44 | --- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 | ||
45 | +++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 | ||
46 | @@ -81,6 +81,18 @@ | ||
47 | "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" | ||
48 | |||
49 | #undef LINK_SPEC | ||
50 | +#ifdef USE_UCLIBC | ||
51 | +#define LINK_SPEC "%{h*} %{version:-v} \ | ||
52 | + %{b} %{Wl,*:%*} \ | ||
53 | + %{static:-Bstatic} \ | ||
54 | + %{shared:-shared} \ | ||
55 | + %{symbolic:-Bsymbolic} \ | ||
56 | + %{rdynamic:-export-dynamic} \ | ||
57 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ | ||
58 | + -X \ | ||
59 | + %{mbig-endian:-EB}" \ | ||
60 | + SUBTARGET_EXTRA_LINK_SPEC | ||
61 | +#else | ||
62 | #define LINK_SPEC "%{h*} %{version:-v} \ | ||
63 | %{b} %{Wl,*:%*} \ | ||
64 | %{static:-Bstatic} \ | ||
65 | @@ -91,6 +103,7 @@ | ||
66 | -X \ | ||
67 | %{mbig-endian:-EB}" \ | ||
68 | SUBTARGET_EXTRA_LINK_SPEC | ||
69 | +#endif | ||
70 | |||
71 | #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() | ||
72 | |||
73 | diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h | ||
74 | --- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 | ||
75 | +++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 | ||
76 | @@ -79,6 +79,25 @@ | ||
77 | #undef CRIS_DEFAULT_CPU_VERSION | ||
78 | #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG | ||
79 | |||
80 | +#ifdef USE_UCLIBC | ||
81 | + | ||
82 | +#undef CRIS_SUBTARGET_VERSION | ||
83 | +#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" | ||
84 | + | ||
85 | +#undef CRIS_LINK_SUBTARGET_SPEC | ||
86 | +#define CRIS_LINK_SUBTARGET_SPEC \ | ||
87 | + "-mcrislinux\ | ||
88 | + -rpath-link include/asm/../..%s\ | ||
89 | + %{shared} %{static}\ | ||
90 | + %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ | ||
91 | + %{!shared: \ | ||
92 | + %{!static: \ | ||
93 | + %{rdynamic:-export-dynamic} \ | ||
94 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ | ||
95 | + %{!r:%{O2|O3: --gc-sections}}" | ||
96 | + | ||
97 | +#else /* USE_UCLIBC */ | ||
98 | + | ||
99 | #undef CRIS_SUBTARGET_VERSION | ||
100 | #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" | ||
101 | |||
102 | @@ -93,6 +112,8 @@ | ||
103 | %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ | ||
104 | %{!r:%{O2|O3: --gc-sections}}" | ||
105 | |||
106 | +#endif /* USE_UCLIBC */ | ||
107 | + | ||
108 | |||
109 | /* Node: Run-time Target */ | ||
110 | |||
111 | diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc | ||
112 | --- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 | ||
113 | +++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 | ||
114 | @@ -0,0 +1,3 @@ | ||
115 | +T_CFLAGS = -DUSE_UCLIBC | ||
116 | +TARGET_LIBGCC2_CFLAGS += -fPIC | ||
117 | +CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) | ||
118 | diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h | ||
119 | --- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 | ||
120 | +++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 | ||
121 | @@ -118,6 +118,15 @@ | ||
122 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ | ||
123 | %{static:-static}}}" | ||
124 | #else | ||
125 | +#if defined USE_UCLIBC | ||
126 | +#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ | ||
127 | + %{!shared: \ | ||
128 | + %{!ibcs: \ | ||
129 | + %{!static: \ | ||
130 | + %{rdynamic:-export-dynamic} \ | ||
131 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ | ||
132 | + %{static:-static}}}" | ||
133 | +#else | ||
134 | #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ | ||
135 | %{!shared: \ | ||
136 | %{!ibcs: \ | ||
137 | @@ -126,6 +135,7 @@ | ||
138 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
139 | %{static:-static}}}" | ||
140 | #endif | ||
141 | +#endif | ||
142 | |||
143 | /* A C statement (sans semicolon) to output to the stdio stream | ||
144 | FILE the assembler definition of uninitialized global DECL named | ||
145 | diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h | ||
146 | --- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 | ||
147 | +++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 | ||
148 | @@ -109,6 +109,17 @@ | ||
149 | |||
150 | /* Borrowed from sparc/linux.h */ | ||
151 | #undef LINK_SPEC | ||
152 | +#ifdef USE_UCLIBC | ||
153 | +#define LINK_SPEC \ | ||
154 | + "%(endian_spec) \ | ||
155 | + %{shared:-shared} \ | ||
156 | + %{!shared: \ | ||
157 | + %{!ibcs: \ | ||
158 | + %{!static: \ | ||
159 | + %{rdynamic:-export-dynamic} \ | ||
160 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ | ||
161 | + %{static:-static}}}" | ||
162 | +#else | ||
163 | #define LINK_SPEC \ | ||
164 | "%(endian_spec) \ | ||
165 | %{shared:-shared} \ | ||
166 | @@ -118,6 +129,7 @@ | ||
167 | %{rdynamic:-export-dynamic} \ | ||
168 | %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ | ||
169 | %{static:-static}}}" | ||
170 | +#endif | ||
171 | |||
172 | #undef SUBTARGET_ASM_SPEC | ||
173 | #define SUBTARGET_ASM_SPEC "\ | ||
174 | diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h | ||
175 | --- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 | ||
176 | +++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 | ||
177 | @@ -61,7 +61,11 @@ | ||
178 | #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" | ||
179 | |||
180 | #undef LINK_OS_DEFAULT_SPEC | ||
181 | +#ifdef USE_UCLIBC | ||
182 | +#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" | ||
183 | +#else | ||
184 | #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" | ||
185 | +#endif | ||
186 | |||
187 | #define LINK_GCC_C_SEQUENCE_SPEC \ | ||
188 | "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" | ||
189 | diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h | ||
190 | --- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 | ||
191 | +++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 | ||
192 | @@ -947,6 +947,7 @@ | ||
193 | mcall-linux : %(link_os_linux) ; \ | ||
194 | mcall-gnu : %(link_os_gnu) ; \ | ||
195 | mcall-netbsd : %(link_os_netbsd) ; \ | ||
196 | + mcall-linux-uclibc : %(link_os_linux_uclibc); \ | ||
197 | mcall-openbsd: %(link_os_openbsd) ; \ | ||
198 | : %(link_os_default) }" | ||
199 | |||
200 | @@ -1124,6 +1125,10 @@ | ||
201 | %{rdynamic:-export-dynamic} \ | ||
202 | %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" | ||
203 | |||
204 | +#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ | ||
205 | + %{rdynamic:-export-dynamic} \ | ||
206 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" | ||
207 | + | ||
208 | #if defined(HAVE_LD_EH_FRAME_HDR) | ||
209 | # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " | ||
210 | #endif | ||
211 | @@ -1290,6 +1295,7 @@ | ||
212 | { "link_os_sim", LINK_OS_SIM_SPEC }, \ | ||
213 | { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ | ||
214 | { "link_os_linux", LINK_OS_LINUX_SPEC }, \ | ||
215 | + { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ | ||
216 | { "link_os_gnu", LINK_OS_GNU_SPEC }, \ | ||
217 | { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ | ||
218 | { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ | ||
219 | diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h | ||
220 | --- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 | ||
221 | +++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 | ||
222 | @@ -73,12 +73,21 @@ | ||
223 | #undef SUBTARGET_LINK_EMUL_SUFFIX | ||
224 | #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" | ||
225 | #undef SUBTARGET_LINK_SPEC | ||
226 | +#ifdef USE_UCLIBC | ||
227 | +#define SUBTARGET_LINK_SPEC \ | ||
228 | + "%{shared:-shared} \ | ||
229 | + %{!static: \ | ||
230 | + %{rdynamic:-export-dynamic} \ | ||
231 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ | ||
232 | + %{static:-static}" | ||
233 | +#else | ||
234 | #define SUBTARGET_LINK_SPEC \ | ||
235 | "%{shared:-shared} \ | ||
236 | %{!static: \ | ||
237 | %{rdynamic:-export-dynamic} \ | ||
238 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
239 | %{static:-static}" | ||
240 | +#endif | ||
241 | |||
242 | #undef LIB_SPEC | ||
243 | #define LIB_SPEC \ | ||
244 | diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc | ||
245 | --- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 | ||
246 | +++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 | ||
247 | @@ -0,0 +1,13 @@ | ||
248 | +T_CFLAGS = -DUSE_UCLIBC | ||
249 | + | ||
250 | +TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES | ||
251 | +LIB1ASMFUNCS_CACHE = _ic_invalidate | ||
252 | + | ||
253 | +LIB2FUNCS_EXTRA= | ||
254 | + | ||
255 | +MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 | ||
256 | +MULTILIB_DIRNAMES= | ||
257 | +MULTILIB_MATCHES = | ||
258 | +MULTILIB_EXCEPTIONS= | ||
259 | + | ||
260 | +EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o | ||
261 | diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc | ||
262 | --- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 | ||
263 | +++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 | ||
264 | @@ -0,0 +1,13 @@ | ||
265 | +EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o | ||
266 | + | ||
267 | +LIB1ASMFUNCS = \ | ||
268 | + _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ | ||
269 | + _shcompact_call_trampoline _shcompact_return_trampoline \ | ||
270 | + _shcompact_incoming_args _ic_invalidate _nested_trampoline \ | ||
271 | + _push_pop_shmedia_regs \ | ||
272 | + _udivdi3 _divdi3 _umoddi3 _moddi3 | ||
273 | + | ||
274 | +MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu | ||
275 | +MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 | ||
276 | +MULTILIB_MATCHES= | ||
277 | +MULTILIB_EXCEPTIONS= | ||
278 | diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc | ||
279 | --- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 | ||
280 | +++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 | ||
281 | @@ -0,0 +1,15 @@ | ||
282 | +T_CFLAGS = -DUSE_UCLIBC | ||
283 | + | ||
284 | +# Compile crtbeginS.o and crtendS.o with pic. | ||
285 | +CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC | ||
286 | +# Compile libgcc2.a with pic. | ||
287 | +TARGET_LIBGCC2_CFLAGS = -fPIC | ||
288 | + | ||
289 | +# Override t-slibgcc-elf-ver to export some libgcc symbols with | ||
290 | +# the symbol versions that glibc used. | ||
291 | +#SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver | ||
292 | + | ||
293 | +# Use unwind-dw2-fde | ||
294 | +LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ | ||
295 | + $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c | ||
296 | +LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h | ||
297 | diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc | ||
298 | --- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 | ||
299 | +++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 | ||
300 | @@ -664,6 +664,12 @@ | ||
301 | extra_parts="" | ||
302 | use_collect2=yes | ||
303 | ;; | ||
304 | +arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc | ||
305 | + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" | ||
306 | + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" | ||
307 | + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" | ||
308 | + gnu_ld=yes | ||
309 | + ;; | ||
310 | arm*-*-linux*) # ARM GNU/Linux with ELF | ||
311 | tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" | ||
312 | tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" | ||
313 | @@ -725,6 +731,10 @@ | ||
314 | tmake_file="cris/t-cris cris/t-elfmulti" | ||
315 | gas=yes | ||
316 | ;; | ||
317 | +cris-*-linux-uclibc*) | ||
318 | + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" | ||
319 | + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" | ||
320 | + ;; | ||
321 | cris-*-linux*) | ||
322 | tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" | ||
323 | tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" | ||
324 | @@ -988,6 +998,11 @@ | ||
325 | thread_file='single' | ||
326 | fi | ||
327 | ;; | ||
328 | +i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux | ||
329 | + # with ELF format using uClibc | ||
330 | + tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" | ||
331 | + tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" | ||
332 | + ;; | ||
333 | i[34567]86-*-linux*) # Intel 80386's running GNU/Linux | ||
334 | # with ELF format using glibc 2 | ||
335 | # aka GNU/Linux C library 6 | ||
336 | @@ -1547,6 +1562,16 @@ | ||
337 | gnu_ld=yes | ||
338 | gas=yes | ||
339 | ;; | ||
340 | +mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc | ||
341 | + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" | ||
342 | + case ${target} in | ||
343 | + mipsisa32*-*) | ||
344 | + target_cpu_default="MASK_SOFT_FLOAT" | ||
345 | + tm_defines="MIPS_ISA_DEFAULT=32" | ||
346 | + ;; | ||
347 | + esac | ||
348 | + tmake_file="t-slibgcc-elf-ver t-linux-uclibc" | ||
349 | + ;; | ||
350 | mips*-*-linux*) # Linux MIPS, either endian. | ||
351 | tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" | ||
352 | case ${target} in | ||
353 | @@ -1764,6 +1789,10 @@ | ||
354 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" | ||
355 | tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" | ||
356 | ;; | ||
357 | +powerpc-*-linux-uclibc*) | ||
358 | + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" | ||
359 | + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" | ||
360 | + ;; | ||
361 | powerpc-*-linux*) | ||
362 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" | ||
363 | tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" | ||
364 | @@ -1916,7 +1945,7 @@ | ||
365 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" | ||
366 | ;; | ||
367 | sh-*-linux* | sh[2346lbe]*-*-linux*) | ||
368 | - tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" | ||
369 | + tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" | ||
370 | case ${target} in | ||
371 | sh*be-*-* | sh*eb-*-*) ;; | ||
372 | *) | ||
373 | @@ -1924,9 +1953,17 @@ | ||
374 | tmake_file="${tmake_file} sh/t-le" | ||
375 | ;; | ||
376 | esac | ||
377 | - tmake_file="${tmake_file} sh/t-linux" | ||
378 | + case ${target} in | ||
379 | + *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; | ||
380 | + *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; | ||
381 | + esac | ||
382 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" | ||
383 | case ${target} in | ||
384 | + sh64*-*-linux-uclibc*) | ||
385 | + tmake_file="${tmake_file} sh/t-sh64-uclibc" | ||
386 | + tm_file="${tm_file} sh/sh64.h" | ||
387 | + extra_headers="shmedia.h ushmedia.h sshmedia.h" | ||
388 | + ;; | ||
389 | sh64*) | ||
390 | tmake_file="${tmake_file} sh/t-sh64" | ||
391 | tm_file="${tm_file} sh/sh64.h" | ||
392 | diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 | ||
393 | --- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 | ||
394 | +++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 | ||
395 | @@ -689,6 +689,11 @@ | ||
396 | lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` | ||
397 | ;; | ||
398 | |||
399 | +linux-uclibc*) | ||
400 | + lt_cv_deplibs_check_method=pass_all | ||
401 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
402 | + ;; | ||
403 | + | ||
404 | netbsd*) | ||
405 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
406 | [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] | ||
407 | diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig | ||
408 | --- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 | ||
409 | +++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 | ||
410 | @@ -602,6 +602,7 @@ | ||
411 | |||
412 | # Transform linux* to *-*-linux-gnu*, to support old configure scripts. | ||
413 | case $host_os in | ||
414 | +linux-uclibc*) ;; | ||
415 | linux-gnu*) ;; | ||
416 | linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` | ||
417 | esac | ||
418 | @@ -1262,6 +1263,24 @@ | ||
419 | dynamic_linker='GNU/Linux ld.so' | ||
420 | ;; | ||
421 | |||
422 | +linux-uclibc*) | ||
423 | + version_type=linux | ||
424 | + need_lib_prefix=no | ||
425 | + need_version=no | ||
426 | + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' | ||
427 | + soname_spec='${libname}${release}.so$major' | ||
428 | + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' | ||
429 | + shlibpath_var=LD_LIBRARY_PATH | ||
430 | + shlibpath_overrides_runpath=no | ||
431 | + # This implies no fast_install, which is unacceptable. | ||
432 | + # Some rework will be needed to allow for fast_install | ||
433 | + # before this can be enabled. | ||
434 | + # Note: copied from linux-gnu, and may not be appropriate. | ||
435 | + hardcode_into_libs=yes | ||
436 | + # Assume using the uClibc dynamic linker. | ||
437 | + dynamic_linker="uClibc ld.so" | ||
438 | + ;; | ||
439 | + | ||
440 | netbsd*) | ||
441 | need_lib_prefix=no | ||
442 | need_version=no | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-200-locale.patch b/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-200-locale.patch deleted file mode 100644 index 3fc4900b06..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-3.4.1-uclibc-200-locale.patch +++ /dev/null | |||
@@ -1,3246 +0,0 @@ | |||
1 | diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 | ||
2 | --- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 | ||
3 | +++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 | ||
4 | @@ -996,7 +996,7 @@ | ||
5 | AC_MSG_CHECKING([for C locale to use]) | ||
6 | GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], | ||
7 | [use MODEL for target locale package], | ||
8 | - [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) | ||
9 | + [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) | ||
10 | |||
11 | # If they didn't use this option switch, or if they specified --enable | ||
12 | # with no specific model, we'll have to look for one. If they | ||
13 | @@ -1012,6 +1012,9 @@ | ||
14 | # Default to "generic". | ||
15 | if test $enable_clocale_flag = auto; then | ||
16 | case x${target_os} in | ||
17 | + x*-uclibc*) | ||
18 | + enable_clocale_flag=uclibc | ||
19 | + ;; | ||
20 | xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) | ||
21 | AC_EGREP_CPP([_GLIBCXX_ok], [ | ||
22 | #include <features.h> | ||
23 | @@ -1138,6 +1141,41 @@ | ||
24 | CTIME_CC=config/locale/generic/time_members.cc | ||
25 | CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h | ||
26 | ;; | ||
27 | + uclibc) | ||
28 | + AC_MSG_RESULT(uclibc) | ||
29 | + | ||
30 | + # Declare intention to use gettext, and add support for specific | ||
31 | + # languages. | ||
32 | + # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT | ||
33 | + ALL_LINGUAS="de fr" | ||
34 | + | ||
35 | + # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. | ||
36 | + AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) | ||
37 | + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then | ||
38 | + USE_NLS=yes | ||
39 | + fi | ||
40 | + # Export the build objects. | ||
41 | + for ling in $ALL_LINGUAS; do \ | ||
42 | + glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ | ||
43 | + glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ | ||
44 | + done | ||
45 | + AC_SUBST(glibcxx_MOFILES) | ||
46 | + AC_SUBST(glibcxx_POFILES) | ||
47 | + | ||
48 | + CLOCALE_H=config/locale/uclibc/c_locale.h | ||
49 | + CLOCALE_CC=config/locale/uclibc/c_locale.cc | ||
50 | + CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h | ||
51 | + CCODECVT_CC=config/locale/uclibc/codecvt_members.cc | ||
52 | + CCOLLATE_CC=config/locale/uclibc/collate_members.cc | ||
53 | + CCTYPE_CC=config/locale/uclibc/ctype_members.cc | ||
54 | + CMESSAGES_H=config/locale/uclibc/messages_members.h | ||
55 | + CMESSAGES_CC=config/locale/uclibc/messages_members.cc | ||
56 | + CMONEY_CC=config/locale/uclibc/monetary_members.cc | ||
57 | + CNUMERIC_CC=config/locale/uclibc/numeric_members.cc | ||
58 | + CTIME_H=config/locale/uclibc/time_members.h | ||
59 | + CTIME_CC=config/locale/uclibc/time_members.cc | ||
60 | + CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h | ||
61 | + ;; | ||
62 | esac | ||
63 | |||
64 | # This is where the testsuite looks for locale catalogs, using the | ||
65 | diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 | ||
66 | --- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 | ||
67 | +++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 | ||
68 | @@ -1025,6 +1025,9 @@ | ||
69 | # Default to "generic". | ||
70 | if test $enable_clocale_flag = auto; then | ||
71 | case x${target_os} in | ||
72 | + x*-uclibc*) | ||
73 | + enable_clocale_flag=uclibc | ||
74 | + ;; | ||
75 | xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) | ||
76 | AC_EGREP_CPP([_GLIBCXX_ok], [ | ||
77 | #include <features.h> | ||
78 | @@ -1151,6 +1154,41 @@ | ||
79 | CTIME_CC=config/locale/generic/time_members.cc | ||
80 | CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h | ||
81 | ;; | ||
82 | + uclibc) | ||
83 | + AC_MSG_RESULT(uclibc) | ||
84 | + | ||
85 | + # Declare intention to use gettext, and add support for specific | ||
86 | + # languages. | ||
87 | + # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT | ||
88 | + ALL_LINGUAS="de fr" | ||
89 | + | ||
90 | + # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. | ||
91 | + AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) | ||
92 | + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then | ||
93 | + USE_NLS=yes | ||
94 | + fi | ||
95 | + # Export the build objects. | ||
96 | + for ling in $ALL_LINGUAS; do \ | ||
97 | + glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ | ||
98 | + glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ | ||
99 | + done | ||
100 | + AC_SUBST(glibcxx_MOFILES) | ||
101 | + AC_SUBST(glibcxx_POFILES) | ||
102 | + | ||
103 | + CLOCALE_H=config/locale/uclibc/c_locale.h | ||
104 | + CLOCALE_CC=config/locale/uclibc/c_locale.cc | ||
105 | + CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h | ||
106 | + CCODECVT_CC=config/locale/uclibc/codecvt_members.cc | ||
107 | + CCOLLATE_CC=config/locale/uclibc/collate_members.cc | ||
108 | + CCTYPE_CC=config/locale/uclibc/ctype_members.cc | ||
109 | + CMESSAGES_H=config/locale/uclibc/messages_members.h | ||
110 | + CMESSAGES_CC=config/locale/uclibc/messages_members.cc | ||
111 | + CMONEY_CC=config/locale/uclibc/monetary_members.cc | ||
112 | + CNUMERIC_CC=config/locale/uclibc/numeric_members.cc | ||
113 | + CTIME_H=config/locale/uclibc/time_members.h | ||
114 | + CTIME_CC=config/locale/uclibc/time_members.cc | ||
115 | + CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h | ||
116 | + ;; | ||
117 | esac | ||
118 | |||
119 | # This is where the testsuite looks for locale catalogs, using the | ||
120 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h | ||
121 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 | ||
122 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 | ||
123 | @@ -0,0 +1,59 @@ | ||
124 | +// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- | ||
125 | + | ||
126 | +// Copyright (C) 2002, 2004 Free Software Foundation, Inc. | ||
127 | +// | ||
128 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
129 | +// software; you can redistribute it and/or modify it under the | ||
130 | +// terms of the GNU General Public License as published by the | ||
131 | +// Free Software Foundation; either version 2, or (at your option) | ||
132 | +// any later version. | ||
133 | + | ||
134 | +// This library is distributed in the hope that it will be useful, | ||
135 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
136 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
137 | +// GNU General Public License for more details. | ||
138 | + | ||
139 | +// You should have received a copy of the GNU General Public License along | ||
140 | +// with this library; see the file COPYING. If not, write to the Free | ||
141 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
142 | +// USA. | ||
143 | + | ||
144 | +// As a special exception, you may use this file as part of a free software | ||
145 | +// library without restriction. Specifically, if other files instantiate | ||
146 | +// templates or use macros or inline functions from this file, or you compile | ||
147 | +// this file and link it with other files to produce an executable, this | ||
148 | +// file does not by itself cause the resulting executable to be covered by | ||
149 | +// the GNU General Public License. This exception does not however | ||
150 | +// invalidate any other reasons why the executable file might be covered by | ||
151 | +// the GNU General Public License. | ||
152 | + | ||
153 | +// Written by Jakub Jelinek <jakub@redhat.com> | ||
154 | + | ||
155 | +#include <clocale> | ||
156 | + | ||
157 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
158 | +#warning clean this up | ||
159 | +#endif | ||
160 | + | ||
161 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
162 | + | ||
163 | +extern "C" __typeof(iswctype_l) __iswctype_l; | ||
164 | +extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; | ||
165 | +extern "C" __typeof(strcoll_l) __strcoll_l; | ||
166 | +extern "C" __typeof(strftime_l) __strftime_l; | ||
167 | +extern "C" __typeof(strtod_l) __strtod_l; | ||
168 | +extern "C" __typeof(strtof_l) __strtof_l; | ||
169 | +extern "C" __typeof(strtold_l) __strtold_l; | ||
170 | +extern "C" __typeof(strxfrm_l) __strxfrm_l; | ||
171 | +extern "C" __typeof(towlower_l) __towlower_l; | ||
172 | +extern "C" __typeof(towupper_l) __towupper_l; | ||
173 | +extern "C" __typeof(wcscoll_l) __wcscoll_l; | ||
174 | +extern "C" __typeof(wcsftime_l) __wcsftime_l; | ||
175 | +extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; | ||
176 | +extern "C" __typeof(wctype_l) __wctype_l; | ||
177 | +extern "C" __typeof(newlocale) __newlocale; | ||
178 | +extern "C" __typeof(freelocale) __freelocale; | ||
179 | +extern "C" __typeof(duplocale) __duplocale; | ||
180 | +extern "C" __typeof(uselocale) __uselocale; | ||
181 | + | ||
182 | +#endif // GLIBC 2.3 and later | ||
183 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc | ||
184 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 | ||
185 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 | ||
186 | @@ -0,0 +1,160 @@ | ||
187 | +// Wrapper for underlying C-language localization -*- C++ -*- | ||
188 | + | ||
189 | +// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. | ||
190 | +// | ||
191 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
192 | +// software; you can redistribute it and/or modify it under the | ||
193 | +// terms of the GNU General Public License as published by the | ||
194 | +// Free Software Foundation; either version 2, or (at your option) | ||
195 | +// any later version. | ||
196 | + | ||
197 | +// This library is distributed in the hope that it will be useful, | ||
198 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
199 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
200 | +// GNU General Public License for more details. | ||
201 | + | ||
202 | +// You should have received a copy of the GNU General Public License along | ||
203 | +// with this library; see the file COPYING. If not, write to the Free | ||
204 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
205 | +// USA. | ||
206 | + | ||
207 | +// As a special exception, you may use this file as part of a free software | ||
208 | +// library without restriction. Specifically, if other files instantiate | ||
209 | +// templates or use macros or inline functions from this file, or you compile | ||
210 | +// this file and link it with other files to produce an executable, this | ||
211 | +// file does not by itself cause the resulting executable to be covered by | ||
212 | +// the GNU General Public License. This exception does not however | ||
213 | +// invalidate any other reasons why the executable file might be covered by | ||
214 | +// the GNU General Public License. | ||
215 | + | ||
216 | +// | ||
217 | +// ISO C++ 14882: 22.8 Standard locale categories. | ||
218 | +// | ||
219 | + | ||
220 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
221 | + | ||
222 | +#include <cerrno> // For errno | ||
223 | +#include <locale> | ||
224 | +#include <stdexcept> | ||
225 | +#include <langinfo.h> | ||
226 | +#include <bits/c++locale_internal.h> | ||
227 | + | ||
228 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
229 | +#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) | ||
230 | +#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) | ||
231 | +#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) | ||
232 | +#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) | ||
233 | +#define __strtof_l(S, E, L) strtof((S), (E)) | ||
234 | +#define __strtod_l(S, E, L) strtod((S), (E)) | ||
235 | +#define __strtold_l(S, E, L) strtold((S), (E)) | ||
236 | +#warning should dummy __newlocale check for C|POSIX ? | ||
237 | +#define __newlocale(a, b, c) NULL | ||
238 | +#define __freelocale(a) ((void)0) | ||
239 | +#define __duplocale(a) __c_locale() | ||
240 | +#endif | ||
241 | + | ||
242 | +namespace std | ||
243 | +{ | ||
244 | + template<> | ||
245 | + void | ||
246 | + __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, | ||
247 | + const __c_locale& __cloc) | ||
248 | + { | ||
249 | + if (!(__err & ios_base::failbit)) | ||
250 | + { | ||
251 | + char* __sanity; | ||
252 | + errno = 0; | ||
253 | + float __f = __strtof_l(__s, &__sanity, __cloc); | ||
254 | + if (__sanity != __s && errno != ERANGE) | ||
255 | + __v = __f; | ||
256 | + else | ||
257 | + __err |= ios_base::failbit; | ||
258 | + } | ||
259 | + } | ||
260 | + | ||
261 | + template<> | ||
262 | + void | ||
263 | + __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, | ||
264 | + const __c_locale& __cloc) | ||
265 | + { | ||
266 | + if (!(__err & ios_base::failbit)) | ||
267 | + { | ||
268 | + char* __sanity; | ||
269 | + errno = 0; | ||
270 | + double __d = __strtod_l(__s, &__sanity, __cloc); | ||
271 | + if (__sanity != __s && errno != ERANGE) | ||
272 | + __v = __d; | ||
273 | + else | ||
274 | + __err |= ios_base::failbit; | ||
275 | + } | ||
276 | + } | ||
277 | + | ||
278 | + template<> | ||
279 | + void | ||
280 | + __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, | ||
281 | + const __c_locale& __cloc) | ||
282 | + { | ||
283 | + if (!(__err & ios_base::failbit)) | ||
284 | + { | ||
285 | + char* __sanity; | ||
286 | + errno = 0; | ||
287 | + long double __ld = __strtold_l(__s, &__sanity, __cloc); | ||
288 | + if (__sanity != __s && errno != ERANGE) | ||
289 | + __v = __ld; | ||
290 | + else | ||
291 | + __err |= ios_base::failbit; | ||
292 | + } | ||
293 | + } | ||
294 | + | ||
295 | + void | ||
296 | + locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, | ||
297 | + __c_locale __old) | ||
298 | + { | ||
299 | + __cloc = __newlocale(1 << LC_ALL, __s, __old); | ||
300 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
301 | + if (!__cloc) | ||
302 | + { | ||
303 | + // This named locale is not supported by the underlying OS. | ||
304 | + __throw_runtime_error(__N("locale::facet::_S_create_c_locale " | ||
305 | + "name not valid")); | ||
306 | + } | ||
307 | +#endif | ||
308 | + } | ||
309 | + | ||
310 | + void | ||
311 | + locale::facet::_S_destroy_c_locale(__c_locale& __cloc) | ||
312 | + { | ||
313 | + if (_S_get_c_locale() != __cloc) | ||
314 | + __freelocale(__cloc); | ||
315 | + } | ||
316 | + | ||
317 | + __c_locale | ||
318 | + locale::facet::_S_clone_c_locale(__c_locale& __cloc) | ||
319 | + { return __duplocale(__cloc); } | ||
320 | +} // namespace std | ||
321 | + | ||
322 | +namespace __gnu_cxx | ||
323 | +{ | ||
324 | + const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = | ||
325 | + { | ||
326 | + "LC_CTYPE", | ||
327 | + "LC_NUMERIC", | ||
328 | + "LC_TIME", | ||
329 | + "LC_COLLATE", | ||
330 | + "LC_MONETARY", | ||
331 | + "LC_MESSAGES", | ||
332 | +#if _GLIBCXX_NUM_CATEGORIES != 0 | ||
333 | + "LC_PAPER", | ||
334 | + "LC_NAME", | ||
335 | + "LC_ADDRESS", | ||
336 | + "LC_TELEPHONE", | ||
337 | + "LC_MEASUREMENT", | ||
338 | + "LC_IDENTIFICATION" | ||
339 | +#endif | ||
340 | + }; | ||
341 | +} | ||
342 | + | ||
343 | +namespace std | ||
344 | +{ | ||
345 | + const char* const* const locale::_S_categories = __gnu_cxx::category_names; | ||
346 | +} // namespace std | ||
347 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h | ||
348 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 | ||
349 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 | ||
350 | @@ -0,0 +1,115 @@ | ||
351 | +// Wrapper for underlying C-language localization -*- C++ -*- | ||
352 | + | ||
353 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
354 | +// | ||
355 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
356 | +// software; you can redistribute it and/or modify it under the | ||
357 | +// terms of the GNU General Public License as published by the | ||
358 | +// Free Software Foundation; either version 2, or (at your option) | ||
359 | +// any later version. | ||
360 | + | ||
361 | +// This library is distributed in the hope that it will be useful, | ||
362 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
363 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
364 | +// GNU General Public License for more details. | ||
365 | + | ||
366 | +// You should have received a copy of the GNU General Public License along | ||
367 | +// with this library; see the file COPYING. If not, write to the Free | ||
368 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
369 | +// USA. | ||
370 | + | ||
371 | +// As a special exception, you may use this file as part of a free software | ||
372 | +// library without restriction. Specifically, if other files instantiate | ||
373 | +// templates or use macros or inline functions from this file, or you compile | ||
374 | +// this file and link it with other files to produce an executable, this | ||
375 | +// file does not by itself cause the resulting executable to be covered by | ||
376 | +// the GNU General Public License. This exception does not however | ||
377 | +// invalidate any other reasons why the executable file might be covered by | ||
378 | +// the GNU General Public License. | ||
379 | + | ||
380 | +// | ||
381 | +// ISO C++ 14882: 22.8 Standard locale categories. | ||
382 | +// | ||
383 | + | ||
384 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
385 | + | ||
386 | +#ifndef _C_LOCALE_H | ||
387 | +#define _C_LOCALE_H 1 | ||
388 | + | ||
389 | +#pragma GCC system_header | ||
390 | + | ||
391 | +#include <cstring> // get std::strlen | ||
392 | +#include <cstdio> // get std::snprintf or std::sprintf | ||
393 | +#include <clocale> | ||
394 | +#include <langinfo.h> // For codecvt | ||
395 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
396 | +#warning fix this | ||
397 | +#endif | ||
398 | +#ifdef __UCLIBC_HAS_LOCALE__ | ||
399 | +#include <iconv.h> // For codecvt using iconv, iconv_t | ||
400 | +#endif | ||
401 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
402 | +#include <libintl.h> // For messages | ||
403 | +#endif | ||
404 | + | ||
405 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
406 | +#warning what is _GLIBCXX_C_LOCALE_GNU for | ||
407 | +#endif | ||
408 | +#define _GLIBCXX_C_LOCALE_GNU 1 | ||
409 | + | ||
410 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
411 | +#warning fix categories | ||
412 | +#endif | ||
413 | +// #define _GLIBCXX_NUM_CATEGORIES 6 | ||
414 | +#define _GLIBCXX_NUM_CATEGORIES 0 | ||
415 | + | ||
416 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
417 | +namespace __gnu_cxx | ||
418 | +{ | ||
419 | + extern "C" __typeof(uselocale) __uselocale; | ||
420 | +} | ||
421 | +#endif | ||
422 | + | ||
423 | +namespace std | ||
424 | +{ | ||
425 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
426 | + typedef __locale_t __c_locale; | ||
427 | +#else | ||
428 | + typedef int* __c_locale; | ||
429 | +#endif | ||
430 | + | ||
431 | + // Convert numeric value of type _Tv to string and return length of | ||
432 | + // string. If snprintf is available use it, otherwise fall back to | ||
433 | + // the unsafe sprintf which, in general, can be dangerous and should | ||
434 | + // be avoided. | ||
435 | + template<typename _Tv> | ||
436 | + int | ||
437 | + __convert_from_v(char* __out, const int __size, const char* __fmt, | ||
438 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
439 | + _Tv __v, const __c_locale& __cloc, int __prec) | ||
440 | + { | ||
441 | + __c_locale __old = __gnu_cxx::__uselocale(__cloc); | ||
442 | +#else | ||
443 | + _Tv __v, const __c_locale&, int __prec) | ||
444 | + { | ||
445 | +# ifdef __UCLIBC_HAS_LOCALE__ | ||
446 | + char* __old = std::setlocale(LC_ALL, NULL); | ||
447 | + char* __sav = new char[std::strlen(__old) + 1]; | ||
448 | + std::strcpy(__sav, __old); | ||
449 | + std::setlocale(LC_ALL, "C"); | ||
450 | +# endif | ||
451 | +#endif | ||
452 | + | ||
453 | + const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); | ||
454 | + | ||
455 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
456 | + __gnu_cxx::__uselocale(__old); | ||
457 | +#elif defined __UCLIBC_HAS_LOCALE__ | ||
458 | + std::setlocale(LC_ALL, __sav); | ||
459 | + delete [] __sav; | ||
460 | +#endif | ||
461 | + return __ret; | ||
462 | + } | ||
463 | +} | ||
464 | + | ||
465 | +#endif | ||
466 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc | ||
467 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
468 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
469 | @@ -0,0 +1,306 @@ | ||
470 | +// std::codecvt implementation details, GNU version -*- C++ -*- | ||
471 | + | ||
472 | +// Copyright (C) 2002, 2003 Free Software Foundation, Inc. | ||
473 | +// | ||
474 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
475 | +// software; you can redistribute it and/or modify it under the | ||
476 | +// terms of the GNU General Public License as published by the | ||
477 | +// Free Software Foundation; either version 2, or (at your option) | ||
478 | +// any later version. | ||
479 | + | ||
480 | +// This library is distributed in the hope that it will be useful, | ||
481 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
482 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
483 | +// GNU General Public License for more details. | ||
484 | + | ||
485 | +// You should have received a copy of the GNU General Public License along | ||
486 | +// with this library; see the file COPYING. If not, write to the Free | ||
487 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
488 | +// USA. | ||
489 | + | ||
490 | +// As a special exception, you may use this file as part of a free software | ||
491 | +// library without restriction. Specifically, if other files instantiate | ||
492 | +// templates or use macros or inline functions from this file, or you compile | ||
493 | +// this file and link it with other files to produce an executable, this | ||
494 | +// file does not by itself cause the resulting executable to be covered by | ||
495 | +// the GNU General Public License. This exception does not however | ||
496 | +// invalidate any other reasons why the executable file might be covered by | ||
497 | +// the GNU General Public License. | ||
498 | + | ||
499 | +// | ||
500 | +// ISO C++ 14882: 22.2.1.5 - Template class codecvt | ||
501 | +// | ||
502 | + | ||
503 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
504 | + | ||
505 | +#include <locale> | ||
506 | +#include <bits/c++locale_internal.h> | ||
507 | + | ||
508 | +namespace std | ||
509 | +{ | ||
510 | + // Specializations. | ||
511 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
512 | + codecvt_base::result | ||
513 | + codecvt<wchar_t, char, mbstate_t>:: | ||
514 | + do_out(state_type& __state, const intern_type* __from, | ||
515 | + const intern_type* __from_end, const intern_type*& __from_next, | ||
516 | + extern_type* __to, extern_type* __to_end, | ||
517 | + extern_type*& __to_next) const | ||
518 | + { | ||
519 | + result __ret = ok; | ||
520 | + state_type __tmp_state(__state); | ||
521 | + | ||
522 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
523 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
524 | +#endif | ||
525 | + | ||
526 | + // wcsnrtombs is *very* fast but stops if encounters NUL characters: | ||
527 | + // in case we fall back to wcrtomb and then continue, in a loop. | ||
528 | + // NB: wcsnrtombs is a GNU extension | ||
529 | + for (__from_next = __from, __to_next = __to; | ||
530 | + __from_next < __from_end && __to_next < __to_end | ||
531 | + && __ret == ok;) | ||
532 | + { | ||
533 | + const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', | ||
534 | + __from_end - __from_next); | ||
535 | + if (!__from_chunk_end) | ||
536 | + __from_chunk_end = __from_end; | ||
537 | + | ||
538 | + __from = __from_next; | ||
539 | + const size_t __conv = wcsnrtombs(__to_next, &__from_next, | ||
540 | + __from_chunk_end - __from_next, | ||
541 | + __to_end - __to_next, &__state); | ||
542 | + if (__conv == static_cast<size_t>(-1)) | ||
543 | + { | ||
544 | + // In case of error, in order to stop at the exact place we | ||
545 | + // have to start again from the beginning with a series of | ||
546 | + // wcrtomb. | ||
547 | + for (; __from < __from_next; ++__from) | ||
548 | + __to_next += wcrtomb(__to_next, *__from, &__tmp_state); | ||
549 | + __state = __tmp_state; | ||
550 | + __ret = error; | ||
551 | + } | ||
552 | + else if (__from_next && __from_next < __from_chunk_end) | ||
553 | + { | ||
554 | + __to_next += __conv; | ||
555 | + __ret = partial; | ||
556 | + } | ||
557 | + else | ||
558 | + { | ||
559 | + __from_next = __from_chunk_end; | ||
560 | + __to_next += __conv; | ||
561 | + } | ||
562 | + | ||
563 | + if (__from_next < __from_end && __ret == ok) | ||
564 | + { | ||
565 | + extern_type __buf[MB_LEN_MAX]; | ||
566 | + __tmp_state = __state; | ||
567 | + const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); | ||
568 | + if (__conv > static_cast<size_t>(__to_end - __to_next)) | ||
569 | + __ret = partial; | ||
570 | + else | ||
571 | + { | ||
572 | + memcpy(__to_next, __buf, __conv); | ||
573 | + __state = __tmp_state; | ||
574 | + __to_next += __conv; | ||
575 | + ++__from_next; | ||
576 | + } | ||
577 | + } | ||
578 | + } | ||
579 | + | ||
580 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
581 | + __uselocale(__old); | ||
582 | +#endif | ||
583 | + | ||
584 | + return __ret; | ||
585 | + } | ||
586 | + | ||
587 | + codecvt_base::result | ||
588 | + codecvt<wchar_t, char, mbstate_t>:: | ||
589 | + do_in(state_type& __state, const extern_type* __from, | ||
590 | + const extern_type* __from_end, const extern_type*& __from_next, | ||
591 | + intern_type* __to, intern_type* __to_end, | ||
592 | + intern_type*& __to_next) const | ||
593 | + { | ||
594 | + result __ret = ok; | ||
595 | + state_type __tmp_state(__state); | ||
596 | + | ||
597 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
598 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
599 | +#endif | ||
600 | + | ||
601 | + // mbsnrtowcs is *very* fast but stops if encounters NUL characters: | ||
602 | + // in case we store a L'\0' and then continue, in a loop. | ||
603 | + // NB: mbsnrtowcs is a GNU extension | ||
604 | + for (__from_next = __from, __to_next = __to; | ||
605 | + __from_next < __from_end && __to_next < __to_end | ||
606 | + && __ret == ok;) | ||
607 | + { | ||
608 | + const extern_type* __from_chunk_end; | ||
609 | + __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', | ||
610 | + __from_end | ||
611 | + - __from_next)); | ||
612 | + if (!__from_chunk_end) | ||
613 | + __from_chunk_end = __from_end; | ||
614 | + | ||
615 | + __from = __from_next; | ||
616 | + size_t __conv = mbsnrtowcs(__to_next, &__from_next, | ||
617 | + __from_chunk_end - __from_next, | ||
618 | + __to_end - __to_next, &__state); | ||
619 | + if (__conv == static_cast<size_t>(-1)) | ||
620 | + { | ||
621 | + // In case of error, in order to stop at the exact place we | ||
622 | + // have to start again from the beginning with a series of | ||
623 | + // mbrtowc. | ||
624 | + for (;; ++__to_next, __from += __conv) | ||
625 | + { | ||
626 | + __conv = mbrtowc(__to_next, __from, __from_end - __from, | ||
627 | + &__tmp_state); | ||
628 | + if (__conv == static_cast<size_t>(-1) | ||
629 | + || __conv == static_cast<size_t>(-2)) | ||
630 | + break; | ||
631 | + } | ||
632 | + __from_next = __from; | ||
633 | + __state = __tmp_state; | ||
634 | + __ret = error; | ||
635 | + } | ||
636 | + else if (__from_next && __from_next < __from_chunk_end) | ||
637 | + { | ||
638 | + // It is unclear what to return in this case (see DR 382). | ||
639 | + __to_next += __conv; | ||
640 | + __ret = partial; | ||
641 | + } | ||
642 | + else | ||
643 | + { | ||
644 | + __from_next = __from_chunk_end; | ||
645 | + __to_next += __conv; | ||
646 | + } | ||
647 | + | ||
648 | + if (__from_next < __from_end && __ret == ok) | ||
649 | + { | ||
650 | + if (__to_next < __to_end) | ||
651 | + { | ||
652 | + // XXX Probably wrong for stateful encodings | ||
653 | + __tmp_state = __state; | ||
654 | + ++__from_next; | ||
655 | + *__to_next++ = L'\0'; | ||
656 | + } | ||
657 | + else | ||
658 | + __ret = partial; | ||
659 | + } | ||
660 | + } | ||
661 | + | ||
662 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
663 | + __uselocale(__old); | ||
664 | +#endif | ||
665 | + | ||
666 | + return __ret; | ||
667 | + } | ||
668 | + | ||
669 | + int | ||
670 | + codecvt<wchar_t, char, mbstate_t>:: | ||
671 | + do_encoding() const throw() | ||
672 | + { | ||
673 | + // XXX This implementation assumes that the encoding is | ||
674 | + // stateless and is either single-byte or variable-width. | ||
675 | + int __ret = 0; | ||
676 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
677 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
678 | +#endif | ||
679 | + if (MB_CUR_MAX == 1) | ||
680 | + __ret = 1; | ||
681 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
682 | + __uselocale(__old); | ||
683 | +#endif | ||
684 | + return __ret; | ||
685 | + } | ||
686 | + | ||
687 | + int | ||
688 | + codecvt<wchar_t, char, mbstate_t>:: | ||
689 | + do_max_length() const throw() | ||
690 | + { | ||
691 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
692 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
693 | +#endif | ||
694 | + // XXX Probably wrong for stateful encodings. | ||
695 | + int __ret = MB_CUR_MAX; | ||
696 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
697 | + __uselocale(__old); | ||
698 | +#endif | ||
699 | + return __ret; | ||
700 | + } | ||
701 | + | ||
702 | + int | ||
703 | + codecvt<wchar_t, char, mbstate_t>:: | ||
704 | + do_length(state_type& __state, const extern_type* __from, | ||
705 | + const extern_type* __end, size_t __max) const | ||
706 | + { | ||
707 | + int __ret = 0; | ||
708 | + state_type __tmp_state(__state); | ||
709 | + | ||
710 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
711 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
712 | +#endif | ||
713 | + | ||
714 | + // mbsnrtowcs is *very* fast but stops if encounters NUL characters: | ||
715 | + // in case we advance past it and then continue, in a loop. | ||
716 | + // NB: mbsnrtowcs is a GNU extension | ||
717 | + | ||
718 | + // A dummy internal buffer is needed in order for mbsnrtocws to consider | ||
719 | + // its fourth parameter (it wouldn't with NULL as first parameter). | ||
720 | + wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) | ||
721 | + * __max)); | ||
722 | + while (__from < __end && __max) | ||
723 | + { | ||
724 | + const extern_type* __from_chunk_end; | ||
725 | + __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', | ||
726 | + __end | ||
727 | + - __from)); | ||
728 | + if (!__from_chunk_end) | ||
729 | + __from_chunk_end = __end; | ||
730 | + | ||
731 | + const extern_type* __tmp_from = __from; | ||
732 | + size_t __conv = mbsnrtowcs(__to, &__from, | ||
733 | + __from_chunk_end - __from, | ||
734 | + __max, &__state); | ||
735 | + if (__conv == static_cast<size_t>(-1)) | ||
736 | + { | ||
737 | + // In case of error, in order to stop at the exact place we | ||
738 | + // have to start again from the beginning with a series of | ||
739 | + // mbrtowc. | ||
740 | + for (__from = __tmp_from;; __from += __conv) | ||
741 | + { | ||
742 | + __conv = mbrtowc(NULL, __from, __end - __from, | ||
743 | + &__tmp_state); | ||
744 | + if (__conv == static_cast<size_t>(-1) | ||
745 | + || __conv == static_cast<size_t>(-2)) | ||
746 | + break; | ||
747 | + } | ||
748 | + __state = __tmp_state; | ||
749 | + __ret += __from - __tmp_from; | ||
750 | + break; | ||
751 | + } | ||
752 | + if (!__from) | ||
753 | + __from = __from_chunk_end; | ||
754 | + | ||
755 | + __ret += __from - __tmp_from; | ||
756 | + __max -= __conv; | ||
757 | + | ||
758 | + if (__from < __end && __max) | ||
759 | + { | ||
760 | + // XXX Probably wrong for stateful encodings | ||
761 | + __tmp_state = __state; | ||
762 | + ++__from; | ||
763 | + ++__ret; | ||
764 | + --__max; | ||
765 | + } | ||
766 | + } | ||
767 | + | ||
768 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
769 | + __uselocale(__old); | ||
770 | +#endif | ||
771 | + | ||
772 | + return __ret; | ||
773 | + } | ||
774 | +#endif | ||
775 | +} | ||
776 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc | ||
777 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
778 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
779 | @@ -0,0 +1,80 @@ | ||
780 | +// std::collate implementation details, GNU version -*- C++ -*- | ||
781 | + | ||
782 | +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. | ||
783 | +// | ||
784 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
785 | +// software; you can redistribute it and/or modify it under the | ||
786 | +// terms of the GNU General Public License as published by the | ||
787 | +// Free Software Foundation; either version 2, or (at your option) | ||
788 | +// any later version. | ||
789 | + | ||
790 | +// This library is distributed in the hope that it will be useful, | ||
791 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
792 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
793 | +// GNU General Public License for more details. | ||
794 | + | ||
795 | +// You should have received a copy of the GNU General Public License along | ||
796 | +// with this library; see the file COPYING. If not, write to the Free | ||
797 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
798 | +// USA. | ||
799 | + | ||
800 | +// As a special exception, you may use this file as part of a free software | ||
801 | +// library without restriction. Specifically, if other files instantiate | ||
802 | +// templates or use macros or inline functions from this file, or you compile | ||
803 | +// this file and link it with other files to produce an executable, this | ||
804 | +// file does not by itself cause the resulting executable to be covered by | ||
805 | +// the GNU General Public License. This exception does not however | ||
806 | +// invalidate any other reasons why the executable file might be covered by | ||
807 | +// the GNU General Public License. | ||
808 | + | ||
809 | +// | ||
810 | +// ISO C++ 14882: 22.2.4.1.2 collate virtual functions | ||
811 | +// | ||
812 | + | ||
813 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
814 | + | ||
815 | +#include <locale> | ||
816 | +#include <bits/c++locale_internal.h> | ||
817 | + | ||
818 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
819 | +#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) | ||
820 | +#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) | ||
821 | +#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) | ||
822 | +#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) | ||
823 | +#endif | ||
824 | + | ||
825 | +namespace std | ||
826 | +{ | ||
827 | + // These are basically extensions to char_traits, and perhaps should | ||
828 | + // be put there instead of here. | ||
829 | + template<> | ||
830 | + int | ||
831 | + collate<char>::_M_compare(const char* __one, const char* __two) const | ||
832 | + { | ||
833 | + int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); | ||
834 | + return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); | ||
835 | + } | ||
836 | + | ||
837 | + template<> | ||
838 | + size_t | ||
839 | + collate<char>::_M_transform(char* __to, const char* __from, | ||
840 | + size_t __n) const | ||
841 | + { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } | ||
842 | + | ||
843 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
844 | + template<> | ||
845 | + int | ||
846 | + collate<wchar_t>::_M_compare(const wchar_t* __one, | ||
847 | + const wchar_t* __two) const | ||
848 | + { | ||
849 | + int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); | ||
850 | + return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); | ||
851 | + } | ||
852 | + | ||
853 | + template<> | ||
854 | + size_t | ||
855 | + collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, | ||
856 | + size_t __n) const | ||
857 | + { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } | ||
858 | +#endif | ||
859 | +} | ||
860 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc | ||
861 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
862 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
863 | @@ -0,0 +1,300 @@ | ||
864 | +// std::ctype implementation details, GNU version -*- C++ -*- | ||
865 | + | ||
866 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
867 | +// | ||
868 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
869 | +// software; you can redistribute it and/or modify it under the | ||
870 | +// terms of the GNU General Public License as published by the | ||
871 | +// Free Software Foundation; either version 2, or (at your option) | ||
872 | +// any later version. | ||
873 | + | ||
874 | +// This library is distributed in the hope that it will be useful, | ||
875 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
876 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
877 | +// GNU General Public License for more details. | ||
878 | + | ||
879 | +// You should have received a copy of the GNU General Public License along | ||
880 | +// with this library; see the file COPYING. If not, write to the Free | ||
881 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
882 | +// USA. | ||
883 | + | ||
884 | +// As a special exception, you may use this file as part of a free software | ||
885 | +// library without restriction. Specifically, if other files instantiate | ||
886 | +// templates or use macros or inline functions from this file, or you compile | ||
887 | +// this file and link it with other files to produce an executable, this | ||
888 | +// file does not by itself cause the resulting executable to be covered by | ||
889 | +// the GNU General Public License. This exception does not however | ||
890 | +// invalidate any other reasons why the executable file might be covered by | ||
891 | +// the GNU General Public License. | ||
892 | + | ||
893 | +// | ||
894 | +// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. | ||
895 | +// | ||
896 | + | ||
897 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
898 | + | ||
899 | +#define _LIBC | ||
900 | +#include <locale> | ||
901 | +#undef _LIBC | ||
902 | +#include <bits/c++locale_internal.h> | ||
903 | + | ||
904 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
905 | +#define __wctype_l(S, L) wctype((S)) | ||
906 | +#define __towupper_l(C, L) towupper((C)) | ||
907 | +#define __towlower_l(C, L) towlower((C)) | ||
908 | +#define __iswctype_l(C, M, L) iswctype((C), (M)) | ||
909 | +#endif | ||
910 | + | ||
911 | +namespace std | ||
912 | +{ | ||
913 | + // NB: The other ctype<char> specializations are in src/locale.cc and | ||
914 | + // various /config/os/* files. | ||
915 | + template<> | ||
916 | + ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) | ||
917 | + : ctype<char>(0, false, __refs) | ||
918 | + { | ||
919 | + if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) | ||
920 | + { | ||
921 | + this->_S_destroy_c_locale(this->_M_c_locale_ctype); | ||
922 | + this->_S_create_c_locale(this->_M_c_locale_ctype, __s); | ||
923 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
924 | + this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; | ||
925 | + this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; | ||
926 | + this->_M_table = this->_M_c_locale_ctype->__ctype_b; | ||
927 | +#endif | ||
928 | + } | ||
929 | + } | ||
930 | + | ||
931 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
932 | + ctype<wchar_t>::__wmask_type | ||
933 | + ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const | ||
934 | + { | ||
935 | + __wmask_type __ret; | ||
936 | + switch (__m) | ||
937 | + { | ||
938 | + case space: | ||
939 | + __ret = __wctype_l("space", _M_c_locale_ctype); | ||
940 | + break; | ||
941 | + case print: | ||
942 | + __ret = __wctype_l("print", _M_c_locale_ctype); | ||
943 | + break; | ||
944 | + case cntrl: | ||
945 | + __ret = __wctype_l("cntrl", _M_c_locale_ctype); | ||
946 | + break; | ||
947 | + case upper: | ||
948 | + __ret = __wctype_l("upper", _M_c_locale_ctype); | ||
949 | + break; | ||
950 | + case lower: | ||
951 | + __ret = __wctype_l("lower", _M_c_locale_ctype); | ||
952 | + break; | ||
953 | + case alpha: | ||
954 | + __ret = __wctype_l("alpha", _M_c_locale_ctype); | ||
955 | + break; | ||
956 | + case digit: | ||
957 | + __ret = __wctype_l("digit", _M_c_locale_ctype); | ||
958 | + break; | ||
959 | + case punct: | ||
960 | + __ret = __wctype_l("punct", _M_c_locale_ctype); | ||
961 | + break; | ||
962 | + case xdigit: | ||
963 | + __ret = __wctype_l("xdigit", _M_c_locale_ctype); | ||
964 | + break; | ||
965 | + case alnum: | ||
966 | + __ret = __wctype_l("alnum", _M_c_locale_ctype); | ||
967 | + break; | ||
968 | + case graph: | ||
969 | + __ret = __wctype_l("graph", _M_c_locale_ctype); | ||
970 | + break; | ||
971 | + default: | ||
972 | + __ret = 0; | ||
973 | + } | ||
974 | + return __ret; | ||
975 | + } | ||
976 | + | ||
977 | + wchar_t | ||
978 | + ctype<wchar_t>::do_toupper(wchar_t __c) const | ||
979 | + { return __towupper_l(__c, _M_c_locale_ctype); } | ||
980 | + | ||
981 | + const wchar_t* | ||
982 | + ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const | ||
983 | + { | ||
984 | + while (__lo < __hi) | ||
985 | + { | ||
986 | + *__lo = __towupper_l(*__lo, _M_c_locale_ctype); | ||
987 | + ++__lo; | ||
988 | + } | ||
989 | + return __hi; | ||
990 | + } | ||
991 | + | ||
992 | + wchar_t | ||
993 | + ctype<wchar_t>::do_tolower(wchar_t __c) const | ||
994 | + { return __towlower_l(__c, _M_c_locale_ctype); } | ||
995 | + | ||
996 | + const wchar_t* | ||
997 | + ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const | ||
998 | + { | ||
999 | + while (__lo < __hi) | ||
1000 | + { | ||
1001 | + *__lo = __towlower_l(*__lo, _M_c_locale_ctype); | ||
1002 | + ++__lo; | ||
1003 | + } | ||
1004 | + return __hi; | ||
1005 | + } | ||
1006 | + | ||
1007 | + bool | ||
1008 | + ctype<wchar_t>:: | ||
1009 | + do_is(mask __m, wchar_t __c) const | ||
1010 | + { | ||
1011 | + // Highest bitmask in ctype_base == 10, but extra in "C" | ||
1012 | + // library for blank. | ||
1013 | + bool __ret = false; | ||
1014 | + const size_t __bitmasksize = 11; | ||
1015 | + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
1016 | + if (__m & _M_bit[__bitcur] | ||
1017 | + && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
1018 | + { | ||
1019 | + __ret = true; | ||
1020 | + break; | ||
1021 | + } | ||
1022 | + return __ret; | ||
1023 | + } | ||
1024 | + | ||
1025 | + const wchar_t* | ||
1026 | + ctype<wchar_t>:: | ||
1027 | + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const | ||
1028 | + { | ||
1029 | + for (; __lo < __hi; ++__vec, ++__lo) | ||
1030 | + { | ||
1031 | + // Highest bitmask in ctype_base == 10, but extra in "C" | ||
1032 | + // library for blank. | ||
1033 | + const size_t __bitmasksize = 11; | ||
1034 | + mask __m = 0; | ||
1035 | + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
1036 | + if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
1037 | + __m |= _M_bit[__bitcur]; | ||
1038 | + *__vec = __m; | ||
1039 | + } | ||
1040 | + return __hi; | ||
1041 | + } | ||
1042 | + | ||
1043 | + const wchar_t* | ||
1044 | + ctype<wchar_t>:: | ||
1045 | + do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const | ||
1046 | + { | ||
1047 | + while (__lo < __hi && !this->do_is(__m, *__lo)) | ||
1048 | + ++__lo; | ||
1049 | + return __lo; | ||
1050 | + } | ||
1051 | + | ||
1052 | + const wchar_t* | ||
1053 | + ctype<wchar_t>:: | ||
1054 | + do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const | ||
1055 | + { | ||
1056 | + while (__lo < __hi && this->do_is(__m, *__lo) != 0) | ||
1057 | + ++__lo; | ||
1058 | + return __lo; | ||
1059 | + } | ||
1060 | + | ||
1061 | + wchar_t | ||
1062 | + ctype<wchar_t>:: | ||
1063 | + do_widen(char __c) const | ||
1064 | + { return _M_widen[static_cast<unsigned char>(__c)]; } | ||
1065 | + | ||
1066 | + const char* | ||
1067 | + ctype<wchar_t>:: | ||
1068 | + do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const | ||
1069 | + { | ||
1070 | + while (__lo < __hi) | ||
1071 | + { | ||
1072 | + *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; | ||
1073 | + ++__lo; | ||
1074 | + ++__dest; | ||
1075 | + } | ||
1076 | + return __hi; | ||
1077 | + } | ||
1078 | + | ||
1079 | + char | ||
1080 | + ctype<wchar_t>:: | ||
1081 | + do_narrow(wchar_t __wc, char __dfault) const | ||
1082 | + { | ||
1083 | + if (__wc >= 0 && __wc < 128 && _M_narrow_ok) | ||
1084 | + return _M_narrow[__wc]; | ||
1085 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1086 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1087 | +#endif | ||
1088 | + const int __c = wctob(__wc); | ||
1089 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1090 | + __uselocale(__old); | ||
1091 | +#endif | ||
1092 | + return (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1093 | + } | ||
1094 | + | ||
1095 | + const wchar_t* | ||
1096 | + ctype<wchar_t>:: | ||
1097 | + do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, | ||
1098 | + char* __dest) const | ||
1099 | + { | ||
1100 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1101 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1102 | +#endif | ||
1103 | + if (_M_narrow_ok) | ||
1104 | + while (__lo < __hi) | ||
1105 | + { | ||
1106 | + if (*__lo >= 0 && *__lo < 128) | ||
1107 | + *__dest = _M_narrow[*__lo]; | ||
1108 | + else | ||
1109 | + { | ||
1110 | + const int __c = wctob(*__lo); | ||
1111 | + *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1112 | + } | ||
1113 | + ++__lo; | ||
1114 | + ++__dest; | ||
1115 | + } | ||
1116 | + else | ||
1117 | + while (__lo < __hi) | ||
1118 | + { | ||
1119 | + const int __c = wctob(*__lo); | ||
1120 | + *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1121 | + ++__lo; | ||
1122 | + ++__dest; | ||
1123 | + } | ||
1124 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1125 | + __uselocale(__old); | ||
1126 | +#endif | ||
1127 | + return __hi; | ||
1128 | + } | ||
1129 | + | ||
1130 | + void | ||
1131 | + ctype<wchar_t>::_M_initialize_ctype() | ||
1132 | + { | ||
1133 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1134 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1135 | +#endif | ||
1136 | + wint_t __i; | ||
1137 | + for (__i = 0; __i < 128; ++__i) | ||
1138 | + { | ||
1139 | + const int __c = wctob(__i); | ||
1140 | + if (__c == EOF) | ||
1141 | + break; | ||
1142 | + else | ||
1143 | + _M_narrow[__i] = static_cast<char>(__c); | ||
1144 | + } | ||
1145 | + if (__i == 128) | ||
1146 | + _M_narrow_ok = true; | ||
1147 | + else | ||
1148 | + _M_narrow_ok = false; | ||
1149 | + for (size_t __j = 0; | ||
1150 | + __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) | ||
1151 | + _M_widen[__j] = btowc(__j); | ||
1152 | + | ||
1153 | + for (size_t __k = 0; __k <= 11; ++__k) | ||
1154 | + { | ||
1155 | + _M_bit[__k] = static_cast<mask>(_ISbit(__k)); | ||
1156 | + _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); | ||
1157 | + } | ||
1158 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1159 | + __uselocale(__old); | ||
1160 | +#endif | ||
1161 | + } | ||
1162 | +#endif // _GLIBCXX_USE_WCHAR_T | ||
1163 | +} | ||
1164 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc | ||
1165 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
1166 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
1167 | @@ -0,0 +1,100 @@ | ||
1168 | +// std::messages implementation details, GNU version -*- C++ -*- | ||
1169 | + | ||
1170 | +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. | ||
1171 | +// | ||
1172 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1173 | +// software; you can redistribute it and/or modify it under the | ||
1174 | +// terms of the GNU General Public License as published by the | ||
1175 | +// Free Software Foundation; either version 2, or (at your option) | ||
1176 | +// any later version. | ||
1177 | + | ||
1178 | +// This library is distributed in the hope that it will be useful, | ||
1179 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1180 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1181 | +// GNU General Public License for more details. | ||
1182 | + | ||
1183 | +// You should have received a copy of the GNU General Public License along | ||
1184 | +// with this library; see the file COPYING. If not, write to the Free | ||
1185 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
1186 | +// USA. | ||
1187 | + | ||
1188 | +// As a special exception, you may use this file as part of a free software | ||
1189 | +// library without restriction. Specifically, if other files instantiate | ||
1190 | +// templates or use macros or inline functions from this file, or you compile | ||
1191 | +// this file and link it with other files to produce an executable, this | ||
1192 | +// file does not by itself cause the resulting executable to be covered by | ||
1193 | +// the GNU General Public License. This exception does not however | ||
1194 | +// invalidate any other reasons why the executable file might be covered by | ||
1195 | +// the GNU General Public License. | ||
1196 | + | ||
1197 | +// | ||
1198 | +// ISO C++ 14882: 22.2.7.1.2 messages virtual functions | ||
1199 | +// | ||
1200 | + | ||
1201 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1202 | + | ||
1203 | +#include <locale> | ||
1204 | +#include <bits/c++locale_internal.h> | ||
1205 | + | ||
1206 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1207 | +#warning fix gettext stuff | ||
1208 | +#endif | ||
1209 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
1210 | +extern "C" char *__dcgettext(const char *domainname, | ||
1211 | + const char *msgid, int category); | ||
1212 | +#undef gettext | ||
1213 | +#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) | ||
1214 | +#else | ||
1215 | +#undef gettext | ||
1216 | +#define gettext(msgid) (msgid) | ||
1217 | +#endif | ||
1218 | + | ||
1219 | +namespace std | ||
1220 | +{ | ||
1221 | + // Specializations. | ||
1222 | + template<> | ||
1223 | + string | ||
1224 | + messages<char>::do_get(catalog, int, int, const string& __dfault) const | ||
1225 | + { | ||
1226 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1227 | + __c_locale __old = __uselocale(_M_c_locale_messages); | ||
1228 | + const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); | ||
1229 | + __uselocale(__old); | ||
1230 | + return string(__msg); | ||
1231 | +#elif defined __UCLIBC_HAS_LOCALE__ | ||
1232 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1233 | + setlocale(LC_ALL, _M_name_messages); | ||
1234 | + const char* __msg = gettext(__dfault.c_str()); | ||
1235 | + setlocale(LC_ALL, __old); | ||
1236 | + free(__old); | ||
1237 | + return string(__msg); | ||
1238 | +#else | ||
1239 | + const char* __msg = gettext(__dfault.c_str()); | ||
1240 | + return string(__msg); | ||
1241 | +#endif | ||
1242 | + } | ||
1243 | + | ||
1244 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
1245 | + template<> | ||
1246 | + wstring | ||
1247 | + messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const | ||
1248 | + { | ||
1249 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1250 | + __c_locale __old = __uselocale(_M_c_locale_messages); | ||
1251 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1252 | + __uselocale(__old); | ||
1253 | + return _M_convert_from_char(__msg); | ||
1254 | +# elif defined __UCLIBC_HAS_LOCALE__ | ||
1255 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1256 | + setlocale(LC_ALL, _M_name_messages); | ||
1257 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1258 | + setlocale(LC_ALL, __old); | ||
1259 | + free(__old); | ||
1260 | + return _M_convert_from_char(__msg); | ||
1261 | +# else | ||
1262 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1263 | + return _M_convert_from_char(__msg); | ||
1264 | +# endif | ||
1265 | + } | ||
1266 | +#endif | ||
1267 | +} | ||
1268 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h | ||
1269 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 | ||
1270 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 | ||
1271 | @@ -0,0 +1,118 @@ | ||
1272 | +// std::messages implementation details, GNU version -*- C++ -*- | ||
1273 | + | ||
1274 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
1275 | +// | ||
1276 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1277 | +// software; you can redistribute it and/or modify it under the | ||
1278 | +// terms of the GNU General Public License as published by the | ||
1279 | +// Free Software Foundation; either version 2, or (at your option) | ||
1280 | +// any later version. | ||
1281 | + | ||
1282 | +// This library is distributed in the hope that it will be useful, | ||
1283 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1284 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1285 | +// GNU General Public License for more details. | ||
1286 | + | ||
1287 | +// You should have received a copy of the GNU General Public License along | ||
1288 | +// with this library; see the file COPYING. If not, write to the Free | ||
1289 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
1290 | +// USA. | ||
1291 | + | ||
1292 | +// As a special exception, you may use this file as part of a free software | ||
1293 | +// library without restriction. Specifically, if other files instantiate | ||
1294 | +// templates or use macros or inline functions from this file, or you compile | ||
1295 | +// this file and link it with other files to produce an executable, this | ||
1296 | +// file does not by itself cause the resulting executable to be covered by | ||
1297 | +// the GNU General Public License. This exception does not however | ||
1298 | +// invalidate any other reasons why the executable file might be covered by | ||
1299 | +// the GNU General Public License. | ||
1300 | + | ||
1301 | +// | ||
1302 | +// ISO C++ 14882: 22.2.7.1.2 messages functions | ||
1303 | +// | ||
1304 | + | ||
1305 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1306 | + | ||
1307 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1308 | +#warning fix prototypes for *textdomain funcs | ||
1309 | +#endif | ||
1310 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
1311 | +extern "C" char *__textdomain(const char *domainname); | ||
1312 | +extern "C" char *__bindtextdomain(const char *domainname, | ||
1313 | + const char *dirname); | ||
1314 | +#else | ||
1315 | +#undef __textdomain | ||
1316 | +#undef __bindtextdomain | ||
1317 | +#define __textdomain(D) ((void)0) | ||
1318 | +#define __bindtextdomain(D,P) ((void)0) | ||
1319 | +#endif | ||
1320 | + | ||
1321 | + // Non-virtual member functions. | ||
1322 | + template<typename _CharT> | ||
1323 | + messages<_CharT>::messages(size_t __refs) | ||
1324 | + : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), | ||
1325 | + _M_name_messages(_S_get_c_name()) | ||
1326 | + { } | ||
1327 | + | ||
1328 | + template<typename _CharT> | ||
1329 | + messages<_CharT>::messages(__c_locale __cloc, const char* __s, | ||
1330 | + size_t __refs) | ||
1331 | + : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), | ||
1332 | + _M_name_messages(__s) | ||
1333 | + { | ||
1334 | + char* __tmp = new char[std::strlen(__s) + 1]; | ||
1335 | + std::strcpy(__tmp, __s); | ||
1336 | + _M_name_messages = __tmp; | ||
1337 | + } | ||
1338 | + | ||
1339 | + template<typename _CharT> | ||
1340 | + typename messages<_CharT>::catalog | ||
1341 | + messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | ||
1342 | + const char* __dir) const | ||
1343 | + { | ||
1344 | + __bindtextdomain(__s.c_str(), __dir); | ||
1345 | + return this->do_open(__s, __loc); | ||
1346 | + } | ||
1347 | + | ||
1348 | + // Virtual member functions. | ||
1349 | + template<typename _CharT> | ||
1350 | + messages<_CharT>::~messages() | ||
1351 | + { | ||
1352 | + if (_M_name_messages != _S_get_c_name()) | ||
1353 | + delete [] _M_name_messages; | ||
1354 | + _S_destroy_c_locale(_M_c_locale_messages); | ||
1355 | + } | ||
1356 | + | ||
1357 | + template<typename _CharT> | ||
1358 | + typename messages<_CharT>::catalog | ||
1359 | + messages<_CharT>::do_open(const basic_string<char>& __s, | ||
1360 | + const locale&) const | ||
1361 | + { | ||
1362 | + // No error checking is done, assume the catalog exists and can | ||
1363 | + // be used. | ||
1364 | + __textdomain(__s.c_str()); | ||
1365 | + return 0; | ||
1366 | + } | ||
1367 | + | ||
1368 | + template<typename _CharT> | ||
1369 | + void | ||
1370 | + messages<_CharT>::do_close(catalog) const | ||
1371 | + { } | ||
1372 | + | ||
1373 | + // messages_byname | ||
1374 | + template<typename _CharT> | ||
1375 | + messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | ||
1376 | + : messages<_CharT>(__refs) | ||
1377 | + { | ||
1378 | + if (this->_M_name_messages != locale::facet::_S_get_c_name()) | ||
1379 | + delete [] this->_M_name_messages; | ||
1380 | + char* __tmp = new char[std::strlen(__s) + 1]; | ||
1381 | + std::strcpy(__tmp, __s); | ||
1382 | + this->_M_name_messages = __tmp; | ||
1383 | + | ||
1384 | + if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) | ||
1385 | + { | ||
1386 | + this->_S_destroy_c_locale(this->_M_c_locale_messages); | ||
1387 | + this->_S_create_c_locale(this->_M_c_locale_messages, __s); | ||
1388 | + } | ||
1389 | + } | ||
1390 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc | ||
1391 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
1392 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
1393 | @@ -0,0 +1,698 @@ | ||
1394 | +// std::moneypunct implementation details, GNU version -*- C++ -*- | ||
1395 | + | ||
1396 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
1397 | +// | ||
1398 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1399 | +// software; you can redistribute it and/or modify it under the | ||
1400 | +// terms of the GNU General Public License as published by the | ||
1401 | +// Free Software Foundation; either version 2, or (at your option) | ||
1402 | +// any later version. | ||
1403 | + | ||
1404 | +// This library is distributed in the hope that it will be useful, | ||
1405 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1406 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1407 | +// GNU General Public License for more details. | ||
1408 | + | ||
1409 | +// You should have received a copy of the GNU General Public License along | ||
1410 | +// with this library; see the file COPYING. If not, write to the Free | ||
1411 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
1412 | +// USA. | ||
1413 | + | ||
1414 | +// As a special exception, you may use this file as part of a free software | ||
1415 | +// library without restriction. Specifically, if other files instantiate | ||
1416 | +// templates or use macros or inline functions from this file, or you compile | ||
1417 | +// this file and link it with other files to produce an executable, this | ||
1418 | +// file does not by itself cause the resulting executable to be covered by | ||
1419 | +// the GNU General Public License. This exception does not however | ||
1420 | +// invalidate any other reasons why the executable file might be covered by | ||
1421 | +// the GNU General Public License. | ||
1422 | + | ||
1423 | +// | ||
1424 | +// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions | ||
1425 | +// | ||
1426 | + | ||
1427 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1428 | + | ||
1429 | +#define _LIBC | ||
1430 | +#include <locale> | ||
1431 | +#undef _LIBC | ||
1432 | +#include <bits/c++locale_internal.h> | ||
1433 | + | ||
1434 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1435 | +#warning optimize this for uclibc | ||
1436 | +#warning tailor for stub locale support | ||
1437 | +#endif | ||
1438 | + | ||
1439 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
1440 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
1441 | +#endif | ||
1442 | + | ||
1443 | +namespace std | ||
1444 | +{ | ||
1445 | + // Construct and return valid pattern consisting of some combination of: | ||
1446 | + // space none symbol sign value | ||
1447 | + money_base::pattern | ||
1448 | + money_base::_S_construct_pattern(char __precedes, char __space, char __posn) | ||
1449 | + { | ||
1450 | + pattern __ret; | ||
1451 | + | ||
1452 | + // This insanely complicated routine attempts to construct a valid | ||
1453 | + // pattern for use with monyepunct. A couple of invariants: | ||
1454 | + | ||
1455 | + // if (__precedes) symbol -> value | ||
1456 | + // else value -> symbol | ||
1457 | + | ||
1458 | + // if (__space) space | ||
1459 | + // else none | ||
1460 | + | ||
1461 | + // none == never first | ||
1462 | + // space never first or last | ||
1463 | + | ||
1464 | + // Any elegant implementations of this are welcome. | ||
1465 | + switch (__posn) | ||
1466 | + { | ||
1467 | + case 0: | ||
1468 | + case 1: | ||
1469 | + // 1 The sign precedes the value and symbol. | ||
1470 | + __ret.field[0] = sign; | ||
1471 | + if (__space) | ||
1472 | + { | ||
1473 | + // Pattern starts with sign. | ||
1474 | + if (__precedes) | ||
1475 | + { | ||
1476 | + __ret.field[1] = symbol; | ||
1477 | + __ret.field[3] = value; | ||
1478 | + } | ||
1479 | + else | ||
1480 | + { | ||
1481 | + __ret.field[1] = value; | ||
1482 | + __ret.field[3] = symbol; | ||
1483 | + } | ||
1484 | + __ret.field[2] = space; | ||
1485 | + } | ||
1486 | + else | ||
1487 | + { | ||
1488 | + // Pattern starts with sign and ends with none. | ||
1489 | + if (__precedes) | ||
1490 | + { | ||
1491 | + __ret.field[1] = symbol; | ||
1492 | + __ret.field[2] = value; | ||
1493 | + } | ||
1494 | + else | ||
1495 | + { | ||
1496 | + __ret.field[1] = value; | ||
1497 | + __ret.field[2] = symbol; | ||
1498 | + } | ||
1499 | + __ret.field[3] = none; | ||
1500 | + } | ||
1501 | + break; | ||
1502 | + case 2: | ||
1503 | + // 2 The sign follows the value and symbol. | ||
1504 | + if (__space) | ||
1505 | + { | ||
1506 | + // Pattern either ends with sign. | ||
1507 | + if (__precedes) | ||
1508 | + { | ||
1509 | + __ret.field[0] = symbol; | ||
1510 | + __ret.field[2] = value; | ||
1511 | + } | ||
1512 | + else | ||
1513 | + { | ||
1514 | + __ret.field[0] = value; | ||
1515 | + __ret.field[2] = symbol; | ||
1516 | + } | ||
1517 | + __ret.field[1] = space; | ||
1518 | + __ret.field[3] = sign; | ||
1519 | + } | ||
1520 | + else | ||
1521 | + { | ||
1522 | + // Pattern ends with sign then none. | ||
1523 | + if (__precedes) | ||
1524 | + { | ||
1525 | + __ret.field[0] = symbol; | ||
1526 | + __ret.field[1] = value; | ||
1527 | + } | ||
1528 | + else | ||
1529 | + { | ||
1530 | + __ret.field[0] = value; | ||
1531 | + __ret.field[1] = symbol; | ||
1532 | + } | ||
1533 | + __ret.field[2] = sign; | ||
1534 | + __ret.field[3] = none; | ||
1535 | + } | ||
1536 | + break; | ||
1537 | + case 3: | ||
1538 | + // 3 The sign immediately precedes the symbol. | ||
1539 | + if (__precedes) | ||
1540 | + { | ||
1541 | + __ret.field[0] = sign; | ||
1542 | + __ret.field[1] = symbol; | ||
1543 | + if (__space) | ||
1544 | + { | ||
1545 | + __ret.field[2] = space; | ||
1546 | + __ret.field[3] = value; | ||
1547 | + } | ||
1548 | + else | ||
1549 | + { | ||
1550 | + __ret.field[2] = value; | ||
1551 | + __ret.field[3] = none; | ||
1552 | + } | ||
1553 | + } | ||
1554 | + else | ||
1555 | + { | ||
1556 | + __ret.field[0] = value; | ||
1557 | + if (__space) | ||
1558 | + { | ||
1559 | + __ret.field[1] = space; | ||
1560 | + __ret.field[2] = sign; | ||
1561 | + __ret.field[3] = symbol; | ||
1562 | + } | ||
1563 | + else | ||
1564 | + { | ||
1565 | + __ret.field[1] = sign; | ||
1566 | + __ret.field[2] = symbol; | ||
1567 | + __ret.field[3] = none; | ||
1568 | + } | ||
1569 | + } | ||
1570 | + break; | ||
1571 | + case 4: | ||
1572 | + // 4 The sign immediately follows the symbol. | ||
1573 | + if (__precedes) | ||
1574 | + { | ||
1575 | + __ret.field[0] = symbol; | ||
1576 | + __ret.field[1] = sign; | ||
1577 | + if (__space) | ||
1578 | + { | ||
1579 | + __ret.field[2] = space; | ||
1580 | + __ret.field[3] = value; | ||
1581 | + } | ||
1582 | + else | ||
1583 | + { | ||
1584 | + __ret.field[2] = value; | ||
1585 | + __ret.field[3] = none; | ||
1586 | + } | ||
1587 | + } | ||
1588 | + else | ||
1589 | + { | ||
1590 | + __ret.field[0] = value; | ||
1591 | + if (__space) | ||
1592 | + { | ||
1593 | + __ret.field[1] = space; | ||
1594 | + __ret.field[2] = symbol; | ||
1595 | + __ret.field[3] = sign; | ||
1596 | + } | ||
1597 | + else | ||
1598 | + { | ||
1599 | + __ret.field[1] = symbol; | ||
1600 | + __ret.field[2] = sign; | ||
1601 | + __ret.field[3] = none; | ||
1602 | + } | ||
1603 | + } | ||
1604 | + break; | ||
1605 | + default: | ||
1606 | + ; | ||
1607 | + } | ||
1608 | + return __ret; | ||
1609 | + } | ||
1610 | + | ||
1611 | + template<> | ||
1612 | + void | ||
1613 | + moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1614 | + const char*) | ||
1615 | + { | ||
1616 | + if (!_M_data) | ||
1617 | + _M_data = new __moneypunct_cache<char, true>; | ||
1618 | + | ||
1619 | + if (!__cloc) | ||
1620 | + { | ||
1621 | + // "C" locale | ||
1622 | + _M_data->_M_decimal_point = '.'; | ||
1623 | + _M_data->_M_thousands_sep = ','; | ||
1624 | + _M_data->_M_grouping = ""; | ||
1625 | + _M_data->_M_grouping_size = 0; | ||
1626 | + _M_data->_M_curr_symbol = ""; | ||
1627 | + _M_data->_M_curr_symbol_size = 0; | ||
1628 | + _M_data->_M_positive_sign = ""; | ||
1629 | + _M_data->_M_positive_sign_size = 0; | ||
1630 | + _M_data->_M_negative_sign = ""; | ||
1631 | + _M_data->_M_negative_sign_size = 0; | ||
1632 | + _M_data->_M_frac_digits = 0; | ||
1633 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1634 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1635 | + | ||
1636 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1637 | + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; | ||
1638 | + } | ||
1639 | + else | ||
1640 | + { | ||
1641 | + // Named locale. | ||
1642 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, | ||
1643 | + __cloc)); | ||
1644 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, | ||
1645 | + __cloc)); | ||
1646 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1647 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1648 | + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1649 | + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); | ||
1650 | + | ||
1651 | + char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); | ||
1652 | + if (!__nposn) | ||
1653 | + _M_data->_M_negative_sign = "()"; | ||
1654 | + else | ||
1655 | + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, | ||
1656 | + __cloc); | ||
1657 | + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); | ||
1658 | + | ||
1659 | + // _Intl == true | ||
1660 | + _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); | ||
1661 | + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); | ||
1662 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, | ||
1663 | + __cloc)); | ||
1664 | + char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); | ||
1665 | + char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); | ||
1666 | + char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); | ||
1667 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1668 | + __pposn); | ||
1669 | + char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); | ||
1670 | + char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); | ||
1671 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1672 | + __nposn); | ||
1673 | + } | ||
1674 | + } | ||
1675 | + | ||
1676 | + template<> | ||
1677 | + void | ||
1678 | + moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1679 | + const char*) | ||
1680 | + { | ||
1681 | + if (!_M_data) | ||
1682 | + _M_data = new __moneypunct_cache<char, false>; | ||
1683 | + | ||
1684 | + if (!__cloc) | ||
1685 | + { | ||
1686 | + // "C" locale | ||
1687 | + _M_data->_M_decimal_point = '.'; | ||
1688 | + _M_data->_M_thousands_sep = ','; | ||
1689 | + _M_data->_M_grouping = ""; | ||
1690 | + _M_data->_M_grouping_size = 0; | ||
1691 | + _M_data->_M_curr_symbol = ""; | ||
1692 | + _M_data->_M_curr_symbol_size = 0; | ||
1693 | + _M_data->_M_positive_sign = ""; | ||
1694 | + _M_data->_M_positive_sign_size = 0; | ||
1695 | + _M_data->_M_negative_sign = ""; | ||
1696 | + _M_data->_M_negative_sign_size = 0; | ||
1697 | + _M_data->_M_frac_digits = 0; | ||
1698 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1699 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1700 | + | ||
1701 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1702 | + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; | ||
1703 | + } | ||
1704 | + else | ||
1705 | + { | ||
1706 | + // Named locale. | ||
1707 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, | ||
1708 | + __cloc)); | ||
1709 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, | ||
1710 | + __cloc)); | ||
1711 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1712 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1713 | + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1714 | + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); | ||
1715 | + | ||
1716 | + char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); | ||
1717 | + if (!__nposn) | ||
1718 | + _M_data->_M_negative_sign = "()"; | ||
1719 | + else | ||
1720 | + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, | ||
1721 | + __cloc); | ||
1722 | + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); | ||
1723 | + | ||
1724 | + // _Intl == false | ||
1725 | + _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); | ||
1726 | + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); | ||
1727 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); | ||
1728 | + char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); | ||
1729 | + char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); | ||
1730 | + char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); | ||
1731 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1732 | + __pposn); | ||
1733 | + char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); | ||
1734 | + char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); | ||
1735 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1736 | + __nposn); | ||
1737 | + } | ||
1738 | + } | ||
1739 | + | ||
1740 | + template<> | ||
1741 | + moneypunct<char, true>::~moneypunct() | ||
1742 | + { delete _M_data; } | ||
1743 | + | ||
1744 | + template<> | ||
1745 | + moneypunct<char, false>::~moneypunct() | ||
1746 | + { delete _M_data; } | ||
1747 | + | ||
1748 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
1749 | + template<> | ||
1750 | + void | ||
1751 | + moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1752 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1753 | + const char*) | ||
1754 | +#else | ||
1755 | + const char* __name) | ||
1756 | +#endif | ||
1757 | + { | ||
1758 | + if (!_M_data) | ||
1759 | + _M_data = new __moneypunct_cache<wchar_t, true>; | ||
1760 | + | ||
1761 | + if (!__cloc) | ||
1762 | + { | ||
1763 | + // "C" locale | ||
1764 | + _M_data->_M_decimal_point = L'.'; | ||
1765 | + _M_data->_M_thousands_sep = L','; | ||
1766 | + _M_data->_M_grouping = ""; | ||
1767 | + _M_data->_M_grouping_size = 0; | ||
1768 | + _M_data->_M_curr_symbol = L""; | ||
1769 | + _M_data->_M_curr_symbol_size = 0; | ||
1770 | + _M_data->_M_positive_sign = L""; | ||
1771 | + _M_data->_M_positive_sign_size = 0; | ||
1772 | + _M_data->_M_negative_sign = L""; | ||
1773 | + _M_data->_M_negative_sign_size = 0; | ||
1774 | + _M_data->_M_frac_digits = 0; | ||
1775 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1776 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1777 | + | ||
1778 | + // Use ctype::widen code without the facet... | ||
1779 | + unsigned char uc; | ||
1780 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1781 | + { | ||
1782 | + uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); | ||
1783 | + _M_data->_M_atoms[__i] = btowc(uc); | ||
1784 | + } | ||
1785 | + } | ||
1786 | + else | ||
1787 | + { | ||
1788 | + // Named locale. | ||
1789 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1790 | + __c_locale __old = __uselocale(__cloc); | ||
1791 | +#else | ||
1792 | + // Switch to named locale so that mbsrtowcs will work. | ||
1793 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1794 | + setlocale(LC_ALL, __name); | ||
1795 | +#endif | ||
1796 | + | ||
1797 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1798 | +#warning fix this... should be monetary | ||
1799 | +#endif | ||
1800 | +#ifdef __UCLIBC__ | ||
1801 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1802 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
1803 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
1804 | +# else | ||
1805 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
1806 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
1807 | +# endif | ||
1808 | +#else | ||
1809 | + union __s_and_w { const char *__s; unsigned int __w; } __u; | ||
1810 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); | ||
1811 | + _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); | ||
1812 | + | ||
1813 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); | ||
1814 | + _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); | ||
1815 | +#endif | ||
1816 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1817 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1818 | + | ||
1819 | + const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1820 | + const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); | ||
1821 | + const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); | ||
1822 | + | ||
1823 | + wchar_t* __wcs_ps = 0; | ||
1824 | + wchar_t* __wcs_ns = 0; | ||
1825 | + const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); | ||
1826 | + try | ||
1827 | + { | ||
1828 | + mbstate_t __state; | ||
1829 | + size_t __len = strlen(__cpossign); | ||
1830 | + if (__len) | ||
1831 | + { | ||
1832 | + ++__len; | ||
1833 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1834 | + __wcs_ps = new wchar_t[__len]; | ||
1835 | + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); | ||
1836 | + _M_data->_M_positive_sign = __wcs_ps; | ||
1837 | + } | ||
1838 | + else | ||
1839 | + _M_data->_M_positive_sign = L""; | ||
1840 | + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); | ||
1841 | + | ||
1842 | + __len = strlen(__cnegsign); | ||
1843 | + if (!__nposn) | ||
1844 | + _M_data->_M_negative_sign = L"()"; | ||
1845 | + else if (__len) | ||
1846 | + { | ||
1847 | + ++__len; | ||
1848 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1849 | + __wcs_ns = new wchar_t[__len]; | ||
1850 | + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); | ||
1851 | + _M_data->_M_negative_sign = __wcs_ns; | ||
1852 | + } | ||
1853 | + else | ||
1854 | + _M_data->_M_negative_sign = L""; | ||
1855 | + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); | ||
1856 | + | ||
1857 | + // _Intl == true. | ||
1858 | + __len = strlen(__ccurr); | ||
1859 | + if (__len) | ||
1860 | + { | ||
1861 | + ++__len; | ||
1862 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1863 | + wchar_t* __wcs = new wchar_t[__len]; | ||
1864 | + mbsrtowcs(__wcs, &__ccurr, __len, &__state); | ||
1865 | + _M_data->_M_curr_symbol = __wcs; | ||
1866 | + } | ||
1867 | + else | ||
1868 | + _M_data->_M_curr_symbol = L""; | ||
1869 | + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); | ||
1870 | + } | ||
1871 | + catch (...) | ||
1872 | + { | ||
1873 | + delete _M_data; | ||
1874 | + _M_data = 0; | ||
1875 | + delete __wcs_ps; | ||
1876 | + delete __wcs_ns; | ||
1877 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1878 | + __uselocale(__old); | ||
1879 | +#else | ||
1880 | + setlocale(LC_ALL, __old); | ||
1881 | + free(__old); | ||
1882 | +#endif | ||
1883 | + __throw_exception_again; | ||
1884 | + } | ||
1885 | + | ||
1886 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, | ||
1887 | + __cloc)); | ||
1888 | + char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); | ||
1889 | + char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); | ||
1890 | + char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); | ||
1891 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1892 | + __pposn); | ||
1893 | + char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); | ||
1894 | + char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); | ||
1895 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1896 | + __nposn); | ||
1897 | + | ||
1898 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1899 | + __uselocale(__old); | ||
1900 | +#else | ||
1901 | + setlocale(LC_ALL, __old); | ||
1902 | + free(__old); | ||
1903 | +#endif | ||
1904 | + } | ||
1905 | + } | ||
1906 | + | ||
1907 | + template<> | ||
1908 | + void | ||
1909 | + moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1910 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1911 | + const char*) | ||
1912 | +#else | ||
1913 | + const char* __name) | ||
1914 | +#endif | ||
1915 | + { | ||
1916 | + if (!_M_data) | ||
1917 | + _M_data = new __moneypunct_cache<wchar_t, false>; | ||
1918 | + | ||
1919 | + if (!__cloc) | ||
1920 | + { | ||
1921 | + // "C" locale | ||
1922 | + _M_data->_M_decimal_point = L'.'; | ||
1923 | + _M_data->_M_thousands_sep = L','; | ||
1924 | + _M_data->_M_grouping = ""; | ||
1925 | + _M_data->_M_grouping_size = 0; | ||
1926 | + _M_data->_M_curr_symbol = L""; | ||
1927 | + _M_data->_M_curr_symbol_size = 0; | ||
1928 | + _M_data->_M_positive_sign = L""; | ||
1929 | + _M_data->_M_positive_sign_size = 0; | ||
1930 | + _M_data->_M_negative_sign = L""; | ||
1931 | + _M_data->_M_negative_sign_size = 0; | ||
1932 | + _M_data->_M_frac_digits = 0; | ||
1933 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1934 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1935 | + | ||
1936 | + // Use ctype::widen code without the facet... | ||
1937 | + unsigned char uc; | ||
1938 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1939 | + { | ||
1940 | + uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); | ||
1941 | + _M_data->_M_atoms[__i] = btowc(uc); | ||
1942 | + } | ||
1943 | + } | ||
1944 | + else | ||
1945 | + { | ||
1946 | + // Named locale. | ||
1947 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1948 | + __c_locale __old = __uselocale(__cloc); | ||
1949 | +#else | ||
1950 | + // Switch to named locale so that mbsrtowcs will work. | ||
1951 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1952 | + setlocale(LC_ALL, __name); | ||
1953 | +#endif | ||
1954 | + | ||
1955 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1956 | +#warning fix this... should be monetary | ||
1957 | +#endif | ||
1958 | +#ifdef __UCLIBC__ | ||
1959 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1960 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
1961 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
1962 | +# else | ||
1963 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
1964 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
1965 | +# endif | ||
1966 | +#else | ||
1967 | + union __s_and_w { const char *__s; unsigned int __w; } __u; | ||
1968 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); | ||
1969 | + _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); | ||
1970 | + | ||
1971 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); | ||
1972 | + _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); | ||
1973 | +#endif | ||
1974 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1975 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1976 | + | ||
1977 | + const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1978 | + const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); | ||
1979 | + const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); | ||
1980 | + | ||
1981 | + wchar_t* __wcs_ps = 0; | ||
1982 | + wchar_t* __wcs_ns = 0; | ||
1983 | + const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); | ||
1984 | + try | ||
1985 | + { | ||
1986 | + mbstate_t __state; | ||
1987 | + size_t __len; | ||
1988 | + __len = strlen(__cpossign); | ||
1989 | + if (__len) | ||
1990 | + { | ||
1991 | + ++__len; | ||
1992 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1993 | + __wcs_ps = new wchar_t[__len]; | ||
1994 | + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); | ||
1995 | + _M_data->_M_positive_sign = __wcs_ps; | ||
1996 | + } | ||
1997 | + else | ||
1998 | + _M_data->_M_positive_sign = L""; | ||
1999 | + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); | ||
2000 | + | ||
2001 | + __len = strlen(__cnegsign); | ||
2002 | + if (!__nposn) | ||
2003 | + _M_data->_M_negative_sign = L"()"; | ||
2004 | + else if (__len) | ||
2005 | + { | ||
2006 | + ++__len; | ||
2007 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
2008 | + __wcs_ns = new wchar_t[__len]; | ||
2009 | + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); | ||
2010 | + _M_data->_M_negative_sign = __wcs_ns; | ||
2011 | + } | ||
2012 | + else | ||
2013 | + _M_data->_M_negative_sign = L""; | ||
2014 | + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); | ||
2015 | + | ||
2016 | + // _Intl == true. | ||
2017 | + __len = strlen(__ccurr); | ||
2018 | + if (__len) | ||
2019 | + { | ||
2020 | + ++__len; | ||
2021 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
2022 | + wchar_t* __wcs = new wchar_t[__len]; | ||
2023 | + mbsrtowcs(__wcs, &__ccurr, __len, &__state); | ||
2024 | + _M_data->_M_curr_symbol = __wcs; | ||
2025 | + } | ||
2026 | + else | ||
2027 | + _M_data->_M_curr_symbol = L""; | ||
2028 | + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); | ||
2029 | + } | ||
2030 | + catch (...) | ||
2031 | + { | ||
2032 | + delete _M_data; | ||
2033 | + _M_data = 0; | ||
2034 | + delete __wcs_ps; | ||
2035 | + delete __wcs_ns; | ||
2036 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2037 | + __uselocale(__old); | ||
2038 | +#else | ||
2039 | + setlocale(LC_ALL, __old); | ||
2040 | + free(__old); | ||
2041 | +#endif | ||
2042 | + __throw_exception_again; | ||
2043 | + } | ||
2044 | + | ||
2045 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); | ||
2046 | + char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); | ||
2047 | + char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); | ||
2048 | + char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); | ||
2049 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
2050 | + __pposn); | ||
2051 | + char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); | ||
2052 | + char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); | ||
2053 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
2054 | + __nposn); | ||
2055 | + | ||
2056 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2057 | + __uselocale(__old); | ||
2058 | +#else | ||
2059 | + setlocale(LC_ALL, __old); | ||
2060 | + free(__old); | ||
2061 | +#endif | ||
2062 | + } | ||
2063 | + } | ||
2064 | + | ||
2065 | + template<> | ||
2066 | + moneypunct<wchar_t, true>::~moneypunct() | ||
2067 | + { | ||
2068 | + if (_M_data->_M_positive_sign_size) | ||
2069 | + delete [] _M_data->_M_positive_sign; | ||
2070 | + if (_M_data->_M_negative_sign_size | ||
2071 | + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) | ||
2072 | + delete [] _M_data->_M_negative_sign; | ||
2073 | + if (_M_data->_M_curr_symbol_size) | ||
2074 | + delete [] _M_data->_M_curr_symbol; | ||
2075 | + delete _M_data; | ||
2076 | + } | ||
2077 | + | ||
2078 | + template<> | ||
2079 | + moneypunct<wchar_t, false>::~moneypunct() | ||
2080 | + { | ||
2081 | + if (_M_data->_M_positive_sign_size) | ||
2082 | + delete [] _M_data->_M_positive_sign; | ||
2083 | + if (_M_data->_M_negative_sign_size | ||
2084 | + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) | ||
2085 | + delete [] _M_data->_M_negative_sign; | ||
2086 | + if (_M_data->_M_curr_symbol_size) | ||
2087 | + delete [] _M_data->_M_curr_symbol; | ||
2088 | + delete _M_data; | ||
2089 | + } | ||
2090 | +#endif | ||
2091 | +} | ||
2092 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc | ||
2093 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
2094 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 | ||
2095 | @@ -0,0 +1,183 @@ | ||
2096 | +// std::numpunct implementation details, GNU version -*- C++ -*- | ||
2097 | + | ||
2098 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
2099 | +// | ||
2100 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2101 | +// software; you can redistribute it and/or modify it under the | ||
2102 | +// terms of the GNU General Public License as published by the | ||
2103 | +// Free Software Foundation; either version 2, or (at your option) | ||
2104 | +// any later version. | ||
2105 | + | ||
2106 | +// This library is distributed in the hope that it will be useful, | ||
2107 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2108 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2109 | +// GNU General Public License for more details. | ||
2110 | + | ||
2111 | +// You should have received a copy of the GNU General Public License along | ||
2112 | +// with this library; see the file COPYING. If not, write to the Free | ||
2113 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2114 | +// USA. | ||
2115 | + | ||
2116 | +// As a special exception, you may use this file as part of a free software | ||
2117 | +// library without restriction. Specifically, if other files instantiate | ||
2118 | +// templates or use macros or inline functions from this file, or you compile | ||
2119 | +// this file and link it with other files to produce an executable, this | ||
2120 | +// file does not by itself cause the resulting executable to be covered by | ||
2121 | +// the GNU General Public License. This exception does not however | ||
2122 | +// invalidate any other reasons why the executable file might be covered by | ||
2123 | +// the GNU General Public License. | ||
2124 | + | ||
2125 | +// | ||
2126 | +// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions | ||
2127 | +// | ||
2128 | + | ||
2129 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2130 | + | ||
2131 | +#define _LIBC | ||
2132 | +#include <locale> | ||
2133 | +#undef _LIBC | ||
2134 | +#include <bits/c++locale_internal.h> | ||
2135 | + | ||
2136 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2137 | +#warning tailor for stub locale support | ||
2138 | +#endif | ||
2139 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
2140 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
2141 | +#endif | ||
2142 | + | ||
2143 | +namespace std | ||
2144 | +{ | ||
2145 | + template<> | ||
2146 | + void | ||
2147 | + numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) | ||
2148 | + { | ||
2149 | + if (!_M_data) | ||
2150 | + _M_data = new __numpunct_cache<char>; | ||
2151 | + | ||
2152 | + if (!__cloc) | ||
2153 | + { | ||
2154 | + // "C" locale | ||
2155 | + _M_data->_M_grouping = ""; | ||
2156 | + _M_data->_M_grouping_size = 0; | ||
2157 | + _M_data->_M_use_grouping = false; | ||
2158 | + | ||
2159 | + _M_data->_M_decimal_point = '.'; | ||
2160 | + _M_data->_M_thousands_sep = ','; | ||
2161 | + | ||
2162 | + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) | ||
2163 | + _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; | ||
2164 | + | ||
2165 | + for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) | ||
2166 | + _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; | ||
2167 | + } | ||
2168 | + else | ||
2169 | + { | ||
2170 | + // Named locale. | ||
2171 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, | ||
2172 | + __cloc)); | ||
2173 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, | ||
2174 | + __cloc)); | ||
2175 | + | ||
2176 | + // Check for NULL, which implies no grouping. | ||
2177 | + if (_M_data->_M_thousands_sep == '\0') | ||
2178 | + _M_data->_M_grouping = ""; | ||
2179 | + else | ||
2180 | + _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); | ||
2181 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
2182 | + } | ||
2183 | + | ||
2184 | + // NB: There is no way to extact this info from posix locales. | ||
2185 | + // _M_truename = __nl_langinfo_l(YESSTR, __cloc); | ||
2186 | + _M_data->_M_truename = "true"; | ||
2187 | + _M_data->_M_truename_size = strlen(_M_data->_M_truename); | ||
2188 | + // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); | ||
2189 | + _M_data->_M_falsename = "false"; | ||
2190 | + _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); | ||
2191 | + } | ||
2192 | + | ||
2193 | + template<> | ||
2194 | + numpunct<char>::~numpunct() | ||
2195 | + { delete _M_data; } | ||
2196 | + | ||
2197 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
2198 | + template<> | ||
2199 | + void | ||
2200 | + numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) | ||
2201 | + { | ||
2202 | + if (!_M_data) | ||
2203 | + _M_data = new __numpunct_cache<wchar_t>; | ||
2204 | + | ||
2205 | + if (!__cloc) | ||
2206 | + { | ||
2207 | + // "C" locale | ||
2208 | + _M_data->_M_grouping = ""; | ||
2209 | + _M_data->_M_grouping_size = 0; | ||
2210 | + _M_data->_M_use_grouping = false; | ||
2211 | + | ||
2212 | + _M_data->_M_decimal_point = L'.'; | ||
2213 | + _M_data->_M_thousands_sep = L','; | ||
2214 | + | ||
2215 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2216 | + __c_locale __old = __uselocale(_S_get_c_locale()); | ||
2217 | +#endif | ||
2218 | + // Use ctype::widen code without the facet... | ||
2219 | + unsigned char uc; | ||
2220 | + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) | ||
2221 | + { | ||
2222 | + uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); | ||
2223 | + _M_data->_M_atoms_out[__i] = btowc(uc); | ||
2224 | + } | ||
2225 | + | ||
2226 | + for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) | ||
2227 | + { | ||
2228 | + uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]); | ||
2229 | + _M_data->_M_atoms_in[__j] = btowc(uc); | ||
2230 | + } | ||
2231 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2232 | + __uselocale(__old); | ||
2233 | +#endif | ||
2234 | + } | ||
2235 | + else | ||
2236 | + { | ||
2237 | + // Named locale. | ||
2238 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2239 | +#warning fix this | ||
2240 | +#endif | ||
2241 | +#ifdef __UCLIBC__ | ||
2242 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
2243 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
2244 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
2245 | +# else | ||
2246 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
2247 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
2248 | +# endif | ||
2249 | +#else | ||
2250 | + union __s_and_w { const char *__s; unsigned int __w; } __u; | ||
2251 | + __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); | ||
2252 | + _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); | ||
2253 | + | ||
2254 | + __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); | ||
2255 | + _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); | ||
2256 | +#endif | ||
2257 | + | ||
2258 | + if (_M_data->_M_thousands_sep == L'\0') | ||
2259 | + _M_data->_M_grouping = ""; | ||
2260 | + else | ||
2261 | + _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); | ||
2262 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
2263 | + } | ||
2264 | + | ||
2265 | + // NB: There is no way to extact this info from posix locales. | ||
2266 | + // _M_truename = __nl_langinfo_l(YESSTR, __cloc); | ||
2267 | + _M_data->_M_truename = L"true"; | ||
2268 | + _M_data->_M_truename_size = wcslen(_M_data->_M_truename); | ||
2269 | + // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); | ||
2270 | + _M_data->_M_falsename = L"false"; | ||
2271 | + _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); | ||
2272 | + } | ||
2273 | + | ||
2274 | + template<> | ||
2275 | + numpunct<wchar_t>::~numpunct() | ||
2276 | + { delete _M_data; } | ||
2277 | + #endif | ||
2278 | +} | ||
2279 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc | ||
2280 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 | ||
2281 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 | ||
2282 | @@ -0,0 +1,356 @@ | ||
2283 | +// std::time_get, std::time_put implementation, GNU version -*- C++ -*- | ||
2284 | + | ||
2285 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
2286 | +// | ||
2287 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2288 | +// software; you can redistribute it and/or modify it under the | ||
2289 | +// terms of the GNU General Public License as published by the | ||
2290 | +// Free Software Foundation; either version 2, or (at your option) | ||
2291 | +// any later version. | ||
2292 | + | ||
2293 | +// This library is distributed in the hope that it will be useful, | ||
2294 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2295 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2296 | +// GNU General Public License for more details. | ||
2297 | + | ||
2298 | +// You should have received a copy of the GNU General Public License along | ||
2299 | +// with this library; see the file COPYING. If not, write to the Free | ||
2300 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2301 | +// USA. | ||
2302 | + | ||
2303 | +// As a special exception, you may use this file as part of a free software | ||
2304 | +// library without restriction. Specifically, if other files instantiate | ||
2305 | +// templates or use macros or inline functions from this file, or you compile | ||
2306 | +// this file and link it with other files to produce an executable, this | ||
2307 | +// file does not by itself cause the resulting executable to be covered by | ||
2308 | +// the GNU General Public License. This exception does not however | ||
2309 | +// invalidate any other reasons why the executable file might be covered by | ||
2310 | +// the GNU General Public License. | ||
2311 | + | ||
2312 | +// | ||
2313 | +// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions | ||
2314 | +// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions | ||
2315 | +// | ||
2316 | + | ||
2317 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2318 | + | ||
2319 | +#include <locale> | ||
2320 | +#include <bits/c++locale_internal.h> | ||
2321 | + | ||
2322 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2323 | +#warning tailor for stub locale support | ||
2324 | +#endif | ||
2325 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
2326 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
2327 | +#endif | ||
2328 | + | ||
2329 | +namespace std | ||
2330 | +{ | ||
2331 | + template<> | ||
2332 | + void | ||
2333 | + __timepunct<char>:: | ||
2334 | + _M_put(char* __s, size_t __maxlen, const char* __format, | ||
2335 | + const tm* __tm) const | ||
2336 | + { | ||
2337 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2338 | + const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, | ||
2339 | + _M_c_locale_timepunct); | ||
2340 | +#else | ||
2341 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
2342 | + setlocale(LC_ALL, _M_name_timepunct); | ||
2343 | + const size_t __len = strftime(__s, __maxlen, __format, __tm); | ||
2344 | + setlocale(LC_ALL, __old); | ||
2345 | + free(__old); | ||
2346 | +#endif | ||
2347 | + // Make sure __s is null terminated. | ||
2348 | + if (__len == 0) | ||
2349 | + __s[0] = '\0'; | ||
2350 | + } | ||
2351 | + | ||
2352 | + template<> | ||
2353 | + void | ||
2354 | + __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) | ||
2355 | + { | ||
2356 | + if (!_M_data) | ||
2357 | + _M_data = new __timepunct_cache<char>; | ||
2358 | + | ||
2359 | + if (!__cloc) | ||
2360 | + { | ||
2361 | + // "C" locale | ||
2362 | + _M_c_locale_timepunct = _S_get_c_locale(); | ||
2363 | + | ||
2364 | + _M_data->_M_date_format = "%m/%d/%y"; | ||
2365 | + _M_data->_M_date_era_format = "%m/%d/%y"; | ||
2366 | + _M_data->_M_time_format = "%H:%M:%S"; | ||
2367 | + _M_data->_M_time_era_format = "%H:%M:%S"; | ||
2368 | + _M_data->_M_date_time_format = ""; | ||
2369 | + _M_data->_M_date_time_era_format = ""; | ||
2370 | + _M_data->_M_am = "AM"; | ||
2371 | + _M_data->_M_pm = "PM"; | ||
2372 | + _M_data->_M_am_pm_format = ""; | ||
2373 | + | ||
2374 | + // Day names, starting with "C"'s Sunday. | ||
2375 | + _M_data->_M_day1 = "Sunday"; | ||
2376 | + _M_data->_M_day2 = "Monday"; | ||
2377 | + _M_data->_M_day3 = "Tuesday"; | ||
2378 | + _M_data->_M_day4 = "Wednesday"; | ||
2379 | + _M_data->_M_day5 = "Thursday"; | ||
2380 | + _M_data->_M_day6 = "Friday"; | ||
2381 | + _M_data->_M_day7 = "Saturday"; | ||
2382 | + | ||
2383 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2384 | + _M_data->_M_aday1 = "Sun"; | ||
2385 | + _M_data->_M_aday2 = "Mon"; | ||
2386 | + _M_data->_M_aday3 = "Tue"; | ||
2387 | + _M_data->_M_aday4 = "Wed"; | ||
2388 | + _M_data->_M_aday5 = "Thu"; | ||
2389 | + _M_data->_M_aday6 = "Fri"; | ||
2390 | + _M_data->_M_aday7 = "Sat"; | ||
2391 | + | ||
2392 | + // Month names, starting with "C"'s January. | ||
2393 | + _M_data->_M_month01 = "January"; | ||
2394 | + _M_data->_M_month02 = "February"; | ||
2395 | + _M_data->_M_month03 = "March"; | ||
2396 | + _M_data->_M_month04 = "April"; | ||
2397 | + _M_data->_M_month05 = "May"; | ||
2398 | + _M_data->_M_month06 = "June"; | ||
2399 | + _M_data->_M_month07 = "July"; | ||
2400 | + _M_data->_M_month08 = "August"; | ||
2401 | + _M_data->_M_month09 = "September"; | ||
2402 | + _M_data->_M_month10 = "October"; | ||
2403 | + _M_data->_M_month11 = "November"; | ||
2404 | + _M_data->_M_month12 = "December"; | ||
2405 | + | ||
2406 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2407 | + _M_data->_M_amonth01 = "Jan"; | ||
2408 | + _M_data->_M_amonth02 = "Feb"; | ||
2409 | + _M_data->_M_amonth03 = "Mar"; | ||
2410 | + _M_data->_M_amonth04 = "Apr"; | ||
2411 | + _M_data->_M_amonth05 = "May"; | ||
2412 | + _M_data->_M_amonth06 = "Jun"; | ||
2413 | + _M_data->_M_amonth07 = "Jul"; | ||
2414 | + _M_data->_M_amonth08 = "Aug"; | ||
2415 | + _M_data->_M_amonth09 = "Sep"; | ||
2416 | + _M_data->_M_amonth10 = "Oct"; | ||
2417 | + _M_data->_M_amonth11 = "Nov"; | ||
2418 | + _M_data->_M_amonth12 = "Dec"; | ||
2419 | + } | ||
2420 | + else | ||
2421 | + { | ||
2422 | + _M_c_locale_timepunct = _S_clone_c_locale(__cloc); | ||
2423 | + | ||
2424 | + _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); | ||
2425 | + _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); | ||
2426 | + _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); | ||
2427 | + _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); | ||
2428 | + _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); | ||
2429 | + _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); | ||
2430 | + _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); | ||
2431 | + _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); | ||
2432 | + _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); | ||
2433 | + | ||
2434 | + // Day names, starting with "C"'s Sunday. | ||
2435 | + _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); | ||
2436 | + _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); | ||
2437 | + _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); | ||
2438 | + _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); | ||
2439 | + _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); | ||
2440 | + _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); | ||
2441 | + _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); | ||
2442 | + | ||
2443 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2444 | + _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); | ||
2445 | + _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); | ||
2446 | + _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); | ||
2447 | + _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); | ||
2448 | + _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); | ||
2449 | + _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); | ||
2450 | + _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); | ||
2451 | + | ||
2452 | + // Month names, starting with "C"'s January. | ||
2453 | + _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); | ||
2454 | + _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); | ||
2455 | + _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); | ||
2456 | + _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); | ||
2457 | + _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); | ||
2458 | + _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); | ||
2459 | + _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); | ||
2460 | + _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); | ||
2461 | + _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); | ||
2462 | + _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); | ||
2463 | + _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); | ||
2464 | + _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); | ||
2465 | + | ||
2466 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2467 | + _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); | ||
2468 | + _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); | ||
2469 | + _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); | ||
2470 | + _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); | ||
2471 | + _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); | ||
2472 | + _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); | ||
2473 | + _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); | ||
2474 | + _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); | ||
2475 | + _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); | ||
2476 | + _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); | ||
2477 | + _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); | ||
2478 | + _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); | ||
2479 | + } | ||
2480 | + } | ||
2481 | + | ||
2482 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
2483 | + template<> | ||
2484 | + void | ||
2485 | + __timepunct<wchar_t>:: | ||
2486 | + _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, | ||
2487 | + const tm* __tm) const | ||
2488 | + { | ||
2489 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2490 | + __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); | ||
2491 | + const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, | ||
2492 | + _M_c_locale_timepunct); | ||
2493 | +#else | ||
2494 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
2495 | + setlocale(LC_ALL, _M_name_timepunct); | ||
2496 | + const size_t __len = wcsftime(__s, __maxlen, __format, __tm); | ||
2497 | + setlocale(LC_ALL, __old); | ||
2498 | + free(__old); | ||
2499 | +#endif | ||
2500 | + // Make sure __s is null terminated. | ||
2501 | + if (__len == 0) | ||
2502 | + __s[0] = L'\0'; | ||
2503 | + } | ||
2504 | + | ||
2505 | + template<> | ||
2506 | + void | ||
2507 | + __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) | ||
2508 | + { | ||
2509 | + if (!_M_data) | ||
2510 | + _M_data = new __timepunct_cache<wchar_t>; | ||
2511 | + | ||
2512 | +#warning wide time stuff | ||
2513 | +// if (!__cloc) | ||
2514 | + { | ||
2515 | + // "C" locale | ||
2516 | + _M_c_locale_timepunct = _S_get_c_locale(); | ||
2517 | + | ||
2518 | + _M_data->_M_date_format = L"%m/%d/%y"; | ||
2519 | + _M_data->_M_date_era_format = L"%m/%d/%y"; | ||
2520 | + _M_data->_M_time_format = L"%H:%M:%S"; | ||
2521 | + _M_data->_M_time_era_format = L"%H:%M:%S"; | ||
2522 | + _M_data->_M_date_time_format = L""; | ||
2523 | + _M_data->_M_date_time_era_format = L""; | ||
2524 | + _M_data->_M_am = L"AM"; | ||
2525 | + _M_data->_M_pm = L"PM"; | ||
2526 | + _M_data->_M_am_pm_format = L""; | ||
2527 | + | ||
2528 | + // Day names, starting with "C"'s Sunday. | ||
2529 | + _M_data->_M_day1 = L"Sunday"; | ||
2530 | + _M_data->_M_day2 = L"Monday"; | ||
2531 | + _M_data->_M_day3 = L"Tuesday"; | ||
2532 | + _M_data->_M_day4 = L"Wednesday"; | ||
2533 | + _M_data->_M_day5 = L"Thursday"; | ||
2534 | + _M_data->_M_day6 = L"Friday"; | ||
2535 | + _M_data->_M_day7 = L"Saturday"; | ||
2536 | + | ||
2537 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2538 | + _M_data->_M_aday1 = L"Sun"; | ||
2539 | + _M_data->_M_aday2 = L"Mon"; | ||
2540 | + _M_data->_M_aday3 = L"Tue"; | ||
2541 | + _M_data->_M_aday4 = L"Wed"; | ||
2542 | + _M_data->_M_aday5 = L"Thu"; | ||
2543 | + _M_data->_M_aday6 = L"Fri"; | ||
2544 | + _M_data->_M_aday7 = L"Sat"; | ||
2545 | + | ||
2546 | + // Month names, starting with "C"'s January. | ||
2547 | + _M_data->_M_month01 = L"January"; | ||
2548 | + _M_data->_M_month02 = L"February"; | ||
2549 | + _M_data->_M_month03 = L"March"; | ||
2550 | + _M_data->_M_month04 = L"April"; | ||
2551 | + _M_data->_M_month05 = L"May"; | ||
2552 | + _M_data->_M_month06 = L"June"; | ||
2553 | + _M_data->_M_month07 = L"July"; | ||
2554 | + _M_data->_M_month08 = L"August"; | ||
2555 | + _M_data->_M_month09 = L"September"; | ||
2556 | + _M_data->_M_month10 = L"October"; | ||
2557 | + _M_data->_M_month11 = L"November"; | ||
2558 | + _M_data->_M_month12 = L"December"; | ||
2559 | + | ||
2560 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2561 | + _M_data->_M_amonth01 = L"Jan"; | ||
2562 | + _M_data->_M_amonth02 = L"Feb"; | ||
2563 | + _M_data->_M_amonth03 = L"Mar"; | ||
2564 | + _M_data->_M_amonth04 = L"Apr"; | ||
2565 | + _M_data->_M_amonth05 = L"May"; | ||
2566 | + _M_data->_M_amonth06 = L"Jun"; | ||
2567 | + _M_data->_M_amonth07 = L"Jul"; | ||
2568 | + _M_data->_M_amonth08 = L"Aug"; | ||
2569 | + _M_data->_M_amonth09 = L"Sep"; | ||
2570 | + _M_data->_M_amonth10 = L"Oct"; | ||
2571 | + _M_data->_M_amonth11 = L"Nov"; | ||
2572 | + _M_data->_M_amonth12 = L"Dec"; | ||
2573 | + } | ||
2574 | +#if 0 | ||
2575 | + else | ||
2576 | + { | ||
2577 | + _M_c_locale_timepunct = _S_clone_c_locale(__cloc); | ||
2578 | + | ||
2579 | + _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); | ||
2580 | + _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); | ||
2581 | + _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); | ||
2582 | + _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); | ||
2583 | + _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); | ||
2584 | + _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); | ||
2585 | + _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); | ||
2586 | + _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); | ||
2587 | + _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); | ||
2588 | + | ||
2589 | + // Day names, starting with "C"'s Sunday. | ||
2590 | + _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); | ||
2591 | + _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); | ||
2592 | + _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); | ||
2593 | + _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); | ||
2594 | + _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); | ||
2595 | + _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); | ||
2596 | + _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); | ||
2597 | + | ||
2598 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2599 | + _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); | ||
2600 | + _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); | ||
2601 | + _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); | ||
2602 | + _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); | ||
2603 | + _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); | ||
2604 | + _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); | ||
2605 | + _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); | ||
2606 | + | ||
2607 | + // Month names, starting with "C"'s January. | ||
2608 | + _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); | ||
2609 | + _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); | ||
2610 | + _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); | ||
2611 | + _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); | ||
2612 | + _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); | ||
2613 | + _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); | ||
2614 | + _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); | ||
2615 | + _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); | ||
2616 | + _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); | ||
2617 | + _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); | ||
2618 | + _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); | ||
2619 | + _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); | ||
2620 | + | ||
2621 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2622 | + _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); | ||
2623 | + _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); | ||
2624 | + _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); | ||
2625 | + _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); | ||
2626 | + _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); | ||
2627 | + _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); | ||
2628 | + _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); | ||
2629 | + _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); | ||
2630 | + _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); | ||
2631 | + _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); | ||
2632 | + _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); | ||
2633 | + _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); | ||
2634 | + } | ||
2635 | +#endif // 0 | ||
2636 | + } | ||
2637 | +#endif | ||
2638 | +} | ||
2639 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h | ||
2640 | --- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 | ||
2641 | +++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 | ||
2642 | @@ -0,0 +1,68 @@ | ||
2643 | +// std::time_get, std::time_put implementation, GNU version -*- C++ -*- | ||
2644 | + | ||
2645 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
2646 | +// | ||
2647 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2648 | +// software; you can redistribute it and/or modify it under the | ||
2649 | +// terms of the GNU General Public License as published by the | ||
2650 | +// Free Software Foundation; either version 2, or (at your option) | ||
2651 | +// any later version. | ||
2652 | + | ||
2653 | +// This library is distributed in the hope that it will be useful, | ||
2654 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2655 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2656 | +// GNU General Public License for more details. | ||
2657 | + | ||
2658 | +// You should have received a copy of the GNU General Public License along | ||
2659 | +// with this library; see the file COPYING. If not, write to the Free | ||
2660 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2661 | +// USA. | ||
2662 | + | ||
2663 | +// As a special exception, you may use this file as part of a free software | ||
2664 | +// library without restriction. Specifically, if other files instantiate | ||
2665 | +// templates or use macros or inline functions from this file, or you compile | ||
2666 | +// this file and link it with other files to produce an executable, this | ||
2667 | +// file does not by itself cause the resulting executable to be covered by | ||
2668 | +// the GNU General Public License. This exception does not however | ||
2669 | +// invalidate any other reasons why the executable file might be covered by | ||
2670 | +// the GNU General Public License. | ||
2671 | + | ||
2672 | +// | ||
2673 | +// ISO C++ 14882: 22.2.5.1.2 - time_get functions | ||
2674 | +// ISO C++ 14882: 22.2.5.3.2 - time_put functions | ||
2675 | +// | ||
2676 | + | ||
2677 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2678 | + | ||
2679 | + template<typename _CharT> | ||
2680 | + __timepunct<_CharT>::__timepunct(size_t __refs) | ||
2681 | + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), | ||
2682 | + _M_name_timepunct(_S_get_c_name()) | ||
2683 | + { _M_initialize_timepunct(); } | ||
2684 | + | ||
2685 | + template<typename _CharT> | ||
2686 | + __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | ||
2687 | + : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), | ||
2688 | + _M_name_timepunct(_S_get_c_name()) | ||
2689 | + { _M_initialize_timepunct(); } | ||
2690 | + | ||
2691 | + template<typename _CharT> | ||
2692 | + __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | ||
2693 | + size_t __refs) | ||
2694 | + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), | ||
2695 | + _M_name_timepunct(__s) | ||
2696 | + { | ||
2697 | + char* __tmp = new char[std::strlen(__s) + 1]; | ||
2698 | + std::strcpy(__tmp, __s); | ||
2699 | + _M_name_timepunct = __tmp; | ||
2700 | + _M_initialize_timepunct(__cloc); | ||
2701 | + } | ||
2702 | + | ||
2703 | + template<typename _CharT> | ||
2704 | + __timepunct<_CharT>::~__timepunct() | ||
2705 | + { | ||
2706 | + if (_M_name_timepunct != _S_get_c_name()) | ||
2707 | + delete [] _M_name_timepunct; | ||
2708 | + delete _M_data; | ||
2709 | + _S_destroy_c_locale(_M_c_locale_timepunct); | ||
2710 | + } | ||
2711 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h | ||
2712 | --- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 | ||
2713 | +++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 | ||
2714 | @@ -0,0 +1,58 @@ | ||
2715 | +// Locale support -*- C++ -*- | ||
2716 | + | ||
2717 | +// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 | ||
2718 | +// Free Software Foundation, Inc. | ||
2719 | +// | ||
2720 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2721 | +// software; you can redistribute it and/or modify it under the | ||
2722 | +// terms of the GNU General Public License as published by the | ||
2723 | +// Free Software Foundation; either version 2, or (at your option) | ||
2724 | +// any later version. | ||
2725 | + | ||
2726 | +// This library is distributed in the hope that it will be useful, | ||
2727 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2728 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2729 | +// GNU General Public License for more details. | ||
2730 | + | ||
2731 | +// You should have received a copy of the GNU General Public License along | ||
2732 | +// with this library; see the file COPYING. If not, write to the Free | ||
2733 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2734 | +// USA. | ||
2735 | + | ||
2736 | +// As a special exception, you may use this file as part of a free software | ||
2737 | +// library without restriction. Specifically, if other files instantiate | ||
2738 | +// templates or use macros or inline functions from this file, or you compile | ||
2739 | +// this file and link it with other files to produce an executable, this | ||
2740 | +// file does not by itself cause the resulting executable to be covered by | ||
2741 | +// the GNU General Public License. This exception does not however | ||
2742 | +// invalidate any other reasons why the executable file might be covered by | ||
2743 | +// the GNU General Public License. | ||
2744 | + | ||
2745 | +// | ||
2746 | +// ISO C++ 14882: 22.1 Locales | ||
2747 | +// | ||
2748 | + | ||
2749 | +// Information as gleaned from /usr/include/ctype.h | ||
2750 | + | ||
2751 | + struct ctype_base | ||
2752 | + { | ||
2753 | + // Note: In uClibc, the following two types depend on configuration. | ||
2754 | + | ||
2755 | + // Non-standard typedefs. | ||
2756 | + typedef const __ctype_touplow_t* __to_type; | ||
2757 | + | ||
2758 | + // NB: Offsets into ctype<char>::_M_table force a particular size | ||
2759 | + // on the mask type. Because of this, we don't use an enum. | ||
2760 | + typedef __ctype_mask_t mask; | ||
2761 | + static const mask upper = _ISupper; | ||
2762 | + static const mask lower = _ISlower; | ||
2763 | + static const mask alpha = _ISalpha; | ||
2764 | + static const mask digit = _ISdigit; | ||
2765 | + static const mask xdigit = _ISxdigit; | ||
2766 | + static const mask space = _ISspace; | ||
2767 | + static const mask print = _ISprint; | ||
2768 | + static const mask graph = _ISalpha | _ISdigit | _ISpunct; | ||
2769 | + static const mask cntrl = _IScntrl; | ||
2770 | + static const mask punct = _ISpunct; | ||
2771 | + static const mask alnum = _ISalpha | _ISdigit; | ||
2772 | + }; | ||
2773 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h | ||
2774 | --- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 | ||
2775 | +++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 | ||
2776 | @@ -0,0 +1,69 @@ | ||
2777 | +// Locale support -*- C++ -*- | ||
2778 | + | ||
2779 | +// Copyright (C) 2000, 2002 Free Software Foundation, Inc. | ||
2780 | +// | ||
2781 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2782 | +// software; you can redistribute it and/or modify it under the | ||
2783 | +// terms of the GNU General Public License as published by the | ||
2784 | +// Free Software Foundation; either version 2, or (at your option) | ||
2785 | +// any later version. | ||
2786 | + | ||
2787 | +// This library is distributed in the hope that it will be useful, | ||
2788 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2789 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2790 | +// GNU General Public License for more details. | ||
2791 | + | ||
2792 | +// You should have received a copy of the GNU General Public License along | ||
2793 | +// with this library; see the file COPYING. If not, write to the Free | ||
2794 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2795 | +// USA. | ||
2796 | + | ||
2797 | +// As a special exception, you may use this file as part of a free software | ||
2798 | +// library without restriction. Specifically, if other files instantiate | ||
2799 | +// templates or use macros or inline functions from this file, or you compile | ||
2800 | +// this file and link it with other files to produce an executable, this | ||
2801 | +// file does not by itself cause the resulting executable to be covered by | ||
2802 | +// the GNU General Public License. This exception does not however | ||
2803 | +// invalidate any other reasons why the executable file might be covered by | ||
2804 | +// the GNU General Public License. | ||
2805 | + | ||
2806 | +// | ||
2807 | +// ISO C++ 14882: 22.1 Locales | ||
2808 | +// | ||
2809 | + | ||
2810 | +// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | ||
2811 | +// functions go in ctype.cc | ||
2812 | + | ||
2813 | + bool | ||
2814 | + ctype<char>:: | ||
2815 | + is(mask __m, char __c) const | ||
2816 | + { return _M_table[static_cast<unsigned char>(__c)] & __m; } | ||
2817 | + | ||
2818 | + const char* | ||
2819 | + ctype<char>:: | ||
2820 | + is(const char* __low, const char* __high, mask* __vec) const | ||
2821 | + { | ||
2822 | + while (__low < __high) | ||
2823 | + *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | ||
2824 | + return __high; | ||
2825 | + } | ||
2826 | + | ||
2827 | + const char* | ||
2828 | + ctype<char>:: | ||
2829 | + scan_is(mask __m, const char* __low, const char* __high) const | ||
2830 | + { | ||
2831 | + while (__low < __high | ||
2832 | + && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) | ||
2833 | + ++__low; | ||
2834 | + return __low; | ||
2835 | + } | ||
2836 | + | ||
2837 | + const char* | ||
2838 | + ctype<char>:: | ||
2839 | + scan_not(mask __m, const char* __low, const char* __high) const | ||
2840 | + { | ||
2841 | + while (__low < __high | ||
2842 | + && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) | ||
2843 | + ++__low; | ||
2844 | + return __low; | ||
2845 | + } | ||
2846 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h | ||
2847 | --- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 | ||
2848 | +++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 | ||
2849 | @@ -0,0 +1,92 @@ | ||
2850 | +// Locale support -*- C++ -*- | ||
2851 | + | ||
2852 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 | ||
2853 | +// Free Software Foundation, Inc. | ||
2854 | +// | ||
2855 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2856 | +// software; you can redistribute it and/or modify it under the | ||
2857 | +// terms of the GNU General Public License as published by the | ||
2858 | +// Free Software Foundation; either version 2, or (at your option) | ||
2859 | +// any later version. | ||
2860 | + | ||
2861 | +// This library is distributed in the hope that it will be useful, | ||
2862 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2863 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2864 | +// GNU General Public License for more details. | ||
2865 | + | ||
2866 | +// You should have received a copy of the GNU General Public License along | ||
2867 | +// with this library; see the file COPYING. If not, write to the Free | ||
2868 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2869 | +// USA. | ||
2870 | + | ||
2871 | +// As a special exception, you may use this file as part of a free software | ||
2872 | +// library without restriction. Specifically, if other files instantiate | ||
2873 | +// templates or use macros or inline functions from this file, or you compile | ||
2874 | +// this file and link it with other files to produce an executable, this | ||
2875 | +// file does not by itself cause the resulting executable to be covered by | ||
2876 | +// the GNU General Public License. This exception does not however | ||
2877 | +// invalidate any other reasons why the executable file might be covered by | ||
2878 | +// the GNU General Public License. | ||
2879 | + | ||
2880 | +// | ||
2881 | +// ISO C++ 14882: 22.1 Locales | ||
2882 | +// | ||
2883 | + | ||
2884 | +// Information as gleaned from /usr/include/ctype.h | ||
2885 | + | ||
2886 | + const ctype_base::mask* | ||
2887 | + ctype<char>::classic_table() throw() | ||
2888 | + { return __C_ctype_b; } | ||
2889 | + | ||
2890 | + ctype<char>::ctype(__c_locale, const mask* __table, bool __del, | ||
2891 | + size_t __refs) | ||
2892 | + : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), | ||
2893 | + _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) | ||
2894 | + { | ||
2895 | + _M_toupper = __C_ctype_toupper; | ||
2896 | + _M_tolower = __C_ctype_tolower; | ||
2897 | + _M_table = __table ? __table : __C_ctype_b; | ||
2898 | + memset(_M_widen, 0, sizeof(_M_widen)); | ||
2899 | + memset(_M_narrow, 0, sizeof(_M_narrow)); | ||
2900 | + } | ||
2901 | + | ||
2902 | + ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) | ||
2903 | + : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), | ||
2904 | + _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) | ||
2905 | + { | ||
2906 | + _M_toupper = __C_ctype_toupper; | ||
2907 | + _M_tolower = __C_ctype_tolower; | ||
2908 | + _M_table = __table ? __table : __C_ctype_b; | ||
2909 | + memset(_M_widen, 0, sizeof(_M_widen)); | ||
2910 | + memset(_M_narrow, 0, sizeof(_M_narrow)); | ||
2911 | + } | ||
2912 | + | ||
2913 | + char | ||
2914 | + ctype<char>::do_toupper(char __c) const | ||
2915 | + { return _M_toupper[static_cast<unsigned char>(__c)]; } | ||
2916 | + | ||
2917 | + const char* | ||
2918 | + ctype<char>::do_toupper(char* __low, const char* __high) const | ||
2919 | + { | ||
2920 | + while (__low < __high) | ||
2921 | + { | ||
2922 | + *__low = _M_toupper[static_cast<unsigned char>(*__low)]; | ||
2923 | + ++__low; | ||
2924 | + } | ||
2925 | + return __high; | ||
2926 | + } | ||
2927 | + | ||
2928 | + char | ||
2929 | + ctype<char>::do_tolower(char __c) const | ||
2930 | + { return _M_tolower[static_cast<unsigned char>(__c)]; } | ||
2931 | + | ||
2932 | + const char* | ||
2933 | + ctype<char>::do_tolower(char* __low, const char* __high) const | ||
2934 | + { | ||
2935 | + while (__low < __high) | ||
2936 | + { | ||
2937 | + *__low = _M_tolower[static_cast<unsigned char>(*__low)]; | ||
2938 | + ++__low; | ||
2939 | + } | ||
2940 | + return __high; | ||
2941 | + } | ||
2942 | diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h | ||
2943 | --- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 | ||
2944 | +++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 | ||
2945 | @@ -0,0 +1,44 @@ | ||
2946 | +// Specific definitions for GNU/Linux -*- C++ -*- | ||
2947 | + | ||
2948 | +// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. | ||
2949 | +// | ||
2950 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2951 | +// software; you can redistribute it and/or modify it under the | ||
2952 | +// terms of the GNU General Public License as published by the | ||
2953 | +// Free Software Foundation; either version 2, or (at your option) | ||
2954 | +// any later version. | ||
2955 | + | ||
2956 | +// This library is distributed in the hope that it will be useful, | ||
2957 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2958 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2959 | +// GNU General Public License for more details. | ||
2960 | + | ||
2961 | +// You should have received a copy of the GNU General Public License along | ||
2962 | +// with this library; see the file COPYING. If not, write to the Free | ||
2963 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2964 | +// USA. | ||
2965 | + | ||
2966 | +// As a special exception, you may use this file as part of a free software | ||
2967 | +// library without restriction. Specifically, if other files instantiate | ||
2968 | +// templates or use macros or inline functions from this file, or you compile | ||
2969 | +// this file and link it with other files to produce an executable, this | ||
2970 | +// file does not by itself cause the resulting executable to be covered by | ||
2971 | +// the GNU General Public License. This exception does not however | ||
2972 | +// invalidate any other reasons why the executable file might be covered by | ||
2973 | +// the GNU General Public License. | ||
2974 | + | ||
2975 | +#ifndef _GLIBCXX_OS_DEFINES | ||
2976 | +#define _GLIBCXX_OS_DEFINES 1 | ||
2977 | + | ||
2978 | +// System-specific #define, typedefs, corrections, etc, go here. This | ||
2979 | +// file will come before all others. | ||
2980 | + | ||
2981 | +// This keeps isanum, et al from being propagated as macros. | ||
2982 | +#define __NO_CTYPE 1 | ||
2983 | + | ||
2984 | +#include <features.h> | ||
2985 | + | ||
2986 | +// We must not see the optimized string functions GNU libc defines. | ||
2987 | +#define __NO_STRING_INLINES | ||
2988 | + | ||
2989 | +#endif | ||
2990 | diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure | ||
2991 | --- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 | ||
2992 | +++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 | ||
2993 | @@ -3878,6 +3878,11 @@ | ||
2994 | lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` | ||
2995 | ;; | ||
2996 | |||
2997 | +linux-uclibc*) | ||
2998 | + lt_cv_deplibs_check_method=pass_all | ||
2999 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
3000 | + ;; | ||
3001 | + | ||
3002 | netbsd*) | ||
3003 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
3004 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
3005 | @@ -5545,6 +5550,9 @@ | ||
3006 | # Default to "generic". | ||
3007 | if test $enable_clocale_flag = auto; then | ||
3008 | case x${target_os} in | ||
3009 | + xlinux-uclibc*) | ||
3010 | + enable_clocale_flag=uclibc | ||
3011 | + ;; | ||
3012 | xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) | ||
3013 | cat >conftest.$ac_ext <<_ACEOF | ||
3014 | #line $LINENO "configure" | ||
3015 | @@ -5759,6 +5767,77 @@ | ||
3016 | CTIME_CC=config/locale/generic/time_members.cc | ||
3017 | CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h | ||
3018 | ;; | ||
3019 | + uclibc) | ||
3020 | + echo "$as_me:$LINENO: result: uclibc" >&5 | ||
3021 | +echo "${ECHO_T}uclibc" >&6 | ||
3022 | + | ||
3023 | + # Declare intention to use gettext, and add support for specific | ||
3024 | + # languages. | ||
3025 | + # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT | ||
3026 | + ALL_LINGUAS="de fr" | ||
3027 | + | ||
3028 | + # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. | ||
3029 | + # Extract the first word of "msgfmt", so it can be a program name with args. | ||
3030 | +set dummy msgfmt; ac_word=$2 | ||
3031 | +echo "$as_me:$LINENO: checking for $ac_word" >&5 | ||
3032 | +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 | ||
3033 | +if test "${ac_cv_prog_check_msgfmt+set}" = set; then | ||
3034 | + echo $ECHO_N "(cached) $ECHO_C" >&6 | ||
3035 | +else | ||
3036 | + if test -n "$check_msgfmt"; then | ||
3037 | + ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. | ||
3038 | +else | ||
3039 | +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | ||
3040 | +for as_dir in $PATH | ||
3041 | +do | ||
3042 | + IFS=$as_save_IFS | ||
3043 | + test -z "$as_dir" && as_dir=. | ||
3044 | + for ac_exec_ext in '' $ac_executable_extensions; do | ||
3045 | + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then | ||
3046 | + ac_cv_prog_check_msgfmt="yes" | ||
3047 | + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 | ||
3048 | + break 2 | ||
3049 | + fi | ||
3050 | +done | ||
3051 | +done | ||
3052 | + | ||
3053 | + test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" | ||
3054 | +fi | ||
3055 | +fi | ||
3056 | +check_msgfmt=$ac_cv_prog_check_msgfmt | ||
3057 | +if test -n "$check_msgfmt"; then | ||
3058 | + echo "$as_me:$LINENO: result: $check_msgfmt" >&5 | ||
3059 | +echo "${ECHO_T}$check_msgfmt" >&6 | ||
3060 | +else | ||
3061 | + echo "$as_me:$LINENO: result: no" >&5 | ||
3062 | +echo "${ECHO_T}no" >&6 | ||
3063 | +fi | ||
3064 | + | ||
3065 | + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then | ||
3066 | + USE_NLS=yes | ||
3067 | + fi | ||
3068 | + # Export the build objects. | ||
3069 | + for ling in $ALL_LINGUAS; do \ | ||
3070 | + glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ | ||
3071 | + glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ | ||
3072 | + done | ||
3073 | + | ||
3074 | + | ||
3075 | + | ||
3076 | + CLOCALE_H=config/locale/uclibc/c_locale.h | ||
3077 | + CLOCALE_CC=config/locale/uclibc/c_locale.cc | ||
3078 | + CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h | ||
3079 | + CCODECVT_CC=config/locale/uclibc/codecvt_members.cc | ||
3080 | + CCOLLATE_CC=config/locale/uclibc/collate_members.cc | ||
3081 | + CCTYPE_CC=config/locale/uclibc/ctype_members.cc | ||
3082 | + CMESSAGES_H=config/locale/uclibc/messages_members.h | ||
3083 | + CMESSAGES_CC=config/locale/uclibc/messages_members.cc | ||
3084 | + CMONEY_CC=config/locale/uclibc/monetary_members.cc | ||
3085 | + CNUMERIC_CC=config/locale/uclibc/numeric_members.cc | ||
3086 | + CTIME_H=config/locale/uclibc/time_members.h | ||
3087 | + CTIME_CC=config/locale/uclibc/time_members.cc | ||
3088 | + CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h | ||
3089 | + ;; | ||
3090 | esac | ||
3091 | |||
3092 | # This is where the testsuite looks for locale catalogs, using the | ||
3093 | diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host | ||
3094 | --- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 | ||
3095 | +++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 | ||
3096 | @@ -217,6 +217,12 @@ | ||
3097 | ;; | ||
3098 | esac | ||
3099 | |||
3100 | +# Override for uClibc since linux-uclibc gets mishandled above. | ||
3101 | +case "${host_os}" in | ||
3102 | + *-uclibc*) | ||
3103 | + os_include_dir="os/uclibc" | ||
3104 | + ;; | ||
3105 | +esac | ||
3106 | |||
3107 | # Set any OS-dependent and CPU-dependent bits. | ||
3108 | # THIS TABLE IS SORTED. KEEP IT THAT WAY. | ||
3109 | diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 | ||
3110 | --- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 | ||
3111 | +++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 | ||
3112 | @@ -138,6 +138,99 @@ | ||
3113 | ;; | ||
3114 | esac | ||
3115 | ;; | ||
3116 | + *-uclibc*) | ||
3117 | +# Temporary hack until we implement the float versions of the libm funcs | ||
3118 | + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ | ||
3119 | + machine/endian.h machine/param.h sys/machine.h sys/types.h \ | ||
3120 | + fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) | ||
3121 | + SECTION_FLAGS='-ffunction-sections -fdata-sections' | ||
3122 | + AC_SUBST(SECTION_FLAGS) | ||
3123 | + GLIBCXX_CHECK_LINKER_FEATURES | ||
3124 | + GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT | ||
3125 | + GLIBCXX_CHECK_WCHAR_T_SUPPORT | ||
3126 | + | ||
3127 | + # For LFS. | ||
3128 | + AC_DEFINE(HAVE_INT64_T) | ||
3129 | + case "$target" in | ||
3130 | + *-uclinux*) | ||
3131 | + # Don't enable LFS with uClinux | ||
3132 | + ;; | ||
3133 | + *) | ||
3134 | + AC_DEFINE(_GLIBCXX_USE_LFS) | ||
3135 | + esac | ||
3136 | + | ||
3137 | + # For showmanyc_helper(). | ||
3138 | + AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) | ||
3139 | + GLIBCXX_CHECK_POLL | ||
3140 | + GLIBCXX_CHECK_S_ISREG_OR_S_IFREG | ||
3141 | + | ||
3142 | + # For xsputn_2(). | ||
3143 | + AC_CHECK_HEADERS(sys/uio.h) | ||
3144 | + GLIBCXX_CHECK_WRITEV | ||
3145 | + | ||
3146 | +# AC_DEFINE(HAVE_ACOSF) | ||
3147 | +# AC_DEFINE(HAVE_ASINF) | ||
3148 | +# AC_DEFINE(HAVE_ATANF) | ||
3149 | +# AC_DEFINE(HAVE_ATAN2F) | ||
3150 | + AC_DEFINE(HAVE_CEILF) | ||
3151 | + AC_DEFINE(HAVE_COPYSIGN) | ||
3152 | +# AC_DEFINE(HAVE_COPYSIGNF) | ||
3153 | +# AC_DEFINE(HAVE_COSF) | ||
3154 | +# AC_DEFINE(HAVE_COSHF) | ||
3155 | +# AC_DEFINE(HAVE_EXPF) | ||
3156 | +# AC_DEFINE(HAVE_FABSF) | ||
3157 | + AC_DEFINE(HAVE_FINITE) | ||
3158 | + AC_DEFINE(HAVE_FINITEF) | ||
3159 | + AC_DEFINE(HAVE_FLOORF) | ||
3160 | +# AC_DEFINE(HAVE_FMODF) | ||
3161 | +# AC_DEFINE(HAVE_FREXPF) | ||
3162 | + AC_DEFINE(HAVE_HYPOT) | ||
3163 | +# AC_DEFINE(HAVE_HYPOTF) | ||
3164 | + AC_DEFINE(HAVE_ISINF) | ||
3165 | + AC_DEFINE(HAVE_ISINFF) | ||
3166 | + AC_DEFINE(HAVE_ISNAN) | ||
3167 | + AC_DEFINE(HAVE_ISNANF) | ||
3168 | +# AC_DEFINE(HAVE_LOGF) | ||
3169 | +# AC_DEFINE(HAVE_LOG10F) | ||
3170 | +# AC_DEFINE(HAVE_MODFF) | ||
3171 | +# AC_DEFINE(HAVE_SINF) | ||
3172 | +# AC_DEFINE(HAVE_SINHF) | ||
3173 | +# AC_DEFINE(HAVE_SINCOS) | ||
3174 | +# AC_DEFINE(HAVE_SINCOSF) | ||
3175 | + AC_DEFINE(HAVE_SQRTF) | ||
3176 | +# AC_DEFINE(HAVE_TANF) | ||
3177 | +# AC_DEFINE(HAVE_TANHF) | ||
3178 | + if test x"long_double_math_on_this_cpu" = x"yes"; then | ||
3179 | + AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) | ||
3180 | +# AC_DEFINE(HAVE_ACOSL) | ||
3181 | +# AC_DEFINE(HAVE_ASINL) | ||
3182 | +# AC_DEFINE(HAVE_ATANL) | ||
3183 | +# AC_DEFINE(HAVE_ATAN2L) | ||
3184 | +# AC_DEFINE(HAVE_CEILL) | ||
3185 | +# AC_DEFINE(HAVE_COPYSIGNL) | ||
3186 | +# AC_DEFINE(HAVE_COSL) | ||
3187 | +# AC_DEFINE(HAVE_COSHL) | ||
3188 | +# AC_DEFINE(HAVE_EXPL) | ||
3189 | +# AC_DEFINE(HAVE_FABSL) | ||
3190 | +# AC_DEFINE(HAVE_FINITEL) | ||
3191 | +# AC_DEFINE(HAVE_FLOORL) | ||
3192 | +# AC_DEFINE(HAVE_FMODL) | ||
3193 | +# AC_DEFINE(HAVE_FREXPL) | ||
3194 | +# AC_DEFINE(HAVE_HYPOTL) | ||
3195 | +# AC_DEFINE(HAVE_ISINFL) | ||
3196 | +# AC_DEFINE(HAVE_ISNANL) | ||
3197 | +# AC_DEFINE(HAVE_LOGL) | ||
3198 | +# AC_DEFINE(HAVE_LOG10L) | ||
3199 | +# AC_DEFINE(HAVE_MODFL) | ||
3200 | +# AC_DEFINE(HAVE_POWL) | ||
3201 | +# AC_DEFINE(HAVE_SINL) | ||
3202 | +# AC_DEFINE(HAVE_SINHL) | ||
3203 | +# AC_DEFINE(HAVE_SINCOSL) | ||
3204 | +# AC_DEFINE(HAVE_SQRTL) | ||
3205 | +# AC_DEFINE(HAVE_TANL) | ||
3206 | +# AC_DEFINE(HAVE_TANHL) | ||
3207 | + fi | ||
3208 | + ;; | ||
3209 | *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) | ||
3210 | AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ | ||
3211 | machine/endian.h machine/param.h sys/machine.h sys/types.h \ | ||
3212 | @@ -152,7 +245,7 @@ | ||
3213 | AC_DEFINE(HAVE_INT64_T) | ||
3214 | case "$target" in | ||
3215 | *-uclinux*) | ||
3216 | - # Don't enable LFS with uClibc | ||
3217 | + # Don't enable LFS with uClinux | ||
3218 | ;; | ||
3219 | *) | ||
3220 | AC_DEFINE(_GLIBCXX_USE_LFS) | ||
3221 | diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h | ||
3222 | --- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 | ||
3223 | +++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 | ||
3224 | @@ -101,7 +101,9 @@ | ||
3225 | using std::wmemcpy; | ||
3226 | using std::wmemmove; | ||
3227 | using std::wmemset; | ||
3228 | +#if _GLIBCXX_HAVE_WCSFTIME | ||
3229 | using std::wcsftime; | ||
3230 | +#endif | ||
3231 | |||
3232 | #if _GLIBCXX_USE_C99 | ||
3233 | using std::wcstold; | ||
3234 | diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h | ||
3235 | --- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 | ||
3236 | +++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 | ||
3237 | @@ -179,7 +179,9 @@ | ||
3238 | using ::wcscoll; | ||
3239 | using ::wcscpy; | ||
3240 | using ::wcscspn; | ||
3241 | +#if _GLIBCXX_HAVE_WCSFTIME | ||
3242 | using ::wcsftime; | ||
3243 | +#endif | ||
3244 | using ::wcslen; | ||
3245 | using ::wcsncat; | ||
3246 | using ::wcsncmp; | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc-uclibc-3.4.0-120-softfloat.patch b/meta/packages/gcc/gcc-3.4.3/gcc-uclibc-3.4.0-120-softfloat.patch deleted file mode 100644 index f2431896cf..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc-uclibc-3.4.0-120-softfloat.patch +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | --- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 | ||
2 | +++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 | ||
3 | @@ -1418,6 +1418,11 @@ | ||
4 | fi | ||
5 | |||
6 | FLAGS_FOR_TARGET= | ||
7 | +case " $targargs " in | ||
8 | + *" --nfp "* | *" --without-float "*) | ||
9 | + FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' | ||
10 | + ;; | ||
11 | +esac | ||
12 | case " $target_configdirs " in | ||
13 | *" newlib "*) | ||
14 | case " $targargs " in | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm-peephole.patch b/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm-peephole.patch deleted file mode 100644 index fb317e1537..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm-peephole.patch +++ /dev/null | |||
@@ -1,79 +0,0 @@ | |||
1 | --- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 | ||
2 | +++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 | ||
3 | @@ -8810,13 +8810,16 @@ | ||
4 | (set_attr "length" "4,8,8")] | ||
5 | ) | ||
6 | |||
7 | +; Try to convert LDR+LDR+arith into [add+]LDM+arith | ||
8 | +; On XScale, LDM is always slower than two LDRs, so only do this if | ||
9 | +; optimising for size. | ||
10 | (define_insn "*arith_adjacentmem" | ||
11 | [(set (match_operand:SI 0 "s_register_operand" "=r") | ||
12 | (match_operator:SI 1 "shiftable_operator" | ||
13 | [(match_operand:SI 2 "memory_operand" "m") | ||
14 | (match_operand:SI 3 "memory_operand" "m")])) | ||
15 | (clobber (match_scratch:SI 4 "=r"))] | ||
16 | - "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" | ||
17 | + "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" | ||
18 | "* | ||
19 | { | ||
20 | rtx ldm[3]; | ||
21 | @@ -8851,6 +8854,8 @@ | ||
22 | } | ||
23 | if (val1 && val2) | ||
24 | { | ||
25 | + /* This would be a loss on a Harvard core, but adjacent_mem_locations() | ||
26 | + will prevent it from happening. */ | ||
27 | rtx ops[3]; | ||
28 | ldm[0] = ops[0] = operands[4]; | ||
29 | ops[1] = XEXP (XEXP (operands[2], 0), 0); | ||
30 | --- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 | ||
31 | +++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 | ||
32 | @@ -4593,8 +4593,11 @@ | ||
33 | arith_adjacentmem pattern to output an overlong sequence. */ | ||
34 | if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) | ||
35 | return 0; | ||
36 | - | ||
37 | - return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); | ||
38 | + | ||
39 | + /* For Harvard cores, only accept pairs where one offset is zero. | ||
40 | + See comment in load_multiple_sequence. */ | ||
41 | + return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4) | ||
42 | + && (!arm_ld_sched || val0 == 0 || val1 == 0); | ||
43 | } | ||
44 | return 0; | ||
45 | } | ||
46 | @@ -4838,6 +4841,11 @@ | ||
47 | *load_offset = unsorted_offsets[order[0]]; | ||
48 | } | ||
49 | |||
50 | + /* For XScale a two-word LDM is a performance loss, so only do this if | ||
51 | + size is more important. See comments in arm_gen_load_multiple. */ | ||
52 | + if (nops == 2 && arm_tune_xscale && !optimize_size) | ||
53 | + return 0; | ||
54 | + | ||
55 | if (unsorted_offsets[order[0]] == 0) | ||
56 | return 1; /* ldmia */ | ||
57 | |||
58 | @@ -5064,6 +5072,11 @@ | ||
59 | *load_offset = unsorted_offsets[order[0]]; | ||
60 | } | ||
61 | |||
62 | + /* For XScale a two-word LDM is a performance loss, so only do this if | ||
63 | + size is more important. See comments in arm_gen_load_multiple. */ | ||
64 | + if (nops == 2 && arm_tune_xscale && !optimize_size) | ||
65 | + return 0; | ||
66 | + | ||
67 | if (unsorted_offsets[order[0]] == 0) | ||
68 | return 1; /* stmia */ | ||
69 | |||
70 | --- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 | ||
71 | +++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 | ||
72 | @@ -381,6 +381,7 @@ | ||
73 | printf ("#include \"recog.h\"\n"); | ||
74 | printf ("#include \"except.h\"\n\n"); | ||
75 | printf ("#include \"function.h\"\n\n"); | ||
76 | + printf ("#include \"flags.h\"\n\n"); | ||
77 | |||
78 | printf ("#ifdef HAVE_peephole\n"); | ||
79 | printf ("extern rtx peep_operand[];\n\n"); | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm.patch b/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm.patch deleted file mode 100644 index 142052fdf0..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-ldm.patch +++ /dev/null | |||
@@ -1,119 +0,0 @@ | |||
1 | --- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 | ||
2 | +++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 | ||
3 | @@ -8520,6 +8520,26 @@ | ||
4 | return_used_this_function = 0; | ||
5 | } | ||
6 | |||
7 | +/* Return the number (counting from 0) of | ||
8 | + the least significant set bit in MASK. */ | ||
9 | + | ||
10 | +#ifdef __GNUC__ | ||
11 | +inline | ||
12 | +#endif | ||
13 | +static int | ||
14 | +number_of_first_bit_set (mask) | ||
15 | + int mask; | ||
16 | +{ | ||
17 | + int bit; | ||
18 | + | ||
19 | + for (bit = 0; | ||
20 | + (mask & (1 << bit)) == 0; | ||
21 | + ++bit) | ||
22 | + continue; | ||
23 | + | ||
24 | + return bit; | ||
25 | +} | ||
26 | + | ||
27 | const char * | ||
28 | arm_output_epilogue (rtx sibling) | ||
29 | { | ||
30 | @@ -8753,27 +8773,47 @@ | ||
31 | saved_regs_mask |= (1 << PC_REGNUM); | ||
32 | } | ||
33 | |||
34 | - /* Load the registers off the stack. If we only have one register | ||
35 | - to load use the LDR instruction - it is faster. */ | ||
36 | - if (saved_regs_mask == (1 << LR_REGNUM)) | ||
37 | - { | ||
38 | - /* The exception handler ignores the LR, so we do | ||
39 | - not really need to load it off the stack. */ | ||
40 | - if (eh_ofs) | ||
41 | - asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); | ||
42 | - else | ||
43 | - asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); | ||
44 | - } | ||
45 | - else if (saved_regs_mask) | ||
46 | + if (saved_regs_mask) | ||
47 | { | ||
48 | - if (saved_regs_mask & (1 << SP_REGNUM)) | ||
49 | - /* Note - write back to the stack register is not enabled | ||
50 | - (ie "ldmfd sp!..."). We know that the stack pointer is | ||
51 | - in the list of registers and if we add writeback the | ||
52 | - instruction becomes UNPREDICTABLE. */ | ||
53 | - print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); | ||
54 | + /* Load the registers off the stack. If we only have one register | ||
55 | + to load use the LDR instruction - it is faster. */ | ||
56 | + if (bit_count (saved_regs_mask) == 1) | ||
57 | + { | ||
58 | + int reg = number_of_first_bit_set (saved_regs_mask); | ||
59 | + | ||
60 | + switch (reg) | ||
61 | + { | ||
62 | + case SP_REGNUM: | ||
63 | + /* Mustn't use base writeback when loading SP. */ | ||
64 | + asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); | ||
65 | + break; | ||
66 | + | ||
67 | + case LR_REGNUM: | ||
68 | + if (eh_ofs) | ||
69 | + { | ||
70 | + /* The exception handler ignores the LR, so we do | ||
71 | + not really need to load it off the stack. */ | ||
72 | + asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); | ||
73 | + break; | ||
74 | + } | ||
75 | + /* else fall through */ | ||
76 | + | ||
77 | + default: | ||
78 | + asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); | ||
79 | + break; | ||
80 | + } | ||
81 | + } | ||
82 | else | ||
83 | - print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); | ||
84 | + { | ||
85 | + if (saved_regs_mask & (1 << SP_REGNUM)) | ||
86 | + /* Note - write back to the stack register is not enabled | ||
87 | + (ie "ldmfd sp!..."). We know that the stack pointer is | ||
88 | + in the list of registers and if we add writeback the | ||
89 | + instruction becomes UNPREDICTABLE. */ | ||
90 | + print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); | ||
91 | + else | ||
92 | + print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); | ||
93 | + } | ||
94 | } | ||
95 | |||
96 | if (current_function_pretend_args_size) | ||
97 | @@ -11401,22 +11441,6 @@ | ||
98 | } | ||
99 | } | ||
100 | |||
101 | -/* Return the number (counting from 0) of | ||
102 | - the least significant set bit in MASK. */ | ||
103 | - | ||
104 | -inline static int | ||
105 | -number_of_first_bit_set (int mask) | ||
106 | -{ | ||
107 | - int bit; | ||
108 | - | ||
109 | - for (bit = 0; | ||
110 | - (mask & (1 << bit)) == 0; | ||
111 | - ++bit) | ||
112 | - continue; | ||
113 | - | ||
114 | - return bit; | ||
115 | -} | ||
116 | - | ||
117 | /* Generate code to return from a thumb function. | ||
118 | If 'reg_containing_return_addr' is -1, then the return address is | ||
119 | actually on the stack, at the stack pointer. */ | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-tune.patch b/meta/packages/gcc/gcc-3.4.3/gcc34-arm-tune.patch deleted file mode 100644 index cdb20bef9b..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc34-arm-tune.patch +++ /dev/null | |||
@@ -1,9 +0,0 @@ | |||
1 | --- gcc-3.4.0/gcc/config/arm/linux-elf.h.arm-tune 2004-01-31 01:18:11.000000000 -0500 | ||
2 | +++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-04-24 18:19:10.000000000 -0400 | ||
3 | @@ -126,3 +126,6 @@ | ||
4 | |||
5 | #define LINK_GCC_C_SEQUENCE_SPEC \ | ||
6 | "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" | ||
7 | + | ||
8 | +/* Tune for XScale. */ | ||
9 | +#define TARGET_TUNE_DEFAULT TARGET_CPU_xscale | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/gcc34-reverse-compare.patch b/meta/packages/gcc/gcc-3.4.3/gcc34-reverse-compare.patch deleted file mode 100644 index c3c40dd183..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/gcc34-reverse-compare.patch +++ /dev/null | |||
@@ -1,32 +0,0 @@ | |||
1 | --- gcc-3.4.0/gcc/flow.c.reverse-compare 2004-02-27 22:39:19.000000000 -0500 | ||
2 | +++ gcc-3.4.0/gcc/flow.c 2004-04-24 16:36:00.000000000 -0400 | ||
3 | @@ -1843,6 +1843,7 @@ | ||
4 | regset_head diff_head; | ||
5 | regset diff = INITIALIZE_REG_SET (diff_head); | ||
6 | basic_block bb_true, bb_false; | ||
7 | + enum rtx_code reversed_code; | ||
8 | int i; | ||
9 | |||
10 | /* Identify the successor blocks. */ | ||
11 | @@ -1889,8 +1890,11 @@ | ||
12 | if (GET_CODE (reg) == REG | ||
13 | && XEXP (cond_true, 1) == const0_rtx) | ||
14 | { | ||
15 | - rtx cond_false | ||
16 | - = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), | ||
17 | + rtx cond_false; | ||
18 | + reversed_code = reverse_condition (GET_CODE (cond_true)); | ||
19 | + if (reversed_code == UNKNOWN) | ||
20 | + goto skip; | ||
21 | + cond_false = gen_rtx_fmt_ee (reversed_code, | ||
22 | GET_MODE (cond_true), XEXP (cond_true, 0), | ||
23 | XEXP (cond_true, 1)); | ||
24 | if (GET_CODE (XEXP (set_src, 1)) == PC) | ||
25 | @@ -1925,6 +1929,7 @@ | ||
26 | } | ||
27 | } | ||
28 | |||
29 | + skip: | ||
30 | FREE_REG_SET (diff); | ||
31 | } | ||
32 | #endif | ||
diff --git a/meta/packages/gcc/gcc-3.4.3/sdk-libstdc++-includes.patch b/meta/packages/gcc/gcc-3.4.3/sdk-libstdc++-includes.patch deleted file mode 100644 index 4377c2143b..0000000000 --- a/meta/packages/gcc/gcc-3.4.3/sdk-libstdc++-includes.patch +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | --- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 | ||
2 | +++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 | ||
3 | @@ -32,7 +32,7 @@ | ||
4 | |||
5 | libmath_la_SOURCES = stubs.c | ||
6 | |||
7 | -AM_CPPFLAGS = $(CANADIAN_INCLUDES) | ||
8 | +AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include | ||
9 | |||
10 | # Only compiling "C" sources in this directory. | ||
11 | LIBTOOL = @LIBTOOL@ --tag CC | ||
12 | --- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 | ||
13 | +++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 | ||
14 | @@ -18,7 +18,7 @@ | ||
15 | $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once | ||
16 | |||
17 | # -I/-D flags to pass when compiling. | ||
18 | -AM_CPPFLAGS = $(GLIBCXX_INCLUDES) | ||
19 | +AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include | ||
20 | |||
21 | |||
22 | |||
diff --git a/meta/packages/gcc/gcc-3.4.4.inc b/meta/packages/gcc/gcc-3.4.4.inc new file mode 100644 index 0000000000..704d9bc5c8 --- /dev/null +++ b/meta/packages/gcc/gcc-3.4.4.inc | |||
@@ -0,0 +1,24 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | ||
4 | file://gcc34-reverse-compare.patch;patch=1 \ | ||
5 | file://gcc34-arm-ldm.patch;patch=1 \ | ||
6 | file://gcc34-arm-ldm-peephole.patch;patch=1 \ | ||
7 | file://gcc34-arm-tune.patch;patch=1 \ | ||
8 | file://gcc-3.4.1-uclibc-100-conf.patch;patch=1 \ | ||
9 | file://gcc-3.4.1-uclibc-200-locale.patch;patch=1 \ | ||
10 | file://gcc-3.4.0-arm-lib1asm.patch;patch=1 \ | ||
11 | file://gcc-3.4.0-arm-nolibfloat.patch;patch=1 \ | ||
12 | file://gcc-3.4.0-arm-bigendian.patch;patch=1 \ | ||
13 | file://gcc-3.4.0-arm-bigendian-uclibc.patch;patch=1 \ | ||
14 | file://GCC3.4.0VisibilityPatch.diff;patch=1 \ | ||
15 | file://15342.patch;patch=1 \ | ||
16 | file://jarfix.patch;patch=1 \ | ||
17 | file://always-fixincperm.patch;patch=1 \ | ||
18 | file://GCOV_PREFIX_STRIP-cross-profile_3.4.patch;patch=1 \ | ||
19 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
20 | file://gcc4-mtune-compat.patch;patch=1" | ||
21 | |||
22 | SRC_URI += "file://gcc34-configure.in.patch;patch=1" | ||
23 | SRC_URI += "file://gcc34-thumb-support.patch;patch=1" | ||
24 | SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " | ||
diff --git a/meta/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch b/meta/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch new file mode 100644 index 0000000000..701a687e05 --- /dev/null +++ b/meta/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch | |||
@@ -0,0 +1,389 @@ | |||
1 | 2005-05-04 Grigory Zagorodnev <grigory.zagorodnev@intel.com> | ||
2 | H.J. Lu <hongjiu.lu@intel.com> | ||
3 | |||
4 | |||
5 | Cross-profiling support: relocate .gcda files when | ||
6 | running at system other than executable been built on. | ||
7 | |||
8 | |||
9 | * gcov-io.c (gcov_open): When in libgcov library | ||
10 | use given data file relocation prefix to build file name. | ||
11 | * gcov-io.h (gcov_open): Updated proto to accept | ||
12 | data file relocation prefix. | ||
13 | * libgcov.c (create_file_directory): New function. | ||
14 | (gcov_prefix): New static variable to hold data file | ||
15 | relocation prefix. | ||
16 | (gcov_version): Use relocation prefix. | ||
17 | (gcov_exit): Always try to create directory for output | ||
18 | file. Relocate filename at each use. | ||
19 | (__gcov_init): Initialize directory relocation prefix | ||
20 | if required. Strip off leading directories from | ||
21 | the initial filename. | ||
22 | * tsystem.h: include filenames.h | ||
23 | (DIR_SEPARATOR): Macro copied from system.h. | ||
24 | (DIR_SEPARATOR_2): Likewise. | ||
25 | * doc/gcov.texi (Cross-profiling): New node documenting | ||
26 | cross-profiling management. | ||
27 | * doc/invoke.texi (-fprofile-arcs): xref to cross-profiling. | ||
28 | |||
29 | Grigory Zagorodnev | ||
30 | Intel Corporation | ||
31 | |||
32 | --- gcc-3.4/gcc/gcov-io.c.prefix 2004-02-26 13:54:47.000000000 -0800 | ||
33 | +++ gcc-3.4/gcc/gcov-io.c 2005-05-04 11:46:01.000000000 -0700 | ||
34 | @@ -55,13 +55,14 @@ static inline gcov_unsigned_t from_file | ||
35 | |||
36 | GCOV_LINKAGE int | ||
37 | #if IN_LIBGCOV | ||
38 | -gcov_open (const char *name) | ||
39 | +gcov_open (const char *prefix, const char *name) | ||
40 | #else | ||
41 | gcov_open (const char *name, int mode) | ||
42 | #endif | ||
43 | { | ||
44 | #if IN_LIBGCOV | ||
45 | const int mode = 0; | ||
46 | + char *tmp; | ||
47 | #endif | ||
48 | #if GCOV_LOCKED | ||
49 | struct flock s_flock; | ||
50 | @@ -83,6 +84,14 @@ gcov_open (const char *name, int mode) | ||
51 | #if !IN_LIBGCOV | ||
52 | gcov_var.endian = 0; | ||
53 | #endif | ||
54 | + | ||
55 | +#if IN_LIBGCOV | ||
56 | + /* Build complete filename with prefix */ | ||
57 | + tmp = alloca( strlen(prefix) + strlen(name) + 1); | ||
58 | + *tmp = '\0'; | ||
59 | + name = strcat( strcat(tmp, prefix), name); | ||
60 | +#endif | ||
61 | + | ||
62 | #if GCOV_LOCKED | ||
63 | if (mode > 0) | ||
64 | fd = open (name, O_RDWR); | ||
65 | --- gcc-3.4/gcc/gcov-io.h.prefix 2005-05-02 15:37:58.000000000 -0700 | ||
66 | +++ gcc-3.4/gcc/gcov-io.h 2005-05-04 11:46:01.000000000 -0700 | ||
67 | @@ -502,7 +502,7 @@ GCOV_LINKAGE struct gcov_var | ||
68 | functions for writing. Your file may become corrupted if you break | ||
69 | these invariants. */ | ||
70 | #if IN_LIBGCOV | ||
71 | -GCOV_LINKAGE int gcov_open (const char */*name*/) ATTRIBUTE_HIDDEN; | ||
72 | +GCOV_LINKAGE int gcov_open (const char */*prefix*/, const char */*name*/) ATTRIBUTE_HIDDEN; | ||
73 | #else | ||
74 | GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/); | ||
75 | GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t); | ||
76 | --- gcc-3.4/gcc/libgcov.c.prefix 2004-02-26 13:54:47.000000000 -0800 | ||
77 | +++ gcc-3.4/gcc/libgcov.c 2005-05-04 12:01:58.000000000 -0700 | ||
78 | @@ -92,6 +92,70 @@ static struct gcov_info *gcov_list; | ||
79 | object file included in multiple programs. */ | ||
80 | static gcov_unsigned_t gcov_crc32; | ||
81 | |||
82 | +/* Directory prefix to relocate coverage data file names */ | ||
83 | +static char *gcov_prefix = 0; | ||
84 | + | ||
85 | +/* Level of dirs to strip off the initial filename to relocate */ | ||
86 | +static int gcov_prefix_strip = 0; | ||
87 | + | ||
88 | +static int | ||
89 | +create_file_directory (const char *prefix, const char *filename) | ||
90 | +{ | ||
91 | + char *dname; | ||
92 | + char sep, *r, *s; | ||
93 | + size_t plen, flen; | ||
94 | + | ||
95 | + /* Detect directory separator */ | ||
96 | + s = strrchr (prefix, DIR_SEPARATOR); | ||
97 | +#ifdef DIR_SEPARATOR_2 | ||
98 | + if (! s) | ||
99 | + s = strrchr (prefix, DIR_SEPARATOR_2); | ||
100 | +#endif | ||
101 | + if (s) | ||
102 | + sep = *s; | ||
103 | + else | ||
104 | + sep = DIR_SEPARATOR; | ||
105 | + | ||
106 | + /* join prefix and filename, split path */ | ||
107 | + plen = strlen(prefix); | ||
108 | + flen = strlen(filename); | ||
109 | + r = alloca(plen + flen + 1); | ||
110 | + strncpy(r, prefix, plen); | ||
111 | + strncpy(r + plen, filename, flen); | ||
112 | + r[plen + flen] = '\0'; | ||
113 | + s = strrchr(r, sep); | ||
114 | + if (s) | ||
115 | + *(s + 1) = '\0'; | ||
116 | + | ||
117 | + if (access (r, F_OK) == 0) | ||
118 | + return 0; | ||
119 | + | ||
120 | + /* Skip consecutive separators. */ | ||
121 | + for (dname = r; *dname && *dname == sep; ++dname); | ||
122 | + while (1) | ||
123 | + { | ||
124 | + char *s = strchr (dname, sep); | ||
125 | + if (s == 0) | ||
126 | + break; | ||
127 | + *s = '\0'; | ||
128 | + /* Try to make directory if it doesn't already exist. */ | ||
129 | + if (access (r, F_OK) == -1 | ||
130 | + && mkdir (r, 0755) == -1 | ||
131 | + /* The directory might have been made by another process. */ | ||
132 | + && errno != EEXIST) | ||
133 | + { | ||
134 | + *s = sep; | ||
135 | + fprintf (stderr, "profiling:%s:Cannot create directory\n", r); | ||
136 | + return -1; | ||
137 | + }; | ||
138 | + *s = sep; | ||
139 | + /* Skip consecutive separators. */ | ||
140 | + for (dname = s + 1; *dname && *dname == sep; ++dname) | ||
141 | + ; | ||
142 | + } | ||
143 | + return 0; | ||
144 | +} | ||
145 | + | ||
146 | static int | ||
147 | gcov_version (struct gcov_info *ptr, gcov_unsigned_t version) | ||
148 | { | ||
149 | @@ -103,8 +167,8 @@ gcov_version (struct gcov_info *ptr, gco | ||
150 | GCOV_UNSIGNED2STRING (e, GCOV_VERSION); | ||
151 | |||
152 | fprintf (stderr, | ||
153 | - "profiling:%s:Version mismatch - expected %.4s got %.4s\n", | ||
154 | - ptr->filename, e, v); | ||
155 | + "profiling:%s%s:Version mismatch - expected %.4s got %.4s\n", | ||
156 | + gcov_prefix, ptr->filename, e, v); | ||
157 | return 0; | ||
158 | } | ||
159 | return 1; | ||
160 | @@ -204,9 +268,14 @@ gcov_exit (void) | ||
161 | fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1); | ||
162 | } | ||
163 | |||
164 | - if (!gcov_open (gi_ptr->filename)) | ||
165 | + if (create_file_directory (gcov_prefix, gi_ptr->filename)) | ||
166 | { | ||
167 | - fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename); | ||
168 | + fprintf (stderr, "profiling:%s%s:Skip\n", gcov_prefix, gi_ptr->filename); | ||
169 | + continue; | ||
170 | + } | ||
171 | + else if (!gcov_open (gcov_prefix, gi_ptr->filename)) | ||
172 | + { | ||
173 | + fprintf (stderr, "profiling:%s%s:Cannot open\n", gcov_prefix, gi_ptr->filename); | ||
174 | continue; | ||
175 | } | ||
176 | |||
177 | @@ -216,8 +285,8 @@ gcov_exit (void) | ||
178 | /* Merge data from file. */ | ||
179 | if (tag != GCOV_DATA_MAGIC) | ||
180 | { | ||
181 | - fprintf (stderr, "profiling:%s:Not a gcov data file\n", | ||
182 | - gi_ptr->filename); | ||
183 | + fprintf (stderr, "profiling:%s%s:Not a gcov data file\n", | ||
184 | + gcov_prefix, gi_ptr->filename); | ||
185 | read_fatal:; | ||
186 | gcov_close (); | ||
187 | continue; | ||
188 | @@ -250,8 +319,8 @@ gcov_exit (void) | ||
189 | || gcov_read_unsigned () != fi_ptr->checksum) | ||
190 | { | ||
191 | read_mismatch:; | ||
192 | - fprintf (stderr, "profiling:%s:Merge mismatch for %s\n", | ||
193 | - gi_ptr->filename, | ||
194 | + fprintf (stderr, "profiling:%s%s:Merge mismatch for %s\n", | ||
195 | + gcov_prefix, gi_ptr->filename, | ||
196 | f_ix + 1 ? "function" : "summaries"); | ||
197 | goto read_fatal; | ||
198 | } | ||
199 | @@ -309,8 +378,8 @@ gcov_exit (void) | ||
200 | if (!gcov_is_eof ()) | ||
201 | { | ||
202 | read_error:; | ||
203 | - fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n" | ||
204 | - : "profiling:%s:Error merging\n", gi_ptr->filename); | ||
205 | + fprintf (stderr, error < 0 ? "profiling:%s%s:Overflow merging\n" | ||
206 | + : "profiling:%s%s:Error merging\n", gcov_prefix, gi_ptr->filename); | ||
207 | goto read_fatal; | ||
208 | } | ||
209 | rewrite:; | ||
210 | @@ -357,8 +426,8 @@ gcov_exit (void) | ||
211 | && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs) | ||
212 | && memcmp (cs_all, cs_prg, sizeof (*cs_all))) | ||
213 | { | ||
214 | - fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s", | ||
215 | - gi_ptr->filename, GCOV_LOCKED | ||
216 | + fprintf (stderr, "profiling:%s%s:Invocation mismatch - some data files may have been removed%s", | ||
217 | + gcov_prefix, gi_ptr->filename, GCOV_LOCKED | ||
218 | ? "" : " or concurrent update without locking support"); | ||
219 | all.checksum = ~0u; | ||
220 | } | ||
221 | @@ -418,9 +487,9 @@ gcov_exit (void) | ||
222 | gcov_write_summary (GCOV_TAG_PROGRAM_SUMMARY, &program); | ||
223 | if ((error = gcov_close ())) | ||
224 | fprintf (stderr, error < 0 ? | ||
225 | - "profiling:%s:Overflow writing\n" : | ||
226 | - "profiling:%s:Error writing\n", | ||
227 | - gi_ptr->filename); | ||
228 | + "profiling:%s%s:Overflow writing\n" : | ||
229 | + "profiling:%s%s:Error writing\n", | ||
230 | + gcov_prefix, gi_ptr->filename); | ||
231 | } | ||
232 | } | ||
233 | |||
234 | @@ -430,11 +499,69 @@ gcov_exit (void) | ||
235 | void | ||
236 | __gcov_init (struct gcov_info *info) | ||
237 | { | ||
238 | + /* Save initial filename pointer to calculate CRC. */ | ||
239 | + const char *ptr = info->filename; | ||
240 | + | ||
241 | if (!info->version) | ||
242 | return; | ||
243 | + | ||
244 | + /* Initialize directory prefix if requred */ | ||
245 | + if (gcov_prefix == 0) | ||
246 | + { | ||
247 | + if ((gcov_prefix = getenv("GCOV_PREFIX"))) | ||
248 | + { | ||
249 | + char *tmp; | ||
250 | + | ||
251 | + /* Normalize prefix: take off trailing separator. */ | ||
252 | + tmp = gcov_prefix + strlen(gcov_prefix) - 1; | ||
253 | + if (IS_DIR_SEPARATOR(*tmp)) | ||
254 | + *tmp = '\0'; | ||
255 | + | ||
256 | + /* Check if the level of dirs to strip off specified */ | ||
257 | + if ((tmp = getenv("GCOV_PREFIX_STRIP"))) | ||
258 | + { | ||
259 | + gcov_prefix_strip = atoi (tmp); | ||
260 | + /* Do not consider negative values. */ | ||
261 | + if (gcov_prefix_strip < 0) | ||
262 | + gcov_prefix_strip = 0; | ||
263 | + }; | ||
264 | + } | ||
265 | + else | ||
266 | + gcov_prefix = (char *) ""; | ||
267 | + }; | ||
268 | + | ||
269 | + /* Strip off leading directories from the initial filename */ | ||
270 | + if (gcov_prefix_strip > 0) | ||
271 | + { | ||
272 | + char sep, *s; | ||
273 | + int level; | ||
274 | + const char *fname = info->filename; | ||
275 | + | ||
276 | + /* Detect directory separator */ | ||
277 | + s = strrchr (fname, DIR_SEPARATOR); | ||
278 | +#ifdef DIR_SEPARATOR_2 | ||
279 | + if (! s) | ||
280 | + s = strrchr (fname, DIR_SEPARATOR_2); | ||
281 | +#endif | ||
282 | + if (s) | ||
283 | + sep = *s; | ||
284 | + else | ||
285 | + sep = DIR_SEPARATOR; | ||
286 | + | ||
287 | + /* Skip selected directory levels */ | ||
288 | + for ( level = gcov_prefix_strip; level > 0; level--) | ||
289 | + if ((s = strchr(fname + 1, sep))) | ||
290 | + fname = s; | ||
291 | + else | ||
292 | + break; | ||
293 | + | ||
294 | + /* From this point info block refers stripped file name and | ||
295 | + further operations must add prefix to get complete name.*/ | ||
296 | + info->filename = fname; | ||
297 | + }; | ||
298 | + | ||
299 | if (gcov_version (info, info->version)) | ||
300 | { | ||
301 | - const char *ptr = info->filename; | ||
302 | gcov_unsigned_t crc32 = gcov_crc32; | ||
303 | |||
304 | do | ||
305 | --- gcc-3.4/gcc/tsystem.h.prefix 2003-11-12 16:07:48.000000000 -0800 | ||
306 | +++ gcc-3.4/gcc/tsystem.h 2005-05-04 12:12:08.000000000 -0700 | ||
307 | @@ -106,4 +106,15 @@ extern int errno; | ||
308 | #define NULL 0 | ||
309 | #endif | ||
310 | |||
311 | +/* Filename handling macros. */ | ||
312 | +#include "filenames.h" | ||
313 | + | ||
314 | +/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ | ||
315 | +#ifndef DIR_SEPARATOR | ||
316 | +# define DIR_SEPARATOR '/' | ||
317 | +# ifdef HAVE_DOS_BASED_FILE_SYSTEM | ||
318 | +# define DIR_SEPARATOR_2 '\\' | ||
319 | +# endif | ||
320 | +#endif | ||
321 | + | ||
322 | #endif /* ! GCC_TSYSTEM_H */ | ||
323 | Index: gcc-3.4/gcc/doc/gcov.texi | ||
324 | =================================================================== | ||
325 | RCS file: /cvsroot/gcc/gcc/gcc/doc/gcov.texi,v | ||
326 | retrieving revision 1.19.4.3 | ||
327 | diff -u -p -r1.19.4.3 gcov.texi | ||
328 | --- gcc-3.4/gcc/doc/gcov.texi 14 Mar 2004 22:31:20 -0000 1.19.4.3 | ||
329 | +++ gcc-3.4/gcc/doc/gcov.texi 4 May 2005 13:44:25 -0000 | ||
330 | @@ -42,6 +42,7 @@ test code coverage in your programs. | ||
331 | * Invoking Gcov:: How to use gcov. | ||
332 | * Gcov and Optimization:: Using gcov with GCC optimization. | ||
333 | * Gcov Data Files:: The files used by gcov. | ||
334 | +* Cross-profiling:: Data files relocation. | ||
335 | @end menu | ||
336 | |||
337 | @node Gcov Intro | ||
338 | @@ -510,3 +511,36 @@ information. | ||
339 | The full details of the file format is specified in @file{gcov-io.h}, | ||
340 | and functions provided in that header file should be used to access the | ||
341 | coverage files. | ||
342 | + | ||
343 | +@node Cross-profiling | ||
344 | +@section Data files relocation to support cross-profiling | ||
345 | + | ||
346 | +Running the program will cause profile output to be generated. For each | ||
347 | +source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda} | ||
348 | +file will be placed in the object file directory. That implicitly requires | ||
349 | +running the program at the same system as it was build or having same | ||
350 | +absolute directory structure on the target system (program will try | ||
351 | +to create needed directory structure). | ||
352 | + | ||
353 | +To support cross-profiling, program compiled with @option{-fprofile-arcs} | ||
354 | +performs data file relocation basing on two environment variables: | ||
355 | + | ||
356 | +@itemize @bullet | ||
357 | +@item | ||
358 | +GCOV_PREFIX contains the prefix to add to the absolute paths | ||
359 | +in the object file. | ||
360 | + | ||
361 | +@item | ||
362 | +GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off | ||
363 | +the hardwired absolute paths. Default value is 0. | ||
364 | +@end itemize | ||
365 | + | ||
366 | +For example, if object file @file{/user/build/foo.o} was build with | ||
367 | +@option{-fprofile-arcs}, the final executable will try to create data file | ||
368 | +@file{/user/build/foo.gcda} when running at the target system and will | ||
369 | +fail if corresponding directory does not exists and is not allowed to create. | ||
370 | + | ||
371 | +In this case, manipulating environment variables you can relocate data file | ||
372 | +to the suitable local directory. For our example, setting @samp{GCOV_PREFIX=/target/run} | ||
373 | +and @samp{GCOV_PREFIX_STRIP=1} values will force use of @file{/target/run/build/foo.gcda} | ||
374 | +file name. | ||
375 | Index: gcc-3.4/gcc/doc/invoke.texi | ||
376 | =================================================================== | ||
377 | RCS file: /cvsroot/gcc/gcc/gcc/doc/invoke.texi,v | ||
378 | retrieving revision 1.390.2.40 | ||
379 | diff -u -p -r1.390.2.40 invoke.texi | ||
380 | --- gcc-3.4/gcc/doc/invoke.texi 22 Apr 2005 06:49:59 -0000 1.390.2.40 | ||
381 | +++ gcc-3.4/gcc/doc/invoke.texi 4 May 2005 13:44:25 -0000 | ||
382 | @@ -3158,6 +3158,7 @@ explicitly specified and it is not the f | ||
383 | the basename of the source file. In both cases any suffix is removed | ||
384 | (e.g. @file{foo.gcda} for input file @file{dir/foo.c}, or | ||
385 | @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}). | ||
386 | +@xref{Cross-profiling}. | ||
387 | |||
388 | @itemize | ||
389 | |||
diff --git a/meta/packages/gcc/gcc-3.4.4/zecke-no-host-includes.patch b/meta/packages/gcc/gcc-3.4.4/zecke-no-host-includes.patch new file mode 100644 index 0000000000..069a965012 --- /dev/null +++ b/meta/packages/gcc/gcc-3.4.4/zecke-no-host-includes.patch | |||
@@ -0,0 +1,32 @@ | |||
1 | Index: gcc-3.4.4/gcc/c-incpath.c | ||
2 | =================================================================== | ||
3 | --- gcc-3.4.4.orig/gcc/c-incpath.c 2004-05-31 12:37:47.000000000 +0200 | ||
4 | +++ gcc-3.4.4/gcc/c-incpath.c 2006-05-15 20:07:31.000000000 +0200 | ||
5 | @@ -328,6 +328,27 @@ | ||
6 | else | ||
7 | heads[chain] = p; | ||
8 | tails[chain] = p; | ||
9 | + | ||
10 | + | ||
11 | +#ifdef CROSS_COMPILE | ||
12 | + /* A common error when cross compiling is including | ||
13 | + host headers. This code below will try to fail fast | ||
14 | + for cross compiling. Currently we consider /usr/include, | ||
15 | + /opt/include and /sw/include as harmful. */ | ||
16 | + { | ||
17 | + /* printf("Adding Path: %s\n", p->name ); */ | ||
18 | + if( strstr(p->name, "/usr/include" ) == p->name ) { | ||
19 | + fprintf(stderr, _("CROSS COMPILE Badness: /usr/include in INCLUDEPATH: %s\n"), p->name); | ||
20 | + abort(); | ||
21 | + } else if( strstr(p->name, "/sw/include") == p->name ) { | ||
22 | + fprintf(stderr, _("CROSS COMPILE Badness: /sw/include in INCLUDEPATH: %s\n"), p->name); | ||
23 | + abort(); | ||
24 | + } else if( strstr(p->name, "/opt/include") == p->name ) { | ||
25 | + fprintf(stderr, _("CROSS COMPILE Badness: /opt/include in INCLUDEPATH: %s\n"), p->name); | ||
26 | + abort(); | ||
27 | + } | ||
28 | + } | ||
29 | +#endif | ||
30 | } | ||
31 | |||
32 | /* Exported function to handle include chain merging, duplicate | ||
diff --git a/meta/packages/gcc/gcc-3.4.4/zecke-xgcc-cpp.patch b/meta/packages/gcc/gcc-3.4.4/zecke-xgcc-cpp.patch new file mode 100644 index 0000000000..ab6a3fd771 --- /dev/null +++ b/meta/packages/gcc/gcc-3.4.4/zecke-xgcc-cpp.patch | |||
@@ -0,0 +1,13 @@ | |||
1 | Index: gcc-3.4.4/Makefile.in | ||
2 | =================================================================== | ||
3 | --- gcc-3.4.4.orig/Makefile.in 2005-05-19 11:58:00.000000000 +0200 | ||
4 | +++ gcc-3.4.4/Makefile.in 2006-08-06 13:08:14.000000000 +0200 | ||
5 | @@ -21964,6 +21964,8 @@ | ||
6 | AS="$(AS_FOR_TARGET)"; export AS; \ | ||
7 | CC="$(CC_FOR_TARGET)"; export CC; \ | ||
8 | CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \ | ||
9 | + CPP="$(CC_FOR_TARGET) -E"; export CCP; \ | ||
10 | + CPPFLAGS=""; export CPPFLAGS; \ | ||
11 | CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \ | ||
12 | CPPFLAGS="$(CFLAGS_FOR_TARGET)"; export CPPFLAGS; \ | ||
13 | CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \ | ||
diff --git a/meta/packages/gcc/gcc-4.0.2.inc b/meta/packages/gcc/gcc-4.0.2.inc new file mode 100644 index 0000000000..a0a6a6ae66 --- /dev/null +++ b/meta/packages/gcc/gcc-4.0.2.inc | |||
@@ -0,0 +1,29 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | DEPENDS = "mpfr gmp" | ||
4 | |||
5 | SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | ||
6 | file://arm-nolibfloat.patch;patch=1 \ | ||
7 | file://arm-softfloat.patch;patch=1 \ | ||
8 | file://ldflags.patch;patch=1 \ | ||
9 | file://GCOV_PREFIX_STRIP-cross-profile_4.1.patch;patch=1 \ | ||
10 | file://zecke-xgcc-cpp.patch;patch=1 " | ||
11 | |||
12 | # uclibc patches below | ||
13 | SRC_URI_append = " file://100-uclibc-conf.patch;patch=1 \ | ||
14 | file://200-uclibc-locale.patch;patch=1 \ | ||
15 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
16 | file://302-c99-snprintf.patch;patch=1 \ | ||
17 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
18 | file://800-arm-bigendian.patch;patch=1 \ | ||
19 | file://zecke-host-cpp-ac-hack.patch;patch=1 \ | ||
20 | file://gcc-4.0.2-atmel.0.99.2.patch;patch=1 \ | ||
21 | " | ||
22 | |||
23 | SRC_URI_append_fail-fast = " file://zecke-no-host-includes.patch;patch=1 " | ||
24 | |||
25 | # Language Overrides | ||
26 | FORTRAN = "" | ||
27 | |||
28 | EXTRA_OECONF += "--disable-libssp" | ||
29 | |||
diff --git a/meta/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch b/meta/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch new file mode 100644 index 0000000000..92ce00a1e3 --- /dev/null +++ b/meta/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch | |||
@@ -0,0 +1,371 @@ | |||
1 | 2005-05-04 Grigory Zagorodnev <grigory.zagorodnev@intel.com> | ||
2 | H.J. Lu <hongjiu.lu@intel.com> | ||
3 | |||
4 | * gcov-io.c (gcov_open): When in libgcov library | ||
5 | use given data file relocation prefix to build file name. | ||
6 | * gcov-io.h (gcov_open): Updated proto to accept | ||
7 | data file relocation prefix. | ||
8 | * libgcov.c (create_file_directory): New function. | ||
9 | (gcov_prefix): New static variable to hold data file | ||
10 | relocation prefix. | ||
11 | (gcov_version): Use relocation prefix. | ||
12 | (gcov_exit): Always try to create directory for output | ||
13 | file. Relocate filename at each use. | ||
14 | (__gcov_init): Initialize directory relocation prefix | ||
15 | if required. Strip off leading directories from | ||
16 | the initial filename. | ||
17 | * tsystem.h: include filenames.h | ||
18 | (DIR_SEPARATOR): Macro copied from system.h. | ||
19 | (DIR_SEPARATOR_2): Likewise. | ||
20 | * doc/gcov.texi (Cross-profiling): New node documenting | ||
21 | cross-profiling management. | ||
22 | * doc/invoke.texi (-fprofile-arcs): xref to cross-profiling. | ||
23 | |||
24 | --- gcc-4/gcc/doc/gcov.texi.prefix 2005-03-28 11:56:34.000000000 -0800 | ||
25 | +++ gcc-4/gcc/doc/gcov.texi 2005-05-04 15:07:44.000000000 -0700 | ||
26 | @@ -42,6 +42,7 @@ test code coverage in your programs. | ||
27 | * Invoking Gcov:: How to use gcov. | ||
28 | * Gcov and Optimization:: Using gcov with GCC optimization. | ||
29 | * Gcov Data Files:: The files used by gcov. | ||
30 | +* Cross-profiling:: Data files relocation. | ||
31 | @end menu | ||
32 | |||
33 | @node Gcov Intro | ||
34 | @@ -531,3 +532,36 @@ information. | ||
35 | The full details of the file format is specified in @file{gcov-io.h}, | ||
36 | and functions provided in that header file should be used to access the | ||
37 | coverage files. | ||
38 | + | ||
39 | +@node Cross-profiling | ||
40 | +@section Data files relocation to support cross-profiling | ||
41 | + | ||
42 | +Running the program will cause profile output to be generated. For each | ||
43 | +source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda} | ||
44 | +file will be placed in the object file directory. That implicitly requires | ||
45 | +running the program at the same system as it was build or having same | ||
46 | +absolute directory structure on the target system (program will try | ||
47 | +to create needed directory structure). | ||
48 | + | ||
49 | +To support cross-profiling, program compiled with @option{-fprofile-arcs} | ||
50 | +performs data file relocation basing on two environment variables: | ||
51 | + | ||
52 | +@itemize @bullet | ||
53 | +@item | ||
54 | +GCOV_PREFIX contains the prefix to add to the absolute paths | ||
55 | +in the object file. | ||
56 | + | ||
57 | +@item | ||
58 | +GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off | ||
59 | +the hardwired absolute paths. Default value is 0. | ||
60 | +@end itemize | ||
61 | + | ||
62 | +For example, if object file @file{/user/build/foo.o} was build with | ||
63 | +@option{-fprofile-arcs}, the final executable will try to create data file | ||
64 | +@file{/user/build/foo.gcda} when running at the target system and will | ||
65 | +fail if corresponding directory does not exists and is not allowed to create. | ||
66 | + | ||
67 | +In this case, manipulating environment variables you can relocate data file | ||
68 | +to the suitable local directory. For our example, setting @samp{GCOV_PREFIX=/target/run} | ||
69 | +and @samp{GCOV_PREFIX_STRIP=1} values will force use of @file{/target/run/build/foo.gcda} | ||
70 | +file name. | ||
71 | --- gcc-4/gcc/doc/invoke.texi.prefix 2005-05-04 11:21:00.000000000 -0700 | ||
72 | +++ gcc-4/gcc/doc/invoke.texi 2005-05-04 15:07:44.000000000 -0700 | ||
73 | @@ -3420,6 +3420,7 @@ explicitly specified and it is not the f | ||
74 | the basename of the source file. In both cases any suffix is removed | ||
75 | (e.g.@: @file{foo.gcda} for input file @file{dir/foo.c}, or | ||
76 | @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}). | ||
77 | +@xref{Cross-profiling}. | ||
78 | |||
79 | @cindex @command{gcov} | ||
80 | @item --coverage | ||
81 | --- gcc-4/gcc/gcov-io.c.prefix 2005-04-28 16:11:30.000000000 -0700 | ||
82 | +++ gcc-4/gcc/gcov-io.c 2005-05-04 20:02:35.000000000 -0700 | ||
83 | @@ -55,13 +55,14 @@ static inline gcov_unsigned_t from_file | ||
84 | |||
85 | GCOV_LINKAGE int | ||
86 | #if IN_LIBGCOV | ||
87 | -gcov_open (const char *name) | ||
88 | +gcov_open (const char *prefix, const char *name) | ||
89 | #else | ||
90 | gcov_open (const char *name, int mode) | ||
91 | #endif | ||
92 | { | ||
93 | #if IN_LIBGCOV | ||
94 | const int mode = 0; | ||
95 | + char *tmp; | ||
96 | #endif | ||
97 | #if GCOV_LOCKED | ||
98 | struct flock s_flock; | ||
99 | @@ -82,6 +83,13 @@ gcov_open (const char *name, int mode) | ||
100 | #if !IN_LIBGCOV | ||
101 | gcov_var.endian = 0; | ||
102 | #endif | ||
103 | + | ||
104 | +#if IN_LIBGCOV | ||
105 | + /* Build complete filename with prefix */ | ||
106 | + tmp = alloca (strlen (prefix) + strlen (name) + 1); | ||
107 | + name = strcat (strcpy (tmp, prefix), name); | ||
108 | +#endif | ||
109 | + | ||
110 | #if GCOV_LOCKED | ||
111 | if (mode > 0) | ||
112 | fd = open (name, O_RDWR); | ||
113 | --- gcc-4/gcc/gcov-io.h.prefix 2005-05-02 17:43:08.000000000 -0700 | ||
114 | +++ gcc-4/gcc/gcov-io.h 2005-05-04 15:07:44.000000000 -0700 | ||
115 | @@ -515,7 +515,7 @@ GCOV_LINKAGE struct gcov_var | ||
116 | functions for writing. Your file may become corrupted if you break | ||
117 | these invariants. */ | ||
118 | #if IN_LIBGCOV | ||
119 | -GCOV_LINKAGE int gcov_open (const char */*name*/) ATTRIBUTE_HIDDEN; | ||
120 | +GCOV_LINKAGE int gcov_open (const char */*prefix*/, const char */*name*/) ATTRIBUTE_HIDDEN; | ||
121 | #else | ||
122 | GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/); | ||
123 | GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t); | ||
124 | --- gcc-4/gcc/libgcov.c.prefix 2005-04-28 16:11:30.000000000 -0700 | ||
125 | +++ gcc-4/gcc/libgcov.c 2005-05-04 15:07:44.000000000 -0700 | ||
126 | @@ -92,6 +92,70 @@ static struct gcov_info *gcov_list; | ||
127 | object file included in multiple programs. */ | ||
128 | static gcov_unsigned_t gcov_crc32; | ||
129 | |||
130 | +/* Directory prefix to relocate coverage data file names */ | ||
131 | +static char *gcov_prefix = 0; | ||
132 | + | ||
133 | +/* Level of dirs to strip off the initial filename to relocate */ | ||
134 | +static int gcov_prefix_strip = 0; | ||
135 | + | ||
136 | +static int | ||
137 | +create_file_directory (const char *prefix, const char *filename) | ||
138 | +{ | ||
139 | + char *dname; | ||
140 | + char sep, *r, *s; | ||
141 | + size_t plen, flen; | ||
142 | + | ||
143 | + /* Detect directory separator */ | ||
144 | + s = strrchr (prefix, DIR_SEPARATOR); | ||
145 | +#ifdef DIR_SEPARATOR_2 | ||
146 | + if (! s) | ||
147 | + s = strrchr (prefix, DIR_SEPARATOR_2); | ||
148 | +#endif | ||
149 | + if (s) | ||
150 | + sep = *s; | ||
151 | + else | ||
152 | + sep = DIR_SEPARATOR; | ||
153 | + | ||
154 | + /* join prefix and filename, split path */ | ||
155 | + plen = strlen(prefix); | ||
156 | + flen = strlen(filename); | ||
157 | + r = alloca(plen + flen + 1); | ||
158 | + strncpy(r, prefix, plen); | ||
159 | + strncpy(r + plen, filename, flen); | ||
160 | + r[plen + flen] = '\0'; | ||
161 | + s = strrchr(r, sep); | ||
162 | + if (s) | ||
163 | + *(s + 1) = '\0'; | ||
164 | + | ||
165 | + if (access (r, F_OK) == 0) | ||
166 | + return 0; | ||
167 | + | ||
168 | + /* Skip consecutive separators. */ | ||
169 | + for (dname = r; *dname && *dname == sep; ++dname); | ||
170 | + while (1) | ||
171 | + { | ||
172 | + char *s = strchr (dname, sep); | ||
173 | + if (s == 0) | ||
174 | + break; | ||
175 | + *s = '\0'; | ||
176 | + /* Try to make directory if it doesn't already exist. */ | ||
177 | + if (access (r, F_OK) == -1 | ||
178 | + && mkdir (r, 0755) == -1 | ||
179 | + /* The directory might have been made by another process. */ | ||
180 | + && errno != EEXIST) | ||
181 | + { | ||
182 | + *s = sep; | ||
183 | + fprintf (stderr, "profiling:%s:Cannot create directory\n", r); | ||
184 | + return -1; | ||
185 | + }; | ||
186 | + *s = sep; | ||
187 | + /* Skip consecutive separators. */ | ||
188 | + for (dname = s + 1; *dname && *dname == sep; ++dname) | ||
189 | + ; | ||
190 | + } | ||
191 | + return 0; | ||
192 | +} | ||
193 | + | ||
194 | static int | ||
195 | gcov_version (struct gcov_info *ptr, gcov_unsigned_t version) | ||
196 | { | ||
197 | @@ -103,8 +167,8 @@ gcov_version (struct gcov_info *ptr, gco | ||
198 | GCOV_UNSIGNED2STRING (e, GCOV_VERSION); | ||
199 | |||
200 | fprintf (stderr, | ||
201 | - "profiling:%s:Version mismatch - expected %.4s got %.4s\n", | ||
202 | - ptr->filename, e, v); | ||
203 | + "profiling:%s%s:Version mismatch - expected %.4s got %.4s\n", | ||
204 | + gcov_prefix, ptr->filename, e, v); | ||
205 | return 0; | ||
206 | } | ||
207 | return 1; | ||
208 | @@ -205,9 +269,16 @@ gcov_exit (void) | ||
209 | fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1); | ||
210 | } | ||
211 | |||
212 | - if (!gcov_open (gi_ptr->filename)) | ||
213 | + if (create_file_directory (gcov_prefix, gi_ptr->filename)) | ||
214 | + { | ||
215 | + fprintf (stderr, "profiling:%s%s:Skip\n", gcov_prefix, | ||
216 | + gi_ptr->filename); | ||
217 | + continue; | ||
218 | + } | ||
219 | + else if (!gcov_open (gcov_prefix, gi_ptr->filename)) | ||
220 | { | ||
221 | - fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename); | ||
222 | + fprintf (stderr, "profiling:%s%s:Cannot open\n", gcov_prefix, | ||
223 | + gi_ptr->filename); | ||
224 | continue; | ||
225 | } | ||
226 | |||
227 | @@ -217,8 +288,8 @@ gcov_exit (void) | ||
228 | /* Merge data from file. */ | ||
229 | if (tag != GCOV_DATA_MAGIC) | ||
230 | { | ||
231 | - fprintf (stderr, "profiling:%s:Not a gcov data file\n", | ||
232 | - gi_ptr->filename); | ||
233 | + fprintf (stderr, "profiling:%s%s:Not a gcov data file\n", | ||
234 | + gcov_prefix, gi_ptr->filename); | ||
235 | goto read_fatal; | ||
236 | } | ||
237 | length = gcov_read_unsigned (); | ||
238 | @@ -245,8 +316,8 @@ gcov_exit (void) | ||
239 | || gcov_read_unsigned () != fi_ptr->checksum) | ||
240 | { | ||
241 | read_mismatch:; | ||
242 | - fprintf (stderr, "profiling:%s:Merge mismatch for %s\n", | ||
243 | - gi_ptr->filename, | ||
244 | + fprintf (stderr, "profiling:%s%s:Merge mismatch for %s\n", | ||
245 | + gcov_prefix, gi_ptr->filename, | ||
246 | f_ix + 1 ? "function" : "summaries"); | ||
247 | goto read_fatal; | ||
248 | } | ||
249 | @@ -305,7 +376,8 @@ gcov_exit (void) | ||
250 | |||
251 | read_error:; | ||
252 | fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n" | ||
253 | - : "profiling:%s:Error merging\n", gi_ptr->filename); | ||
254 | + : "profiling:%s%s:Error merging\n", gcov_prefix, | ||
255 | + gi_ptr->filename); | ||
256 | |||
257 | read_fatal:; | ||
258 | gcov_close (); | ||
259 | @@ -355,8 +427,8 @@ gcov_exit (void) | ||
260 | && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs) | ||
261 | && memcmp (cs_all, cs_prg, sizeof (*cs_all))) | ||
262 | { | ||
263 | - fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s", | ||
264 | - gi_ptr->filename, GCOV_LOCKED | ||
265 | + fprintf (stderr, "profiling:%s%s:Invocation mismatch - some data files may have been removed%s", | ||
266 | + gcov_prefix, gi_ptr->filename, GCOV_LOCKED | ||
267 | ? "" : " or concurrent update without locking support"); | ||
268 | all.checksum = ~0u; | ||
269 | } | ||
270 | @@ -419,9 +491,9 @@ gcov_exit (void) | ||
271 | gcov_write_unsigned (0); | ||
272 | if ((error = gcov_close ())) | ||
273 | fprintf (stderr, error < 0 ? | ||
274 | - "profiling:%s:Overflow writing\n" : | ||
275 | - "profiling:%s:Error writing\n", | ||
276 | - gi_ptr->filename); | ||
277 | + "profiling:%s%s:Overflow writing\n" : | ||
278 | + "profiling:%s%s:Error writing\n", | ||
279 | + gcov_prefix, gi_ptr->filename); | ||
280 | } | ||
281 | } | ||
282 | |||
283 | @@ -431,11 +503,69 @@ gcov_exit (void) | ||
284 | void | ||
285 | __gcov_init (struct gcov_info *info) | ||
286 | { | ||
287 | + /* Save initial filename pointer to calculate CRC. */ | ||
288 | + const char *ptr = info->filename; | ||
289 | + | ||
290 | if (!info->version) | ||
291 | return; | ||
292 | + | ||
293 | + /* Initialize directory prefix if requred */ | ||
294 | + if (gcov_prefix == 0) | ||
295 | + { | ||
296 | + if ((gcov_prefix = getenv("GCOV_PREFIX"))) | ||
297 | + { | ||
298 | + char *tmp; | ||
299 | + | ||
300 | + /* Normalize prefix: take off trailing separator. */ | ||
301 | + tmp = gcov_prefix + strlen(gcov_prefix) - 1; | ||
302 | + if (IS_DIR_SEPARATOR(*tmp)) | ||
303 | + *tmp = '\0'; | ||
304 | + | ||
305 | + /* Check if the level of dirs to strip off specified */ | ||
306 | + if ((tmp = getenv("GCOV_PREFIX_STRIP"))) | ||
307 | + { | ||
308 | + gcov_prefix_strip = atoi (tmp); | ||
309 | + /* Do not consider negative values. */ | ||
310 | + if (gcov_prefix_strip < 0) | ||
311 | + gcov_prefix_strip = 0; | ||
312 | + }; | ||
313 | + } | ||
314 | + else | ||
315 | + gcov_prefix = (char *) ""; | ||
316 | + }; | ||
317 | + | ||
318 | + /* Strip off leading directories from the initial filename */ | ||
319 | + if (gcov_prefix_strip > 0) | ||
320 | + { | ||
321 | + char sep, *s; | ||
322 | + int level; | ||
323 | + const char *fname = info->filename; | ||
324 | + | ||
325 | + /* Detect directory separator */ | ||
326 | + s = strrchr (fname, DIR_SEPARATOR); | ||
327 | +#ifdef DIR_SEPARATOR_2 | ||
328 | + if (! s) | ||
329 | + s = strrchr (fname, DIR_SEPARATOR_2); | ||
330 | +#endif | ||
331 | + if (s) | ||
332 | + sep = *s; | ||
333 | + else | ||
334 | + sep = DIR_SEPARATOR; | ||
335 | + | ||
336 | + /* Skip selected directory levels */ | ||
337 | + for ( level = gcov_prefix_strip; level > 0; level--) | ||
338 | + if ((s = strchr(fname + 1, sep))) | ||
339 | + fname = s; | ||
340 | + else | ||
341 | + break; | ||
342 | + | ||
343 | + /* From this point info block refers stripped file name and | ||
344 | + further operations must add prefix to get complete name.*/ | ||
345 | + info->filename = fname; | ||
346 | + }; | ||
347 | + | ||
348 | if (gcov_version (info, info->version)) | ||
349 | { | ||
350 | - const char *ptr = info->filename; | ||
351 | gcov_unsigned_t crc32 = gcov_crc32; | ||
352 | |||
353 | do | ||
354 | --- gcc-4/gcc/tsystem.h.prefix 2005-03-29 16:06:26.000000000 -0800 | ||
355 | +++ gcc-4/gcc/tsystem.h 2005-05-04 15:07:44.000000000 -0700 | ||
356 | @@ -131,4 +131,15 @@ extern int errno; | ||
357 | unreachable default case of a switch. Do not use gcc_assert(0). */ | ||
358 | #define gcc_unreachable() (abort ()) | ||
359 | |||
360 | +/* Filename handling macros. */ | ||
361 | +#include "filenames.h" | ||
362 | + | ||
363 | +/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */ | ||
364 | +#ifndef DIR_SEPARATOR | ||
365 | +# define DIR_SEPARATOR '/' | ||
366 | +# ifdef HAVE_DOS_BASED_FILE_SYSTEM | ||
367 | +# define DIR_SEPARATOR_2 '\\' | ||
368 | +# endif | ||
369 | +#endif | ||
370 | + | ||
371 | #endif /* ! GCC_TSYSTEM_H */ | ||
diff --git a/meta/packages/gcc/gcc-4.0.2/gcc-4.0.2-atmel.0.99.2.patch b/meta/packages/gcc/gcc-4.0.2/gcc-4.0.2-atmel.0.99.2.patch new file mode 100644 index 0000000000..273846f565 --- /dev/null +++ b/meta/packages/gcc/gcc-4.0.2/gcc-4.0.2-atmel.0.99.2.patch | |||
@@ -0,0 +1,21330 @@ | |||
1 | diff -Nrup --ignore-space-change gcc-4.0.2/config.sub gcc-4.0.2-atmel.0.99.2/config.sub | ||
2 | --- gcc-4.0.2/config.sub 2005-04-25 12:36:56.000000000 +0200 | ||
3 | +++ gcc-4.0.2-atmel.0.99.2/config.sub 2005-06-07 14:59:22.000000000 +0200 | ||
4 | @@ -1,9 +1,9 @@ | ||
5 | #! /bin/sh | ||
6 | # Configuration validation subroutine script. | ||
7 | # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, | ||
8 | -# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||
9 | +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
10 | |||
11 | -timestamp='2005-04-22' | ||
12 | +timestamp='2005-06-07' | ||
13 | |||
14 | # This file is (in principle) common to ALL GNU software. | ||
15 | # The presence of a machine in this file suggests that SOME GNU software | ||
16 | @@ -70,7 +70,7 @@ Report bugs and patches to <config-patch | ||
17 | version="\ | ||
18 | GNU config.sub ($timestamp) | ||
19 | |||
20 | -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
21 | +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 | ||
22 | Free Software Foundation, Inc. | ||
23 | |||
24 | This is free software; see the source for copying conditions. There is NO | ||
25 | @@ -230,8 +230,7 @@ case $basic_machine in | ||
26 | | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | ||
27 | | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | ||
28 | | am33_2.0 \ | ||
29 | - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | ||
30 | - | bfin \ | ||
31 | + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | ||
32 | | c4x | clipper \ | ||
33 | | d10v | d30v | dlx | dsp16xx \ | ||
34 | | fr30 | frv \ | ||
35 | @@ -263,8 +262,7 @@ case $basic_machine in | ||
36 | | pyramid \ | ||
37 | | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | ||
38 | | sh64 | sh64le \ | ||
39 | - | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | ||
40 | - | sparcv8 | sparcv9 | sparcv9b \ | ||
41 | + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | ||
42 | | strongarm \ | ||
43 | | tahoe | thumb | tic4x | tic80 | tron \ | ||
44 | | v850 | v850e \ | ||
45 | @@ -299,8 +297,8 @@ case $basic_machine in | ||
46 | | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | ||
47 | | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | ||
48 | | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | ||
49 | - | avr-* \ | ||
50 | - | bfin-* | bs2000-* \ | ||
51 | + | avr-* | avr32-* \ | ||
52 | + | bs2000-* \ | ||
53 | | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | ||
54 | | clipper-* | craynv-* | cydra-* \ | ||
55 | | d10v-* | d30v-* | dlx-* \ | ||
56 | @@ -338,8 +336,7 @@ case $basic_machine in | ||
57 | | romp-* | rs6000-* \ | ||
58 | | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | ||
59 | | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | ||
60 | - | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | ||
61 | - | sparclite-* \ | ||
62 | + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | ||
63 | | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | ||
64 | | tahoe-* | thumb-* \ | ||
65 | | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | ||
66 | diff -Nrup --ignore-space-change gcc-4.0.2/configure gcc-4.0.2-atmel.0.99.2/configure | ||
67 | --- gcc-4.0.2/configure 2005-09-13 09:01:28.000000000 +0200 | ||
68 | +++ gcc-4.0.2-atmel.0.99.2/configure 2006-01-20 14:31:15.000000000 +0100 | ||
69 | @@ -1284,6 +1284,9 @@ case "${target}" in | ||
70 | arm-*-riscix*) | ||
71 | noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}" | ||
72 | ;; | ||
73 | + avr32-*-*) | ||
74 | + noconfigdirs="$noconfigdirs target-libiberty target-libmudflap target-libffi ${libgcj}" | ||
75 | + ;; | ||
76 | avr-*-*) | ||
77 | noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}" | ||
78 | ;; | ||
79 | @@ -1804,7 +1807,7 @@ else | ||
80 | # Extract the first word of "gcc", so it can be a program name with args. | ||
81 | set dummy gcc; ac_word=$2 | ||
82 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
83 | -echo "configure:1808: checking for $ac_word" >&5 | ||
84 | +echo "configure:1811: checking for $ac_word" >&5 | ||
85 | if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then | ||
86 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
87 | else | ||
88 | @@ -1834,7 +1837,7 @@ if test -z "$CC"; then | ||
89 | # Extract the first word of "cc", so it can be a program name with args. | ||
90 | set dummy cc; ac_word=$2 | ||
91 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
92 | -echo "configure:1838: checking for $ac_word" >&5 | ||
93 | +echo "configure:1841: checking for $ac_word" >&5 | ||
94 | if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then | ||
95 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
96 | else | ||
97 | @@ -1885,7 +1888,7 @@ fi | ||
98 | # Extract the first word of "cl", so it can be a program name with args. | ||
99 | set dummy cl; ac_word=$2 | ||
100 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
101 | -echo "configure:1889: checking for $ac_word" >&5 | ||
102 | +echo "configure:1892: checking for $ac_word" >&5 | ||
103 | if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then | ||
104 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
105 | else | ||
106 | @@ -1917,7 +1920,7 @@ fi | ||
107 | fi | ||
108 | |||
109 | echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 | ||
110 | -echo "configure:1921: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 | ||
111 | +echo "configure:1924: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 | ||
112 | |||
113 | ac_ext=c | ||
114 | # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. | ||
115 | @@ -1928,12 +1931,12 @@ cross_compiling=$ac_cv_prog_cc_cross | ||
116 | |||
117 | cat > conftest.$ac_ext << EOF | ||
118 | |||
119 | -#line 1932 "configure" | ||
120 | +#line 1935 "configure" | ||
121 | #include "confdefs.h" | ||
122 | |||
123 | main(){return(0);} | ||
124 | EOF | ||
125 | -if { (eval echo configure:1937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then | ||
126 | +if { (eval echo configure:1940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then | ||
127 | ac_cv_prog_cc_works=yes | ||
128 | # If we can't run a trivial program, we are probably using a cross compiler. | ||
129 | if (./conftest; exit) 2>/dev/null; then | ||
130 | @@ -1959,12 +1962,12 @@ if test $ac_cv_prog_cc_works = no; then | ||
131 | { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } | ||
132 | fi | ||
133 | echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 | ||
134 | -echo "configure:1963: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 | ||
135 | +echo "configure:1966: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 | ||
136 | echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 | ||
137 | cross_compiling=$ac_cv_prog_cc_cross | ||
138 | |||
139 | echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 | ||
140 | -echo "configure:1968: checking whether we are using GNU C" >&5 | ||
141 | +echo "configure:1971: checking whether we are using GNU C" >&5 | ||
142 | if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then | ||
143 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
144 | else | ||
145 | @@ -1973,7 +1976,7 @@ else | ||
146 | yes; | ||
147 | #endif | ||
148 | EOF | ||
149 | -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then | ||
150 | +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1980: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then | ||
151 | ac_cv_prog_gcc=yes | ||
152 | else | ||
153 | ac_cv_prog_gcc=no | ||
154 | @@ -1992,7 +1995,7 @@ ac_test_CFLAGS="${CFLAGS+set}" | ||
155 | ac_save_CFLAGS="$CFLAGS" | ||
156 | CFLAGS= | ||
157 | echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 | ||
158 | -echo "configure:1996: checking whether ${CC-cc} accepts -g" >&5 | ||
159 | +echo "configure:1999: checking whether ${CC-cc} accepts -g" >&5 | ||
160 | if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then | ||
161 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
162 | else | ||
163 | @@ -2059,7 +2062,7 @@ fi | ||
164 | # Extract the first word of "${ac_tool_prefix}gnatbind", so it can be a program name with args. | ||
165 | set dummy ${ac_tool_prefix}gnatbind; ac_word=$2 | ||
166 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
167 | -echo "configure:2063: checking for $ac_word" >&5 | ||
168 | +echo "configure:2066: checking for $ac_word" >&5 | ||
169 | if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then | ||
170 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
171 | else | ||
172 | @@ -2091,7 +2094,7 @@ if test -n "$ac_tool_prefix"; then | ||
173 | # Extract the first word of "gnatbind", so it can be a program name with args. | ||
174 | set dummy gnatbind; ac_word=$2 | ||
175 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
176 | -echo "configure:2095: checking for $ac_word" >&5 | ||
177 | +echo "configure:2098: checking for $ac_word" >&5 | ||
178 | if eval "test \"`echo '$''{'ac_cv_prog_GNATBIND'+set}'`\" = set"; then | ||
179 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
180 | else | ||
181 | @@ -2124,7 +2127,7 @@ fi | ||
182 | fi | ||
183 | |||
184 | echo $ac_n "checking whether compiler driver understands Ada""... $ac_c" 1>&6 | ||
185 | -echo "configure:2128: checking whether compiler driver understands Ada" >&5 | ||
186 | +echo "configure:2131: checking whether compiler driver understands Ada" >&5 | ||
187 | if eval "test \"`echo '$''{'acx_cv_cc_gcc_supports_ada'+set}'`\" = set"; then | ||
188 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
189 | else | ||
190 | @@ -2156,7 +2159,7 @@ else | ||
191 | fi | ||
192 | |||
193 | echo $ac_n "checking how to compare bootstrapped objects""... $ac_c" 1>&6 | ||
194 | -echo "configure:2160: checking how to compare bootstrapped objects" >&5 | ||
195 | +echo "configure:2163: checking how to compare bootstrapped objects" >&5 | ||
196 | if eval "test \"`echo '$''{'gcc_cv_prog_cmp_skip'+set}'`\" = set"; then | ||
197 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
198 | else | ||
199 | @@ -2254,9 +2257,9 @@ saved_CFLAGS="$CFLAGS" | ||
200 | CFLAGS="$CFLAGS $gmpinc" | ||
201 | # Check GMP actually works | ||
202 | echo $ac_n "checking for correct version of gmp.h""... $ac_c" 1>&6 | ||
203 | -echo "configure:2258: checking for correct version of gmp.h" >&5 | ||
204 | +echo "configure:2261: checking for correct version of gmp.h" >&5 | ||
205 | cat > conftest.$ac_ext <<EOF | ||
206 | -#line 2260 "configure" | ||
207 | +#line 2263 "configure" | ||
208 | #include "confdefs.h" | ||
209 | #include "gmp.h" | ||
210 | int main() { | ||
211 | @@ -2267,7 +2270,7 @@ choke me | ||
212 | |||
213 | ; return 0; } | ||
214 | EOF | ||
215 | -if { (eval echo configure:2271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then | ||
216 | +if { (eval echo configure:2274: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then | ||
217 | rm -rf conftest* | ||
218 | echo "$ac_t""yes" 1>&6 | ||
219 | else | ||
220 | @@ -2280,12 +2283,12 @@ rm -f conftest* | ||
221 | |||
222 | if test x"$have_gmp" = xyes; then | ||
223 | echo $ac_n "checking for MPFR""... $ac_c" 1>&6 | ||
224 | -echo "configure:2284: checking for MPFR" >&5 | ||
225 | +echo "configure:2287: checking for MPFR" >&5 | ||
226 | |||
227 | saved_LIBS="$LIBS" | ||
228 | LIBS="$LIBS $gmplibs" | ||
229 | cat > conftest.$ac_ext <<EOF | ||
230 | -#line 2289 "configure" | ||
231 | +#line 2292 "configure" | ||
232 | #include "confdefs.h" | ||
233 | #include <gmp.h> | ||
234 | #include <mpfr.h> | ||
235 | @@ -2293,7 +2296,7 @@ int main() { | ||
236 | mpfr_t n; mpfr_init(n); | ||
237 | ; return 0; } | ||
238 | EOF | ||
239 | -if { (eval echo configure:2297: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then | ||
240 | +if { (eval echo configure:2300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then | ||
241 | rm -rf conftest* | ||
242 | echo "$ac_t""yes" 1>&6 | ||
243 | else | ||
244 | @@ -2789,7 +2792,7 @@ do | ||
245 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
246 | set dummy $ac_prog; ac_word=$2 | ||
247 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
248 | -echo "configure:2793: checking for $ac_word" >&5 | ||
249 | +echo "configure:2796: checking for $ac_word" >&5 | ||
250 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_BISON'+set}'`\" = set"; then | ||
251 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
252 | else | ||
253 | @@ -2824,7 +2827,7 @@ do | ||
254 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
255 | set dummy $ac_prog; ac_word=$2 | ||
256 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
257 | -echo "configure:2828: checking for $ac_word" >&5 | ||
258 | +echo "configure:2831: checking for $ac_word" >&5 | ||
259 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_YACC'+set}'`\" = set"; then | ||
260 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
261 | else | ||
262 | @@ -2859,7 +2862,7 @@ do | ||
263 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
264 | set dummy $ac_prog; ac_word=$2 | ||
265 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
266 | -echo "configure:2863: checking for $ac_word" >&5 | ||
267 | +echo "configure:2866: checking for $ac_word" >&5 | ||
268 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_M4'+set}'`\" = set"; then | ||
269 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
270 | else | ||
271 | @@ -2894,7 +2897,7 @@ do | ||
272 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
273 | set dummy $ac_prog; ac_word=$2 | ||
274 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
275 | -echo "configure:2898: checking for $ac_word" >&5 | ||
276 | +echo "configure:2901: checking for $ac_word" >&5 | ||
277 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_FLEX'+set}'`\" = set"; then | ||
278 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
279 | else | ||
280 | @@ -2929,7 +2932,7 @@ do | ||
281 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
282 | set dummy $ac_prog; ac_word=$2 | ||
283 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
284 | -echo "configure:2933: checking for $ac_word" >&5 | ||
285 | +echo "configure:2936: checking for $ac_word" >&5 | ||
286 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LEX'+set}'`\" = set"; then | ||
287 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
288 | else | ||
289 | @@ -2964,7 +2967,7 @@ do | ||
290 | # Extract the first word of "$ac_prog", so it can be a program name with args. | ||
291 | set dummy $ac_prog; ac_word=$2 | ||
292 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
293 | -echo "configure:2968: checking for $ac_word" >&5 | ||
294 | +echo "configure:2971: checking for $ac_word" >&5 | ||
295 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_MAKEINFO'+set}'`\" = set"; then | ||
296 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
297 | else | ||
298 | @@ -3611,7 +3614,7 @@ test -n "$target_alias" && ncn_target_to | ||
299 | # Extract the first word of "${ncn_tool_prefix}ar", so it can be a program name with args. | ||
300 | set dummy ${ncn_tool_prefix}ar; ac_word=$2 | ||
301 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
302 | -echo "configure:3615: checking for $ac_word" >&5 | ||
303 | +echo "configure:3618: checking for $ac_word" >&5 | ||
304 | if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then | ||
305 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
306 | else | ||
307 | @@ -3644,7 +3647,7 @@ if test -z "$ac_cv_prog_AR" ; then | ||
308 | # Extract the first word of "ar", so it can be a program name with args. | ||
309 | set dummy ar; ac_word=$2 | ||
310 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
311 | -echo "configure:3648: checking for $ac_word" >&5 | ||
312 | +echo "configure:3651: checking for $ac_word" >&5 | ||
313 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AR'+set}'`\" = set"; then | ||
314 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
315 | else | ||
316 | @@ -3683,7 +3686,7 @@ fi | ||
317 | # Extract the first word of "${ncn_tool_prefix}as", so it can be a program name with args. | ||
318 | set dummy ${ncn_tool_prefix}as; ac_word=$2 | ||
319 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
320 | -echo "configure:3687: checking for $ac_word" >&5 | ||
321 | +echo "configure:3690: checking for $ac_word" >&5 | ||
322 | if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then | ||
323 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
324 | else | ||
325 | @@ -3716,7 +3719,7 @@ if test -z "$ac_cv_prog_AS" ; then | ||
326 | # Extract the first word of "as", so it can be a program name with args. | ||
327 | set dummy as; ac_word=$2 | ||
328 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
329 | -echo "configure:3720: checking for $ac_word" >&5 | ||
330 | +echo "configure:3723: checking for $ac_word" >&5 | ||
331 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AS'+set}'`\" = set"; then | ||
332 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
333 | else | ||
334 | @@ -3755,7 +3758,7 @@ fi | ||
335 | # Extract the first word of "${ncn_tool_prefix}dlltool", so it can be a program name with args. | ||
336 | set dummy ${ncn_tool_prefix}dlltool; ac_word=$2 | ||
337 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
338 | -echo "configure:3759: checking for $ac_word" >&5 | ||
339 | +echo "configure:3762: checking for $ac_word" >&5 | ||
340 | if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then | ||
341 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
342 | else | ||
343 | @@ -3788,7 +3791,7 @@ if test -z "$ac_cv_prog_DLLTOOL" ; then | ||
344 | # Extract the first word of "dlltool", so it can be a program name with args. | ||
345 | set dummy dlltool; ac_word=$2 | ||
346 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
347 | -echo "configure:3792: checking for $ac_word" >&5 | ||
348 | +echo "configure:3795: checking for $ac_word" >&5 | ||
349 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_DLLTOOL'+set}'`\" = set"; then | ||
350 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
351 | else | ||
352 | @@ -3827,7 +3830,7 @@ fi | ||
353 | # Extract the first word of "${ncn_tool_prefix}ld", so it can be a program name with args. | ||
354 | set dummy ${ncn_tool_prefix}ld; ac_word=$2 | ||
355 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
356 | -echo "configure:3831: checking for $ac_word" >&5 | ||
357 | +echo "configure:3834: checking for $ac_word" >&5 | ||
358 | if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then | ||
359 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
360 | else | ||
361 | @@ -3860,7 +3863,7 @@ if test -z "$ac_cv_prog_LD" ; then | ||
362 | # Extract the first word of "ld", so it can be a program name with args. | ||
363 | set dummy ld; ac_word=$2 | ||
364 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
365 | -echo "configure:3864: checking for $ac_word" >&5 | ||
366 | +echo "configure:3867: checking for $ac_word" >&5 | ||
367 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_LD'+set}'`\" = set"; then | ||
368 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
369 | else | ||
370 | @@ -3899,7 +3902,7 @@ fi | ||
371 | # Extract the first word of "${ncn_tool_prefix}nm", so it can be a program name with args. | ||
372 | set dummy ${ncn_tool_prefix}nm; ac_word=$2 | ||
373 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
374 | -echo "configure:3903: checking for $ac_word" >&5 | ||
375 | +echo "configure:3906: checking for $ac_word" >&5 | ||
376 | if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then | ||
377 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
378 | else | ||
379 | @@ -3932,7 +3935,7 @@ if test -z "$ac_cv_prog_NM" ; then | ||
380 | # Extract the first word of "nm", so it can be a program name with args. | ||
381 | set dummy nm; ac_word=$2 | ||
382 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
383 | -echo "configure:3936: checking for $ac_word" >&5 | ||
384 | +echo "configure:3939: checking for $ac_word" >&5 | ||
385 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_NM'+set}'`\" = set"; then | ||
386 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
387 | else | ||
388 | @@ -3971,7 +3974,7 @@ fi | ||
389 | # Extract the first word of "${ncn_tool_prefix}ranlib", so it can be a program name with args. | ||
390 | set dummy ${ncn_tool_prefix}ranlib; ac_word=$2 | ||
391 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
392 | -echo "configure:3975: checking for $ac_word" >&5 | ||
393 | +echo "configure:3978: checking for $ac_word" >&5 | ||
394 | if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then | ||
395 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
396 | else | ||
397 | @@ -4004,7 +4007,7 @@ if test -z "$ac_cv_prog_RANLIB" ; then | ||
398 | # Extract the first word of "ranlib", so it can be a program name with args. | ||
399 | set dummy ranlib; ac_word=$2 | ||
400 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
401 | -echo "configure:4008: checking for $ac_word" >&5 | ||
402 | +echo "configure:4011: checking for $ac_word" >&5 | ||
403 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_RANLIB'+set}'`\" = set"; then | ||
404 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
405 | else | ||
406 | @@ -4043,7 +4046,7 @@ fi | ||
407 | # Extract the first word of "${ncn_tool_prefix}windres", so it can be a program name with args. | ||
408 | set dummy ${ncn_tool_prefix}windres; ac_word=$2 | ||
409 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
410 | -echo "configure:4047: checking for $ac_word" >&5 | ||
411 | +echo "configure:4050: checking for $ac_word" >&5 | ||
412 | if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then | ||
413 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
414 | else | ||
415 | @@ -4076,7 +4079,7 @@ if test -z "$ac_cv_prog_WINDRES" ; then | ||
416 | # Extract the first word of "windres", so it can be a program name with args. | ||
417 | set dummy windres; ac_word=$2 | ||
418 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
419 | -echo "configure:4080: checking for $ac_word" >&5 | ||
420 | +echo "configure:4083: checking for $ac_word" >&5 | ||
421 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_WINDRES'+set}'`\" = set"; then | ||
422 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
423 | else | ||
424 | @@ -4115,7 +4118,7 @@ fi | ||
425 | # Extract the first word of "${ncn_tool_prefix}objcopy", so it can be a program name with args. | ||
426 | set dummy ${ncn_tool_prefix}objcopy; ac_word=$2 | ||
427 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
428 | -echo "configure:4119: checking for $ac_word" >&5 | ||
429 | +echo "configure:4122: checking for $ac_word" >&5 | ||
430 | if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then | ||
431 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
432 | else | ||
433 | @@ -4148,7 +4151,7 @@ if test -z "$ac_cv_prog_OBJCOPY" ; then | ||
434 | # Extract the first word of "objcopy", so it can be a program name with args. | ||
435 | set dummy objcopy; ac_word=$2 | ||
436 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
437 | -echo "configure:4152: checking for $ac_word" >&5 | ||
438 | +echo "configure:4155: checking for $ac_word" >&5 | ||
439 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJCOPY'+set}'`\" = set"; then | ||
440 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
441 | else | ||
442 | @@ -4187,7 +4190,7 @@ fi | ||
443 | # Extract the first word of "${ncn_tool_prefix}objdump", so it can be a program name with args. | ||
444 | set dummy ${ncn_tool_prefix}objdump; ac_word=$2 | ||
445 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
446 | -echo "configure:4191: checking for $ac_word" >&5 | ||
447 | +echo "configure:4194: checking for $ac_word" >&5 | ||
448 | if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then | ||
449 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
450 | else | ||
451 | @@ -4220,7 +4223,7 @@ if test -z "$ac_cv_prog_OBJDUMP" ; then | ||
452 | # Extract the first word of "objdump", so it can be a program name with args. | ||
453 | set dummy objdump; ac_word=$2 | ||
454 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
455 | -echo "configure:4224: checking for $ac_word" >&5 | ||
456 | +echo "configure:4227: checking for $ac_word" >&5 | ||
457 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJDUMP'+set}'`\" = set"; then | ||
458 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
459 | else | ||
460 | @@ -4266,7 +4269,7 @@ fi | ||
461 | # Extract the first word of "${ncn_target_tool_prefix}ar", so it can be a program name with args. | ||
462 | set dummy ${ncn_target_tool_prefix}ar; ac_word=$2 | ||
463 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
464 | -echo "configure:4270: checking for $ac_word" >&5 | ||
465 | +echo "configure:4273: checking for $ac_word" >&5 | ||
466 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then | ||
467 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
468 | else | ||
469 | @@ -4299,7 +4302,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AR_FO | ||
470 | # Extract the first word of "ar", so it can be a program name with args. | ||
471 | set dummy ar; ac_word=$2 | ||
472 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
473 | -echo "configure:4303: checking for $ac_word" >&5 | ||
474 | +echo "configure:4306: checking for $ac_word" >&5 | ||
475 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then | ||
476 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
477 | else | ||
478 | @@ -4338,7 +4341,7 @@ fi | ||
479 | # Extract the first word of "${ncn_target_tool_prefix}as", so it can be a program name with args. | ||
480 | set dummy ${ncn_target_tool_prefix}as; ac_word=$2 | ||
481 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
482 | -echo "configure:4342: checking for $ac_word" >&5 | ||
483 | +echo "configure:4345: checking for $ac_word" >&5 | ||
484 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then | ||
485 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
486 | else | ||
487 | @@ -4371,7 +4374,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AS_FO | ||
488 | # Extract the first word of "as", so it can be a program name with args. | ||
489 | set dummy as; ac_word=$2 | ||
490 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
491 | -echo "configure:4375: checking for $ac_word" >&5 | ||
492 | +echo "configure:4378: checking for $ac_word" >&5 | ||
493 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then | ||
494 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
495 | else | ||
496 | @@ -4410,7 +4413,7 @@ fi | ||
497 | # Extract the first word of "${ncn_target_tool_prefix}dlltool", so it can be a program name with args. | ||
498 | set dummy ${ncn_target_tool_prefix}dlltool; ac_word=$2 | ||
499 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
500 | -echo "configure:4414: checking for $ac_word" >&5 | ||
501 | +echo "configure:4417: checking for $ac_word" >&5 | ||
502 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then | ||
503 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
504 | else | ||
505 | @@ -4443,7 +4446,7 @@ if test -z "$ac_cv_prog_CONFIGURED_DLLTO | ||
506 | # Extract the first word of "dlltool", so it can be a program name with args. | ||
507 | set dummy dlltool; ac_word=$2 | ||
508 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
509 | -echo "configure:4447: checking for $ac_word" >&5 | ||
510 | +echo "configure:4450: checking for $ac_word" >&5 | ||
511 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then | ||
512 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
513 | else | ||
514 | @@ -4482,7 +4485,7 @@ fi | ||
515 | # Extract the first word of "${ncn_target_tool_prefix}ld", so it can be a program name with args. | ||
516 | set dummy ${ncn_target_tool_prefix}ld; ac_word=$2 | ||
517 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
518 | -echo "configure:4486: checking for $ac_word" >&5 | ||
519 | +echo "configure:4489: checking for $ac_word" >&5 | ||
520 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then | ||
521 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
522 | else | ||
523 | @@ -4515,7 +4518,7 @@ if test -z "$ac_cv_prog_CONFIGURED_LD_FO | ||
524 | # Extract the first word of "ld", so it can be a program name with args. | ||
525 | set dummy ld; ac_word=$2 | ||
526 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
527 | -echo "configure:4519: checking for $ac_word" >&5 | ||
528 | +echo "configure:4522: checking for $ac_word" >&5 | ||
529 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then | ||
530 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
531 | else | ||
532 | @@ -4554,7 +4557,7 @@ fi | ||
533 | # Extract the first word of "${ncn_target_tool_prefix}nm", so it can be a program name with args. | ||
534 | set dummy ${ncn_target_tool_prefix}nm; ac_word=$2 | ||
535 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
536 | -echo "configure:4558: checking for $ac_word" >&5 | ||
537 | +echo "configure:4561: checking for $ac_word" >&5 | ||
538 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then | ||
539 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
540 | else | ||
541 | @@ -4587,7 +4590,7 @@ if test -z "$ac_cv_prog_CONFIGURED_NM_FO | ||
542 | # Extract the first word of "nm", so it can be a program name with args. | ||
543 | set dummy nm; ac_word=$2 | ||
544 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
545 | -echo "configure:4591: checking for $ac_word" >&5 | ||
546 | +echo "configure:4594: checking for $ac_word" >&5 | ||
547 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then | ||
548 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
549 | else | ||
550 | @@ -4626,7 +4629,7 @@ fi | ||
551 | # Extract the first word of "${ncn_target_tool_prefix}ranlib", so it can be a program name with args. | ||
552 | set dummy ${ncn_target_tool_prefix}ranlib; ac_word=$2 | ||
553 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
554 | -echo "configure:4630: checking for $ac_word" >&5 | ||
555 | +echo "configure:4633: checking for $ac_word" >&5 | ||
556 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then | ||
557 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
558 | else | ||
559 | @@ -4659,7 +4662,7 @@ if test -z "$ac_cv_prog_CONFIGURED_RANLI | ||
560 | # Extract the first word of "ranlib", so it can be a program name with args. | ||
561 | set dummy ranlib; ac_word=$2 | ||
562 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
563 | -echo "configure:4663: checking for $ac_word" >&5 | ||
564 | +echo "configure:4666: checking for $ac_word" >&5 | ||
565 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then | ||
566 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
567 | else | ||
568 | @@ -4698,7 +4701,7 @@ fi | ||
569 | # Extract the first word of "${ncn_target_tool_prefix}windres", so it can be a program name with args. | ||
570 | set dummy ${ncn_target_tool_prefix}windres; ac_word=$2 | ||
571 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
572 | -echo "configure:4702: checking for $ac_word" >&5 | ||
573 | +echo "configure:4705: checking for $ac_word" >&5 | ||
574 | if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then | ||
575 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
576 | else | ||
577 | @@ -4731,7 +4734,7 @@ if test -z "$ac_cv_prog_CONFIGURED_WINDR | ||
578 | # Extract the first word of "windres", so it can be a program name with args. | ||
579 | set dummy windres; ac_word=$2 | ||
580 | echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 | ||
581 | -echo "configure:4735: checking for $ac_word" >&5 | ||
582 | +echo "configure:4738: checking for $ac_word" >&5 | ||
583 | if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then | ||
584 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
585 | else | ||
586 | @@ -4816,7 +4819,7 @@ RANLIB_FOR_TARGET=${RANLIB_FOR_TARGET}${ | ||
587 | NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target} | ||
588 | |||
589 | echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 | ||
590 | -echo "configure:4820: checking whether to enable maintainer-specific portions of Makefiles" >&5 | ||
591 | +echo "configure:4823: checking whether to enable maintainer-specific portions of Makefiles" >&5 | ||
592 | # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. | ||
593 | if test "${enable_maintainer_mode+set}" = set; then | ||
594 | enableval="$enable_maintainer_mode" | ||
595 | @@ -4863,7 +4866,7 @@ esac | ||
596 | # gcc for stageN-gcc and stagePREV-gcc for stage(N-1). In case this is not | ||
597 | # possible, however, we can resort to mv. | ||
598 | echo $ac_n "checking if symbolic links between directories work""... $ac_c" 1>&6 | ||
599 | -echo "configure:4867: checking if symbolic links between directories work" >&5 | ||
600 | +echo "configure:4870: checking if symbolic links between directories work" >&5 | ||
601 | if eval "test \"`echo '$''{'gcc_cv_prog_ln_s_dir'+set}'`\" = set"; then | ||
602 | echo $ac_n "(cached) $ac_c" 1>&6 | ||
603 | else | ||
604 | @@ -4997,15 +5000,34 @@ trap 'rm -f $CONFIG_STATUS conftest*; ex | ||
605 | # Transform confdefs.h into DEFS. | ||
606 | # Protect against shell expansion while executing Makefile rules. | ||
607 | # Protect against Makefile macro expansion. | ||
608 | -cat > conftest.defs <<\EOF | ||
609 | -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g | ||
610 | -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g | ||
611 | -s%\[%\\&%g | ||
612 | -s%\]%\\&%g | ||
613 | -s%\$%$$%g | ||
614 | -EOF | ||
615 | -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` | ||
616 | -rm -f conftest.defs | ||
617 | +# | ||
618 | +# If the first sed substitution is executed (which looks for macros that | ||
619 | +# take arguments), then we branch to the quote section. Otherwise, | ||
620 | +# look for a macro that doesn't take arguments. | ||
621 | +cat >confdef2opt.sed <<\_ACEOF | ||
622 | +t clear | ||
623 | +: clear | ||
624 | +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g | ||
625 | +t quote | ||
626 | +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g | ||
627 | +t quote | ||
628 | +d | ||
629 | +: quote | ||
630 | +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g | ||
631 | +s,\[,\\&,g | ||
632 | +s,\],\\&,g | ||
633 | +s,\$,$$,g | ||
634 | +p | ||
635 | +_ACEOF | ||
636 | +# We use echo to avoid assuming a particular line-breaking character. | ||
637 | +# The extra dot is to prevent the shell from consuming trailing | ||
638 | +# line-breaks from the sub-command output. A line-break within | ||
639 | +# single-quotes doesn't work because, if this script is created in a | ||
640 | +# platform that uses two characters for line-breaks (e.g., DOS), tr | ||
641 | +# would break. | ||
642 | +ac_LF_and_DOT=`echo; echo .` | ||
643 | +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` | ||
644 | +rm -f confdef2opt.sed | ||
645 | |||
646 | |||
647 | # Without the "./", some shells look in PATH for config.status. | ||
648 | diff -Nrup --ignore-space-change gcc-4.0.2/configure.in gcc-4.0.2-atmel.0.99.2/configure.in | ||
649 | --- gcc-4.0.2/configure.in 2005-09-13 09:01:28.000000000 +0200 | ||
650 | +++ gcc-4.0.2-atmel.0.99.2/configure.in 2006-01-20 14:31:15.000000000 +0100 | ||
651 | @@ -493,6 +493,9 @@ case "${target}" in | ||
652 | arm-*-riscix*) | ||
653 | noconfigdirs="$noconfigdirs ld target-libgloss ${libgcj}" | ||
654 | ;; | ||
655 | + avr32-*-*) | ||
656 | + noconfigdirs="$noconfigdirs target-libiberty target-libmudflap target-libffi ${libgcj}" | ||
657 | + ;; | ||
658 | avr-*-*) | ||
659 | noconfigdirs="$noconfigdirs target-libiberty target-libstdc++-v3 ${libgcj}" | ||
660 | ;; | ||
661 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/ada/s-tpopsp-rtems.adb gcc-4.0.2-atmel.0.99.2/gcc/ada/s-tpopsp-rtems.adb | ||
662 | --- gcc-4.0.2/gcc/ada/s-tpopsp-rtems.adb 2005-01-27 12:56:57.000000000 +0100 | ||
663 | +++ gcc-4.0.2-atmel.0.99.2/gcc/ada/s-tpopsp-rtems.adb 2005-07-15 16:26:03.000000000 +0200 | ||
664 | @@ -7,7 +7,7 @@ | ||
665 | -- -- | ||
666 | -- B o d y -- | ||
667 | -- -- | ||
668 | --- $Revision: 1.2 $ | ||
669 | +-- $Revision: 3484 $ | ||
670 | -- -- | ||
671 | -- Copyright (C) 1991-2003, Florida State University -- | ||
672 | -- -- | ||
673 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/builtins.c gcc-4.0.2-atmel.0.99.2/gcc/builtins.c | ||
674 | --- gcc-4.0.2/gcc/builtins.c 2005-08-28 13:08:55.000000000 +0200 | ||
675 | +++ gcc-4.0.2-atmel.0.99.2/gcc/builtins.c 2006-03-23 13:29:00.000000000 +0100 | ||
676 | @@ -8387,7 +8387,7 @@ validate_arglist (tree arglist, ...) | ||
677 | |||
678 | do | ||
679 | { | ||
680 | - code = va_arg (ap, enum tree_code); | ||
681 | + code = va_arg (ap, int); | ||
682 | switch (code) | ||
683 | { | ||
684 | case 0: | ||
685 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/calls.c gcc-4.0.2-atmel.0.99.2/gcc/calls.c | ||
686 | --- gcc-4.0.2/gcc/calls.c 2005-07-25 18:36:33.000000000 +0200 | ||
687 | +++ gcc-4.0.2-atmel.0.99.2/gcc/calls.c 2006-03-23 13:29:00.000000000 +0100 | ||
688 | @@ -3353,7 +3353,7 @@ emit_library_call_value_1 (int retval, r | ||
689 | for (; count < nargs; count++) | ||
690 | { | ||
691 | rtx val = va_arg (p, rtx); | ||
692 | - enum machine_mode mode = va_arg (p, enum machine_mode); | ||
693 | + enum machine_mode mode = va_arg (p, int); | ||
694 | |||
695 | /* We cannot convert the arg value to the mode the library wants here; | ||
696 | must do it earlier where we know the signedness of the arg. */ | ||
697 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32.c gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.c | ||
698 | --- gcc-4.0.2/gcc/config/avr32/avr32.c 1970-01-01 01:00:00.000000000 +0100 | ||
699 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.c 2006-11-24 17:13:09.000000000 +0100 | ||
700 | @@ -0,0 +1,7276 @@ | ||
701 | +/* | ||
702 | + Target hooks and helper functions for AVR32. | ||
703 | + Copyright 2003-2006 Atmel Corporation. | ||
704 | + | ||
705 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
706 | + Initial porting by Anders Ådland. | ||
707 | + | ||
708 | + This file is part of GCC. | ||
709 | + | ||
710 | + This program is free software; you can redistribute it and/or modify | ||
711 | + it under the terms of the GNU General Public License as published by | ||
712 | + the Free Software Foundation; either version 2 of the License, or | ||
713 | + (at your option) any later version. | ||
714 | + | ||
715 | + This program is distributed in the hope that it will be useful, | ||
716 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
717 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
718 | + GNU General Public License for more details. | ||
719 | + | ||
720 | + You should have received a copy of the GNU General Public License | ||
721 | + along with this program; if not, write to the Free Software | ||
722 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
723 | + | ||
724 | +#include "config.h" | ||
725 | +#include "system.h" | ||
726 | +#include "coretypes.h" | ||
727 | +#include "tm.h" | ||
728 | +#include "rtl.h" | ||
729 | +#include "tree.h" | ||
730 | +#include "obstack.h" | ||
731 | +#include "regs.h" | ||
732 | +#include "hard-reg-set.h" | ||
733 | +#include "real.h" | ||
734 | +#include "insn-config.h" | ||
735 | +#include "conditions.h" | ||
736 | +#include "output.h" | ||
737 | +#include "insn-attr.h" | ||
738 | +#include "flags.h" | ||
739 | +#include "reload.h" | ||
740 | +#include "function.h" | ||
741 | +#include "expr.h" | ||
742 | +#include "optabs.h" | ||
743 | +#include "toplev.h" | ||
744 | +#include "recog.h" | ||
745 | +#include "ggc.h" | ||
746 | +#include "except.h" | ||
747 | +#include "c-pragma.h" | ||
748 | +#include "integrate.h" | ||
749 | +#include "tm_p.h" | ||
750 | +#include "langhooks.h" | ||
751 | + | ||
752 | +#include "target.h" | ||
753 | +#include "target-def.h" | ||
754 | + | ||
755 | +#include <ctype.h> | ||
756 | + | ||
757 | +/* Forward definitions of types. */ | ||
758 | +typedef struct minipool_node Mnode; | ||
759 | +typedef struct minipool_fixup Mfix; | ||
760 | + | ||
761 | +/* Obstack for minipool constant handling. */ | ||
762 | +static struct obstack minipool_obstack; | ||
763 | +static char *minipool_startobj; | ||
764 | +static rtx minipool_vector_label; | ||
765 | + | ||
766 | +/* True if we are currently building a constant table. */ | ||
767 | +int making_const_table; | ||
768 | + | ||
769 | +/* Some forward function declarations */ | ||
770 | +static unsigned long avr32_isr_value (tree); | ||
771 | +static unsigned long avr32_compute_func_type (void); | ||
772 | +static tree avr32_handle_isr_attribute (tree *, tree, tree, int, bool *); | ||
773 | +static tree avr32_handle_acall_attribute (tree *, tree, tree, int, bool *); | ||
774 | +static tree avr32_handle_fndecl_attribute (tree * node, tree name, tree args, | ||
775 | + int flags, bool * no_add_attrs); | ||
776 | +static void avr32_reorg (void); | ||
777 | +bool avr32_return_in_msb (tree type); | ||
778 | +bool avr32_vector_mode_supported (enum machine_mode mode); | ||
779 | +static void avr32_init_libfuncs (void); | ||
780 | +void avr32_load_pic_register (void); | ||
781 | + | ||
782 | + | ||
783 | +static void | ||
784 | +avr32_add_gc_roots (void) | ||
785 | +{ | ||
786 | + gcc_obstack_init (&minipool_obstack); | ||
787 | + minipool_startobj = (char *) obstack_alloc (&minipool_obstack, 0); | ||
788 | +} | ||
789 | + | ||
790 | + | ||
791 | +/* List of all known AVR32 parts */ | ||
792 | +static const struct part_type_s avr32_part_types[] = { | ||
793 | + /* name, part_type, architecture type, macro */ | ||
794 | + {"none", PART_TYPE_AVR32_NONE, ARCH_TYPE_AVR32_AP, "__AVR32__"}, | ||
795 | + {"ap7000", PART_TYPE_AVR32_AP7000, ARCH_TYPE_AVR32_AP, "__AVR32_AP7000__"}, | ||
796 | + {"ap7010", PART_TYPE_AVR32_AP7010, ARCH_TYPE_AVR32_AP, "__AVR32_AP7010__"}, | ||
797 | + {"ap7020", PART_TYPE_AVR32_AP7020, ARCH_TYPE_AVR32_AP, "__AVR32_AP7020__"}, | ||
798 | + {"uc3a0256", PART_TYPE_AVR32_UC3A0256, ARCH_TYPE_AVR32_UC, "__AVR32_UC3A0256__"}, | ||
799 | + {"uc3a0512", PART_TYPE_AVR32_UC3A0512, ARCH_TYPE_AVR32_UC, "__AVR32_UC3A0512__"}, | ||
800 | + {"uc3a1128", PART_TYPE_AVR32_UC3A1128, ARCH_TYPE_AVR32_UC, "__AVR32_UC3A1128__"}, | ||
801 | + {"uc3a1256", PART_TYPE_AVR32_UC3A1256, ARCH_TYPE_AVR32_UC, "__AVR32_UC3A1256__"}, | ||
802 | + {"uc3a1512", PART_TYPE_AVR32_UC3A1512, ARCH_TYPE_AVR32_UC, "__AVR32_UC3A1512__"}, | ||
803 | + {NULL, 0, 0, NULL} | ||
804 | +}; | ||
805 | + | ||
806 | +/* List of all known AVR32 architectures */ | ||
807 | +static const struct arch_type_s avr32_arch_types[] = { | ||
808 | + /* name, architecture type, microarchitecture type, feature flags, macro */ | ||
809 | + {"ap", ARCH_TYPE_AVR32_AP, UARCH_TYPE_AVR32B, FLAG_AVR32_HAS_DSP | | ||
810 | + FLAG_AVR32_HAS_SIMD | FLAG_AVR32_HAS_UNALIGNED_WORD | | ||
811 | + FLAG_AVR32_HAS_BRANCH_PRED, "__AVR32_AP__"}, | ||
812 | + {"uc", ARCH_TYPE_AVR32_UC, UARCH_TYPE_AVR32A, | ||
813 | + FLAG_AVR32_HAS_DSP | FLAG_AVR32_HAS_RMW, "__AVR32_UC__"}, | ||
814 | + {NULL, 0, 0, 0, NULL} | ||
815 | +}; | ||
816 | + | ||
817 | +/* Default arch name */ | ||
818 | +const char *avr32_arch_name = "ap"; | ||
819 | +const char *avr32_part_name = "none"; | ||
820 | + | ||
821 | +const struct part_type_s *avr32_part; | ||
822 | +const struct arch_type_s *avr32_arch; | ||
823 | + | ||
824 | + | ||
825 | +/* Override command line options */ | ||
826 | +void | ||
827 | +avr32_override_options (void) | ||
828 | +{ | ||
829 | + const struct part_type_s *part; | ||
830 | + const struct arch_type_s *arch; | ||
831 | + | ||
832 | + /* Check if part type is set. */ | ||
833 | + for (part = avr32_part_types; part->name; part++) | ||
834 | + if (strcmp (part->name, avr32_part_name) == 0) | ||
835 | + break; | ||
836 | + | ||
837 | + avr32_part = part; | ||
838 | + | ||
839 | + if (!part->name) | ||
840 | + { | ||
841 | + fprintf (stderr, "Unknown part `%s' specified\nKnown part names:\n", | ||
842 | + avr32_part_name); | ||
843 | + for (part = avr32_part_types; part->name; part++) | ||
844 | + fprintf (stderr, "\t%s\n", part->name); | ||
845 | + avr32_part = &avr32_part_types[PART_TYPE_AVR32_NONE]; | ||
846 | + } | ||
847 | + | ||
848 | + avr32_arch = &avr32_arch_types[avr32_part->arch_type]; | ||
849 | + | ||
850 | + /* If part was set to "none" then check if arch was set. */ | ||
851 | + if (strcmp (avr32_part->name, "none") == 0) | ||
852 | + { | ||
853 | + /* Check if arch type is set. */ | ||
854 | + for (arch = avr32_arch_types; arch->name; arch++) | ||
855 | + if (strcmp (arch->name, avr32_arch_name) == 0) | ||
856 | + break; | ||
857 | + | ||
858 | + avr32_arch = arch; | ||
859 | + | ||
860 | + if (!arch->name) | ||
861 | + { | ||
862 | + fprintf (stderr, "Unknown arch `%s' specified\nKnown arch names:\n", | ||
863 | + avr32_arch_name); | ||
864 | + for (arch = avr32_arch_types; arch->name; arch++) | ||
865 | + fprintf (stderr, "\t%s\n", arch->name); | ||
866 | + avr32_arch = &avr32_arch_types[ARCH_TYPE_AVR32_AP]; | ||
867 | + } | ||
868 | + } | ||
869 | + | ||
870 | + /* If optimization level is two or greater, then align start of loops to a | ||
871 | + word boundary since this will allow folding the first insn of the loop. | ||
872 | + Do this only for targets supporting branch prediction. */ | ||
873 | + if (optimize >= 2 && TARGET_BRANCH_PRED) | ||
874 | + align_loops = 2; | ||
875 | + | ||
876 | + if (AVR32_ALWAYS_PIC) | ||
877 | + flag_pic = 1; | ||
878 | + | ||
879 | + if (target_flags & AVR32_FLAG_NO_PIC) | ||
880 | + flag_pic = 0; | ||
881 | + | ||
882 | + avr32_add_gc_roots (); | ||
883 | +} | ||
884 | + | ||
885 | + | ||
886 | +/* | ||
887 | +If defined, a function that outputs the assembler code for entry to a | ||
888 | +function. The prologue is responsible for setting up the stack frame, | ||
889 | +initializing the frame pointer register, saving registers that must be | ||
890 | +saved, and allocating size additional bytes of storage for the | ||
891 | +local variables. size is an integer. file is a stdio | ||
892 | +stream to which the assembler code should be output. | ||
893 | + | ||
894 | +The label for the beginning of the function need not be output by this | ||
895 | +macro. That has already been done when the macro is run. | ||
896 | + | ||
897 | +To determine which registers to save, the macro can refer to the array | ||
898 | +regs_ever_live: element r is nonzero if hard register | ||
899 | +r is used anywhere within the function. This implies the function | ||
900 | +prologue should save register r, provided it is not one of the | ||
901 | +call-used registers. (TARGET_ASM_FUNCTION_EPILOGUE must likewise use | ||
902 | +regs_ever_live.) | ||
903 | + | ||
904 | +On machines that have ``register windows'', the function entry code does | ||
905 | +not save on the stack the registers that are in the windows, even if | ||
906 | +they are supposed to be preserved by function calls; instead it takes | ||
907 | +appropriate steps to ``push'' the register stack, if any non-call-used | ||
908 | +registers are used in the function. | ||
909 | + | ||
910 | +On machines where functions may or may not have frame-pointers, the | ||
911 | +function entry code must vary accordingly; it must set up the frame | ||
912 | +pointer if one is wanted, and not otherwise. To determine whether a | ||
913 | +frame pointer is in wanted, the macro can refer to the variable | ||
914 | +frame_pointer_needed. The variable's value will be 1 at run | ||
915 | +time in a function that needs a frame pointer. (see Elimination). | ||
916 | + | ||
917 | +The function entry code is responsible for allocating any stack space | ||
918 | +required for the function. This stack space consists of the regions | ||
919 | +listed below. In most cases, these regions are allocated in the | ||
920 | +order listed, with the last listed region closest to the top of the | ||
921 | +stack (the lowest address if STACK_GROWS_DOWNWARD is defined, and | ||
922 | +the highest address if it is not defined). You can use a different order | ||
923 | +for a machine if doing so is more convenient or required for | ||
924 | +compatibility reasons. Except in cases where required by standard | ||
925 | +or by a debugger, there is no reason why the stack layout used by GCC | ||
926 | +need agree with that used by other compilers for a machine. | ||
927 | +*/ | ||
928 | + | ||
929 | +#undef TARGET_ASM_FUNCTION_PROLOGUE | ||
930 | +#define TARGET_ASM_FUNCTION_PROLOGUE avr32_target_asm_function_prologue | ||
931 | + | ||
932 | + | ||
933 | +#undef TARGET_DEFAULT_SHORT_ENUMS | ||
934 | +#define TARGET_DEFAULT_SHORT_ENUMS hook_bool_void_false | ||
935 | + | ||
936 | +#undef TARGET_PROMOTE_FUNCTION_ARGS | ||
937 | +#define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true | ||
938 | + | ||
939 | +#undef TARGET_PROMOTE_FUNCTION_RETURN | ||
940 | +#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true | ||
941 | + | ||
942 | +#undef TARGET_PROMOTE_PROTOTYPES | ||
943 | +#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true | ||
944 | + | ||
945 | +#undef TARGET_MUST_PASS_IN_STACK | ||
946 | +#define TARGET_MUST_PASS_IN_STACK avr32_must_pass_in_stack | ||
947 | + | ||
948 | +#undef TARGET_PASS_BY_REFERENCE | ||
949 | +#define TARGET_PASS_BY_REFERENCE avr32_pass_by_reference | ||
950 | + | ||
951 | +#undef TARGET_STRICT_ARGUMENT_NAMING | ||
952 | +#define TARGET_STRICT_ARGUMENT_NAMING avr32_strict_argument_naming | ||
953 | + | ||
954 | +#undef TARGET_VECTOR_MODE_SUPPORTED_P | ||
955 | +#define TARGET_VECTOR_MODE_SUPPORTED_P avr32_vector_mode_supported | ||
956 | + | ||
957 | +#undef TARGET_RETURN_IN_MEMORY | ||
958 | +#define TARGET_RETURN_IN_MEMORY avr32_return_in_memory | ||
959 | + | ||
960 | +#undef TARGET_RETURN_IN_MSB | ||
961 | +#define TARGET_RETURN_IN_MSB avr32_return_in_msb | ||
962 | + | ||
963 | +#undef TARGET_ARG_PARTIAL_BYTES | ||
964 | +#define TARGET_ARG_PARTIAL_BYTES avr32_arg_partial_bytes | ||
965 | + | ||
966 | +#undef TARGET_STRIP_NAME_ENCODING | ||
967 | +#define TARGET_STRIP_NAME_ENCODING avr32_strip_name_encoding | ||
968 | + | ||
969 | +#define streq(string1, string2) (strcmp (string1, string2) == 0) | ||
970 | + | ||
971 | +#undef TARGET_ATTRIBUTE_TABLE | ||
972 | +#define TARGET_ATTRIBUTE_TABLE avr32_attribute_table | ||
973 | + | ||
974 | +#undef TARGET_COMP_TYPE_ATTRIBUTES | ||
975 | +#define TARGET_COMP_TYPE_ATTRIBUTES avr32_comp_type_attributes | ||
976 | + | ||
977 | + | ||
978 | +#undef TARGET_RTX_COSTS | ||
979 | +#define TARGET_RTX_COSTS avr32_rtx_costs | ||
980 | + | ||
981 | +#undef TARGET_CANNOT_FORCE_CONST_MEM | ||
982 | +#define TARGET_CANNOT_FORCE_CONST_MEM avr32_cannot_force_const_mem | ||
983 | + | ||
984 | +#undef TARGET_ASM_INTEGER | ||
985 | +#define TARGET_ASM_INTEGER avr32_assemble_integer | ||
986 | + | ||
987 | +/* | ||
988 | + * Switches to the appropriate section for output of constant pool | ||
989 | + * entry x in mode. You can assume that x is some kind of constant in | ||
990 | + * RTL. The argument mode is redundant except in the case of a | ||
991 | + * const_int rtx. Select the section by calling readonly_data_ section | ||
992 | + * or one of the alternatives for other sections. align is the | ||
993 | + * constant alignment in bits. | ||
994 | + * | ||
995 | + * The default version of this function takes care of putting symbolic | ||
996 | + * constants in flag_ pic mode in data_section and everything else in | ||
997 | + * readonly_data_section. | ||
998 | + */ | ||
999 | +#undef TARGET_ASM_SELECT_RTX_SECTION | ||
1000 | +#define TARGET_ASM_SELECT_RTX_SECTION avr32_select_rtx_section | ||
1001 | + | ||
1002 | + | ||
1003 | +/* | ||
1004 | + * If non-null, this hook performs a target-specific pass over the | ||
1005 | + * instruction stream. The compiler will run it at all optimization | ||
1006 | + * levels, just before the point at which it normally does | ||
1007 | + * delayed-branch scheduling. | ||
1008 | + * | ||
1009 | + * The exact purpose of the hook varies from target to target. Some | ||
1010 | + * use it to do transformations that are necessary for correctness, | ||
1011 | + * such as laying out in-function constant pools or avoiding hardware | ||
1012 | + * hazards. Others use it as an opportunity to do some | ||
1013 | + * machine-dependent optimizations. | ||
1014 | + * | ||
1015 | + * You need not implement the hook if it has nothing to do. The | ||
1016 | + * default definition is null. | ||
1017 | + */ | ||
1018 | +#undef TARGET_MACHINE_DEPENDENT_REORG | ||
1019 | +#define TARGET_MACHINE_DEPENDENT_REORG avr32_reorg | ||
1020 | + | ||
1021 | +/* Target hook for assembling integer objects. | ||
1022 | + Need to handle integer vectors */ | ||
1023 | +static bool | ||
1024 | +avr32_assemble_integer (rtx x, unsigned int size, int aligned_p) | ||
1025 | +{ | ||
1026 | + if (avr32_vector_mode_supported (GET_MODE (x))) | ||
1027 | + { | ||
1028 | + int i, units; | ||
1029 | + | ||
1030 | + if (GET_CODE (x) != CONST_VECTOR) | ||
1031 | + abort (); | ||
1032 | + | ||
1033 | + units = CONST_VECTOR_NUNITS (x); | ||
1034 | + | ||
1035 | + switch (GET_MODE (x)) | ||
1036 | + { | ||
1037 | + case V2HImode: | ||
1038 | + size = 2; | ||
1039 | + break; | ||
1040 | + case V4QImode: | ||
1041 | + size = 1; | ||
1042 | + break; | ||
1043 | + default: | ||
1044 | + abort (); | ||
1045 | + } | ||
1046 | + | ||
1047 | + for (i = 0; i < units; i++) | ||
1048 | + { | ||
1049 | + rtx elt; | ||
1050 | + | ||
1051 | + elt = CONST_VECTOR_ELT (x, i); | ||
1052 | + assemble_integer (elt, size, i == 0 ? 32 : size * BITS_PER_UNIT, 1); | ||
1053 | + } | ||
1054 | + | ||
1055 | + return true; | ||
1056 | + } | ||
1057 | + | ||
1058 | + return default_assemble_integer (x, size, aligned_p); | ||
1059 | +} | ||
1060 | + | ||
1061 | +/* | ||
1062 | + * This target hook describes the relative costs of RTL expressions. | ||
1063 | + * | ||
1064 | + * The cost may depend on the precise form of the expression, which is | ||
1065 | + * available for examination in x, and the rtx code of the expression | ||
1066 | + * in which it is contained, found in outer_code. code is the | ||
1067 | + * expression code--redundant, since it can be obtained with GET_CODE | ||
1068 | + * (x). | ||
1069 | + * | ||
1070 | + * In implementing this hook, you can use the construct COSTS_N_INSNS | ||
1071 | + * (n) to specify a cost equal to n fast instructions. | ||
1072 | + * | ||
1073 | + * On entry to the hook, *total contains a default estimate for the | ||
1074 | + * cost of the expression. The hook should modify this value as | ||
1075 | + * necessary. Traditionally, the default costs are COSTS_N_INSNS (5) | ||
1076 | + * for multiplications, COSTS_N_INSNS (7) for division and modulus | ||
1077 | + * operations, and COSTS_N_INSNS (1) for all other operations. | ||
1078 | + * | ||
1079 | + * When optimizing for code size, i.e. when optimize_size is non-zero, | ||
1080 | + * this target hook should be used to estimate the relative size cost | ||
1081 | + * of an expression, again relative to COSTS_N_INSNS. | ||
1082 | + * | ||
1083 | + * The hook returns true when all subexpressions of x have been | ||
1084 | + * processed, and false when rtx_cost should recurse. | ||
1085 | + */ | ||
1086 | + | ||
1087 | +/* Worker routine for avr32_rtx_costs. */ | ||
1088 | +static inline int | ||
1089 | +avr32_rtx_costs_1 (rtx x, enum rtx_code code ATTRIBUTE_UNUSED, | ||
1090 | + enum rtx_code outer ATTRIBUTE_UNUSED) | ||
1091 | +{ | ||
1092 | + enum machine_mode mode = GET_MODE (x); | ||
1093 | + | ||
1094 | + switch (GET_CODE (x)) | ||
1095 | + { | ||
1096 | + case MEM: | ||
1097 | + /* Using pre decrement / post increment memory operations on the | ||
1098 | + avr32_uc architecture means that two writebacks must be performed | ||
1099 | + and hence two cycles are needed. */ | ||
1100 | + if (!optimize_size | ||
1101 | + && GET_MODE_SIZE (mode) <= 2 * UNITS_PER_WORD | ||
1102 | + && avr32_arch->arch_type == ARCH_TYPE_AVR32_UC | ||
1103 | + && (GET_CODE (XEXP (x, 0)) == PRE_DEC | ||
1104 | + || GET_CODE (XEXP (x, 0)) == POST_INC)) | ||
1105 | + return COSTS_N_INSNS (4); | ||
1106 | + | ||
1107 | + /* Memory costs quite a lot for the first word, but subsequent words | ||
1108 | + load at the equivalent of a single insn each. */ | ||
1109 | + if (GET_MODE_SIZE (mode) > UNITS_PER_WORD) | ||
1110 | + return COSTS_N_INSNS (2 + (GET_MODE_SIZE (mode) / UNITS_PER_WORD)); | ||
1111 | + | ||
1112 | + return COSTS_N_INSNS (3); | ||
1113 | + case SYMBOL_REF: | ||
1114 | + case CONST: | ||
1115 | + /* These are valid for the pseudo insns: lda.w and call which operates | ||
1116 | + on direct addresses. We assume that the cost of a lda.w is the same | ||
1117 | + as the cost of a ld.w insn. */ | ||
1118 | + return (outer == SET) ? COSTS_N_INSNS (3) : COSTS_N_INSNS (1); | ||
1119 | + case DIV: | ||
1120 | + case MOD: | ||
1121 | + case UDIV: | ||
1122 | + case UMOD: | ||
1123 | + return optimize_size ? COSTS_N_INSNS (1) : COSTS_N_INSNS (16); | ||
1124 | + | ||
1125 | + case ROTATE: | ||
1126 | + case ROTATERT: | ||
1127 | + if (mode == TImode) | ||
1128 | + return COSTS_N_INSNS (100); | ||
1129 | + | ||
1130 | + if (mode == DImode) | ||
1131 | + return COSTS_N_INSNS (10); | ||
1132 | + return COSTS_N_INSNS (4); | ||
1133 | + case ASHIFT: | ||
1134 | + case LSHIFTRT: | ||
1135 | + case ASHIFTRT: | ||
1136 | + case NOT: | ||
1137 | + if (mode == TImode) | ||
1138 | + return COSTS_N_INSNS (10); | ||
1139 | + | ||
1140 | + if (mode == DImode) | ||
1141 | + return COSTS_N_INSNS (4); | ||
1142 | + return COSTS_N_INSNS (1); | ||
1143 | + case PLUS: | ||
1144 | + case MINUS: | ||
1145 | + case NEG: | ||
1146 | + case COMPARE: | ||
1147 | + case ABS: | ||
1148 | + if (GET_MODE_CLASS (mode) == MODE_FLOAT) | ||
1149 | + return COSTS_N_INSNS (100); | ||
1150 | + | ||
1151 | + if (mode == TImode) | ||
1152 | + return COSTS_N_INSNS (50); | ||
1153 | + | ||
1154 | + if (mode == DImode) | ||
1155 | + return COSTS_N_INSNS (2); | ||
1156 | + return COSTS_N_INSNS (1); | ||
1157 | + | ||
1158 | + case MULT: | ||
1159 | + { | ||
1160 | + if (GET_MODE_CLASS (mode) == MODE_FLOAT) | ||
1161 | + return COSTS_N_INSNS (300); | ||
1162 | + | ||
1163 | + if (mode == TImode) | ||
1164 | + return COSTS_N_INSNS (16); | ||
1165 | + | ||
1166 | + if (mode == DImode) | ||
1167 | + return COSTS_N_INSNS (4); | ||
1168 | + | ||
1169 | + if (mode == HImode) | ||
1170 | + return COSTS_N_INSNS (2); | ||
1171 | + | ||
1172 | + return COSTS_N_INSNS (3); | ||
1173 | + } | ||
1174 | + case IF_THEN_ELSE: | ||
1175 | + if (GET_CODE (XEXP (x, 1)) == PC || GET_CODE (XEXP (x, 2)) == PC) | ||
1176 | + return COSTS_N_INSNS (4); | ||
1177 | + return COSTS_N_INSNS (1); | ||
1178 | + case SIGN_EXTEND: | ||
1179 | + case ZERO_EXTEND: | ||
1180 | + /* Sign/Zero extensions of registers cost quite much since these | ||
1181 | + instrcutions only take one register operand which means that gcc | ||
1182 | + often must insert some move instrcutions */ | ||
1183 | + if (mode == QImode || mode == HImode) | ||
1184 | + return (COSTS_N_INSNS (GET_CODE (XEXP (x, 0)) == MEM ? 0 : 1)); | ||
1185 | + return COSTS_N_INSNS (4); | ||
1186 | + case UNSPEC: | ||
1187 | + /* divmod operations */ | ||
1188 | + if (XINT (x, 1) == UNSPEC_UDIVMODSI4_INTERNAL | ||
1189 | + || XINT (x, 1) == UNSPEC_DIVMODSI4_INTERNAL) | ||
1190 | + { | ||
1191 | + return optimize_size ? COSTS_N_INSNS (1) : COSTS_N_INSNS (16); | ||
1192 | + } | ||
1193 | + /* Fallthrough */ | ||
1194 | + default: | ||
1195 | + return COSTS_N_INSNS (1); | ||
1196 | + } | ||
1197 | +} | ||
1198 | + | ||
1199 | +static bool | ||
1200 | +avr32_rtx_costs (rtx x, int code, int outer_code, int *total) | ||
1201 | +{ | ||
1202 | + *total = avr32_rtx_costs_1 (x, code, outer_code); | ||
1203 | + return true; | ||
1204 | +} | ||
1205 | + | ||
1206 | + | ||
1207 | +bool | ||
1208 | +avr32_cannot_force_const_mem (rtx x ATTRIBUTE_UNUSED) | ||
1209 | +{ | ||
1210 | + /* Do not want symbols in the constant pool when compiling pic or if using | ||
1211 | + address pseudo instructions. */ | ||
1212 | + return ((flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS) | ||
1213 | + && avr32_find_symbol (x) != NULL_RTX); | ||
1214 | +} | ||
1215 | + | ||
1216 | + | ||
1217 | +/* Table of machine attributes. */ | ||
1218 | +const struct attribute_spec avr32_attribute_table[] = { | ||
1219 | + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ | ||
1220 | + /* Interrupt Service Routines have special prologue and epilogue | ||
1221 | + requirements. */ | ||
1222 | + {"isr", 0, 1, false, false, false, avr32_handle_isr_attribute}, | ||
1223 | + {"interrupt", 0, 1, false, false, false, avr32_handle_isr_attribute}, | ||
1224 | + {"acall", 0, 1, false, true, true, avr32_handle_acall_attribute}, | ||
1225 | + {"naked", 0, 0, true, false, false, avr32_handle_fndecl_attribute}, | ||
1226 | + {NULL, 0, 0, false, false, false, NULL} | ||
1227 | +}; | ||
1228 | + | ||
1229 | + | ||
1230 | +typedef struct | ||
1231 | +{ | ||
1232 | + const char *const arg; | ||
1233 | + const unsigned long return_value; | ||
1234 | +} | ||
1235 | +isr_attribute_arg; | ||
1236 | + | ||
1237 | +static const isr_attribute_arg isr_attribute_args[] = { | ||
1238 | + {"FULL", AVR32_FT_ISR_FULL}, | ||
1239 | + {"full", AVR32_FT_ISR_FULL}, | ||
1240 | + {"HALF", AVR32_FT_ISR_HALF}, | ||
1241 | + {"half", AVR32_FT_ISR_HALF}, | ||
1242 | + {"NONE", AVR32_FT_ISR_NONE}, | ||
1243 | + {"none", AVR32_FT_ISR_NONE}, | ||
1244 | + {"UNDEF", AVR32_FT_ISR_NONE}, | ||
1245 | + {"undef", AVR32_FT_ISR_NONE}, | ||
1246 | + {"SWI", AVR32_FT_ISR_NONE}, | ||
1247 | + {"swi", AVR32_FT_ISR_NONE}, | ||
1248 | + {NULL, AVR32_FT_ISR_NONE} | ||
1249 | +}; | ||
1250 | + | ||
1251 | +/* Returns the (interrupt) function type of the current | ||
1252 | + function, or AVR32_FT_UNKNOWN if the type cannot be determined. */ | ||
1253 | + | ||
1254 | +static unsigned long | ||
1255 | +avr32_isr_value (tree argument) | ||
1256 | +{ | ||
1257 | + const isr_attribute_arg *ptr; | ||
1258 | + const char *arg; | ||
1259 | + | ||
1260 | + /* No argument - default to ISR_NONE. */ | ||
1261 | + if (argument == NULL_TREE) | ||
1262 | + return AVR32_FT_ISR_NONE; | ||
1263 | + | ||
1264 | + /* Get the value of the argument. */ | ||
1265 | + if (TREE_VALUE (argument) == NULL_TREE | ||
1266 | + || TREE_CODE (TREE_VALUE (argument)) != STRING_CST) | ||
1267 | + return AVR32_FT_UNKNOWN; | ||
1268 | + | ||
1269 | + arg = TREE_STRING_POINTER (TREE_VALUE (argument)); | ||
1270 | + | ||
1271 | + /* Check it against the list of known arguments. */ | ||
1272 | + for (ptr = isr_attribute_args; ptr->arg != NULL; ptr++) | ||
1273 | + if (streq (arg, ptr->arg)) | ||
1274 | + return ptr->return_value; | ||
1275 | + | ||
1276 | + /* An unrecognized interrupt type. */ | ||
1277 | + return AVR32_FT_UNKNOWN; | ||
1278 | +} | ||
1279 | + | ||
1280 | + | ||
1281 | + | ||
1282 | +/* | ||
1283 | +These hooks specify assembly directives for creating certain kinds | ||
1284 | +of integer object. The TARGET_ASM_BYTE_OP directive creates a | ||
1285 | +byte-sized object, the TARGET_ASM_ALIGNED_HI_OP one creates an | ||
1286 | +aligned two-byte object, and so on. Any of the hooks may be | ||
1287 | +NULL, indicating that no suitable directive is available. | ||
1288 | + | ||
1289 | +The compiler will print these strings at the start of a new line, | ||
1290 | +followed immediately by the object's initial value. In most cases, | ||
1291 | +the string should contain a tab, a pseudo-op, and then another tab. | ||
1292 | +*/ | ||
1293 | +#undef TARGET_ASM_BYTE_OP | ||
1294 | +#define TARGET_ASM_BYTE_OP "\t.byte\t" | ||
1295 | +#undef TARGET_ASM_ALIGNED_HI_OP | ||
1296 | +#define TARGET_ASM_ALIGNED_HI_OP "\t.align 1\n\t.short\t" | ||
1297 | +#undef TARGET_ASM_ALIGNED_SI_OP | ||
1298 | +#define TARGET_ASM_ALIGNED_SI_OP "\t.align 2\n\t.int\t" | ||
1299 | +#undef TARGET_ASM_ALIGNED_DI_OP | ||
1300 | +#define TARGET_ASM_ALIGNED_DI_OP NULL | ||
1301 | +#undef TARGET_ASM_ALIGNED_TI_OP | ||
1302 | +#define TARGET_ASM_ALIGNED_TI_OP NULL | ||
1303 | +#undef TARGET_ASM_UNALIGNED_HI_OP | ||
1304 | +#define TARGET_ASM_UNALIGNED_HI_OP "\t.short\t" | ||
1305 | +#undef TARGET_ASM_UNALIGNED_SI_OP | ||
1306 | +#define TARGET_ASM_UNALIGNED_SI_OP "\t.int\t" | ||
1307 | +#undef TARGET_ASM_UNALIGNED_DI_OP | ||
1308 | +#define TARGET_ASM_UNALIGNED_DI_OP NULL | ||
1309 | +#undef TARGET_ASM_UNALIGNED_TI_OP | ||
1310 | +#define TARGET_ASM_UNALIGNED_TI_OP NULL | ||
1311 | + | ||
1312 | +#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE | ||
1313 | +#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE avr32_sched_use_dfa_pipeline_interface | ||
1314 | + | ||
1315 | +#undef TARGET_ASM_OUTPUT_MI_THUNK | ||
1316 | +#define TARGET_ASM_OUTPUT_MI_THUNK avr32_output_mi_thunk | ||
1317 | + | ||
1318 | + | ||
1319 | +static void | ||
1320 | +avr32_output_mi_thunk (FILE * file, | ||
1321 | + tree thunk ATTRIBUTE_UNUSED, | ||
1322 | + HOST_WIDE_INT delta, | ||
1323 | + HOST_WIDE_INT vcall_offset, tree function) | ||
1324 | +{ | ||
1325 | + int mi_delta = delta; | ||
1326 | + int this_regno = | ||
1327 | + (avr32_return_in_memory (DECL_RESULT (function), TREE_TYPE (function)) ? | ||
1328 | + INTERNAL_REGNUM (11) : INTERNAL_REGNUM (12)); | ||
1329 | + | ||
1330 | + | ||
1331 | + if (!avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21") | ||
1332 | + || vcall_offset) | ||
1333 | + { | ||
1334 | + fprintf (file, "\tpushm\tr10\n"); | ||
1335 | + } | ||
1336 | + | ||
1337 | + | ||
1338 | + if (mi_delta != 0) | ||
1339 | + { | ||
1340 | + if (avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21")) | ||
1341 | + { | ||
1342 | + fprintf (file, "\tsub\t%s, -0x%x\n", reg_names[this_regno], | ||
1343 | + mi_delta); | ||
1344 | + } | ||
1345 | + else | ||
1346 | + { | ||
1347 | + /* Immediate is larger than k21 we must make us a temp register by | ||
1348 | + pushing a register to the stack. */ | ||
1349 | + fprintf (file, "\tmov\tr10, lo(%x)\n", mi_delta); | ||
1350 | + fprintf (file, "\torh\tr10, hi(%x)\n", mi_delta); | ||
1351 | + fprintf (file, "\tadd\t%s, r10\n", reg_names[this_regno]); | ||
1352 | + } | ||
1353 | + } | ||
1354 | + | ||
1355 | + | ||
1356 | + if (vcall_offset != 0) | ||
1357 | + { | ||
1358 | + fprintf (file, "\tld.w\tr10, %s[0]\n", reg_names[this_regno]); | ||
1359 | + fprintf (file, "\tld.w\tr10, r10[%i]\n", (int) vcall_offset); | ||
1360 | + fprintf (file, "\tadd\t%s, r10\n", reg_names[this_regno]); | ||
1361 | + } | ||
1362 | + | ||
1363 | + | ||
1364 | + if (!avr32_const_ok_for_constraint_p (mi_delta, 'I', "Is21") | ||
1365 | + || vcall_offset) | ||
1366 | + { | ||
1367 | + fprintf (file, "\tpopm\tr10\n"); | ||
1368 | + } | ||
1369 | + | ||
1370 | + if (flag_pic) | ||
1371 | + { | ||
1372 | + /* Don't know how we should do this!!! For now we'll just use an | ||
1373 | + extended branch instruction and hope that the function will be | ||
1374 | + reached. */ | ||
1375 | + fprintf (file, "\tbral\t"); | ||
1376 | + assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0)); | ||
1377 | + fputc ('\n', file); | ||
1378 | + } | ||
1379 | + else | ||
1380 | + { | ||
1381 | + fprintf (file, "\tlddpc\tpc, 0f\n"); | ||
1382 | + fprintf (file, "\t.align 2\n"); | ||
1383 | + fputs ("0:\t.long\t", file); | ||
1384 | + assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0)); | ||
1385 | + fputc ('\n', file); | ||
1386 | + } | ||
1387 | +} | ||
1388 | + | ||
1389 | +/* Implements target hook vector_mode_supported. */ | ||
1390 | +bool | ||
1391 | +avr32_vector_mode_supported (enum machine_mode mode) | ||
1392 | +{ | ||
1393 | + if ((mode == V2HImode) || (mode == V4QImode)) | ||
1394 | + return true; | ||
1395 | + | ||
1396 | + return false; | ||
1397 | +} | ||
1398 | + | ||
1399 | + | ||
1400 | +#undef TARGET_INIT_LIBFUNCS | ||
1401 | +#define TARGET_INIT_LIBFUNCS avr32_init_libfuncs | ||
1402 | + | ||
1403 | +#undef TARGET_INIT_BUILTINS | ||
1404 | +#define TARGET_INIT_BUILTINS avr32_init_builtins | ||
1405 | + | ||
1406 | +#undef TARGET_EXPAND_BUILTIN | ||
1407 | +#define TARGET_EXPAND_BUILTIN avr32_expand_builtin | ||
1408 | + | ||
1409 | +tree int_ftype_int, int_ftype_void, short_ftype_short, void_ftype_int_int, | ||
1410 | + void_ftype_ptr_int; | ||
1411 | +tree void_ftype_int, void_ftype_void, int_ftype_ptr_int; | ||
1412 | +tree short_ftype_short, int_ftype_int_short, int_ftype_short_short, | ||
1413 | + short_ftype_short_short; | ||
1414 | +tree int_ftype_int_int, longlong_ftype_int_short, longlong_ftype_short_short; | ||
1415 | +tree void_ftype_int_int_int_int_int, void_ftype_int_int_int; | ||
1416 | +tree longlong_ftype_int_int, void_ftype_int_int_longlong; | ||
1417 | +tree int_ftype_int_int_int, longlong_ftype_longlong_int_short; | ||
1418 | +tree longlong_ftype_longlong_short_short, int_ftype_int_short_short; | ||
1419 | + | ||
1420 | +#define def_builtin(NAME, TYPE, CODE) \ | ||
1421 | + lang_hooks.builtin_function ((NAME), (TYPE), (CODE), \ | ||
1422 | + BUILT_IN_MD, NULL, NULL_TREE) | ||
1423 | + | ||
1424 | +#define def_mbuiltin(MASK, NAME, TYPE, CODE) \ | ||
1425 | + do \ | ||
1426 | + { \ | ||
1427 | + if ((MASK)) \ | ||
1428 | + lang_hooks.builtin_function ((NAME), (TYPE), (CODE), \ | ||
1429 | + BUILT_IN_MD, NULL, NULL_TREE); \ | ||
1430 | + } \ | ||
1431 | + while (0) | ||
1432 | + | ||
1433 | +struct builtin_description | ||
1434 | +{ | ||
1435 | + const unsigned int mask; | ||
1436 | + const enum insn_code icode; | ||
1437 | + const char *const name; | ||
1438 | + const int code; | ||
1439 | + const enum rtx_code comparison; | ||
1440 | + const unsigned int flag; | ||
1441 | + const tree *ftype; | ||
1442 | +}; | ||
1443 | + | ||
1444 | +static const struct builtin_description bdesc_2arg[] = { | ||
1445 | +#define DSP_BUILTIN(code, builtin, ftype) \ | ||
1446 | + { 1, CODE_FOR_##code, "__builtin_" #code , \ | ||
1447 | + AVR32_BUILTIN_##builtin, 0, 0, ftype } | ||
1448 | + | ||
1449 | + DSP_BUILTIN (mulsathh_h, MULSATHH_H, &short_ftype_short_short), | ||
1450 | + DSP_BUILTIN (mulsathh_w, MULSATHH_W, &int_ftype_short_short), | ||
1451 | + DSP_BUILTIN (mulsatrndhh_h, MULSATRNDHH_H, &short_ftype_short_short), | ||
1452 | + DSP_BUILTIN (mulsatrndwh_w, MULSATRNDWH_W, &int_ftype_int_short), | ||
1453 | + DSP_BUILTIN (mulsatwh_w, MULSATWH_W, &int_ftype_int_short), | ||
1454 | + DSP_BUILTIN (satadd_h, SATADD_H, &short_ftype_short_short), | ||
1455 | + DSP_BUILTIN (satsub_h, SATSUB_H, &short_ftype_short_short), | ||
1456 | + DSP_BUILTIN (satadd_w, SATADD_W, &int_ftype_int_int), | ||
1457 | + DSP_BUILTIN (satsub_w, SATSUB_W, &int_ftype_int_int), | ||
1458 | + DSP_BUILTIN (mulwh_d, MULWH_D, &longlong_ftype_int_short), | ||
1459 | + DSP_BUILTIN (mulnwh_d, MULNWH_D, &longlong_ftype_int_short) | ||
1460 | +}; | ||
1461 | + | ||
1462 | + | ||
1463 | +void | ||
1464 | +avr32_init_builtins (void) | ||
1465 | +{ | ||
1466 | + unsigned int i; | ||
1467 | + const struct builtin_description *d; | ||
1468 | + tree endlink = void_list_node; | ||
1469 | + tree int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink); | ||
1470 | + tree longlong_endlink = | ||
1471 | + tree_cons (NULL_TREE, long_long_integer_type_node, endlink); | ||
1472 | + tree short_endlink = | ||
1473 | + tree_cons (NULL_TREE, short_integer_type_node, endlink); | ||
1474 | + tree void_endlink = tree_cons (NULL_TREE, void_type_node, endlink); | ||
1475 | + | ||
1476 | + /* int func (int) */ | ||
1477 | + int_ftype_int = build_function_type (integer_type_node, int_endlink); | ||
1478 | + | ||
1479 | + /* short func (short) */ | ||
1480 | + short_ftype_short | ||
1481 | + = build_function_type (short_integer_type_node, short_endlink); | ||
1482 | + | ||
1483 | + /* short func (short, short) */ | ||
1484 | + short_ftype_short_short | ||
1485 | + = build_function_type (short_integer_type_node, | ||
1486 | + tree_cons (NULL_TREE, short_integer_type_node, | ||
1487 | + short_endlink)); | ||
1488 | + | ||
1489 | + /* long long func (long long, short, short) */ | ||
1490 | + longlong_ftype_longlong_short_short | ||
1491 | + = build_function_type (long_long_integer_type_node, | ||
1492 | + tree_cons (NULL_TREE, long_long_integer_type_node, | ||
1493 | + tree_cons (NULL_TREE, | ||
1494 | + short_integer_type_node, | ||
1495 | + short_endlink))); | ||
1496 | + | ||
1497 | + /* long long func (short, short) */ | ||
1498 | + longlong_ftype_short_short | ||
1499 | + = build_function_type (long_long_integer_type_node, | ||
1500 | + tree_cons (NULL_TREE, short_integer_type_node, | ||
1501 | + short_endlink)); | ||
1502 | + | ||
1503 | + /* int func (int, int) */ | ||
1504 | + int_ftype_int_int | ||
1505 | + = build_function_type (integer_type_node, | ||
1506 | + tree_cons (NULL_TREE, integer_type_node, | ||
1507 | + int_endlink)); | ||
1508 | + | ||
1509 | + /* long long func (int, int) */ | ||
1510 | + longlong_ftype_int_int | ||
1511 | + = build_function_type (long_long_integer_type_node, | ||
1512 | + tree_cons (NULL_TREE, integer_type_node, | ||
1513 | + int_endlink)); | ||
1514 | + | ||
1515 | + /* long long int func (long long, int, short) */ | ||
1516 | + longlong_ftype_longlong_int_short | ||
1517 | + = build_function_type (long_long_integer_type_node, | ||
1518 | + tree_cons (NULL_TREE, long_long_integer_type_node, | ||
1519 | + tree_cons (NULL_TREE, integer_type_node, | ||
1520 | + short_endlink))); | ||
1521 | + | ||
1522 | + /* long long int func (int, short) */ | ||
1523 | + longlong_ftype_int_short | ||
1524 | + = build_function_type (long_long_integer_type_node, | ||
1525 | + tree_cons (NULL_TREE, integer_type_node, | ||
1526 | + short_endlink)); | ||
1527 | + | ||
1528 | + /* int func (int, short, short) */ | ||
1529 | + int_ftype_int_short_short | ||
1530 | + = build_function_type (integer_type_node, | ||
1531 | + tree_cons (NULL_TREE, integer_type_node, | ||
1532 | + tree_cons (NULL_TREE, | ||
1533 | + short_integer_type_node, | ||
1534 | + short_endlink))); | ||
1535 | + | ||
1536 | + /* int func (short, short) */ | ||
1537 | + int_ftype_short_short | ||
1538 | + = build_function_type (integer_type_node, | ||
1539 | + tree_cons (NULL_TREE, short_integer_type_node, | ||
1540 | + short_endlink)); | ||
1541 | + | ||
1542 | + /* int func (int, short) */ | ||
1543 | + int_ftype_int_short | ||
1544 | + = build_function_type (integer_type_node, | ||
1545 | + tree_cons (NULL_TREE, integer_type_node, | ||
1546 | + short_endlink)); | ||
1547 | + | ||
1548 | + /* void func (int, int) */ | ||
1549 | + void_ftype_int_int | ||
1550 | + = build_function_type (void_type_node, | ||
1551 | + tree_cons (NULL_TREE, integer_type_node, | ||
1552 | + int_endlink)); | ||
1553 | + | ||
1554 | + /* void func (int, int, int) */ | ||
1555 | + void_ftype_int_int_int | ||
1556 | + = build_function_type (void_type_node, | ||
1557 | + tree_cons (NULL_TREE, integer_type_node, | ||
1558 | + tree_cons (NULL_TREE, integer_type_node, | ||
1559 | + int_endlink))); | ||
1560 | + | ||
1561 | + /* void func (int, int, long long) */ | ||
1562 | + void_ftype_int_int_longlong | ||
1563 | + = build_function_type (void_type_node, | ||
1564 | + tree_cons (NULL_TREE, integer_type_node, | ||
1565 | + tree_cons (NULL_TREE, integer_type_node, | ||
1566 | + longlong_endlink))); | ||
1567 | + | ||
1568 | + /* void func (int, int, int, int, int) */ | ||
1569 | + void_ftype_int_int_int_int_int | ||
1570 | + = build_function_type (void_type_node, | ||
1571 | + tree_cons (NULL_TREE, integer_type_node, | ||
1572 | + tree_cons (NULL_TREE, integer_type_node, | ||
1573 | + tree_cons (NULL_TREE, | ||
1574 | + integer_type_node, | ||
1575 | + tree_cons | ||
1576 | + (NULL_TREE, | ||
1577 | + integer_type_node, | ||
1578 | + int_endlink))))); | ||
1579 | + | ||
1580 | + /* void func (void *, int) */ | ||
1581 | + void_ftype_ptr_int | ||
1582 | + = build_function_type (void_type_node, | ||
1583 | + tree_cons (NULL_TREE, ptr_type_node, int_endlink)); | ||
1584 | + | ||
1585 | + /* void func (int) */ | ||
1586 | + void_ftype_int = build_function_type (void_type_node, int_endlink); | ||
1587 | + | ||
1588 | + /* void func (void) */ | ||
1589 | + void_ftype_void = build_function_type (void_type_node, void_endlink); | ||
1590 | + | ||
1591 | + /* int func (void) */ | ||
1592 | + int_ftype_void = build_function_type (integer_type_node, void_endlink); | ||
1593 | + | ||
1594 | + /* int func (void *, int) */ | ||
1595 | + int_ftype_ptr_int | ||
1596 | + = build_function_type (integer_type_node, | ||
1597 | + tree_cons (NULL_TREE, ptr_type_node, int_endlink)); | ||
1598 | + | ||
1599 | + /* int func (int, int, int) */ | ||
1600 | + int_ftype_int_int_int | ||
1601 | + = build_function_type (integer_type_node, | ||
1602 | + tree_cons (NULL_TREE, integer_type_node, | ||
1603 | + tree_cons (NULL_TREE, integer_type_node, | ||
1604 | + int_endlink))); | ||
1605 | + | ||
1606 | + /* Initialize avr32 builtins. */ | ||
1607 | + def_builtin ("__builtin_mfsr", int_ftype_int, AVR32_BUILTIN_MFSR); | ||
1608 | + def_builtin ("__builtin_mtsr", void_ftype_int_int, AVR32_BUILTIN_MTSR); | ||
1609 | + def_builtin ("__builtin_mfdr", int_ftype_int, AVR32_BUILTIN_MFDR); | ||
1610 | + def_builtin ("__builtin_mtdr", void_ftype_int_int, AVR32_BUILTIN_MTDR); | ||
1611 | + def_builtin ("__builtin_cache", void_ftype_ptr_int, AVR32_BUILTIN_CACHE); | ||
1612 | + def_builtin ("__builtin_sync", void_ftype_int, AVR32_BUILTIN_SYNC); | ||
1613 | + def_builtin ("__builtin_tlbr", void_ftype_void, AVR32_BUILTIN_TLBR); | ||
1614 | + def_builtin ("__builtin_tlbs", void_ftype_void, AVR32_BUILTIN_TLBS); | ||
1615 | + def_builtin ("__builtin_tlbw", void_ftype_void, AVR32_BUILTIN_TLBW); | ||
1616 | + def_builtin ("__builtin_breakpoint", void_ftype_void, | ||
1617 | + AVR32_BUILTIN_BREAKPOINT); | ||
1618 | + def_builtin ("__builtin_xchg", int_ftype_ptr_int, AVR32_BUILTIN_XCHG); | ||
1619 | + def_builtin ("__builtin_ldxi", int_ftype_ptr_int, AVR32_BUILTIN_LDXI); | ||
1620 | + def_builtin ("__builtin_bswap_16", short_ftype_short, | ||
1621 | + AVR32_BUILTIN_BSWAP16); | ||
1622 | + def_builtin ("__builtin_bswap_32", int_ftype_int, AVR32_BUILTIN_BSWAP32); | ||
1623 | + def_builtin ("__builtin_cop", void_ftype_int_int_int_int_int, | ||
1624 | + AVR32_BUILTIN_COP); | ||
1625 | + def_builtin ("__builtin_mvcr_w", int_ftype_int_int, AVR32_BUILTIN_MVCR_W); | ||
1626 | + def_builtin ("__builtin_mvrc_w", void_ftype_int_int_int, | ||
1627 | + AVR32_BUILTIN_MVRC_W); | ||
1628 | + def_builtin ("__builtin_mvcr_d", longlong_ftype_int_int, | ||
1629 | + AVR32_BUILTIN_MVCR_D); | ||
1630 | + def_builtin ("__builtin_mvrc_d", void_ftype_int_int_longlong, | ||
1631 | + AVR32_BUILTIN_MVRC_D); | ||
1632 | + def_builtin ("__builtin_sats", int_ftype_int_int_int, AVR32_BUILTIN_SATS); | ||
1633 | + def_builtin ("__builtin_satu", int_ftype_int_int_int, AVR32_BUILTIN_SATU); | ||
1634 | + def_builtin ("__builtin_satrnds", int_ftype_int_int_int, | ||
1635 | + AVR32_BUILTIN_SATRNDS); | ||
1636 | + def_builtin ("__builtin_satrndu", int_ftype_int_int_int, | ||
1637 | + AVR32_BUILTIN_SATRNDU); | ||
1638 | + def_builtin ("__builtin_musfr", void_ftype_int, AVR32_BUILTIN_MUSFR); | ||
1639 | + def_builtin ("__builtin_mustr", int_ftype_void, AVR32_BUILTIN_MUSTR); | ||
1640 | + def_builtin ("__builtin_macsathh_w", int_ftype_int_short_short, | ||
1641 | + AVR32_BUILTIN_MACSATHH_W); | ||
1642 | + def_builtin ("__builtin_macwh_d", longlong_ftype_longlong_int_short, | ||
1643 | + AVR32_BUILTIN_MACWH_D); | ||
1644 | + def_builtin ("__builtin_machh_d", longlong_ftype_longlong_short_short, | ||
1645 | + AVR32_BUILTIN_MACHH_D); | ||
1646 | + | ||
1647 | + /* Add all builtins that are more or less simple operations on two | ||
1648 | + operands. */ | ||
1649 | + for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++) | ||
1650 | + { | ||
1651 | + /* Use one of the operands; the target can have a different mode for | ||
1652 | + mask-generating compares. */ | ||
1653 | + | ||
1654 | + if (d->name == 0) | ||
1655 | + continue; | ||
1656 | + | ||
1657 | + def_mbuiltin (d->mask, d->name, *(d->ftype), d->code); | ||
1658 | + } | ||
1659 | +} | ||
1660 | + | ||
1661 | + | ||
1662 | +/* Subroutine of avr32_expand_builtin to take care of binop insns. */ | ||
1663 | + | ||
1664 | +static rtx | ||
1665 | +avr32_expand_binop_builtin (enum insn_code icode, tree arglist, rtx target) | ||
1666 | +{ | ||
1667 | + rtx pat; | ||
1668 | + tree arg0 = TREE_VALUE (arglist); | ||
1669 | + tree arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1670 | + rtx op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1671 | + rtx op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1672 | + enum machine_mode tmode = insn_data[icode].operand[0].mode; | ||
1673 | + enum machine_mode mode0 = insn_data[icode].operand[1].mode; | ||
1674 | + enum machine_mode mode1 = insn_data[icode].operand[2].mode; | ||
1675 | + | ||
1676 | + if (!target | ||
1677 | + || GET_MODE (target) != tmode | ||
1678 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
1679 | + target = gen_reg_rtx (tmode); | ||
1680 | + | ||
1681 | + /* In case the insn wants input operands in modes different from the | ||
1682 | + result, abort. */ | ||
1683 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
1684 | + { | ||
1685 | + /* If op0 is already a reg we must cast it to the correct mode. */ | ||
1686 | + if (REG_P (op0)) | ||
1687 | + op0 = convert_to_mode (mode0, op0, 1); | ||
1688 | + else | ||
1689 | + op0 = copy_to_mode_reg (mode0, op0); | ||
1690 | + } | ||
1691 | + if (!(*insn_data[icode].operand[2].predicate) (op1, mode1)) | ||
1692 | + { | ||
1693 | + /* If op1 is already a reg we must cast it to the correct mode. */ | ||
1694 | + if (REG_P (op1)) | ||
1695 | + op1 = convert_to_mode (mode1, op1, 1); | ||
1696 | + else | ||
1697 | + op1 = copy_to_mode_reg (mode1, op1); | ||
1698 | + } | ||
1699 | + pat = GEN_FCN (icode) (target, op0, op1); | ||
1700 | + if (!pat) | ||
1701 | + return 0; | ||
1702 | + emit_insn (pat); | ||
1703 | + return target; | ||
1704 | +} | ||
1705 | + | ||
1706 | +/* Expand an expression EXP that calls a built-in function, | ||
1707 | + with result going to TARGET if that's convenient | ||
1708 | + (and in mode MODE if that's convenient). | ||
1709 | + SUBTARGET may be used as the target for computing one of EXP's operands. | ||
1710 | + IGNORE is nonzero if the value is to be ignored. */ | ||
1711 | + | ||
1712 | +rtx | ||
1713 | +avr32_expand_builtin (tree exp, | ||
1714 | + rtx target, | ||
1715 | + rtx subtarget ATTRIBUTE_UNUSED, | ||
1716 | + enum machine_mode mode ATTRIBUTE_UNUSED, | ||
1717 | + int ignore ATTRIBUTE_UNUSED) | ||
1718 | +{ | ||
1719 | + const struct builtin_description *d; | ||
1720 | + unsigned int i; | ||
1721 | + enum insn_code icode; | ||
1722 | + tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); | ||
1723 | + tree arglist = TREE_OPERAND (exp, 1); | ||
1724 | + tree arg0, arg1, arg2; | ||
1725 | + rtx op0, op1, op2, pat; | ||
1726 | + enum machine_mode tmode, mode0, mode1; | ||
1727 | + enum machine_mode arg0_mode; | ||
1728 | + int fcode = DECL_FUNCTION_CODE (fndecl); | ||
1729 | + | ||
1730 | + switch (fcode) | ||
1731 | + { | ||
1732 | + default: | ||
1733 | + break; | ||
1734 | + | ||
1735 | + case AVR32_BUILTIN_SATS: | ||
1736 | + case AVR32_BUILTIN_SATU: | ||
1737 | + case AVR32_BUILTIN_SATRNDS: | ||
1738 | + case AVR32_BUILTIN_SATRNDU: | ||
1739 | + { | ||
1740 | + const char *fname; | ||
1741 | + switch (fcode) | ||
1742 | + { | ||
1743 | + default: | ||
1744 | + case AVR32_BUILTIN_SATS: | ||
1745 | + icode = CODE_FOR_sats; | ||
1746 | + fname = "sats"; | ||
1747 | + break; | ||
1748 | + case AVR32_BUILTIN_SATU: | ||
1749 | + icode = CODE_FOR_satu; | ||
1750 | + fname = "satu"; | ||
1751 | + break; | ||
1752 | + case AVR32_BUILTIN_SATRNDS: | ||
1753 | + icode = CODE_FOR_satrnds; | ||
1754 | + fname = "satrnds"; | ||
1755 | + break; | ||
1756 | + case AVR32_BUILTIN_SATRNDU: | ||
1757 | + icode = CODE_FOR_satrndu; | ||
1758 | + fname = "satrndu"; | ||
1759 | + break; | ||
1760 | + } | ||
1761 | + | ||
1762 | + arg0 = TREE_VALUE (arglist); | ||
1763 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1764 | + arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); | ||
1765 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1766 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1767 | + op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); | ||
1768 | + | ||
1769 | + tmode = insn_data[icode].operand[0].mode; | ||
1770 | + | ||
1771 | + | ||
1772 | + if (target == 0 | ||
1773 | + || GET_MODE (target) != tmode | ||
1774 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
1775 | + target = gen_reg_rtx (tmode); | ||
1776 | + | ||
1777 | + | ||
1778 | + if (!(*insn_data[icode].operand[0].predicate) (op0, GET_MODE (op0))) | ||
1779 | + { | ||
1780 | + op0 = copy_to_mode_reg (insn_data[icode].operand[0].mode, op0); | ||
1781 | + } | ||
1782 | + | ||
1783 | + if (!(*insn_data[icode].operand[1].predicate) (op1, SImode)) | ||
1784 | + { | ||
1785 | + error ("Parameter 2 to __builtin_%s should be a constant number.", | ||
1786 | + fname); | ||
1787 | + return NULL_RTX; | ||
1788 | + } | ||
1789 | + | ||
1790 | + if (!(*insn_data[icode].operand[1].predicate) (op2, SImode)) | ||
1791 | + { | ||
1792 | + error ("Parameter 3 to __builtin_%s should be a constant number.", | ||
1793 | + fname); | ||
1794 | + return NULL_RTX; | ||
1795 | + } | ||
1796 | + | ||
1797 | + emit_move_insn (target, op0); | ||
1798 | + pat = GEN_FCN (icode) (target, op1, op2); | ||
1799 | + if (!pat) | ||
1800 | + return 0; | ||
1801 | + emit_insn (pat); | ||
1802 | + | ||
1803 | + return target; | ||
1804 | + } | ||
1805 | + case AVR32_BUILTIN_MUSTR: | ||
1806 | + icode = CODE_FOR_mustr; | ||
1807 | + tmode = insn_data[icode].operand[0].mode; | ||
1808 | + | ||
1809 | + if (target == 0 | ||
1810 | + || GET_MODE (target) != tmode | ||
1811 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
1812 | + target = gen_reg_rtx (tmode); | ||
1813 | + pat = GEN_FCN (icode) (target); | ||
1814 | + if (!pat) | ||
1815 | + return 0; | ||
1816 | + emit_insn (pat); | ||
1817 | + return target; | ||
1818 | + | ||
1819 | + case AVR32_BUILTIN_MFSR: | ||
1820 | + icode = CODE_FOR_mfsr; | ||
1821 | + arg0 = TREE_VALUE (arglist); | ||
1822 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1823 | + tmode = insn_data[icode].operand[0].mode; | ||
1824 | + mode0 = insn_data[icode].operand[1].mode; | ||
1825 | + | ||
1826 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
1827 | + { | ||
1828 | + error ("Parameter 1 to __builtin_mfsr must be a constant number"); | ||
1829 | + } | ||
1830 | + | ||
1831 | + if (target == 0 | ||
1832 | + || GET_MODE (target) != tmode | ||
1833 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
1834 | + target = gen_reg_rtx (tmode); | ||
1835 | + pat = GEN_FCN (icode) (target, op0); | ||
1836 | + if (!pat) | ||
1837 | + return 0; | ||
1838 | + emit_insn (pat); | ||
1839 | + return target; | ||
1840 | + case AVR32_BUILTIN_MTSR: | ||
1841 | + icode = CODE_FOR_mtsr; | ||
1842 | + arg0 = TREE_VALUE (arglist); | ||
1843 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1844 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1845 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1846 | + mode0 = insn_data[icode].operand[0].mode; | ||
1847 | + mode1 = insn_data[icode].operand[1].mode; | ||
1848 | + | ||
1849 | + if (!(*insn_data[icode].operand[0].predicate) (op0, mode0)) | ||
1850 | + { | ||
1851 | + error ("Parameter 1 to __builtin_mtsr must be a constant number"); | ||
1852 | + return gen_reg_rtx (mode0); | ||
1853 | + } | ||
1854 | + if (!(*insn_data[icode].operand[1].predicate) (op1, mode1)) | ||
1855 | + op1 = copy_to_mode_reg (mode1, op1); | ||
1856 | + pat = GEN_FCN (icode) (op0, op1); | ||
1857 | + if (!pat) | ||
1858 | + return 0; | ||
1859 | + emit_insn (pat); | ||
1860 | + return NULL_RTX; | ||
1861 | + case AVR32_BUILTIN_MFDR: | ||
1862 | + icode = CODE_FOR_mfdr; | ||
1863 | + arg0 = TREE_VALUE (arglist); | ||
1864 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1865 | + tmode = insn_data[icode].operand[0].mode; | ||
1866 | + mode0 = insn_data[icode].operand[1].mode; | ||
1867 | + | ||
1868 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
1869 | + { | ||
1870 | + error ("Parameter 1 to __builtin_mfdr must be a constant number"); | ||
1871 | + } | ||
1872 | + | ||
1873 | + if (target == 0 | ||
1874 | + || GET_MODE (target) != tmode | ||
1875 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
1876 | + target = gen_reg_rtx (tmode); | ||
1877 | + pat = GEN_FCN (icode) (target, op0); | ||
1878 | + if (!pat) | ||
1879 | + return 0; | ||
1880 | + emit_insn (pat); | ||
1881 | + return target; | ||
1882 | + case AVR32_BUILTIN_MTDR: | ||
1883 | + icode = CODE_FOR_mtdr; | ||
1884 | + arg0 = TREE_VALUE (arglist); | ||
1885 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1886 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1887 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1888 | + mode0 = insn_data[icode].operand[0].mode; | ||
1889 | + mode1 = insn_data[icode].operand[1].mode; | ||
1890 | + | ||
1891 | + if (!(*insn_data[icode].operand[0].predicate) (op0, mode0)) | ||
1892 | + { | ||
1893 | + error ("Parameter 1 to __builtin_mtdr must be a constant number"); | ||
1894 | + return gen_reg_rtx (mode0); | ||
1895 | + } | ||
1896 | + if (!(*insn_data[icode].operand[1].predicate) (op1, mode1)) | ||
1897 | + op1 = copy_to_mode_reg (mode1, op1); | ||
1898 | + pat = GEN_FCN (icode) (op0, op1); | ||
1899 | + if (!pat) | ||
1900 | + return 0; | ||
1901 | + emit_insn (pat); | ||
1902 | + return NULL_RTX; | ||
1903 | + case AVR32_BUILTIN_CACHE: | ||
1904 | + icode = CODE_FOR_cache; | ||
1905 | + arg0 = TREE_VALUE (arglist); | ||
1906 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1907 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1908 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1909 | + mode0 = insn_data[icode].operand[0].mode; | ||
1910 | + mode1 = insn_data[icode].operand[1].mode; | ||
1911 | + | ||
1912 | + if (!(*insn_data[icode].operand[1].predicate) (op1, mode1)) | ||
1913 | + { | ||
1914 | + error ("Parameter 2 to __builtin_cache must be a constant number"); | ||
1915 | + return gen_reg_rtx (mode1); | ||
1916 | + } | ||
1917 | + | ||
1918 | + if (!(*insn_data[icode].operand[0].predicate) (op0, mode0)) | ||
1919 | + op0 = copy_to_mode_reg (mode0, op0); | ||
1920 | + | ||
1921 | + pat = GEN_FCN (icode) (op0, op1); | ||
1922 | + if (!pat) | ||
1923 | + return 0; | ||
1924 | + emit_insn (pat); | ||
1925 | + return NULL_RTX; | ||
1926 | + case AVR32_BUILTIN_SYNC: | ||
1927 | + case AVR32_BUILTIN_MUSFR: | ||
1928 | + { | ||
1929 | + const char *fname; | ||
1930 | + switch (fcode) | ||
1931 | + { | ||
1932 | + default: | ||
1933 | + case AVR32_BUILTIN_SYNC: | ||
1934 | + icode = CODE_FOR_sync; | ||
1935 | + fname = "sync"; | ||
1936 | + break; | ||
1937 | + case AVR32_BUILTIN_MUSFR: | ||
1938 | + icode = CODE_FOR_musfr; | ||
1939 | + fname = "musfr"; | ||
1940 | + break; | ||
1941 | + } | ||
1942 | + | ||
1943 | + arg0 = TREE_VALUE (arglist); | ||
1944 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1945 | + mode0 = insn_data[icode].operand[0].mode; | ||
1946 | + | ||
1947 | + if (!(*insn_data[icode].operand[0].predicate) (op0, mode0)) | ||
1948 | + { | ||
1949 | + if (icode == CODE_FOR_musfr) | ||
1950 | + op0 = copy_to_mode_reg (mode0, op0); | ||
1951 | + else | ||
1952 | + { | ||
1953 | + error ("Parameter to __builtin_%s is illegal.", fname); | ||
1954 | + return gen_reg_rtx (mode0); | ||
1955 | + } | ||
1956 | + } | ||
1957 | + pat = GEN_FCN (icode) (op0); | ||
1958 | + if (!pat) | ||
1959 | + return 0; | ||
1960 | + emit_insn (pat); | ||
1961 | + return NULL_RTX; | ||
1962 | + } | ||
1963 | + case AVR32_BUILTIN_TLBR: | ||
1964 | + icode = CODE_FOR_tlbr; | ||
1965 | + pat = GEN_FCN (icode) (NULL_RTX); | ||
1966 | + if (!pat) | ||
1967 | + return 0; | ||
1968 | + emit_insn (pat); | ||
1969 | + return NULL_RTX; | ||
1970 | + case AVR32_BUILTIN_TLBS: | ||
1971 | + icode = CODE_FOR_tlbs; | ||
1972 | + pat = GEN_FCN (icode) (NULL_RTX); | ||
1973 | + if (!pat) | ||
1974 | + return 0; | ||
1975 | + emit_insn (pat); | ||
1976 | + return NULL_RTX; | ||
1977 | + case AVR32_BUILTIN_TLBW: | ||
1978 | + icode = CODE_FOR_tlbw; | ||
1979 | + pat = GEN_FCN (icode) (NULL_RTX); | ||
1980 | + if (!pat) | ||
1981 | + return 0; | ||
1982 | + emit_insn (pat); | ||
1983 | + return NULL_RTX; | ||
1984 | + case AVR32_BUILTIN_BREAKPOINT: | ||
1985 | + icode = CODE_FOR_breakpoint; | ||
1986 | + pat = GEN_FCN (icode) (NULL_RTX); | ||
1987 | + if (!pat) | ||
1988 | + return 0; | ||
1989 | + emit_insn (pat); | ||
1990 | + return NULL_RTX; | ||
1991 | + case AVR32_BUILTIN_XCHG: | ||
1992 | + icode = CODE_FOR_xchg; | ||
1993 | + arg0 = TREE_VALUE (arglist); | ||
1994 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
1995 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
1996 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
1997 | + tmode = insn_data[icode].operand[0].mode; | ||
1998 | + mode0 = insn_data[icode].operand[1].mode; | ||
1999 | + mode1 = insn_data[icode].operand[3].mode; | ||
2000 | + | ||
2001 | + if (!(*insn_data[icode].operand[3].predicate) (op1, mode1)) | ||
2002 | + { | ||
2003 | + op1 = copy_to_mode_reg (mode1, op1); | ||
2004 | + } | ||
2005 | + | ||
2006 | + if (!(*insn_data[icode].operand[2].predicate) (op0, mode0)) | ||
2007 | + { | ||
2008 | + op0 = copy_to_mode_reg (mode0, op0); | ||
2009 | + } | ||
2010 | + | ||
2011 | + if (target == 0 | ||
2012 | + || GET_MODE (target) != tmode | ||
2013 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2014 | + target = gen_reg_rtx (tmode); | ||
2015 | + pat = GEN_FCN (icode) (target, op0, op0, op1); | ||
2016 | + if (!pat) | ||
2017 | + return 0; | ||
2018 | + emit_insn (pat); | ||
2019 | + return target; | ||
2020 | + case AVR32_BUILTIN_LDXI: | ||
2021 | + icode = CODE_FOR_ldxi; | ||
2022 | + arg0 = TREE_VALUE (arglist); | ||
2023 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
2024 | + arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); | ||
2025 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2026 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
2027 | + op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); | ||
2028 | + tmode = insn_data[icode].operand[0].mode; | ||
2029 | + mode0 = insn_data[icode].operand[1].mode; | ||
2030 | + mode1 = insn_data[icode].operand[2].mode; | ||
2031 | + | ||
2032 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
2033 | + { | ||
2034 | + op0 = copy_to_mode_reg (mode0, op0); | ||
2035 | + } | ||
2036 | + | ||
2037 | + if (!(*insn_data[icode].operand[2].predicate) (op1, mode1)) | ||
2038 | + { | ||
2039 | + op1 = copy_to_mode_reg (mode1, op1); | ||
2040 | + } | ||
2041 | + | ||
2042 | + if (!(*insn_data[icode].operand[3].predicate) (op2, SImode)) | ||
2043 | + { | ||
2044 | + error | ||
2045 | + ("Parameter 3 to __builtin_ldxi must be a valid extract shift operand: (0|8|16|24)"); | ||
2046 | + return gen_reg_rtx (mode0); | ||
2047 | + } | ||
2048 | + | ||
2049 | + if (target == 0 | ||
2050 | + || GET_MODE (target) != tmode | ||
2051 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2052 | + target = gen_reg_rtx (tmode); | ||
2053 | + pat = GEN_FCN (icode) (target, op0, op1, op2); | ||
2054 | + if (!pat) | ||
2055 | + return 0; | ||
2056 | + emit_insn (pat); | ||
2057 | + return target; | ||
2058 | + case AVR32_BUILTIN_BSWAP16: | ||
2059 | + { | ||
2060 | + icode = CODE_FOR_bswap_16; | ||
2061 | + arg0 = TREE_VALUE (arglist); | ||
2062 | + arg0_mode = TYPE_MODE (TREE_TYPE (arg0)); | ||
2063 | + mode0 = insn_data[icode].operand[1].mode; | ||
2064 | + if (arg0_mode != mode0) | ||
2065 | + arg0 = build1 (NOP_EXPR, | ||
2066 | + (*lang_hooks.types.type_for_mode) (mode0, 0), arg0); | ||
2067 | + | ||
2068 | + op0 = expand_expr (arg0, NULL_RTX, HImode, 0); | ||
2069 | + tmode = insn_data[icode].operand[0].mode; | ||
2070 | + | ||
2071 | + | ||
2072 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
2073 | + { | ||
2074 | + op0 = copy_to_mode_reg (mode0, op0); | ||
2075 | + } | ||
2076 | + | ||
2077 | + if (target == 0 | ||
2078 | + || GET_MODE (target) != tmode | ||
2079 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2080 | + { | ||
2081 | + target = gen_reg_rtx (tmode); | ||
2082 | + } | ||
2083 | + | ||
2084 | + | ||
2085 | + pat = GEN_FCN (icode) (target, op0); | ||
2086 | + if (!pat) | ||
2087 | + return 0; | ||
2088 | + emit_insn (pat); | ||
2089 | + | ||
2090 | + return target; | ||
2091 | + } | ||
2092 | + case AVR32_BUILTIN_BSWAP32: | ||
2093 | + { | ||
2094 | + icode = CODE_FOR_bswap_32; | ||
2095 | + arg0 = TREE_VALUE (arglist); | ||
2096 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2097 | + tmode = insn_data[icode].operand[0].mode; | ||
2098 | + mode0 = insn_data[icode].operand[1].mode; | ||
2099 | + | ||
2100 | + if (!(*insn_data[icode].operand[1].predicate) (op0, mode0)) | ||
2101 | + { | ||
2102 | + op0 = copy_to_mode_reg (mode0, op0); | ||
2103 | + } | ||
2104 | + | ||
2105 | + if (target == 0 | ||
2106 | + || GET_MODE (target) != tmode | ||
2107 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2108 | + target = gen_reg_rtx (tmode); | ||
2109 | + | ||
2110 | + | ||
2111 | + pat = GEN_FCN (icode) (target, op0); | ||
2112 | + if (!pat) | ||
2113 | + return 0; | ||
2114 | + emit_insn (pat); | ||
2115 | + | ||
2116 | + return target; | ||
2117 | + } | ||
2118 | + case AVR32_BUILTIN_MVCR_W: | ||
2119 | + case AVR32_BUILTIN_MVCR_D: | ||
2120 | + { | ||
2121 | + arg0 = TREE_VALUE (arglist); | ||
2122 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
2123 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2124 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
2125 | + | ||
2126 | + if (fcode == AVR32_BUILTIN_MVCR_W) | ||
2127 | + icode = CODE_FOR_mvcrsi; | ||
2128 | + else | ||
2129 | + icode = CODE_FOR_mvcrdi; | ||
2130 | + | ||
2131 | + tmode = insn_data[icode].operand[0].mode; | ||
2132 | + | ||
2133 | + if (target == 0 | ||
2134 | + || GET_MODE (target) != tmode | ||
2135 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2136 | + target = gen_reg_rtx (tmode); | ||
2137 | + | ||
2138 | + if (!(*insn_data[icode].operand[1].predicate) (op0, SImode)) | ||
2139 | + { | ||
2140 | + error | ||
2141 | + ("Parameter 1 to __builtin_cop is not a valid coprocessor number."); | ||
2142 | + error ("Number should be between 0 and 7."); | ||
2143 | + return NULL_RTX; | ||
2144 | + } | ||
2145 | + | ||
2146 | + if (!(*insn_data[icode].operand[2].predicate) (op1, SImode)) | ||
2147 | + { | ||
2148 | + error | ||
2149 | + ("Parameter 2 to __builtin_cop is not a valid coprocessor register number."); | ||
2150 | + error ("Number should be between 0 and 15."); | ||
2151 | + return NULL_RTX; | ||
2152 | + } | ||
2153 | + | ||
2154 | + pat = GEN_FCN (icode) (target, op0, op1); | ||
2155 | + if (!pat) | ||
2156 | + return 0; | ||
2157 | + emit_insn (pat); | ||
2158 | + | ||
2159 | + return target; | ||
2160 | + } | ||
2161 | + case AVR32_BUILTIN_MACSATHH_W: | ||
2162 | + case AVR32_BUILTIN_MACWH_D: | ||
2163 | + case AVR32_BUILTIN_MACHH_D: | ||
2164 | + { | ||
2165 | + arg0 = TREE_VALUE (arglist); | ||
2166 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
2167 | + arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); | ||
2168 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2169 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
2170 | + op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); | ||
2171 | + | ||
2172 | + icode = ((fcode == AVR32_BUILTIN_MACSATHH_W) ? CODE_FOR_macsathh_w : | ||
2173 | + (fcode == AVR32_BUILTIN_MACWH_D) ? CODE_FOR_macwh_d : | ||
2174 | + CODE_FOR_machh_d); | ||
2175 | + | ||
2176 | + tmode = insn_data[icode].operand[0].mode; | ||
2177 | + mode0 = insn_data[icode].operand[1].mode; | ||
2178 | + mode1 = insn_data[icode].operand[2].mode; | ||
2179 | + | ||
2180 | + | ||
2181 | + if (!target | ||
2182 | + || GET_MODE (target) != tmode | ||
2183 | + || !(*insn_data[icode].operand[0].predicate) (target, tmode)) | ||
2184 | + target = gen_reg_rtx (tmode); | ||
2185 | + | ||
2186 | + if (!(*insn_data[icode].operand[0].predicate) (op0, tmode)) | ||
2187 | + { | ||
2188 | + /* If op0 is already a reg we must cast it to the correct mode. */ | ||
2189 | + if (REG_P (op0)) | ||
2190 | + op0 = convert_to_mode (tmode, op0, 1); | ||
2191 | + else | ||
2192 | + op0 = copy_to_mode_reg (tmode, op0); | ||
2193 | + } | ||
2194 | + | ||
2195 | + if (!(*insn_data[icode].operand[1].predicate) (op1, mode0)) | ||
2196 | + { | ||
2197 | + /* If op1 is already a reg we must cast it to the correct mode. */ | ||
2198 | + if (REG_P (op1)) | ||
2199 | + op1 = convert_to_mode (mode0, op1, 1); | ||
2200 | + else | ||
2201 | + op1 = copy_to_mode_reg (mode0, op1); | ||
2202 | + } | ||
2203 | + | ||
2204 | + if (!(*insn_data[icode].operand[2].predicate) (op2, mode1)) | ||
2205 | + { | ||
2206 | + /* If op1 is already a reg we must cast it to the correct mode. */ | ||
2207 | + if (REG_P (op2)) | ||
2208 | + op2 = convert_to_mode (mode1, op2, 1); | ||
2209 | + else | ||
2210 | + op2 = copy_to_mode_reg (mode1, op2); | ||
2211 | + } | ||
2212 | + | ||
2213 | + emit_move_insn (target, op0); | ||
2214 | + | ||
2215 | + pat = GEN_FCN (icode) (target, op1, op2); | ||
2216 | + if (!pat) | ||
2217 | + return 0; | ||
2218 | + emit_insn (pat); | ||
2219 | + return target; | ||
2220 | + } | ||
2221 | + case AVR32_BUILTIN_MVRC_W: | ||
2222 | + case AVR32_BUILTIN_MVRC_D: | ||
2223 | + { | ||
2224 | + arg0 = TREE_VALUE (arglist); | ||
2225 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
2226 | + arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); | ||
2227 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2228 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
2229 | + op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); | ||
2230 | + | ||
2231 | + if (fcode == AVR32_BUILTIN_MVRC_W) | ||
2232 | + icode = CODE_FOR_mvrcsi; | ||
2233 | + else | ||
2234 | + icode = CODE_FOR_mvrcdi; | ||
2235 | + | ||
2236 | + if (!(*insn_data[icode].operand[0].predicate) (op0, SImode)) | ||
2237 | + { | ||
2238 | + error ("Parameter 1 is not a valid coprocessor number."); | ||
2239 | + error ("Number should be between 0 and 7."); | ||
2240 | + return NULL_RTX; | ||
2241 | + } | ||
2242 | + | ||
2243 | + if (!(*insn_data[icode].operand[1].predicate) (op1, SImode)) | ||
2244 | + { | ||
2245 | + error ("Parameter 2 is not a valid coprocessor register number."); | ||
2246 | + error ("Number should be between 0 and 15."); | ||
2247 | + return NULL_RTX; | ||
2248 | + } | ||
2249 | + | ||
2250 | + if (GET_CODE (op2) == CONST_INT | ||
2251 | + || GET_CODE (op2) == CONST | ||
2252 | + || GET_CODE (op2) == SYMBOL_REF || GET_CODE (op2) == LABEL_REF) | ||
2253 | + { | ||
2254 | + op2 = force_const_mem (insn_data[icode].operand[2].mode, op2); | ||
2255 | + } | ||
2256 | + | ||
2257 | + if (!(*insn_data[icode].operand[2].predicate) (op2, GET_MODE (op2))) | ||
2258 | + op2 = copy_to_mode_reg (insn_data[icode].operand[2].mode, op2); | ||
2259 | + | ||
2260 | + | ||
2261 | + pat = GEN_FCN (icode) (op0, op1, op2); | ||
2262 | + if (!pat) | ||
2263 | + return 0; | ||
2264 | + emit_insn (pat); | ||
2265 | + | ||
2266 | + return NULL_RTX; | ||
2267 | + } | ||
2268 | + case AVR32_BUILTIN_COP: | ||
2269 | + { | ||
2270 | + rtx op3, op4; | ||
2271 | + tree arg3, arg4; | ||
2272 | + icode = CODE_FOR_cop; | ||
2273 | + arg0 = TREE_VALUE (arglist); | ||
2274 | + arg1 = TREE_VALUE (TREE_CHAIN (arglist)); | ||
2275 | + arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); | ||
2276 | + arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist)))); | ||
2277 | + arg4 = | ||
2278 | + TREE_VALUE (TREE_CHAIN | ||
2279 | + (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (arglist))))); | ||
2280 | + op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0); | ||
2281 | + op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0); | ||
2282 | + op2 = expand_expr (arg2, NULL_RTX, VOIDmode, 0); | ||
2283 | + op3 = expand_expr (arg3, NULL_RTX, VOIDmode, 0); | ||
2284 | + op4 = expand_expr (arg4, NULL_RTX, VOIDmode, 0); | ||
2285 | + | ||
2286 | + if (!(*insn_data[icode].operand[0].predicate) (op0, SImode)) | ||
2287 | + { | ||
2288 | + error | ||
2289 | + ("Parameter 1 to __builtin_cop is not a valid coprocessor number."); | ||
2290 | + error ("Number should be between 0 and 7."); | ||
2291 | + return NULL_RTX; | ||
2292 | + } | ||
2293 | + | ||
2294 | + if (!(*insn_data[icode].operand[1].predicate) (op1, SImode)) | ||
2295 | + { | ||
2296 | + error | ||
2297 | + ("Parameter 2 to __builtin_cop is not a valid coprocessor register number."); | ||
2298 | + error ("Number should be between 0 and 15."); | ||
2299 | + return NULL_RTX; | ||
2300 | + } | ||
2301 | + | ||
2302 | + if (!(*insn_data[icode].operand[2].predicate) (op2, SImode)) | ||
2303 | + { | ||
2304 | + error | ||
2305 | + ("Parameter 3 to __builtin_cop is not a valid coprocessor register number."); | ||
2306 | + error ("Number should be between 0 and 15."); | ||
2307 | + return NULL_RTX; | ||
2308 | + } | ||
2309 | + | ||
2310 | + if (!(*insn_data[icode].operand[3].predicate) (op3, SImode)) | ||
2311 | + { | ||
2312 | + error | ||
2313 | + ("Parameter 4 to __builtin_cop is not a valid coprocessor register number."); | ||
2314 | + error ("Number should be between 0 and 15."); | ||
2315 | + return NULL_RTX; | ||
2316 | + } | ||
2317 | + | ||
2318 | + if (!(*insn_data[icode].operand[4].predicate) (op4, SImode)) | ||
2319 | + { | ||
2320 | + error | ||
2321 | + ("Parameter 5 to __builtin_cop is not a valid coprocessor operation."); | ||
2322 | + error ("Number should be between 0 and 127."); | ||
2323 | + return NULL_RTX; | ||
2324 | + } | ||
2325 | + | ||
2326 | + pat = GEN_FCN (icode) (op0, op1, op2, op3, op4); | ||
2327 | + if (!pat) | ||
2328 | + return 0; | ||
2329 | + emit_insn (pat); | ||
2330 | + | ||
2331 | + return target; | ||
2332 | + } | ||
2333 | + } | ||
2334 | + | ||
2335 | + for (i = 0, d = bdesc_2arg; i < ARRAY_SIZE (bdesc_2arg); i++, d++) | ||
2336 | + if (d->code == fcode) | ||
2337 | + return avr32_expand_binop_builtin (d->icode, arglist, target); | ||
2338 | + | ||
2339 | + | ||
2340 | + /* @@@ Should really do something sensible here. */ | ||
2341 | + return NULL_RTX; | ||
2342 | +} | ||
2343 | + | ||
2344 | + | ||
2345 | +/* Handle an "interrupt" or "isr" attribute; | ||
2346 | + arguments as in struct attribute_spec.handler. */ | ||
2347 | + | ||
2348 | +static tree | ||
2349 | +avr32_handle_isr_attribute (tree * node, tree name, tree args, | ||
2350 | + int flags, bool * no_add_attrs) | ||
2351 | +{ | ||
2352 | + if (DECL_P (*node)) | ||
2353 | + { | ||
2354 | + if (TREE_CODE (*node) != FUNCTION_DECL) | ||
2355 | + { | ||
2356 | + warning ("`%s' attribute only applies to functions", | ||
2357 | + IDENTIFIER_POINTER (name)); | ||
2358 | + *no_add_attrs = true; | ||
2359 | + } | ||
2360 | + /* FIXME: the argument if any is checked for type attributes; should it | ||
2361 | + be checked for decl ones? */ | ||
2362 | + } | ||
2363 | + else | ||
2364 | + { | ||
2365 | + if (TREE_CODE (*node) == FUNCTION_TYPE | ||
2366 | + || TREE_CODE (*node) == METHOD_TYPE) | ||
2367 | + { | ||
2368 | + if (avr32_isr_value (args) == AVR32_FT_UNKNOWN) | ||
2369 | + { | ||
2370 | + warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | ||
2371 | + *no_add_attrs = true; | ||
2372 | + } | ||
2373 | + } | ||
2374 | + else if (TREE_CODE (*node) == POINTER_TYPE | ||
2375 | + && (TREE_CODE (TREE_TYPE (*node)) == FUNCTION_TYPE | ||
2376 | + || TREE_CODE (TREE_TYPE (*node)) == METHOD_TYPE) | ||
2377 | + && avr32_isr_value (args) != AVR32_FT_UNKNOWN) | ||
2378 | + { | ||
2379 | + *node = build_variant_type_copy (*node); | ||
2380 | + TREE_TYPE (*node) = build_type_attribute_variant | ||
2381 | + (TREE_TYPE (*node), | ||
2382 | + tree_cons (name, args, TYPE_ATTRIBUTES (TREE_TYPE (*node)))); | ||
2383 | + *no_add_attrs = true; | ||
2384 | + } | ||
2385 | + else | ||
2386 | + { | ||
2387 | + /* Possibly pass this attribute on from the type to a decl. */ | ||
2388 | + if (flags & ((int) ATTR_FLAG_DECL_NEXT | ||
2389 | + | (int) ATTR_FLAG_FUNCTION_NEXT | ||
2390 | + | (int) ATTR_FLAG_ARRAY_NEXT)) | ||
2391 | + { | ||
2392 | + *no_add_attrs = true; | ||
2393 | + return tree_cons (name, args, NULL_TREE); | ||
2394 | + } | ||
2395 | + else | ||
2396 | + { | ||
2397 | + warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | ||
2398 | + } | ||
2399 | + } | ||
2400 | + } | ||
2401 | + | ||
2402 | + return NULL_TREE; | ||
2403 | +} | ||
2404 | + | ||
2405 | +/* Handle an attribute requiring a FUNCTION_DECL; | ||
2406 | + arguments as in struct attribute_spec.handler. */ | ||
2407 | +static tree | ||
2408 | +avr32_handle_fndecl_attribute (tree * node, tree name, | ||
2409 | + tree args ATTRIBUTE_UNUSED, | ||
2410 | + int flags ATTRIBUTE_UNUSED, | ||
2411 | + bool * no_add_attrs) | ||
2412 | +{ | ||
2413 | + if (TREE_CODE (*node) != FUNCTION_DECL) | ||
2414 | + { | ||
2415 | + warning ("%qs attribute only applies to functions", | ||
2416 | + IDENTIFIER_POINTER (name)); | ||
2417 | + *no_add_attrs = true; | ||
2418 | + } | ||
2419 | + | ||
2420 | + return NULL_TREE; | ||
2421 | +} | ||
2422 | + | ||
2423 | + | ||
2424 | +/* Handle an acall attribute; | ||
2425 | + arguments as in struct attribute_spec.handler. */ | ||
2426 | + | ||
2427 | +static tree | ||
2428 | +avr32_handle_acall_attribute (tree * node, tree name, | ||
2429 | + tree args ATTRIBUTE_UNUSED, | ||
2430 | + int flags ATTRIBUTE_UNUSED, bool * no_add_attrs) | ||
2431 | +{ | ||
2432 | + if (TREE_CODE (*node) == FUNCTION_TYPE || TREE_CODE (*node) == METHOD_TYPE) | ||
2433 | + { | ||
2434 | + warning ("`%s' attribute not yet supported...", | ||
2435 | + IDENTIFIER_POINTER (name)); | ||
2436 | + *no_add_attrs = true; | ||
2437 | + return NULL_TREE; | ||
2438 | + } | ||
2439 | + | ||
2440 | + warning ("`%s' attribute only applies to functions", | ||
2441 | + IDENTIFIER_POINTER (name)); | ||
2442 | + *no_add_attrs = true; | ||
2443 | + return NULL_TREE; | ||
2444 | +} | ||
2445 | + | ||
2446 | + | ||
2447 | +/* Return 0 if the attributes for two types are incompatible, 1 if they | ||
2448 | + are compatible, and 2 if they are nearly compatible (which causes a | ||
2449 | + warning to be generated). */ | ||
2450 | + | ||
2451 | +static int | ||
2452 | +avr32_comp_type_attributes (tree type1, tree type2) | ||
2453 | +{ | ||
2454 | + int acall1, acall2, isr1, isr2, naked1, naked2; | ||
2455 | + | ||
2456 | + /* Check for mismatch of non-default calling convention. */ | ||
2457 | + if (TREE_CODE (type1) != FUNCTION_TYPE) | ||
2458 | + return 1; | ||
2459 | + | ||
2460 | + /* Check for mismatched call attributes. */ | ||
2461 | + acall1 = lookup_attribute ("acall", TYPE_ATTRIBUTES (type1)) != NULL; | ||
2462 | + acall2 = lookup_attribute ("acall", TYPE_ATTRIBUTES (type2)) != NULL; | ||
2463 | + naked1 = lookup_attribute ("naked", TYPE_ATTRIBUTES (type1)) != NULL; | ||
2464 | + naked2 = lookup_attribute ("naked", TYPE_ATTRIBUTES (type2)) != NULL; | ||
2465 | + isr1 = lookup_attribute ("isr", TYPE_ATTRIBUTES (type1)) != NULL; | ||
2466 | + if (!isr1) | ||
2467 | + isr1 = lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type1)) != NULL; | ||
2468 | + | ||
2469 | + isr2 = lookup_attribute ("isr", TYPE_ATTRIBUTES (type2)) != NULL; | ||
2470 | + if (!isr2) | ||
2471 | + isr2 = lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type2)) != NULL; | ||
2472 | + | ||
2473 | + if ((acall1 && isr2) | ||
2474 | + || (acall2 && isr1) || (naked1 && isr2) || (naked2 && isr1)) | ||
2475 | + return 0; | ||
2476 | + | ||
2477 | + return 1; | ||
2478 | +} | ||
2479 | + | ||
2480 | + | ||
2481 | +/* Computes the type of the current function. */ | ||
2482 | + | ||
2483 | +static unsigned long | ||
2484 | +avr32_compute_func_type (void) | ||
2485 | +{ | ||
2486 | + unsigned long type = AVR32_FT_UNKNOWN; | ||
2487 | + tree a; | ||
2488 | + tree attr; | ||
2489 | + | ||
2490 | + if (TREE_CODE (current_function_decl) != FUNCTION_DECL) | ||
2491 | + abort (); | ||
2492 | + | ||
2493 | + /* Decide if the current function is volatile. Such functions never | ||
2494 | + return, and many memory cycles can be saved by not storing register | ||
2495 | + values that will never be needed again. This optimization was added to | ||
2496 | + speed up context switching in a kernel application. */ | ||
2497 | + if (optimize > 0 | ||
2498 | + && TREE_NOTHROW (current_function_decl) | ||
2499 | + && TREE_THIS_VOLATILE (current_function_decl)) | ||
2500 | + type |= AVR32_FT_VOLATILE; | ||
2501 | + | ||
2502 | + if (cfun->static_chain_decl != NULL) | ||
2503 | + type |= AVR32_FT_NESTED; | ||
2504 | + | ||
2505 | + attr = DECL_ATTRIBUTES (current_function_decl); | ||
2506 | + | ||
2507 | + a = lookup_attribute ("isr", attr); | ||
2508 | + if (a == NULL_TREE) | ||
2509 | + a = lookup_attribute ("interrupt", attr); | ||
2510 | + | ||
2511 | + if (a == NULL_TREE) | ||
2512 | + type |= AVR32_FT_NORMAL; | ||
2513 | + else | ||
2514 | + type |= avr32_isr_value (TREE_VALUE (a)); | ||
2515 | + | ||
2516 | + | ||
2517 | + a = lookup_attribute ("acall", attr); | ||
2518 | + if (a != NULL_TREE) | ||
2519 | + type |= AVR32_FT_ACALL; | ||
2520 | + | ||
2521 | + a = lookup_attribute ("naked", attr); | ||
2522 | + if (a != NULL_TREE) | ||
2523 | + type |= AVR32_FT_NAKED; | ||
2524 | + | ||
2525 | + return type; | ||
2526 | +} | ||
2527 | + | ||
2528 | +/* Returns the type of the current function. */ | ||
2529 | + | ||
2530 | +static unsigned long | ||
2531 | +avr32_current_func_type (void) | ||
2532 | +{ | ||
2533 | + if (AVR32_FUNC_TYPE (cfun->machine->func_type) == AVR32_FT_UNKNOWN) | ||
2534 | + cfun->machine->func_type = avr32_compute_func_type (); | ||
2535 | + | ||
2536 | + return cfun->machine->func_type; | ||
2537 | +} | ||
2538 | + | ||
2539 | +/* | ||
2540 | + This target hook should return true if we should not pass type solely | ||
2541 | + in registers. The file expr.h defines a definition that is usually appropriate, | ||
2542 | + refer to expr.h for additional documentation. | ||
2543 | +*/ | ||
2544 | +bool | ||
2545 | +avr32_must_pass_in_stack (enum machine_mode mode ATTRIBUTE_UNUSED, tree type) | ||
2546 | +{ | ||
2547 | + if (type && AGGREGATE_TYPE_P (type) | ||
2548 | + /* If the alignment is less than the size then pass in the struct on | ||
2549 | + the stack. */ | ||
2550 | + && ((unsigned int) TYPE_ALIGN_UNIT (type) < | ||
2551 | + (unsigned int) int_size_in_bytes (type)) | ||
2552 | + /* If we support unaligned word accesses then structs of size 4 and 8 | ||
2553 | + can have any alignment and still be passed in registers. */ | ||
2554 | + && !(TARGET_UNALIGNED_WORD | ||
2555 | + && (int_size_in_bytes (type) == 4 | ||
2556 | + || int_size_in_bytes (type) == 8)) | ||
2557 | + /* Double word structs need only a word alignment. */ | ||
2558 | + && !(int_size_in_bytes (type) == 8 && TYPE_ALIGN_UNIT (type) >= 4)) | ||
2559 | + return true; | ||
2560 | + | ||
2561 | + if (type && AGGREGATE_TYPE_P (type) | ||
2562 | + /* Structs of size 3,5,6,7 are always passed in registers. */ | ||
2563 | + && (int_size_in_bytes (type) == 3 | ||
2564 | + || int_size_in_bytes (type) == 5 | ||
2565 | + || int_size_in_bytes (type) == 6 || int_size_in_bytes (type) == 7)) | ||
2566 | + return true; | ||
2567 | + | ||
2568 | + | ||
2569 | + return (type && TREE_ADDRESSABLE (type)); | ||
2570 | +} | ||
2571 | + | ||
2572 | + | ||
2573 | +bool | ||
2574 | +avr32_strict_argument_naming (CUMULATIVE_ARGS * ca ATTRIBUTE_UNUSED) | ||
2575 | +{ | ||
2576 | + return true; | ||
2577 | +} | ||
2578 | + | ||
2579 | +/* | ||
2580 | + This target hook should return true if an argument at the position indicated | ||
2581 | + by cum should be passed by reference. This predicate is queried after target | ||
2582 | + independent reasons for being passed by reference, such as TREE_ADDRESSABLE (type). | ||
2583 | + | ||
2584 | + If the hook returns true, a copy of that argument is made in memory and a | ||
2585 | + pointer to the argument is passed instead of the argument itself. The pointer | ||
2586 | + is passed in whatever way is appropriate for passing a pointer to that type. | ||
2587 | +*/ | ||
2588 | +bool | ||
2589 | +avr32_pass_by_reference (CUMULATIVE_ARGS * cum ATTRIBUTE_UNUSED, | ||
2590 | + enum machine_mode mode ATTRIBUTE_UNUSED, | ||
2591 | + tree type, bool named ATTRIBUTE_UNUSED) | ||
2592 | +{ | ||
2593 | + return (type && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)); | ||
2594 | +} | ||
2595 | + | ||
2596 | +static int | ||
2597 | +avr32_arg_partial_bytes (CUMULATIVE_ARGS * pcum ATTRIBUTE_UNUSED, | ||
2598 | + enum machine_mode mode ATTRIBUTE_UNUSED, | ||
2599 | + tree type ATTRIBUTE_UNUSED, | ||
2600 | + bool named ATTRIBUTE_UNUSED) | ||
2601 | +{ | ||
2602 | + return 0; | ||
2603 | +} | ||
2604 | + | ||
2605 | + | ||
2606 | +struct gcc_target targetm = TARGET_INITIALIZER; | ||
2607 | + | ||
2608 | +/* | ||
2609 | + Table used to convert from register number in the assembler instructions and | ||
2610 | + the register numbers used in gcc. | ||
2611 | +*/ | ||
2612 | +const int avr32_function_arg_reglist[] = | ||
2613 | +{ | ||
2614 | + INTERNAL_REGNUM (12), | ||
2615 | + INTERNAL_REGNUM (11), | ||
2616 | + INTERNAL_REGNUM (10), | ||
2617 | + INTERNAL_REGNUM (9), | ||
2618 | + INTERNAL_REGNUM (8) | ||
2619 | +}; | ||
2620 | + | ||
2621 | +rtx avr32_compare_op0 = NULL_RTX; | ||
2622 | +rtx avr32_compare_op1 = NULL_RTX; | ||
2623 | +rtx avr32_compare_operator = NULL_RTX; | ||
2624 | +rtx avr32_acc_cache = NULL_RTX; | ||
2625 | + | ||
2626 | +/* | ||
2627 | + Returns nonzero if it is allowed to store a value of mode mode in hard | ||
2628 | + register number regno. | ||
2629 | +*/ | ||
2630 | +int | ||
2631 | +avr32_hard_regno_mode_ok (int regnr, enum machine_mode mode) | ||
2632 | +{ | ||
2633 | + /* We allow only float modes in the fp-registers */ | ||
2634 | + if (regnr >= FIRST_FP_REGNUM | ||
2635 | + && regnr <= LAST_FP_REGNUM && GET_MODE_CLASS (mode) != MODE_FLOAT) | ||
2636 | + { | ||
2637 | + return 0; | ||
2638 | + } | ||
2639 | + | ||
2640 | + switch (mode) | ||
2641 | + { | ||
2642 | + case DImode: /* long long */ | ||
2643 | + case DFmode: /* double */ | ||
2644 | + case SCmode: /* __complex__ float */ | ||
2645 | + case CSImode: /* __complex__ int */ | ||
2646 | + if (regnr < 4) | ||
2647 | + { /* long long int not supported in r12, sp, lr | ||
2648 | + or pc. */ | ||
2649 | + return 0; | ||
2650 | + } | ||
2651 | + else | ||
2652 | + { | ||
2653 | + if (regnr % 2) /* long long int has to be refered in even | ||
2654 | + registers. */ | ||
2655 | + return 0; | ||
2656 | + else | ||
2657 | + return 1; | ||
2658 | + } | ||
2659 | + case CDImode: /* __complex__ long long */ | ||
2660 | + case DCmode: /* __complex__ double */ | ||
2661 | + case TImode: /* 16 bytes */ | ||
2662 | + if (regnr < 7) | ||
2663 | + return 0; | ||
2664 | + else if (regnr % 2) | ||
2665 | + return 0; | ||
2666 | + else | ||
2667 | + return 1; | ||
2668 | + default: | ||
2669 | + return 1; | ||
2670 | + } | ||
2671 | +} | ||
2672 | + | ||
2673 | + | ||
2674 | +int | ||
2675 | +avr32_rnd_operands (rtx add, rtx shift) | ||
2676 | +{ | ||
2677 | + if (GET_CODE (shift) == CONST_INT && | ||
2678 | + GET_CODE (add) == CONST_INT && INTVAL (shift) > 0) | ||
2679 | + { | ||
2680 | + if ((1 << (INTVAL (shift) - 1)) == INTVAL (add)) | ||
2681 | + return TRUE; | ||
2682 | + } | ||
2683 | + | ||
2684 | + return FALSE; | ||
2685 | +} | ||
2686 | + | ||
2687 | + | ||
2688 | + | ||
2689 | +int | ||
2690 | +avr32_const_ok_for_constraint_p (HOST_WIDE_INT value, char c, const char *str) | ||
2691 | +{ | ||
2692 | + switch (c) | ||
2693 | + { | ||
2694 | + case 'K': | ||
2695 | + case 'I': | ||
2696 | + { | ||
2697 | + HOST_WIDE_INT min_value = 0, max_value = 0; | ||
2698 | + char size_str[3]; | ||
2699 | + int const_size; | ||
2700 | + | ||
2701 | + size_str[0] = str[2]; | ||
2702 | + size_str[1] = str[3]; | ||
2703 | + size_str[2] = '\0'; | ||
2704 | + const_size = atoi (size_str); | ||
2705 | + | ||
2706 | + if (toupper (str[1]) == 'U') | ||
2707 | + { | ||
2708 | + min_value = 0; | ||
2709 | + max_value = (1 << const_size) - 1; | ||
2710 | + } | ||
2711 | + else if (toupper (str[1]) == 'S') | ||
2712 | + { | ||
2713 | + min_value = -(1 << (const_size - 1)); | ||
2714 | + max_value = (1 << (const_size - 1)) - 1; | ||
2715 | + } | ||
2716 | + | ||
2717 | + if (c == 'I') | ||
2718 | + { | ||
2719 | + value = -value; | ||
2720 | + } | ||
2721 | + | ||
2722 | + if (value >= min_value && value <= max_value) | ||
2723 | + { | ||
2724 | + return 1; | ||
2725 | + } | ||
2726 | + break; | ||
2727 | + } | ||
2728 | + case 'M': | ||
2729 | + return avr32_mask_upper_bits_operand (GEN_INT (value), VOIDmode); | ||
2730 | + } | ||
2731 | + | ||
2732 | + return 0; | ||
2733 | +} | ||
2734 | + | ||
2735 | + | ||
2736 | +/*Compute mask of which floating-point registers needs saving upon | ||
2737 | + entry to this function*/ | ||
2738 | +static unsigned long | ||
2739 | +avr32_compute_save_fp_reg_mask (void) | ||
2740 | +{ | ||
2741 | + unsigned long func_type = avr32_current_func_type (); | ||
2742 | + unsigned int save_reg_mask = 0; | ||
2743 | + unsigned int reg; | ||
2744 | + unsigned int max_reg = 7; | ||
2745 | + int save_all_call_used_regs = FALSE; | ||
2746 | + | ||
2747 | + /* This only applies for hardware floating-point implementation. */ | ||
2748 | + if (!TARGET_HARD_FLOAT) | ||
2749 | + return 0; | ||
2750 | + | ||
2751 | + if (IS_INTERRUPT (func_type)) | ||
2752 | + { | ||
2753 | + | ||
2754 | + /* Interrupt functions must not corrupt any registers, even call | ||
2755 | + clobbered ones. If this is a leaf function we can just examine the | ||
2756 | + registers used by the RTL, but otherwise we have to assume that | ||
2757 | + whatever function is called might clobber anything, and so we have | ||
2758 | + to save all the call-clobbered registers as well. */ | ||
2759 | + max_reg = 13; | ||
2760 | + save_all_call_used_regs = !current_function_is_leaf; | ||
2761 | + } | ||
2762 | + | ||
2763 | + /* All used registers used must be saved */ | ||
2764 | + for (reg = 0; reg <= max_reg; reg++) | ||
2765 | + if (regs_ever_live[INTERNAL_FP_REGNUM (reg)] | ||
2766 | + || (save_all_call_used_regs | ||
2767 | + && call_used_regs[INTERNAL_FP_REGNUM (reg)])) | ||
2768 | + save_reg_mask |= (1 << reg); | ||
2769 | + | ||
2770 | + return save_reg_mask; | ||
2771 | +} | ||
2772 | + | ||
2773 | +/*Compute mask of registers which needs saving upon function entry */ | ||
2774 | +static unsigned long | ||
2775 | +avr32_compute_save_reg_mask (int push) | ||
2776 | +{ | ||
2777 | + unsigned long func_type; | ||
2778 | + unsigned int save_reg_mask = 0; | ||
2779 | + unsigned int reg; | ||
2780 | + | ||
2781 | + func_type = avr32_current_func_type (); | ||
2782 | + | ||
2783 | + if (IS_INTERRUPT (func_type)) | ||
2784 | + { | ||
2785 | + unsigned int max_reg = 12; | ||
2786 | + | ||
2787 | + | ||
2788 | + /* Get the banking scheme for the interrupt */ | ||
2789 | + switch (func_type) | ||
2790 | + { | ||
2791 | + case AVR32_FT_ISR_FULL: | ||
2792 | + max_reg = 0; | ||
2793 | + break; | ||
2794 | + case AVR32_FT_ISR_HALF: | ||
2795 | + max_reg = 7; | ||
2796 | + break; | ||
2797 | + case AVR32_FT_ISR_NONE: | ||
2798 | + max_reg = 12; | ||
2799 | + break; | ||
2800 | + } | ||
2801 | + | ||
2802 | + /* Interrupt functions must not corrupt any registers, even call | ||
2803 | + clobbered ones. If this is a leaf function we can just examine the | ||
2804 | + registers used by the RTL, but otherwise we have to assume that | ||
2805 | + whatever function is called might clobber anything, and so we have | ||
2806 | + to save all the call-clobbered registers as well. */ | ||
2807 | + | ||
2808 | + /* Need not push the registers r8-r12 for AVR32A architectures, as this | ||
2809 | + is automatially done in hardware. We also do not have any shadow | ||
2810 | + registers. */ | ||
2811 | + if (avr32_arch->uarch_type == UARCH_TYPE_AVR32A) | ||
2812 | + { | ||
2813 | + max_reg = 7; | ||
2814 | + func_type = AVR32_FT_ISR_NONE; | ||
2815 | + } | ||
2816 | + | ||
2817 | + /* All registers which are used and is not shadowed must be saved */ | ||
2818 | + for (reg = 0; reg <= max_reg; reg++) | ||
2819 | + if (regs_ever_live[INTERNAL_REGNUM (reg)] | ||
2820 | + || (!current_function_is_leaf | ||
2821 | + && call_used_regs[INTERNAL_REGNUM (reg)])) | ||
2822 | + save_reg_mask |= (1 << reg); | ||
2823 | + | ||
2824 | + /* Check LR */ | ||
2825 | + if ((regs_ever_live[LR_REGNUM] || !current_function_is_leaf || frame_pointer_needed) && (func_type == AVR32_FT_ISR_NONE) /* Only | ||
2826 | + non-shadowed | ||
2827 | + register | ||
2828 | + models | ||
2829 | + */ ) | ||
2830 | + save_reg_mask |= (1 << ASM_REGNUM (LR_REGNUM)); | ||
2831 | + | ||
2832 | + /* Make sure that the GOT register is pushed. */ | ||
2833 | + if (max_reg >= ASM_REGNUM (PIC_OFFSET_TABLE_REGNUM) | ||
2834 | + && current_function_uses_pic_offset_table) | ||
2835 | + save_reg_mask |= (1 << ASM_REGNUM (PIC_OFFSET_TABLE_REGNUM)); | ||
2836 | + | ||
2837 | + } | ||
2838 | + else | ||
2839 | + { | ||
2840 | + int use_pushm = optimize_size; | ||
2841 | + | ||
2842 | + /* In the normal case we only need to save those registers which are | ||
2843 | + call saved and which are used by this function. */ | ||
2844 | + for (reg = 0; reg <= 7; reg++) | ||
2845 | + if (regs_ever_live[INTERNAL_REGNUM (reg)] | ||
2846 | + && !call_used_regs[INTERNAL_REGNUM (reg)]) | ||
2847 | + save_reg_mask |= (1 << reg); | ||
2848 | + | ||
2849 | + /* Make sure that the GOT register is pushed. */ | ||
2850 | + if (current_function_uses_pic_offset_table) | ||
2851 | + save_reg_mask |= (1 << ASM_REGNUM (PIC_OFFSET_TABLE_REGNUM)); | ||
2852 | + | ||
2853 | + | ||
2854 | + /* If we optimize for size and do not have anonymous arguments: use | ||
2855 | + popm/pushm always */ | ||
2856 | + if (use_pushm) | ||
2857 | + { | ||
2858 | + if ((save_reg_mask & (1 << 0)) | ||
2859 | + || (save_reg_mask & (1 << 1)) | ||
2860 | + || (save_reg_mask & (1 << 2)) || (save_reg_mask & (1 << 3))) | ||
2861 | + save_reg_mask |= 0xf; | ||
2862 | + | ||
2863 | + if ((save_reg_mask & (1 << 4)) | ||
2864 | + || (save_reg_mask & (1 << 5)) | ||
2865 | + || (save_reg_mask & (1 << 6)) || (save_reg_mask & (1 << 7))) | ||
2866 | + save_reg_mask |= 0xf0; | ||
2867 | + | ||
2868 | + if ((save_reg_mask & (1 << 8)) || (save_reg_mask & (1 << 9))) | ||
2869 | + save_reg_mask |= 0x300; | ||
2870 | + } | ||
2871 | + | ||
2872 | + | ||
2873 | + /* Check LR */ | ||
2874 | + if ((regs_ever_live[LR_REGNUM] || !current_function_is_leaf || | ||
2875 | + (optimize_size && save_reg_mask) || frame_pointer_needed)) | ||
2876 | + { | ||
2877 | + if (push) | ||
2878 | + { | ||
2879 | + /* Push/Pop LR */ | ||
2880 | + save_reg_mask |= (1 << ASM_REGNUM (LR_REGNUM)); | ||
2881 | + } | ||
2882 | + else | ||
2883 | + { | ||
2884 | + /* Pop PC */ | ||
2885 | + save_reg_mask |= (1 << ASM_REGNUM (PC_REGNUM)); | ||
2886 | + } | ||
2887 | + } | ||
2888 | + } | ||
2889 | + | ||
2890 | + return save_reg_mask; | ||
2891 | +} | ||
2892 | + | ||
2893 | +/*Compute total size in bytes of all saved registers */ | ||
2894 | +static int | ||
2895 | +avr32_get_reg_mask_size (int reg_mask) | ||
2896 | +{ | ||
2897 | + int reg, size; | ||
2898 | + size = 0; | ||
2899 | + | ||
2900 | + for (reg = 0; reg <= 15; reg++) | ||
2901 | + if (reg_mask & (1 << reg)) | ||
2902 | + size += 4; | ||
2903 | + | ||
2904 | + return size; | ||
2905 | +} | ||
2906 | + | ||
2907 | +/*Get a register from one of the registers which are saved onto the stack | ||
2908 | + upon function entry */ | ||
2909 | + | ||
2910 | +static int | ||
2911 | +avr32_get_saved_reg (int save_reg_mask) | ||
2912 | +{ | ||
2913 | + unsigned int reg; | ||
2914 | + | ||
2915 | + /* Find the first register which is saved in the saved_reg_mask */ | ||
2916 | + for (reg = 0; reg <= 15; reg++) | ||
2917 | + if (save_reg_mask & (1 << reg)) | ||
2918 | + return reg; | ||
2919 | + | ||
2920 | + return -1; | ||
2921 | +} | ||
2922 | + | ||
2923 | +/* Return 1 if it is possible to return using a single instruction. */ | ||
2924 | +int | ||
2925 | +avr32_use_return_insn (int iscond) | ||
2926 | +{ | ||
2927 | + unsigned int func_type = avr32_current_func_type (); | ||
2928 | + unsigned long saved_int_regs; | ||
2929 | + unsigned long saved_fp_regs; | ||
2930 | + | ||
2931 | + /* Never use a return instruction before reload has run. */ | ||
2932 | + if (!reload_completed) | ||
2933 | + return 0; | ||
2934 | + | ||
2935 | + /* Must adjust the stack for vararg functions. */ | ||
2936 | + if (current_function_args_info.uses_anonymous_args) | ||
2937 | + return 0; | ||
2938 | + | ||
2939 | + /* If there a stack adjstment. */ | ||
2940 | + if (get_frame_size ()) | ||
2941 | + return 0; | ||
2942 | + | ||
2943 | + saved_int_regs = avr32_compute_save_reg_mask (TRUE); | ||
2944 | + saved_fp_regs = avr32_compute_save_fp_reg_mask (); | ||
2945 | + | ||
2946 | + /* Functions which have saved fp-regs on the stack can not be performed in | ||
2947 | + one instruction */ | ||
2948 | + if (saved_fp_regs) | ||
2949 | + return 0; | ||
2950 | + | ||
2951 | + /* Conditional returns can not be performed in one instruction if we need | ||
2952 | + to restore registers from the stack */ | ||
2953 | + if (iscond && saved_int_regs) | ||
2954 | + return 0; | ||
2955 | + | ||
2956 | + /* Conditional return can not be used for interrupt handlers. */ | ||
2957 | + if (iscond && IS_INTERRUPT (func_type)) | ||
2958 | + return 0; | ||
2959 | + | ||
2960 | + /* For interrupt handlers which needs to pop registers */ | ||
2961 | + if (saved_int_regs && IS_INTERRUPT (func_type)) | ||
2962 | + return 0; | ||
2963 | + | ||
2964 | + | ||
2965 | + /* If there are saved registers but the LR isn't saved, then we need two | ||
2966 | + instructions for the return. */ | ||
2967 | + if (saved_int_regs && !(saved_int_regs & (1 << ASM_REGNUM (LR_REGNUM)))) | ||
2968 | + return 0; | ||
2969 | + | ||
2970 | + | ||
2971 | + return 1; | ||
2972 | +} | ||
2973 | + | ||
2974 | + | ||
2975 | +/*Generate some function prologue info in the assembly file*/ | ||
2976 | + | ||
2977 | +void | ||
2978 | +avr32_target_asm_function_prologue (FILE * f, HOST_WIDE_INT frame_size) | ||
2979 | +{ | ||
2980 | + if (IS_NAKED (avr32_current_func_type ())) | ||
2981 | + fprintf (f, | ||
2982 | + "\t# Function is naked: Prologue and epilogue provided by programmer\n"); | ||
2983 | + | ||
2984 | + if (IS_INTERRUPT (avr32_current_func_type ())) | ||
2985 | + { | ||
2986 | + switch (avr32_current_func_type ()) | ||
2987 | + { | ||
2988 | + case AVR32_FT_ISR_FULL: | ||
2989 | + fprintf (f, | ||
2990 | + "\t# Interrupt Function: Fully shadowed register file\n"); | ||
2991 | + break; | ||
2992 | + case AVR32_FT_ISR_HALF: | ||
2993 | + fprintf (f, | ||
2994 | + "\t# Interrupt Function: Half shadowed register file\n"); | ||
2995 | + break; | ||
2996 | + default: | ||
2997 | + case AVR32_FT_ISR_NONE: | ||
2998 | + fprintf (f, "\t# Interrupt Function: No shadowed register file\n"); | ||
2999 | + break; | ||
3000 | + } | ||
3001 | + } | ||
3002 | + | ||
3003 | + | ||
3004 | + fprintf (f, "\t# args = %i, frame = %li, pretend = %i\n", | ||
3005 | + current_function_args_size, frame_size, | ||
3006 | + current_function_pretend_args_size); | ||
3007 | + | ||
3008 | + fprintf (f, "\t# frame_needed = %i, leaf_function = %i\n", | ||
3009 | + frame_pointer_needed, current_function_is_leaf); | ||
3010 | + | ||
3011 | + fprintf (f, "\t# uses_anonymous_args = %i\n", | ||
3012 | + current_function_args_info.uses_anonymous_args); | ||
3013 | +} | ||
3014 | + | ||
3015 | + | ||
3016 | +/* Generate and emit an insn that we will recognize as a pushm or stm. | ||
3017 | + Unfortunately, since this insn does not reflect very well the actual | ||
3018 | + semantics of the operation, we need to annotate the insn for the benefit | ||
3019 | + of DWARF2 frame unwind information. */ | ||
3020 | + | ||
3021 | +int avr32_convert_to_reglist16 (int reglist8_vect); | ||
3022 | + | ||
3023 | +static rtx | ||
3024 | +emit_multi_reg_push (int reglist, int usePUSHM) | ||
3025 | +{ | ||
3026 | + rtx insn; | ||
3027 | + rtx dwarf; | ||
3028 | + rtx tmp; | ||
3029 | + rtx reg; | ||
3030 | + int i; | ||
3031 | + int nr_regs; | ||
3032 | + int index = 0; | ||
3033 | + | ||
3034 | + if (usePUSHM) | ||
3035 | + { | ||
3036 | + insn = emit_insn (gen_pushm (gen_rtx_CONST_INT (SImode, reglist))); | ||
3037 | + reglist = avr32_convert_to_reglist16 (reglist); | ||
3038 | + } | ||
3039 | + else | ||
3040 | + { | ||
3041 | + insn = emit_insn (gen_stm (stack_pointer_rtx, | ||
3042 | + gen_rtx_CONST_INT (SImode, reglist), | ||
3043 | + gen_rtx_CONST_INT (SImode, 1))); | ||
3044 | + } | ||
3045 | + | ||
3046 | + nr_regs = avr32_get_reg_mask_size (reglist) / 4; | ||
3047 | + dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (nr_regs + 1)); | ||
3048 | + | ||
3049 | + for (i = 15; i >= 0; i--) | ||
3050 | + { | ||
3051 | + if (reglist & (1 << i)) | ||
3052 | + { | ||
3053 | + reg = gen_rtx_REG (SImode, INTERNAL_REGNUM (i)); | ||
3054 | + tmp = gen_rtx_SET (VOIDmode, | ||
3055 | + gen_rtx_MEM (SImode, | ||
3056 | + plus_constant (stack_pointer_rtx, | ||
3057 | + 4 * index)), reg); | ||
3058 | + RTX_FRAME_RELATED_P (tmp) = 1; | ||
3059 | + XVECEXP (dwarf, 0, 1 + index++) = tmp; | ||
3060 | + } | ||
3061 | + } | ||
3062 | + | ||
3063 | + tmp = gen_rtx_SET (SImode, | ||
3064 | + stack_pointer_rtx, | ||
3065 | + gen_rtx_PLUS (SImode, | ||
3066 | + stack_pointer_rtx, | ||
3067 | + GEN_INT (-4 * nr_regs))); | ||
3068 | + RTX_FRAME_RELATED_P (tmp) = 1; | ||
3069 | + XVECEXP (dwarf, 0, 0) = tmp; | ||
3070 | + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf, | ||
3071 | + REG_NOTES (insn)); | ||
3072 | + return insn; | ||
3073 | +} | ||
3074 | + | ||
3075 | + | ||
3076 | +static rtx | ||
3077 | +emit_multi_fp_reg_push (int reglist) | ||
3078 | +{ | ||
3079 | + rtx insn; | ||
3080 | + rtx dwarf; | ||
3081 | + rtx tmp; | ||
3082 | + rtx reg; | ||
3083 | + int i; | ||
3084 | + int nr_regs; | ||
3085 | + int index = 0; | ||
3086 | + | ||
3087 | + insn = emit_insn (gen_stm_fp (stack_pointer_rtx, | ||
3088 | + gen_rtx_CONST_INT (SImode, reglist), | ||
3089 | + gen_rtx_CONST_INT (SImode, 1))); | ||
3090 | + | ||
3091 | + nr_regs = avr32_get_reg_mask_size (reglist) / 4; | ||
3092 | + dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (nr_regs + 1)); | ||
3093 | + | ||
3094 | + for (i = 15; i >= 0; i--) | ||
3095 | + { | ||
3096 | + if (reglist & (1 << i)) | ||
3097 | + { | ||
3098 | + reg = gen_rtx_REG (SImode, INTERNAL_FP_REGNUM (i)); | ||
3099 | + tmp = gen_rtx_SET (VOIDmode, | ||
3100 | + gen_rtx_MEM (SImode, | ||
3101 | + plus_constant (stack_pointer_rtx, | ||
3102 | + 4 * index)), reg); | ||
3103 | + RTX_FRAME_RELATED_P (tmp) = 1; | ||
3104 | + XVECEXP (dwarf, 0, 1 + index++) = tmp; | ||
3105 | + } | ||
3106 | + } | ||
3107 | + | ||
3108 | + tmp = gen_rtx_SET (SImode, | ||
3109 | + stack_pointer_rtx, | ||
3110 | + gen_rtx_PLUS (SImode, | ||
3111 | + stack_pointer_rtx, | ||
3112 | + GEN_INT (-4 * nr_regs))); | ||
3113 | + RTX_FRAME_RELATED_P (tmp) = 1; | ||
3114 | + XVECEXP (dwarf, 0, 0) = tmp; | ||
3115 | + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, dwarf, | ||
3116 | + REG_NOTES (insn)); | ||
3117 | + return insn; | ||
3118 | +} | ||
3119 | + | ||
3120 | +rtx | ||
3121 | +avr32_gen_load_multiple (rtx * regs, int count, rtx from, | ||
3122 | + int write_back, int in_struct_p, int scalar_p) | ||
3123 | +{ | ||
3124 | + | ||
3125 | + rtx result; | ||
3126 | + int i = 0, j; | ||
3127 | + | ||
3128 | + result = | ||
3129 | + gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count + (write_back ? 1 : 0))); | ||
3130 | + | ||
3131 | + if (write_back) | ||
3132 | + { | ||
3133 | + XVECEXP (result, 0, 0) | ||
3134 | + = gen_rtx_SET (GET_MODE (from), from, | ||
3135 | + plus_constant (from, count * 4)); | ||
3136 | + i = 1; | ||
3137 | + count++; | ||
3138 | + } | ||
3139 | + | ||
3140 | + | ||
3141 | + for (j = 0; i < count; i++, j++) | ||
3142 | + { | ||
3143 | + rtx unspec; | ||
3144 | + rtx mem = gen_rtx_MEM (SImode, plus_constant (from, j * 4)); | ||
3145 | + MEM_IN_STRUCT_P (mem) = in_struct_p; | ||
3146 | + MEM_SCALAR_P (mem) = scalar_p; | ||
3147 | + unspec = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, mem), UNSPEC_LDM); | ||
3148 | + XVECEXP (result, 0, i) = gen_rtx_SET (VOIDmode, regs[j], unspec); | ||
3149 | + } | ||
3150 | + | ||
3151 | + return result; | ||
3152 | +} | ||
3153 | + | ||
3154 | + | ||
3155 | +rtx | ||
3156 | +avr32_gen_store_multiple (rtx * regs, int count, rtx to, | ||
3157 | + int in_struct_p, int scalar_p) | ||
3158 | +{ | ||
3159 | + rtx result; | ||
3160 | + int i = 0, j; | ||
3161 | + | ||
3162 | + result = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (count)); | ||
3163 | + | ||
3164 | + for (j = 0; i < count; i++, j++) | ||
3165 | + { | ||
3166 | + rtx mem = gen_rtx_MEM (SImode, plus_constant (to, j * 4)); | ||
3167 | + MEM_IN_STRUCT_P (mem) = in_struct_p; | ||
3168 | + MEM_SCALAR_P (mem) = scalar_p; | ||
3169 | + XVECEXP (result, 0, i) | ||
3170 | + = gen_rtx_SET (VOIDmode, mem, | ||
3171 | + gen_rtx_UNSPEC (VOIDmode, | ||
3172 | + gen_rtvec (1, regs[j]), | ||
3173 | + UNSPEC_STORE_MULTIPLE)); | ||
3174 | + } | ||
3175 | + | ||
3176 | + return result; | ||
3177 | +} | ||
3178 | + | ||
3179 | + | ||
3180 | +/* Move a block of memory if it is word aligned or we support unaligned | ||
3181 | + word memory accesses. The size must be maximum 64 bytes. */ | ||
3182 | + | ||
3183 | +int | ||
3184 | +avr32_gen_movmemsi (rtx * operands) | ||
3185 | +{ | ||
3186 | + HOST_WIDE_INT bytes_to_go; | ||
3187 | + rtx src, dst; | ||
3188 | + rtx st_src, st_dst; | ||
3189 | + int ptr_offset = 0; | ||
3190 | + int block_size; | ||
3191 | + int dst_in_struct_p, src_in_struct_p; | ||
3192 | + int dst_scalar_p, src_scalar_p; | ||
3193 | + int unaligned; | ||
3194 | + | ||
3195 | + if (GET_CODE (operands[2]) != CONST_INT | ||
3196 | + || GET_CODE (operands[3]) != CONST_INT | ||
3197 | + || INTVAL (operands[2]) > 64 | ||
3198 | + || ((INTVAL (operands[3]) & 3) && !TARGET_UNALIGNED_WORD)) | ||
3199 | + return 0; | ||
3200 | + | ||
3201 | + unaligned = (INTVAL (operands[3]) & 3) != 0; | ||
3202 | + | ||
3203 | + block_size = 4; | ||
3204 | + | ||
3205 | + st_dst = XEXP (operands[0], 0); | ||
3206 | + st_src = XEXP (operands[1], 0); | ||
3207 | + | ||
3208 | + dst_in_struct_p = MEM_IN_STRUCT_P (operands[0]); | ||
3209 | + dst_scalar_p = MEM_SCALAR_P (operands[0]); | ||
3210 | + src_in_struct_p = MEM_IN_STRUCT_P (operands[1]); | ||
3211 | + src_scalar_p = MEM_SCALAR_P (operands[1]); | ||
3212 | + | ||
3213 | + dst = copy_to_mode_reg (SImode, st_dst); | ||
3214 | + src = copy_to_mode_reg (SImode, st_src); | ||
3215 | + | ||
3216 | + bytes_to_go = INTVAL (operands[2]); | ||
3217 | + | ||
3218 | + while (bytes_to_go) | ||
3219 | + { | ||
3220 | + enum machine_mode move_mode; | ||
3221 | + /* Seems to be a problem with reloads for the movti pattern so this is | ||
3222 | + disabled until that problem is resolved */ | ||
3223 | + | ||
3224 | + /* if ( bytes_to_go >= GET_MODE_SIZE(TImode) ) move_mode = TImode; else | ||
3225 | + */ | ||
3226 | + if ((bytes_to_go >= GET_MODE_SIZE (DImode)) && !unaligned) | ||
3227 | + move_mode = DImode; | ||
3228 | + else if (bytes_to_go >= GET_MODE_SIZE (SImode)) | ||
3229 | + move_mode = SImode; | ||
3230 | + else | ||
3231 | + move_mode = QImode; | ||
3232 | + | ||
3233 | + { | ||
3234 | + rtx dst_mem = gen_rtx_MEM (move_mode, | ||
3235 | + gen_rtx_PLUS (SImode, dst, | ||
3236 | + GEN_INT (ptr_offset))); | ||
3237 | + rtx src_mem = gen_rtx_MEM (move_mode, | ||
3238 | + gen_rtx_PLUS (SImode, src, | ||
3239 | + GEN_INT (ptr_offset))); | ||
3240 | + ptr_offset += GET_MODE_SIZE (move_mode); | ||
3241 | + bytes_to_go -= GET_MODE_SIZE (move_mode); | ||
3242 | + | ||
3243 | + MEM_IN_STRUCT_P (dst_mem) = dst_in_struct_p; | ||
3244 | + MEM_SCALAR_P (dst_mem) = dst_scalar_p; | ||
3245 | + | ||
3246 | + MEM_IN_STRUCT_P (src_mem) = src_in_struct_p; | ||
3247 | + MEM_SCALAR_P (src_mem) = src_scalar_p; | ||
3248 | + emit_move_insn (dst_mem, src_mem); | ||
3249 | + | ||
3250 | + } | ||
3251 | + } | ||
3252 | + | ||
3253 | + return 1; | ||
3254 | +} | ||
3255 | + | ||
3256 | + | ||
3257 | + | ||
3258 | +/*Expand the prologue instruction*/ | ||
3259 | +void | ||
3260 | +avr32_expand_prologue (void) | ||
3261 | +{ | ||
3262 | + rtx insn, dwarf; | ||
3263 | + unsigned long saved_reg_mask, saved_fp_reg_mask; | ||
3264 | + int reglist8 = 0; | ||
3265 | + | ||
3266 | + /* Naked functions does not have a prologue */ | ||
3267 | + if (IS_NAKED (avr32_current_func_type ())) | ||
3268 | + return; | ||
3269 | + | ||
3270 | + saved_reg_mask = avr32_compute_save_reg_mask (TRUE); | ||
3271 | + | ||
3272 | + if (saved_reg_mask) | ||
3273 | + { | ||
3274 | + /* Must push used registers */ | ||
3275 | + | ||
3276 | + /* Should we use POPM or LDM? */ | ||
3277 | + int usePUSHM = TRUE; | ||
3278 | + reglist8 = 0; | ||
3279 | + if (((saved_reg_mask & (1 << 0)) || | ||
3280 | + (saved_reg_mask & (1 << 1)) || | ||
3281 | + (saved_reg_mask & (1 << 2)) || (saved_reg_mask & (1 << 3)))) | ||
3282 | + { | ||
3283 | + /* One of R0-R3 should at least be pushed */ | ||
3284 | + if (((saved_reg_mask & (1 << 0)) && | ||
3285 | + (saved_reg_mask & (1 << 1)) && | ||
3286 | + (saved_reg_mask & (1 << 2)) && (saved_reg_mask & (1 << 3)))) | ||
3287 | + { | ||
3288 | + /* All should be pushed */ | ||
3289 | + reglist8 |= 0x01; | ||
3290 | + } | ||
3291 | + else | ||
3292 | + { | ||
3293 | + usePUSHM = FALSE; | ||
3294 | + } | ||
3295 | + } | ||
3296 | + | ||
3297 | + if (((saved_reg_mask & (1 << 4)) || | ||
3298 | + (saved_reg_mask & (1 << 5)) || | ||
3299 | + (saved_reg_mask & (1 << 6)) || (saved_reg_mask & (1 << 7)))) | ||
3300 | + { | ||
3301 | + /* One of R4-R7 should at least be pushed */ | ||
3302 | + if (((saved_reg_mask & (1 << 4)) && | ||
3303 | + (saved_reg_mask & (1 << 5)) && | ||
3304 | + (saved_reg_mask & (1 << 6)) && (saved_reg_mask & (1 << 7)))) | ||
3305 | + { | ||
3306 | + if (usePUSHM) | ||
3307 | + /* All should be pushed */ | ||
3308 | + reglist8 |= 0x02; | ||
3309 | + } | ||
3310 | + else | ||
3311 | + { | ||
3312 | + usePUSHM = FALSE; | ||
3313 | + } | ||
3314 | + } | ||
3315 | + | ||
3316 | + if (((saved_reg_mask & (1 << 8)) || (saved_reg_mask & (1 << 9)))) | ||
3317 | + { | ||
3318 | + /* One of R8-R9 should at least be pushed */ | ||
3319 | + if (((saved_reg_mask & (1 << 8)) && (saved_reg_mask & (1 << 9)))) | ||
3320 | + { | ||
3321 | + if (usePUSHM) | ||
3322 | + /* All should be pushed */ | ||
3323 | + reglist8 |= 0x04; | ||
3324 | + } | ||
3325 | + else | ||
3326 | + { | ||
3327 | + usePUSHM = FALSE; | ||
3328 | + } | ||
3329 | + } | ||
3330 | + | ||
3331 | + if (saved_reg_mask & (1 << 10)) | ||
3332 | + reglist8 |= 0x08; | ||
3333 | + | ||
3334 | + if (saved_reg_mask & (1 << 11)) | ||
3335 | + reglist8 |= 0x10; | ||
3336 | + | ||
3337 | + if (saved_reg_mask & (1 << 12)) | ||
3338 | + reglist8 |= 0x20; | ||
3339 | + | ||
3340 | + if (saved_reg_mask & (1 << ASM_REGNUM (LR_REGNUM))) | ||
3341 | + { | ||
3342 | + /* Push LR */ | ||
3343 | + reglist8 |= 0x40; | ||
3344 | + } | ||
3345 | + | ||
3346 | + if (usePUSHM) | ||
3347 | + { | ||
3348 | + insn = emit_multi_reg_push (reglist8, TRUE); | ||
3349 | + } | ||
3350 | + else | ||
3351 | + { | ||
3352 | + insn = emit_multi_reg_push (saved_reg_mask, FALSE); | ||
3353 | + } | ||
3354 | + RTX_FRAME_RELATED_P (insn) = 1; | ||
3355 | + | ||
3356 | + /* Prevent this instruction from being scheduled after any other | ||
3357 | + instructions. */ | ||
3358 | + emit_insn (gen_blockage ()); | ||
3359 | + } | ||
3360 | + | ||
3361 | + saved_fp_reg_mask = avr32_compute_save_fp_reg_mask (); | ||
3362 | + if (saved_fp_reg_mask) | ||
3363 | + { | ||
3364 | + insn = emit_multi_fp_reg_push (saved_fp_reg_mask); | ||
3365 | + RTX_FRAME_RELATED_P (insn) = 1; | ||
3366 | + | ||
3367 | + /* Prevent this instruction from being scheduled after any other | ||
3368 | + instructions. */ | ||
3369 | + emit_insn (gen_blockage ()); | ||
3370 | + } | ||
3371 | + | ||
3372 | + /* Set frame pointer */ | ||
3373 | + if (frame_pointer_needed) | ||
3374 | + { | ||
3375 | + insn = emit_move_insn (frame_pointer_rtx, stack_pointer_rtx); | ||
3376 | + RTX_FRAME_RELATED_P (insn) = 1; | ||
3377 | + } | ||
3378 | + | ||
3379 | + if (get_frame_size () > 0) | ||
3380 | + { | ||
3381 | + if (avr32_const_ok_for_constraint_p (get_frame_size (), 'K', "Ks21")) | ||
3382 | + { | ||
3383 | + insn = emit_insn (gen_rtx_SET (SImode, | ||
3384 | + stack_pointer_rtx, | ||
3385 | + gen_rtx_PLUS (SImode, | ||
3386 | + stack_pointer_rtx, | ||
3387 | + gen_rtx_CONST_INT | ||
3388 | + (SImode, | ||
3389 | + -get_frame_size | ||
3390 | + ())))); | ||
3391 | + RTX_FRAME_RELATED_P (insn) = 1; | ||
3392 | + } | ||
3393 | + else | ||
3394 | + { | ||
3395 | + /* Immediate is larger than k21 We must either check if we can use | ||
3396 | + one of the pushed reegisters as temporary storage or we must | ||
3397 | + make us a temp register by pushing a register to the stack. */ | ||
3398 | + rtx temp_reg, const_pool_entry, insn; | ||
3399 | + if (saved_reg_mask) | ||
3400 | + { | ||
3401 | + temp_reg = | ||
3402 | + gen_rtx_REG (SImode, | ||
3403 | + INTERNAL_REGNUM (avr32_get_saved_reg | ||
3404 | + (saved_reg_mask))); | ||
3405 | + } | ||
3406 | + else | ||
3407 | + { | ||
3408 | + temp_reg = gen_rtx_REG (SImode, INTERNAL_REGNUM (7)); | ||
3409 | + emit_move_insn (gen_rtx_MEM | ||
3410 | + (SImode, | ||
3411 | + gen_rtx_PRE_DEC (SImode, stack_pointer_rtx)), | ||
3412 | + temp_reg); | ||
3413 | + } | ||
3414 | + | ||
3415 | + const_pool_entry = | ||
3416 | + force_const_mem (SImode, | ||
3417 | + gen_rtx_CONST_INT (SImode, get_frame_size ())); | ||
3418 | + emit_move_insn (temp_reg, const_pool_entry); | ||
3419 | + | ||
3420 | + insn = emit_insn (gen_rtx_SET (SImode, | ||
3421 | + stack_pointer_rtx, | ||
3422 | + gen_rtx_MINUS (SImode, | ||
3423 | + stack_pointer_rtx, | ||
3424 | + temp_reg))); | ||
3425 | + | ||
3426 | + dwarf = gen_rtx_SET (VOIDmode, stack_pointer_rtx, | ||
3427 | + gen_rtx_PLUS (SImode, stack_pointer_rtx, | ||
3428 | + GEN_INT (-get_frame_size ()))); | ||
3429 | + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, | ||
3430 | + dwarf, REG_NOTES (insn)); | ||
3431 | + RTX_FRAME_RELATED_P (insn) = 1; | ||
3432 | + | ||
3433 | + if (!saved_reg_mask) | ||
3434 | + { | ||
3435 | + insn = | ||
3436 | + emit_move_insn (temp_reg, | ||
3437 | + gen_rtx_MEM (SImode, | ||
3438 | + gen_rtx_POST_INC (SImode, | ||
3439 | + gen_rtx_REG | ||
3440 | + (SImode, | ||
3441 | + 13)))); | ||
3442 | + } | ||
3443 | + | ||
3444 | + /* Mark the temp register as dead */ | ||
3445 | + REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_DEAD, temp_reg, | ||
3446 | + REG_NOTES (insn)); | ||
3447 | + | ||
3448 | + | ||
3449 | + } | ||
3450 | + | ||
3451 | + /* Prevent the the stack adjustment to be scheduled after any | ||
3452 | + instructions using the frame pointer. */ | ||
3453 | + emit_insn (gen_blockage ()); | ||
3454 | + } | ||
3455 | + | ||
3456 | + /* Load GOT */ | ||
3457 | + if (flag_pic) | ||
3458 | + { | ||
3459 | + avr32_load_pic_register (); | ||
3460 | + | ||
3461 | + /* gcc does not know that load or call instructions might use the pic | ||
3462 | + register so it might schedule these instructions before the loading | ||
3463 | + of the pic register. To avoid this emit a barrier for now. TODO! | ||
3464 | + Find out a better way to let gcc know which instructions might use | ||
3465 | + the pic register. */ | ||
3466 | + emit_insn (gen_blockage ()); | ||
3467 | + } | ||
3468 | + return; | ||
3469 | +} | ||
3470 | + | ||
3471 | +void | ||
3472 | +avr32_set_return_address (rtx source) | ||
3473 | +{ | ||
3474 | + rtx addr; | ||
3475 | + unsigned long saved_regs; | ||
3476 | + | ||
3477 | + saved_regs = avr32_compute_save_reg_mask (TRUE); | ||
3478 | + | ||
3479 | + if (!(saved_regs & (1 << ASM_REGNUM (LR_REGNUM)))) | ||
3480 | + emit_move_insn (gen_rtx_REG (Pmode, LR_REGNUM), source); | ||
3481 | + else | ||
3482 | + { | ||
3483 | + if (frame_pointer_needed) | ||
3484 | + addr = gen_rtx_REG (Pmode, FRAME_POINTER_REGNUM); | ||
3485 | + else | ||
3486 | + /* FIXME: Need to use scratch register if frame is large */ | ||
3487 | + addr = plus_constant (stack_pointer_rtx, get_frame_size ()); | ||
3488 | + | ||
3489 | + emit_move_insn (gen_rtx_MEM (Pmode, addr), source); | ||
3490 | + } | ||
3491 | +} | ||
3492 | + | ||
3493 | + | ||
3494 | + | ||
3495 | +/* Return the length of INSN. LENGTH is the initial length computed by | ||
3496 | + attributes in the machine-description file. */ | ||
3497 | + | ||
3498 | +int | ||
3499 | +avr32_adjust_insn_length (rtx insn ATTRIBUTE_UNUSED, | ||
3500 | + int length ATTRIBUTE_UNUSED) | ||
3501 | +{ | ||
3502 | + return length; | ||
3503 | +} | ||
3504 | + | ||
3505 | +void | ||
3506 | +avr32_output_return_instruction (int single_ret_inst ATTRIBUTE_UNUSED, | ||
3507 | + int iscond ATTRIBUTE_UNUSED, | ||
3508 | + rtx cond ATTRIBUTE_UNUSED, rtx r12_imm) | ||
3509 | +{ | ||
3510 | + | ||
3511 | + unsigned long saved_reg_mask, saved_fp_reg_mask; | ||
3512 | + int insert_ret = TRUE; | ||
3513 | + int reglist8 = 0; | ||
3514 | + int stack_adjustment = get_frame_size (); | ||
3515 | + unsigned int func_type = avr32_current_func_type (); | ||
3516 | + FILE *f = asm_out_file; | ||
3517 | + | ||
3518 | + /* Naked functions does not have an epilogue */ | ||
3519 | + if (IS_NAKED (func_type)) | ||
3520 | + return; | ||
3521 | + | ||
3522 | + saved_fp_reg_mask = avr32_compute_save_fp_reg_mask (); | ||
3523 | + | ||
3524 | + saved_reg_mask = avr32_compute_save_reg_mask (FALSE); | ||
3525 | + | ||
3526 | + /* Reset frame pointer */ | ||
3527 | + if (stack_adjustment > 0) | ||
3528 | + { | ||
3529 | + if (avr32_const_ok_for_constraint_p (stack_adjustment, 'I', "Is21")) | ||
3530 | + { | ||
3531 | + fprintf (f, "\tsub sp, %i # Reset Frame Pointer\n", | ||
3532 | + -stack_adjustment); | ||
3533 | + } | ||
3534 | + else | ||
3535 | + { | ||
3536 | + /* TODO! Is it safe to use r8 as scratch?? */ | ||
3537 | + fprintf (f, "\tmov r8, lo(%i) # Reset Frame Pointer\n", | ||
3538 | + -stack_adjustment); | ||
3539 | + fprintf (f, "\torh r8, hi(%i) # Reset Frame Pointer\n", | ||
3540 | + -stack_adjustment); | ||
3541 | + fprintf (f, "\tadd sp,r8 # Reset Frame Pointer\n"); | ||
3542 | + } | ||
3543 | + } | ||
3544 | + | ||
3545 | + if (saved_fp_reg_mask) | ||
3546 | + { | ||
3547 | + char reglist[64]; /* 64 bytes should be enough... */ | ||
3548 | + avr32_make_fp_reglist_w (saved_fp_reg_mask, (char *) reglist); | ||
3549 | + fprintf (f, "\tldcm.w\tcp0, sp++, %s\n", reglist); | ||
3550 | + if (saved_fp_reg_mask & ~0xff) | ||
3551 | + { | ||
3552 | + saved_fp_reg_mask &= ~0xff; | ||
3553 | + avr32_make_fp_reglist_d (saved_fp_reg_mask, (char *) reglist); | ||
3554 | + fprintf (f, "\tldcm.d\tcp0, sp++, %s\n", reglist); | ||
3555 | + } | ||
3556 | + } | ||
3557 | + | ||
3558 | + if (saved_reg_mask) | ||
3559 | + { | ||
3560 | + /* Must pop used registers */ | ||
3561 | + | ||
3562 | + /* Should we use POPM or LDM? */ | ||
3563 | + int usePOPM = TRUE; | ||
3564 | + if (((saved_reg_mask & (1 << 0)) || | ||
3565 | + (saved_reg_mask & (1 << 1)) || | ||
3566 | + (saved_reg_mask & (1 << 2)) || (saved_reg_mask & (1 << 3)))) | ||
3567 | + { | ||
3568 | + /* One of R0-R3 should at least be popped */ | ||
3569 | + if (((saved_reg_mask & (1 << 0)) && | ||
3570 | + (saved_reg_mask & (1 << 1)) && | ||
3571 | + (saved_reg_mask & (1 << 2)) && (saved_reg_mask & (1 << 3)))) | ||
3572 | + { | ||
3573 | + /* All should be popped */ | ||
3574 | + reglist8 |= 0x01; | ||
3575 | + } | ||
3576 | + else | ||
3577 | + { | ||
3578 | + usePOPM = FALSE; | ||
3579 | + } | ||
3580 | + } | ||
3581 | + | ||
3582 | + if (((saved_reg_mask & (1 << 4)) || | ||
3583 | + (saved_reg_mask & (1 << 5)) || | ||
3584 | + (saved_reg_mask & (1 << 6)) || (saved_reg_mask & (1 << 7)))) | ||
3585 | + { | ||
3586 | + /* One of R0-R3 should at least be popped */ | ||
3587 | + if (((saved_reg_mask & (1 << 4)) && | ||
3588 | + (saved_reg_mask & (1 << 5)) && | ||
3589 | + (saved_reg_mask & (1 << 6)) && (saved_reg_mask & (1 << 7)))) | ||
3590 | + { | ||
3591 | + if (usePOPM) | ||
3592 | + /* All should be popped */ | ||
3593 | + reglist8 |= 0x02; | ||
3594 | + } | ||
3595 | + else | ||
3596 | + { | ||
3597 | + usePOPM = FALSE; | ||
3598 | + } | ||
3599 | + } | ||
3600 | + | ||
3601 | + if (((saved_reg_mask & (1 << 8)) || (saved_reg_mask & (1 << 9)))) | ||
3602 | + { | ||
3603 | + /* One of R8-R9 should at least be pushed */ | ||
3604 | + if (((saved_reg_mask & (1 << 8)) && (saved_reg_mask & (1 << 9)))) | ||
3605 | + { | ||
3606 | + if (usePOPM) | ||
3607 | + /* All should be pushed */ | ||
3608 | + reglist8 |= 0x04; | ||
3609 | + } | ||
3610 | + else | ||
3611 | + { | ||
3612 | + usePOPM = FALSE; | ||
3613 | + } | ||
3614 | + } | ||
3615 | + | ||
3616 | + if (saved_reg_mask & (1 << 10)) | ||
3617 | + reglist8 |= 0x08; | ||
3618 | + | ||
3619 | + if (saved_reg_mask & (1 << 11)) | ||
3620 | + reglist8 |= 0x10; | ||
3621 | + | ||
3622 | + if (saved_reg_mask & (1 << 12)) | ||
3623 | + reglist8 |= 0x20; | ||
3624 | + | ||
3625 | + if (saved_reg_mask & (1 << ASM_REGNUM (LR_REGNUM))) | ||
3626 | + /* Pop LR */ | ||
3627 | + reglist8 |= 0x40; | ||
3628 | + | ||
3629 | + if (saved_reg_mask & (1 << ASM_REGNUM (PC_REGNUM))) | ||
3630 | + /* Pop LR into PC. */ | ||
3631 | + reglist8 |= 0x80; | ||
3632 | + | ||
3633 | + if (usePOPM) | ||
3634 | + { | ||
3635 | + char reglist[64]; /* 64 bytes should be enough... */ | ||
3636 | + avr32_make_reglist8 (reglist8, (char *) reglist); | ||
3637 | + | ||
3638 | + if (reglist8 & 0x80) | ||
3639 | + /* This instruction is also a return */ | ||
3640 | + insert_ret = FALSE; | ||
3641 | + | ||
3642 | + if (r12_imm && !insert_ret) | ||
3643 | + fprintf (f, "\tpopm %s, r12=%li\n", reglist, INTVAL (r12_imm)); | ||
3644 | + else | ||
3645 | + fprintf (f, "\tpopm %s\n", reglist); | ||
3646 | + | ||
3647 | + } | ||
3648 | + else | ||
3649 | + { | ||
3650 | + char reglist[64]; /* 64 bytes should be enough... */ | ||
3651 | + avr32_make_reglist16 (saved_reg_mask, (char *) reglist); | ||
3652 | + if (saved_reg_mask & (1 << ASM_REGNUM (PC_REGNUM))) | ||
3653 | + /* This instruction is also a return */ | ||
3654 | + insert_ret = FALSE; | ||
3655 | + | ||
3656 | + if (r12_imm && !insert_ret) | ||
3657 | + fprintf (f, "\tldm sp++, %s, r12=%li\n", reglist, | ||
3658 | + INTVAL (r12_imm)); | ||
3659 | + else | ||
3660 | + fprintf (f, "\tldm sp++, %s\n", reglist); | ||
3661 | + | ||
3662 | + } | ||
3663 | + | ||
3664 | + } | ||
3665 | + | ||
3666 | + if (IS_INTERRUPT (func_type)) | ||
3667 | + { | ||
3668 | + fprintf (f, "\trete\n"); | ||
3669 | + } | ||
3670 | + else if (insert_ret) | ||
3671 | + { | ||
3672 | + if (r12_imm) | ||
3673 | + fprintf (f, "\tretal %li\n", INTVAL (r12_imm)); | ||
3674 | + else | ||
3675 | + fprintf (f, "\tretal r12\n"); | ||
3676 | + } | ||
3677 | +} | ||
3678 | + | ||
3679 | +/* Function for converting a fp-register mask to a | ||
3680 | + reglistCPD8 register list string. */ | ||
3681 | +void | ||
3682 | +avr32_make_fp_reglist_d (int reglist_mask, char *reglist_string) | ||
3683 | +{ | ||
3684 | + int i; | ||
3685 | + | ||
3686 | + /* Make sure reglist_string is empty */ | ||
3687 | + reglist_string[0] = '\0'; | ||
3688 | + | ||
3689 | + for (i = 0; i < NUM_FP_REGS; i += 2) | ||
3690 | + { | ||
3691 | + if (reglist_mask & (1 << i)) | ||
3692 | + { | ||
3693 | + strlen (reglist_string) ? | ||
3694 | + sprintf (reglist_string, "%s, %s-%s", reglist_string, | ||
3695 | + reg_names[INTERNAL_FP_REGNUM (i)], | ||
3696 | + reg_names[INTERNAL_FP_REGNUM (i + 1)]) : | ||
3697 | + sprintf (reglist_string, "%s-%s", | ||
3698 | + reg_names[INTERNAL_FP_REGNUM (i)], | ||
3699 | + reg_names[INTERNAL_FP_REGNUM (i + 1)]); | ||
3700 | + } | ||
3701 | + } | ||
3702 | +} | ||
3703 | + | ||
3704 | +/* Function for converting a fp-register mask to a | ||
3705 | + reglistCP8 register list string. */ | ||
3706 | +void | ||
3707 | +avr32_make_fp_reglist_w (int reglist_mask, char *reglist_string) | ||
3708 | +{ | ||
3709 | + int i; | ||
3710 | + | ||
3711 | + /* Make sure reglist_string is empty */ | ||
3712 | + reglist_string[0] = '\0'; | ||
3713 | + | ||
3714 | + for (i = 0; i < NUM_FP_REGS; ++i) | ||
3715 | + { | ||
3716 | + if (reglist_mask & (1 << i)) | ||
3717 | + { | ||
3718 | + strlen (reglist_string) ? | ||
3719 | + sprintf (reglist_string, "%s, %s", reglist_string, | ||
3720 | + reg_names[INTERNAL_FP_REGNUM (i)]) : | ||
3721 | + sprintf (reglist_string, "%s", reg_names[INTERNAL_FP_REGNUM (i)]); | ||
3722 | + } | ||
3723 | + } | ||
3724 | +} | ||
3725 | + | ||
3726 | +void | ||
3727 | +avr32_make_reglist16 (int reglist16_vect, char *reglist16_string) | ||
3728 | +{ | ||
3729 | + int i; | ||
3730 | + | ||
3731 | + /* Make sure reglist16_string is empty */ | ||
3732 | + reglist16_string[0] = '\0'; | ||
3733 | + | ||
3734 | + for (i = 0; i < 16; ++i) | ||
3735 | + { | ||
3736 | + if (reglist16_vect & (1 << i)) | ||
3737 | + { | ||
3738 | + strlen (reglist16_string) ? | ||
3739 | + sprintf (reglist16_string, "%s, %s", reglist16_string, | ||
3740 | + reg_names[INTERNAL_REGNUM (i)]) : | ||
3741 | + sprintf (reglist16_string, "%s", reg_names[INTERNAL_REGNUM (i)]); | ||
3742 | + } | ||
3743 | + } | ||
3744 | +} | ||
3745 | + | ||
3746 | +int | ||
3747 | +avr32_convert_to_reglist16 (int reglist8_vect) | ||
3748 | +{ | ||
3749 | + int reglist16_vect = 0; | ||
3750 | + if (reglist8_vect & 0x1) | ||
3751 | + reglist16_vect |= 0xF; | ||
3752 | + if (reglist8_vect & 0x2) | ||
3753 | + reglist16_vect |= 0xF0; | ||
3754 | + if (reglist8_vect & 0x4) | ||
3755 | + reglist16_vect |= 0x300; | ||
3756 | + if (reglist8_vect & 0x8) | ||
3757 | + reglist16_vect |= 0x400; | ||
3758 | + if (reglist8_vect & 0x10) | ||
3759 | + reglist16_vect |= 0x800; | ||
3760 | + if (reglist8_vect & 0x20) | ||
3761 | + reglist16_vect |= 0x1000; | ||
3762 | + if (reglist8_vect & 0x40) | ||
3763 | + reglist16_vect |= 0x4000; | ||
3764 | + if (reglist8_vect & 0x80) | ||
3765 | + reglist16_vect |= 0x8000; | ||
3766 | + | ||
3767 | + return reglist16_vect; | ||
3768 | +} | ||
3769 | + | ||
3770 | +void | ||
3771 | +avr32_make_reglist8 (int reglist8_vect, char *reglist8_string) | ||
3772 | +{ | ||
3773 | + /* Make sure reglist8_string is empty */ | ||
3774 | + reglist8_string[0] = '\0'; | ||
3775 | + | ||
3776 | + if (reglist8_vect & 0x1) | ||
3777 | + sprintf (reglist8_string, "r0-r3"); | ||
3778 | + if (reglist8_vect & 0x2) | ||
3779 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, r4-r7", | ||
3780 | + reglist8_string) : | ||
3781 | + sprintf (reglist8_string, "r4-r7"); | ||
3782 | + if (reglist8_vect & 0x4) | ||
3783 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, r8-r9", | ||
3784 | + reglist8_string) : | ||
3785 | + sprintf (reglist8_string, "r8-r9"); | ||
3786 | + if (reglist8_vect & 0x8) | ||
3787 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, r10", | ||
3788 | + reglist8_string) : | ||
3789 | + sprintf (reglist8_string, "r10"); | ||
3790 | + if (reglist8_vect & 0x10) | ||
3791 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, r11", | ||
3792 | + reglist8_string) : | ||
3793 | + sprintf (reglist8_string, "r11"); | ||
3794 | + if (reglist8_vect & 0x20) | ||
3795 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, r12", | ||
3796 | + reglist8_string) : | ||
3797 | + sprintf (reglist8_string, "r12"); | ||
3798 | + if (reglist8_vect & 0x40) | ||
3799 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, lr", | ||
3800 | + reglist8_string) : | ||
3801 | + sprintf (reglist8_string, "lr"); | ||
3802 | + if (reglist8_vect & 0x80) | ||
3803 | + strlen (reglist8_string) ? sprintf (reglist8_string, "%s, pc", | ||
3804 | + reglist8_string) : | ||
3805 | + sprintf (reglist8_string, "pc"); | ||
3806 | +} | ||
3807 | + | ||
3808 | +int | ||
3809 | +avr32_eh_return_data_regno (int n) | ||
3810 | +{ | ||
3811 | + if (n >= 0 && n <= 3) | ||
3812 | + return 8 + n; | ||
3813 | + else | ||
3814 | + return INVALID_REGNUM; | ||
3815 | +} | ||
3816 | + | ||
3817 | +/* Compute the distance from register FROM to register TO. | ||
3818 | + These can be the arg pointer, the frame pointer or | ||
3819 | + the stack pointer. | ||
3820 | + Typical stack layout looks like this: | ||
3821 | + | ||
3822 | + old stack pointer -> | | | ||
3823 | + ---- | ||
3824 | + | | \ | ||
3825 | + | | saved arguments for | ||
3826 | + | | vararg functions | ||
3827 | + arg_pointer -> | | / | ||
3828 | + -- | ||
3829 | + | | \ | ||
3830 | + | | call saved | ||
3831 | + | | registers | ||
3832 | + | | / | ||
3833 | + frame ptr -> -- | ||
3834 | + | | \ | ||
3835 | + | | local | ||
3836 | + | | variables | ||
3837 | + stack ptr --> | | / | ||
3838 | + -- | ||
3839 | + | | \ | ||
3840 | + | | outgoing | ||
3841 | + | | arguments | ||
3842 | + | | / | ||
3843 | + -- | ||
3844 | + | ||
3845 | + For a given funciton some or all of these stack compomnents | ||
3846 | + may not be needed, giving rise to the possibility of | ||
3847 | + eliminating some of the registers. | ||
3848 | + | ||
3849 | + The values returned by this function must reflect the behaviour | ||
3850 | + of avr32_expand_prologue() and avr32_compute_save_reg_mask(). | ||
3851 | + | ||
3852 | + The sign of the number returned reflects the direction of stack | ||
3853 | + growth, so the values are positive for all eliminations except | ||
3854 | + from the soft frame pointer to the hard frame pointer. */ | ||
3855 | + | ||
3856 | + | ||
3857 | +int | ||
3858 | +avr32_initial_elimination_offset (int from, int to) | ||
3859 | +{ | ||
3860 | + int i; | ||
3861 | + int call_saved_regs = 0; | ||
3862 | + unsigned long saved_reg_mask, saved_fp_reg_mask; | ||
3863 | + unsigned int local_vars = get_frame_size (); | ||
3864 | + | ||
3865 | + saved_reg_mask = avr32_compute_save_reg_mask (TRUE); | ||
3866 | + saved_fp_reg_mask = avr32_compute_save_fp_reg_mask (); | ||
3867 | + | ||
3868 | + for (i = 0; i < 16; ++i) | ||
3869 | + { | ||
3870 | + if (saved_reg_mask & (1 << i)) | ||
3871 | + call_saved_regs += 4; | ||
3872 | + } | ||
3873 | + | ||
3874 | + for (i = 0; i < NUM_FP_REGS; ++i) | ||
3875 | + { | ||
3876 | + if (saved_fp_reg_mask & (1 << i)) | ||
3877 | + call_saved_regs += 4; | ||
3878 | + } | ||
3879 | + | ||
3880 | + switch (from) | ||
3881 | + { | ||
3882 | + case ARG_POINTER_REGNUM: | ||
3883 | + switch (to) | ||
3884 | + { | ||
3885 | + case STACK_POINTER_REGNUM: | ||
3886 | + return call_saved_regs + local_vars; | ||
3887 | + case FRAME_POINTER_REGNUM: | ||
3888 | + return call_saved_regs; | ||
3889 | + default: | ||
3890 | + abort (); | ||
3891 | + } | ||
3892 | + case FRAME_POINTER_REGNUM: | ||
3893 | + switch (to) | ||
3894 | + { | ||
3895 | + case STACK_POINTER_REGNUM: | ||
3896 | + return local_vars; | ||
3897 | + default: | ||
3898 | + abort (); | ||
3899 | + } | ||
3900 | + default: | ||
3901 | + abort (); | ||
3902 | + } | ||
3903 | +} | ||
3904 | + | ||
3905 | + | ||
3906 | +/* | ||
3907 | + Returns a rtx used when passing the next argument to a function. | ||
3908 | + avr32_init_cumulative_args() and avr32_function_arg_advance() sets witch | ||
3909 | + register to use. | ||
3910 | +*/ | ||
3911 | +rtx | ||
3912 | +avr32_function_arg (CUMULATIVE_ARGS * cum, enum machine_mode mode, | ||
3913 | + tree type, int named) | ||
3914 | +{ | ||
3915 | + int index = -1; | ||
3916 | + | ||
3917 | + HOST_WIDE_INT arg_size, arg_rsize; | ||
3918 | + if (type) | ||
3919 | + { | ||
3920 | + arg_size = int_size_in_bytes (type); | ||
3921 | + } | ||
3922 | + else | ||
3923 | + { | ||
3924 | + arg_size = GET_MODE_SIZE (mode); | ||
3925 | + } | ||
3926 | + arg_rsize = PUSH_ROUNDING (arg_size); | ||
3927 | + | ||
3928 | + /* | ||
3929 | + The last time this macro is called, it is called with mode == VOIDmode, | ||
3930 | + and its result is passed to the call or call_value pattern as operands 2 | ||
3931 | + and 3 respectively. */ | ||
3932 | + if (mode == VOIDmode) | ||
3933 | + { | ||
3934 | + return gen_rtx_CONST_INT (SImode, 22); /* ToDo: fixme. */ | ||
3935 | + } | ||
3936 | + | ||
3937 | + if ((*targetm.calls.must_pass_in_stack) (mode, type) || !named) | ||
3938 | + { | ||
3939 | + return NULL_RTX; | ||
3940 | + } | ||
3941 | + | ||
3942 | + if (arg_rsize == 8) | ||
3943 | + { | ||
3944 | + /* use r11:r10 or r9:r8. */ | ||
3945 | + if (!(GET_USED_INDEX (cum, 1) || GET_USED_INDEX (cum, 2))) | ||
3946 | + index = 1; | ||
3947 | + else if (!(GET_USED_INDEX (cum, 3) || GET_USED_INDEX (cum, 4))) | ||
3948 | + index = 3; | ||
3949 | + else | ||
3950 | + index = -1; | ||
3951 | + } | ||
3952 | + else if (arg_rsize == 4) | ||
3953 | + { /* Use first available register */ | ||
3954 | + index = 0; | ||
3955 | + while (index <= LAST_CUM_REG_INDEX && GET_USED_INDEX (cum, index)) | ||
3956 | + index++; | ||
3957 | + if (index > LAST_CUM_REG_INDEX) | ||
3958 | + index = -1; | ||
3959 | + } | ||
3960 | + | ||
3961 | + SET_REG_INDEX (cum, index); | ||
3962 | + | ||
3963 | + if (GET_REG_INDEX (cum) >= 0) | ||
3964 | + return gen_rtx_REG (mode, | ||
3965 | + avr32_function_arg_reglist[GET_REG_INDEX (cum)]); | ||
3966 | + | ||
3967 | + return NULL_RTX; | ||
3968 | +} | ||
3969 | + | ||
3970 | +/* | ||
3971 | + Set the register used for passing the first argument to a function. | ||
3972 | +*/ | ||
3973 | +void | ||
3974 | +avr32_init_cumulative_args (CUMULATIVE_ARGS * cum, tree fntype, | ||
3975 | + rtx libname ATTRIBUTE_UNUSED, | ||
3976 | + tree fndecl ATTRIBUTE_UNUSED) | ||
3977 | +{ | ||
3978 | + /* Set all registers as unused. */ | ||
3979 | + SET_INDEXES_UNUSED (cum); | ||
3980 | + | ||
3981 | + /* Reset uses_anonymous_args */ | ||
3982 | + cum->uses_anonymous_args = 0; | ||
3983 | + | ||
3984 | + /* Reset size of stack pushed arguments */ | ||
3985 | + cum->stack_pushed_args_size = 0; | ||
3986 | + | ||
3987 | + /* If the function is returning a value passed in memory r12 is used as a | ||
3988 | + Return Value Pointer. */ | ||
3989 | + | ||
3990 | + if (fntype != 0 && avr32_return_in_memory (TREE_TYPE (fntype), fntype)) | ||
3991 | + { | ||
3992 | + SET_REG_INDEX (cum, 0); | ||
3993 | + SET_USED_INDEX (cum, GET_REG_INDEX (cum)); | ||
3994 | + } | ||
3995 | +} | ||
3996 | + | ||
3997 | +/* | ||
3998 | + Set register used for passing the next argument to a function. Only the | ||
3999 | + Scratch Registers are used. | ||
4000 | + | ||
4001 | + number name | ||
4002 | + 15 r15 PC | ||
4003 | + 14 r14 LR | ||
4004 | + 13 r13 _SP_________ | ||
4005 | + FIRST_CUM_REG 12 r12 _||_ | ||
4006 | + 10 r11 || | ||
4007 | + 11 r10 _||_ Scratch Registers | ||
4008 | + 8 r9 || | ||
4009 | + LAST_SCRATCH_REG 9 r8 _\/_________ | ||
4010 | + 6 r7 /\ | ||
4011 | + 7 r6 || | ||
4012 | + 4 r5 || | ||
4013 | + 5 r4 || | ||
4014 | + 2 r3 || | ||
4015 | + 3 r2 || | ||
4016 | + 0 r1 || | ||
4017 | + 1 r0 _||_________ | ||
4018 | + | ||
4019 | +*/ | ||
4020 | +void | ||
4021 | +avr32_function_arg_advance (CUMULATIVE_ARGS * cum, enum machine_mode mode, | ||
4022 | + tree type, int named ATTRIBUTE_UNUSED) | ||
4023 | +{ | ||
4024 | + HOST_WIDE_INT arg_size, arg_rsize; | ||
4025 | + | ||
4026 | + if (type) | ||
4027 | + { | ||
4028 | + arg_size = int_size_in_bytes (type); | ||
4029 | + } | ||
4030 | + else | ||
4031 | + { | ||
4032 | + arg_size = GET_MODE_SIZE (mode); | ||
4033 | + } | ||
4034 | + arg_rsize = PUSH_ROUNDING (arg_size); | ||
4035 | + | ||
4036 | + /* It the argument had to be passed in stack, no register is used. */ | ||
4037 | + if ((*targetm.calls.must_pass_in_stack) (mode, type)) | ||
4038 | + { | ||
4039 | + cum->stack_pushed_args_size += PUSH_ROUNDING (int_size_in_bytes (type)); | ||
4040 | + return; | ||
4041 | + } | ||
4042 | + | ||
4043 | + /* Mark the used registers as "used". */ | ||
4044 | + if (GET_REG_INDEX (cum) >= 0) | ||
4045 | + { | ||
4046 | + SET_USED_INDEX (cum, GET_REG_INDEX (cum)); | ||
4047 | + if (arg_rsize == 8) | ||
4048 | + { | ||
4049 | + SET_USED_INDEX (cum, (GET_REG_INDEX (cum) + 1)); | ||
4050 | + } | ||
4051 | + } | ||
4052 | + else | ||
4053 | + { | ||
4054 | + /* Had to use stack */ | ||
4055 | + cum->stack_pushed_args_size += arg_rsize; | ||
4056 | + } | ||
4057 | +} | ||
4058 | + | ||
4059 | +/* | ||
4060 | + Defines witch direction to go to find the next register to use if the | ||
4061 | + argument is larger then one register or for arguments shorter than an | ||
4062 | + int which is not promoted, such as the last part of structures with | ||
4063 | + size not a multiple of 4. */ | ||
4064 | +enum direction | ||
4065 | +avr32_function_arg_padding (enum machine_mode mode ATTRIBUTE_UNUSED, | ||
4066 | + tree type) | ||
4067 | +{ | ||
4068 | + /* Pad upward for all aggregates except byte and halfword sized aggregates | ||
4069 | + which can be passed in registers. */ | ||
4070 | + if (type | ||
4071 | + && AGGREGATE_TYPE_P (type) | ||
4072 | + && (int_size_in_bytes (type) != 1) | ||
4073 | + && !((int_size_in_bytes (type) == 2) | ||
4074 | + && TYPE_ALIGN_UNIT (type) >= 2) | ||
4075 | + && (int_size_in_bytes (type) & 0x3)) | ||
4076 | + { | ||
4077 | + return upward; | ||
4078 | + } | ||
4079 | + | ||
4080 | + return downward; | ||
4081 | +} | ||
4082 | + | ||
4083 | +/* | ||
4084 | + Return a rtx used for the return value from a function call. | ||
4085 | +*/ | ||
4086 | +rtx | ||
4087 | +avr32_function_value (tree type, tree func) | ||
4088 | +{ | ||
4089 | + if (avr32_return_in_memory (type, func)) | ||
4090 | + return NULL_RTX; | ||
4091 | + | ||
4092 | + if (int_size_in_bytes (type) <= 4) | ||
4093 | + if (avr32_return_in_msb (type)) | ||
4094 | + /* Aggregates of size less than a word which does align the data in the | ||
4095 | + MSB must use SImode for r12. */ | ||
4096 | + return gen_rtx_REG (SImode, RET_REGISTER); | ||
4097 | + else | ||
4098 | + return gen_rtx_REG (TYPE_MODE (type), RET_REGISTER); | ||
4099 | + else if (int_size_in_bytes (type) <= 8) | ||
4100 | + return gen_rtx_REG (TYPE_MODE (type), INTERNAL_REGNUM (11)); | ||
4101 | + | ||
4102 | + return NULL_RTX; | ||
4103 | +} | ||
4104 | + | ||
4105 | +/* | ||
4106 | + Return a rtx used for the return value from a library function call. | ||
4107 | +*/ | ||
4108 | +rtx | ||
4109 | +avr32_libcall_value (enum machine_mode mode) | ||
4110 | +{ | ||
4111 | + | ||
4112 | + if (GET_MODE_SIZE (mode) <= 4) | ||
4113 | + return gen_rtx_REG (mode, RET_REGISTER); | ||
4114 | + else if (GET_MODE_SIZE (mode) <= 8) | ||
4115 | + return gen_rtx_REG (mode, INTERNAL_REGNUM (11)); | ||
4116 | + else | ||
4117 | + return NULL_RTX; | ||
4118 | +} | ||
4119 | + | ||
4120 | +/* Return TRUE if X references a SYMBOL_REF. */ | ||
4121 | +int | ||
4122 | +symbol_mentioned_p (rtx x) | ||
4123 | +{ | ||
4124 | + const char *fmt; | ||
4125 | + int i; | ||
4126 | + | ||
4127 | + if (GET_CODE (x) == SYMBOL_REF) | ||
4128 | + return 1; | ||
4129 | + | ||
4130 | + fmt = GET_RTX_FORMAT (GET_CODE (x)); | ||
4131 | + | ||
4132 | + for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) | ||
4133 | + { | ||
4134 | + if (fmt[i] == 'E') | ||
4135 | + { | ||
4136 | + int j; | ||
4137 | + | ||
4138 | + for (j = XVECLEN (x, i) - 1; j >= 0; j--) | ||
4139 | + if (symbol_mentioned_p (XVECEXP (x, i, j))) | ||
4140 | + return 1; | ||
4141 | + } | ||
4142 | + else if (fmt[i] == 'e' && symbol_mentioned_p (XEXP (x, i))) | ||
4143 | + return 1; | ||
4144 | + } | ||
4145 | + | ||
4146 | + return 0; | ||
4147 | +} | ||
4148 | + | ||
4149 | +/* Return TRUE if X references a LABEL_REF. */ | ||
4150 | +int | ||
4151 | +label_mentioned_p (rtx x) | ||
4152 | +{ | ||
4153 | + const char *fmt; | ||
4154 | + int i; | ||
4155 | + | ||
4156 | + if (GET_CODE (x) == LABEL_REF) | ||
4157 | + return 1; | ||
4158 | + | ||
4159 | + fmt = GET_RTX_FORMAT (GET_CODE (x)); | ||
4160 | + for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) | ||
4161 | + { | ||
4162 | + if (fmt[i] == 'E') | ||
4163 | + { | ||
4164 | + int j; | ||
4165 | + | ||
4166 | + for (j = XVECLEN (x, i) - 1; j >= 0; j--) | ||
4167 | + if (label_mentioned_p (XVECEXP (x, i, j))) | ||
4168 | + return 1; | ||
4169 | + } | ||
4170 | + else if (fmt[i] == 'e' && label_mentioned_p (XEXP (x, i))) | ||
4171 | + return 1; | ||
4172 | + } | ||
4173 | + | ||
4174 | + return 0; | ||
4175 | +} | ||
4176 | + | ||
4177 | + | ||
4178 | +int | ||
4179 | +avr32_legitimate_pic_operand_p (rtx x) | ||
4180 | +{ | ||
4181 | + | ||
4182 | + /* We can't have const, this must be broken down to a symbol. */ | ||
4183 | + if (GET_CODE (x) == CONST) | ||
4184 | + return FALSE; | ||
4185 | + | ||
4186 | + /* Can't access symbols or labels via the constant pool either */ | ||
4187 | + if ((GET_CODE (x) == SYMBOL_REF | ||
4188 | + && CONSTANT_POOL_ADDRESS_P (x) | ||
4189 | + && (symbol_mentioned_p (get_pool_constant (x)) | ||
4190 | + || label_mentioned_p (get_pool_constant (x))))) | ||
4191 | + return FALSE; | ||
4192 | + | ||
4193 | + return TRUE; | ||
4194 | +} | ||
4195 | + | ||
4196 | + | ||
4197 | +rtx | ||
4198 | +legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED, | ||
4199 | + rtx reg) | ||
4200 | +{ | ||
4201 | + | ||
4202 | + if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF) | ||
4203 | + { | ||
4204 | + int subregs = 0; | ||
4205 | + | ||
4206 | + if (reg == 0) | ||
4207 | + { | ||
4208 | + if (no_new_pseudos) | ||
4209 | + abort (); | ||
4210 | + else | ||
4211 | + reg = gen_reg_rtx (Pmode); | ||
4212 | + | ||
4213 | + subregs = 1; | ||
4214 | + } | ||
4215 | + | ||
4216 | + emit_move_insn (reg, orig); | ||
4217 | + | ||
4218 | + /* Only set current function as using pic offset table if flag_pic is | ||
4219 | + set. This is because this function is also used if | ||
4220 | + TARGET_HAS_ASM_ADDR_PSEUDOS is set. */ | ||
4221 | + if (flag_pic) | ||
4222 | + current_function_uses_pic_offset_table = 1; | ||
4223 | + | ||
4224 | + /* Put a REG_EQUAL note on this insn, so that it can be optimized by | ||
4225 | + loop. */ | ||
4226 | + return reg; | ||
4227 | + } | ||
4228 | + else if (GET_CODE (orig) == CONST) | ||
4229 | + { | ||
4230 | + rtx base, offset; | ||
4231 | + | ||
4232 | + if (flag_pic | ||
4233 | + && GET_CODE (XEXP (orig, 0)) == PLUS | ||
4234 | + && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx) | ||
4235 | + return orig; | ||
4236 | + | ||
4237 | + if (reg == 0) | ||
4238 | + { | ||
4239 | + if (no_new_pseudos) | ||
4240 | + abort (); | ||
4241 | + else | ||
4242 | + reg = gen_reg_rtx (Pmode); | ||
4243 | + } | ||
4244 | + | ||
4245 | + if (GET_CODE (XEXP (orig, 0)) == PLUS) | ||
4246 | + { | ||
4247 | + base = | ||
4248 | + legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg); | ||
4249 | + offset = | ||
4250 | + legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode, | ||
4251 | + base == reg ? 0 : reg); | ||
4252 | + } | ||
4253 | + else | ||
4254 | + abort (); | ||
4255 | + | ||
4256 | + if (GET_CODE (offset) == CONST_INT) | ||
4257 | + { | ||
4258 | + /* The base register doesn't really matter, we only want to test | ||
4259 | + the index for the appropriate mode. */ | ||
4260 | + if (!avr32_const_ok_for_constraint_p (INTVAL (offset), 'I', "Is21")) | ||
4261 | + { | ||
4262 | + if (!no_new_pseudos) | ||
4263 | + offset = force_reg (Pmode, offset); | ||
4264 | + else | ||
4265 | + abort (); | ||
4266 | + } | ||
4267 | + | ||
4268 | + if (GET_CODE (offset) == CONST_INT) | ||
4269 | + return plus_constant (base, INTVAL (offset)); | ||
4270 | + } | ||
4271 | + | ||
4272 | + return gen_rtx_PLUS (Pmode, base, offset); | ||
4273 | + } | ||
4274 | + | ||
4275 | + return orig; | ||
4276 | +} | ||
4277 | + | ||
4278 | +/* Generate code to load the PIC register. */ | ||
4279 | +void | ||
4280 | +avr32_load_pic_register (void) | ||
4281 | +{ | ||
4282 | + rtx l1, pic_tmp; | ||
4283 | + rtx global_offset_table; | ||
4284 | + | ||
4285 | + if ((current_function_uses_pic_offset_table == 0) || TARGET_NO_INIT_GOT) | ||
4286 | + return; | ||
4287 | + | ||
4288 | + if (!flag_pic) | ||
4289 | + abort (); | ||
4290 | + | ||
4291 | + l1 = gen_label_rtx (); | ||
4292 | + | ||
4293 | + global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_"); | ||
4294 | + pic_tmp = | ||
4295 | + gen_rtx_CONST (Pmode, | ||
4296 | + gen_rtx_MINUS (SImode, gen_rtx_LABEL_REF (Pmode, l1), | ||
4297 | + global_offset_table)); | ||
4298 | + emit_insn (gen_pic_load_addr | ||
4299 | + (pic_offset_table_rtx, force_const_mem (SImode, pic_tmp))); | ||
4300 | + emit_insn (gen_pic_compute_got_from_pc (pic_offset_table_rtx, l1)); | ||
4301 | + | ||
4302 | + /* Need to emit this whether or not we obey regdecls, since setjmp/longjmp | ||
4303 | + can cause life info to screw up. */ | ||
4304 | + emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx)); | ||
4305 | +} | ||
4306 | + | ||
4307 | + | ||
4308 | + | ||
4309 | +/* This hook should return true if values of type type are returned at the most | ||
4310 | + significant end of a register (in other words, if they are padded at the | ||
4311 | + least significant end). You can assume that type is returned in a register; | ||
4312 | + the caller is required to check this. Note that the register provided by | ||
4313 | + FUNCTION_VALUE must be able to hold the complete return value. For example, | ||
4314 | + if a 1-, 2- or 3-byte structure is returned at the most significant end of a | ||
4315 | + 4-byte register, FUNCTION_VALUE should provide an SImode rtx. */ | ||
4316 | +bool | ||
4317 | +avr32_return_in_msb (tree type ATTRIBUTE_UNUSED) | ||
4318 | +{ | ||
4319 | + /* if ( AGGREGATE_TYPE_P (type) ) if ((int_size_in_bytes(type) == 1) || | ||
4320 | + ((int_size_in_bytes(type) == 2) && TYPE_ALIGN_UNIT(type) >= 2)) return | ||
4321 | + false; else return true; */ | ||
4322 | + | ||
4323 | + return false; | ||
4324 | +} | ||
4325 | + | ||
4326 | + | ||
4327 | +/* | ||
4328 | + Returns one if a certain function value is going to be returned in memory | ||
4329 | + and zero if it is going to be returned in a register. | ||
4330 | + | ||
4331 | + BLKmode and all other modes that is larger than 64 bits are returned in | ||
4332 | + memory. | ||
4333 | +*/ | ||
4334 | +bool | ||
4335 | +avr32_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) | ||
4336 | +{ | ||
4337 | + if (TYPE_MODE (type) == VOIDmode) | ||
4338 | + return false; | ||
4339 | + | ||
4340 | + if (int_size_in_bytes (type) > (2 * UNITS_PER_WORD) | ||
4341 | + || int_size_in_bytes (type) == -1) | ||
4342 | + { | ||
4343 | + return true; | ||
4344 | + } | ||
4345 | + | ||
4346 | + /* If we have an aggregate then use the same mechanism as when checking if | ||
4347 | + it should be passed on the stack. */ | ||
4348 | + if (type | ||
4349 | + && AGGREGATE_TYPE_P (type) | ||
4350 | + && (*targetm.calls.must_pass_in_stack) (TYPE_MODE (type), type)) | ||
4351 | + return true; | ||
4352 | + | ||
4353 | + return false; | ||
4354 | +} | ||
4355 | + | ||
4356 | + | ||
4357 | +/* Output the constant part of the trampoline. | ||
4358 | + lddpc r0, pc[0x8:e] ; load static chain register | ||
4359 | + lddpc pc, pc[0x8:e] ; jump to subrutine | ||
4360 | + .long 0 ; Address to static chain, | ||
4361 | + ; filled in by avr32_initialize_trampoline() | ||
4362 | + .long 0 ; Address to subrutine, | ||
4363 | + ; filled in by avr32_initialize_trampoline() | ||
4364 | +*/ | ||
4365 | +void | ||
4366 | +avr32_trampoline_template (FILE * file) | ||
4367 | +{ | ||
4368 | + fprintf (file, "\tlddpc r0, pc[8]\n"); | ||
4369 | + fprintf (file, "\tlddpc pc, pc[8]\n"); | ||
4370 | + /* make room for the address of the static chain. */ | ||
4371 | + fprintf (file, "\t.long\t0\n"); | ||
4372 | + /* make room for the address to the subrutine. */ | ||
4373 | + fprintf (file, "\t.long\t0\n"); | ||
4374 | +} | ||
4375 | + | ||
4376 | + | ||
4377 | +/* | ||
4378 | + Initialize the variable parts of a trampoline. | ||
4379 | +*/ | ||
4380 | +void | ||
4381 | +avr32_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain) | ||
4382 | +{ | ||
4383 | + /* Store the address to the static chain. */ | ||
4384 | + emit_move_insn (gen_rtx_MEM | ||
4385 | + (SImode, plus_constant (addr, TRAMPOLINE_SIZE - 4)), | ||
4386 | + static_chain); | ||
4387 | + | ||
4388 | + /* Store the address to the function. */ | ||
4389 | + emit_move_insn (gen_rtx_MEM (SImode, plus_constant (addr, TRAMPOLINE_SIZE)), | ||
4390 | + fnaddr); | ||
4391 | + | ||
4392 | + emit_insn (gen_cache (gen_rtx_REG (SImode, 13), | ||
4393 | + gen_rtx_CONST_INT (SImode, | ||
4394 | + AVR32_CACHE_INVALIDATE_ICACHE))); | ||
4395 | +} | ||
4396 | + | ||
4397 | +/* Return nonzero if X is valid as an addressing register. */ | ||
4398 | +int | ||
4399 | +avr32_address_register_rtx_p (rtx x, int strict_p) | ||
4400 | +{ | ||
4401 | + int regno; | ||
4402 | + | ||
4403 | + if (GET_CODE (x) != REG) | ||
4404 | + return 0; | ||
4405 | + | ||
4406 | + regno = REGNO (x); | ||
4407 | + | ||
4408 | + if (strict_p) | ||
4409 | + return REGNO_OK_FOR_BASE_P (regno); | ||
4410 | + | ||
4411 | + return (regno <= LAST_REGNUM || regno >= FIRST_PSEUDO_REGISTER); | ||
4412 | +} | ||
4413 | + | ||
4414 | +/* Return nonzero if INDEX is valid for an address index operand. */ | ||
4415 | +int | ||
4416 | +avr32_legitimate_index_p (enum machine_mode mode, rtx index, int strict_p) | ||
4417 | +{ | ||
4418 | + enum rtx_code code = GET_CODE (index); | ||
4419 | + | ||
4420 | + if (mode == TImode) | ||
4421 | + return 0; | ||
4422 | + | ||
4423 | + /* Standard coprocessor addressing modes. */ | ||
4424 | + if (code == CONST_INT) | ||
4425 | + { | ||
4426 | + if (TARGET_HARD_FLOAT && GET_MODE_CLASS (mode) == MODE_FLOAT) | ||
4427 | + /* Coprocessor mem insns has a smaller reach than ordinary mem insns */ | ||
4428 | + return CONST_OK_FOR_CONSTRAINT_P (INTVAL (index), 'K', "Ku14"); | ||
4429 | + else | ||
4430 | + return CONST_OK_FOR_CONSTRAINT_P (INTVAL (index), 'K', "Ks16"); | ||
4431 | + } | ||
4432 | + | ||
4433 | + if (avr32_address_register_rtx_p (index, strict_p)) | ||
4434 | + return 1; | ||
4435 | + | ||
4436 | + if (code == MULT) | ||
4437 | + { | ||
4438 | + rtx xiop0 = XEXP (index, 0); | ||
4439 | + rtx xiop1 = XEXP (index, 1); | ||
4440 | + return ((avr32_address_register_rtx_p (xiop0, strict_p) | ||
4441 | + && power_of_two_operand (xiop1, SImode) | ||
4442 | + && (INTVAL (xiop1) <= 8)) | ||
4443 | + || (avr32_address_register_rtx_p (xiop1, strict_p) | ||
4444 | + && power_of_two_operand (xiop0, SImode) | ||
4445 | + && (INTVAL (xiop0) <= 8))); | ||
4446 | + } | ||
4447 | + else if (code == ASHIFT) | ||
4448 | + { | ||
4449 | + rtx op = XEXP (index, 1); | ||
4450 | + | ||
4451 | + return (avr32_address_register_rtx_p (XEXP (index, 0), strict_p) | ||
4452 | + && GET_CODE (op) == CONST_INT | ||
4453 | + && INTVAL (op) > 0 && INTVAL (op) <= 3); | ||
4454 | + } | ||
4455 | + | ||
4456 | + return 0; | ||
4457 | +} | ||
4458 | + | ||
4459 | +/* | ||
4460 | + Used in the GO_IF_LEGITIMATE_ADDRESS macro. Returns a nonzero value if | ||
4461 | + the RTX x is a legitimate memory address. | ||
4462 | + | ||
4463 | + Returns NO_REGS if the address is not legatime, GENERAL_REGS or ALL_REGS | ||
4464 | + if it is. | ||
4465 | +*/ | ||
4466 | + | ||
4467 | +/* Forward declaration*/ | ||
4468 | +int is_minipool_label (rtx label); | ||
4469 | + | ||
4470 | +int | ||
4471 | +avr32_legitimate_address (enum machine_mode mode ATTRIBUTE_UNUSED, | ||
4472 | + rtx x, int strict) | ||
4473 | +{ | ||
4474 | + | ||
4475 | + switch (GET_CODE (x)) | ||
4476 | + { | ||
4477 | + case REG: | ||
4478 | + return avr32_address_register_rtx_p (x, strict); | ||
4479 | + case CONST: | ||
4480 | + { | ||
4481 | + rtx label = avr32_find_symbol (x); | ||
4482 | + if (label | ||
4483 | + && | ||
4484 | + ( (CONSTANT_POOL_ADDRESS_P (label) | ||
4485 | + && !(flag_pic | ||
4486 | + && (symbol_mentioned_p (get_pool_constant (label)) | ||
4487 | + || label_mentioned_p (get_pool_constant(label))))) | ||
4488 | + /* TODO! Can this ever happen??? */ | ||
4489 | + || ((GET_CODE (label) == LABEL_REF) | ||
4490 | + && GET_CODE (XEXP (label, 0)) == CODE_LABEL | ||
4491 | + && is_minipool_label (XEXP (label, 0))))) | ||
4492 | + { | ||
4493 | + return TRUE; | ||
4494 | + } | ||
4495 | + } | ||
4496 | + break; | ||
4497 | + case LABEL_REF: | ||
4498 | + if (GET_CODE (XEXP (x, 0)) == CODE_LABEL | ||
4499 | + && is_minipool_label (XEXP (x, 0))) | ||
4500 | + { | ||
4501 | + return TRUE; | ||
4502 | + } | ||
4503 | + break; | ||
4504 | + case SYMBOL_REF: | ||
4505 | + { | ||
4506 | + if (CONSTANT_POOL_ADDRESS_P (x) | ||
4507 | + && !(flag_pic | ||
4508 | + && (symbol_mentioned_p (get_pool_constant (x)) | ||
4509 | + || label_mentioned_p (get_pool_constant (x))))) | ||
4510 | + return TRUE; | ||
4511 | + /* | ||
4512 | + A symbol_ref is only legal if it is a function. If all of them are | ||
4513 | + legal, a pseudo reg that is a constant will be replaced by a | ||
4514 | + symbol_ref and make illegale code. SYMBOL_REF_FLAG is set by | ||
4515 | + ENCODE_SECTION_INFO. */ | ||
4516 | + else if (SYMBOL_REF_RCALL_FUNCTION_P (x)) | ||
4517 | + return TRUE; | ||
4518 | + break; | ||
4519 | + } | ||
4520 | + case PRE_DEC: /* (pre_dec (...)) */ | ||
4521 | + case POST_INC: /* (post_inc (...)) */ | ||
4522 | + return avr32_address_register_rtx_p (XEXP (x, 0), strict); | ||
4523 | + case PLUS: /* (plus (...) (...)) */ | ||
4524 | + { | ||
4525 | + rtx xop0 = XEXP (x, 0); | ||
4526 | + rtx xop1 = XEXP (x, 1); | ||
4527 | + | ||
4528 | + return ((avr32_address_register_rtx_p (xop0, strict) | ||
4529 | + && avr32_legitimate_index_p (mode, xop1, strict)) | ||
4530 | + || (avr32_address_register_rtx_p (xop1, strict) | ||
4531 | + && avr32_legitimate_index_p (mode, xop0, strict))); | ||
4532 | + } | ||
4533 | + default: | ||
4534 | + break; | ||
4535 | + } | ||
4536 | + | ||
4537 | + return FALSE; | ||
4538 | +} | ||
4539 | + | ||
4540 | + | ||
4541 | +int | ||
4542 | +avr32_const_double_immediate (rtx value) | ||
4543 | +{ | ||
4544 | + HOST_WIDE_INT hi, lo; | ||
4545 | + | ||
4546 | + if (GET_CODE (value) != CONST_DOUBLE) | ||
4547 | + return FALSE; | ||
4548 | + | ||
4549 | + if (GET_MODE (value) == DImode) | ||
4550 | + { | ||
4551 | + hi = CONST_DOUBLE_HIGH (value); | ||
4552 | + lo = CONST_DOUBLE_LOW (value); | ||
4553 | + } | ||
4554 | + else | ||
4555 | + { | ||
4556 | + HOST_WIDE_INT target_float[2]; | ||
4557 | + hi = lo = 0; | ||
4558 | + real_to_target (target_float, CONST_DOUBLE_REAL_VALUE (value), | ||
4559 | + GET_MODE (value)); | ||
4560 | + lo = target_float[0]; | ||
4561 | + hi = target_float[1]; | ||
4562 | + } | ||
4563 | + if (avr32_const_ok_for_constraint_p (lo, 'K', "Ks21") | ||
4564 | + && ((GET_MODE (value) == SFmode) | ||
4565 | + || avr32_const_ok_for_constraint_p (hi, 'K', "Ks21"))) | ||
4566 | + { | ||
4567 | + return TRUE; | ||
4568 | + } | ||
4569 | + | ||
4570 | + return FALSE; | ||
4571 | +} | ||
4572 | + | ||
4573 | + | ||
4574 | +int | ||
4575 | +avr32_legitimate_constant_p (rtx x) | ||
4576 | +{ | ||
4577 | + switch (GET_CODE (x)) | ||
4578 | + { | ||
4579 | + case CONST_INT: | ||
4580 | + return avr32_const_ok_for_constraint_p (INTVAL (x), 'K', "Ks21"); | ||
4581 | + case CONST_DOUBLE: | ||
4582 | + if (GET_MODE (x) == SFmode | ||
4583 | + || GET_MODE (x) == DFmode || GET_MODE (x) == DImode) | ||
4584 | + return avr32_const_double_immediate (x); | ||
4585 | + else | ||
4586 | + return 0; | ||
4587 | + case LABEL_REF: | ||
4588 | + return flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS; | ||
4589 | + case SYMBOL_REF: | ||
4590 | + return flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS; | ||
4591 | + case CONST: | ||
4592 | + /* We must handle this one in the movsi expansion in order for gcc not | ||
4593 | + to put it in the constant pool. */ | ||
4594 | + return 0 /* flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS */ ; | ||
4595 | + case HIGH: | ||
4596 | + case CONST_VECTOR: | ||
4597 | + return 0; | ||
4598 | + default: | ||
4599 | + printf ("%s():\n", __FUNCTION__); | ||
4600 | + debug_rtx (x); | ||
4601 | + return 1; | ||
4602 | + } | ||
4603 | +} | ||
4604 | + | ||
4605 | + | ||
4606 | +/* Strip any special encoding from labels */ | ||
4607 | +const char * | ||
4608 | +avr32_strip_name_encoding (const char *name) | ||
4609 | +{ | ||
4610 | + const char *stripped = name; | ||
4611 | + | ||
4612 | + while (1) | ||
4613 | + { | ||
4614 | + switch (stripped[0]) | ||
4615 | + { | ||
4616 | + case '#': | ||
4617 | + stripped = strchr (name + 1, '#') + 1; | ||
4618 | + break; | ||
4619 | + case '*': | ||
4620 | + stripped = &stripped[1]; | ||
4621 | + break; | ||
4622 | + default: | ||
4623 | + return stripped; | ||
4624 | + } | ||
4625 | + } | ||
4626 | +} | ||
4627 | + | ||
4628 | + | ||
4629 | + | ||
4630 | +/* Do anything needed before RTL is emitted for each function. */ | ||
4631 | +static struct machine_function * | ||
4632 | +avr32_init_machine_status (void) | ||
4633 | +{ | ||
4634 | + struct machine_function *machine; | ||
4635 | + machine = | ||
4636 | + (machine_function *) ggc_alloc_cleared (sizeof (machine_function)); | ||
4637 | + | ||
4638 | +#if AVR32_FT_UNKNOWN != 0 | ||
4639 | + machine->func_type = AVR32_FT_UNKNOWN; | ||
4640 | +#endif | ||
4641 | + | ||
4642 | + machine->minipool_label_head = 0; | ||
4643 | + machine->minipool_label_tail = 0; | ||
4644 | + return machine; | ||
4645 | +} | ||
4646 | + | ||
4647 | +void | ||
4648 | +avr32_init_expanders (void) | ||
4649 | +{ | ||
4650 | + /* Arrange to initialize and mark the machine per-function status. */ | ||
4651 | + init_machine_status = avr32_init_machine_status; | ||
4652 | +} | ||
4653 | + | ||
4654 | + | ||
4655 | +/* Return an RTX indicating where the return address to the | ||
4656 | + calling function can be found. */ | ||
4657 | + | ||
4658 | +rtx | ||
4659 | +avr32_return_addr (int count, rtx frame ATTRIBUTE_UNUSED) | ||
4660 | +{ | ||
4661 | + if (count != 0) | ||
4662 | + return NULL_RTX; | ||
4663 | + | ||
4664 | + return get_hard_reg_initial_val (Pmode, LR_REGNUM); | ||
4665 | +} | ||
4666 | + | ||
4667 | + | ||
4668 | +void | ||
4669 | +avr32_encode_section_info (tree decl, rtx rtl, int first) | ||
4670 | +{ | ||
4671 | + | ||
4672 | + if (first && DECL_P (decl)) | ||
4673 | + { | ||
4674 | + /* Set SYMBOL_REG_FLAG for local functions */ | ||
4675 | + if (!TREE_PUBLIC (decl) && TREE_CODE (decl) == FUNCTION_DECL) | ||
4676 | + { | ||
4677 | + if ((*targetm.binds_local_p) (decl)) | ||
4678 | + { | ||
4679 | + SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1; | ||
4680 | + } | ||
4681 | + } | ||
4682 | + } | ||
4683 | +} | ||
4684 | + | ||
4685 | + | ||
4686 | +void | ||
4687 | +avr32_asm_output_ascii (FILE * stream, char *ptr, int len) | ||
4688 | +{ | ||
4689 | + int i, i_new = 0; | ||
4690 | + char *new_ptr = xmalloc (4 * len); | ||
4691 | + if (new_ptr == NULL) | ||
4692 | + internal_error ("Out of memory."); | ||
4693 | + | ||
4694 | + for (i = 0; i < len; i++) | ||
4695 | + { | ||
4696 | + if (ptr[i] == '\n') | ||
4697 | + { | ||
4698 | + new_ptr[i_new++] = '\\'; | ||
4699 | + new_ptr[i_new++] = '0'; | ||
4700 | + new_ptr[i_new++] = '1'; | ||
4701 | + new_ptr[i_new++] = '2'; | ||
4702 | + } | ||
4703 | + else if (ptr[i] == '\"') | ||
4704 | + { | ||
4705 | + new_ptr[i_new++] = '\\'; | ||
4706 | + new_ptr[i_new++] = '\"'; | ||
4707 | + } | ||
4708 | + else if (ptr[i] == '\\') | ||
4709 | + { | ||
4710 | + new_ptr[i_new++] = '\\'; | ||
4711 | + new_ptr[i_new++] = '\\'; | ||
4712 | + } | ||
4713 | + else if (ptr[i] == '\0' && i + 1 < len) | ||
4714 | + { | ||
4715 | + new_ptr[i_new++] = '\\'; | ||
4716 | + new_ptr[i_new++] = '0'; | ||
4717 | + } | ||
4718 | + else | ||
4719 | + { | ||
4720 | + new_ptr[i_new++] = ptr[i]; | ||
4721 | + } | ||
4722 | + } | ||
4723 | + | ||
4724 | + /* Terminate new_ptr. */ | ||
4725 | + new_ptr[i_new] = '\0'; | ||
4726 | + fprintf (stream, "\t.ascii\t\"%s\"\n", new_ptr); | ||
4727 | + free (new_ptr); | ||
4728 | +} | ||
4729 | + | ||
4730 | + | ||
4731 | +void | ||
4732 | +avr32_asm_output_label (FILE * stream, const char *name) | ||
4733 | +{ | ||
4734 | + name = avr32_strip_name_encoding (name); | ||
4735 | + | ||
4736 | + /* Print the label. */ | ||
4737 | + assemble_name (stream, name); | ||
4738 | + fprintf (stream, ":\n"); | ||
4739 | +} | ||
4740 | + | ||
4741 | + | ||
4742 | + | ||
4743 | +void | ||
4744 | +avr32_asm_weaken_label (FILE * stream, const char *name) | ||
4745 | +{ | ||
4746 | + fprintf (stream, "\t.weak "); | ||
4747 | + assemble_name (stream, name); | ||
4748 | + fprintf (stream, "\n"); | ||
4749 | +} | ||
4750 | + | ||
4751 | +/* | ||
4752 | + Checks if a labelref is equal to a reserved word in the assembler. If it is, | ||
4753 | + insert a '_' before the label name. | ||
4754 | +*/ | ||
4755 | +void | ||
4756 | +avr32_asm_output_labelref (FILE * stream, const char *name) | ||
4757 | +{ | ||
4758 | + int verbatim = FALSE; | ||
4759 | + const char *stripped = name; | ||
4760 | + int strip_finished = FALSE; | ||
4761 | + | ||
4762 | + while (!strip_finished) | ||
4763 | + { | ||
4764 | + switch (stripped[0]) | ||
4765 | + { | ||
4766 | + case '#': | ||
4767 | + stripped = strchr (name + 1, '#') + 1; | ||
4768 | + break; | ||
4769 | + case '*': | ||
4770 | + stripped = &stripped[1]; | ||
4771 | + verbatim = TRUE; | ||
4772 | + break; | ||
4773 | + default: | ||
4774 | + strip_finished = TRUE; | ||
4775 | + break; | ||
4776 | + } | ||
4777 | + } | ||
4778 | + | ||
4779 | + if (verbatim) | ||
4780 | + fputs (stripped, stream); | ||
4781 | + else | ||
4782 | + asm_fprintf (stream, "%U%s", stripped); | ||
4783 | +} | ||
4784 | + | ||
4785 | + | ||
4786 | + | ||
4787 | +/* | ||
4788 | + Check if the comparison in compare_exp is redundant | ||
4789 | + for the condition given in next_cond given that the | ||
4790 | + needed flags are already set by an earlier instruction. | ||
4791 | + Uses cc_prev_status to check this. | ||
4792 | + | ||
4793 | + Returns NULL_RTX if the compare is not redundant | ||
4794 | + or the new condition to use in the conditional | ||
4795 | + instruction if the compare is redundant. | ||
4796 | +*/ | ||
4797 | +static rtx | ||
4798 | +is_compare_redundant (rtx compare_exp, rtx next_cond) | ||
4799 | +{ | ||
4800 | + int z_flag_valid = FALSE; | ||
4801 | + int n_flag_valid = FALSE; | ||
4802 | + rtx new_cond; | ||
4803 | + | ||
4804 | + if (GET_CODE (compare_exp) != COMPARE) | ||
4805 | + return NULL_RTX; | ||
4806 | + | ||
4807 | + | ||
4808 | + if (GET_MODE (compare_exp) != SImode) | ||
4809 | + return NULL_RTX; | ||
4810 | + | ||
4811 | + if (rtx_equal_p (cc_prev_status.mdep.value, compare_exp)) | ||
4812 | + { | ||
4813 | + /* cc0 already contains the correct comparison -> delete cmp insn */ | ||
4814 | + return next_cond; | ||
4815 | + } | ||
4816 | + | ||
4817 | + switch (cc_prev_status.mdep.flags) | ||
4818 | + { | ||
4819 | + case CC_SET_VNCZ: | ||
4820 | + case CC_SET_NCZ: | ||
4821 | + n_flag_valid = TRUE; | ||
4822 | + case CC_SET_CZ: | ||
4823 | + case CC_SET_Z: | ||
4824 | + z_flag_valid = TRUE; | ||
4825 | + } | ||
4826 | + | ||
4827 | + if (cc_prev_status.mdep.value | ||
4828 | + && REG_P (XEXP (compare_exp, 0)) | ||
4829 | + && REGNO (XEXP (compare_exp, 0)) == REGNO (cc_prev_status.mdep.value) | ||
4830 | + && GET_CODE (XEXP (compare_exp, 1)) == CONST_INT | ||
4831 | + && next_cond != NULL_RTX) | ||
4832 | + { | ||
4833 | + if (INTVAL (XEXP (compare_exp, 1)) == 0 | ||
4834 | + && z_flag_valid | ||
4835 | + && (GET_CODE (next_cond) == EQ || GET_CODE (next_cond) == NE)) | ||
4836 | + /* We can skip comparison Z flag is already reflecting ops[0] */ | ||
4837 | + return next_cond; | ||
4838 | + else if (n_flag_valid | ||
4839 | + && ((INTVAL (XEXP (compare_exp, 1)) == 0 | ||
4840 | + && (GET_CODE (next_cond) == GE | ||
4841 | + || GET_CODE (next_cond) == LT)) | ||
4842 | + || (INTVAL (XEXP (compare_exp, 1)) == -1 | ||
4843 | + && (GET_CODE (next_cond) == GT | ||
4844 | + || GET_CODE (next_cond) == LE)))) | ||
4845 | + { | ||
4846 | + /* We can skip comparison N flag is already reflecting ops[0], | ||
4847 | + which means that we can use the mi/pl conditions to check if | ||
4848 | + ops[0] is GE or LT 0. */ | ||
4849 | + if ((GET_CODE (next_cond) == GE) || (GET_CODE (next_cond) == GT)) | ||
4850 | + new_cond = | ||
4851 | + gen_rtx_UNSPEC (CCmode, gen_rtvec (2, cc0_rtx, const0_rtx), | ||
4852 | + UNSPEC_COND_PL); | ||
4853 | + else | ||
4854 | + new_cond = | ||
4855 | + gen_rtx_UNSPEC (CCmode, gen_rtvec (2, cc0_rtx, const0_rtx), | ||
4856 | + UNSPEC_COND_MI); | ||
4857 | + return new_cond; | ||
4858 | + } | ||
4859 | + } | ||
4860 | + return NULL_RTX; | ||
4861 | +} | ||
4862 | + | ||
4863 | +/* Updates cc_status. */ | ||
4864 | +void | ||
4865 | +avr32_notice_update_cc (rtx exp, rtx insn) | ||
4866 | +{ | ||
4867 | + switch (get_attr_cc (insn)) | ||
4868 | + { | ||
4869 | + case CC_CALL_SET: | ||
4870 | + CC_STATUS_INIT; | ||
4871 | + FPCC_STATUS_INIT; | ||
4872 | + /* Check if the function call returns a value in r12 */ | ||
4873 | + if (REG_P (recog_data.operand[0]) | ||
4874 | + && REGNO (recog_data.operand[0]) == RETVAL_REGNUM) | ||
4875 | + { | ||
4876 | + cc_status.flags = 0; | ||
4877 | + cc_status.mdep.value = | ||
4878 | + gen_rtx_COMPARE (SImode, recog_data.operand[0], const0_rtx); | ||
4879 | + cc_status.mdep.flags = CC_SET_VNCZ; | ||
4880 | + | ||
4881 | + } | ||
4882 | + break; | ||
4883 | + case CC_COMPARE: | ||
4884 | + /* Check that compare will not be optimized away if so nothing should | ||
4885 | + be done */ | ||
4886 | + if (is_compare_redundant (SET_SRC (exp), get_next_insn_cond (insn)) | ||
4887 | + == NULL_RTX) | ||
4888 | + { | ||
4889 | + | ||
4890 | + /* Reset the nonstandard flag */ | ||
4891 | + CC_STATUS_INIT; | ||
4892 | + cc_status.flags = 0; | ||
4893 | + cc_status.mdep.value = SET_SRC (exp); | ||
4894 | + cc_status.mdep.flags = CC_SET_VNCZ; | ||
4895 | + } | ||
4896 | + break; | ||
4897 | + case CC_FPCOMPARE: | ||
4898 | + /* Check that floating-point compare will not be optimized away if so | ||
4899 | + nothing should be done */ | ||
4900 | + if (!rtx_equal_p (cc_prev_status.mdep.fpvalue, SET_SRC (exp))) | ||
4901 | + { | ||
4902 | + /* cc0 already contains the correct comparison -> delete cmp insn */ | ||
4903 | + /* Reset the nonstandard flag */ | ||
4904 | + cc_status.mdep.fpvalue = SET_SRC (exp); | ||
4905 | + cc_status.mdep.fpflags = CC_SET_CZ; | ||
4906 | + } | ||
4907 | + break; | ||
4908 | + case CC_FROM_FPCC: | ||
4909 | + /* Flags are updated with flags from Floating-point coprocessor, set | ||
4910 | + CC_NOT_SIGNED flag since the flags are set so that unsigned | ||
4911 | + condidion codes can be used directly. */ | ||
4912 | + CC_STATUS_INIT; | ||
4913 | + cc_status.flags = CC_NOT_SIGNED; | ||
4914 | + cc_status.mdep.value = cc_status.mdep.fpvalue; | ||
4915 | + cc_status.mdep.flags = cc_status.mdep.fpflags; | ||
4916 | + break; | ||
4917 | + case CC_BLD: | ||
4918 | + /* Bit load is kind of like an inverted testsi, because the Z flag is | ||
4919 | + inverted */ | ||
4920 | + CC_STATUS_INIT; | ||
4921 | + cc_status.flags = CC_INVERTED; | ||
4922 | + cc_status.mdep.value = SET_SRC (exp); | ||
4923 | + cc_status.mdep.flags = CC_SET_Z; | ||
4924 | + break; | ||
4925 | + case CC_NONE: | ||
4926 | + /* Insn does not affect CC at all. Check if the instruction updates | ||
4927 | + some of the register currently reflected in cc0 */ | ||
4928 | + | ||
4929 | + if ((GET_CODE (exp) == SET) | ||
4930 | + && (cc_status.value1 || cc_status.value2 || cc_status.mdep.value) | ||
4931 | + && (reg_mentioned_p (SET_DEST (exp), cc_status.value1) | ||
4932 | + || reg_mentioned_p (SET_DEST (exp), cc_status.value2) | ||
4933 | + || reg_mentioned_p (SET_DEST (exp), cc_status.mdep.value))) | ||
4934 | + { | ||
4935 | + CC_STATUS_INIT; | ||
4936 | + } | ||
4937 | + | ||
4938 | + /* If this is a parallel we must step through each of the parallel | ||
4939 | + expressions */ | ||
4940 | + if (GET_CODE (exp) == PARALLEL) | ||
4941 | + { | ||
4942 | + int i; | ||
4943 | + for (i = 0; i < XVECLEN (exp, 0); ++i) | ||
4944 | + { | ||
4945 | + rtx vec_exp = XVECEXP (exp, 0, i); | ||
4946 | + if ((GET_CODE (vec_exp) == SET) | ||
4947 | + && (cc_status.value1 || cc_status.value2 | ||
4948 | + || cc_status.mdep.value) | ||
4949 | + && (reg_mentioned_p (SET_DEST (vec_exp), cc_status.value1) | ||
4950 | + || reg_mentioned_p (SET_DEST (vec_exp), | ||
4951 | + cc_status.value2) | ||
4952 | + || reg_mentioned_p (SET_DEST (vec_exp), | ||
4953 | + cc_status.mdep.value))) | ||
4954 | + { | ||
4955 | + CC_STATUS_INIT; | ||
4956 | + } | ||
4957 | + } | ||
4958 | + } | ||
4959 | + | ||
4960 | + /* Check if we have memory opartions with post_inc or pre_dec on the | ||
4961 | + register currently reflected in cc0 */ | ||
4962 | + if (GET_CODE (exp) == SET | ||
4963 | + && GET_CODE (SET_SRC (exp)) == MEM | ||
4964 | + && (GET_CODE (XEXP (SET_SRC (exp), 0)) == POST_INC | ||
4965 | + || GET_CODE (XEXP (SET_SRC (exp), 0)) == PRE_DEC) | ||
4966 | + && | ||
4967 | + (reg_mentioned_p | ||
4968 | + (XEXP (XEXP (SET_SRC (exp), 0), 0), cc_status.value1) | ||
4969 | + || reg_mentioned_p (XEXP (XEXP (SET_SRC (exp), 0), 0), | ||
4970 | + cc_status.value2) | ||
4971 | + || reg_mentioned_p (XEXP (XEXP (SET_SRC (exp), 0), 0), | ||
4972 | + cc_status.mdep.value))) | ||
4973 | + CC_STATUS_INIT; | ||
4974 | + | ||
4975 | + if (GET_CODE (exp) == SET | ||
4976 | + && GET_CODE (SET_DEST (exp)) == MEM | ||
4977 | + && (GET_CODE (XEXP (SET_DEST (exp), 0)) == POST_INC | ||
4978 | + || GET_CODE (XEXP (SET_DEST (exp), 0)) == PRE_DEC) | ||
4979 | + && | ||
4980 | + (reg_mentioned_p | ||
4981 | + (XEXP (XEXP (SET_DEST (exp), 0), 0), cc_status.value1) | ||
4982 | + || reg_mentioned_p (XEXP (XEXP (SET_DEST (exp), 0), 0), | ||
4983 | + cc_status.value2) | ||
4984 | + || reg_mentioned_p (XEXP (XEXP (SET_DEST (exp), 0), 0), | ||
4985 | + cc_status.mdep.value))) | ||
4986 | + CC_STATUS_INIT; | ||
4987 | + break; | ||
4988 | + | ||
4989 | + case CC_SET_VNCZ: | ||
4990 | + CC_STATUS_INIT; | ||
4991 | + cc_status.mdep.value = recog_data.operand[0]; | ||
4992 | + cc_status.mdep.flags = CC_SET_VNCZ; | ||
4993 | + break; | ||
4994 | + | ||
4995 | + case CC_SET_NCZ: | ||
4996 | + CC_STATUS_INIT; | ||
4997 | + cc_status.mdep.value = recog_data.operand[0]; | ||
4998 | + cc_status.mdep.flags = CC_SET_NCZ; | ||
4999 | + break; | ||
5000 | + | ||
5001 | + case CC_SET_CZ: | ||
5002 | + CC_STATUS_INIT; | ||
5003 | + cc_status.mdep.value = recog_data.operand[0]; | ||
5004 | + cc_status.mdep.flags = CC_SET_CZ; | ||
5005 | + break; | ||
5006 | + | ||
5007 | + case CC_SET_Z: | ||
5008 | + CC_STATUS_INIT; | ||
5009 | + cc_status.mdep.value = recog_data.operand[0]; | ||
5010 | + cc_status.mdep.flags = CC_SET_Z; | ||
5011 | + break; | ||
5012 | + | ||
5013 | + case CC_CLOBBER: | ||
5014 | + CC_STATUS_INIT; | ||
5015 | + break; | ||
5016 | + | ||
5017 | + default: | ||
5018 | + CC_STATUS_INIT; | ||
5019 | + } | ||
5020 | +} | ||
5021 | + | ||
5022 | + | ||
5023 | +/* | ||
5024 | + Outputs to stdio stream stream the assembler syntax for an instruction | ||
5025 | + operand x. x is an RTL expression. | ||
5026 | +*/ | ||
5027 | +void | ||
5028 | +avr32_print_operand (FILE * stream, rtx x, int code) | ||
5029 | +{ | ||
5030 | + int error = 0; | ||
5031 | + | ||
5032 | + switch (GET_CODE (x)) | ||
5033 | + { | ||
5034 | + case UNSPEC: | ||
5035 | + switch (XINT (x, 1)) | ||
5036 | + { | ||
5037 | + case UNSPEC_COND_PL: | ||
5038 | + if (code == 'i') | ||
5039 | + fputs ("mi", stream); | ||
5040 | + else | ||
5041 | + fputs ("pl", stream); | ||
5042 | + break; | ||
5043 | + case UNSPEC_COND_MI: | ||
5044 | + if (code == 'i') | ||
5045 | + fputs ("pl", stream); | ||
5046 | + else | ||
5047 | + fputs ("mi", stream); | ||
5048 | + break; | ||
5049 | + default: | ||
5050 | + error = 1; | ||
5051 | + } | ||
5052 | + break; | ||
5053 | + case EQ: | ||
5054 | + if (code == 'i') | ||
5055 | + fputs ("ne", stream); | ||
5056 | + else | ||
5057 | + fputs ("eq", stream); | ||
5058 | + break; | ||
5059 | + case NE: | ||
5060 | + if (code == 'i') | ||
5061 | + fputs ("eq", stream); | ||
5062 | + else | ||
5063 | + fputs ("ne", stream); | ||
5064 | + break; | ||
5065 | + case GT: | ||
5066 | + if (code == 'i') | ||
5067 | + fputs ("le", stream); | ||
5068 | + else | ||
5069 | + fputs ("gt", stream); | ||
5070 | + break; | ||
5071 | + case GTU: | ||
5072 | + if (code == 'i') | ||
5073 | + fputs ("ls", stream); | ||
5074 | + else | ||
5075 | + fputs ("hi", stream); | ||
5076 | + break; | ||
5077 | + case LT: | ||
5078 | + if (code == 'i') | ||
5079 | + fputs ("ge", stream); | ||
5080 | + else | ||
5081 | + fputs ("lt", stream); | ||
5082 | + break; | ||
5083 | + case LTU: | ||
5084 | + if (code == 'i') | ||
5085 | + fputs ("hs", stream); | ||
5086 | + else | ||
5087 | + fputs ("lo", stream); | ||
5088 | + break; | ||
5089 | + case GE: | ||
5090 | + if (code == 'i') | ||
5091 | + fputs ("lt", stream); | ||
5092 | + else | ||
5093 | + fputs ("ge", stream); | ||
5094 | + break; | ||
5095 | + case GEU: | ||
5096 | + if (code == 'i') | ||
5097 | + fputs ("lo", stream); | ||
5098 | + else | ||
5099 | + fputs ("hs", stream); | ||
5100 | + break; | ||
5101 | + case LE: | ||
5102 | + if (code == 'i') | ||
5103 | + fputs ("gt", stream); | ||
5104 | + else | ||
5105 | + fputs ("le", stream); | ||
5106 | + break; | ||
5107 | + case LEU: | ||
5108 | + if (code == 'i') | ||
5109 | + fputs ("hi", stream); | ||
5110 | + else | ||
5111 | + fputs ("ls", stream); | ||
5112 | + break; | ||
5113 | + case CONST_INT: | ||
5114 | + { | ||
5115 | + int value = INTVAL (x); | ||
5116 | + | ||
5117 | + if (code == 'i') | ||
5118 | + { | ||
5119 | + value++; | ||
5120 | + } | ||
5121 | + | ||
5122 | + if (code == 'p') | ||
5123 | + { | ||
5124 | + /* Set to bit position of first bit set in immediate */ | ||
5125 | + int i, bitpos = 32; | ||
5126 | + for (i = 0; i < 32; i++) | ||
5127 | + if (value & (1 << i)) | ||
5128 | + { | ||
5129 | + bitpos = i; | ||
5130 | + break; | ||
5131 | + } | ||
5132 | + value = bitpos; | ||
5133 | + } | ||
5134 | + | ||
5135 | + if (code == 'r') | ||
5136 | + { | ||
5137 | + /* Reglist 8 */ | ||
5138 | + char op[50]; | ||
5139 | + op[0] = '\0'; | ||
5140 | + | ||
5141 | + if (value & 0x01) | ||
5142 | + sprintf (op, "r0-r3"); | ||
5143 | + if (value & 0x02) | ||
5144 | + strlen (op) ? sprintf (op, "%s, r4-r7", op) : sprintf (op, | ||
5145 | + "r4-r7"); | ||
5146 | + if (value & 0x04) | ||
5147 | + strlen (op) ? sprintf (op, "%s, r8-r9", op) : sprintf (op, | ||
5148 | + "r8-r9"); | ||
5149 | + if (value & 0x08) | ||
5150 | + strlen (op) ? sprintf (op, "%s, r10", op) : sprintf (op, "r10"); | ||
5151 | + if (value & 0x10) | ||
5152 | + strlen (op) ? sprintf (op, "%s, r11", op) : sprintf (op, "r11"); | ||
5153 | + if (value & 0x20) | ||
5154 | + strlen (op) ? sprintf (op, "%s, r12", op) : sprintf (op, "r12"); | ||
5155 | + if (value & 0x40) | ||
5156 | + strlen (op) ? sprintf (op, "%s, lr", op) : sprintf (op, "lr"); | ||
5157 | + if (value & 0x80) | ||
5158 | + strlen (op) ? sprintf (op, "%s, pc", op) : sprintf (op, "pc"); | ||
5159 | + | ||
5160 | + fputs (op, stream); | ||
5161 | + } | ||
5162 | + else if (code == 's') | ||
5163 | + { | ||
5164 | + /* Reglist 16 */ | ||
5165 | + char reglist16_string[100]; | ||
5166 | + int i; | ||
5167 | + reglist16_string[0] = '\0'; | ||
5168 | + | ||
5169 | + for (i = 0; i < 16; ++i) | ||
5170 | + { | ||
5171 | + if (value & (1 << i)) | ||
5172 | + { | ||
5173 | + strlen (reglist16_string) ? sprintf (reglist16_string, | ||
5174 | + "%s, %s", | ||
5175 | + reglist16_string, | ||
5176 | + reg_names | ||
5177 | + [INTERNAL_REGNUM | ||
5178 | + (i)]) : | ||
5179 | + sprintf (reglist16_string, "%s", | ||
5180 | + reg_names[INTERNAL_REGNUM (i)]); | ||
5181 | + } | ||
5182 | + } | ||
5183 | + fputs (reglist16_string, stream); | ||
5184 | + } | ||
5185 | + else if (code == 'C') | ||
5186 | + { | ||
5187 | + /* RegListCP8 */ | ||
5188 | + char reglist_string[100]; | ||
5189 | + avr32_make_fp_reglist_w (value, (char *) reglist_string); | ||
5190 | + fputs (reglist_string, stream); | ||
5191 | + } | ||
5192 | + else if (code == 'D') | ||
5193 | + { | ||
5194 | + /* RegListCPD8 */ | ||
5195 | + char reglist_string[100]; | ||
5196 | + avr32_make_fp_reglist_d (value, (char *) reglist_string); | ||
5197 | + fputs (reglist_string, stream); | ||
5198 | + } | ||
5199 | + else if (code == 'd') | ||
5200 | + { | ||
5201 | + /* Print in decimal format */ | ||
5202 | + fprintf (stream, "%d", value); | ||
5203 | + } | ||
5204 | + else if (code == 'h') | ||
5205 | + { | ||
5206 | + /* Print halfword part of word */ | ||
5207 | + fputs (value ? "b" : "t", stream); | ||
5208 | + } | ||
5209 | + else | ||
5210 | + { | ||
5211 | + /* Normal constant */ | ||
5212 | + fprintf (stream, "%d", value); | ||
5213 | + } | ||
5214 | + break; | ||
5215 | + } | ||
5216 | + case CONST_DOUBLE: | ||
5217 | + { | ||
5218 | + HOST_WIDE_INT hi, lo; | ||
5219 | + if (GET_MODE (x) == DImode) | ||
5220 | + { | ||
5221 | + hi = CONST_DOUBLE_HIGH (x); | ||
5222 | + lo = CONST_DOUBLE_LOW (x); | ||
5223 | + } | ||
5224 | + else | ||
5225 | + { | ||
5226 | + HOST_WIDE_INT target_float[2]; | ||
5227 | + hi = lo = 0; | ||
5228 | + real_to_target (target_float, CONST_DOUBLE_REAL_VALUE (x), | ||
5229 | + GET_MODE (x)); | ||
5230 | + /* For doubles the most significant part starts at index 0. */ | ||
5231 | + if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) | ||
5232 | + { | ||
5233 | + hi = target_float[0]; | ||
5234 | + lo = target_float[1]; | ||
5235 | + } | ||
5236 | + else | ||
5237 | + { | ||
5238 | + lo = target_float[0]; | ||
5239 | + } | ||
5240 | + } | ||
5241 | + | ||
5242 | + if (avr32_const_ok_for_constraint_p (lo, 'K', "Ks21") | ||
5243 | + && ((GET_MODE (x) == SFmode) | ||
5244 | + || avr32_const_ok_for_constraint_p (hi, 'K', "Ks21"))) | ||
5245 | + { | ||
5246 | + if (code == 'm') | ||
5247 | + fprintf (stream, "%ld", hi); | ||
5248 | + else | ||
5249 | + fprintf (stream, "%ld", lo); | ||
5250 | + } | ||
5251 | + else | ||
5252 | + { | ||
5253 | + fprintf (stream, "value too large"); | ||
5254 | + } | ||
5255 | + break; | ||
5256 | + } | ||
5257 | + case CONST: | ||
5258 | + output_addr_const (stream, XEXP (XEXP (x, 0), 0)); | ||
5259 | + fprintf (stream, "+%ld", INTVAL (XEXP (XEXP (x, 0), 1))); | ||
5260 | + break; | ||
5261 | + case REG: | ||
5262 | + /* Swap register name if the register is DImode or DFmode. */ | ||
5263 | + if (GET_MODE (x) == DImode || GET_MODE (x) == DFmode) | ||
5264 | + { | ||
5265 | + /* Double register must have an even numbered address */ | ||
5266 | + gcc_assert (!(REGNO (x) % 2)); | ||
5267 | + if (code == 'm') | ||
5268 | + fputs (reg_names[true_regnum (x)], stream); | ||
5269 | + else | ||
5270 | + fputs (reg_names[true_regnum (x) + 1], stream); | ||
5271 | + } | ||
5272 | + else if (GET_MODE (x) == TImode) | ||
5273 | + { | ||
5274 | + switch (code) | ||
5275 | + { | ||
5276 | + case 'T': | ||
5277 | + fputs (reg_names[true_regnum (x)], stream); | ||
5278 | + break; | ||
5279 | + case 'U': | ||
5280 | + fputs (reg_names[true_regnum (x) + 1], stream); | ||
5281 | + break; | ||
5282 | + case 'L': | ||
5283 | + fputs (reg_names[true_regnum (x) + 2], stream); | ||
5284 | + break; | ||
5285 | + case 'B': | ||
5286 | + fputs (reg_names[true_regnum (x) + 3], stream); | ||
5287 | + break; | ||
5288 | + default: | ||
5289 | + fprintf (stream, "%s, %s, %s, %s", | ||
5290 | + reg_names[true_regnum (x) + 3], | ||
5291 | + reg_names[true_regnum (x) + 2], | ||
5292 | + reg_names[true_regnum (x) + 1], | ||
5293 | + reg_names[true_regnum (x)]); | ||
5294 | + break; | ||
5295 | + } | ||
5296 | + } | ||
5297 | + else | ||
5298 | + { | ||
5299 | + fputs (reg_names[true_regnum (x)], stream); | ||
5300 | + } | ||
5301 | + break; | ||
5302 | + case CODE_LABEL: | ||
5303 | + case LABEL_REF: | ||
5304 | + case SYMBOL_REF: | ||
5305 | + output_addr_const (stream, x); | ||
5306 | + break; | ||
5307 | + case MEM: | ||
5308 | + switch (GET_CODE (XEXP (x, 0))) | ||
5309 | + { | ||
5310 | + case LABEL_REF: | ||
5311 | + case SYMBOL_REF: | ||
5312 | + output_addr_const (stream, XEXP (x, 0)); | ||
5313 | + break; | ||
5314 | + case MEM: | ||
5315 | + switch (GET_CODE (XEXP (XEXP (x, 0), 0))) | ||
5316 | + { | ||
5317 | + case SYMBOL_REF: | ||
5318 | + output_addr_const (stream, XEXP (XEXP (x, 0), 0)); | ||
5319 | + break; | ||
5320 | + default: | ||
5321 | + error = 1; | ||
5322 | + break; | ||
5323 | + } | ||
5324 | + break; | ||
5325 | + case REG: | ||
5326 | + avr32_print_operand (stream, XEXP (x, 0), 0); | ||
5327 | + if (code != 'p') | ||
5328 | + fputs ("[0]", stream); | ||
5329 | + break; | ||
5330 | + case PRE_DEC: | ||
5331 | + fputs ("--", stream); | ||
5332 | + avr32_print_operand (stream, XEXP (XEXP (x, 0), 0), 0); | ||
5333 | + break; | ||
5334 | + case POST_INC: | ||
5335 | + avr32_print_operand (stream, XEXP (XEXP (x, 0), 0), 0); | ||
5336 | + fputs ("++", stream); | ||
5337 | + break; | ||
5338 | + case PLUS: | ||
5339 | + { | ||
5340 | + rtx op0 = XEXP (XEXP (x, 0), 0); | ||
5341 | + rtx op1 = XEXP (XEXP (x, 0), 1); | ||
5342 | + rtx base = NULL_RTX, offset = NULL_RTX; | ||
5343 | + | ||
5344 | + if (avr32_address_register_rtx_p (op0, 1)) | ||
5345 | + { | ||
5346 | + base = op0; | ||
5347 | + offset = op1; | ||
5348 | + } | ||
5349 | + else if (avr32_address_register_rtx_p (op1, 1)) | ||
5350 | + { | ||
5351 | + /* Operands are switched. */ | ||
5352 | + base = op1; | ||
5353 | + offset = op0; | ||
5354 | + } | ||
5355 | + | ||
5356 | + gcc_assert (base && offset | ||
5357 | + && avr32_address_register_rtx_p (base, 1) | ||
5358 | + && avr32_legitimate_index_p (GET_MODE (x), offset, | ||
5359 | + 1)); | ||
5360 | + | ||
5361 | + avr32_print_operand (stream, base, 0); | ||
5362 | + fputs ("[", stream); | ||
5363 | + avr32_print_operand (stream, offset, 0); | ||
5364 | + fputs ("]", stream); | ||
5365 | + break; | ||
5366 | + } | ||
5367 | + case CONST: | ||
5368 | + output_addr_const (stream, XEXP (XEXP (XEXP (x, 0), 0), 0)); | ||
5369 | + fprintf (stream, " + %ld", | ||
5370 | + INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))); | ||
5371 | + break; | ||
5372 | + default: | ||
5373 | + error = 1; | ||
5374 | + } | ||
5375 | + break; | ||
5376 | + case MULT: | ||
5377 | + { | ||
5378 | + int value = INTVAL (XEXP (x, 1)); | ||
5379 | + | ||
5380 | + /* Convert immediate in multiplication into a shift immediate */ | ||
5381 | + switch (value) | ||
5382 | + { | ||
5383 | + case 2: | ||
5384 | + value = 1; | ||
5385 | + break; | ||
5386 | + case 4: | ||
5387 | + value = 2; | ||
5388 | + break; | ||
5389 | + case 8: | ||
5390 | + value = 3; | ||
5391 | + break; | ||
5392 | + default: | ||
5393 | + value = 0; | ||
5394 | + } | ||
5395 | + fprintf (stream, "%s << %i", reg_names[true_regnum (XEXP (x, 0))], | ||
5396 | + value); | ||
5397 | + break; | ||
5398 | + } | ||
5399 | + case ASHIFT: | ||
5400 | + if (GET_CODE (XEXP (x, 1)) == CONST_INT) | ||
5401 | + fprintf (stream, "%s << %i", reg_names[true_regnum (XEXP (x, 0))], | ||
5402 | + (int) INTVAL (XEXP (x, 1))); | ||
5403 | + else if (REG_P (XEXP (x, 1))) | ||
5404 | + fprintf (stream, "%s << %s", reg_names[true_regnum (XEXP (x, 0))], | ||
5405 | + reg_names[true_regnum (XEXP (x, 1))]); | ||
5406 | + else | ||
5407 | + { | ||
5408 | + error = 1; | ||
5409 | + } | ||
5410 | + break; | ||
5411 | + case LSHIFTRT: | ||
5412 | + if (GET_CODE (XEXP (x, 1)) == CONST_INT) | ||
5413 | + fprintf (stream, "%s >> %i", reg_names[true_regnum (XEXP (x, 0))], | ||
5414 | + (int) INTVAL (XEXP (x, 1))); | ||
5415 | + else if (REG_P (XEXP (x, 1))) | ||
5416 | + fprintf (stream, "%s >> %s", reg_names[true_regnum (XEXP (x, 0))], | ||
5417 | + reg_names[true_regnum (XEXP (x, 1))]); | ||
5418 | + else | ||
5419 | + { | ||
5420 | + error = 1; | ||
5421 | + } | ||
5422 | + fprintf (stream, ">>"); | ||
5423 | + break; | ||
5424 | + case PARALLEL: | ||
5425 | + { | ||
5426 | + /* Load store multiple */ | ||
5427 | + int i; | ||
5428 | + int count = XVECLEN (x, 0); | ||
5429 | + int reglist16 = 0; | ||
5430 | + char reglist16_string[100]; | ||
5431 | + | ||
5432 | + for (i = 0; i < count; ++i) | ||
5433 | + { | ||
5434 | + rtx vec_elm = XVECEXP (x, 0, i); | ||
5435 | + if (GET_MODE (vec_elm) != SET) | ||
5436 | + { | ||
5437 | + debug_rtx (vec_elm); | ||
5438 | + internal_error ("Unknown element in parallel expression!"); | ||
5439 | + } | ||
5440 | + if (GET_MODE (XEXP (vec_elm, 0)) == REG) | ||
5441 | + { | ||
5442 | + /* Load multiple */ | ||
5443 | + reglist16 |= 1 << ASM_REGNUM (REGNO (XEXP (vec_elm, 0))); | ||
5444 | + } | ||
5445 | + else | ||
5446 | + { | ||
5447 | + /* Store multiple */ | ||
5448 | + reglist16 |= 1 << ASM_REGNUM (REGNO (XEXP (vec_elm, 1))); | ||
5449 | + } | ||
5450 | + } | ||
5451 | + | ||
5452 | + avr32_make_reglist16 (reglist16, reglist16_string); | ||
5453 | + fputs (reglist16_string, stream); | ||
5454 | + | ||
5455 | + break; | ||
5456 | + } | ||
5457 | + | ||
5458 | + default: | ||
5459 | + error = 1; | ||
5460 | + } | ||
5461 | + | ||
5462 | + if (error) | ||
5463 | + { | ||
5464 | + debug_rtx (x); | ||
5465 | + internal_error ("Illegal expression for avr32_print_operand"); | ||
5466 | + } | ||
5467 | +} | ||
5468 | + | ||
5469 | +rtx | ||
5470 | +avr32_get_note_reg_equiv (rtx insn) | ||
5471 | +{ | ||
5472 | + rtx note; | ||
5473 | + | ||
5474 | + note = find_reg_note (insn, REG_EQUIV, NULL_RTX); | ||
5475 | + | ||
5476 | + if (note != NULL_RTX) | ||
5477 | + return XEXP (note, 0); | ||
5478 | + else | ||
5479 | + return NULL_RTX; | ||
5480 | +} | ||
5481 | + | ||
5482 | +/* | ||
5483 | + Outputs to stdio stream stream the assembler syntax for an instruction | ||
5484 | + operand that is a memory reference whose address is x. x is an RTL | ||
5485 | + expression. | ||
5486 | + | ||
5487 | + ToDo: fixme. | ||
5488 | +*/ | ||
5489 | +void | ||
5490 | +avr32_print_operand_address (FILE * stream, rtx x) | ||
5491 | +{ | ||
5492 | + fprintf (stream, "(%d) /* address */", REGNO (x)); | ||
5493 | +} | ||
5494 | + | ||
5495 | +/* Return true if _GLOBAL_OFFSET_TABLE_ symbol is mentioned. */ | ||
5496 | +bool | ||
5497 | +avr32_got_mentioned_p (rtx addr) | ||
5498 | +{ | ||
5499 | + if (GET_CODE (addr) == MEM) | ||
5500 | + addr = XEXP (addr, 0); | ||
5501 | + while (GET_CODE (addr) == CONST) | ||
5502 | + addr = XEXP (addr, 0); | ||
5503 | + if (GET_CODE (addr) == SYMBOL_REF) | ||
5504 | + { | ||
5505 | + return streq (XSTR (addr, 0), "_GLOBAL_OFFSET_TABLE_"); | ||
5506 | + } | ||
5507 | + if (GET_CODE (addr) == PLUS || GET_CODE (addr) == MINUS) | ||
5508 | + { | ||
5509 | + bool l1, l2; | ||
5510 | + | ||
5511 | + l1 = avr32_got_mentioned_p (XEXP (addr, 0)); | ||
5512 | + l2 = avr32_got_mentioned_p (XEXP (addr, 1)); | ||
5513 | + return l1 || l2; | ||
5514 | + } | ||
5515 | + return false; | ||
5516 | +} | ||
5517 | + | ||
5518 | + | ||
5519 | +/* Find the symbol in an address expression. */ | ||
5520 | + | ||
5521 | +rtx | ||
5522 | +avr32_find_symbol (rtx addr) | ||
5523 | +{ | ||
5524 | + if (GET_CODE (addr) == MEM) | ||
5525 | + addr = XEXP (addr, 0); | ||
5526 | + | ||
5527 | + while (GET_CODE (addr) == CONST) | ||
5528 | + addr = XEXP (addr, 0); | ||
5529 | + | ||
5530 | + if (GET_CODE (addr) == SYMBOL_REF || GET_CODE (addr) == LABEL_REF) | ||
5531 | + return addr; | ||
5532 | + if (GET_CODE (addr) == PLUS) | ||
5533 | + { | ||
5534 | + rtx l1, l2; | ||
5535 | + | ||
5536 | + l1 = avr32_find_symbol (XEXP (addr, 0)); | ||
5537 | + l2 = avr32_find_symbol (XEXP (addr, 1)); | ||
5538 | + if (l1 != NULL_RTX && l2 == NULL_RTX) | ||
5539 | + return l1; | ||
5540 | + else if (l1 == NULL_RTX && l2 != NULL_RTX) | ||
5541 | + return l2; | ||
5542 | + } | ||
5543 | + | ||
5544 | + return NULL_RTX; | ||
5545 | +} | ||
5546 | + | ||
5547 | + | ||
5548 | +/* Routines for manipulation of the constant pool. */ | ||
5549 | + | ||
5550 | +/* AVR32 instructions cannot load a large constant directly into a | ||
5551 | + register; they have to come from a pc relative load. The constant | ||
5552 | + must therefore be placed in the addressable range of the pc | ||
5553 | + relative load. Depending on the precise pc relative load | ||
5554 | + instruction the range is somewhere between 256 bytes and 4k. This | ||
5555 | + means that we often have to dump a constant inside a function, and | ||
5556 | + generate code to branch around it. | ||
5557 | + | ||
5558 | + It is important to minimize this, since the branches will slow | ||
5559 | + things down and make the code larger. | ||
5560 | + | ||
5561 | + Normally we can hide the table after an existing unconditional | ||
5562 | + branch so that there is no interruption of the flow, but in the | ||
5563 | + worst case the code looks like this: | ||
5564 | + | ||
5565 | + lddpc rn, L1 | ||
5566 | + ... | ||
5567 | + rjmp L2 | ||
5568 | + align | ||
5569 | + L1: .long value | ||
5570 | + L2: | ||
5571 | + ... | ||
5572 | + | ||
5573 | + lddpc rn, L3 | ||
5574 | + ... | ||
5575 | + rjmp L4 | ||
5576 | + align | ||
5577 | + L3: .long value | ||
5578 | + L4: | ||
5579 | + ... | ||
5580 | + | ||
5581 | + We fix this by performing a scan after scheduling, which notices | ||
5582 | + which instructions need to have their operands fetched from the | ||
5583 | + constant table and builds the table. | ||
5584 | + | ||
5585 | + The algorithm starts by building a table of all the constants that | ||
5586 | + need fixing up and all the natural barriers in the function (places | ||
5587 | + where a constant table can be dropped without breaking the flow). | ||
5588 | + For each fixup we note how far the pc-relative replacement will be | ||
5589 | + able to reach and the offset of the instruction into the function. | ||
5590 | + | ||
5591 | + Having built the table we then group the fixes together to form | ||
5592 | + tables that are as large as possible (subject to addressing | ||
5593 | + constraints) and emit each table of constants after the last | ||
5594 | + barrier that is within range of all the instructions in the group. | ||
5595 | + If a group does not contain a barrier, then we forcibly create one | ||
5596 | + by inserting a jump instruction into the flow. Once the table has | ||
5597 | + been inserted, the insns are then modified to reference the | ||
5598 | + relevant entry in the pool. | ||
5599 | + | ||
5600 | + Possible enhancements to the algorithm (not implemented) are: | ||
5601 | + | ||
5602 | + 1) For some processors and object formats, there may be benefit in | ||
5603 | + aligning the pools to the start of cache lines; this alignment | ||
5604 | + would need to be taken into account when calculating addressability | ||
5605 | + of a pool. */ | ||
5606 | + | ||
5607 | +/* These typedefs are located at the start of this file, so that | ||
5608 | + they can be used in the prototypes there. This comment is to | ||
5609 | + remind readers of that fact so that the following structures | ||
5610 | + can be understood more easily. | ||
5611 | + | ||
5612 | + typedef struct minipool_node Mnode; | ||
5613 | + typedef struct minipool_fixup Mfix; */ | ||
5614 | + | ||
5615 | +struct minipool_node | ||
5616 | +{ | ||
5617 | + /* Doubly linked chain of entries. */ | ||
5618 | + Mnode *next; | ||
5619 | + Mnode *prev; | ||
5620 | + /* The maximum offset into the code that this entry can be placed. While | ||
5621 | + pushing fixes for forward references, all entries are sorted in order of | ||
5622 | + increasing max_address. */ | ||
5623 | + HOST_WIDE_INT max_address; | ||
5624 | + /* Similarly for an entry inserted for a backwards ref. */ | ||
5625 | + HOST_WIDE_INT min_address; | ||
5626 | + /* The number of fixes referencing this entry. This can become zero if we | ||
5627 | + "unpush" an entry. In this case we ignore the entry when we come to | ||
5628 | + emit the code. */ | ||
5629 | + int refcount; | ||
5630 | + /* The offset from the start of the minipool. */ | ||
5631 | + HOST_WIDE_INT offset; | ||
5632 | + /* The value in table. */ | ||
5633 | + rtx value; | ||
5634 | + /* The mode of value. */ | ||
5635 | + enum machine_mode mode; | ||
5636 | + /* The size of the value. */ | ||
5637 | + int fix_size; | ||
5638 | +}; | ||
5639 | + | ||
5640 | +struct minipool_fixup | ||
5641 | +{ | ||
5642 | + Mfix *next; | ||
5643 | + rtx insn; | ||
5644 | + HOST_WIDE_INT address; | ||
5645 | + rtx *loc; | ||
5646 | + enum machine_mode mode; | ||
5647 | + int fix_size; | ||
5648 | + rtx value; | ||
5649 | + Mnode *minipool; | ||
5650 | + HOST_WIDE_INT forwards; | ||
5651 | + HOST_WIDE_INT backwards; | ||
5652 | +}; | ||
5653 | + | ||
5654 | + | ||
5655 | +/* Fixes less than a word need padding out to a word boundary. */ | ||
5656 | +#define MINIPOOL_FIX_SIZE(mode, value) \ | ||
5657 | + (IS_FORCE_MINIPOOL(value) ? 0 : \ | ||
5658 | + (GET_MODE_SIZE ((mode)) >= 4 ? GET_MODE_SIZE ((mode)) : 4)) | ||
5659 | + | ||
5660 | +#define IS_FORCE_MINIPOOL(x) \ | ||
5661 | + (GET_CODE(x) == UNSPEC && \ | ||
5662 | + XINT(x, 1) == UNSPEC_FORCE_MINIPOOL) | ||
5663 | + | ||
5664 | +static Mnode *minipool_vector_head; | ||
5665 | +static Mnode *minipool_vector_tail; | ||
5666 | + | ||
5667 | +/* The linked list of all minipool fixes required for this function. */ | ||
5668 | +Mfix *minipool_fix_head; | ||
5669 | +Mfix *minipool_fix_tail; | ||
5670 | +/* The fix entry for the current minipool, once it has been placed. */ | ||
5671 | +Mfix *minipool_barrier; | ||
5672 | + | ||
5673 | +/* Determines if INSN is the start of a jump table. Returns the end | ||
5674 | + of the TABLE or NULL_RTX. */ | ||
5675 | +static rtx | ||
5676 | +is_jump_table (rtx insn) | ||
5677 | +{ | ||
5678 | + rtx table; | ||
5679 | + | ||
5680 | + if (GET_CODE (insn) == JUMP_INSN | ||
5681 | + && JUMP_LABEL (insn) != NULL | ||
5682 | + && ((table = next_real_insn (JUMP_LABEL (insn))) | ||
5683 | + == next_real_insn (insn)) | ||
5684 | + && table != NULL | ||
5685 | + && GET_CODE (table) == JUMP_INSN | ||
5686 | + && (GET_CODE (PATTERN (table)) == ADDR_VEC | ||
5687 | + || GET_CODE (PATTERN (table)) == ADDR_DIFF_VEC)) | ||
5688 | + return table; | ||
5689 | + | ||
5690 | + return NULL_RTX; | ||
5691 | +} | ||
5692 | + | ||
5693 | +static HOST_WIDE_INT | ||
5694 | +get_jump_table_size (rtx insn) | ||
5695 | +{ | ||
5696 | + /* ADDR_VECs only take room if read-only data does into the text section. */ | ||
5697 | + if (JUMP_TABLES_IN_TEXT_SECTION | ||
5698 | +#if !defined(READONLY_DATA_SECTION) && !defined(READONLY_DATA_SECTION_ASM_OP) | ||
5699 | + || 1 | ||
5700 | +#endif | ||
5701 | + ) | ||
5702 | + { | ||
5703 | + rtx body = PATTERN (insn); | ||
5704 | + int elt = GET_CODE (body) == ADDR_DIFF_VEC ? 1 : 0; | ||
5705 | + | ||
5706 | + return GET_MODE_SIZE (GET_MODE (body)) * XVECLEN (body, elt); | ||
5707 | + } | ||
5708 | + | ||
5709 | + return 0; | ||
5710 | +} | ||
5711 | + | ||
5712 | +/* Move a minipool fix MP from its current location to before MAX_MP. | ||
5713 | + If MAX_MP is NULL, then MP doesn't need moving, but the addressing | ||
5714 | + constraints may need updating. */ | ||
5715 | +static Mnode * | ||
5716 | +move_minipool_fix_forward_ref (Mnode * mp, Mnode * max_mp, | ||
5717 | + HOST_WIDE_INT max_address) | ||
5718 | +{ | ||
5719 | + /* This should never be true and the code below assumes these are | ||
5720 | + different. */ | ||
5721 | + if (mp == max_mp) | ||
5722 | + abort (); | ||
5723 | + | ||
5724 | + if (max_mp == NULL) | ||
5725 | + { | ||
5726 | + if (max_address < mp->max_address) | ||
5727 | + mp->max_address = max_address; | ||
5728 | + } | ||
5729 | + else | ||
5730 | + { | ||
5731 | + if (max_address > max_mp->max_address - mp->fix_size) | ||
5732 | + mp->max_address = max_mp->max_address - mp->fix_size; | ||
5733 | + else | ||
5734 | + mp->max_address = max_address; | ||
5735 | + | ||
5736 | + /* Unlink MP from its current position. Since max_mp is non-null, | ||
5737 | + mp->prev must be non-null. */ | ||
5738 | + mp->prev->next = mp->next; | ||
5739 | + if (mp->next != NULL) | ||
5740 | + mp->next->prev = mp->prev; | ||
5741 | + else | ||
5742 | + minipool_vector_tail = mp->prev; | ||
5743 | + | ||
5744 | + /* Re-insert it before MAX_MP. */ | ||
5745 | + mp->next = max_mp; | ||
5746 | + mp->prev = max_mp->prev; | ||
5747 | + max_mp->prev = mp; | ||
5748 | + | ||
5749 | + if (mp->prev != NULL) | ||
5750 | + mp->prev->next = mp; | ||
5751 | + else | ||
5752 | + minipool_vector_head = mp; | ||
5753 | + } | ||
5754 | + | ||
5755 | + /* Save the new entry. */ | ||
5756 | + max_mp = mp; | ||
5757 | + | ||
5758 | + /* Scan over the preceding entries and adjust their addresses as required. | ||
5759 | + */ | ||
5760 | + while (mp->prev != NULL | ||
5761 | + && mp->prev->max_address > mp->max_address - mp->prev->fix_size) | ||
5762 | + { | ||
5763 | + mp->prev->max_address = mp->max_address - mp->prev->fix_size; | ||
5764 | + mp = mp->prev; | ||
5765 | + } | ||
5766 | + | ||
5767 | + return max_mp; | ||
5768 | +} | ||
5769 | + | ||
5770 | +/* Add a constant to the minipool for a forward reference. Returns the | ||
5771 | + node added or NULL if the constant will not fit in this pool. */ | ||
5772 | +static Mnode * | ||
5773 | +add_minipool_forward_ref (Mfix * fix) | ||
5774 | +{ | ||
5775 | + /* If set, max_mp is the first pool_entry that has a lower constraint than | ||
5776 | + the one we are trying to add. */ | ||
5777 | + Mnode *max_mp = NULL; | ||
5778 | + HOST_WIDE_INT max_address = fix->address + fix->forwards; | ||
5779 | + Mnode *mp; | ||
5780 | + | ||
5781 | + /* If this fix's address is greater than the address of the first entry, | ||
5782 | + then we can't put the fix in this pool. We subtract the size of the | ||
5783 | + current fix to ensure that if the table is fully packed we still have | ||
5784 | + enough room to insert this value by suffling the other fixes forwards. */ | ||
5785 | + if (minipool_vector_head && | ||
5786 | + fix->address >= minipool_vector_head->max_address - fix->fix_size) | ||
5787 | + return NULL; | ||
5788 | + | ||
5789 | + /* Scan the pool to see if a constant with the same value has already been | ||
5790 | + added. While we are doing this, also note the location where we must | ||
5791 | + insert the constant if it doesn't already exist. */ | ||
5792 | + for (mp = minipool_vector_head; mp != NULL; mp = mp->next) | ||
5793 | + { | ||
5794 | + if (GET_CODE (fix->value) == GET_CODE (mp->value) | ||
5795 | + && fix->mode == mp->mode | ||
5796 | + && (GET_CODE (fix->value) != CODE_LABEL | ||
5797 | + || (CODE_LABEL_NUMBER (fix->value) | ||
5798 | + == CODE_LABEL_NUMBER (mp->value))) | ||
5799 | + && rtx_equal_p (fix->value, mp->value)) | ||
5800 | + { | ||
5801 | + /* More than one fix references this entry. */ | ||
5802 | + mp->refcount++; | ||
5803 | + return move_minipool_fix_forward_ref (mp, max_mp, max_address); | ||
5804 | + } | ||
5805 | + | ||
5806 | + /* Note the insertion point if necessary. */ | ||
5807 | + if (max_mp == NULL && mp->max_address > max_address) | ||
5808 | + max_mp = mp; | ||
5809 | + | ||
5810 | + } | ||
5811 | + | ||
5812 | + /* The value is not currently in the minipool, so we need to create a new | ||
5813 | + entry for it. If MAX_MP is NULL, the entry will be put on the end of | ||
5814 | + the list since the placement is less constrained than any existing | ||
5815 | + entry. Otherwise, we insert the new fix before MAX_MP and, if | ||
5816 | + necessary, adjust the constraints on the other entries. */ | ||
5817 | + mp = xmalloc (sizeof (*mp)); | ||
5818 | + mp->fix_size = fix->fix_size; | ||
5819 | + mp->mode = fix->mode; | ||
5820 | + mp->value = fix->value; | ||
5821 | + mp->refcount = 1; | ||
5822 | + /* Not yet required for a backwards ref. */ | ||
5823 | + mp->min_address = -65536; | ||
5824 | + | ||
5825 | + if (max_mp == NULL) | ||
5826 | + { | ||
5827 | + mp->max_address = max_address; | ||
5828 | + mp->next = NULL; | ||
5829 | + mp->prev = minipool_vector_tail; | ||
5830 | + | ||
5831 | + if (mp->prev == NULL) | ||
5832 | + { | ||
5833 | + minipool_vector_head = mp; | ||
5834 | + minipool_vector_label = gen_label_rtx (); | ||
5835 | + } | ||
5836 | + else | ||
5837 | + mp->prev->next = mp; | ||
5838 | + | ||
5839 | + minipool_vector_tail = mp; | ||
5840 | + } | ||
5841 | + else | ||
5842 | + { | ||
5843 | + if (max_address > max_mp->max_address - mp->fix_size) | ||
5844 | + mp->max_address = max_mp->max_address - mp->fix_size; | ||
5845 | + else | ||
5846 | + mp->max_address = max_address; | ||
5847 | + | ||
5848 | + mp->next = max_mp; | ||
5849 | + mp->prev = max_mp->prev; | ||
5850 | + max_mp->prev = mp; | ||
5851 | + if (mp->prev != NULL) | ||
5852 | + mp->prev->next = mp; | ||
5853 | + else | ||
5854 | + minipool_vector_head = mp; | ||
5855 | + } | ||
5856 | + | ||
5857 | + /* Save the new entry. */ | ||
5858 | + max_mp = mp; | ||
5859 | + | ||
5860 | + /* Scan over the preceding entries and adjust their addresses as required. | ||
5861 | + */ | ||
5862 | + while (mp->prev != NULL | ||
5863 | + && mp->prev->max_address > mp->max_address - mp->prev->fix_size) | ||
5864 | + { | ||
5865 | + mp->prev->max_address = mp->max_address - mp->prev->fix_size; | ||
5866 | + mp = mp->prev; | ||
5867 | + } | ||
5868 | + | ||
5869 | + return max_mp; | ||
5870 | +} | ||
5871 | + | ||
5872 | +static Mnode * | ||
5873 | +move_minipool_fix_backward_ref (Mnode * mp, Mnode * min_mp, | ||
5874 | + HOST_WIDE_INT min_address) | ||
5875 | +{ | ||
5876 | + HOST_WIDE_INT offset; | ||
5877 | + | ||
5878 | + /* This should never be true, and the code below assumes these are | ||
5879 | + different. */ | ||
5880 | + if (mp == min_mp) | ||
5881 | + abort (); | ||
5882 | + | ||
5883 | + if (min_mp == NULL) | ||
5884 | + { | ||
5885 | + if (min_address > mp->min_address) | ||
5886 | + mp->min_address = min_address; | ||
5887 | + } | ||
5888 | + else | ||
5889 | + { | ||
5890 | + /* We will adjust this below if it is too loose. */ | ||
5891 | + mp->min_address = min_address; | ||
5892 | + | ||
5893 | + /* Unlink MP from its current position. Since min_mp is non-null, | ||
5894 | + mp->next must be non-null. */ | ||
5895 | + mp->next->prev = mp->prev; | ||
5896 | + if (mp->prev != NULL) | ||
5897 | + mp->prev->next = mp->next; | ||
5898 | + else | ||
5899 | + minipool_vector_head = mp->next; | ||
5900 | + | ||
5901 | + /* Reinsert it after MIN_MP. */ | ||
5902 | + mp->prev = min_mp; | ||
5903 | + mp->next = min_mp->next; | ||
5904 | + min_mp->next = mp; | ||
5905 | + if (mp->next != NULL) | ||
5906 | + mp->next->prev = mp; | ||
5907 | + else | ||
5908 | + minipool_vector_tail = mp; | ||
5909 | + } | ||
5910 | + | ||
5911 | + min_mp = mp; | ||
5912 | + | ||
5913 | + offset = 0; | ||
5914 | + for (mp = minipool_vector_head; mp != NULL; mp = mp->next) | ||
5915 | + { | ||
5916 | + mp->offset = offset; | ||
5917 | + if (mp->refcount > 0) | ||
5918 | + offset += mp->fix_size; | ||
5919 | + | ||
5920 | + if (mp->next && mp->next->min_address < mp->min_address + mp->fix_size) | ||
5921 | + mp->next->min_address = mp->min_address + mp->fix_size; | ||
5922 | + } | ||
5923 | + | ||
5924 | + return min_mp; | ||
5925 | +} | ||
5926 | + | ||
5927 | +/* Add a constant to the minipool for a backward reference. Returns the | ||
5928 | + node added or NULL if the constant will not fit in this pool. | ||
5929 | + | ||
5930 | + Note that the code for insertion for a backwards reference can be | ||
5931 | + somewhat confusing because the calculated offsets for each fix do | ||
5932 | + not take into account the size of the pool (which is still under | ||
5933 | + construction. */ | ||
5934 | +static Mnode * | ||
5935 | +add_minipool_backward_ref (Mfix * fix) | ||
5936 | +{ | ||
5937 | + /* If set, min_mp is the last pool_entry that has a lower constraint than | ||
5938 | + the one we are trying to add. */ | ||
5939 | + Mnode *min_mp = NULL; | ||
5940 | + /* This can be negative, since it is only a constraint. */ | ||
5941 | + HOST_WIDE_INT min_address = fix->address - fix->backwards; | ||
5942 | + Mnode *mp; | ||
5943 | + | ||
5944 | + /* If we can't reach the current pool from this insn, or if we can't insert | ||
5945 | + this entry at the end of the pool without pushing other fixes out of | ||
5946 | + range, then we don't try. This ensures that we can't fail later on. */ | ||
5947 | + if (min_address >= minipool_barrier->address | ||
5948 | + || (minipool_vector_tail->min_address + fix->fix_size | ||
5949 | + >= minipool_barrier->address)) | ||
5950 | + return NULL; | ||
5951 | + | ||
5952 | + /* Scan the pool to see if a constant with the same value has already been | ||
5953 | + added. While we are doing this, also note the location where we must | ||
5954 | + insert the constant if it doesn't already exist. */ | ||
5955 | + for (mp = minipool_vector_tail; mp != NULL; mp = mp->prev) | ||
5956 | + { | ||
5957 | + if (GET_CODE (fix->value) == GET_CODE (mp->value) | ||
5958 | + && fix->mode == mp->mode | ||
5959 | + && (GET_CODE (fix->value) != CODE_LABEL | ||
5960 | + || (CODE_LABEL_NUMBER (fix->value) | ||
5961 | + == CODE_LABEL_NUMBER (mp->value))) | ||
5962 | + && rtx_equal_p (fix->value, mp->value) | ||
5963 | + /* Check that there is enough slack to move this entry to the end | ||
5964 | + of the table (this is conservative). */ | ||
5965 | + && (mp->max_address | ||
5966 | + > (minipool_barrier->address | ||
5967 | + + minipool_vector_tail->offset | ||
5968 | + + minipool_vector_tail->fix_size))) | ||
5969 | + { | ||
5970 | + mp->refcount++; | ||
5971 | + return move_minipool_fix_backward_ref (mp, min_mp, min_address); | ||
5972 | + } | ||
5973 | + | ||
5974 | + if (min_mp != NULL) | ||
5975 | + mp->min_address += fix->fix_size; | ||
5976 | + else | ||
5977 | + { | ||
5978 | + /* Note the insertion point if necessary. */ | ||
5979 | + if (mp->min_address < min_address) | ||
5980 | + { | ||
5981 | + min_mp = mp; | ||
5982 | + } | ||
5983 | + else if (mp->max_address | ||
5984 | + < minipool_barrier->address + mp->offset + fix->fix_size) | ||
5985 | + { | ||
5986 | + /* Inserting before this entry would push the fix beyond its | ||
5987 | + maximum address (which can happen if we have re-located a | ||
5988 | + forwards fix); force the new fix to come after it. */ | ||
5989 | + min_mp = mp; | ||
5990 | + min_address = mp->min_address + fix->fix_size; | ||
5991 | + } | ||
5992 | + } | ||
5993 | + } | ||
5994 | + | ||
5995 | + /* We need to create a new entry. */ | ||
5996 | + mp = xmalloc (sizeof (*mp)); | ||
5997 | + mp->fix_size = fix->fix_size; | ||
5998 | + mp->mode = fix->mode; | ||
5999 | + mp->value = fix->value; | ||
6000 | + mp->refcount = 1; | ||
6001 | + mp->max_address = minipool_barrier->address + 65536; | ||
6002 | + | ||
6003 | + mp->min_address = min_address; | ||
6004 | + | ||
6005 | + if (min_mp == NULL) | ||
6006 | + { | ||
6007 | + mp->prev = NULL; | ||
6008 | + mp->next = minipool_vector_head; | ||
6009 | + | ||
6010 | + if (mp->next == NULL) | ||
6011 | + { | ||
6012 | + minipool_vector_tail = mp; | ||
6013 | + minipool_vector_label = gen_label_rtx (); | ||
6014 | + } | ||
6015 | + else | ||
6016 | + mp->next->prev = mp; | ||
6017 | + | ||
6018 | + minipool_vector_head = mp; | ||
6019 | + } | ||
6020 | + else | ||
6021 | + { | ||
6022 | + mp->next = min_mp->next; | ||
6023 | + mp->prev = min_mp; | ||
6024 | + min_mp->next = mp; | ||
6025 | + | ||
6026 | + if (mp->next != NULL) | ||
6027 | + mp->next->prev = mp; | ||
6028 | + else | ||
6029 | + minipool_vector_tail = mp; | ||
6030 | + } | ||
6031 | + | ||
6032 | + /* Save the new entry. */ | ||
6033 | + min_mp = mp; | ||
6034 | + | ||
6035 | + if (mp->prev) | ||
6036 | + mp = mp->prev; | ||
6037 | + else | ||
6038 | + mp->offset = 0; | ||
6039 | + | ||
6040 | + /* Scan over the following entries and adjust their offsets. */ | ||
6041 | + while (mp->next != NULL) | ||
6042 | + { | ||
6043 | + if (mp->next->min_address < mp->min_address + mp->fix_size) | ||
6044 | + mp->next->min_address = mp->min_address + mp->fix_size; | ||
6045 | + | ||
6046 | + if (mp->refcount) | ||
6047 | + mp->next->offset = mp->offset + mp->fix_size; | ||
6048 | + else | ||
6049 | + mp->next->offset = mp->offset; | ||
6050 | + | ||
6051 | + mp = mp->next; | ||
6052 | + } | ||
6053 | + | ||
6054 | + return min_mp; | ||
6055 | +} | ||
6056 | + | ||
6057 | +static void | ||
6058 | +assign_minipool_offsets (Mfix * barrier) | ||
6059 | +{ | ||
6060 | + HOST_WIDE_INT offset = 0; | ||
6061 | + Mnode *mp; | ||
6062 | + | ||
6063 | + minipool_barrier = barrier; | ||
6064 | + | ||
6065 | + for (mp = minipool_vector_head; mp != NULL; mp = mp->next) | ||
6066 | + { | ||
6067 | + mp->offset = offset; | ||
6068 | + | ||
6069 | + if (mp->refcount > 0 | ||
6070 | + /* If the value is (const_int 0) then this is a fake entry so don't | ||
6071 | + add an offset for it since it will not be output. */ | ||
6072 | + && !(GET_CODE (mp->value) == CONST_INT && INTVAL (mp->value) == 0)) | ||
6073 | + offset += mp->fix_size; | ||
6074 | + } | ||
6075 | +} | ||
6076 | + | ||
6077 | +/* Print a symbolic form of X to the debug file, F. */ | ||
6078 | +static void | ||
6079 | +avr32_print_value (FILE * f, rtx x) | ||
6080 | +{ | ||
6081 | + switch (GET_CODE (x)) | ||
6082 | + { | ||
6083 | + case CONST_INT: | ||
6084 | + fprintf (f, "0x%x", (int) INTVAL (x)); | ||
6085 | + return; | ||
6086 | + | ||
6087 | + case CONST_DOUBLE: | ||
6088 | + fprintf (f, "<0x%lx,0x%lx>", (long) XWINT (x, 2), (long) XWINT (x, 3)); | ||
6089 | + return; | ||
6090 | + | ||
6091 | + case CONST_VECTOR: | ||
6092 | + { | ||
6093 | + int i; | ||
6094 | + | ||
6095 | + fprintf (f, "<"); | ||
6096 | + for (i = 0; i < CONST_VECTOR_NUNITS (x); i++) | ||
6097 | + { | ||
6098 | + fprintf (f, "0x%x", (int) INTVAL (CONST_VECTOR_ELT (x, i))); | ||
6099 | + if (i < (CONST_VECTOR_NUNITS (x) - 1)) | ||
6100 | + fputc (',', f); | ||
6101 | + } | ||
6102 | + fprintf (f, ">"); | ||
6103 | + } | ||
6104 | + return; | ||
6105 | + | ||
6106 | + case CONST_STRING: | ||
6107 | + fprintf (f, "\"%s\"", XSTR (x, 0)); | ||
6108 | + return; | ||
6109 | + | ||
6110 | + case SYMBOL_REF: | ||
6111 | + fprintf (f, "`%s'", XSTR (x, 0)); | ||
6112 | + return; | ||
6113 | + | ||
6114 | + case LABEL_REF: | ||
6115 | + fprintf (f, "L%d", INSN_UID (XEXP (x, 0))); | ||
6116 | + return; | ||
6117 | + | ||
6118 | + case CONST: | ||
6119 | + avr32_print_value (f, XEXP (x, 0)); | ||
6120 | + return; | ||
6121 | + | ||
6122 | + case PLUS: | ||
6123 | + avr32_print_value (f, XEXP (x, 0)); | ||
6124 | + fprintf (f, "+"); | ||
6125 | + avr32_print_value (f, XEXP (x, 1)); | ||
6126 | + return; | ||
6127 | + | ||
6128 | + case PC: | ||
6129 | + fprintf (f, "pc"); | ||
6130 | + return; | ||
6131 | + | ||
6132 | + default: | ||
6133 | + fprintf (f, "????"); | ||
6134 | + return; | ||
6135 | + } | ||
6136 | +} | ||
6137 | + | ||
6138 | +int | ||
6139 | +is_minipool_label (rtx label) | ||
6140 | +{ | ||
6141 | + minipool_labels *cur_mp_label = cfun->machine->minipool_label_head; | ||
6142 | + | ||
6143 | + if (GET_CODE (label) != CODE_LABEL) | ||
6144 | + return FALSE; | ||
6145 | + | ||
6146 | + while (cur_mp_label) | ||
6147 | + { | ||
6148 | + if (CODE_LABEL_NUMBER (label) | ||
6149 | + == CODE_LABEL_NUMBER (cur_mp_label->label)) | ||
6150 | + return TRUE; | ||
6151 | + cur_mp_label = cur_mp_label->next; | ||
6152 | + } | ||
6153 | + return FALSE; | ||
6154 | +} | ||
6155 | + | ||
6156 | +static void | ||
6157 | +new_minipool_label (rtx label) | ||
6158 | +{ | ||
6159 | + if (!cfun->machine->minipool_label_head) | ||
6160 | + { | ||
6161 | + cfun->machine->minipool_label_head = | ||
6162 | + ggc_alloc (sizeof (minipool_labels)); | ||
6163 | + cfun->machine->minipool_label_tail = cfun->machine->minipool_label_head; | ||
6164 | + cfun->machine->minipool_label_head->label = label; | ||
6165 | + cfun->machine->minipool_label_head->next = 0; | ||
6166 | + cfun->machine->minipool_label_head->prev = 0; | ||
6167 | + } | ||
6168 | + else | ||
6169 | + { | ||
6170 | + cfun->machine->minipool_label_tail->next = | ||
6171 | + ggc_alloc (sizeof (minipool_labels)); | ||
6172 | + cfun->machine->minipool_label_tail->next->label = label; | ||
6173 | + cfun->machine->minipool_label_tail->next->next = 0; | ||
6174 | + cfun->machine->minipool_label_tail->next->prev = | ||
6175 | + cfun->machine->minipool_label_tail; | ||
6176 | + cfun->machine->minipool_label_tail = | ||
6177 | + cfun->machine->minipool_label_tail->next; | ||
6178 | + } | ||
6179 | +} | ||
6180 | + | ||
6181 | +/* Output the literal table */ | ||
6182 | +static void | ||
6183 | +dump_minipool (rtx scan) | ||
6184 | +{ | ||
6185 | + Mnode *mp; | ||
6186 | + Mnode *nmp; | ||
6187 | + | ||
6188 | + if (dump_file) | ||
6189 | + fprintf (dump_file, | ||
6190 | + ";; Emitting minipool after insn %u; address %ld; align %d (bytes)\n", | ||
6191 | + INSN_UID (scan), (unsigned long) minipool_barrier->address, 4); | ||
6192 | + | ||
6193 | + scan = emit_insn_after (gen_consttable_start (), scan); | ||
6194 | + scan = emit_insn_after (gen_align_4 (), scan); | ||
6195 | + scan = emit_label_after (minipool_vector_label, scan); | ||
6196 | + new_minipool_label (minipool_vector_label); | ||
6197 | + | ||
6198 | + for (mp = minipool_vector_head; mp != NULL; mp = nmp) | ||
6199 | + { | ||
6200 | + if (mp->refcount > 0) | ||
6201 | + { | ||
6202 | + if (dump_file) | ||
6203 | + { | ||
6204 | + fprintf (dump_file, | ||
6205 | + ";; Offset %u, min %ld, max %ld ", | ||
6206 | + (unsigned) mp->offset, (unsigned long) mp->min_address, | ||
6207 | + (unsigned long) mp->max_address); | ||
6208 | + avr32_print_value (dump_file, mp->value); | ||
6209 | + fputc ('\n', dump_file); | ||
6210 | + } | ||
6211 | + | ||
6212 | + switch (mp->fix_size) | ||
6213 | + { | ||
6214 | +#ifdef HAVE_consttable_4 | ||
6215 | + case 4: | ||
6216 | + scan = emit_insn_after (gen_consttable_4 (mp->value), scan); | ||
6217 | + break; | ||
6218 | + | ||
6219 | +#endif | ||
6220 | +#ifdef HAVE_consttable_8 | ||
6221 | + case 8: | ||
6222 | + scan = emit_insn_after (gen_consttable_8 (mp->value), scan); | ||
6223 | + break; | ||
6224 | + | ||
6225 | +#endif | ||
6226 | + case 0: | ||
6227 | + /* This can happen for force-minipool entries which just are | ||
6228 | + there to force the minipool to be generate. */ | ||
6229 | + break; | ||
6230 | + default: | ||
6231 | + abort (); | ||
6232 | + break; | ||
6233 | + } | ||
6234 | + } | ||
6235 | + | ||
6236 | + nmp = mp->next; | ||
6237 | + free (mp); | ||
6238 | + } | ||
6239 | + | ||
6240 | + minipool_vector_head = minipool_vector_tail = NULL; | ||
6241 | + scan = emit_insn_after (gen_consttable_end (), scan); | ||
6242 | + scan = emit_barrier_after (scan); | ||
6243 | +} | ||
6244 | + | ||
6245 | +/* Return the cost of forcibly inserting a barrier after INSN. */ | ||
6246 | +static int | ||
6247 | +avr32_barrier_cost (rtx insn) | ||
6248 | +{ | ||
6249 | + /* Basing the location of the pool on the loop depth is preferable, but at | ||
6250 | + the moment, the basic block information seems to be corrupt by this | ||
6251 | + stage of the compilation. */ | ||
6252 | + int base_cost = 50; | ||
6253 | + rtx next = next_nonnote_insn (insn); | ||
6254 | + | ||
6255 | + if (next != NULL && GET_CODE (next) == CODE_LABEL) | ||
6256 | + base_cost -= 20; | ||
6257 | + | ||
6258 | + switch (GET_CODE (insn)) | ||
6259 | + { | ||
6260 | + case CODE_LABEL: | ||
6261 | + /* It will always be better to place the table before the label, rather | ||
6262 | + than after it. */ | ||
6263 | + return 50; | ||
6264 | + | ||
6265 | + case INSN: | ||
6266 | + case CALL_INSN: | ||
6267 | + return base_cost; | ||
6268 | + | ||
6269 | + case JUMP_INSN: | ||
6270 | + return base_cost - 10; | ||
6271 | + | ||
6272 | + default: | ||
6273 | + return base_cost + 10; | ||
6274 | + } | ||
6275 | +} | ||
6276 | + | ||
6277 | +/* Find the best place in the insn stream in the range | ||
6278 | + (FIX->address,MAX_ADDRESS) to forcibly insert a minipool barrier. | ||
6279 | + Create the barrier by inserting a jump and add a new fix entry for | ||
6280 | + it. */ | ||
6281 | +static Mfix * | ||
6282 | +create_fix_barrier (Mfix * fix, HOST_WIDE_INT max_address) | ||
6283 | +{ | ||
6284 | + HOST_WIDE_INT count = 0; | ||
6285 | + rtx barrier; | ||
6286 | + rtx from = fix->insn; | ||
6287 | + rtx selected = from; | ||
6288 | + int selected_cost; | ||
6289 | + HOST_WIDE_INT selected_address; | ||
6290 | + Mfix *new_fix; | ||
6291 | + HOST_WIDE_INT max_count = max_address - fix->address; | ||
6292 | + rtx label = gen_label_rtx (); | ||
6293 | + | ||
6294 | + selected_cost = avr32_barrier_cost (from); | ||
6295 | + selected_address = fix->address; | ||
6296 | + | ||
6297 | + while (from && count < max_count) | ||
6298 | + { | ||
6299 | + rtx tmp; | ||
6300 | + int new_cost; | ||
6301 | + | ||
6302 | + /* This code shouldn't have been called if there was a natural barrier | ||
6303 | + within range. */ | ||
6304 | + if (GET_CODE (from) == BARRIER) | ||
6305 | + abort (); | ||
6306 | + | ||
6307 | + /* Count the length of this insn. */ | ||
6308 | + count += get_attr_length (from); | ||
6309 | + | ||
6310 | + /* If there is a jump table, add its length. */ | ||
6311 | + tmp = is_jump_table (from); | ||
6312 | + if (tmp != NULL) | ||
6313 | + { | ||
6314 | + count += get_jump_table_size (tmp); | ||
6315 | + | ||
6316 | + /* Jump tables aren't in a basic block, so base the cost on the | ||
6317 | + dispatch insn. If we select this location, we will still put | ||
6318 | + the pool after the table. */ | ||
6319 | + new_cost = avr32_barrier_cost (from); | ||
6320 | + | ||
6321 | + if (count < max_count && new_cost <= selected_cost) | ||
6322 | + { | ||
6323 | + selected = tmp; | ||
6324 | + selected_cost = new_cost; | ||
6325 | + selected_address = fix->address + count; | ||
6326 | + } | ||
6327 | + | ||
6328 | + /* Continue after the dispatch table. */ | ||
6329 | + from = NEXT_INSN (tmp); | ||
6330 | + continue; | ||
6331 | + } | ||
6332 | + | ||
6333 | + new_cost = avr32_barrier_cost (from); | ||
6334 | + | ||
6335 | + if (count < max_count && new_cost <= selected_cost) | ||
6336 | + { | ||
6337 | + selected = from; | ||
6338 | + selected_cost = new_cost; | ||
6339 | + selected_address = fix->address + count; | ||
6340 | + } | ||
6341 | + | ||
6342 | + from = NEXT_INSN (from); | ||
6343 | + } | ||
6344 | + | ||
6345 | + /* Create a new JUMP_INSN that branches around a barrier. */ | ||
6346 | + from = emit_jump_insn_after (gen_jump (label), selected); | ||
6347 | + JUMP_LABEL (from) = label; | ||
6348 | + barrier = emit_barrier_after (from); | ||
6349 | + emit_label_after (label, barrier); | ||
6350 | + | ||
6351 | + /* Create a minipool barrier entry for the new barrier. */ | ||
6352 | + new_fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (*new_fix)); | ||
6353 | + new_fix->insn = barrier; | ||
6354 | + new_fix->address = selected_address; | ||
6355 | + new_fix->next = fix->next; | ||
6356 | + fix->next = new_fix; | ||
6357 | + | ||
6358 | + return new_fix; | ||
6359 | +} | ||
6360 | + | ||
6361 | +/* Record that there is a natural barrier in the insn stream at | ||
6362 | + ADDRESS. */ | ||
6363 | +static void | ||
6364 | +push_minipool_barrier (rtx insn, HOST_WIDE_INT address) | ||
6365 | +{ | ||
6366 | + Mfix *fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (*fix)); | ||
6367 | + | ||
6368 | + fix->insn = insn; | ||
6369 | + fix->address = address; | ||
6370 | + | ||
6371 | + fix->next = NULL; | ||
6372 | + if (minipool_fix_head != NULL) | ||
6373 | + minipool_fix_tail->next = fix; | ||
6374 | + else | ||
6375 | + minipool_fix_head = fix; | ||
6376 | + | ||
6377 | + minipool_fix_tail = fix; | ||
6378 | +} | ||
6379 | + | ||
6380 | +/* Record INSN, which will need fixing up to load a value from the | ||
6381 | + minipool. ADDRESS is the offset of the insn since the start of the | ||
6382 | + function; LOC is a pointer to the part of the insn which requires | ||
6383 | + fixing; VALUE is the constant that must be loaded, which is of type | ||
6384 | + MODE. */ | ||
6385 | +static void | ||
6386 | +push_minipool_fix (rtx insn, HOST_WIDE_INT address, rtx * loc, | ||
6387 | + enum machine_mode mode, rtx value) | ||
6388 | +{ | ||
6389 | + Mfix *fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (*fix)); | ||
6390 | + rtx body = PATTERN (insn); | ||
6391 | + | ||
6392 | + fix->insn = insn; | ||
6393 | + fix->address = address; | ||
6394 | + fix->loc = loc; | ||
6395 | + fix->mode = mode; | ||
6396 | + fix->fix_size = MINIPOOL_FIX_SIZE (mode, value); | ||
6397 | + fix->value = value; | ||
6398 | + | ||
6399 | + if (GET_CODE (body) == PARALLEL) | ||
6400 | + { | ||
6401 | + /* Mcall : Ks16 << 2 */ | ||
6402 | + fix->forwards = ((1 << 15) - 1) << 2; | ||
6403 | + fix->backwards = (1 << 15) << 2; | ||
6404 | + } | ||
6405 | + else if (GET_CODE (body) == SET | ||
6406 | + && GET_MODE_SIZE (GET_MODE (SET_DEST (body))) == 4) | ||
6407 | + { | ||
6408 | + /* Word Load */ | ||
6409 | + if (TARGET_HARD_FLOAT | ||
6410 | + && GET_MODE_CLASS (GET_MODE (SET_DEST (body))) == MODE_FLOAT) | ||
6411 | + { | ||
6412 | + /* Ldc0.w : Ku12 << 2 */ | ||
6413 | + fix->forwards = ((1 << 12) - 1) << 2; | ||
6414 | + fix->backwards = 0; | ||
6415 | + } | ||
6416 | + else | ||
6417 | + { | ||
6418 | + if (optimize_size) | ||
6419 | + { | ||
6420 | + /* Lddpc : Ku7 << 2 */ | ||
6421 | + fix->forwards = ((1 << 7) - 1) << 2; | ||
6422 | + fix->backwards = 0; | ||
6423 | + } | ||
6424 | + else | ||
6425 | + { | ||
6426 | + /* Ld.w : Ks16 */ | ||
6427 | + fix->forwards = ((1 << 15) - 4); | ||
6428 | + fix->backwards = (1 << 15); | ||
6429 | + } | ||
6430 | + } | ||
6431 | + } | ||
6432 | + else if (GET_CODE (body) == SET | ||
6433 | + && GET_MODE_SIZE (GET_MODE (SET_DEST (body))) == 8) | ||
6434 | + { | ||
6435 | + /* Double word load */ | ||
6436 | + if (TARGET_HARD_FLOAT | ||
6437 | + && GET_MODE_CLASS (GET_MODE (SET_DEST (body))) == MODE_FLOAT) | ||
6438 | + { | ||
6439 | + /* Ldc0.d : Ku12 << 2 */ | ||
6440 | + fix->forwards = ((1 << 12) - 1) << 2; | ||
6441 | + fix->backwards = 0; | ||
6442 | + } | ||
6443 | + else | ||
6444 | + { | ||
6445 | + /* Ld.d : Ks16 */ | ||
6446 | + fix->forwards = ((1 << 15) - 4); | ||
6447 | + fix->backwards = (1 << 15); | ||
6448 | + } | ||
6449 | + } | ||
6450 | + else if (GET_CODE (body) == UNSPEC_VOLATILE | ||
6451 | + && XINT (body, 1) == VUNSPEC_MVRC) | ||
6452 | + { | ||
6453 | + /* Coprocessor load */ | ||
6454 | + /* Ldc : Ku8 << 2 */ | ||
6455 | + fix->forwards = ((1 << 8) - 1) << 2; | ||
6456 | + fix->backwards = 0; | ||
6457 | + } | ||
6458 | + else | ||
6459 | + { | ||
6460 | + /* Assume worst case which is lddpc insn. */ | ||
6461 | + fix->forwards = ((1 << 7) - 1) << 2; | ||
6462 | + fix->backwards = 0; | ||
6463 | + } | ||
6464 | + | ||
6465 | + fix->minipool = NULL; | ||
6466 | + | ||
6467 | + /* If an insn doesn't have a range defined for it, then it isn't expecting | ||
6468 | + to be reworked by this code. Better to abort now than to generate duff | ||
6469 | + assembly code. */ | ||
6470 | + if (fix->forwards == 0 && fix->backwards == 0) | ||
6471 | + abort (); | ||
6472 | + | ||
6473 | + if (dump_file) | ||
6474 | + { | ||
6475 | + fprintf (dump_file, | ||
6476 | + ";; %smode fixup for i%d; addr %lu, range (%ld,%ld): ", | ||
6477 | + GET_MODE_NAME (mode), | ||
6478 | + INSN_UID (insn), (unsigned long) address, | ||
6479 | + -1 * (long) fix->backwards, (long) fix->forwards); | ||
6480 | + avr32_print_value (dump_file, fix->value); | ||
6481 | + fprintf (dump_file, "\n"); | ||
6482 | + } | ||
6483 | + | ||
6484 | + /* Add it to the chain of fixes. */ | ||
6485 | + fix->next = NULL; | ||
6486 | + | ||
6487 | + if (minipool_fix_head != NULL) | ||
6488 | + minipool_fix_tail->next = fix; | ||
6489 | + else | ||
6490 | + minipool_fix_head = fix; | ||
6491 | + | ||
6492 | + minipool_fix_tail = fix; | ||
6493 | +} | ||
6494 | + | ||
6495 | +/* Scan INSN and note any of its operands that need fixing. | ||
6496 | + If DO_PUSHES is false we do not actually push any of the fixups | ||
6497 | + needed. The function returns TRUE is any fixups were needed/pushed. | ||
6498 | + This is used by avr32_memory_load_p() which needs to know about loads | ||
6499 | + of constants that will be converted into minipool loads. */ | ||
6500 | +static bool | ||
6501 | +note_invalid_constants (rtx insn, HOST_WIDE_INT address, int do_pushes) | ||
6502 | +{ | ||
6503 | + bool result = false; | ||
6504 | + int opno; | ||
6505 | + | ||
6506 | + extract_insn (insn); | ||
6507 | + | ||
6508 | + if (!constrain_operands (1)) | ||
6509 | + fatal_insn_not_found (insn); | ||
6510 | + | ||
6511 | + if (recog_data.n_alternatives == 0) | ||
6512 | + return false; | ||
6513 | + | ||
6514 | + /* Fill in recog_op_alt with information about the constraints of this | ||
6515 | + insn. */ | ||
6516 | + preprocess_constraints (); | ||
6517 | + | ||
6518 | + for (opno = 0; opno < recog_data.n_operands; opno++) | ||
6519 | + { | ||
6520 | + rtx op; | ||
6521 | + | ||
6522 | + /* Things we need to fix can only occur in inputs. */ | ||
6523 | + if (recog_data.operand_type[opno] != OP_IN) | ||
6524 | + continue; | ||
6525 | + | ||
6526 | + op = recog_data.operand[opno]; | ||
6527 | + | ||
6528 | + if (avr32_const_pool_ref_operand (op, GET_MODE (op))) | ||
6529 | + { | ||
6530 | + if (do_pushes) | ||
6531 | + { | ||
6532 | + rtx cop = avoid_constant_pool_reference (op); | ||
6533 | + | ||
6534 | + /* Casting the address of something to a mode narrower than a | ||
6535 | + word can cause avoid_constant_pool_reference() to return the | ||
6536 | + pool reference itself. That's no good to us here. Lets | ||
6537 | + just hope that we can use the constant pool value directly. | ||
6538 | + */ | ||
6539 | + if (op == cop) | ||
6540 | + cop = get_pool_constant (XEXP (op, 0)); | ||
6541 | + | ||
6542 | + push_minipool_fix (insn, address, | ||
6543 | + recog_data.operand_loc[opno], | ||
6544 | + recog_data.operand_mode[opno], cop); | ||
6545 | + } | ||
6546 | + | ||
6547 | + result = true; | ||
6548 | + } | ||
6549 | + else if (TARGET_HAS_ASM_ADDR_PSEUDOS | ||
6550 | + && avr32_address_operand (op, GET_MODE (op))) | ||
6551 | + { | ||
6552 | + /* Handle pseudo instructions using a direct address. These pseudo | ||
6553 | + instructions might need entries in the constant pool and we must | ||
6554 | + therefor create a constant pool for them, in case the | ||
6555 | + assembler/linker needs to insert entries. */ | ||
6556 | + if (do_pushes) | ||
6557 | + { | ||
6558 | + /* Push a dummy constant pool entry so that the .cpool | ||
6559 | + directive should be inserted on the appropriate place in the | ||
6560 | + code even if there are no real constant pool entries. This | ||
6561 | + is used by the assembler and linker to know where to put | ||
6562 | + generated constant pool entries. */ | ||
6563 | + push_minipool_fix (insn, address, | ||
6564 | + recog_data.operand_loc[opno], | ||
6565 | + recog_data.operand_mode[opno], | ||
6566 | + gen_rtx_UNSPEC (VOIDmode, | ||
6567 | + gen_rtvec (1, const0_rtx), | ||
6568 | + UNSPEC_FORCE_MINIPOOL)); | ||
6569 | + result = true; | ||
6570 | + } | ||
6571 | + } | ||
6572 | + } | ||
6573 | + return result; | ||
6574 | +} | ||
6575 | + | ||
6576 | + | ||
6577 | +static int | ||
6578 | +avr32_insn_is_cast (rtx insn) | ||
6579 | +{ | ||
6580 | + | ||
6581 | + if (NONJUMP_INSN_P (insn) | ||
6582 | + && GET_CODE (PATTERN (insn)) == SET | ||
6583 | + && (GET_CODE (SET_SRC (PATTERN (insn))) == ZERO_EXTEND | ||
6584 | + || GET_CODE (SET_SRC (PATTERN (insn))) == SIGN_EXTEND) | ||
6585 | + && REG_P (XEXP (SET_SRC (PATTERN (insn)), 0)) | ||
6586 | + && REG_P (SET_DEST (PATTERN (insn)))) | ||
6587 | + return true; | ||
6588 | + return false; | ||
6589 | +} | ||
6590 | + | ||
6591 | +/* FIXME: The level of nesting in this function is way too deep. It needs to be | ||
6592 | + torn apart. */ | ||
6593 | +static void | ||
6594 | +avr32_reorg_optimization (void) | ||
6595 | +{ | ||
6596 | + rtx first = get_insns (); | ||
6597 | + rtx insn; | ||
6598 | + | ||
6599 | + if (TARGET_MD_REORG_OPTIMIZATION && (optimize_size || (optimize > 0))) | ||
6600 | + { | ||
6601 | + | ||
6602 | + /* Scan through all insns looking for cast operations. */ | ||
6603 | + if (dump_file) | ||
6604 | + { | ||
6605 | + fprintf (dump_file, ";; Deleting redundant cast operations:\n"); | ||
6606 | + } | ||
6607 | + for (insn = first; insn; insn = NEXT_INSN (insn)) | ||
6608 | + { | ||
6609 | + rtx reg, src_reg, scan; | ||
6610 | + enum machine_mode mode; | ||
6611 | + int unused_cast; | ||
6612 | + rtx label_ref; | ||
6613 | + | ||
6614 | + if (avr32_insn_is_cast (insn) | ||
6615 | + && (GET_MODE (XEXP (SET_SRC (PATTERN (insn)), 0)) == QImode | ||
6616 | + || GET_MODE (XEXP (SET_SRC (PATTERN (insn)), 0)) == HImode)) | ||
6617 | + { | ||
6618 | + mode = GET_MODE (XEXP (SET_SRC (PATTERN (insn)), 0)); | ||
6619 | + reg = SET_DEST (PATTERN (insn)); | ||
6620 | + src_reg = XEXP (SET_SRC (PATTERN (insn)), 0); | ||
6621 | + } | ||
6622 | + else | ||
6623 | + { | ||
6624 | + continue; | ||
6625 | + } | ||
6626 | + | ||
6627 | + unused_cast = false; | ||
6628 | + label_ref = NULL_RTX; | ||
6629 | + for (scan = NEXT_INSN (insn); scan; scan = NEXT_INSN (scan)) | ||
6630 | + { | ||
6631 | + /* Check if we have reached the destination of a simple | ||
6632 | + conditional jump which we have already scanned past. If so, | ||
6633 | + we can safely continue scanning. */ | ||
6634 | + if (LABEL_P (scan) && label_ref != NULL_RTX) | ||
6635 | + { | ||
6636 | + if (CODE_LABEL_NUMBER (scan) == | ||
6637 | + CODE_LABEL_NUMBER (XEXP (label_ref, 0))) | ||
6638 | + label_ref = NULL_RTX; | ||
6639 | + else | ||
6640 | + break; | ||
6641 | + } | ||
6642 | + | ||
6643 | + if (!INSN_P (scan)) | ||
6644 | + continue; | ||
6645 | + | ||
6646 | + /* For conditional jumps we can manage to keep on scanning if | ||
6647 | + we meet the destination label later on before any new jump | ||
6648 | + insns occure. */ | ||
6649 | + if (GET_CODE (scan) == JUMP_INSN) | ||
6650 | + { | ||
6651 | + if (any_condjump_p (scan) && label_ref == NULL_RTX) | ||
6652 | + label_ref = condjump_label (scan); | ||
6653 | + else | ||
6654 | + break; | ||
6655 | + } | ||
6656 | + | ||
6657 | + if (!reg_mentioned_p (reg, PATTERN (scan))) | ||
6658 | + continue; | ||
6659 | + | ||
6660 | + /* Check if casted register is used in this insn */ | ||
6661 | + if ((regno_use_in (REGNO (reg), PATTERN (scan)) != NULL_RTX) | ||
6662 | + && (GET_MODE (regno_use_in (REGNO (reg), PATTERN (scan))) == | ||
6663 | + GET_MODE (reg))) | ||
6664 | + { | ||
6665 | + /* If not used in the source to the set or in a memory | ||
6666 | + expression in the destiantion then the register is used | ||
6667 | + as a destination and is really dead. */ | ||
6668 | + if (single_set (scan) | ||
6669 | + && GET_CODE (PATTERN (scan)) == SET | ||
6670 | + && REG_P (SET_DEST (PATTERN (scan))) | ||
6671 | + && !regno_use_in (REGNO (reg), SET_SRC (PATTERN (scan))) | ||
6672 | + && label_ref == NULL_RTX) | ||
6673 | + { | ||
6674 | + unused_cast = true; | ||
6675 | + } | ||
6676 | + break; | ||
6677 | + } | ||
6678 | + | ||
6679 | + /* Check if register is dead or set in this insn */ | ||
6680 | + if (dead_or_set_p (scan, reg)) | ||
6681 | + { | ||
6682 | + unused_cast = true; | ||
6683 | + break; | ||
6684 | + } | ||
6685 | + } | ||
6686 | + | ||
6687 | + /* Check if we have unresolved conditional jumps */ | ||
6688 | + if (label_ref != NULL_RTX) | ||
6689 | + continue; | ||
6690 | + | ||
6691 | + if (unused_cast) | ||
6692 | + { | ||
6693 | + if (REGNO (reg) == REGNO (XEXP (SET_SRC (PATTERN (insn)), 0))) | ||
6694 | + { | ||
6695 | + /* One operand cast, safe to delete */ | ||
6696 | + if (dump_file) | ||
6697 | + { | ||
6698 | + fprintf (dump_file, | ||
6699 | + ";; INSN %i removed, casted register %i value not used.\n", | ||
6700 | + INSN_UID (insn), REGNO (reg)); | ||
6701 | + } | ||
6702 | + SET_INSN_DELETED (insn); | ||
6703 | + /* Force the instruction to be recognized again */ | ||
6704 | + INSN_CODE (insn) = -1; | ||
6705 | + } | ||
6706 | + else | ||
6707 | + { | ||
6708 | + /* Two operand cast, which really could be substituted with | ||
6709 | + a move, if the source register is dead after the cast | ||
6710 | + insn and then the insn which sets the source register | ||
6711 | + could instead directly set the destination register for | ||
6712 | + the cast. As long as there are no insns in between which | ||
6713 | + uses the register. */ | ||
6714 | + rtx link = NULL_RTX; | ||
6715 | + rtx set; | ||
6716 | + rtx src_reg = XEXP (SET_SRC (PATTERN (insn)), 0); | ||
6717 | + unused_cast = false; | ||
6718 | + | ||
6719 | + if (!find_reg_note (insn, REG_DEAD, src_reg)) | ||
6720 | + continue; | ||
6721 | + | ||
6722 | + /* Search for the insn which sets the source register */ | ||
6723 | + for (link = LOG_LINKS (insn); link; link = XEXP (link, 1)) | ||
6724 | + { | ||
6725 | + if (REG_NOTE_KIND (link) != 0) | ||
6726 | + continue; | ||
6727 | + set = single_set (XEXP (link, 0)); | ||
6728 | + if (set && rtx_equal_p (src_reg, SET_DEST (set))) | ||
6729 | + { | ||
6730 | + link = XEXP (link, 0); | ||
6731 | + break; | ||
6732 | + } | ||
6733 | + } | ||
6734 | + | ||
6735 | + /* Found no link or link is a call insn where we can not | ||
6736 | + change the destination register */ | ||
6737 | + if (link == NULL_RTX || CALL_P (link)) | ||
6738 | + continue; | ||
6739 | + | ||
6740 | + /* Scan through all insn between link and insn */ | ||
6741 | + for (scan = NEXT_INSN (link); scan; scan = NEXT_INSN (scan)) | ||
6742 | + { | ||
6743 | + /* Don't try to trace forward past a CODE_LABEL if we | ||
6744 | + haven't seen INSN yet. Ordinarily, we will only | ||
6745 | + find the setting insn in LOG_LINKS if it is in the | ||
6746 | + same basic block. However, cross-jumping can insert | ||
6747 | + code labels in between the load and the call, and | ||
6748 | + can result in situations where a single call insn | ||
6749 | + may have two targets depending on where we came | ||
6750 | + from. */ | ||
6751 | + | ||
6752 | + if (GET_CODE (scan) == CODE_LABEL) | ||
6753 | + break; | ||
6754 | + | ||
6755 | + if (!INSN_P (scan)) | ||
6756 | + continue; | ||
6757 | + | ||
6758 | + /* Don't try to trace forward past a JUMP. To optimize | ||
6759 | + safely, we would have to check that all the | ||
6760 | + instructions at the jump destination did not use REG. | ||
6761 | + */ | ||
6762 | + | ||
6763 | + if (GET_CODE (scan) == JUMP_INSN) | ||
6764 | + { | ||
6765 | + break; | ||
6766 | + } | ||
6767 | + | ||
6768 | + if (!reg_mentioned_p (src_reg, PATTERN (scan))) | ||
6769 | + continue; | ||
6770 | + | ||
6771 | + /* We have reached the cast insn */ | ||
6772 | + if (scan == insn) | ||
6773 | + { | ||
6774 | + /* We can remove cast and replace the destination | ||
6775 | + register of the link insn with the destination | ||
6776 | + of the cast */ | ||
6777 | + if (dump_file) | ||
6778 | + { | ||
6779 | + fprintf (dump_file, | ||
6780 | + ";; INSN %i removed, casted value unused. " | ||
6781 | + "Destination of removed cast operation: register %i, folded into INSN %i.\n", | ||
6782 | + INSN_UID (insn), REGNO (reg), | ||
6783 | + INSN_UID (link)); | ||
6784 | + } | ||
6785 | + /* Update link insn */ | ||
6786 | + SET_DEST (PATTERN (link)) = | ||
6787 | + gen_rtx_REG (mode, REGNO (reg)); | ||
6788 | + /* Force the instruction to be recognized again */ | ||
6789 | + INSN_CODE (link) = -1; | ||
6790 | + | ||
6791 | + /* Delete insn */ | ||
6792 | + SET_INSN_DELETED (insn); | ||
6793 | + /* Force the instruction to be recognized again */ | ||
6794 | + INSN_CODE (insn) = -1; | ||
6795 | + break; | ||
6796 | + } | ||
6797 | + } | ||
6798 | + } | ||
6799 | + } | ||
6800 | + } | ||
6801 | + } | ||
6802 | + | ||
6803 | + if (TARGET_MD_REORG_OPTIMIZATION && (optimize_size || (optimize > 0))) | ||
6804 | + { | ||
6805 | + | ||
6806 | + /* Scan through all insns looking for shifted add operations */ | ||
6807 | + if (dump_file) | ||
6808 | + { | ||
6809 | + fprintf (dump_file, | ||
6810 | + ";; Deleting redundant shifted add operations:\n"); | ||
6811 | + } | ||
6812 | + for (insn = first; insn; insn = NEXT_INSN (insn)) | ||
6813 | + { | ||
6814 | + rtx reg, mem_expr, scan, op0, op1; | ||
6815 | + int add_only_used_as_pointer; | ||
6816 | + | ||
6817 | + if (INSN_P (insn) | ||
6818 | + && GET_CODE (PATTERN (insn)) == SET | ||
6819 | + && GET_CODE (SET_SRC (PATTERN (insn))) == PLUS | ||
6820 | + && (GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 0)) == MULT | ||
6821 | + || GET_CODE (XEXP (SET_SRC (PATTERN (insn)), 0)) == ASHIFT) | ||
6822 | + && GET_CODE (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 1)) == | ||
6823 | + CONST_INT && REG_P (SET_DEST (PATTERN (insn))) | ||
6824 | + && REG_P (XEXP (SET_SRC (PATTERN (insn)), 1)) | ||
6825 | + && REG_P (XEXP (XEXP (SET_SRC (PATTERN (insn)), 0), 0))) | ||
6826 | + { | ||
6827 | + reg = SET_DEST (PATTERN (insn)); | ||
6828 | + mem_expr = SET_SRC (PATTERN (insn)); | ||
6829 | + op0 = XEXP (XEXP (mem_expr, 0), 0); | ||
6830 | + op1 = XEXP (mem_expr, 1); | ||
6831 | + } | ||
6832 | + else | ||
6833 | + { | ||
6834 | + continue; | ||
6835 | + } | ||
6836 | + | ||
6837 | + /* Scan forward the check if the result of the shifted add | ||
6838 | + operation is only used as an address in memory operations and | ||
6839 | + that the operands to the shifted add are not clobbered. */ | ||
6840 | + add_only_used_as_pointer = false; | ||
6841 | + for (scan = NEXT_INSN (insn); scan; scan = NEXT_INSN (scan)) | ||
6842 | + { | ||
6843 | + if (!INSN_P (scan)) | ||
6844 | + continue; | ||
6845 | + | ||
6846 | + /* Don't try to trace forward past a JUMP or CALL. To optimize | ||
6847 | + safely, we would have to check that all the instructions at | ||
6848 | + the jump destination did not use REG. */ | ||
6849 | + | ||
6850 | + if (GET_CODE (scan) == JUMP_INSN) | ||
6851 | + { | ||
6852 | + break; | ||
6853 | + } | ||
6854 | + | ||
6855 | + /* If used in a call insn then we cannot optimize it away */ | ||
6856 | + if (CALL_P (scan) && find_regno_fusage (scan, USE, REGNO (reg))) | ||
6857 | + break; | ||
6858 | + | ||
6859 | + /* If any of the operands of the shifted add are clobbered we | ||
6860 | + cannot optimize the shifted adda away */ | ||
6861 | + if ((reg_set_p (op0, scan) && (REGNO (op0) != REGNO (reg))) | ||
6862 | + || (reg_set_p (op1, scan) && (REGNO (op1) != REGNO (reg)))) | ||
6863 | + break; | ||
6864 | + | ||
6865 | + if (!reg_mentioned_p (reg, PATTERN (scan))) | ||
6866 | + continue; | ||
6867 | + | ||
6868 | + /* If used any other place than as a pointer or as the | ||
6869 | + destination register we failed */ | ||
6870 | + if (!(single_set (scan) | ||
6871 | + && GET_CODE (PATTERN (scan)) == SET | ||
6872 | + && ((MEM_P (SET_DEST (PATTERN (scan))) | ||
6873 | + && REG_P (XEXP (SET_DEST (PATTERN (scan)), 0)) | ||
6874 | + && REGNO (XEXP (SET_DEST (PATTERN (scan)), 0)) == | ||
6875 | + REGNO (reg)) || (MEM_P (SET_SRC (PATTERN (scan))) | ||
6876 | + && | ||
6877 | + REG_P (XEXP | ||
6878 | + (SET_SRC (PATTERN (scan)), | ||
6879 | + 0)) | ||
6880 | + && | ||
6881 | + REGNO (XEXP | ||
6882 | + (SET_SRC (PATTERN (scan)), | ||
6883 | + 0)) == REGNO (reg)))) | ||
6884 | + && !(GET_CODE (PATTERN (scan)) == SET | ||
6885 | + && REG_P (SET_DEST (PATTERN (scan))) | ||
6886 | + && !regno_use_in (REGNO (reg), | ||
6887 | + SET_SRC (PATTERN (scan))))) | ||
6888 | + break; | ||
6889 | + | ||
6890 | + /* Check if register is dead or set in this insn */ | ||
6891 | + if (dead_or_set_p (scan, reg)) | ||
6892 | + { | ||
6893 | + add_only_used_as_pointer = true; | ||
6894 | + break; | ||
6895 | + } | ||
6896 | + } | ||
6897 | + | ||
6898 | + if (add_only_used_as_pointer) | ||
6899 | + { | ||
6900 | + /* Lets delete the add insn and replace all memory references | ||
6901 | + which uses the pointer with the full expression. */ | ||
6902 | + if (dump_file) | ||
6903 | + { | ||
6904 | + fprintf (dump_file, | ||
6905 | + ";; Deleting INSN %i since address expression can be folded into all " | ||
6906 | + "memory references using this expression\n", | ||
6907 | + INSN_UID (insn)); | ||
6908 | + } | ||
6909 | + SET_INSN_DELETED (insn); | ||
6910 | + /* Force the instruction to be recognized again */ | ||
6911 | + INSN_CODE (insn) = -1; | ||
6912 | + | ||
6913 | + for (scan = NEXT_INSN (insn); scan; scan = NEXT_INSN (scan)) | ||
6914 | + { | ||
6915 | + if (!INSN_P (scan)) | ||
6916 | + continue; | ||
6917 | + | ||
6918 | + if (!reg_mentioned_p (reg, PATTERN (scan))) | ||
6919 | + continue; | ||
6920 | + | ||
6921 | + /* If used any other place than as a pointer or as the | ||
6922 | + destination register we failed */ | ||
6923 | + if ((single_set (scan) | ||
6924 | + && GET_CODE (PATTERN (scan)) == SET | ||
6925 | + && ((MEM_P (SET_DEST (PATTERN (scan))) | ||
6926 | + && REG_P (XEXP (SET_DEST (PATTERN (scan)), 0)) | ||
6927 | + && REGNO (XEXP (SET_DEST (PATTERN (scan)), 0)) == | ||
6928 | + REGNO (reg)) || (MEM_P (SET_SRC (PATTERN (scan))) | ||
6929 | + && | ||
6930 | + REG_P (XEXP | ||
6931 | + (SET_SRC (PATTERN (scan)), | ||
6932 | + 0)) | ||
6933 | + && | ||
6934 | + REGNO (XEXP | ||
6935 | + (SET_SRC (PATTERN (scan)), | ||
6936 | + 0)) == REGNO (reg))))) | ||
6937 | + { | ||
6938 | + if (dump_file) | ||
6939 | + { | ||
6940 | + fprintf (dump_file, | ||
6941 | + ";; Register %i replaced by indexed address in INSN %i\n", | ||
6942 | + REGNO (reg), INSN_UID (scan)); | ||
6943 | + } | ||
6944 | + if (MEM_P (SET_DEST (PATTERN (scan)))) | ||
6945 | + XEXP (SET_DEST (PATTERN (scan)), 0) = mem_expr; | ||
6946 | + else | ||
6947 | + XEXP (SET_SRC (PATTERN (scan)), 0) = mem_expr; | ||
6948 | + } | ||
6949 | + | ||
6950 | + /* Check if register is dead or set in this insn */ | ||
6951 | + if (dead_or_set_p (scan, reg)) | ||
6952 | + { | ||
6953 | + break; | ||
6954 | + } | ||
6955 | + | ||
6956 | + } | ||
6957 | + } | ||
6958 | + } | ||
6959 | + } | ||
6960 | +} | ||
6961 | + | ||
6962 | +/* Exported to toplev.c. | ||
6963 | + | ||
6964 | + Do a final pass over the function, just before delayed branch | ||
6965 | + scheduling. */ | ||
6966 | + | ||
6967 | +static void | ||
6968 | +avr32_reorg (void) | ||
6969 | +{ | ||
6970 | + rtx insn; | ||
6971 | + HOST_WIDE_INT address = 0; | ||
6972 | + Mfix *fix; | ||
6973 | + | ||
6974 | + minipool_fix_head = minipool_fix_tail = NULL; | ||
6975 | + | ||
6976 | + /* The first insn must always be a note, or the code below won't scan it | ||
6977 | + properly. */ | ||
6978 | + insn = get_insns (); | ||
6979 | + if (GET_CODE (insn) != NOTE) | ||
6980 | + abort (); | ||
6981 | + | ||
6982 | + /* Scan all the insns and record the operands that will need fixing. */ | ||
6983 | + for (insn = next_nonnote_insn (insn); insn; insn = next_nonnote_insn (insn)) | ||
6984 | + { | ||
6985 | + if (GET_CODE (insn) == BARRIER) | ||
6986 | + push_minipool_barrier (insn, address); | ||
6987 | + else if (INSN_P (insn)) | ||
6988 | + { | ||
6989 | + rtx table; | ||
6990 | + | ||
6991 | + note_invalid_constants (insn, address, true); | ||
6992 | + address += get_attr_length (insn); | ||
6993 | + | ||
6994 | + /* If the insn is a vector jump, add the size of the table and skip | ||
6995 | + the table. */ | ||
6996 | + if ((table = is_jump_table (insn)) != NULL) | ||
6997 | + { | ||
6998 | + address += get_jump_table_size (table); | ||
6999 | + insn = table; | ||
7000 | + } | ||
7001 | + } | ||
7002 | + } | ||
7003 | + | ||
7004 | + fix = minipool_fix_head; | ||
7005 | + | ||
7006 | + /* Now scan the fixups and perform the required changes. */ | ||
7007 | + while (fix) | ||
7008 | + { | ||
7009 | + Mfix *ftmp; | ||
7010 | + Mfix *fdel; | ||
7011 | + Mfix *last_added_fix; | ||
7012 | + Mfix *last_barrier = NULL; | ||
7013 | + Mfix *this_fix; | ||
7014 | + | ||
7015 | + /* Skip any further barriers before the next fix. */ | ||
7016 | + while (fix && GET_CODE (fix->insn) == BARRIER) | ||
7017 | + fix = fix->next; | ||
7018 | + | ||
7019 | + /* No more fixes. */ | ||
7020 | + if (fix == NULL) | ||
7021 | + break; | ||
7022 | + | ||
7023 | + last_added_fix = NULL; | ||
7024 | + | ||
7025 | + for (ftmp = fix; ftmp; ftmp = ftmp->next) | ||
7026 | + { | ||
7027 | + if (GET_CODE (ftmp->insn) == BARRIER) | ||
7028 | + { | ||
7029 | + if (ftmp->address >= minipool_vector_head->max_address) | ||
7030 | + break; | ||
7031 | + | ||
7032 | + last_barrier = ftmp; | ||
7033 | + } | ||
7034 | + else if ((ftmp->minipool = add_minipool_forward_ref (ftmp)) == NULL) | ||
7035 | + break; | ||
7036 | + | ||
7037 | + last_added_fix = ftmp; /* Keep track of the last fix added. | ||
7038 | + */ | ||
7039 | + } | ||
7040 | + | ||
7041 | + /* If we found a barrier, drop back to that; any fixes that we could | ||
7042 | + have reached but come after the barrier will now go in the next | ||
7043 | + mini-pool. */ | ||
7044 | + if (last_barrier != NULL) | ||
7045 | + { | ||
7046 | + /* Reduce the refcount for those fixes that won't go into this pool | ||
7047 | + after all. */ | ||
7048 | + for (fdel = last_barrier->next; | ||
7049 | + fdel && fdel != ftmp; fdel = fdel->next) | ||
7050 | + { | ||
7051 | + fdel->minipool->refcount--; | ||
7052 | + fdel->minipool = NULL; | ||
7053 | + } | ||
7054 | + | ||
7055 | + ftmp = last_barrier; | ||
7056 | + } | ||
7057 | + else | ||
7058 | + { | ||
7059 | + /* ftmp is first fix that we can't fit into this pool and there no | ||
7060 | + natural barriers that we could use. Insert a new barrier in the | ||
7061 | + code somewhere between the previous fix and this one, and | ||
7062 | + arrange to jump around it. */ | ||
7063 | + HOST_WIDE_INT max_address; | ||
7064 | + | ||
7065 | + /* The last item on the list of fixes must be a barrier, so we can | ||
7066 | + never run off the end of the list of fixes without last_barrier | ||
7067 | + being set. */ | ||
7068 | + if (ftmp == NULL) | ||
7069 | + abort (); | ||
7070 | + | ||
7071 | + max_address = minipool_vector_head->max_address; | ||
7072 | + /* Check that there isn't another fix that is in range that we | ||
7073 | + couldn't fit into this pool because the pool was already too | ||
7074 | + large: we need to put the pool before such an instruction. */ | ||
7075 | + if (ftmp->address < max_address) | ||
7076 | + max_address = ftmp->address; | ||
7077 | + | ||
7078 | + last_barrier = create_fix_barrier (last_added_fix, max_address); | ||
7079 | + } | ||
7080 | + | ||
7081 | + assign_minipool_offsets (last_barrier); | ||
7082 | + | ||
7083 | + while (ftmp) | ||
7084 | + { | ||
7085 | + if (GET_CODE (ftmp->insn) != BARRIER | ||
7086 | + && ((ftmp->minipool = add_minipool_backward_ref (ftmp)) | ||
7087 | + == NULL)) | ||
7088 | + break; | ||
7089 | + | ||
7090 | + ftmp = ftmp->next; | ||
7091 | + } | ||
7092 | + | ||
7093 | + /* Scan over the fixes we have identified for this pool, fixing them up | ||
7094 | + and adding the constants to the pool itself. */ | ||
7095 | + for (this_fix = fix; this_fix && ftmp != this_fix; | ||
7096 | + this_fix = this_fix->next) | ||
7097 | + if (GET_CODE (this_fix->insn) != BARRIER | ||
7098 | + /* Do nothing for entries present just to force the insertion of | ||
7099 | + a minipool. */ | ||
7100 | + && !IS_FORCE_MINIPOOL (this_fix->value)) | ||
7101 | + { | ||
7102 | + rtx addr = plus_constant (gen_rtx_LABEL_REF (VOIDmode, | ||
7103 | + minipool_vector_label), | ||
7104 | + this_fix->minipool->offset); | ||
7105 | + *this_fix->loc = gen_rtx_MEM (this_fix->mode, addr); | ||
7106 | + } | ||
7107 | + | ||
7108 | + dump_minipool (last_barrier->insn); | ||
7109 | + fix = ftmp; | ||
7110 | + } | ||
7111 | + | ||
7112 | + /* Free the minipool memory. */ | ||
7113 | + obstack_free (&minipool_obstack, minipool_startobj); | ||
7114 | + | ||
7115 | + avr32_reorg_optimization (); | ||
7116 | +} | ||
7117 | + | ||
7118 | + | ||
7119 | +/* | ||
7120 | + Hook for doing some final scanning of instructions. Does nothing yet...*/ | ||
7121 | +void | ||
7122 | +avr32_final_prescan_insn (rtx insn ATTRIBUTE_UNUSED, | ||
7123 | + rtx * opvec ATTRIBUTE_UNUSED, | ||
7124 | + int noperands ATTRIBUTE_UNUSED) | ||
7125 | +{ | ||
7126 | + return; | ||
7127 | +} | ||
7128 | + | ||
7129 | + | ||
7130 | + | ||
7131 | +int | ||
7132 | +avr32_expand_movcc (enum machine_mode mode, rtx operands[]) | ||
7133 | +{ | ||
7134 | + rtx operator; | ||
7135 | + rtx compare_op0 = avr32_compare_op0; | ||
7136 | + rtx compare_op1 = avr32_compare_op1; | ||
7137 | + | ||
7138 | + /* Only allow certain compare operations */ | ||
7139 | + if (GET_MODE (compare_op0) != DImode | ||
7140 | + && GET_MODE (compare_op0) != SImode | ||
7141 | + && GET_MODE (compare_op0) != HImode && GET_MODE (compare_op0) != QImode) | ||
7142 | + return FALSE; | ||
7143 | + | ||
7144 | + if (GET_CODE (compare_op0) == MEM) | ||
7145 | + { | ||
7146 | + if (no_new_pseudos) | ||
7147 | + return FALSE; | ||
7148 | + else | ||
7149 | + compare_op0 = force_reg (GET_MODE (compare_op0), compare_op0); | ||
7150 | + } | ||
7151 | + | ||
7152 | + if (GET_CODE (compare_op1) == MEM) | ||
7153 | + { | ||
7154 | + if (no_new_pseudos) | ||
7155 | + return FALSE; | ||
7156 | + else | ||
7157 | + compare_op1 = force_reg (GET_MODE (compare_op1), compare_op1); | ||
7158 | + } | ||
7159 | + | ||
7160 | + /* For DI, HI and QI mode force comparison operands to registers */ | ||
7161 | + if (GET_MODE (compare_op0) == DImode | ||
7162 | + || GET_MODE (compare_op0) == HImode || GET_MODE (compare_op0) == QImode) | ||
7163 | + { | ||
7164 | + if (GET_CODE (compare_op0) != REG) | ||
7165 | + { | ||
7166 | + if (no_new_pseudos) | ||
7167 | + return FALSE; | ||
7168 | + else | ||
7169 | + compare_op0 = force_reg (GET_MODE (compare_op0), compare_op0); | ||
7170 | + } | ||
7171 | + | ||
7172 | + if (GET_CODE (compare_op1) != REG) | ||
7173 | + { | ||
7174 | + if (no_new_pseudos) | ||
7175 | + return FALSE; | ||
7176 | + else | ||
7177 | + compare_op1 = force_reg (GET_MODE (compare_op0), compare_op1); | ||
7178 | + } | ||
7179 | + } | ||
7180 | + | ||
7181 | + /* Force any immediate compare operands for SI, larger than the L | ||
7182 | + constraint, to a register */ | ||
7183 | + if (GET_MODE (compare_op0) == SImode) | ||
7184 | + { | ||
7185 | + if ((GET_CODE (compare_op0) == CONST_INT | ||
7186 | + && !avr32_const_ok_for_constraint_p (INTVAL (compare_op0), 'K', | ||
7187 | + "Ks21"))) | ||
7188 | + { | ||
7189 | + if (no_new_pseudos) | ||
7190 | + return FALSE; | ||
7191 | + else | ||
7192 | + compare_op0 = force_reg (SImode, compare_op0); | ||
7193 | + } | ||
7194 | + | ||
7195 | + if ((GET_CODE (compare_op1) == CONST_INT | ||
7196 | + && !avr32_const_ok_for_constraint_p (INTVAL (compare_op1), 'K', | ||
7197 | + "Ks21"))) | ||
7198 | + { | ||
7199 | + if (no_new_pseudos) | ||
7200 | + return FALSE; | ||
7201 | + else | ||
7202 | + compare_op1 = force_reg (SImode, compare_op1); | ||
7203 | + } | ||
7204 | + } | ||
7205 | + | ||
7206 | + /* If we have immediates larger than can be allowed in conditional mov | ||
7207 | + instructions, force them to registers */ | ||
7208 | + if (GET_CODE (operands[2]) == CONST_INT | ||
7209 | + && !avr32_const_ok_for_constraint_p (INTVAL (operands[2]), 'K', "Ks08")) | ||
7210 | + { | ||
7211 | + if (no_new_pseudos) | ||
7212 | + return FALSE; | ||
7213 | + else | ||
7214 | + operands[2] = force_reg (mode, operands[2]); | ||
7215 | + } | ||
7216 | + | ||
7217 | + if (GET_CODE (operands[3]) == CONST_INT | ||
7218 | + && !avr32_const_ok_for_constraint_p (INTVAL (operands[3]), 'K', "Ks08")) | ||
7219 | + { | ||
7220 | + if (no_new_pseudos) | ||
7221 | + return FALSE; | ||
7222 | + else | ||
7223 | + operands[3] = force_reg (mode, operands[3]); | ||
7224 | + } | ||
7225 | + | ||
7226 | + /* Emit the actual instruction */ | ||
7227 | + operator = gen_rtx_EQ (VOIDmode, const0_rtx, const0_rtx); | ||
7228 | + PUT_CODE (operator, GET_CODE (operands[1])); | ||
7229 | + switch (mode) | ||
7230 | + { | ||
7231 | + case SImode: | ||
7232 | + switch (GET_MODE (compare_op0)) | ||
7233 | + { | ||
7234 | + case SImode: | ||
7235 | + emit_insn (gen_movsicc_cmpsi | ||
7236 | + (operands[0], operator, operands[2], operands[3], | ||
7237 | + compare_op0, compare_op1)); | ||
7238 | + break; | ||
7239 | + case DImode: | ||
7240 | + emit_insn (gen_movsicc_cmpdi | ||
7241 | + (operands[0], operator, operands[2], operands[3], | ||
7242 | + compare_op0, compare_op1)); | ||
7243 | + break; | ||
7244 | + case HImode: | ||
7245 | + emit_insn (gen_movsicc_cmphi | ||
7246 | + (operands[0], operator, operands[2], operands[3], | ||
7247 | + compare_op0, compare_op1)); | ||
7248 | + break; | ||
7249 | + case QImode: | ||
7250 | + emit_insn (gen_movsicc_cmpqi | ||
7251 | + (operands[0], operator, operands[2], operands[3], | ||
7252 | + compare_op0, compare_op1)); | ||
7253 | + break; | ||
7254 | + default: | ||
7255 | + return FALSE; | ||
7256 | + } | ||
7257 | + break; | ||
7258 | + case HImode: | ||
7259 | + switch (GET_MODE (compare_op0)) | ||
7260 | + { | ||
7261 | + case SImode: | ||
7262 | + emit_insn (gen_movhicc_cmpsi | ||
7263 | + (operands[0], operator, operands[2], operands[3], | ||
7264 | + compare_op0, compare_op1)); | ||
7265 | + break; | ||
7266 | + case DImode: | ||
7267 | + emit_insn (gen_movhicc_cmpdi | ||
7268 | + (operands[0], operator, operands[2], operands[3], | ||
7269 | + compare_op0, compare_op1)); | ||
7270 | + break; | ||
7271 | + case HImode: | ||
7272 | + emit_insn (gen_movhicc_cmphi | ||
7273 | + (operands[0], operator, operands[2], operands[3], | ||
7274 | + compare_op0, compare_op1)); | ||
7275 | + break; | ||
7276 | + case QImode: | ||
7277 | + emit_insn (gen_movhicc_cmpqi | ||
7278 | + (operands[0], operator, operands[2], operands[3], | ||
7279 | + compare_op0, compare_op1)); | ||
7280 | + break; | ||
7281 | + default: | ||
7282 | + return FALSE; | ||
7283 | + } | ||
7284 | + break; | ||
7285 | + case QImode: | ||
7286 | + switch (GET_MODE (compare_op0)) | ||
7287 | + { | ||
7288 | + case SImode: | ||
7289 | + emit_insn (gen_movqicc_cmpsi | ||
7290 | + (operands[0], operator, operands[2], operands[3], | ||
7291 | + compare_op0, compare_op1)); | ||
7292 | + break; | ||
7293 | + case DImode: | ||
7294 | + emit_insn (gen_movqicc_cmpdi | ||
7295 | + (operands[0], operator, operands[2], operands[3], | ||
7296 | + compare_op0, compare_op1)); | ||
7297 | + break; | ||
7298 | + case HImode: | ||
7299 | + emit_insn (gen_movqicc_cmphi | ||
7300 | + (operands[0], operator, operands[2], operands[3], | ||
7301 | + compare_op0, compare_op1)); | ||
7302 | + break; | ||
7303 | + case QImode: | ||
7304 | + emit_insn (gen_movqicc_cmpqi | ||
7305 | + (operands[0], operator, operands[2], operands[3], | ||
7306 | + compare_op0, compare_op1)); | ||
7307 | + break; | ||
7308 | + default: | ||
7309 | + return FALSE; | ||
7310 | + } | ||
7311 | + break; | ||
7312 | + default: | ||
7313 | + return FALSE; | ||
7314 | + } | ||
7315 | + | ||
7316 | + return TRUE; | ||
7317 | +} | ||
7318 | + | ||
7319 | + | ||
7320 | +int | ||
7321 | +avr32_expand_addcc (enum machine_mode mode, rtx operands[]) | ||
7322 | +{ | ||
7323 | + rtx operator; | ||
7324 | + rtx compare_op0 = avr32_compare_op0; | ||
7325 | + rtx compare_op1 = avr32_compare_op1; | ||
7326 | + | ||
7327 | + /* Check if we have an add/sub with an k8 immediate */ | ||
7328 | + if (!(GET_CODE (operands[3]) == CONST_INT | ||
7329 | + && avr32_const_ok_for_constraint_p (-INTVAL (operands[3]), 'K', | ||
7330 | + "Ks08"))) | ||
7331 | + return FALSE; | ||
7332 | + else | ||
7333 | + /* Flip sign */ | ||
7334 | + operands[3] = GEN_INT (-INTVAL (operands[3])); | ||
7335 | + | ||
7336 | + /* Only allow certain compare operations */ | ||
7337 | + if (GET_MODE (compare_op0) != DImode | ||
7338 | + && GET_MODE (compare_op0) != SImode | ||
7339 | + && GET_MODE (compare_op0) != HImode && GET_MODE (compare_op0) != QImode) | ||
7340 | + return FALSE; | ||
7341 | + | ||
7342 | + if (GET_CODE (compare_op0) == MEM) | ||
7343 | + { | ||
7344 | + if (no_new_pseudos) | ||
7345 | + return FALSE; | ||
7346 | + else | ||
7347 | + compare_op0 = force_reg (GET_MODE (compare_op0), compare_op0); | ||
7348 | + } | ||
7349 | + | ||
7350 | + if (GET_CODE (compare_op1) == MEM) | ||
7351 | + { | ||
7352 | + if (no_new_pseudos) | ||
7353 | + return FALSE; | ||
7354 | + else | ||
7355 | + compare_op1 = force_reg (GET_MODE (compare_op1), compare_op1); | ||
7356 | + } | ||
7357 | + | ||
7358 | + /* For DI, HI and QI mode force comparison operands to registers */ | ||
7359 | + if (GET_MODE (compare_op0) == DImode | ||
7360 | + || GET_MODE (compare_op0) == HImode || GET_MODE (compare_op0) == QImode) | ||
7361 | + { | ||
7362 | + if (GET_CODE (compare_op0) != REG) | ||
7363 | + { | ||
7364 | + if (no_new_pseudos) | ||
7365 | + return FALSE; | ||
7366 | + else | ||
7367 | + compare_op0 = force_reg (GET_MODE (compare_op0), compare_op0); | ||
7368 | + } | ||
7369 | + | ||
7370 | + if (GET_CODE (compare_op1) != REG) | ||
7371 | + { | ||
7372 | + if (no_new_pseudos) | ||
7373 | + return FALSE; | ||
7374 | + else | ||
7375 | + compare_op1 = force_reg (GET_MODE (compare_op0), compare_op1); | ||
7376 | + } | ||
7377 | + } | ||
7378 | + | ||
7379 | + /* Force any immediate compare operands for SI, larger than the L | ||
7380 | + constraint, to a register */ | ||
7381 | + if (GET_MODE (compare_op0) == SImode) | ||
7382 | + { | ||
7383 | + if ((GET_CODE (compare_op0) == CONST_INT | ||
7384 | + && !avr32_const_ok_for_constraint_p (INTVAL (compare_op0), 'K', | ||
7385 | + "Ks21"))) | ||
7386 | + { | ||
7387 | + if (no_new_pseudos) | ||
7388 | + return FALSE; | ||
7389 | + else | ||
7390 | + compare_op0 = force_reg (SImode, compare_op0); | ||
7391 | + } | ||
7392 | + | ||
7393 | + if ((GET_CODE (compare_op1) == CONST_INT | ||
7394 | + && !avr32_const_ok_for_constraint_p (INTVAL (compare_op1), 'K', | ||
7395 | + "Ks21"))) | ||
7396 | + { | ||
7397 | + if (no_new_pseudos) | ||
7398 | + return FALSE; | ||
7399 | + else | ||
7400 | + compare_op1 = force_reg (SImode, compare_op1); | ||
7401 | + } | ||
7402 | + } | ||
7403 | + | ||
7404 | + /* If we have immediates larger than can be allowed in conditional mov | ||
7405 | + instructions, force them to registers */ | ||
7406 | + if (GET_CODE (operands[2]) == CONST_INT | ||
7407 | + && !avr32_const_ok_for_constraint_p (INTVAL (operands[2]), 'K', "Ks08")) | ||
7408 | + { | ||
7409 | + if (no_new_pseudos) | ||
7410 | + return FALSE; | ||
7411 | + else | ||
7412 | + operands[2] = force_reg (mode, operands[2]); | ||
7413 | + } | ||
7414 | + | ||
7415 | + if (GET_CODE (operands[3]) == CONST_INT | ||
7416 | + && !avr32_const_ok_for_constraint_p (INTVAL (operands[3]), 'K', "Ks08")) | ||
7417 | + { | ||
7418 | + if (no_new_pseudos) | ||
7419 | + return FALSE; | ||
7420 | + else | ||
7421 | + operands[3] = force_reg (mode, operands[3]); | ||
7422 | + } | ||
7423 | + | ||
7424 | + if (GET_CODE (operands[0]) != REG) | ||
7425 | + { | ||
7426 | + if (no_new_pseudos) | ||
7427 | + return FALSE; | ||
7428 | + else | ||
7429 | + operands[0] = force_reg (GET_MODE (operands[0]), operands[0]); | ||
7430 | + } | ||
7431 | + | ||
7432 | + if (GET_CODE (operands[2]) != REG) | ||
7433 | + { | ||
7434 | + if (no_new_pseudos) | ||
7435 | + return FALSE; | ||
7436 | + else | ||
7437 | + operands[2] = force_reg (GET_MODE (operands[2]), operands[2]); | ||
7438 | + } | ||
7439 | + | ||
7440 | + /* Check if operands[0] and operands[2] are different */ | ||
7441 | + if (REGNO (operands[0]) != REGNO (operands[2])) | ||
7442 | + { | ||
7443 | + emit_move_insn (operands[0], operands[2]); | ||
7444 | + operands[2] = operands[0]; | ||
7445 | + } | ||
7446 | + | ||
7447 | + /* Emit the actual instruction */ | ||
7448 | + operator = gen_rtx_EQ (VOIDmode, const0_rtx, const0_rtx); | ||
7449 | + PUT_CODE (operator, GET_CODE (operands[1])); | ||
7450 | + switch (mode) | ||
7451 | + { | ||
7452 | + case SImode: | ||
7453 | + switch (GET_MODE (compare_op0)) | ||
7454 | + { | ||
7455 | + case SImode: | ||
7456 | + emit_insn (gen_addsicc_cmpsi | ||
7457 | + (operands[0], operator, operands[2], operands[3], | ||
7458 | + compare_op0, compare_op1)); | ||
7459 | + break; | ||
7460 | + case DImode: | ||
7461 | + emit_insn (gen_addsicc_cmpdi | ||
7462 | + (operands[0], operator, operands[2], operands[3], | ||
7463 | + compare_op0, compare_op1)); | ||
7464 | + break; | ||
7465 | + case HImode: | ||
7466 | + emit_insn (gen_addsicc_cmphi | ||
7467 | + (operands[0], operator, operands[2], operands[3], | ||
7468 | + compare_op0, compare_op1)); | ||
7469 | + break; | ||
7470 | + case QImode: | ||
7471 | + emit_insn (gen_addsicc_cmpqi | ||
7472 | + (operands[0], operator, operands[2], operands[3], | ||
7473 | + compare_op0, compare_op1)); | ||
7474 | + break; | ||
7475 | + default: | ||
7476 | + return FALSE; | ||
7477 | + } | ||
7478 | + break; | ||
7479 | + case HImode: | ||
7480 | + switch (GET_MODE (compare_op0)) | ||
7481 | + { | ||
7482 | + case SImode: | ||
7483 | + emit_insn (gen_addhicc_cmpsi | ||
7484 | + (operands[0], operator, operands[2], operands[3], | ||
7485 | + compare_op0, compare_op1)); | ||
7486 | + break; | ||
7487 | + case DImode: | ||
7488 | + emit_insn (gen_addhicc_cmpdi | ||
7489 | + (operands[0], operator, operands[2], operands[3], | ||
7490 | + compare_op0, compare_op1)); | ||
7491 | + break; | ||
7492 | + case HImode: | ||
7493 | + emit_insn (gen_addhicc_cmphi | ||
7494 | + (operands[0], operator, operands[2], operands[3], | ||
7495 | + compare_op0, compare_op1)); | ||
7496 | + break; | ||
7497 | + case QImode: | ||
7498 | + emit_insn (gen_addhicc_cmpqi | ||
7499 | + (operands[0], operator, operands[2], operands[3], | ||
7500 | + compare_op0, compare_op1)); | ||
7501 | + break; | ||
7502 | + default: | ||
7503 | + return FALSE; | ||
7504 | + } | ||
7505 | + break; | ||
7506 | + case QImode: | ||
7507 | + switch (GET_MODE (compare_op0)) | ||
7508 | + { | ||
7509 | + case SImode: | ||
7510 | + emit_insn (gen_addqicc_cmpsi | ||
7511 | + (operands[0], operator, operands[2], operands[3], | ||
7512 | + compare_op0, compare_op1)); | ||
7513 | + break; | ||
7514 | + case DImode: | ||
7515 | + emit_insn (gen_addqicc_cmpdi | ||
7516 | + (operands[0], operator, operands[2], operands[3], | ||
7517 | + compare_op0, compare_op1)); | ||
7518 | + break; | ||
7519 | + case HImode: | ||
7520 | + emit_insn (gen_addqicc_cmphi | ||
7521 | + (operands[0], operator, operands[2], operands[3], | ||
7522 | + compare_op0, compare_op1)); | ||
7523 | + break; | ||
7524 | + case QImode: | ||
7525 | + emit_insn (gen_addqicc_cmpqi | ||
7526 | + (operands[0], operator, operands[2], operands[3], | ||
7527 | + compare_op0, compare_op1)); | ||
7528 | + break; | ||
7529 | + default: | ||
7530 | + return FALSE; | ||
7531 | + } | ||
7532 | + break; | ||
7533 | + default: | ||
7534 | + return FALSE; | ||
7535 | + } | ||
7536 | + | ||
7537 | + return TRUE; | ||
7538 | +} | ||
7539 | + | ||
7540 | +/* Function for changing the condition on the next instruction, | ||
7541 | + should be used when emmiting compare instructions and | ||
7542 | + the condition of the next instruction needs to change. | ||
7543 | +*/ | ||
7544 | +int | ||
7545 | +set_next_insn_cond (rtx cur_insn, rtx new_cond) | ||
7546 | +{ | ||
7547 | + rtx next_insn = next_nonnote_insn (cur_insn); | ||
7548 | + if ((next_insn != NULL_RTX) | ||
7549 | + && (INSN_P (next_insn)) | ||
7550 | + && (GET_CODE (PATTERN (next_insn)) == SET) | ||
7551 | + && (GET_CODE (SET_SRC (PATTERN (next_insn))) == IF_THEN_ELSE)) | ||
7552 | + { | ||
7553 | + /* Branch instructions */ | ||
7554 | + XEXP (SET_SRC (PATTERN (next_insn)), 0) = new_cond; | ||
7555 | + /* Force the instruction to be recognized again */ | ||
7556 | + INSN_CODE (next_insn) = -1; | ||
7557 | + return TRUE; | ||
7558 | + } | ||
7559 | + else if ((next_insn != NULL_RTX) | ||
7560 | + && (INSN_P (next_insn)) | ||
7561 | + && (GET_CODE (PATTERN (next_insn)) == SET) | ||
7562 | + && comparison_operator (SET_SRC (PATTERN (next_insn)), | ||
7563 | + GET_MODE (SET_SRC (PATTERN (next_insn))))) | ||
7564 | + { | ||
7565 | + /* scc with no compare */ | ||
7566 | + SET_SRC (PATTERN (next_insn)) = new_cond; | ||
7567 | + /* Force the instruction to be recognized again */ | ||
7568 | + INSN_CODE (next_insn) = -1; | ||
7569 | + return TRUE; | ||
7570 | + } | ||
7571 | + | ||
7572 | + return FALSE; | ||
7573 | +} | ||
7574 | + | ||
7575 | +/* Function for obtaining the condition for the next instruction | ||
7576 | + after cur_insn. | ||
7577 | +*/ | ||
7578 | +rtx | ||
7579 | +get_next_insn_cond (rtx cur_insn) | ||
7580 | +{ | ||
7581 | + rtx next_insn = next_nonnote_insn (cur_insn); | ||
7582 | + rtx cond = NULL_RTX; | ||
7583 | + if ((next_insn != NULL_RTX) | ||
7584 | + && (INSN_P (next_insn)) | ||
7585 | + && (GET_CODE (PATTERN (next_insn)) == SET) | ||
7586 | + && (GET_CODE (SET_SRC (PATTERN (next_insn))) == IF_THEN_ELSE)) | ||
7587 | + { | ||
7588 | + /* Branch instructions */ | ||
7589 | + cond = XEXP (SET_SRC (PATTERN (next_insn)), 0); | ||
7590 | + } | ||
7591 | + else if ((next_insn != NULL_RTX) | ||
7592 | + && (INSN_P (next_insn)) | ||
7593 | + && (GET_CODE (PATTERN (next_insn)) == SET) | ||
7594 | + && comparison_operator (SET_SRC (PATTERN (next_insn)), | ||
7595 | + GET_MODE (SET_SRC (PATTERN (next_insn))))) | ||
7596 | + { | ||
7597 | + /* scc with no compare */ | ||
7598 | + cond = SET_SRC (PATTERN (next_insn)); | ||
7599 | + } | ||
7600 | + | ||
7601 | + return cond; | ||
7602 | +} | ||
7603 | + | ||
7604 | +int | ||
7605 | +avr32_expand_scc (enum rtx_code cond, rtx * operands) | ||
7606 | +{ | ||
7607 | + | ||
7608 | + rtx comparation; | ||
7609 | + /* Only allow certain compare operations */ | ||
7610 | + if (GET_MODE (avr32_compare_op0) != DImode | ||
7611 | + && GET_MODE (avr32_compare_op0) != SImode | ||
7612 | + && GET_MODE (avr32_compare_op0) != HImode | ||
7613 | + && GET_MODE (avr32_compare_op0) != QImode) | ||
7614 | + return FALSE; | ||
7615 | + | ||
7616 | + /* Delete compare instruction as it is merged into this instruction */ | ||
7617 | + remove_insn (get_last_insn_anywhere ()); | ||
7618 | + | ||
7619 | + if (!REG_P (avr32_compare_op0)) | ||
7620 | + avr32_compare_op0 = | ||
7621 | + force_reg (GET_MODE (avr32_compare_op0), avr32_compare_op0); | ||
7622 | + | ||
7623 | + if (GET_MODE (avr32_compare_op0) != SImode && !REG_P (avr32_compare_op1)) | ||
7624 | + { | ||
7625 | + avr32_compare_op1 = | ||
7626 | + force_reg (GET_MODE (avr32_compare_op0), avr32_compare_op1); | ||
7627 | + } | ||
7628 | + else if (GET_MODE (avr32_compare_op0) == SImode | ||
7629 | + && !REG_P (avr32_compare_op1) | ||
7630 | + && (GET_CODE (avr32_compare_op1) != CONST_INT | ||
7631 | + || (GET_CODE (avr32_compare_op1) == CONST_INT | ||
7632 | + && | ||
7633 | + !avr32_const_ok_for_constraint_p (INTVAL | ||
7634 | + (avr32_compare_op1), 'K', | ||
7635 | + "Ks21")))) | ||
7636 | + avr32_compare_op1 = | ||
7637 | + force_reg (GET_MODE (avr32_compare_op0), avr32_compare_op1); | ||
7638 | + | ||
7639 | + | ||
7640 | + comparation = | ||
7641 | + gen_rtx_EQ (SImode, | ||
7642 | + gen_rtx_COMPARE (GET_MODE (avr32_compare_op0), | ||
7643 | + avr32_compare_op0, avr32_compare_op1), | ||
7644 | + const0_rtx); | ||
7645 | + /* Set correct condition */ | ||
7646 | + PUT_CODE (comparation, cond); | ||
7647 | + emit_insn (gen_rtx_SET (VOIDmode, operands[0], comparation)); | ||
7648 | + return TRUE; | ||
7649 | +} | ||
7650 | + | ||
7651 | +rtx | ||
7652 | +avr32_output_cmp (rtx cond, enum machine_mode mode, rtx op0, rtx op1) | ||
7653 | +{ | ||
7654 | + | ||
7655 | + rtx new_cond = NULL_RTX; | ||
7656 | + rtx ops[2]; | ||
7657 | + rtx compare_pattern; | ||
7658 | + ops[0] = op0; | ||
7659 | + ops[1] = op1; | ||
7660 | + | ||
7661 | + compare_pattern = gen_rtx_COMPARE (mode, op0, op1); | ||
7662 | + | ||
7663 | + new_cond = is_compare_redundant (compare_pattern, cond); | ||
7664 | + | ||
7665 | + if (new_cond != NULL_RTX) | ||
7666 | + return new_cond; | ||
7667 | + | ||
7668 | + /* Insert compare */ | ||
7669 | + switch (mode) | ||
7670 | + { | ||
7671 | + case QImode: | ||
7672 | + output_asm_insn ("cp.b\t%0, %1", ops); | ||
7673 | + break; | ||
7674 | + case HImode: | ||
7675 | + output_asm_insn ("cp.h\t%0, %1", ops); | ||
7676 | + break; | ||
7677 | + case SImode: | ||
7678 | + output_asm_insn ("cp.w\t%0, %1", ops); | ||
7679 | + break; | ||
7680 | + case DImode: | ||
7681 | + if (rtx_equal_p (op1, const0_rtx)) | ||
7682 | + output_asm_insn ("cp.w\t%0, %1\ncpc\t%m0", ops); | ||
7683 | + else | ||
7684 | + output_asm_insn ("cp.w\t%0, %1\ncpc\t%m0, %m1", ops); | ||
7685 | + break; | ||
7686 | + default: | ||
7687 | + internal_error ("Unknown comparison mode"); | ||
7688 | + break; | ||
7689 | + } | ||
7690 | + | ||
7691 | + return cond; | ||
7692 | +} | ||
7693 | + | ||
7694 | +int | ||
7695 | +avr32_load_multiple_operation (rtx op, | ||
7696 | + enum machine_mode mode ATTRIBUTE_UNUSED) | ||
7697 | +{ | ||
7698 | + int count = XVECLEN (op, 0); | ||
7699 | + unsigned int dest_regno; | ||
7700 | + rtx src_addr; | ||
7701 | + rtx elt; | ||
7702 | + int i = 1, base = 0; | ||
7703 | + | ||
7704 | + if (count <= 1 || GET_CODE (XVECEXP (op, 0, 0)) != SET) | ||
7705 | + return 0; | ||
7706 | + | ||
7707 | + /* Check to see if this might be a write-back. */ | ||
7708 | + if (GET_CODE (SET_SRC (elt = XVECEXP (op, 0, 0))) == PLUS) | ||
7709 | + { | ||
7710 | + i++; | ||
7711 | + base = 1; | ||
7712 | + | ||
7713 | + /* Now check it more carefully. */ | ||
7714 | + if (GET_CODE (SET_DEST (elt)) != REG | ||
7715 | + || GET_CODE (XEXP (SET_SRC (elt), 0)) != REG | ||
7716 | + || GET_CODE (XEXP (SET_SRC (elt), 1)) != CONST_INT | ||
7717 | + || INTVAL (XEXP (SET_SRC (elt), 1)) != (count - 1) * 4) | ||
7718 | + return 0; | ||
7719 | + } | ||
7720 | + | ||
7721 | + /* Perform a quick check so we don't blow up below. */ | ||
7722 | + if (count <= 1 | ||
7723 | + || GET_CODE (XVECEXP (op, 0, i - 1)) != SET | ||
7724 | + || GET_CODE (SET_DEST (XVECEXP (op, 0, i - 1))) != REG | ||
7725 | + || GET_CODE (SET_SRC (XVECEXP (op, 0, i - 1))) != UNSPEC) | ||
7726 | + return 0; | ||
7727 | + | ||
7728 | + dest_regno = REGNO (SET_DEST (XVECEXP (op, 0, i - 1))); | ||
7729 | + src_addr = XEXP (SET_SRC (XVECEXP (op, 0, i - 1)), 0); | ||
7730 | + | ||
7731 | + for (; i < count; i++) | ||
7732 | + { | ||
7733 | + elt = XVECEXP (op, 0, i); | ||
7734 | + | ||
7735 | + if (GET_CODE (elt) != SET | ||
7736 | + || GET_CODE (SET_DEST (elt)) != REG | ||
7737 | + || GET_MODE (SET_DEST (elt)) != SImode | ||
7738 | + || GET_CODE (SET_SRC (elt)) != UNSPEC) | ||
7739 | + return 0; | ||
7740 | + } | ||
7741 | + | ||
7742 | + return 1; | ||
7743 | +} | ||
7744 | + | ||
7745 | +int | ||
7746 | +avr32_store_multiple_operation (rtx op, | ||
7747 | + enum machine_mode mode ATTRIBUTE_UNUSED) | ||
7748 | +{ | ||
7749 | + int count = XVECLEN (op, 0); | ||
7750 | + int src_regno; | ||
7751 | + rtx dest_addr; | ||
7752 | + rtx elt; | ||
7753 | + int i = 1; | ||
7754 | + | ||
7755 | + if (count <= 1 || GET_CODE (XVECEXP (op, 0, 0)) != SET) | ||
7756 | + return 0; | ||
7757 | + | ||
7758 | + /* Perform a quick check so we don't blow up below. */ | ||
7759 | + if (count <= i | ||
7760 | + || GET_CODE (XVECEXP (op, 0, i - 1)) != SET | ||
7761 | + || GET_CODE (SET_DEST (XVECEXP (op, 0, i - 1))) != MEM | ||
7762 | + || GET_CODE (SET_SRC (XVECEXP (op, 0, i - 1))) != UNSPEC) | ||
7763 | + return 0; | ||
7764 | + | ||
7765 | + src_regno = REGNO (SET_SRC (XVECEXP (op, 0, i - 1))); | ||
7766 | + dest_addr = XEXP (SET_DEST (XVECEXP (op, 0, i - 1)), 0); | ||
7767 | + | ||
7768 | + for (; i < count; i++) | ||
7769 | + { | ||
7770 | + elt = XVECEXP (op, 0, i); | ||
7771 | + | ||
7772 | + if (GET_CODE (elt) != SET | ||
7773 | + || GET_CODE (SET_DEST (elt)) != MEM | ||
7774 | + || GET_MODE (SET_DEST (elt)) != SImode | ||
7775 | + || GET_CODE (SET_SRC (elt)) != UNSPEC) | ||
7776 | + return 0; | ||
7777 | + } | ||
7778 | + | ||
7779 | + return 1; | ||
7780 | +} | ||
7781 | + | ||
7782 | +int | ||
7783 | +avr32_valid_macmac_bypass (rtx insn_out, rtx insn_in) | ||
7784 | +{ | ||
7785 | + /* Check if they use the same accumulator */ | ||
7786 | + if (rtx_equal_p | ||
7787 | + (SET_DEST (PATTERN (insn_out)), SET_DEST (PATTERN (insn_in)))) | ||
7788 | + { | ||
7789 | + return TRUE; | ||
7790 | + } | ||
7791 | + | ||
7792 | + return FALSE; | ||
7793 | +} | ||
7794 | + | ||
7795 | +int | ||
7796 | +avr32_valid_mulmac_bypass (rtx insn_out, rtx insn_in) | ||
7797 | +{ | ||
7798 | + /* | ||
7799 | + Check if the mul instruction produces the accumulator for the mac | ||
7800 | + instruction. */ | ||
7801 | + if (rtx_equal_p | ||
7802 | + (SET_DEST (PATTERN (insn_out)), SET_DEST (PATTERN (insn_in)))) | ||
7803 | + { | ||
7804 | + return TRUE; | ||
7805 | + } | ||
7806 | + return FALSE; | ||
7807 | +} | ||
7808 | + | ||
7809 | +int | ||
7810 | +avr32_store_bypass (rtx insn_out, rtx insn_in) | ||
7811 | +{ | ||
7812 | + /* Only valid bypass if the output result is used as an src in the store | ||
7813 | + instruction, NOT if used as a pointer or base. */ | ||
7814 | + if (rtx_equal_p | ||
7815 | + (SET_DEST (PATTERN (insn_out)), SET_SRC (PATTERN (insn_in)))) | ||
7816 | + { | ||
7817 | + return TRUE; | ||
7818 | + } | ||
7819 | + | ||
7820 | + return FALSE; | ||
7821 | +} | ||
7822 | + | ||
7823 | +int | ||
7824 | +avr32_mul_waw_bypass (rtx insn_out, rtx insn_in) | ||
7825 | +{ | ||
7826 | + /* Check if the register holding the result from the mul instruction is | ||
7827 | + used as a result register in the input instruction. */ | ||
7828 | + if (rtx_equal_p | ||
7829 | + (SET_DEST (PATTERN (insn_out)), SET_DEST (PATTERN (insn_in)))) | ||
7830 | + { | ||
7831 | + return TRUE; | ||
7832 | + } | ||
7833 | + | ||
7834 | + return FALSE; | ||
7835 | +} | ||
7836 | + | ||
7837 | +int | ||
7838 | +avr32_valid_load_double_bypass (rtx insn_out, rtx insn_in) | ||
7839 | +{ | ||
7840 | + /* Check if the first loaded word in insn_out is used in insn_in. */ | ||
7841 | + rtx dst_reg; | ||
7842 | + rtx second_loaded_reg; | ||
7843 | + | ||
7844 | + /* If this is a double alu operation then the bypass is not valid */ | ||
7845 | + if ((get_attr_type (insn_in) == TYPE_ALU | ||
7846 | + || get_attr_type (insn_in) == TYPE_ALU2) | ||
7847 | + && (GET_MODE_SIZE (GET_MODE (SET_DEST (PATTERN (insn_out)))) > 4)) | ||
7848 | + return FALSE; | ||
7849 | + | ||
7850 | + /* Get the destination register in the load */ | ||
7851 | + if (!REG_P (SET_DEST (PATTERN (insn_out)))) | ||
7852 | + return FALSE; | ||
7853 | + | ||
7854 | + dst_reg = SET_DEST (PATTERN (insn_out)); | ||
7855 | + second_loaded_reg = gen_rtx_REG (SImode, REGNO (dst_reg) + 1); | ||
7856 | + | ||
7857 | + if (!reg_mentioned_p (second_loaded_reg, PATTERN (insn_in))) | ||
7858 | + return TRUE; | ||
7859 | + | ||
7860 | + return FALSE; | ||
7861 | +} | ||
7862 | + | ||
7863 | + | ||
7864 | +int | ||
7865 | +avr32_valid_load_quad_bypass (rtx insn_out, rtx insn_in) | ||
7866 | +{ | ||
7867 | + /* | ||
7868 | + Check if the two first loaded word in insn_out are used in insn_in. */ | ||
7869 | + rtx dst_reg; | ||
7870 | + rtx third_loaded_reg, fourth_loaded_reg; | ||
7871 | + | ||
7872 | + /* Get the destination register in the load */ | ||
7873 | + if (!REG_P (SET_DEST (PATTERN (insn_out)))) | ||
7874 | + return FALSE; | ||
7875 | + | ||
7876 | + dst_reg = SET_DEST (PATTERN (insn_out)); | ||
7877 | + third_loaded_reg = gen_rtx_REG (SImode, REGNO (dst_reg) + 2); | ||
7878 | + fourth_loaded_reg = gen_rtx_REG (SImode, REGNO (dst_reg) + 3); | ||
7879 | + | ||
7880 | + if (!reg_mentioned_p (third_loaded_reg, PATTERN (insn_in)) | ||
7881 | + && !reg_mentioned_p (fourth_loaded_reg, PATTERN (insn_in))) | ||
7882 | + { | ||
7883 | + return TRUE; | ||
7884 | + } | ||
7885 | + | ||
7886 | + return FALSE; | ||
7887 | +} | ||
7888 | + | ||
7889 | +int | ||
7890 | +avr32_sched_use_dfa_pipeline_interface (void) | ||
7891 | +{ | ||
7892 | + /* No need to scedule on avr32_uc architecture. */ | ||
7893 | + return (avr32_arch->arch_type != ARCH_TYPE_AVR32_UC); | ||
7894 | +} | ||
7895 | + | ||
7896 | +void | ||
7897 | +avr32_select_rtx_section (enum machine_mode mode ATTRIBUTE_UNUSED, | ||
7898 | + rtx x ATTRIBUTE_UNUSED, | ||
7899 | + unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED) | ||
7900 | +{ | ||
7901 | + /* Let ASM_OUTPUT_POOL_PROLOGUE take care of this */ | ||
7902 | +} | ||
7903 | + | ||
7904 | +/* Set up library functions to comply to AVR32 ABI */ | ||
7905 | + | ||
7906 | +static void | ||
7907 | +avr32_init_libfuncs (void) | ||
7908 | +{ | ||
7909 | + /* Convert gcc run-time function names to AVR32 ABI names */ | ||
7910 | + | ||
7911 | + /* Double-precision floating-point arithmetic. */ | ||
7912 | + set_optab_libfunc (add_optab, DFmode, "__avr32_f64_add"); | ||
7913 | + set_optab_libfunc (sdiv_optab, DFmode, "__avr32_f64_div"); | ||
7914 | + set_optab_libfunc (smul_optab, DFmode, "__avr32_f64_mul"); | ||
7915 | + set_optab_libfunc (neg_optab, DFmode, NULL); | ||
7916 | + set_optab_libfunc (sub_optab, DFmode, "__avr32_f64_sub"); | ||
7917 | + | ||
7918 | + /* Double-precision comparisons. */ | ||
7919 | + set_optab_libfunc (eq_optab, DFmode, "__avr32_f64_cmp_eq"); | ||
7920 | + set_optab_libfunc (ne_optab, DFmode, NULL); | ||
7921 | + set_optab_libfunc (lt_optab, DFmode, "__avr32_f64_cmp_lt"); | ||
7922 | + set_optab_libfunc (le_optab, DFmode, NULL); | ||
7923 | + set_optab_libfunc (ge_optab, DFmode, "__avr32_f64_cmp_ge"); | ||
7924 | + set_optab_libfunc (gt_optab, DFmode, NULL); | ||
7925 | + | ||
7926 | + /* Single-precision floating-point arithmetic. */ | ||
7927 | + set_optab_libfunc (add_optab, SFmode, "__avr32_f32_add"); | ||
7928 | + set_optab_libfunc (sdiv_optab, SFmode, "__avr32_f32_div"); | ||
7929 | + set_optab_libfunc (smul_optab, SFmode, "__avr32_f32_mul"); | ||
7930 | + set_optab_libfunc (neg_optab, SFmode, NULL); | ||
7931 | + set_optab_libfunc (sub_optab, SFmode, "__avr32_f32_sub"); | ||
7932 | + | ||
7933 | + /* Single-precision comparisons. */ | ||
7934 | + set_optab_libfunc (eq_optab, SFmode, "__avr32_f32_cmp_eq"); | ||
7935 | + set_optab_libfunc (ne_optab, SFmode, NULL); | ||
7936 | + set_optab_libfunc (lt_optab, SFmode, "__avr32_f32_cmp_lt"); | ||
7937 | + set_optab_libfunc (le_optab, SFmode, NULL); | ||
7938 | + set_optab_libfunc (ge_optab, SFmode, "__avr32_f32_cmp_ge"); | ||
7939 | + set_optab_libfunc (gt_optab, SFmode, NULL); | ||
7940 | + | ||
7941 | + /* Floating-point to integer conversions. */ | ||
7942 | + set_conv_libfunc (sfix_optab, SImode, DFmode, "__avr32_f64_to_s32"); | ||
7943 | + set_conv_libfunc (ufix_optab, SImode, DFmode, "__avr32_f64_to_u32"); | ||
7944 | + set_conv_libfunc (sfix_optab, DImode, DFmode, "__avr32_f64_to_s64"); | ||
7945 | + set_conv_libfunc (ufix_optab, DImode, DFmode, "__avr32_f64_to_u64"); | ||
7946 | + set_conv_libfunc (sfix_optab, SImode, SFmode, "__avr32_f32_to_s32"); | ||
7947 | + set_conv_libfunc (ufix_optab, SImode, SFmode, "__avr32_f32_to_u32"); | ||
7948 | + set_conv_libfunc (sfix_optab, DImode, SFmode, "__avr32_f32_to_s64"); | ||
7949 | + set_conv_libfunc (ufix_optab, DImode, SFmode, "__avr32_f32_to_u64"); | ||
7950 | + | ||
7951 | + /* Conversions between floating types. */ | ||
7952 | + set_conv_libfunc (trunc_optab, SFmode, DFmode, "__avr32_f64_to_f32"); | ||
7953 | + set_conv_libfunc (sext_optab, DFmode, SFmode, "__avr32_f32_to_f64"); | ||
7954 | + | ||
7955 | + /* Integer to floating-point conversions. Table 8. */ | ||
7956 | + set_conv_libfunc (sfloat_optab, DFmode, SImode, "__avr32_s32_to_f64"); | ||
7957 | + set_conv_libfunc (sfloat_optab, DFmode, DImode, "__avr32_s64_to_f64"); | ||
7958 | + set_conv_libfunc (sfloat_optab, SFmode, SImode, "__avr32_s32_to_f32"); | ||
7959 | + set_conv_libfunc (sfloat_optab, SFmode, DImode, "__avr32_s64_to_f32"); | ||
7960 | + set_conv_libfunc (ufloat_optab, DFmode, SImode, "__avr32_u32_to_f64"); | ||
7961 | + set_conv_libfunc (ufloat_optab, SFmode, SImode, "__avr32_u32_to_f32"); | ||
7962 | + /* TODO: Add these to gcc library functions */ | ||
7963 | + | ||
7964 | + set_conv_libfunc (ufloat_optab, DFmode, DImode, NULL); | ||
7965 | + set_conv_libfunc (ufloat_optab, SFmode, DImode, NULL); | ||
7966 | + | ||
7967 | + /* Long long. Table 9. */ | ||
7968 | + set_optab_libfunc (smul_optab, DImode, "__avr32_mul64"); | ||
7969 | + set_optab_libfunc (sdiv_optab, DImode, "__avr32_sdiv64"); | ||
7970 | + set_optab_libfunc (udiv_optab, DImode, "__avr32_udiv64"); | ||
7971 | + set_optab_libfunc (smod_optab, DImode, "__avr32_smod64"); | ||
7972 | + set_optab_libfunc (umod_optab, DImode, "__avr32_umod64"); | ||
7973 | + set_optab_libfunc (ashl_optab, DImode, "__avr32_lsl64"); | ||
7974 | + set_optab_libfunc (lshr_optab, DImode, "__avr32_lsr64"); | ||
7975 | + set_optab_libfunc (ashr_optab, DImode, "__avr32_asr64"); | ||
7976 | +} | ||
7977 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32-elf.h gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-elf.h | ||
7978 | --- gcc-4.0.2/gcc/config/avr32/avr32-elf.h 1970-01-01 01:00:00.000000000 +0100 | ||
7979 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-elf.h 2006-11-17 10:38:10.000000000 +0100 | ||
7980 | @@ -0,0 +1,82 @@ | ||
7981 | +/* | ||
7982 | + Elf specific definitions. | ||
7983 | + Copyright 2003-2006 Atmel Corporation. | ||
7984 | + | ||
7985 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
7986 | + | ||
7987 | + This file is part of GCC. | ||
7988 | + | ||
7989 | + This program is free software; you can redistribute it and/or modify | ||
7990 | + it under the terms of the GNU General Public License as published by | ||
7991 | + the Free Software Foundation; either version 2 of the License, or | ||
7992 | + (at your option) any later version. | ||
7993 | + | ||
7994 | + This program is distributed in the hope that it will be useful, | ||
7995 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
7996 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
7997 | + GNU General Public License for more details. | ||
7998 | + | ||
7999 | + You should have received a copy of the GNU General Public License | ||
8000 | + along with this program; if not, write to the Free Software | ||
8001 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
8002 | + | ||
8003 | + | ||
8004 | +/***************************************************************************** | ||
8005 | + * Controlling the Compilator Driver, 'gcc' | ||
8006 | + *****************************************************************************/ | ||
8007 | + | ||
8008 | +/* Run-time Target Specification. */ | ||
8009 | +#undef TARGET_VERSION | ||
8010 | +#define TARGET_VERSION fputs (" (AVR32 GNU with ELF)", stderr); | ||
8011 | + | ||
8012 | +/* | ||
8013 | +Another C string constant used much like LINK_SPEC. The | ||
8014 | +difference between the two is that STARTFILE_SPEC is used at | ||
8015 | +the very beginning of the command given to the linker. | ||
8016 | + | ||
8017 | +If this macro is not defined, a default is provided that loads the | ||
8018 | +standard C startup file from the usual place. See gcc.c. | ||
8019 | +*/ | ||
8020 | +#undef STARTFILE_SPEC | ||
8021 | +#define STARTFILE_SPEC "crt0%O%s crti%O%s crtbegin%O%s" | ||
8022 | + | ||
8023 | +#undef LINK_SPEC | ||
8024 | +#define LINK_SPEC "%{muse-oscall:--defsym __do_not_use_oscall_coproc__=0} %{mrelax|O*:%{mno-relax|O0|O1: ;:--relax}} %{mpart=*:-mavr32elf_%*} %{mcpu=*:-mavr32elf_%*}" | ||
8025 | + | ||
8026 | + | ||
8027 | +/* | ||
8028 | +Another C string constant used much like LINK_SPEC. The | ||
8029 | +difference between the two is that ENDFILE_SPEC is used at | ||
8030 | +the very end of the command given to the linker. | ||
8031 | + | ||
8032 | +Do not define this macro if it does not need to do anything. | ||
8033 | +*/ | ||
8034 | +#undef ENDFILE_SPEC | ||
8035 | +#define ENDFILE_SPEC "crtend%O%s crtn%O%s" | ||
8036 | + | ||
8037 | + | ||
8038 | +/* Target CPU builtins. */ | ||
8039 | +#define TARGET_CPU_CPP_BUILTINS() \ | ||
8040 | + do \ | ||
8041 | + { \ | ||
8042 | + builtin_define ("__avr32__"); \ | ||
8043 | + builtin_define ("__AVR32__"); \ | ||
8044 | + builtin_define ("__AVR32_ELF__"); \ | ||
8045 | + builtin_define (avr32_part->macro); \ | ||
8046 | + builtin_define (avr32_arch->macro); \ | ||
8047 | + if (avr32_arch->uarch_type == UARCH_TYPE_AVR32A) \ | ||
8048 | + builtin_define ("__AVR32_AVR32A__"); \ | ||
8049 | + else \ | ||
8050 | + builtin_define ("__AVR32_AVR32B__"); \ | ||
8051 | + if (TARGET_UNALIGNED_WORD) \ | ||
8052 | + builtin_define ("__AVR32_HAS_UNALIGNED_WORD__"); \ | ||
8053 | + if (TARGET_SIMD) \ | ||
8054 | + builtin_define ("__AVR32_HAS_SIMD__"); \ | ||
8055 | + if (TARGET_DSP) \ | ||
8056 | + builtin_define ("__AVR32_HAS_DSP__"); \ | ||
8057 | + if (TARGET_RMW) \ | ||
8058 | + builtin_define ("__AVR32_HAS_RMW__"); \ | ||
8059 | + if (TARGET_BRANCH_PRED) \ | ||
8060 | + builtin_define ("__AVR32_HAS_BRANCH_PRED__"); \ | ||
8061 | + } \ | ||
8062 | + while (0) | ||
8063 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32.h gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.h | ||
8064 | --- gcc-4.0.2/gcc/config/avr32/avr32.h 1970-01-01 01:00:00.000000000 +0100 | ||
8065 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.h 2006-11-10 15:14:06.000000000 +0100 | ||
8066 | @@ -0,0 +1,3374 @@ | ||
8067 | +/* | ||
8068 | + Definitions of target machine for AVR32. | ||
8069 | + Copyright 2003-2006 Atmel Corporation. | ||
8070 | + | ||
8071 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
8072 | + Initial porting by Anders Ådland. | ||
8073 | + | ||
8074 | + This file is part of GCC. | ||
8075 | + | ||
8076 | + This program is free software; you can redistribute it and/or modify | ||
8077 | + it under the terms of the GNU General Public License as published by | ||
8078 | + the Free Software Foundation; either version 2 of the License, or | ||
8079 | + (at your option) any later version. | ||
8080 | + | ||
8081 | + This program is distributed in the hope that it will be useful, | ||
8082 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
8083 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
8084 | + GNU General Public License for more details. | ||
8085 | + | ||
8086 | + You should have received a copy of the GNU General Public License | ||
8087 | + along with this program; if not, write to the Free Software | ||
8088 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
8089 | + | ||
8090 | +#ifndef GCC_AVR32_H | ||
8091 | +#define GCC_AVR32_H | ||
8092 | + | ||
8093 | + | ||
8094 | +#ifndef OBJECT_FORMAT_ELF | ||
8095 | +#error avr32.h included before elfos.h | ||
8096 | +#endif | ||
8097 | + | ||
8098 | +#ifndef LOCAL_LABEL_PREFIX | ||
8099 | +#define LOCAL_LABEL_PREFIX "." | ||
8100 | +#endif | ||
8101 | + | ||
8102 | +#ifndef SUBTARGET_CPP_SPEC | ||
8103 | +#define SUBTARGET_CPP_SPEC "-D__ELF__" | ||
8104 | +#endif | ||
8105 | + | ||
8106 | + | ||
8107 | +extern struct rtx_def *avr32_compare_op0; | ||
8108 | +extern struct rtx_def *avr32_compare_op1; | ||
8109 | + | ||
8110 | + | ||
8111 | +extern struct rtx_def *avr32_acc_cache; | ||
8112 | + | ||
8113 | +/* cache instruction op5 codes */ | ||
8114 | +#define AVR32_CACHE_INVALIDATE_ICACHE 1 | ||
8115 | + | ||
8116 | +/* These bits describe the different types of function supported | ||
8117 | + by the AVR32 backend. They are exclusive. ie a function cannot be both a | ||
8118 | + normal function and an interworked function, for example. Knowing the | ||
8119 | + type of a function is important for determining its prologue and | ||
8120 | + epilogue sequences. | ||
8121 | + Note value 7 is currently unassigned. Also note that the interrupt | ||
8122 | + function types all have bit 2 set, so that they can be tested for easily. | ||
8123 | + Note that 0 is deliberately chosen for AVR32_FT_UNKNOWN so that when the | ||
8124 | + machine_function structure is initialized (to zero) func_type will | ||
8125 | + default to unknown. This will force the first use of avr32_current_func_type | ||
8126 | + to call avr32_compute_func_type. */ | ||
8127 | +#define AVR32_FT_UNKNOWN 0 /* Type has not yet been determined. | ||
8128 | + */ | ||
8129 | +#define AVR32_FT_NORMAL 1 /* Your normal, straightforward | ||
8130 | + function. */ | ||
8131 | +#define AVR32_FT_ACALL 2 /* An acall function. */ | ||
8132 | +#define AVR32_FT_EXCEPTION_HANDLER 3 /* A C++ exception handler. */ | ||
8133 | +#define AVR32_FT_ISR_FULL 4 /* A fully shadowed interrupt mode. */ | ||
8134 | +#define AVR32_FT_ISR_HALF 5 /* A half shadowed interrupt mode. */ | ||
8135 | +#define AVR32_FT_ISR_NONE 6 /* No shadow registers. */ | ||
8136 | + | ||
8137 | +#define AVR32_FT_TYPE_MASK ((1 << 3) - 1) | ||
8138 | + | ||
8139 | +/* In addition functions can have several type modifiers, | ||
8140 | + outlined by these bit masks: */ | ||
8141 | +#define AVR32_FT_INTERRUPT (1 << 2) /* Note overlap with FT_ISR | ||
8142 | + and above. */ | ||
8143 | +#define AVR32_FT_NAKED (1 << 3) /* No prologue or epilogue. */ | ||
8144 | +#define AVR32_FT_VOLATILE (1 << 4) /* Does not return. */ | ||
8145 | +#define AVR32_FT_NESTED (1 << 5) /* Embedded inside another | ||
8146 | + func. */ | ||
8147 | + | ||
8148 | +/* Some macros to test these flags. */ | ||
8149 | +#define AVR32_FUNC_TYPE(t) (t & AVR32_FT_TYPE_MASK) | ||
8150 | +#define IS_INTERRUPT(t) (t & AVR32_FT_INTERRUPT) | ||
8151 | +#define IS_VOLATILE(t) (t & AVR32_FT_VOLATILE) | ||
8152 | +#define IS_NAKED(t) (t & AVR32_FT_NAKED) | ||
8153 | +#define IS_NESTED(t) (t & AVR32_FT_NESTED) | ||
8154 | + | ||
8155 | + | ||
8156 | +typedef struct minipool_labels | ||
8157 | +GTY ((chain_next ("%h.next"), chain_prev ("%h.prev"))) | ||
8158 | +{ | ||
8159 | + rtx label; | ||
8160 | + struct minipool_labels *prev; | ||
8161 | + struct minipool_labels *next; | ||
8162 | +} minipool_labels; | ||
8163 | + | ||
8164 | +/* A C structure for machine-specific, per-function data. | ||
8165 | + This is added to the cfun structure. */ | ||
8166 | + | ||
8167 | +typedef struct machine_function | ||
8168 | +GTY (()) | ||
8169 | +{ | ||
8170 | + /* Records the type of the current function. */ | ||
8171 | + unsigned long func_type; | ||
8172 | + /* List of minipool labels, use for checking if code label is valid in a | ||
8173 | + memory expression */ | ||
8174 | + minipool_labels *minipool_label_head; | ||
8175 | + minipool_labels *minipool_label_tail; | ||
8176 | +} machine_function; | ||
8177 | + | ||
8178 | +/* Initialize data used by insn expanders. This is called from insn_emit, | ||
8179 | + once for every function before code is generated. */ | ||
8180 | +#define INIT_EXPANDERS avr32_init_expanders () | ||
8181 | + | ||
8182 | +/****************************************************************************** | ||
8183 | + * SPECS | ||
8184 | + *****************************************************************************/ | ||
8185 | + | ||
8186 | +#ifndef ASM_SPEC | ||
8187 | +#define ASM_SPEC "%{fpic:--pic} %{mrelax|O*:%{mno-relax|O0|O1: ;:--linkrelax}} %{march=*:-march=%*} %{mpart=*:-mpart=%*}" | ||
8188 | +#endif | ||
8189 | + | ||
8190 | +#ifndef MULTILIB_DEFAULTS | ||
8191 | +#define MULTILIB_DEFAULTS { "march=ap" } | ||
8192 | +#endif | ||
8193 | + | ||
8194 | + | ||
8195 | +/****************************************************************************** | ||
8196 | + * Run-time Target Specification | ||
8197 | + *****************************************************************************/ | ||
8198 | +extern int target_flags; | ||
8199 | + | ||
8200 | +/* Part types. Keep this in sync with the order of avr32_part_types in avr32.c*/ | ||
8201 | +enum part_type | ||
8202 | +{ | ||
8203 | + PART_TYPE_AVR32_NONE, | ||
8204 | + PART_TYPE_AVR32_AP7000, | ||
8205 | + PART_TYPE_AVR32_AP7010, | ||
8206 | + PART_TYPE_AVR32_AP7020, | ||
8207 | + PART_TYPE_AVR32_UC3A0256, | ||
8208 | + PART_TYPE_AVR32_UC3A0512, | ||
8209 | + PART_TYPE_AVR32_UC3A1128, | ||
8210 | + PART_TYPE_AVR32_UC3A1256, | ||
8211 | + PART_TYPE_AVR32_UC3A1512 | ||
8212 | +}; | ||
8213 | + | ||
8214 | +/* Microarchitectures. */ | ||
8215 | +enum microarchitecture_type | ||
8216 | +{ | ||
8217 | + UARCH_TYPE_AVR32A, | ||
8218 | + UARCH_TYPE_AVR32B | ||
8219 | +}; | ||
8220 | + | ||
8221 | +/* Architectures types which specifies the pipeline. | ||
8222 | + Keep this in sync with avr32_arch_types in avr32.c*/ | ||
8223 | +enum architecture_type | ||
8224 | +{ | ||
8225 | + ARCH_TYPE_AVR32_AP, | ||
8226 | + ARCH_TYPE_AVR32_UC | ||
8227 | +}; | ||
8228 | + | ||
8229 | +/* Flag specifying if the cpu has support for DSP instructions.*/ | ||
8230 | +#define FLAG_AVR32_HAS_DSP (1 << 0) | ||
8231 | +/* Flag specifying if the cpu has support for Read-Modify-Write | ||
8232 | + instructions.*/ | ||
8233 | +#define FLAG_AVR32_HAS_RMW (1 << 1) | ||
8234 | +/* Flag specifying if the cpu has support for SIMD instructions. */ | ||
8235 | +#define FLAG_AVR32_HAS_SIMD (1 << 2) | ||
8236 | +/* Flag specifying if the cpu has support for unaligned memory word access. */ | ||
8237 | +#define FLAG_AVR32_HAS_UNALIGNED_WORD (1 << 3) | ||
8238 | +/* Flag specifying if the cpu has support for branch prediction. */ | ||
8239 | +#define FLAG_AVR32_HAS_BRANCH_PRED (1 << 4) | ||
8240 | + | ||
8241 | +/* Structure for holding information about different avr32 CPUs/parts */ | ||
8242 | +struct part_type_s | ||
8243 | +{ | ||
8244 | + const char *const name; | ||
8245 | + enum part_type part_type; | ||
8246 | + enum architecture_type arch_type; | ||
8247 | + /* Must lie outside user's namespace. NULL == no macro. */ | ||
8248 | + const char *const macro; | ||
8249 | +}; | ||
8250 | + | ||
8251 | +/* Structure for holding information about different avr32 pipeline | ||
8252 | + architectures. */ | ||
8253 | +struct arch_type_s | ||
8254 | +{ | ||
8255 | + const char *const name; | ||
8256 | + enum architecture_type arch_type; | ||
8257 | + enum microarchitecture_type uarch_type; | ||
8258 | + const unsigned long feature_flags; | ||
8259 | + /* Must lie outside user's namespace. NULL == no macro. */ | ||
8260 | + const char *const macro; | ||
8261 | +}; | ||
8262 | + | ||
8263 | +extern const struct part_type_s *avr32_part; | ||
8264 | +extern const struct arch_type_s *avr32_arch; | ||
8265 | + | ||
8266 | +#define USE_RODATA_SECTION (1 << 0) | ||
8267 | +#define AVR32_FLAG_HARD_FLOAT (1 << 1) | ||
8268 | +#define AVR32_FLAG_FORCE_DOUBLE_ALIGN (1 << 2) | ||
8269 | +#define AVR32_FLAG_RELAX (1 << 4) | ||
8270 | +#define AVR32_FLAG_NO_INIT_GOT (1 << 5) | ||
8271 | +#define AVR32_FLAG_NO_REORG_OPT (1 << 6) | ||
8272 | +#define AVR32_FLAG_NO_ASM_ADDR_PSEUDOS (1 << 7) | ||
8273 | +#define AVR32_FLAG_NO_PIC (1 << 8) | ||
8274 | + | ||
8275 | +#define TARGET_HARD_FLOAT (target_flags & AVR32_FLAG_HARD_FLOAT) | ||
8276 | +#define TARGET_SOFT_FLOAT (!TARGET_HARD_FLOAT) | ||
8277 | +#define TARGET_FORCE_DOUBLE_ALIGN (target_flags & AVR32_FLAG_FORCE_DOUBLE_ALIGN) | ||
8278 | +#define TARGET_RELAX (target_flags & AVR32_FLAG_RELAX) | ||
8279 | +#define TARGET_NO_INIT_GOT (target_flags & AVR32_FLAG_NO_INIT_GOT) | ||
8280 | +#define TARGET_MD_REORG_OPTIMIZATION (!(target_flags & AVR32_FLAG_NO_REORG_OPT)) | ||
8281 | +#define TARGET_HAS_ASM_ADDR_PSEUDOS (!(target_flags & AVR32_FLAG_NO_ASM_ADDR_PSEUDOS)) | ||
8282 | + | ||
8283 | +#define TARGET_SIMD (avr32_arch->feature_flags & FLAG_AVR32_HAS_SIMD) | ||
8284 | +#define TARGET_DSP (avr32_arch->feature_flags & FLAG_AVR32_HAS_DSP) | ||
8285 | +#define TARGET_RMW (avr32_arch->feature_flags & FLAG_AVR32_HAS_RMW) | ||
8286 | +#define TARGET_UNALIGNED_WORD (avr32_arch->feature_flags & FLAG_AVR32_HAS_UNALIGNED_WORD) | ||
8287 | +#define TARGET_BRANCH_PRED (avr32_arch->feature_flags & FLAG_AVR32_HAS_BRANCH_PRED) | ||
8288 | + | ||
8289 | + | ||
8290 | +#define TARGET_SWITCHES { \ | ||
8291 | + { "use-rodata-section", USE_RODATA_SECTION, \ | ||
8292 | + N_("Do not put readonly-data in .text section, but in .rodata.") }, \ | ||
8293 | + { "hard-float", AVR32_FLAG_HARD_FLOAT, \ | ||
8294 | + N_("Use floating point coprocessor instructions.") }, \ | ||
8295 | + { "soft-float", -AVR32_FLAG_HARD_FLOAT, \ | ||
8296 | + N_("Use software floating-point library for floating-point operations.") }, \ | ||
8297 | + { "force-double-align", AVR32_FLAG_FORCE_DOUBLE_ALIGN, \ | ||
8298 | + N_("Force double-word alignment for double-word memory accesses.") }, \ | ||
8299 | + { "no-init-got", AVR32_FLAG_NO_INIT_GOT, \ | ||
8300 | + N_("Do not initialize GOT register before using it when compiling PIC code.") }, \ | ||
8301 | + { "relax", AVR32_FLAG_RELAX, \ | ||
8302 | + N_("Let invoked assembler and linker do relaxing (Enabled by default when optimization level is >1).") }, \ | ||
8303 | + { "no-relax", -AVR32_FLAG_RELAX, \ | ||
8304 | + N_("Don't let invoked assembler and linker do relaxing.") }, \ | ||
8305 | + { "no-reorg-opt", AVR32_FLAG_NO_REORG_OPT, \ | ||
8306 | + N_("Do not perform machine dependent optimizations in reorg stage.") }, \ | ||
8307 | + { "asm-addr-pseudos", -AVR32_FLAG_NO_ASM_ADDR_PSEUDOS, \ | ||
8308 | + N_("Use assembler pseudo-instructions lda.w and call for handling direct addresses. (Enabled by default)") }, \ | ||
8309 | + { "no-asm-addr-pseudos", AVR32_FLAG_NO_ASM_ADDR_PSEUDOS, \ | ||
8310 | + N_("Do not use assembler pseudo-instructions lda.w and call for handling direct addresses.") }, \ | ||
8311 | + { "no-pic", AVR32_FLAG_NO_PIC, \ | ||
8312 | + N_("Do not emit position-independent code (will break dynamic linking.)") }, \ | ||
8313 | + { "", 0, NULL } \ | ||
8314 | +} | ||
8315 | + | ||
8316 | + | ||
8317 | +extern const char *avr32_part_name; | ||
8318 | +extern const char *avr32_arch_name; | ||
8319 | + | ||
8320 | +#define TARGET_OPTIONS { \ | ||
8321 | + { "part=", &avr32_part_name, N_("Specify the AVR32 part name"), 0}, \ | ||
8322 | + { "cpu=", &avr32_part_name, N_("Specify the AVR32 part name (deprecated)"), 0}, \ | ||
8323 | + { "arch=", &avr32_arch_name, N_("Specify the AVR32 architecture name"), 0} } | ||
8324 | + | ||
8325 | +#define CAN_DEBUG_WITHOUT_FP | ||
8326 | + | ||
8327 | +/****************************************************************************** | ||
8328 | + * Storage Layout | ||
8329 | + *****************************************************************************/ | ||
8330 | + | ||
8331 | +/* | ||
8332 | +Define this macro to have the value 1 if the most significant bit in a | ||
8333 | +byte has the lowest number; otherwise define it to have the value zero. | ||
8334 | +This means that bit-field instructions count from the most significant | ||
8335 | +bit. If the machine has no bit-field instructions, then this must still | ||
8336 | +be defined, but it doesn't matter which value it is defined to. This | ||
8337 | +macro need not be a constant. | ||
8338 | + | ||
8339 | +This macro does not affect the way structure fields are packed into | ||
8340 | +bytes or words; that is controlled by BYTES_BIG_ENDIAN. | ||
8341 | +*/ | ||
8342 | +#define BITS_BIG_ENDIAN 0 | ||
8343 | + | ||
8344 | +/* | ||
8345 | +Define this macro to have the value 1 if the most significant byte in a | ||
8346 | +word has the lowest number. This macro need not be a constant. | ||
8347 | +*/ | ||
8348 | +/* | ||
8349 | + Data is stored in an big-endian way. | ||
8350 | +*/ | ||
8351 | +#define BYTES_BIG_ENDIAN 1 | ||
8352 | + | ||
8353 | +/* | ||
8354 | +Define this macro to have the value 1 if, in a multiword object, the | ||
8355 | +most significant word has the lowest number. This applies to both | ||
8356 | +memory locations and registers; GCC fundamentally assumes that the | ||
8357 | +order of words in memory is the same as the order in registers. This | ||
8358 | +macro need not be a constant. | ||
8359 | +*/ | ||
8360 | +/* | ||
8361 | + Data is stored in an bin-endian way. | ||
8362 | +*/ | ||
8363 | +#define WORDS_BIG_ENDIAN 1 | ||
8364 | + | ||
8365 | +/* | ||
8366 | +Define this macro if WORDS_BIG_ENDIAN is not constant. This must be a | ||
8367 | +constant value with the same meaning as WORDS_BIG_ENDIAN, which will be | ||
8368 | +used only when compiling libgcc2.c. Typically the value will be set | ||
8369 | +based on preprocessor defines. | ||
8370 | +*/ | ||
8371 | +#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN | ||
8372 | + | ||
8373 | +/* | ||
8374 | +Define this macro to have the value 1 if DFmode, XFmode or | ||
8375 | +TFmode floating point numbers are stored in memory with the word | ||
8376 | +containing the sign bit at the lowest address; otherwise define it to | ||
8377 | +have the value 0. This macro need not be a constant. | ||
8378 | + | ||
8379 | +You need not define this macro if the ordering is the same as for | ||
8380 | +multi-word integers. | ||
8381 | +*/ | ||
8382 | +/* #define FLOAT_WORDS_BIG_ENDIAN 1 */ | ||
8383 | + | ||
8384 | +/* | ||
8385 | +Define this macro to be the number of bits in an addressable storage | ||
8386 | +unit (byte); normally 8. | ||
8387 | +*/ | ||
8388 | +#define BITS_PER_UNIT 8 | ||
8389 | + | ||
8390 | +/* | ||
8391 | +Number of bits in a word; normally 32. | ||
8392 | +*/ | ||
8393 | +#define BITS_PER_WORD 32 | ||
8394 | + | ||
8395 | +/* | ||
8396 | +Maximum number of bits in a word. If this is undefined, the default is | ||
8397 | +BITS_PER_WORD. Otherwise, it is the constant value that is the | ||
8398 | +largest value that BITS_PER_WORD can have at run-time. | ||
8399 | +*/ | ||
8400 | +/* MAX_BITS_PER_WORD not defined*/ | ||
8401 | + | ||
8402 | +/* | ||
8403 | +Number of storage units in a word; normally 4. | ||
8404 | +*/ | ||
8405 | +#define UNITS_PER_WORD 4 | ||
8406 | + | ||
8407 | +/* | ||
8408 | +Minimum number of units in a word. If this is undefined, the default is | ||
8409 | +UNITS_PER_WORD. Otherwise, it is the constant value that is the | ||
8410 | +smallest value that UNITS_PER_WORD can have at run-time. | ||
8411 | +*/ | ||
8412 | +/* MIN_UNITS_PER_WORD not defined */ | ||
8413 | + | ||
8414 | +/* | ||
8415 | +Width of a pointer, in bits. You must specify a value no wider than the | ||
8416 | +width of Pmode. If it is not equal to the width of Pmode, | ||
8417 | +you must define POINTERS_EXTEND_UNSIGNED. | ||
8418 | +*/ | ||
8419 | +#define POINTER_SIZE 32 | ||
8420 | + | ||
8421 | +/* | ||
8422 | +A C expression whose value is greater than zero if pointers that need to be | ||
8423 | +extended from being POINTER_SIZE bits wide to Pmode are to | ||
8424 | +be zero-extended and zero if they are to be sign-extended. If the value | ||
8425 | +is less then zero then there must be an "ptr_extend" instruction that | ||
8426 | +extends a pointer from POINTER_SIZE to Pmode. | ||
8427 | + | ||
8428 | +You need not define this macro if the POINTER_SIZE is equal | ||
8429 | +to the width of Pmode. | ||
8430 | +*/ | ||
8431 | +/* #define POINTERS_EXTEND_UNSIGNED */ | ||
8432 | + | ||
8433 | +/* | ||
8434 | +A Macro to update M and UNSIGNEDP when an object whose type | ||
8435 | +is TYPE and which has the specified mode and signedness is to be | ||
8436 | +stored in a register. This macro is only called when TYPE is a | ||
8437 | +scalar type. | ||
8438 | + | ||
8439 | +On most RISC machines, which only have operations that operate on a full | ||
8440 | +register, define this macro to set M to word_mode if | ||
8441 | +M is an integer mode narrower than BITS_PER_WORD. In most | ||
8442 | +cases, only integer modes should be widened because wider-precision | ||
8443 | +floating-point operations are usually more expensive than their narrower | ||
8444 | +counterparts. | ||
8445 | + | ||
8446 | +For most machines, the macro definition does not change UNSIGNEDP. | ||
8447 | +However, some machines, have instructions that preferentially handle | ||
8448 | +either signed or unsigned quantities of certain modes. For example, on | ||
8449 | +the DEC Alpha, 32-bit loads from memory and 32-bit add instructions | ||
8450 | +sign-extend the result to 64 bits. On such machines, set | ||
8451 | +UNSIGNEDP according to which kind of extension is more efficient. | ||
8452 | + | ||
8453 | +Do not define this macro if it would never modify M. | ||
8454 | +*/ | ||
8455 | +#define PROMOTE_MODE(M, UNSIGNEDP, TYPE) \ | ||
8456 | + do \ | ||
8457 | + { \ | ||
8458 | + if (GET_MODE_CLASS (M) == MODE_INT \ | ||
8459 | + && GET_MODE_SIZE (M) < 4) \ | ||
8460 | + { \ | ||
8461 | + (M) = SImode; \ | ||
8462 | + } \ | ||
8463 | + } \ | ||
8464 | + while (0) | ||
8465 | + | ||
8466 | +/* Define if operations between registers always perform the operation | ||
8467 | + on the full register even if a narrower mode is specified. */ | ||
8468 | +#define WORD_REGISTER_OPERATIONS | ||
8469 | + | ||
8470 | +/* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD | ||
8471 | + will either zero-extend or sign-extend. The value of this macro should | ||
8472 | + be the code that says which one of the two operations is implicitly | ||
8473 | + done, UNKNOWN if not known. */ | ||
8474 | +#define LOAD_EXTEND_OP(MODE) \ | ||
8475 | + (((MODE) == QImode) ? ZERO_EXTEND \ | ||
8476 | + : ((MODE) == HImode) ? SIGN_EXTEND : UNKNOWN) | ||
8477 | + | ||
8478 | + | ||
8479 | +/* | ||
8480 | +Define this macro if the promotion described by PROMOTE_MODE | ||
8481 | +should only be performed for outgoing function arguments or | ||
8482 | +function return values, as specified by PROMOTE_FUNCTION_ARGS | ||
8483 | +and PROMOTE_FUNCTION_RETURN, respectively. | ||
8484 | +*/ | ||
8485 | +/* #define PROMOTE_FOR_CALL_ONLY */ | ||
8486 | + | ||
8487 | +/* | ||
8488 | +Normal alignment required for function parameters on the stack, in | ||
8489 | +bits. All stack parameters receive at least this much alignment | ||
8490 | +regardless of data type. On most machines, this is the same as the | ||
8491 | +size of an integer. | ||
8492 | +*/ | ||
8493 | +#define PARM_BOUNDARY 32 | ||
8494 | + | ||
8495 | +/* | ||
8496 | +Define this macro to the minimum alignment enforced by hardware for the | ||
8497 | +stack pointer on this machine. The definition is a C expression for the | ||
8498 | +desired alignment (measured in bits). This value is used as a default | ||
8499 | +if PREFERRED_STACK_BOUNDARY is not defined. On most machines, | ||
8500 | +this should be the same as PARM_BOUNDARY. | ||
8501 | +*/ | ||
8502 | +#define STACK_BOUNDARY 32 | ||
8503 | + | ||
8504 | +/* | ||
8505 | +Define this macro if you wish to preserve a certain alignment for the | ||
8506 | +stack pointer, greater than what the hardware enforces. The definition | ||
8507 | +is a C expression for the desired alignment (measured in bits). This | ||
8508 | +macro must evaluate to a value equal to or larger than | ||
8509 | +STACK_BOUNDARY. | ||
8510 | +*/ | ||
8511 | +#define PREFERRED_STACK_BOUNDARY (TARGET_FORCE_DOUBLE_ALIGN ? 64 : 32 ) | ||
8512 | + | ||
8513 | +/* | ||
8514 | +Alignment required for a function entry point, in bits. | ||
8515 | +*/ | ||
8516 | +#define FUNCTION_BOUNDARY 16 | ||
8517 | + | ||
8518 | +/* | ||
8519 | +Biggest alignment that any data type can require on this machine, in bits. | ||
8520 | +*/ | ||
8521 | +#define BIGGEST_ALIGNMENT (TARGET_FORCE_DOUBLE_ALIGN ? 64 : 32 ) | ||
8522 | + | ||
8523 | +/* | ||
8524 | +If defined, the smallest alignment, in bits, that can be given to an | ||
8525 | +object that can be referenced in one operation, without disturbing any | ||
8526 | +nearby object. Normally, this is BITS_PER_UNIT, but may be larger | ||
8527 | +on machines that don't have byte or half-word store operations. | ||
8528 | +*/ | ||
8529 | +#define MINIMUM_ATOMIC_ALIGNMENT BITS_PER_UNIT | ||
8530 | + | ||
8531 | + | ||
8532 | +/* | ||
8533 | +An integer expression for the size in bits of the largest integer machine mode that | ||
8534 | +should actually be used. All integer machine modes of this size or smaller can be | ||
8535 | +used for structures and unions with the appropriate sizes. If this macro is undefined, | ||
8536 | +GET_MODE_BITSIZE (DImode) is assumed.*/ | ||
8537 | +#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode) | ||
8538 | + | ||
8539 | + | ||
8540 | +/* | ||
8541 | +If defined, a C expression to compute the alignment given to a constant | ||
8542 | +that is being placed in memory. CONSTANT is the constant and | ||
8543 | +BASIC_ALIGN is the alignment that the object would ordinarily | ||
8544 | +have. The value of this macro is used instead of that alignment to | ||
8545 | +align the object. | ||
8546 | + | ||
8547 | +If this macro is not defined, then BASIC_ALIGN is used. | ||
8548 | + | ||
8549 | +The typical use of this macro is to increase alignment for string | ||
8550 | +constants to be word aligned so that strcpy calls that copy | ||
8551 | +constants can be done inline. | ||
8552 | +*/ | ||
8553 | +#define CONSTANT_ALIGNMENT(CONSTANT, BASIC_ALIGN) \ | ||
8554 | + ((TREE_CODE(CONSTANT) == STRING_CST) ? BITS_PER_WORD : BASIC_ALIGN) | ||
8555 | + | ||
8556 | +/* Try to align string to a word. */ | ||
8557 | +#define DATA_ALIGNMENT(TYPE, ALIGN) \ | ||
8558 | + ({(TREE_CODE (TYPE) == ARRAY_TYPE \ | ||
8559 | + && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ | ||
8560 | + && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN));}) | ||
8561 | + | ||
8562 | +/* Try to align local store strings to a word. */ | ||
8563 | +#define LOCAL_ALIGNMENT(TYPE, ALIGN) \ | ||
8564 | + ({(TREE_CODE (TYPE) == ARRAY_TYPE \ | ||
8565 | + && TYPE_MODE (TREE_TYPE (TYPE)) == QImode \ | ||
8566 | + && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN));}) | ||
8567 | + | ||
8568 | +/* | ||
8569 | +Define this macro to be the value 1 if instructions will fail to work | ||
8570 | +if given data not on the nominal alignment. If instructions will merely | ||
8571 | +go slower in that case, define this macro as 0. | ||
8572 | +*/ | ||
8573 | +#define STRICT_ALIGNMENT 1 | ||
8574 | + | ||
8575 | +/* | ||
8576 | +Define this if you wish to imitate the way many other C compilers handle | ||
8577 | +alignment of bit-fields and the structures that contain them. | ||
8578 | + | ||
8579 | +The behavior is that the type written for a bit-field (int, | ||
8580 | +short, or other integer type) imposes an alignment for the | ||
8581 | +entire structure, as if the structure really did contain an ordinary | ||
8582 | +field of that type. In addition, the bit-field is placed within the | ||
8583 | +structure so that it would fit within such a field, not crossing a | ||
8584 | +boundary for it. | ||
8585 | + | ||
8586 | +Thus, on most machines, a bit-field whose type is written as int | ||
8587 | +would not cross a four-byte boundary, and would force four-byte | ||
8588 | +alignment for the whole structure. (The alignment used may not be four | ||
8589 | +bytes; it is controlled by the other alignment parameters.) | ||
8590 | + | ||
8591 | +If the macro is defined, its definition should be a C expression; | ||
8592 | +a nonzero value for the expression enables this behavior. | ||
8593 | + | ||
8594 | +Note that if this macro is not defined, or its value is zero, some | ||
8595 | +bit-fields may cross more than one alignment boundary. The compiler can | ||
8596 | +support such references if there are insv, extv, and | ||
8597 | +extzv insns that can directly reference memory. | ||
8598 | + | ||
8599 | +The other known way of making bit-fields work is to define | ||
8600 | +STRUCTURE_SIZE_BOUNDARY as large as BIGGEST_ALIGNMENT. | ||
8601 | +Then every structure can be accessed with fullwords. | ||
8602 | + | ||
8603 | +Unless the machine has bit-field instructions or you define | ||
8604 | +STRUCTURE_SIZE_BOUNDARY that way, you must define | ||
8605 | +PCC_BITFIELD_TYPE_MATTERS to have a nonzero value. | ||
8606 | + | ||
8607 | +If your aim is to make GCC use the same conventions for laying out | ||
8608 | +bit-fields as are used by another compiler, here is how to investigate | ||
8609 | +what the other compiler does. Compile and run this program: | ||
8610 | + | ||
8611 | +struct foo1 | ||
8612 | +{ | ||
8613 | + char x; | ||
8614 | + char :0; | ||
8615 | + char y; | ||
8616 | +}; | ||
8617 | + | ||
8618 | +struct foo2 | ||
8619 | +{ | ||
8620 | + char x; | ||
8621 | + int :0; | ||
8622 | + char y; | ||
8623 | +}; | ||
8624 | + | ||
8625 | +main () | ||
8626 | +{ | ||
8627 | + printf ("Size of foo1 is %d\n", | ||
8628 | + sizeof (struct foo1)); | ||
8629 | + printf ("Size of foo2 is %d\n", | ||
8630 | + sizeof (struct foo2)); | ||
8631 | + exit (0); | ||
8632 | +} | ||
8633 | + | ||
8634 | +If this prints 2 and 5, then the compiler's behavior is what you would | ||
8635 | +get from PCC_BITFIELD_TYPE_MATTERS. | ||
8636 | +*/ | ||
8637 | +#define PCC_BITFIELD_TYPE_MATTERS 1 | ||
8638 | + | ||
8639 | + | ||
8640 | +/****************************************************************************** | ||
8641 | + * Layout of Source Language Data Types | ||
8642 | + *****************************************************************************/ | ||
8643 | + | ||
8644 | +/* | ||
8645 | +A C expression for the size in bits of the type int on the | ||
8646 | +target machine. If you don't define this, the default is one word. | ||
8647 | +*/ | ||
8648 | +#define INT_TYPE_SIZE 32 | ||
8649 | + | ||
8650 | +/* | ||
8651 | +A C expression for the size in bits of the type short on the | ||
8652 | +target machine. If you don't define this, the default is half a word. (If | ||
8653 | +this would be less than one storage unit, it is rounded up to one unit.) | ||
8654 | +*/ | ||
8655 | +#define SHORT_TYPE_SIZE 16 | ||
8656 | + | ||
8657 | +/* | ||
8658 | +A C expression for the size in bits of the type long on the | ||
8659 | +target machine. If you don't define this, the default is one word. | ||
8660 | +*/ | ||
8661 | +#define LONG_TYPE_SIZE 32 | ||
8662 | + | ||
8663 | + | ||
8664 | +/* | ||
8665 | +A C expression for the size in bits of the type long long on the | ||
8666 | +target machine. If you don't define this, the default is two | ||
8667 | +words. If you want to support GNU Ada on your machine, the value of this | ||
8668 | +macro must be at least 64. | ||
8669 | +*/ | ||
8670 | +#define LONG_LONG_TYPE_SIZE 64 | ||
8671 | + | ||
8672 | +/* | ||
8673 | +A C expression for the size in bits of the type char on the | ||
8674 | +target machine. If you don't define this, the default is | ||
8675 | +BITS_PER_UNIT. | ||
8676 | +*/ | ||
8677 | +#define CHAR_TYPE_SIZE 8 | ||
8678 | + | ||
8679 | + | ||
8680 | +/* | ||
8681 | +A C expression for the size in bits of the C++ type bool and | ||
8682 | +C99 type _Bool on the target machine. If you don't define | ||
8683 | +this, and you probably shouldn't, the default is CHAR_TYPE_SIZE. | ||
8684 | +*/ | ||
8685 | +#define BOOL_TYPE_SIZE 8 | ||
8686 | + | ||
8687 | + | ||
8688 | +/* | ||
8689 | +An expression whose value is 1 or 0, according to whether the type | ||
8690 | +char should be signed or unsigned by default. The user can | ||
8691 | +always override this default with the options -fsigned-char | ||
8692 | +and -funsigned-char. | ||
8693 | +*/ | ||
8694 | +/* We are using unsigned char */ | ||
8695 | +#define DEFAULT_SIGNED_CHAR 0 | ||
8696 | + | ||
8697 | + | ||
8698 | +/* | ||
8699 | +A C expression for a string describing the name of the data type to use | ||
8700 | +for size values. The typedef name size_t is defined using the | ||
8701 | +contents of the string. | ||
8702 | + | ||
8703 | +The string can contain more than one keyword. If so, separate them with | ||
8704 | +spaces, and write first any length keyword, then unsigned if | ||
8705 | +appropriate, and finally int. The string must exactly match one | ||
8706 | +of the data type names defined in the function | ||
8707 | +init_decl_processing in the file c-decl.c. You may not | ||
8708 | +omit int or change the order - that would cause the compiler to | ||
8709 | +crash on startup. | ||
8710 | + | ||
8711 | +If you don't define this macro, the default is "long unsigned int". | ||
8712 | +*/ | ||
8713 | +#define SIZE_TYPE "long unsigned int" | ||
8714 | + | ||
8715 | +/* | ||
8716 | +A C expression for a string describing the name of the data type to use | ||
8717 | +for the result of subtracting two pointers. The typedef name | ||
8718 | +ptrdiff_t is defined using the contents of the string. See | ||
8719 | +SIZE_TYPE above for more information. | ||
8720 | + | ||
8721 | +If you don't define this macro, the default is "long int". | ||
8722 | +*/ | ||
8723 | +#define PTRDIFF_TYPE "long int" | ||
8724 | + | ||
8725 | + | ||
8726 | +/* | ||
8727 | +A C expression for the size in bits of the data type for wide | ||
8728 | +characters. This is used in cpp, which cannot make use of | ||
8729 | +WCHAR_TYPE. | ||
8730 | +*/ | ||
8731 | +#define WCHAR_TYPE_SIZE 32 | ||
8732 | + | ||
8733 | + | ||
8734 | +/* | ||
8735 | +A C expression for a string describing the name of the data type to | ||
8736 | +use for wide characters passed to printf and returned from | ||
8737 | +getwc. The typedef name wint_t is defined using the | ||
8738 | +contents of the string. See SIZE_TYPE above for more | ||
8739 | +information. | ||
8740 | + | ||
8741 | +If you don't define this macro, the default is "unsigned int". | ||
8742 | +*/ | ||
8743 | +#define WINT_TYPE "unsigned int" | ||
8744 | + | ||
8745 | +/* | ||
8746 | +A C expression for a string describing the name of the data type that | ||
8747 | +can represent any value of any standard or extended signed integer type. | ||
8748 | +The typedef name intmax_t is defined using the contents of the | ||
8749 | +string. See SIZE_TYPE above for more information. | ||
8750 | + | ||
8751 | +If you don't define this macro, the default is the first of | ||
8752 | +"int", "long int", or "long long int" that has as | ||
8753 | +much precision as long long int. | ||
8754 | +*/ | ||
8755 | +#define INTMAX_TYPE "long long int" | ||
8756 | + | ||
8757 | +/* | ||
8758 | +A C expression for a string describing the name of the data type that | ||
8759 | +can represent any value of any standard or extended unsigned integer | ||
8760 | +type. The typedef name uintmax_t is defined using the contents | ||
8761 | +of the string. See SIZE_TYPE above for more information. | ||
8762 | + | ||
8763 | +If you don't define this macro, the default is the first of | ||
8764 | +"unsigned int", "long unsigned int", or "long long unsigned int" | ||
8765 | +that has as much precision as long long unsigned int. | ||
8766 | +*/ | ||
8767 | +#define UINTMAX_TYPE "long long unsigned int" | ||
8768 | + | ||
8769 | + | ||
8770 | +/****************************************************************************** | ||
8771 | + * Register Usage | ||
8772 | + *****************************************************************************/ | ||
8773 | + | ||
8774 | +/* Convert from gcc internal register number to register number | ||
8775 | + used in assembly code */ | ||
8776 | +#define ASM_REGNUM(reg) (LAST_REGNUM - (reg)) | ||
8777 | +#define ASM_FP_REGNUM(reg) (LAST_FP_REGNUM - (reg)) | ||
8778 | + | ||
8779 | +/* Convert between register number used in assembly to gcc | ||
8780 | + internal register number */ | ||
8781 | +#define INTERNAL_REGNUM(reg) (LAST_REGNUM - (reg)) | ||
8782 | +#define INTERNAL_FP_REGNUM(reg) (LAST_FP_REGNUM - (reg)) | ||
8783 | + | ||
8784 | +/** Basic Characteristics of Registers **/ | ||
8785 | + | ||
8786 | +/* | ||
8787 | +Number of hardware registers known to the compiler. They receive | ||
8788 | +numbers 0 through FIRST_PSEUDO_REGISTER-1; thus, the first | ||
8789 | +pseudo register's number really is assigned the number | ||
8790 | +FIRST_PSEUDO_REGISTER. | ||
8791 | +*/ | ||
8792 | +#define FIRST_PSEUDO_REGISTER (LAST_FP_REGNUM + 1) | ||
8793 | + | ||
8794 | +#define FIRST_REGNUM 0 | ||
8795 | +#define LAST_REGNUM 15 | ||
8796 | +#define NUM_FP_REGS 16 | ||
8797 | +#define FIRST_FP_REGNUM 16 | ||
8798 | +#define LAST_FP_REGNUM (16+NUM_FP_REGS-1) | ||
8799 | + | ||
8800 | +/* | ||
8801 | +An initializer that says which registers are used for fixed purposes | ||
8802 | +all throughout the compiled code and are therefore not available for | ||
8803 | +general allocation. These would include the stack pointer, the frame | ||
8804 | +pointer (except on machines where that can be used as a general | ||
8805 | +register when no frame pointer is needed), the program counter on | ||
8806 | +machines where that is considered one of the addressable registers, | ||
8807 | +and any other numbered register with a standard use. | ||
8808 | + | ||
8809 | +This information is expressed as a sequence of numbers, separated by | ||
8810 | +commas and surrounded by braces. The nth number is 1 if | ||
8811 | +register n is fixed, 0 otherwise. | ||
8812 | + | ||
8813 | +The table initialized from this macro, and the table initialized by | ||
8814 | +the following one, may be overridden at run time either automatically, | ||
8815 | +by the actions of the macro CONDITIONAL_REGISTER_USAGE, or by | ||
8816 | +the user with the command options -ffixed-[reg], | ||
8817 | +-fcall-used-[reg] and -fcall-saved-[reg]. | ||
8818 | +*/ | ||
8819 | + | ||
8820 | +/* The internal gcc register numbers are reversed | ||
8821 | + compared to the real register numbers since | ||
8822 | + gcc expects data types stored over multiple | ||
8823 | + registers in the register file to be big endian | ||
8824 | + if the memory layout is big endian. But this | ||
8825 | + is not the case for avr32 so we fake a big | ||
8826 | + endian register file. */ | ||
8827 | + | ||
8828 | +#define FIXED_REGISTERS { \ | ||
8829 | + 1, /* Program Counter */ \ | ||
8830 | + 0, /* Link Register */ \ | ||
8831 | + 1, /* Stack Pointer */ \ | ||
8832 | + 0, /* r12 */ \ | ||
8833 | + 0, /* r11 */ \ | ||
8834 | + 0, /* r10 */ \ | ||
8835 | + 0, /* r9 */ \ | ||
8836 | + 0, /* r8 */ \ | ||
8837 | + 0, /* r7 */ \ | ||
8838 | + 0, /* r6 */ \ | ||
8839 | + 0, /* r5 */ \ | ||
8840 | + 0, /* r4 */ \ | ||
8841 | + 0, /* r3 */ \ | ||
8842 | + 0, /* r2 */ \ | ||
8843 | + 0, /* r1 */ \ | ||
8844 | + 0, /* r0 */ \ | ||
8845 | + 0, /* f15 */ \ | ||
8846 | + 0, /* f14 */ \ | ||
8847 | + 0, /* f13 */ \ | ||
8848 | + 0, /* f12 */ \ | ||
8849 | + 0, /* f11 */ \ | ||
8850 | + 0, /* f10 */ \ | ||
8851 | + 0, /* f9 */ \ | ||
8852 | + 0, /* f8 */ \ | ||
8853 | + 0, /* f7 */ \ | ||
8854 | + 0, /* f6 */ \ | ||
8855 | + 0, /* f5 */ \ | ||
8856 | + 0, /* f4 */ \ | ||
8857 | + 0, /* f3 */ \ | ||
8858 | + 0, /* f2*/ \ | ||
8859 | + 0, /* f1 */ \ | ||
8860 | + 0 /* f0 */ \ | ||
8861 | +} | ||
8862 | + | ||
8863 | +/* | ||
8864 | +Like FIXED_REGISTERS but has 1 for each register that is | ||
8865 | +clobbered (in general) by function calls as well as for fixed | ||
8866 | +registers. This macro therefore identifies the registers that are not | ||
8867 | +available for general allocation of values that must live across | ||
8868 | +function calls. | ||
8869 | + | ||
8870 | +If a register has 0 in CALL_USED_REGISTERS, the compiler | ||
8871 | +automatically saves it on function entry and restores it on function | ||
8872 | +exit, if the register is used within the function. | ||
8873 | +*/ | ||
8874 | +#define CALL_USED_REGISTERS { \ | ||
8875 | + 1, /* Program Counter */ \ | ||
8876 | + 0, /* Link Register */ \ | ||
8877 | + 1, /* Stack Pointer */ \ | ||
8878 | + 1, /* r12 */ \ | ||
8879 | + 1, /* r11 */ \ | ||
8880 | + 1, /* r10 */ \ | ||
8881 | + 1, /* r9 */ \ | ||
8882 | + 1, /* r8 */ \ | ||
8883 | + 0, /* r7 */ \ | ||
8884 | + 0, /* r6 */ \ | ||
8885 | + 0, /* r5 */ \ | ||
8886 | + 0, /* r4 */ \ | ||
8887 | + 0, /* r3 */ \ | ||
8888 | + 0, /* r2 */ \ | ||
8889 | + 0, /* r1 */ \ | ||
8890 | + 0, /* r0 */ \ | ||
8891 | + 1, /* f15 */ \ | ||
8892 | + 1, /* f14 */ \ | ||
8893 | + 1, /* f13 */ \ | ||
8894 | + 1, /* f12 */ \ | ||
8895 | + 1, /* f11 */ \ | ||
8896 | + 1, /* f10 */ \ | ||
8897 | + 1, /* f9 */ \ | ||
8898 | + 1, /* f8 */ \ | ||
8899 | + 0, /* f7 */ \ | ||
8900 | + 0, /* f6 */ \ | ||
8901 | + 0, /* f5 */ \ | ||
8902 | + 0, /* f4 */ \ | ||
8903 | + 0, /* f3 */ \ | ||
8904 | + 0, /* f2*/ \ | ||
8905 | + 0, /* f1*/ \ | ||
8906 | + 0, /* f0 */ \ | ||
8907 | +} | ||
8908 | + | ||
8909 | +/* Interrupt functions can only use registers that have already been | ||
8910 | + saved by the prologue, even if they would normally be | ||
8911 | + call-clobbered. */ | ||
8912 | +#define HARD_REGNO_RENAME_OK(SRC, DST) \ | ||
8913 | + (! IS_INTERRUPT (cfun->machine->func_type) || \ | ||
8914 | + regs_ever_live[DST]) | ||
8915 | + | ||
8916 | + | ||
8917 | +/* | ||
8918 | +Zero or more C statements that may conditionally modify five variables | ||
8919 | +fixed_regs, call_used_regs, global_regs, | ||
8920 | +reg_names, and reg_class_contents, to take into account | ||
8921 | +any dependence of these register sets on target flags. The first three | ||
8922 | +of these are of type char [] (interpreted as Boolean vectors). | ||
8923 | +global_regs is a const char *[], and | ||
8924 | +reg_class_contents is a HARD_REG_SET. Before the macro is | ||
8925 | +called, fixed_regs, call_used_regs, | ||
8926 | +reg_class_contents, and reg_names have been initialized | ||
8927 | +from FIXED_REGISTERS, CALL_USED_REGISTERS, | ||
8928 | +REG_CLASS_CONTENTS, and REGISTER_NAMES, respectively. | ||
8929 | +global_regs has been cleared, and any -ffixed-[reg], | ||
8930 | +-fcall-used-[reg] and -fcall-saved-[reg] | ||
8931 | +command options have been applied. | ||
8932 | + | ||
8933 | +You need not define this macro if it has no work to do. | ||
8934 | + | ||
8935 | +If the usage of an entire class of registers depends on the target | ||
8936 | +flags, you may indicate this to GCC by using this macro to modify | ||
8937 | +fixed_regs and call_used_regs to 1 for each of the | ||
8938 | +registers in the classes which should not be used by GCC. Also define | ||
8939 | +the macro REG_CLASS_FROM_LETTER to return NO_REGS if it | ||
8940 | +is called with a letter for a class that shouldn't be used. | ||
8941 | + | ||
8942 | + (However, if this class is not included in GENERAL_REGS and all | ||
8943 | +of the insn patterns whose constraints permit this class are | ||
8944 | +controlled by target switches, then GCC will automatically avoid using | ||
8945 | +these registers when the target switches are opposed to them.) | ||
8946 | +*/ | ||
8947 | +#define CONDITIONAL_REGISTER_USAGE \ | ||
8948 | + do \ | ||
8949 | + { \ | ||
8950 | + int regno; \ | ||
8951 | + \ | ||
8952 | + if (TARGET_SOFT_FLOAT) \ | ||
8953 | + { \ | ||
8954 | + for (regno = FIRST_FP_REGNUM; \ | ||
8955 | + regno <= LAST_FP_REGNUM; ++regno) \ | ||
8956 | + fixed_regs[regno] = call_used_regs[regno] = 1; \ | ||
8957 | + } \ | ||
8958 | + if (flag_pic) \ | ||
8959 | + { \ | ||
8960 | + fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ | ||
8961 | + call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ | ||
8962 | + } \ | ||
8963 | + } \ | ||
8964 | + while (0) | ||
8965 | + | ||
8966 | + | ||
8967 | +/* | ||
8968 | +If the program counter has a register number, define this as that | ||
8969 | +register number. Otherwise, do not define it. | ||
8970 | +*/ | ||
8971 | + | ||
8972 | +#define LAST_AVR32_REGNUM 16 | ||
8973 | + | ||
8974 | + | ||
8975 | +/** Order of Allocation of Registers **/ | ||
8976 | + | ||
8977 | +/* | ||
8978 | +If defined, an initializer for a vector of integers, containing the | ||
8979 | +numbers of hard registers in the order in which GCC should prefer | ||
8980 | +to use them (from most preferred to least). | ||
8981 | + | ||
8982 | +If this macro is not defined, registers are used lowest numbered first | ||
8983 | +(all else being equal). | ||
8984 | + | ||
8985 | +One use of this macro is on machines where the highest numbered | ||
8986 | +registers must always be saved and the save-multiple-registers | ||
8987 | +instruction supports only sequences of consecutive registers. On such | ||
8988 | +machines, define REG_ALLOC_ORDER to be an initializer that lists | ||
8989 | +the highest numbered allocable register first. | ||
8990 | +*/ | ||
8991 | +#define REG_ALLOC_ORDER \ | ||
8992 | +{ \ | ||
8993 | + INTERNAL_REGNUM(8), \ | ||
8994 | + INTERNAL_REGNUM(9), \ | ||
8995 | + INTERNAL_REGNUM(10), \ | ||
8996 | + INTERNAL_REGNUM(11), \ | ||
8997 | + INTERNAL_REGNUM(12), \ | ||
8998 | + LR_REGNUM, \ | ||
8999 | + INTERNAL_REGNUM(7), \ | ||
9000 | + INTERNAL_REGNUM(6), \ | ||
9001 | + INTERNAL_REGNUM(5), \ | ||
9002 | + INTERNAL_REGNUM(4), \ | ||
9003 | + INTERNAL_REGNUM(3), \ | ||
9004 | + INTERNAL_REGNUM(2), \ | ||
9005 | + INTERNAL_REGNUM(1), \ | ||
9006 | + INTERNAL_REGNUM(0), \ | ||
9007 | + INTERNAL_FP_REGNUM(15), \ | ||
9008 | + INTERNAL_FP_REGNUM(14), \ | ||
9009 | + INTERNAL_FP_REGNUM(13), \ | ||
9010 | + INTERNAL_FP_REGNUM(12), \ | ||
9011 | + INTERNAL_FP_REGNUM(11), \ | ||
9012 | + INTERNAL_FP_REGNUM(10), \ | ||
9013 | + INTERNAL_FP_REGNUM(9), \ | ||
9014 | + INTERNAL_FP_REGNUM(8), \ | ||
9015 | + INTERNAL_FP_REGNUM(7), \ | ||
9016 | + INTERNAL_FP_REGNUM(6), \ | ||
9017 | + INTERNAL_FP_REGNUM(5), \ | ||
9018 | + INTERNAL_FP_REGNUM(4), \ | ||
9019 | + INTERNAL_FP_REGNUM(3), \ | ||
9020 | + INTERNAL_FP_REGNUM(2), \ | ||
9021 | + INTERNAL_FP_REGNUM(1), \ | ||
9022 | + INTERNAL_FP_REGNUM(0), \ | ||
9023 | + SP_REGNUM, \ | ||
9024 | + PC_REGNUM \ | ||
9025 | +} | ||
9026 | + | ||
9027 | + | ||
9028 | +/** How Values Fit in Registers **/ | ||
9029 | + | ||
9030 | +/* | ||
9031 | +A C expression for the number of consecutive hard registers, starting | ||
9032 | +at register number REGNO, required to hold a value of mode | ||
9033 | +MODE. | ||
9034 | + | ||
9035 | +On a machine where all registers are exactly one word, a suitable | ||
9036 | +definition of this macro is | ||
9037 | + | ||
9038 | +#define HARD_REGNO_NREGS(REGNO, MODE) \ | ||
9039 | + ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ | ||
9040 | + / UNITS_PER_WORD) | ||
9041 | +*/ | ||
9042 | +#define HARD_REGNO_NREGS(REGNO, MODE) \ | ||
9043 | + ((unsigned int)((GET_MODE_SIZE(MODE) + UNITS_PER_WORD -1 ) / UNITS_PER_WORD)) | ||
9044 | + | ||
9045 | +/* | ||
9046 | +A C expression that is nonzero if it is permissible to store a value | ||
9047 | +of mode MODE in hard register number REGNO (or in several | ||
9048 | +registers starting with that one). For a machine where all registers | ||
9049 | +are equivalent, a suitable definition is | ||
9050 | + | ||
9051 | + #define HARD_REGNO_MODE_OK(REGNO, MODE) 1 | ||
9052 | + | ||
9053 | +You need not include code to check for the numbers of fixed registers, | ||
9054 | +because the allocation mechanism considers them to be always occupied. | ||
9055 | + | ||
9056 | +On some machines, double-precision values must be kept in even/odd | ||
9057 | +register pairs. You can implement that by defining this macro to reject | ||
9058 | +odd register numbers for such modes. | ||
9059 | + | ||
9060 | +The minimum requirement for a mode to be OK in a register is that the | ||
9061 | +mov[mode] instruction pattern support moves between the | ||
9062 | +register and other hard register in the same class and that moving a | ||
9063 | +value into the register and back out not alter it. | ||
9064 | + | ||
9065 | +Since the same instruction used to move word_mode will work for | ||
9066 | +all narrower integer modes, it is not necessary on any machine for | ||
9067 | +HARD_REGNO_MODE_OK to distinguish between these modes, provided | ||
9068 | +you define patterns movhi, etc., to take advantage of this. This | ||
9069 | +is useful because of the interaction between HARD_REGNO_MODE_OK | ||
9070 | +and MODES_TIEABLE_P; it is very desirable for all integer modes | ||
9071 | +to be tieable. | ||
9072 | + | ||
9073 | +Many machines have special registers for floating point arithmetic. | ||
9074 | +Often people assume that floating point machine modes are allowed only | ||
9075 | +in floating point registers. This is not true. Any registers that | ||
9076 | +can hold integers can safely hold a floating point machine | ||
9077 | +mode, whether or not floating arithmetic can be done on it in those | ||
9078 | +registers. Integer move instructions can be used to move the values. | ||
9079 | + | ||
9080 | +On some machines, though, the converse is true: fixed-point machine | ||
9081 | +modes may not go in floating registers. This is true if the floating | ||
9082 | +registers normalize any value stored in them, because storing a | ||
9083 | +non-floating value there would garble it. In this case, | ||
9084 | +HARD_REGNO_MODE_OK should reject fixed-point machine modes in | ||
9085 | +floating registers. But if the floating registers do not automatically | ||
9086 | +normalize, if you can store any bit pattern in one and retrieve it | ||
9087 | +unchanged without a trap, then any machine mode may go in a floating | ||
9088 | +register, so you can define this macro to say so. | ||
9089 | + | ||
9090 | +The primary significance of special floating registers is rather that | ||
9091 | +they are the registers acceptable in floating point arithmetic | ||
9092 | +instructions. However, this is of no concern to | ||
9093 | +HARD_REGNO_MODE_OK. You handle it by writing the proper | ||
9094 | +constraints for those instructions. | ||
9095 | + | ||
9096 | +On some machines, the floating registers are especially slow to access, | ||
9097 | +so that it is better to store a value in a stack frame than in such a | ||
9098 | +register if floating point arithmetic is not being done. As long as the | ||
9099 | +floating registers are not in class GENERAL_REGS, they will not | ||
9100 | +be used unless some pattern's constraint asks for one. | ||
9101 | +*/ | ||
9102 | +#define HARD_REGNO_MODE_OK(REGNO, MODE) avr32_hard_regno_mode_ok(REGNO, MODE) | ||
9103 | + | ||
9104 | +/* | ||
9105 | +A C expression that is nonzero if a value of mode | ||
9106 | +MODE1 is accessible in mode MODE2 without copying. | ||
9107 | + | ||
9108 | +If HARD_REGNO_MODE_OK(R, MODE1) and | ||
9109 | +HARD_REGNO_MODE_OK(R, MODE2) are always the same for | ||
9110 | +any R, then MODES_TIEABLE_P(MODE1, MODE2) | ||
9111 | +should be nonzero. If they differ for any R, you should define | ||
9112 | +this macro to return zero unless some other mechanism ensures the | ||
9113 | +accessibility of the value in a narrower mode. | ||
9114 | + | ||
9115 | +You should define this macro to return nonzero in as many cases as | ||
9116 | +possible since doing so will allow GCC to perform better register | ||
9117 | +allocation. | ||
9118 | +*/ | ||
9119 | +#define MODES_TIEABLE_P(MODE1, MODE2) \ | ||
9120 | + (GET_MODE_CLASS (MODE1) == GET_MODE_CLASS (MODE2)) | ||
9121 | + | ||
9122 | + | ||
9123 | + | ||
9124 | +/****************************************************************************** | ||
9125 | + * Register Classes | ||
9126 | + *****************************************************************************/ | ||
9127 | + | ||
9128 | +/* | ||
9129 | +An enumeral type that must be defined with all the register class names | ||
9130 | +as enumeral values. NO_REGS must be first. ALL_REGS | ||
9131 | +must be the last register class, followed by one more enumeral value, | ||
9132 | +LIM_REG_CLASSES, which is not a register class but rather | ||
9133 | +tells how many classes there are. | ||
9134 | + | ||
9135 | +Each register class has a number, which is the value of casting | ||
9136 | +the class name to type int. The number serves as an index | ||
9137 | +in many of the tables described below. | ||
9138 | +*/ | ||
9139 | +enum reg_class | ||
9140 | +{ | ||
9141 | + NO_REGS, | ||
9142 | + GENERAL_REGS, | ||
9143 | + FP_REGS, | ||
9144 | + ALL_REGS, | ||
9145 | + LIM_REG_CLASSES | ||
9146 | +}; | ||
9147 | + | ||
9148 | +/* | ||
9149 | +The number of distinct register classes, defined as follows: | ||
9150 | + #define N_REG_CLASSES (int) LIM_REG_CLASSES | ||
9151 | +*/ | ||
9152 | +#define N_REG_CLASSES (int)LIM_REG_CLASSES | ||
9153 | + | ||
9154 | +/* | ||
9155 | +An initializer containing the names of the register classes as C string | ||
9156 | +constants. These names are used in writing some of the debugging dumps. | ||
9157 | +*/ | ||
9158 | +#define REG_CLASS_NAMES \ | ||
9159 | +{ \ | ||
9160 | + "NO_REGS", \ | ||
9161 | + "GENERAL_REGS", \ | ||
9162 | + "FLOATING_POINT_REGS", \ | ||
9163 | + "ALL_REGS" \ | ||
9164 | +} | ||
9165 | + | ||
9166 | +/* | ||
9167 | +An initializer containing the contents of the register classes, as integers | ||
9168 | +which are bit masks. The nth integer specifies the contents of class | ||
9169 | +n. The way the integer mask is interpreted is that | ||
9170 | +register r is in the class if mask & (1 << r) is 1. | ||
9171 | + | ||
9172 | +When the machine has more than 32 registers, an integer does not suffice. | ||
9173 | +Then the integers are replaced by sub-initializers, braced groupings containing | ||
9174 | +several integers. Each sub-initializer must be suitable as an initializer | ||
9175 | +for the type HARD_REG_SET which is defined in hard-reg-set.h. | ||
9176 | +In this situation, the first integer in each sub-initializer corresponds to | ||
9177 | +registers 0 through 31, the second integer to registers 32 through 63, and | ||
9178 | +so on. | ||
9179 | +*/ | ||
9180 | +#define REG_CLASS_CONTENTS { \ | ||
9181 | + {0x00000000}, /* NO_REGS */ \ | ||
9182 | + {0x0000FFFF}, /* GENERAL_REGS */ \ | ||
9183 | + {0xFFFF0000}, /* FP_REGS */ \ | ||
9184 | + {0x7FFFFFFF}, /* ALL_REGS */ \ | ||
9185 | +} | ||
9186 | + | ||
9187 | + | ||
9188 | +/* | ||
9189 | +A C expression whose value is a register class containing hard register | ||
9190 | +REGNO. In general there is more than one such class; choose a class | ||
9191 | +which is minimal, meaning that no smaller class also contains the | ||
9192 | +register. | ||
9193 | +*/ | ||
9194 | +#define REGNO_REG_CLASS(REGNO) ((REGNO < 16) ? GENERAL_REGS : FP_REGS) | ||
9195 | + | ||
9196 | +/* | ||
9197 | +A macro whose definition is the name of the class to which a valid | ||
9198 | +base register must belong. A base register is one used in an address | ||
9199 | +which is the register value plus a displacement. | ||
9200 | +*/ | ||
9201 | +#define BASE_REG_CLASS GENERAL_REGS | ||
9202 | + | ||
9203 | +/* | ||
9204 | +This is a variation of the BASE_REG_CLASS macro which allows | ||
9205 | +the selection of a base register in a mode depenedent manner. If | ||
9206 | +mode is VOIDmode then it should return the same value as | ||
9207 | +BASE_REG_CLASS. | ||
9208 | +*/ | ||
9209 | +#define MODE_BASE_REG_CLASS(MODE) BASE_REG_CLASS | ||
9210 | + | ||
9211 | +/* | ||
9212 | +A macro whose definition is the name of the class to which a valid | ||
9213 | +index register must belong. An index register is one used in an | ||
9214 | +address where its value is either multiplied by a scale factor or | ||
9215 | +added to another register (as well as added to a displacement). | ||
9216 | +*/ | ||
9217 | +#define INDEX_REG_CLASS BASE_REG_CLASS | ||
9218 | + | ||
9219 | +/* | ||
9220 | +A C expression which defines the machine-dependent operand constraint | ||
9221 | +letters for register classes. If CHAR is such a letter, the | ||
9222 | +value should be the register class corresponding to it. Otherwise, | ||
9223 | +the value should be NO_REGS. The register letter r, | ||
9224 | +corresponding to class GENERAL_REGS, will not be passed | ||
9225 | +to this macro; you do not need to handle it. | ||
9226 | +*/ | ||
9227 | +#define REG_CLASS_FROM_LETTER(CHAR) ((CHAR) == 'f' ? FP_REGS : NO_REGS) | ||
9228 | + | ||
9229 | + | ||
9230 | +/* These assume that REGNO is a hard or pseudo reg number. | ||
9231 | + They give nonzero only if REGNO is a hard reg of the suitable class | ||
9232 | + or a pseudo reg currently allocated to a suitable hard reg. | ||
9233 | + Since they use reg_renumber, they are safe only once reg_renumber | ||
9234 | + has been allocated, which happens in local-alloc.c. */ | ||
9235 | +#define TEST_REGNO(R, TEST, VALUE) \ | ||
9236 | + ((R TEST VALUE) || ((unsigned) reg_renumber[R] TEST VALUE)) | ||
9237 | + | ||
9238 | +/* | ||
9239 | +A C expression which is nonzero if register number num is suitable for use as a base | ||
9240 | +register in operand addresses. It may be either a suitable hard register or a pseudo | ||
9241 | +register that has been allocated such a hard register. | ||
9242 | +*/ | ||
9243 | +#define REGNO_OK_FOR_BASE_P(NUM) TEST_REGNO(NUM, <=, LAST_REGNUM) | ||
9244 | + | ||
9245 | +/* | ||
9246 | +A C expression which is nonzero if register number NUM is | ||
9247 | +suitable for use as an index register in operand addresses. It may be | ||
9248 | +either a suitable hard register or a pseudo register that has been | ||
9249 | +allocated such a hard register. | ||
9250 | + | ||
9251 | +The difference between an index register and a base register is that | ||
9252 | +the index register may be scaled. If an address involves the sum of | ||
9253 | +two registers, neither one of them scaled, then either one may be | ||
9254 | +labeled the ``base'' and the other the ``index''; but whichever | ||
9255 | +labeling is used must fit the machine's constraints of which registers | ||
9256 | +may serve in each capacity. The compiler will try both labelings, | ||
9257 | +looking for one that is valid, and will reload one or both registers | ||
9258 | +only if neither labeling works. | ||
9259 | +*/ | ||
9260 | +#define REGNO_OK_FOR_INDEX_P(NUM) TEST_REGNO(NUM, <=, LAST_REGNUM) | ||
9261 | + | ||
9262 | +/* | ||
9263 | +A C expression that places additional restrictions on the register class | ||
9264 | +to use when it is necessary to copy value X into a register in class | ||
9265 | +CLASS. The value is a register class; perhaps CLASS, or perhaps | ||
9266 | +another, smaller class. On many machines, the following definition is | ||
9267 | +safe: #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS | ||
9268 | + | ||
9269 | +Sometimes returning a more restrictive class makes better code. For | ||
9270 | +example, on the 68000, when X is an integer constant that is in range | ||
9271 | +for a 'moveq' instruction, the value of this macro is always | ||
9272 | +DATA_REGS as long as CLASS includes the data registers. | ||
9273 | +Requiring a data register guarantees that a 'moveq' will be used. | ||
9274 | + | ||
9275 | +If X is a const_double, by returning NO_REGS | ||
9276 | +you can force X into a memory constant. This is useful on | ||
9277 | +certain machines where immediate floating values cannot be loaded into | ||
9278 | +certain kinds of registers. | ||
9279 | +*/ | ||
9280 | +#define PREFERRED_RELOAD_CLASS(X, CLASS) CLASS | ||
9281 | + | ||
9282 | + | ||
9283 | + | ||
9284 | +/* | ||
9285 | +A C expression for the maximum number of consecutive registers | ||
9286 | +of class CLASS needed to hold a value of mode MODE. | ||
9287 | + | ||
9288 | +This is closely related to the macro HARD_REGNO_NREGS. In fact, | ||
9289 | +the value of the macro CLASS_MAX_NREGS(CLASS, MODE) | ||
9290 | +should be the maximum value of HARD_REGNO_NREGS(REGNO, MODE) | ||
9291 | +for all REGNO values in the class CLASS. | ||
9292 | + | ||
9293 | +This macro helps control the handling of multiple-word values | ||
9294 | +in the reload pass. | ||
9295 | +*/ | ||
9296 | +#define CLASS_MAX_NREGS(CLASS, MODE) /* ToDo:fixme */ \ | ||
9297 | + (unsigned int)((GET_MODE_SIZE(MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD) | ||
9298 | + | ||
9299 | + | ||
9300 | +/* | ||
9301 | + Using CONST_OK_FOR_CONSTRAINT_P instead of CONS_OK_FOR_LETTER_P | ||
9302 | + in order to support constraints with more than one letter. | ||
9303 | + Only two letters are then used for constant constraints, | ||
9304 | + the letter 'K' and the letter 'I'. The constraint starting with | ||
9305 | + these letters must consist of four characters. The character following | ||
9306 | + 'K' or 'I' must be either 'u' (unsigned) or 's' (signed) to specify | ||
9307 | + if the constant is zero or sign extended. The last two characters specify | ||
9308 | + the length in bits of the constant. The base constraint letter 'I' means | ||
9309 | + that this is an negated constant, meaning that actually -VAL should be | ||
9310 | + checked to lie withing the valid range instead of VAL which is used when | ||
9311 | + 'K' is the base constraint letter. | ||
9312 | + | ||
9313 | +*/ | ||
9314 | + | ||
9315 | +#define CONSTRAINT_LEN(C, STR) \ | ||
9316 | + ( ((C) == 'K' || (C) == 'I') ? 4 : \ | ||
9317 | + ((C) == 'R') ? 5 : \ | ||
9318 | + ((C) == 'N' || (C) == 'O' || \ | ||
9319 | + (C) == 'P' || (C) == 'L' || (C) == 'J') ? -1 : \ | ||
9320 | + DEFAULT_CONSTRAINT_LEN((C), (STR)) ) | ||
9321 | + | ||
9322 | +#define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \ | ||
9323 | + avr32_const_ok_for_constraint_p(VALUE, C, STR) | ||
9324 | + | ||
9325 | +/* | ||
9326 | +A C expression that defines the machine-dependent operand constraint | ||
9327 | +letters that specify particular ranges of const_double values ('G' or 'H'). | ||
9328 | + | ||
9329 | +If C is one of those letters, the expression should check that | ||
9330 | +VALUE, an RTX of code const_double, is in the appropriate | ||
9331 | +range and return 1 if so, 0 otherwise. If C is not one of those | ||
9332 | +letters, the value should be 0 regardless of VALUE. | ||
9333 | + | ||
9334 | +const_double is used for all floating-point constants and for | ||
9335 | +DImode fixed-point constants. A given letter can accept either | ||
9336 | +or both kinds of values. It can use GET_MODE to distinguish | ||
9337 | +between these kinds. | ||
9338 | +*/ | ||
9339 | +#define CONST_DOUBLE_OK_FOR_LETTER_P(OP, C) \ | ||
9340 | + ((C) == 'G' ? avr32_const_double_immediate(OP) : 0) | ||
9341 | + | ||
9342 | +/* | ||
9343 | +A C expression that defines the optional machine-dependent constraint | ||
9344 | +letters that can be used to segregate specific types of operands, usually | ||
9345 | +memory references, for the target machine. Any letter that is not | ||
9346 | +elsewhere defined and not matched by REG_CLASS_FROM_LETTER | ||
9347 | +may be used. Normally this macro will not be defined. | ||
9348 | + | ||
9349 | +If it is required for a particular target machine, it should return 1 | ||
9350 | +if VALUE corresponds to the operand type represented by the | ||
9351 | +constraint letter C. If C is not defined as an extra | ||
9352 | +constraint, the value returned should be 0 regardless of VALUE. | ||
9353 | + | ||
9354 | +For example, on the ROMP, load instructions cannot have their output | ||
9355 | +in r0 if the memory reference contains a symbolic address. Constraint | ||
9356 | +letter 'Q' is defined as representing a memory address that does | ||
9357 | +not contain a symbolic address. An alternative is specified with | ||
9358 | +a 'Q' constraint on the input and 'r' on the output. The next | ||
9359 | +alternative specifies 'm' on the input and a register class that | ||
9360 | +does not include r0 on the output. | ||
9361 | +*/ | ||
9362 | +#define EXTRA_CONSTRAINT_STR(OP, C, STR) \ | ||
9363 | + ((C) == 'W' ? avr32_address_operand(OP, GET_MODE(OP)) : \ | ||
9364 | + (C) == 'R' ? (avr32_indirect_register_operand(OP, GET_MODE(OP)) || \ | ||
9365 | + (avr32_imm_disp_memory_operand(OP, GET_MODE(OP)) \ | ||
9366 | + && avr32_const_ok_for_constraint_p( \ | ||
9367 | + INTVAL(XEXP(XEXP(OP, 0), 1)), \ | ||
9368 | + (STR)[1], &(STR)[1]))) : \ | ||
9369 | + (C) == 'S' ? avr32_indexed_memory_operand(OP, GET_MODE(OP)) : \ | ||
9370 | + (C) == 'T' ? avr32_const_pool_ref_operand(OP, GET_MODE(OP)) : \ | ||
9371 | + (C) == 'U' ? SYMBOL_REF_RCALL_FUNCTION_P(OP) : \ | ||
9372 | + (C) == 'Z' ? avr32_cop_memory_operand(OP, GET_MODE(OP)) : \ | ||
9373 | + 0) | ||
9374 | + | ||
9375 | + | ||
9376 | +#define EXTRA_MEMORY_CONSTRAINT(C, STR) ( ((C) == 'R') || \ | ||
9377 | + ((C) == 'S') || \ | ||
9378 | + ((C) == 'Z') ) | ||
9379 | + | ||
9380 | + | ||
9381 | +/* Returns nonzero if op is a function SYMBOL_REF which | ||
9382 | + can be called using an rcall instruction */ | ||
9383 | +#define SYMBOL_REF_RCALL_FUNCTION_P(op) \ | ||
9384 | + ( GET_CODE(op) == SYMBOL_REF \ | ||
9385 | + && SYMBOL_REF_FUNCTION_P(op) \ | ||
9386 | + && SYMBOL_REF_LOCAL_P(op) \ | ||
9387 | + && !SYMBOL_REF_EXTERNAL_P(op) \ | ||
9388 | + && !TARGET_HAS_ASM_ADDR_PSEUDOS ) | ||
9389 | + | ||
9390 | +/****************************************************************************** | ||
9391 | + * Stack Layout and Calling Conventions | ||
9392 | + *****************************************************************************/ | ||
9393 | + | ||
9394 | +/** Basic Stack Layout **/ | ||
9395 | + | ||
9396 | +/* | ||
9397 | +Define this macro if pushing a word onto the stack moves the stack | ||
9398 | +pointer to a smaller address. | ||
9399 | + | ||
9400 | +When we say, ``define this macro if ...,'' it means that the | ||
9401 | +compiler checks this macro only with #ifdef so the precise | ||
9402 | +definition used does not matter. | ||
9403 | +*/ | ||
9404 | +/* pushm decrece SP: *(--SP) <-- Rx */ | ||
9405 | +#define STACK_GROWS_DOWNWARD | ||
9406 | + | ||
9407 | +/* | ||
9408 | +This macro defines the operation used when something is pushed | ||
9409 | +on the stack. In RTL, a push operation will be | ||
9410 | +(set (mem (STACK_PUSH_CODE (reg sp))) ...) | ||
9411 | + | ||
9412 | +The choices are PRE_DEC, POST_DEC, PRE_INC, | ||
9413 | +and POST_INC. Which of these is correct depends on | ||
9414 | +the stack direction and on whether the stack pointer points | ||
9415 | +to the last item on the stack or whether it points to the | ||
9416 | +space for the next item on the stack. | ||
9417 | + | ||
9418 | +The default is PRE_DEC when STACK_GROWS_DOWNWARD is | ||
9419 | +defined, which is almost always right, and PRE_INC otherwise, | ||
9420 | +which is often wrong. | ||
9421 | +*/ | ||
9422 | +/* pushm: *(--SP) <-- Rx */ | ||
9423 | +#define STACK_PUSH_CODE PRE_DEC | ||
9424 | + | ||
9425 | +/* | ||
9426 | +Define this macro if the addresses of local variable slots are at negative | ||
9427 | +offsets from the frame pointer. | ||
9428 | +*/ | ||
9429 | +#define FRAME_GROWS_DOWNWARD | ||
9430 | + | ||
9431 | + | ||
9432 | +/* | ||
9433 | +Offset from the frame pointer to the first local variable slot to be allocated. | ||
9434 | + | ||
9435 | +If FRAME_GROWS_DOWNWARD, find the next slot's offset by | ||
9436 | +subtracting the first slot's length from STARTING_FRAME_OFFSET. | ||
9437 | +Otherwise, it is found by adding the length of the first slot to the | ||
9438 | +value STARTING_FRAME_OFFSET. | ||
9439 | + (i'm not sure if the above is still correct.. had to change it to get | ||
9440 | + rid of an overfull. --mew 2feb93 ) | ||
9441 | +*/ | ||
9442 | +#define STARTING_FRAME_OFFSET 0 | ||
9443 | + | ||
9444 | +/* | ||
9445 | +Offset from the stack pointer register to the first location at which | ||
9446 | +outgoing arguments are placed. If not specified, the default value of | ||
9447 | +zero is used. This is the proper value for most machines. | ||
9448 | + | ||
9449 | +If ARGS_GROW_DOWNWARD, this is the offset to the location above | ||
9450 | +the first location at which outgoing arguments are placed. | ||
9451 | +*/ | ||
9452 | +#define STACK_POINTER_OFFSET 0 | ||
9453 | + | ||
9454 | +/* | ||
9455 | +Offset from the argument pointer register to the first argument's | ||
9456 | +address. On some machines it may depend on the data type of the | ||
9457 | +function. | ||
9458 | + | ||
9459 | +If ARGS_GROW_DOWNWARD, this is the offset to the location above | ||
9460 | +the first argument's address. | ||
9461 | +*/ | ||
9462 | +#define FIRST_PARM_OFFSET(FUNDECL) 0 | ||
9463 | + | ||
9464 | + | ||
9465 | +/* | ||
9466 | +A C expression whose value is RTL representing the address in a stack | ||
9467 | +frame where the pointer to the caller's frame is stored. Assume that | ||
9468 | +FRAMEADDR is an RTL expression for the address of the stack frame | ||
9469 | +itself. | ||
9470 | + | ||
9471 | +If you don't define this macro, the default is to return the value | ||
9472 | +of FRAMEADDR - that is, the stack frame address is also the | ||
9473 | +address of the stack word that points to the previous frame. | ||
9474 | +*/ | ||
9475 | +#define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) plus_constant ((FRAMEADDR), 4) | ||
9476 | + | ||
9477 | + | ||
9478 | +/* | ||
9479 | +A C expression whose value is RTL representing the value of the return | ||
9480 | +address for the frame COUNT steps up from the current frame, after | ||
9481 | +the prologue. FRAMEADDR is the frame pointer of the COUNT | ||
9482 | +frame, or the frame pointer of the COUNT - 1 frame if | ||
9483 | +RETURN_ADDR_IN_PREVIOUS_FRAME is defined. | ||
9484 | + | ||
9485 | +The value of the expression must always be the correct address when | ||
9486 | +COUNT is zero, but may be NULL_RTX if there is not way to | ||
9487 | +determine the return address of other frames. | ||
9488 | +*/ | ||
9489 | +#define RETURN_ADDR_RTX(COUNT, FRAMEADDR) avr32_return_addr(COUNT, FRAMEADDR) | ||
9490 | + | ||
9491 | + | ||
9492 | +/* | ||
9493 | +A C expression whose value is RTL representing the location of the | ||
9494 | +incoming return address at the beginning of any function, before the | ||
9495 | +prologue. This RTL is either a REG, indicating that the return | ||
9496 | +value is saved in 'REG', or a MEM representing a location in | ||
9497 | +the stack. | ||
9498 | + | ||
9499 | +You only need to define this macro if you want to support call frame | ||
9500 | +debugging information like that provided by DWARF 2. | ||
9501 | + | ||
9502 | +If this RTL is a REG, you should also define | ||
9503 | +DWARF_FRAME_RETURN_COLUMN to DWARF_FRAME_REGNUM (REGNO). | ||
9504 | +*/ | ||
9505 | +#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, LR_REGNUM) | ||
9506 | + | ||
9507 | + | ||
9508 | + | ||
9509 | +/* | ||
9510 | +A C expression whose value is an integer giving the offset, in bytes, | ||
9511 | +from the value of the stack pointer register to the top of the stack | ||
9512 | +frame at the beginning of any function, before the prologue. The top of | ||
9513 | +the frame is defined to be the value of the stack pointer in the | ||
9514 | +previous frame, just before the call instruction. | ||
9515 | + | ||
9516 | +You only need to define this macro if you want to support call frame | ||
9517 | +debugging information like that provided by DWARF 2. | ||
9518 | +*/ | ||
9519 | +#define INCOMING_FRAME_SP_OFFSET 0 | ||
9520 | + | ||
9521 | + | ||
9522 | +/** Exception Handling Support **/ | ||
9523 | + | ||
9524 | +#define DWARF2_UNWIND_INFO 1 | ||
9525 | + | ||
9526 | +/* | ||
9527 | +A C expression whose value is the Nth register number used for | ||
9528 | +data by exception handlers, or INVALID_REGNUM if fewer than | ||
9529 | +N registers are usable. | ||
9530 | + | ||
9531 | +The exception handling library routines communicate with the exception | ||
9532 | +handlers via a set of agreed upon registers. Ideally these registers | ||
9533 | +should be call-clobbered; it is possible to use call-saved registers, | ||
9534 | +but may negatively impact code size. The target must support at least | ||
9535 | +2 data registers, but should define 4 if there are enough free registers. | ||
9536 | + | ||
9537 | +You must define this macro if you want to support call frame exception | ||
9538 | +handling like that provided by DWARF 2. | ||
9539 | +*/ | ||
9540 | +/* | ||
9541 | + Use r8-r11 | ||
9542 | +*/ | ||
9543 | +#define EH_RETURN_DATA_REGNO(N) \ | ||
9544 | + ((N) < 4 ? INTERNAL_REGNUM((N) + 8U) : INVALID_REGNUM) | ||
9545 | + | ||
9546 | +/* | ||
9547 | +A C expression whose value is RTL representing a location in which | ||
9548 | +to store a stack adjustment to be applied before function return. | ||
9549 | +This is used to unwind the stack to an exception handler's call frame. | ||
9550 | +It will be assigned zero on code paths that return normally. | ||
9551 | + | ||
9552 | +Typically this is a call-clobbered hard register that is otherwise | ||
9553 | +untouched by the epilogue, but could also be a stack slot. | ||
9554 | + | ||
9555 | +You must define this macro if you want to support call frame exception | ||
9556 | +handling like that provided by DWARF 2. | ||
9557 | +*/ | ||
9558 | +/* | ||
9559 | + I don't think functions that may throw exceptions can ever be leaf | ||
9560 | + functions, so we may safely use LR for this. | ||
9561 | +*/ | ||
9562 | +#define EH_RETURN_STACKADJ_REGNO LR_REGNUM | ||
9563 | +#define EH_RETURN_STACKADJ_RTX gen_rtx_REG(SImode, EH_RETURN_STACKADJ_REGNO) | ||
9564 | + | ||
9565 | +/* | ||
9566 | +A C expression whose value is RTL representing a location in which | ||
9567 | +to store the address of an exception handler to which we should | ||
9568 | +return. It will not be assigned on code paths that return normally. | ||
9569 | + | ||
9570 | +Typically this is the location in the call frame at which the normal | ||
9571 | +return address is stored. For targets that return by popping an | ||
9572 | +address off the stack, this might be a memory address just below | ||
9573 | +the target call frame rather than inside the current call | ||
9574 | +frame. EH_RETURN_STACKADJ_RTX will have already been assigned, | ||
9575 | +so it may be used to calculate the location of the target call frame. | ||
9576 | + | ||
9577 | +Some targets have more complex requirements than storing to an | ||
9578 | +address calculable during initial code generation. In that case | ||
9579 | +the eh_return instruction pattern should be used instead. | ||
9580 | + | ||
9581 | +If you want to support call frame exception handling, you must | ||
9582 | +define either this macro or the eh_return instruction pattern. | ||
9583 | +*/ | ||
9584 | +/* | ||
9585 | + We define the eh_return instruction pattern, so this isn't needed. | ||
9586 | +*/ | ||
9587 | +/* #define EH_RETURN_HANDLER_RTX gen_rtx_REG(Pmode, RET_REGISTER) */ | ||
9588 | + | ||
9589 | +/* | ||
9590 | + This macro chooses the encoding of pointers embedded in the | ||
9591 | + exception handling sections. If at all possible, this should be | ||
9592 | + defined such that the exception handling section will not require | ||
9593 | + dynamic relocations, and so may be read-only. | ||
9594 | + | ||
9595 | + code is 0 for data, 1 for code labels, 2 for function | ||
9596 | + pointers. global is true if the symbol may be affected by dynamic | ||
9597 | + relocations. The macro should return a combination of the DW_EH_PE_* | ||
9598 | + defines as found in dwarf2.h. | ||
9599 | + | ||
9600 | + If this macro is not defined, pointers will not be encoded but | ||
9601 | + represented directly. | ||
9602 | +*/ | ||
9603 | +#define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ | ||
9604 | + ((flag_pic && (GLOBAL) ? DW_EH_PE_indirect : 0) \ | ||
9605 | + | (flag_pic ? DW_EH_PE_pcrel : DW_EH_PE_absptr) \ | ||
9606 | + | DW_EH_PE_sdata4) | ||
9607 | + | ||
9608 | +/* ToDo: The rest of this subsection */ | ||
9609 | + | ||
9610 | +/** Specifying How Stack Checking is Done **/ | ||
9611 | +/* ToDo: All in this subsection */ | ||
9612 | + | ||
9613 | +/** Registers That Address the Stack Frame **/ | ||
9614 | + | ||
9615 | +/* | ||
9616 | +The register number of the stack pointer register, which must also be a | ||
9617 | +fixed register according to FIXED_REGISTERS. On most machines, | ||
9618 | +the hardware determines which register this is. | ||
9619 | +*/ | ||
9620 | +/* Using r13 as stack pointer. */ | ||
9621 | +#define STACK_POINTER_REGNUM INTERNAL_REGNUM(13) | ||
9622 | + | ||
9623 | +/* | ||
9624 | +The register number of the frame pointer register, which is used to | ||
9625 | +access automatic variables in the stack frame. On some machines, the | ||
9626 | +hardware determines which register this is. On other machines, you can | ||
9627 | +choose any register you wish for this purpose. | ||
9628 | +*/ | ||
9629 | +/* Use r7 */ | ||
9630 | +#define FRAME_POINTER_REGNUM INTERNAL_REGNUM(7) | ||
9631 | + | ||
9632 | + | ||
9633 | + | ||
9634 | +/* | ||
9635 | +The register number of the arg pointer register, which is used to access | ||
9636 | +the function's argument list. On some machines, this is the same as the | ||
9637 | +frame pointer register. On some machines, the hardware determines which | ||
9638 | +register this is. On other machines, you can choose any register you | ||
9639 | +wish for this purpose. If this is not the same register as the frame | ||
9640 | +pointer register, then you must mark it as a fixed register according to | ||
9641 | +FIXED_REGISTERS, or arrange to be able to eliminate it (see Section | ||
9642 | +10.10.5 [Elimination], page 224). | ||
9643 | +*/ | ||
9644 | +/* Using r5 */ | ||
9645 | +#define ARG_POINTER_REGNUM INTERNAL_REGNUM(4) | ||
9646 | + | ||
9647 | + | ||
9648 | +/* | ||
9649 | +Register numbers used for passing a function's static chain pointer. If | ||
9650 | +register windows are used, the register number as seen by the called | ||
9651 | +function is STATIC_CHAIN_INCOMING_REGNUM, while the register | ||
9652 | +number as seen by the calling function is STATIC_CHAIN_REGNUM. If | ||
9653 | +these registers are the same, STATIC_CHAIN_INCOMING_REGNUM need | ||
9654 | +not be defined. | ||
9655 | + | ||
9656 | +The static chain register need not be a fixed register. | ||
9657 | + | ||
9658 | +If the static chain is passed in memory, these macros should not be | ||
9659 | +defined; instead, the next two macros should be defined. | ||
9660 | +*/ | ||
9661 | +/* Using r0 */ | ||
9662 | +#define STATIC_CHAIN_REGNUM INTERNAL_REGNUM(0) | ||
9663 | + | ||
9664 | + | ||
9665 | +/** Eliminating Frame Pointer and Arg Pointer **/ | ||
9666 | + | ||
9667 | +/* | ||
9668 | +A C expression which is nonzero if a function must have and use a frame | ||
9669 | +pointer. This expression is evaluated in the reload pass. If its value is | ||
9670 | +nonzero the function will have a frame pointer. | ||
9671 | + | ||
9672 | +The expression can in principle examine the current function and decide | ||
9673 | +according to the facts, but on most machines the constant 0 or the | ||
9674 | +constant 1 suffices. Use 0 when the machine allows code to be generated | ||
9675 | +with no frame pointer, and doing so saves some time or space. Use 1 | ||
9676 | +when there is no possible advantage to avoiding a frame pointer. | ||
9677 | + | ||
9678 | +In certain cases, the compiler does not know how to produce valid code | ||
9679 | +without a frame pointer. The compiler recognizes those cases and | ||
9680 | +automatically gives the function a frame pointer regardless of what | ||
9681 | +FRAME_POINTER_REQUIRED says. You don't need to worry about | ||
9682 | +them. | ||
9683 | + | ||
9684 | +In a function that does not require a frame pointer, the frame pointer | ||
9685 | +register can be allocated for ordinary usage, unless you mark it as a | ||
9686 | +fixed register. See FIXED_REGISTERS for more information. | ||
9687 | +*/ | ||
9688 | +/* We need the frame pointer when compiling for profiling */ | ||
9689 | +#define FRAME_POINTER_REQUIRED (current_function_profile) | ||
9690 | + | ||
9691 | +/* | ||
9692 | +A C statement to store in the variable DEPTH_VAR the difference | ||
9693 | +between the frame pointer and the stack pointer values immediately after | ||
9694 | +the function prologue. The value would be computed from information | ||
9695 | +such as the result of get_frame_size () and the tables of | ||
9696 | +registers regs_ever_live and call_used_regs. | ||
9697 | + | ||
9698 | +If ELIMINABLE_REGS is defined, this macro will be not be used and | ||
9699 | +need not be defined. Otherwise, it must be defined even if | ||
9700 | +FRAME_POINTER_REQUIRED is defined to always be true; in that | ||
9701 | +case, you may set DEPTH_VAR to anything. | ||
9702 | +*/ | ||
9703 | +#define INITIAL_FRAME_POINTER_OFFSET(DEPTH_VAR) ((DEPTH_VAR) = get_frame_size()) | ||
9704 | + | ||
9705 | +/* | ||
9706 | +If defined, this macro specifies a table of register pairs used to | ||
9707 | +eliminate unneeded registers that point into the stack frame. If it is not | ||
9708 | +defined, the only elimination attempted by the compiler is to replace | ||
9709 | +references to the frame pointer with references to the stack pointer. | ||
9710 | + | ||
9711 | +The definition of this macro is a list of structure initializations, each | ||
9712 | +of which specifies an original and replacement register. | ||
9713 | + | ||
9714 | +On some machines, the position of the argument pointer is not known until | ||
9715 | +the compilation is completed. In such a case, a separate hard register | ||
9716 | +must be used for the argument pointer. This register can be eliminated by | ||
9717 | +replacing it with either the frame pointer or the argument pointer, | ||
9718 | +depending on whether or not the frame pointer has been eliminated. | ||
9719 | + | ||
9720 | +In this case, you might specify: | ||
9721 | + #define ELIMINABLE_REGS \ | ||
9722 | + {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ | ||
9723 | + {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ | ||
9724 | + {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}} | ||
9725 | + | ||
9726 | +Note that the elimination of the argument pointer with the stack pointer is | ||
9727 | +specified first since that is the preferred elimination. | ||
9728 | +*/ | ||
9729 | +#define ELIMINABLE_REGS \ | ||
9730 | +{ \ | ||
9731 | + { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ | ||
9732 | + { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ | ||
9733 | + { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM } \ | ||
9734 | +} | ||
9735 | + | ||
9736 | +/* | ||
9737 | +A C expression that returns nonzero if the compiler is allowed to try | ||
9738 | +to replace register number FROM with register number | ||
9739 | +TO. This macro need only be defined if ELIMINABLE_REGS | ||
9740 | +is defined, and will usually be the constant 1, since most of the cases | ||
9741 | +preventing register elimination are things that the compiler already | ||
9742 | +knows about. | ||
9743 | +*/ | ||
9744 | +#define CAN_ELIMINATE(FROM, TO) 1 | ||
9745 | + | ||
9746 | +/* | ||
9747 | +This macro is similar to INITIAL_FRAME_POINTER_OFFSET. It | ||
9748 | +specifies the initial difference between the specified pair of | ||
9749 | +registers. This macro must be defined if ELIMINABLE_REGS is | ||
9750 | +defined. | ||
9751 | +*/ | ||
9752 | +#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ | ||
9753 | + ((OFFSET) = avr32_initial_elimination_offset(FROM, TO)) | ||
9754 | + | ||
9755 | +/** Passing Function Arguments on the Stack **/ | ||
9756 | + | ||
9757 | + | ||
9758 | +/* | ||
9759 | +A C expression. If nonzero, push insns will be used to pass | ||
9760 | +outgoing arguments. | ||
9761 | +If the target machine does not have a push instruction, set it to zero. | ||
9762 | +That directs GCC to use an alternate strategy: to | ||
9763 | +allocate the entire argument block and then store the arguments into | ||
9764 | +it. When PUSH_ARGS is nonzero, PUSH_ROUNDING must be defined too. | ||
9765 | +*/ | ||
9766 | +#define PUSH_ARGS 1 | ||
9767 | + | ||
9768 | + | ||
9769 | +/* | ||
9770 | +A C expression that is the number of bytes actually pushed onto the | ||
9771 | +stack when an instruction attempts to push NPUSHED bytes. | ||
9772 | + | ||
9773 | +On some machines, the definition | ||
9774 | + | ||
9775 | + #define PUSH_ROUNDING(BYTES) (BYTES) | ||
9776 | + | ||
9777 | +will suffice. But on other machines, instructions that appear | ||
9778 | +to push one byte actually push two bytes in an attempt to maintain | ||
9779 | +alignment. Then the definition should be | ||
9780 | + | ||
9781 | + #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1) | ||
9782 | +*/ | ||
9783 | +/* Push 4 bytes at the time. */ | ||
9784 | +#define PUSH_ROUNDING(NPUSHED) (((NPUSHED) + 3) & ~3) | ||
9785 | + | ||
9786 | +/* | ||
9787 | +A C expression. If nonzero, the maximum amount of space required for | ||
9788 | +outgoing arguments will be computed and placed into the variable | ||
9789 | +current_function_outgoing_args_size. No space will be pushed | ||
9790 | +onto the stack for each call; instead, the function prologue should | ||
9791 | +increase the stack frame size by this amount. | ||
9792 | + | ||
9793 | +Setting both PUSH_ARGS and ACCUMULATE_OUTGOING_ARGS is not proper. | ||
9794 | +*/ | ||
9795 | +#define ACCUMULATE_OUTGOING_ARGS 0 | ||
9796 | + | ||
9797 | + | ||
9798 | + | ||
9799 | + | ||
9800 | +/* | ||
9801 | +A C expression that should indicate the number of bytes of its own | ||
9802 | +arguments that a function pops on returning, or 0 if the | ||
9803 | +function pops no arguments and the caller must therefore pop them all | ||
9804 | +after the function returns. | ||
9805 | + | ||
9806 | +FUNDECL is a C variable whose value is a tree node that describes | ||
9807 | +the function in question. Normally it is a node of type | ||
9808 | +FUNCTION_DECL that describes the declaration of the function. | ||
9809 | +From this you can obtain the DECL_ATTRIBUTES of the function. | ||
9810 | + | ||
9811 | +FUNTYPE is a C variable whose value is a tree node that | ||
9812 | +describes the function in question. Normally it is a node of type | ||
9813 | +FUNCTION_TYPE that describes the data type of the function. | ||
9814 | +From this it is possible to obtain the data types of the value and | ||
9815 | +arguments (if known). | ||
9816 | + | ||
9817 | +When a call to a library function is being considered, FUNDECL | ||
9818 | +will contain an identifier node for the library function. Thus, if | ||
9819 | +you need to distinguish among various library functions, you can do so | ||
9820 | +by their names. Note that ``library function'' in this context means | ||
9821 | +a function used to perform arithmetic, whose name is known specially | ||
9822 | +in the compiler and was not mentioned in the C code being compiled. | ||
9823 | + | ||
9824 | +STACK_SIZE is the number of bytes of arguments passed on the | ||
9825 | +stack. If a variable number of bytes is passed, it is zero, and | ||
9826 | +argument popping will always be the responsibility of the calling function. | ||
9827 | + | ||
9828 | +On the VAX, all functions always pop their arguments, so the definition | ||
9829 | +of this macro is STACK_SIZE. On the 68000, using the standard | ||
9830 | +calling convention, no functions pop their arguments, so the value of | ||
9831 | +the macro is always 0 in this case. But an alternative calling | ||
9832 | +convention is available in which functions that take a fixed number of | ||
9833 | +arguments pop them but other functions (such as printf) pop | ||
9834 | +nothing (the caller pops all). When this convention is in use, | ||
9835 | +FUNTYPE is examined to determine whether a function takes a fixed | ||
9836 | +number of arguments. | ||
9837 | +*/ | ||
9838 | +#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0 | ||
9839 | + | ||
9840 | + | ||
9841 | +/*Return true if this function can we use a single return instruction*/ | ||
9842 | +#define USE_RETURN_INSN(ISCOND) avr32_use_return_insn(ISCOND) | ||
9843 | + | ||
9844 | +/* | ||
9845 | +A C expression that should indicate the number of bytes a call sequence | ||
9846 | +pops off the stack. It is added to the value of RETURN_POPS_ARGS | ||
9847 | +when compiling a function call. | ||
9848 | + | ||
9849 | +CUM is the variable in which all arguments to the called function | ||
9850 | +have been accumulated. | ||
9851 | + | ||
9852 | +On certain architectures, such as the SH5, a call trampoline is used | ||
9853 | +that pops certain registers off the stack, depending on the arguments | ||
9854 | +that have been passed to the function. Since this is a property of the | ||
9855 | +call site, not of the called function, RETURN_POPS_ARGS is not | ||
9856 | +appropriate. | ||
9857 | +*/ | ||
9858 | +#define CALL_POPS_ARGS(CUM) 0 | ||
9859 | + | ||
9860 | +/* Passing Arguments in Registers */ | ||
9861 | + | ||
9862 | +/* | ||
9863 | +A C expression that controls whether a function argument is passed | ||
9864 | +in a register, and which register. | ||
9865 | + | ||
9866 | +The arguments are CUM, which summarizes all the previous | ||
9867 | +arguments; MODE, the machine mode of the argument; TYPE, | ||
9868 | +the data type of the argument as a tree node or 0 if that is not known | ||
9869 | +(which happens for C support library functions); and NAMED, | ||
9870 | +which is 1 for an ordinary argument and 0 for nameless arguments that | ||
9871 | +correspond to '...' in the called function's prototype. | ||
9872 | +TYPE can be an incomplete type if a syntax error has previously | ||
9873 | +occurred. | ||
9874 | + | ||
9875 | +The value of the expression is usually either a reg RTX for the | ||
9876 | +hard register in which to pass the argument, or zero to pass the | ||
9877 | +argument on the stack. | ||
9878 | + | ||
9879 | +For machines like the VAX and 68000, where normally all arguments are | ||
9880 | +pushed, zero suffices as a definition. | ||
9881 | + | ||
9882 | +The value of the expression can also be a parallel RTX. This is | ||
9883 | +used when an argument is passed in multiple locations. The mode of the | ||
9884 | +of the parallel should be the mode of the entire argument. The | ||
9885 | +parallel holds any number of expr_list pairs; each one | ||
9886 | +describes where part of the argument is passed. In each | ||
9887 | +expr_list the first operand must be a reg RTX for the hard | ||
9888 | +register in which to pass this part of the argument, and the mode of the | ||
9889 | +register RTX indicates how large this part of the argument is. The | ||
9890 | +second operand of the expr_list is a const_int which gives | ||
9891 | +the offset in bytes into the entire argument of where this part starts. | ||
9892 | +As a special exception the first expr_list in the parallel | ||
9893 | +RTX may have a first operand of zero. This indicates that the entire | ||
9894 | +argument is also stored on the stack. | ||
9895 | + | ||
9896 | +The last time this macro is called, it is called with MODE == VOIDmode, | ||
9897 | +and its result is passed to the call or call_value | ||
9898 | +pattern as operands 2 and 3 respectively. | ||
9899 | + | ||
9900 | +The usual way to make the ISO library 'stdarg.h' work on a machine | ||
9901 | +where some arguments are usually passed in registers, is to cause | ||
9902 | +nameless arguments to be passed on the stack instead. This is done | ||
9903 | +by making FUNCTION_ARG return 0 whenever NAMED is 0. | ||
9904 | + | ||
9905 | +You may use the macro MUST_PASS_IN_STACK (MODE, TYPE) | ||
9906 | +in the definition of this macro to determine if this argument is of a | ||
9907 | +type that must be passed in the stack. If REG_PARM_STACK_SPACE | ||
9908 | +is not defined and FUNCTION_ARG returns nonzero for such an | ||
9909 | +argument, the compiler will abort. If REG_PARM_STACK_SPACE is | ||
9910 | +defined, the argument will be computed in the stack and then loaded into | ||
9911 | +a register. */ | ||
9912 | + | ||
9913 | +#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ | ||
9914 | + avr32_function_arg(&(CUM), MODE, TYPE, NAMED) | ||
9915 | + | ||
9916 | + | ||
9917 | + | ||
9918 | + | ||
9919 | +/* | ||
9920 | +A C type for declaring a variable that is used as the first argument of | ||
9921 | +FUNCTION_ARG and other related values. For some target machines, | ||
9922 | +the type int suffices and can hold the number of bytes of | ||
9923 | +argument so far. | ||
9924 | + | ||
9925 | +There is no need to record in CUMULATIVE_ARGS anything about the | ||
9926 | +arguments that have been passed on the stack. The compiler has other | ||
9927 | +variables to keep track of that. For target machines on which all | ||
9928 | +arguments are passed on the stack, there is no need to store anything in | ||
9929 | +CUMULATIVE_ARGS; however, the data structure must exist and | ||
9930 | +should not be empty, so use int. | ||
9931 | +*/ | ||
9932 | +typedef struct avr32_args | ||
9933 | +{ | ||
9934 | + /* Index representing the argument register the current function argument | ||
9935 | + will occupy */ | ||
9936 | + int index; | ||
9937 | + /* A mask with bits representing the argument registers: if a bit is set | ||
9938 | + then this register is used for an arguemnt */ | ||
9939 | + int used_index; | ||
9940 | + /* TRUE if this function has anonymous arguments */ | ||
9941 | + int uses_anonymous_args; | ||
9942 | + /* The size in bytes of the named arguments pushed on the stack */ | ||
9943 | + int stack_pushed_args_size; | ||
9944 | + /* Set to true if this function needs a Return Value Pointer */ | ||
9945 | + int use_rvp; | ||
9946 | + | ||
9947 | +} CUMULATIVE_ARGS; | ||
9948 | + | ||
9949 | + | ||
9950 | +#define FIRST_CUM_REG_INDEX 0 | ||
9951 | +#define LAST_CUM_REG_INDEX 4 | ||
9952 | +#define GET_REG_INDEX(CUM) ((CUM)->index) | ||
9953 | +#define SET_REG_INDEX(CUM, INDEX) ((CUM)->index = (INDEX)); | ||
9954 | +#define GET_USED_INDEX(CUM, INDEX) ((CUM)->used_index & (1 << (INDEX))) | ||
9955 | +#define SET_USED_INDEX(CUM, INDEX) \ | ||
9956 | + do \ | ||
9957 | + { \ | ||
9958 | + if (INDEX >= 0) \ | ||
9959 | + (CUM)->used_index |= (1 << (INDEX)); \ | ||
9960 | + } \ | ||
9961 | + while (0) | ||
9962 | +#define SET_INDEXES_UNUSED(CUM) ((CUM)->used_index = 0) | ||
9963 | + | ||
9964 | + | ||
9965 | +/* | ||
9966 | + A C statement (sans semicolon) for initializing the variable cum for the | ||
9967 | + state at the beginning of the argument list. The variable has type | ||
9968 | + CUMULATIVE_ARGS. The value of FNTYPE is the tree node for the data type of | ||
9969 | + the function which will receive the args, or 0 if the args are to a compiler | ||
9970 | + support library function. For direct calls that are not libcalls, FNDECL | ||
9971 | + contain the declaration node of the function. FNDECL is also set when | ||
9972 | + INIT_CUMULATIVE_ARGS is used to find arguments for the function being | ||
9973 | + compiled. N_NAMED_ARGS is set to the number of named arguments, including a | ||
9974 | + structure return address if it is passed as a parameter, when making a call. | ||
9975 | + When processing incoming arguments, N_NAMED_ARGS is set to -1. | ||
9976 | + | ||
9977 | + When processing a call to a compiler support library function, LIBNAME | ||
9978 | + identifies which one. It is a symbol_ref rtx which contains the name of the | ||
9979 | + function, as a string. LIBNAME is 0 when an ordinary C function call is | ||
9980 | + being processed. Thus, each time this macro is called, either LIBNAME or | ||
9981 | + FNTYPE is nonzero, but never both of them at once. | ||
9982 | +*/ | ||
9983 | +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ | ||
9984 | + avr32_init_cumulative_args(&(CUM), FNTYPE, LIBNAME, FNDECL) | ||
9985 | + | ||
9986 | + | ||
9987 | +/* | ||
9988 | +A C statement (sans semicolon) to update the summarizer variable | ||
9989 | +CUM to advance past an argument in the argument list. The | ||
9990 | +values MODE, TYPE and NAMED describe that argument. | ||
9991 | +Once this is done, the variable CUM is suitable for analyzing | ||
9992 | +the following argument with FUNCTION_ARG, etc. | ||
9993 | + | ||
9994 | +This macro need not do anything if the argument in question was passed | ||
9995 | +on the stack. The compiler knows how to track the amount of stack space | ||
9996 | +used for arguments without any special help. | ||
9997 | +*/ | ||
9998 | +#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ | ||
9999 | + avr32_function_arg_advance(&(CUM), MODE, TYPE, NAMED) | ||
10000 | + | ||
10001 | +/* | ||
10002 | +If defined, a C expression which determines whether, and in which direction, | ||
10003 | +to pad out an argument with extra space. The value should be of type | ||
10004 | +enum direction: either 'upward' to pad above the argument, | ||
10005 | +'downward' to pad below, or 'none' to inhibit padding. | ||
10006 | + | ||
10007 | +The amount of padding is always just enough to reach the next | ||
10008 | +multiple of FUNCTION_ARG_BOUNDARY; this macro does not control | ||
10009 | +it. | ||
10010 | + | ||
10011 | +This macro has a default definition which is right for most systems. | ||
10012 | +For little-endian machines, the default is to pad upward. For | ||
10013 | +big-endian machines, the default is to pad downward for an argument of | ||
10014 | +constant size shorter than an int, and upward otherwise. | ||
10015 | +*/ | ||
10016 | +#define FUNCTION_ARG_PADDING(MODE, TYPE) \ | ||
10017 | + avr32_function_arg_padding(MODE, TYPE) | ||
10018 | + | ||
10019 | +/* | ||
10020 | + Specify padding for the last element of a block move between registers | ||
10021 | + and memory. First is nonzero if this is the only element. Defining | ||
10022 | + this macro allows better control of register function parameters on | ||
10023 | + big-endian machines, without using PARALLEL rtl. In particular, | ||
10024 | + MUST_PASS_IN_STACK need not test padding and mode of types in registers, | ||
10025 | + as there is no longer a "wrong" part of a register; For example, a three | ||
10026 | + byte aggregate may be passed in the high part of a register if so required. | ||
10027 | +*/ | ||
10028 | +#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ | ||
10029 | + avr32_function_arg_padding(MODE, TYPE) | ||
10030 | + | ||
10031 | +/* | ||
10032 | +If defined, a C expression which determines whether the default | ||
10033 | +implementation of va_arg will attempt to pad down before reading the | ||
10034 | +next argument, if that argument is smaller than its aligned space as | ||
10035 | +controlled by PARM_BOUNDARY. If this macro is not defined, all such | ||
10036 | +arguments are padded down if BYTES_BIG_ENDIAN is true. | ||
10037 | +*/ | ||
10038 | +#define PAD_VARARGS_DOWN \ | ||
10039 | + (FUNCTION_ARG_PADDING (TYPE_MODE (type), type) == downward) | ||
10040 | + | ||
10041 | + | ||
10042 | +/* | ||
10043 | +A C expression that is nonzero if REGNO is the number of a hard | ||
10044 | +register in which function arguments are sometimes passed. This does | ||
10045 | +not include implicit arguments such as the static chain and | ||
10046 | +the structure-value address. On many machines, no registers can be | ||
10047 | +used for this purpose since all function arguments are pushed on the | ||
10048 | +stack. | ||
10049 | +*/ | ||
10050 | +/* | ||
10051 | + Use r8 - r12 for function arguments. | ||
10052 | +*/ | ||
10053 | +#define FUNCTION_ARG_REGNO_P(REGNO) \ | ||
10054 | + (REGNO >= 3 && REGNO <= 7) | ||
10055 | + | ||
10056 | +/* Number of registers used for passing function arguments */ | ||
10057 | +#define NUM_ARG_REGS 5 | ||
10058 | + | ||
10059 | +/* | ||
10060 | +If defined, the order in which arguments are loaded into their | ||
10061 | +respective argument registers is reversed so that the last | ||
10062 | +argument is loaded first. This macro only affects arguments | ||
10063 | +passed in registers. | ||
10064 | +*/ | ||
10065 | +/* #define LOAD_ARGS_REVERSED */ | ||
10066 | + | ||
10067 | +/** How Scalar Function Values Are Returned **/ | ||
10068 | + | ||
10069 | +/* AVR32 is using r12 as return register. */ | ||
10070 | +#define RET_REGISTER (15 - 12) | ||
10071 | + | ||
10072 | +/* | ||
10073 | +Define this macro if -traditional should not cause functions | ||
10074 | +declared to return float to convert the value to double. | ||
10075 | +*/ | ||
10076 | +/* #define TRADITIONAL_RETURN_FLOAT */ | ||
10077 | + | ||
10078 | +/* | ||
10079 | +A C expression to create an RTX representing the place where a | ||
10080 | +function returns a value of data type VALTYPE. VALTYPE is | ||
10081 | +a tree node representing a data type. Write TYPE_MODE(VALTYPE) | ||
10082 | +to get the machine mode used to represent that type. | ||
10083 | +On many machines, only the mode is relevant. (Actually, on most | ||
10084 | +machines, scalar values are returned in the same place regardless of | ||
10085 | +mode). | ||
10086 | + | ||
10087 | +The value of the expression is usually a reg RTX for the hard | ||
10088 | +register where the return value is stored. The value can also be a | ||
10089 | +parallel RTX, if the return value is in multiple places. See | ||
10090 | +FUNCTION_ARG for an explanation of the parallel form. | ||
10091 | + | ||
10092 | +If PROMOTE_FUNCTION_RETURN is defined, you must apply the same | ||
10093 | +promotion rules specified in PROMOTE_MODE if VALTYPE is a | ||
10094 | +scalar type. | ||
10095 | + | ||
10096 | +If the precise function being called is known, FUNC is a tree | ||
10097 | +node (FUNCTION_DECL) for it; otherwise, FUNC is a null | ||
10098 | +pointer. This makes it possible to use a different value-returning | ||
10099 | +convention for specific functions when all their calls are | ||
10100 | +known. | ||
10101 | + | ||
10102 | +FUNCTION_VALUE is not used for return vales with aggregate data | ||
10103 | +types, because these are returned in another way. See | ||
10104 | +STRUCT_VALUE_REGNUM and related macros, below. | ||
10105 | +*/ | ||
10106 | +#define FUNCTION_VALUE(VALTYPE, FUNC) avr32_function_value(VALTYPE, FUNC) | ||
10107 | + | ||
10108 | + | ||
10109 | +/* | ||
10110 | +A C expression to create an RTX representing the place where a library | ||
10111 | +function returns a value of mode MODE. If the precise function | ||
10112 | +being called is known, FUNC is a tree node | ||
10113 | +(FUNCTION_DECL) for it; otherwise, func is a null | ||
10114 | +pointer. This makes it possible to use a different value-returning | ||
10115 | +convention for specific functions when all their calls are | ||
10116 | +known. | ||
10117 | + | ||
10118 | +Note that "library function" in this context means a compiler | ||
10119 | +support routine, used to perform arithmetic, whose name is known | ||
10120 | +specially by the compiler and was not mentioned in the C code being | ||
10121 | +compiled. | ||
10122 | + | ||
10123 | +The definition of LIBRARY_VALUE need not be concerned aggregate | ||
10124 | +data types, because none of the library functions returns such types. | ||
10125 | +*/ | ||
10126 | +#define LIBCALL_VALUE(MODE) avr32_libcall_value(MODE) | ||
10127 | + | ||
10128 | +/* | ||
10129 | +A C expression that is nonzero if REGNO is the number of a hard | ||
10130 | +register in which the values of called function may come back. | ||
10131 | + | ||
10132 | +A register whose use for returning values is limited to serving as the | ||
10133 | +second of a pair (for a value of type double, say) need not be | ||
10134 | +recognized by this macro. So for most machines, this definition | ||
10135 | +suffices: | ||
10136 | + #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0) | ||
10137 | + | ||
10138 | +If the machine has register windows, so that the caller and the called | ||
10139 | +function use different registers for the return value, this macro | ||
10140 | +should recognize only the caller's register numbers. | ||
10141 | +*/ | ||
10142 | +/* | ||
10143 | + When returning a value of mode DImode, r11:r10 is used, else r12 is used. | ||
10144 | +*/ | ||
10145 | +#define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == RET_REGISTER \ | ||
10146 | + || (REGNO) == INTERNAL_REGNUM(11)) | ||
10147 | + | ||
10148 | + | ||
10149 | +/** How Large Values Are Returned **/ | ||
10150 | + | ||
10151 | + | ||
10152 | +/* | ||
10153 | +Define this macro to be 1 if all structure and union return values must be | ||
10154 | +in memory. Since this results in slower code, this should be defined | ||
10155 | +only if needed for compatibility with other compilers or with an ABI. | ||
10156 | +If you define this macro to be 0, then the conventions used for structure | ||
10157 | +and union return values are decided by the RETURN_IN_MEMORY macro. | ||
10158 | + | ||
10159 | +If not defined, this defaults to the value 1. | ||
10160 | +*/ | ||
10161 | +#define DEFAULT_PCC_STRUCT_RETURN 0 | ||
10162 | + | ||
10163 | + | ||
10164 | + | ||
10165 | + | ||
10166 | +/** Generating Code for Profiling **/ | ||
10167 | + | ||
10168 | +/* | ||
10169 | +A C statement or compound statement to output to FILE some | ||
10170 | +assembler code to call the profiling subroutine mcount. | ||
10171 | + | ||
10172 | +The details of how mcount expects to be called are determined by | ||
10173 | +your operating system environment, not by GCC. To figure them out, | ||
10174 | +compile a small program for profiling using the system's installed C | ||
10175 | +compiler and look at the assembler code that results. | ||
10176 | + | ||
10177 | +Older implementations of mcount expect the address of a counter | ||
10178 | +variable to be loaded into some register. The name of this variable is | ||
10179 | +'LP' followed by the number LABELNO, so you would generate | ||
10180 | +the name using 'LP%d' in a fprintf. | ||
10181 | +*/ | ||
10182 | +/* ToDo: fixme */ | ||
10183 | +#ifndef FUNCTION_PROFILER | ||
10184 | +#define FUNCTION_PROFILER(FILE, LABELNO) \ | ||
10185 | + fprintf((FILE), "/* profiler %d */", (LABELNO)) | ||
10186 | +#endif | ||
10187 | + | ||
10188 | + | ||
10189 | +/***************************************************************************** | ||
10190 | + * Trampolines for Nested Functions * | ||
10191 | + *****************************************************************************/ | ||
10192 | + | ||
10193 | +/* | ||
10194 | +A C statement to output, on the stream FILE, assembler code for a | ||
10195 | +block of data that contains the constant parts of a trampoline. This | ||
10196 | +code should not include a label - the label is taken care of | ||
10197 | +automatically. | ||
10198 | + | ||
10199 | +If you do not define this macro, it means no template is needed | ||
10200 | +for the target. Do not define this macro on systems where the block move | ||
10201 | +code to copy the trampoline into place would be larger than the code | ||
10202 | +to generate it on the spot. | ||
10203 | +*/ | ||
10204 | +/* ToDo: correct? */ | ||
10205 | +#define TRAMPOLINE_TEMPLATE(FILE) avr32_trampoline_template(FILE); | ||
10206 | + | ||
10207 | + | ||
10208 | +/* | ||
10209 | +A C expression for the size in bytes of the trampoline, as an integer. | ||
10210 | +*/ | ||
10211 | +/* ToDo: fixme */ | ||
10212 | +#define TRAMPOLINE_SIZE 0x0C | ||
10213 | + | ||
10214 | +/* | ||
10215 | +Alignment required for trampolines, in bits. | ||
10216 | + | ||
10217 | +If you don't define this macro, the value of BIGGEST_ALIGNMENT | ||
10218 | +is used for aligning trampolines. | ||
10219 | +*/ | ||
10220 | +#define TRAMPOLINE_ALIGNMENT 16 | ||
10221 | + | ||
10222 | +/* | ||
10223 | +A C statement to initialize the variable parts of a trampoline. | ||
10224 | +ADDR is an RTX for the address of the trampoline; FNADDR is | ||
10225 | +an RTX for the address of the nested function; STATIC_CHAIN is an | ||
10226 | +RTX for the static chain value that should be passed to the function | ||
10227 | +when it is called. | ||
10228 | +*/ | ||
10229 | +#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \ | ||
10230 | + avr32_initialize_trampoline(ADDR, FNADDR, STATIC_CHAIN) | ||
10231 | + | ||
10232 | + | ||
10233 | +/****************************************************************************** | ||
10234 | + * Implicit Calls to Library Routines | ||
10235 | + *****************************************************************************/ | ||
10236 | + | ||
10237 | +/* Tail calling. */ | ||
10238 | + | ||
10239 | +/* A C expression that evaluates to true if it is ok to perform a sibling | ||
10240 | + call to DECL. */ | ||
10241 | +#define FUNCTION_OK_FOR_SIBCALL(DECL) 0 | ||
10242 | + | ||
10243 | +#define OVERRIDE_OPTIONS avr32_override_options () | ||
10244 | + | ||
10245 | + | ||
10246 | + | ||
10247 | +/****************************************************************************** | ||
10248 | + * Addressing Modes | ||
10249 | + *****************************************************************************/ | ||
10250 | + | ||
10251 | +/* | ||
10252 | +A C expression that is nonzero if the machine supports pre-increment, | ||
10253 | +pre-decrement, post-increment, or post-decrement addressing respectively. | ||
10254 | +*/ | ||
10255 | +/* | ||
10256 | + AVR32 supports Rp++ and --Rp | ||
10257 | +*/ | ||
10258 | +#define HAVE_PRE_INCREMENT 0 | ||
10259 | +#define HAVE_PRE_DECREMENT 1 | ||
10260 | +#define HAVE_POST_INCREMENT 1 | ||
10261 | +#define HAVE_POST_DECREMENT 0 | ||
10262 | + | ||
10263 | +/* | ||
10264 | +A C expression that is nonzero if the machine supports pre- or | ||
10265 | +post-address side-effect generation involving constants other than | ||
10266 | +the size of the memory operand. | ||
10267 | +*/ | ||
10268 | +#define HAVE_PRE_MODIFY_DISP 0 | ||
10269 | +#define HAVE_POST_MODIFY_DISP 0 | ||
10270 | + | ||
10271 | +/* | ||
10272 | +A C expression that is nonzero if the machine supports pre- or | ||
10273 | +post-address side-effect generation involving a register displacement. | ||
10274 | +*/ | ||
10275 | +#define HAVE_PRE_MODIFY_REG 0 | ||
10276 | +#define HAVE_POST_MODIFY_REG 0 | ||
10277 | + | ||
10278 | +/* | ||
10279 | +A C expression that is 1 if the RTX X is a constant which | ||
10280 | +is a valid address. On most machines, this can be defined as | ||
10281 | +CONSTANT_P (X), but a few machines are more restrictive | ||
10282 | +in which constant addresses are supported. | ||
10283 | + | ||
10284 | +CONSTANT_P accepts integer-values expressions whose values are | ||
10285 | +not explicitly known, such as symbol_ref, label_ref, and | ||
10286 | +high expressions and const arithmetic expressions, in | ||
10287 | +addition to const_int and const_double expressions. | ||
10288 | +*/ | ||
10289 | +#define CONSTANT_ADDRESS_P(X) CONSTANT_P(X) | ||
10290 | + | ||
10291 | +/* | ||
10292 | +A number, the maximum number of registers that can appear in a valid | ||
10293 | +memory address. Note that it is up to you to specify a value equal to | ||
10294 | +the maximum number that GO_IF_LEGITIMATE_ADDRESS would ever | ||
10295 | +accept. | ||
10296 | +*/ | ||
10297 | +#define MAX_REGS_PER_ADDRESS 2 | ||
10298 | + | ||
10299 | +/* | ||
10300 | +A C compound statement with a conditional goto LABEL; | ||
10301 | +executed if X (an RTX) is a legitimate memory address on the | ||
10302 | +target machine for a memory operand of mode MODE. | ||
10303 | + | ||
10304 | +It usually pays to define several simpler macros to serve as | ||
10305 | +subroutines for this one. Otherwise it may be too complicated to | ||
10306 | +understand. | ||
10307 | + | ||
10308 | +This macro must exist in two variants: a strict variant and a | ||
10309 | +non-strict one. The strict variant is used in the reload pass. It | ||
10310 | +must be defined so that any pseudo-register that has not been | ||
10311 | +allocated a hard register is considered a memory reference. In | ||
10312 | +contexts where some kind of register is required, a pseudo-register | ||
10313 | +with no hard register must be rejected. | ||
10314 | + | ||
10315 | +The non-strict variant is used in other passes. It must be defined to | ||
10316 | +accept all pseudo-registers in every context where some kind of | ||
10317 | +register is required. | ||
10318 | + | ||
10319 | +Compiler source files that want to use the strict variant of this | ||
10320 | +macro define the macro REG_OK_STRICT. You should use an | ||
10321 | +#ifdef REG_OK_STRICT conditional to define the strict variant | ||
10322 | +in that case and the non-strict variant otherwise. | ||
10323 | + | ||
10324 | +Subroutines to check for acceptable registers for various purposes (one | ||
10325 | +for base registers, one for index registers, and so on) are typically | ||
10326 | +among the subroutines used to define GO_IF_LEGITIMATE_ADDRESS. | ||
10327 | +Then only these subroutine macros need have two variants; the higher | ||
10328 | +levels of macros may be the same whether strict or not. | ||
10329 | + | ||
10330 | +Normally, constant addresses which are the sum of a symbol_ref | ||
10331 | +and an integer are stored inside a const RTX to mark them as | ||
10332 | +constant. Therefore, there is no need to recognize such sums | ||
10333 | +specifically as legitimate addresses. Normally you would simply | ||
10334 | +recognize any const as legitimate. | ||
10335 | + | ||
10336 | +Usually PRINT_OPERAND_ADDRESS is not prepared to handle constant | ||
10337 | +sums that are not marked with const. It assumes that a naked | ||
10338 | +plus indicates indexing. If so, then you must reject such | ||
10339 | +naked constant sums as illegitimate addresses, so that none of them will | ||
10340 | +be given to PRINT_OPERAND_ADDRESS. | ||
10341 | + | ||
10342 | +On some machines, whether a symbolic address is legitimate depends on | ||
10343 | +the section that the address refers to. On these machines, define the | ||
10344 | +macro ENCODE_SECTION_INFO to store the information into the | ||
10345 | +symbol_ref, and then check for it here. When you see a | ||
10346 | +const, you will have to look inside it to find the | ||
10347 | +symbol_ref in order to determine the section. | ||
10348 | + | ||
10349 | +The best way to modify the name string is by adding text to the | ||
10350 | +beginning, with suitable punctuation to prevent any ambiguity. Allocate | ||
10351 | +the new name in saveable_obstack. You will have to modify | ||
10352 | +ASM_OUTPUT_LABELREF to remove and decode the added text and | ||
10353 | +output the name accordingly, and define STRIP_NAME_ENCODING to | ||
10354 | +access the original name string. | ||
10355 | + | ||
10356 | +You can check the information stored here into the symbol_ref in | ||
10357 | +the definitions of the macros GO_IF_LEGITIMATE_ADDRESS and | ||
10358 | +PRINT_OPERAND_ADDRESS. | ||
10359 | +*/ | ||
10360 | +#ifdef REG_OK_STRICT | ||
10361 | +# define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL) \ | ||
10362 | + do \ | ||
10363 | + { \ | ||
10364 | + if (avr32_legitimate_address(MODE, X, 1)) \ | ||
10365 | + goto LABEL; \ | ||
10366 | + } \ | ||
10367 | + while (0) | ||
10368 | +#else | ||
10369 | +# define GO_IF_LEGITIMATE_ADDRESS(MODE, X, LABEL) \ | ||
10370 | + do \ | ||
10371 | + { \ | ||
10372 | + if (avr32_legitimate_address(MODE, X, 0)) \ | ||
10373 | + goto LABEL; \ | ||
10374 | + } \ | ||
10375 | + while (0) | ||
10376 | +#endif | ||
10377 | + | ||
10378 | +/* | ||
10379 | +A C expression that is nonzero if X (assumed to be a reg | ||
10380 | +RTX) is valid for use as a base register. For hard registers, it | ||
10381 | +should always accept those which the hardware permits and reject the | ||
10382 | +others. Whether the macro accepts or rejects pseudo registers must be | ||
10383 | +controlled by REG_OK_STRICT as described above. This usually | ||
10384 | +requires two variant definitions, of which REG_OK_STRICT | ||
10385 | +controls the one actually used. | ||
10386 | +*/ | ||
10387 | +#ifdef REG_OK_STRICT | ||
10388 | +# define REG_OK_FOR_BASE_P(X) \ | ||
10389 | + REGNO_OK_FOR_BASE_P(REGNO(X)) | ||
10390 | +#else | ||
10391 | +# define REG_OK_FOR_BASE_P(X) \ | ||
10392 | + ((REGNO(X) <= LAST_REGNUM) || (REGNO(X) >= FIRST_PSEUDO_REGISTER)) | ||
10393 | +#endif | ||
10394 | + | ||
10395 | + | ||
10396 | +/* | ||
10397 | +A C expression that is nonzero if X (assumed to be a reg | ||
10398 | +RTX) is valid for use as an index register. | ||
10399 | + | ||
10400 | +The difference between an index register and a base register is that | ||
10401 | +the index register may be scaled. If an address involves the sum of | ||
10402 | +two registers, neither one of them scaled, then either one may be | ||
10403 | +labeled the "base" and the other the "index"; but whichever | ||
10404 | +labeling is used must fit the machine's constraints of which registers | ||
10405 | +may serve in each capacity. The compiler will try both labelings, | ||
10406 | +looking for one that is valid, and will reload one or both registers | ||
10407 | +only if neither labeling works. | ||
10408 | +*/ | ||
10409 | +#define REG_OK_FOR_INDEX_P(X) \ | ||
10410 | + REG_OK_FOR_BASE_P(X) | ||
10411 | + | ||
10412 | + | ||
10413 | +/* | ||
10414 | +A C compound statement that attempts to replace X with a valid | ||
10415 | +memory address for an operand of mode MODE. win will be a | ||
10416 | +C statement label elsewhere in the code; the macro definition may use | ||
10417 | + | ||
10418 | + GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN); | ||
10419 | + | ||
10420 | +to avoid further processing if the address has become legitimate. | ||
10421 | + | ||
10422 | +X will always be the result of a call to break_out_memory_refs, | ||
10423 | +and OLDX will be the operand that was given to that function to produce | ||
10424 | +X. | ||
10425 | + | ||
10426 | +The code generated by this macro should not alter the substructure of | ||
10427 | +X. If it transforms X into a more legitimate form, it | ||
10428 | +should assign X (which will always be a C variable) a new value. | ||
10429 | + | ||
10430 | +It is not necessary for this macro to come up with a legitimate | ||
10431 | +address. The compiler has standard ways of doing so in all cases. In | ||
10432 | +fact, it is safe for this macro to do nothing. But often a | ||
10433 | +machine-dependent strategy can generate better code. | ||
10434 | +*/ | ||
10435 | +#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) \ | ||
10436 | + do \ | ||
10437 | + { \ | ||
10438 | + if (GET_CODE(X) == PLUS \ | ||
10439 | + && GET_CODE(XEXP(X, 0)) == REG \ | ||
10440 | + && GET_CODE(XEXP(X, 1)) == CONST_INT \ | ||
10441 | + && !CONST_OK_FOR_CONSTRAINT_P(INTVAL(XEXP(X, 1)), \ | ||
10442 | + 'K', "Ks16")) \ | ||
10443 | + { \ | ||
10444 | + rtx index = force_reg(SImode, XEXP(X, 1)); \ | ||
10445 | + X = gen_rtx_PLUS( SImode, XEXP(X, 0), index); \ | ||
10446 | + } \ | ||
10447 | + GO_IF_LEGITIMATE_ADDRESS(MODE, X, WIN); \ | ||
10448 | + } \ | ||
10449 | + while(0) | ||
10450 | + | ||
10451 | + | ||
10452 | +/* | ||
10453 | +A C statement or compound statement with a conditional | ||
10454 | +goto LABEL; executed if memory address X (an RTX) can have | ||
10455 | +different meanings depending on the machine mode of the memory | ||
10456 | +reference it is used for or if the address is valid for some modes | ||
10457 | +but not others. | ||
10458 | + | ||
10459 | +Autoincrement and autodecrement addresses typically have mode-dependent | ||
10460 | +effects because the amount of the increment or decrement is the size | ||
10461 | +of the operand being addressed. Some machines have other mode-dependent | ||
10462 | +addresses. Many RISC machines have no mode-dependent addresses. | ||
10463 | + | ||
10464 | +You may assume that ADDR is a valid address for the machine. | ||
10465 | +*/ | ||
10466 | +#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) \ | ||
10467 | + do \ | ||
10468 | + { \ | ||
10469 | + if (GET_CODE (ADDR) == POST_INC \ | ||
10470 | + || GET_CODE (ADDR) == PRE_DEC) \ | ||
10471 | + goto LABEL; \ | ||
10472 | + } \ | ||
10473 | + while (0) | ||
10474 | + | ||
10475 | +/* | ||
10476 | +A C expression that is nonzero if X is a legitimate constant for | ||
10477 | +an immediate operand on the target machine. You can assume that | ||
10478 | +X satisfies CONSTANT_P, so you need not check this. In fact, | ||
10479 | +'1' is a suitable definition for this macro on machines where | ||
10480 | +anything CONSTANT_P is valid. | ||
10481 | +*/ | ||
10482 | +#define LEGITIMATE_CONSTANT_P(X) avr32_legitimate_constant_p(X) | ||
10483 | + | ||
10484 | + | ||
10485 | +/****************************************************************************** | ||
10486 | + * Condition Code Status | ||
10487 | + *****************************************************************************/ | ||
10488 | + | ||
10489 | +#define HAVE_conditional_move 1 | ||
10490 | + | ||
10491 | +/* | ||
10492 | +C code for a data type which is used for declaring the mdep | ||
10493 | +component of cc_status. It defaults to int. | ||
10494 | + | ||
10495 | +This macro is not used on machines that do not use cc0. | ||
10496 | +*/ | ||
10497 | + | ||
10498 | +typedef struct | ||
10499 | +{ | ||
10500 | + int flags; | ||
10501 | + rtx value; | ||
10502 | + int fpflags; | ||
10503 | + rtx fpvalue; | ||
10504 | +} avr32_status_reg; | ||
10505 | + | ||
10506 | + | ||
10507 | +#define CC_STATUS_MDEP avr32_status_reg | ||
10508 | + | ||
10509 | +/* | ||
10510 | +A C expression to initialize the mdep field to "empty". | ||
10511 | +The default definition does nothing, since most machines don't use | ||
10512 | +the field anyway. If you want to use the field, you should probably | ||
10513 | +define this macro to initialize it. | ||
10514 | + | ||
10515 | +This macro is not used on machines that do not use cc0. | ||
10516 | +*/ | ||
10517 | + | ||
10518 | +#define CC_STATUS_MDEP_INIT \ | ||
10519 | + (cc_status.mdep.flags = CC_NONE , cc_status.mdep.value = 0) | ||
10520 | + | ||
10521 | +#define FPCC_STATUS_INIT \ | ||
10522 | + (cc_status.mdep.fpflags = CC_NONE , cc_status.mdep.fpvalue = 0) | ||
10523 | + | ||
10524 | +/* | ||
10525 | +A C compound statement to set the components of cc_status | ||
10526 | +appropriately for an insn INSN whose body is EXP. It is | ||
10527 | +this macro's responsibility to recognize insns that set the condition | ||
10528 | +code as a byproduct of other activity as well as those that explicitly | ||
10529 | +set (cc0). | ||
10530 | + | ||
10531 | +This macro is not used on machines that do not use cc0. | ||
10532 | + | ||
10533 | +If there are insns that do not set the condition code but do alter | ||
10534 | +other machine registers, this macro must check to see whether they | ||
10535 | +invalidate the expressions that the condition code is recorded as | ||
10536 | +reflecting. For example, on the 68000, insns that store in address | ||
10537 | +registers do not set the condition code, which means that usually | ||
10538 | +NOTICE_UPDATE_CC can leave cc_status unaltered for such | ||
10539 | +insns. But suppose that the previous insn set the condition code | ||
10540 | +based on location 'a4@@(102)' and the current insn stores a new | ||
10541 | +value in 'a4'. Although the condition code is not changed by | ||
10542 | +this, it will no longer be true that it reflects the contents of | ||
10543 | +'a4@@(102)'. Therefore, NOTICE_UPDATE_CC must alter | ||
10544 | +cc_status in this case to say that nothing is known about the | ||
10545 | +condition code value. | ||
10546 | + | ||
10547 | +The definition of NOTICE_UPDATE_CC must be prepared to deal | ||
10548 | +with the results of peephole optimization: insns whose patterns are | ||
10549 | +parallel RTXs containing various reg, mem or | ||
10550 | +constants which are just the operands. The RTL structure of these | ||
10551 | +insns is not sufficient to indicate what the insns actually do. What | ||
10552 | +NOTICE_UPDATE_CC should do when it sees one is just to run | ||
10553 | +CC_STATUS_INIT. | ||
10554 | + | ||
10555 | +A possible definition of NOTICE_UPDATE_CC is to call a function | ||
10556 | +that looks at an attribute (see Insn Attributes) named, for example, | ||
10557 | +'cc'. This avoids having detailed information about patterns in | ||
10558 | +two places, the 'md' file and in NOTICE_UPDATE_CC. | ||
10559 | +*/ | ||
10560 | + | ||
10561 | +#define NOTICE_UPDATE_CC(EXP, INSN) avr32_notice_update_cc(EXP, INSN) | ||
10562 | + | ||
10563 | + | ||
10564 | + | ||
10565 | + | ||
10566 | +/****************************************************************************** | ||
10567 | + * Describing Relative Costs of Operations | ||
10568 | + *****************************************************************************/ | ||
10569 | + | ||
10570 | + | ||
10571 | + | ||
10572 | +/* | ||
10573 | +A C expression for the cost of moving data of mode MODE from a | ||
10574 | +register in class FROM to one in class TO. The classes are | ||
10575 | +expressed using the enumeration values such as GENERAL_REGS. A | ||
10576 | +value of 2 is the default; other values are interpreted relative to | ||
10577 | +that. | ||
10578 | + | ||
10579 | +It is not required that the cost always equal 2 when FROM is the | ||
10580 | +same as TO; on some machines it is expensive to move between | ||
10581 | +registers if they are not general registers. | ||
10582 | + | ||
10583 | +If reload sees an insn consisting of a single set between two | ||
10584 | +hard registers, and if REGISTER_MOVE_COST applied to their | ||
10585 | +classes returns a value of 2, reload does not check to ensure that the | ||
10586 | +constraints of the insn are met. Setting a cost of other than 2 will | ||
10587 | +allow reload to verify that the constraints are met. You should do this | ||
10588 | +if the movm pattern's constraints do not allow such copying. | ||
10589 | +*/ | ||
10590 | +#define REGISTER_MOVE_COST(MODE, FROM, TO) \ | ||
10591 | + ((GET_MODE_SIZE(MODE) <= 4) ? 2: \ | ||
10592 | + (GET_MODE_SIZE(MODE) <= 8) ? 3: \ | ||
10593 | + 4) | ||
10594 | + | ||
10595 | +/* | ||
10596 | +A C expression for the cost of moving data of mode MODE between a | ||
10597 | +register of class CLASS and memory; IN is zero if the value | ||
10598 | +is to be written to memory, nonzero if it is to be read in. This cost | ||
10599 | +is relative to those in REGISTER_MOVE_COST. If moving between | ||
10600 | +registers and memory is more expensive than between two registers, you | ||
10601 | +should define this macro to express the relative cost. | ||
10602 | + | ||
10603 | +If you do not define this macro, GCC uses a default cost of 4 plus | ||
10604 | +the cost of copying via a secondary reload register, if one is | ||
10605 | +needed. If your machine requires a secondary reload register to copy | ||
10606 | +between memory and a register of CLASS but the reload mechanism is | ||
10607 | +more complex than copying via an intermediate, define this macro to | ||
10608 | +reflect the actual cost of the move. | ||
10609 | + | ||
10610 | +GCC defines the function memory_move_secondary_cost if | ||
10611 | +secondary reloads are needed. It computes the costs due to copying via | ||
10612 | +a secondary register. If your machine copies from memory using a | ||
10613 | +secondary register in the conventional way but the default base value of | ||
10614 | +4 is not correct for your machine, define this macro to add some other | ||
10615 | +value to the result of that function. The arguments to that function | ||
10616 | +are the same as to this macro. | ||
10617 | +*/ | ||
10618 | +/* | ||
10619 | + Memory moves are costly | ||
10620 | +*/ | ||
10621 | +#define MEMORY_MOVE_COST(MODE, CLASS, IN) 10 | ||
10622 | +/* | ||
10623 | + (((IN) ? ((GET_MODE_SIZE(MODE) < 4) ? 4 : \ | ||
10624 | + (GET_MODE_SIZE(MODE) > 8) ? 6 : \ | ||
10625 | + 3) \ | ||
10626 | + : ((GET_MODE_SIZE(MODE) > 8) ? 4 : 2))) | ||
10627 | +*/ | ||
10628 | + | ||
10629 | +/* | ||
10630 | +A C expression for the cost of a branch instruction. A value of 1 is | ||
10631 | +the default; other values are interpreted relative to that. | ||
10632 | +*/ | ||
10633 | + /* Try to use conditionals as much as possible */ | ||
10634 | +#define BRANCH_COST (TARGET_BRANCH_PRED ? 3 : 5) | ||
10635 | + | ||
10636 | +/*A C expression for the maximum number of instructions to execute via conditional | ||
10637 | + execution instructions instead of a branch. A value of BRANCH_COST+1 is the default | ||
10638 | + if the machine does not use cc0, and 1 if it does use cc0.*/ | ||
10639 | +#define MAX_CONDITIONAL_EXECUTE 3 | ||
10640 | + | ||
10641 | +/* | ||
10642 | +Define this macro as a C expression which is nonzero if accessing less | ||
10643 | +than a word of memory (i.e.: a char or a short) is no | ||
10644 | +faster than accessing a word of memory, i.e., if such access | ||
10645 | +require more than one instruction or if there is no difference in cost | ||
10646 | +between byte and (aligned) word loads. | ||
10647 | + | ||
10648 | +When this macro is not defined, the compiler will access a field by | ||
10649 | +finding the smallest containing object; when it is defined, a fullword | ||
10650 | +load will be used if alignment permits. Unless bytes accesses are | ||
10651 | +faster than word accesses, using word accesses is preferable since it | ||
10652 | +may eliminate subsequent memory access if subsequent accesses occur to | ||
10653 | +other fields in the same word of the structure, but to different bytes. | ||
10654 | +*/ | ||
10655 | +#define SLOW_BYTE_ACCESS 1 | ||
10656 | + | ||
10657 | + | ||
10658 | +/* | ||
10659 | +Define this macro if it is as good or better to call a constant | ||
10660 | +function address than to call an address kept in a register. | ||
10661 | +*/ | ||
10662 | +#define NO_FUNCTION_CSE | ||
10663 | + | ||
10664 | + | ||
10665 | +/****************************************************************************** | ||
10666 | + * Adjusting the Instruction Scheduler | ||
10667 | + *****************************************************************************/ | ||
10668 | + | ||
10669 | +/***************************************************************************** | ||
10670 | + * Dividing the Output into Sections (Texts, Data, ...) * | ||
10671 | + *****************************************************************************/ | ||
10672 | + | ||
10673 | +/* | ||
10674 | +A C expression whose value is a string, including spacing, containing the | ||
10675 | +assembler operation that should precede instructions and read-only data. | ||
10676 | +Normally "\t.text" is right. | ||
10677 | +*/ | ||
10678 | +#define TEXT_SECTION_ASM_OP "\t.text" | ||
10679 | +/* | ||
10680 | +A C statement that switches to the default section containing instructions. | ||
10681 | +Normally this is not needed, as simply defining TEXT_SECTION_ASM_OP | ||
10682 | +is enough. The MIPS port uses this to sort all functions after all data | ||
10683 | +declarations. | ||
10684 | +*/ | ||
10685 | +/* #define TEXT_SECTION */ | ||
10686 | + | ||
10687 | +/* | ||
10688 | +A C expression whose value is a string, including spacing, containing the | ||
10689 | +assembler operation to identify the following data as writable initialized | ||
10690 | +data. Normally "\t.data" is right. | ||
10691 | +*/ | ||
10692 | +#define DATA_SECTION_ASM_OP "\t.data" | ||
10693 | + | ||
10694 | +/* | ||
10695 | +If defined, a C expression whose value is a string, including spacing, | ||
10696 | +containing the assembler operation to identify the following data as | ||
10697 | +shared data. If not defined, DATA_SECTION_ASM_OP will be used. | ||
10698 | +*/ | ||
10699 | + | ||
10700 | +/* | ||
10701 | +A C expression whose value is a string, including spacing, containing | ||
10702 | +the assembler operation to identify the following data as read-only | ||
10703 | +initialized data. | ||
10704 | +*/ | ||
10705 | +#undef READONLY_DATA_SECTION_ASM_OP | ||
10706 | +#define READONLY_DATA_SECTION_ASM_OP \ | ||
10707 | + ((target_flags & USE_RODATA_SECTION) ? \ | ||
10708 | + "\t.section\t.rodata" : \ | ||
10709 | + TEXT_SECTION_ASM_OP ) | ||
10710 | + | ||
10711 | + | ||
10712 | +/* | ||
10713 | +If defined, a C expression whose value is a string, including spacing, | ||
10714 | +containing the assembler operation to identify the following data as | ||
10715 | +uninitialized global data. If not defined, and neither | ||
10716 | +ASM_OUTPUT_BSS nor ASM_OUTPUT_ALIGNED_BSS are defined, | ||
10717 | +uninitialized global data will be output in the data section if | ||
10718 | +-fno-common is passed, otherwise ASM_OUTPUT_COMMON will be | ||
10719 | +used. | ||
10720 | +*/ | ||
10721 | +#define BSS_SECTION_ASM_OP "\t.section\t.bss" | ||
10722 | + | ||
10723 | +/* | ||
10724 | +If defined, a C expression whose value is a string, including spacing, | ||
10725 | +containing the assembler operation to identify the following data as | ||
10726 | +uninitialized global shared data. If not defined, and | ||
10727 | +BSS_SECTION_ASM_OP is, the latter will be used. | ||
10728 | +*/ | ||
10729 | +/*#define SHARED_BSS_SECTION_ASM_OP "\trseg\tshared_bbs_section:data:noroot(0)\n"*/ | ||
10730 | +/* | ||
10731 | +If defined, a C expression whose value is a string, including spacing, | ||
10732 | +containing the assembler operation to identify the following data as | ||
10733 | +initialization code. If not defined, GCC will assume such a section does | ||
10734 | +not exist. | ||
10735 | +*/ | ||
10736 | +#undef INIT_SECTION_ASM_OP | ||
10737 | +#define INIT_SECTION_ASM_OP "\t.section\t.init" | ||
10738 | + | ||
10739 | +/* | ||
10740 | +If defined, a C expression whose value is a string, including spacing, | ||
10741 | +containing the assembler operation to identify the following data as | ||
10742 | +finalization code. If not defined, GCC will assume such a section does | ||
10743 | +not exist. | ||
10744 | +*/ | ||
10745 | +#undef FINI_SECTION_ASM_OP | ||
10746 | +#define FINI_SECTION_ASM_OP "\t.section\t.fini" | ||
10747 | + | ||
10748 | +/* | ||
10749 | +If defined, an ASM statement that switches to a different section | ||
10750 | +via SECTION_OP, calls FUNCTION, and switches back to | ||
10751 | +the text section. This is used in crtstuff.c if | ||
10752 | +INIT_SECTION_ASM_OP or FINI_SECTION_ASM_OP to calls | ||
10753 | +to initialization and finalization functions from the init and fini | ||
10754 | +sections. By default, this macro uses a simple function call. Some | ||
10755 | +ports need hand-crafted assembly code to avoid dependencies on | ||
10756 | +registers initialized in the function prologue or to ensure that | ||
10757 | +constant pools don't end up too far way in the text section. | ||
10758 | +*/ | ||
10759 | +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ | ||
10760 | + asm ( SECTION_OP "\n" \ | ||
10761 | + "mcall r6[" USER_LABEL_PREFIX #FUNC "@got]\n" \ | ||
10762 | + TEXT_SECTION_ASM_OP); | ||
10763 | + | ||
10764 | + | ||
10765 | +/* | ||
10766 | +Define this macro to be an expression with a nonzero value if jump | ||
10767 | +tables (for tablejump insns) should be output in the text | ||
10768 | +section, along with the assembler instructions. Otherwise, the | ||
10769 | +readonly data section is used. | ||
10770 | + | ||
10771 | +This macro is irrelevant if there is no separate readonly data section. | ||
10772 | +*/ | ||
10773 | +#define JUMP_TABLES_IN_TEXT_SECTION 1 | ||
10774 | + | ||
10775 | + | ||
10776 | +/****************************************************************************** | ||
10777 | + * Position Independent Code (PIC) | ||
10778 | + *****************************************************************************/ | ||
10779 | + | ||
10780 | +#ifndef AVR32_ALWAYS_PIC | ||
10781 | +#define AVR32_ALWAYS_PIC 0 | ||
10782 | +#endif | ||
10783 | + | ||
10784 | +/* GOT is set to r6 */ | ||
10785 | +#define PIC_OFFSET_TABLE_REGNUM INTERNAL_REGNUM(6) | ||
10786 | + | ||
10787 | +/* | ||
10788 | +A C expression that is nonzero if X is a legitimate immediate | ||
10789 | +operand on the target machine when generating position independent code. | ||
10790 | +You can assume that X satisfies CONSTANT_P, so you need not | ||
10791 | +check this. You can also assume flag_pic is true, so you need not | ||
10792 | +check it either. You need not define this macro if all constants | ||
10793 | +(including SYMBOL_REF) can be immediate operands when generating | ||
10794 | +position independent code. | ||
10795 | +*/ | ||
10796 | +/* We can't directly access anything that contains a symbol, | ||
10797 | + nor can we indirect via the constant pool. */ | ||
10798 | +#define LEGITIMATE_PIC_OPERAND_P(X) avr32_legitimate_pic_operand_p(X) | ||
10799 | + | ||
10800 | + | ||
10801 | +/* We need to know when we are making a constant pool; this determines | ||
10802 | + whether data needs to be in the GOT or can be referenced via a GOT | ||
10803 | + offset. */ | ||
10804 | +extern int making_const_table; | ||
10805 | + | ||
10806 | +/****************************************************************************** | ||
10807 | + * Defining the Output Assembler Language | ||
10808 | + *****************************************************************************/ | ||
10809 | + | ||
10810 | + | ||
10811 | +/* | ||
10812 | +A C string constant describing how to begin a comment in the target | ||
10813 | +assembler language. The compiler assumes that the comment will end at | ||
10814 | +the end of the line. | ||
10815 | +*/ | ||
10816 | +#define ASM_COMMENT_START "# " | ||
10817 | + | ||
10818 | +/* | ||
10819 | +A C string constant for text to be output before each asm | ||
10820 | +statement or group of consecutive ones. Normally this is | ||
10821 | +"#APP", which is a comment that has no effect on most | ||
10822 | +assemblers but tells the GNU assembler that it must check the lines | ||
10823 | +that follow for all valid assembler constructs. | ||
10824 | +*/ | ||
10825 | +#undef ASM_APP_ON | ||
10826 | +#define ASM_APP_ON "#APP\n" | ||
10827 | + | ||
10828 | +/* | ||
10829 | +A C string constant for text to be output after each asm | ||
10830 | +statement or group of consecutive ones. Normally this is | ||
10831 | +"#NO_APP", which tells the GNU assembler to resume making the | ||
10832 | +time-saving assumptions that are valid for ordinary compiler output. | ||
10833 | +*/ | ||
10834 | +#undef ASM_APP_OFF | ||
10835 | +#define ASM_APP_OFF "#NO_APP\n" | ||
10836 | + | ||
10837 | + | ||
10838 | + | ||
10839 | +#define FILE_ASM_OP "\t.file\n" | ||
10840 | +#define IDENT_ASM_OP "\t.ident\t" | ||
10841 | +#define SET_ASM_OP "\t.set\t" | ||
10842 | + | ||
10843 | + | ||
10844 | +/* | ||
10845 | + * Output assembly directives to switch to section name. The section | ||
10846 | + * should have attributes as specified by flags, which is a bit mask | ||
10847 | + * of the SECTION_* flags defined in 'output.h'. If align is nonzero, | ||
10848 | + * it contains an alignment in bytes to be used for the section, | ||
10849 | + * otherwise some target default should be used. Only targets that | ||
10850 | + * must specify an alignment within the section directive need pay | ||
10851 | + * attention to align -- we will still use ASM_OUTPUT_ALIGN. | ||
10852 | + * | ||
10853 | + * NOTE: This one must not be moved to avr32.c | ||
10854 | + */ | ||
10855 | +#undef TARGET_ASM_NAMED_SECTION | ||
10856 | +#define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section | ||
10857 | + | ||
10858 | + | ||
10859 | +/* | ||
10860 | +You may define this macro as a C expression. You should define the | ||
10861 | +expression to have a nonzero value if GCC should output the constant | ||
10862 | +pool for a function before the code for the function, or a zero value if | ||
10863 | +GCC should output the constant pool after the function. If you do | ||
10864 | +not define this macro, the usual case, GCC will output the constant | ||
10865 | +pool before the function. | ||
10866 | +*/ | ||
10867 | +#define CONSTANT_POOL_BEFORE_FUNCTION 0 | ||
10868 | + | ||
10869 | + | ||
10870 | +/* | ||
10871 | +Define this macro as a C expression which is nonzero if the constant | ||
10872 | +EXP, of type tree, should be output after the code for a | ||
10873 | +function. The compiler will normally output all constants before the | ||
10874 | +function; you need not define this macro if this is OK. | ||
10875 | +*/ | ||
10876 | +#define CONSTANT_AFTER_FUNCTION_P(EXP) 1 | ||
10877 | + | ||
10878 | + | ||
10879 | +/* | ||
10880 | +Define this macro as a C expression which is nonzero if C is | ||
10881 | +used as a logical line separator by the assembler. | ||
10882 | + | ||
10883 | +If you do not define this macro, the default is that only | ||
10884 | +the character ';' is treated as a logical line separator. | ||
10885 | +*/ | ||
10886 | +#define IS_ASM_LOGICAL_LINE_SEPARATOR(C) ((C) == '\n') | ||
10887 | + | ||
10888 | + | ||
10889 | +/** Output of Uninitialized Variables **/ | ||
10890 | + | ||
10891 | +/* | ||
10892 | +A C statement (sans semicolon) to output to the stdio stream | ||
10893 | +STREAM the assembler definition of a common-label named | ||
10894 | +NAME whose size is SIZE bytes. The variable ROUNDED | ||
10895 | +is the size rounded up to whatever alignment the caller wants. | ||
10896 | + | ||
10897 | +Use the expression assemble_name(STREAM, NAME) to | ||
10898 | +output the name itself; before and after that, output the additional | ||
10899 | +assembler syntax for defining the name, and a newline. | ||
10900 | + | ||
10901 | +This macro controls how the assembler definitions of uninitialized | ||
10902 | +common global variables are output. | ||
10903 | +*/ | ||
10904 | +/* | ||
10905 | +#define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED) \ | ||
10906 | + avr32_asm_output_common(STREAM, NAME, SIZE, ROUNDED) | ||
10907 | +*/ | ||
10908 | + | ||
10909 | +#define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \ | ||
10910 | + do \ | ||
10911 | + { \ | ||
10912 | + fputs ("\t.comm ", (FILE)); \ | ||
10913 | + assemble_name ((FILE), (NAME)); \ | ||
10914 | + fprintf ((FILE), ",%d\n", (SIZE)); \ | ||
10915 | + } \ | ||
10916 | + while (0) | ||
10917 | + | ||
10918 | +/* | ||
10919 | + * Like ASM_OUTPUT_BSS except takes the required alignment as a | ||
10920 | + * separate, explicit argument. If you define this macro, it is used | ||
10921 | + * in place of ASM_OUTPUT_BSS, and gives you more flexibility in | ||
10922 | + * handling the required alignment of the variable. The alignment is | ||
10923 | + * specified as the number of bits. | ||
10924 | + * | ||
10925 | + * Try to use function asm_output_aligned_bss defined in file varasm.c | ||
10926 | + * when defining this macro. | ||
10927 | + */ | ||
10928 | +#define ASM_OUTPUT_ALIGNED_BSS(STREAM, DECL, NAME, SIZE, ALIGNMENT) \ | ||
10929 | + asm_output_aligned_bss (STREAM, DECL, NAME, SIZE, ALIGNMENT) | ||
10930 | + | ||
10931 | +/* | ||
10932 | +A C statement (sans semicolon) to output to the stdio stream | ||
10933 | +STREAM the assembler definition of a local-common-label named | ||
10934 | +NAME whose size is SIZE bytes. The variable ROUNDED | ||
10935 | +is the size rounded up to whatever alignment the caller wants. | ||
10936 | + | ||
10937 | +Use the expression assemble_name(STREAM, NAME) to | ||
10938 | +output the name itself; before and after that, output the additional | ||
10939 | +assembler syntax for defining the name, and a newline. | ||
10940 | + | ||
10941 | +This macro controls how the assembler definitions of uninitialized | ||
10942 | +static variables are output. | ||
10943 | +*/ | ||
10944 | +#define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED) \ | ||
10945 | + do \ | ||
10946 | + { \ | ||
10947 | + fputs ("\t.lcomm ", (FILE)); \ | ||
10948 | + assemble_name ((FILE), (NAME)); \ | ||
10949 | + fprintf ((FILE), ",%d, %d\n", (SIZE), 2); \ | ||
10950 | + } \ | ||
10951 | + while (0) | ||
10952 | + | ||
10953 | + | ||
10954 | +/* | ||
10955 | +A C statement (sans semicolon) to output to the stdio stream | ||
10956 | +STREAM the assembler definition of a label named NAME. | ||
10957 | +Use the expression assemble_name(STREAM, NAME) to | ||
10958 | +output the name itself; before and after that, output the additional | ||
10959 | +assembler syntax for defining the name, and a newline. | ||
10960 | +*/ | ||
10961 | +#define ASM_OUTPUT_LABEL(STREAM, NAME) avr32_asm_output_label(STREAM, NAME) | ||
10962 | + | ||
10963 | +/* A C string containing the appropriate assembler directive to | ||
10964 | + * specify the size of a symbol, without any arguments. On systems | ||
10965 | + * that use ELF, the default (in 'config/elfos.h') is '"\t.size\t"'; | ||
10966 | + * on other systems, the default is not to define this macro. | ||
10967 | + * | ||
10968 | + * Define this macro only if it is correct to use the default | ||
10969 | + * definitions of ASM_ OUTPUT_SIZE_DIRECTIVE and | ||
10970 | + * ASM_OUTPUT_MEASURED_SIZE for your system. If you need your own | ||
10971 | + * custom definitions of those macros, or if you do not need explicit | ||
10972 | + * symbol sizes at all, do not define this macro. | ||
10973 | + */ | ||
10974 | +#define SIZE_ASM_OP "\t.size\t" | ||
10975 | + | ||
10976 | + | ||
10977 | +/* | ||
10978 | +A C statement (sans semicolon) to output to the stdio stream | ||
10979 | +STREAM some commands that will make the label NAME global; | ||
10980 | +that is, available for reference from other files. Use the expression | ||
10981 | +assemble_name(STREAM, NAME) to output the name | ||
10982 | +itself; before and after that, output the additional assembler syntax | ||
10983 | +for making that name global, and a newline. | ||
10984 | +*/ | ||
10985 | +#define GLOBAL_ASM_OP "\t.globl\t" | ||
10986 | + | ||
10987 | + | ||
10988 | + | ||
10989 | +/* | ||
10990 | +A C expression which evaluates to true if the target supports weak symbols. | ||
10991 | + | ||
10992 | +If you don't define this macro, defaults.h provides a default | ||
10993 | +definition. If either ASM_WEAKEN_LABEL or ASM_WEAKEN_DECL | ||
10994 | +is defined, the default definition is '1'; otherwise, it is | ||
10995 | +'0'. Define this macro if you want to control weak symbol support | ||
10996 | +with a compiler flag such as -melf. | ||
10997 | +*/ | ||
10998 | +#define SUPPORTS_WEAK 1 | ||
10999 | + | ||
11000 | +/* | ||
11001 | +A C statement (sans semicolon) to output to the stdio stream | ||
11002 | +STREAM a reference in assembler syntax to a label named | ||
11003 | +NAME. This should add '_' to the front of the name, if that | ||
11004 | +is customary on your operating system, as it is in most Berkeley Unix | ||
11005 | +systems. This macro is used in assemble_name. | ||
11006 | +*/ | ||
11007 | +#define ASM_OUTPUT_LABELREF(STREAM, NAME) \ | ||
11008 | + avr32_asm_output_labelref(STREAM, NAME) | ||
11009 | + | ||
11010 | + | ||
11011 | + | ||
11012 | +/* | ||
11013 | +A C expression to assign to OUTVAR (which is a variable of type | ||
11014 | +char *) a newly allocated string made from the string | ||
11015 | +NAME and the number NUMBER, with some suitable punctuation | ||
11016 | +added. Use alloca to get space for the string. | ||
11017 | + | ||
11018 | +The string will be used as an argument to ASM_OUTPUT_LABELREF to | ||
11019 | +produce an assembler label for an internal static variable whose name is | ||
11020 | +NAME. Therefore, the string must be such as to result in valid | ||
11021 | +assembler code. The argument NUMBER is different each time this | ||
11022 | +macro is executed; it prevents conflicts between similarly-named | ||
11023 | +internal static variables in different scopes. | ||
11024 | + | ||
11025 | +Ideally this string should not be a valid C identifier, to prevent any | ||
11026 | +conflict with the user's own symbols. Most assemblers allow periods | ||
11027 | +or percent signs in assembler symbols; putting at least one of these | ||
11028 | +between the name and the number will suffice. | ||
11029 | +*/ | ||
11030 | +#define ASM_FORMAT_PRIVATE_NAME(OUTVAR, NAME, NUMBER) \ | ||
11031 | + do \ | ||
11032 | + { \ | ||
11033 | + (OUTVAR) = (char *) alloca (strlen ((NAME)) + 10); \ | ||
11034 | + sprintf ((OUTVAR), "%s.%d", (NAME), (NUMBER)); \ | ||
11035 | + } \ | ||
11036 | + while (0) | ||
11037 | + | ||
11038 | + | ||
11039 | +/** Macros Controlling Initialization Routines **/ | ||
11040 | + | ||
11041 | + | ||
11042 | +/* | ||
11043 | +If defined, main will not call __main as described above. | ||
11044 | +This macro should be defined for systems that control start-up code | ||
11045 | +on a symbol-by-symbol basis, such as OSF/1, and should not | ||
11046 | +be defined explicitly for systems that support INIT_SECTION_ASM_OP. | ||
11047 | +*/ | ||
11048 | +/* | ||
11049 | + __main is not defined when debugging. | ||
11050 | +*/ | ||
11051 | +#define HAS_INIT_SECTION | ||
11052 | + | ||
11053 | + | ||
11054 | +/** Output of Assembler Instructions **/ | ||
11055 | + | ||
11056 | +/* | ||
11057 | +A C initializer containing the assembler's names for the machine | ||
11058 | +registers, each one as a C string constant. This is what translates | ||
11059 | +register numbers in the compiler into assembler language. | ||
11060 | +*/ | ||
11061 | + | ||
11062 | +#define REGISTER_NAMES \ | ||
11063 | +{ \ | ||
11064 | + "pc", "lr", \ | ||
11065 | + "sp", "r12", \ | ||
11066 | + "r11", "r10", \ | ||
11067 | + "r9", "r8", \ | ||
11068 | + "r7", "r6", \ | ||
11069 | + "r5", "r4", \ | ||
11070 | + "r3", "r2", \ | ||
11071 | + "r1", "r0", \ | ||
11072 | + "f15","f14", \ | ||
11073 | + "f13","f12", \ | ||
11074 | + "f11","f10", \ | ||
11075 | + "f9", "f8", \ | ||
11076 | + "f7", "f6", \ | ||
11077 | + "f5", "f4", \ | ||
11078 | + "f3", "f2", \ | ||
11079 | + "f1", "f0" \ | ||
11080 | +} | ||
11081 | + | ||
11082 | +/* | ||
11083 | +A C compound statement to output to stdio stream STREAM the | ||
11084 | +assembler syntax for an instruction operand X. X is an | ||
11085 | +RTL expression. | ||
11086 | + | ||
11087 | +CODE is a value that can be used to specify one of several ways | ||
11088 | +of printing the operand. It is used when identical operands must be | ||
11089 | +printed differently depending on the context. CODE comes from | ||
11090 | +the '%' specification that was used to request printing of the | ||
11091 | +operand. If the specification was just '%digit' then | ||
11092 | +CODE is 0; if the specification was '%ltr digit' | ||
11093 | +then CODE is the ASCII code for ltr. | ||
11094 | + | ||
11095 | +If X is a register, this macro should print the register's name. | ||
11096 | +The names can be found in an array reg_names whose type is | ||
11097 | +char *[]. reg_names is initialized from REGISTER_NAMES. | ||
11098 | + | ||
11099 | +When the machine description has a specification '%punct' | ||
11100 | +(a '%' followed by a punctuation character), this macro is called | ||
11101 | +with a null pointer for X and the punctuation character for | ||
11102 | +CODE. | ||
11103 | +*/ | ||
11104 | +#define PRINT_OPERAND(STREAM, X, CODE) avr32_print_operand(STREAM, X, CODE) | ||
11105 | + | ||
11106 | +/* A C statement to be executed just prior to the output of | ||
11107 | + assembler code for INSN, to modify the extracted operands so | ||
11108 | + they will be output differently. | ||
11109 | + | ||
11110 | + Here the argument OPVEC is the vector containing the operands | ||
11111 | + extracted from INSN, and NOPERANDS is the number of elements of | ||
11112 | + the vector which contain meaningful data for this insn. | ||
11113 | + The contents of this vector are what will be used to convert the insn | ||
11114 | + template into assembler code, so you can change the assembler output | ||
11115 | + by changing the contents of the vector. */ | ||
11116 | +#define FINAL_PRESCAN_INSN(INSN, OPVEC, NOPERANDS) \ | ||
11117 | + avr32_final_prescan_insn ((INSN), (OPVEC), (NOPERANDS)) | ||
11118 | + | ||
11119 | +/* | ||
11120 | +A C expression which evaluates to true if CODE is a valid | ||
11121 | +punctuation character for use in the PRINT_OPERAND macro. If | ||
11122 | +PRINT_OPERAND_PUNCT_VALID_P is not defined, it means that no | ||
11123 | +punctuation characters (except for the standard one, '%') are used | ||
11124 | +in this way. | ||
11125 | +*/ | ||
11126 | +/* | ||
11127 | + 'm' refers to the most significant word in a two-register mode. | ||
11128 | +*/ | ||
11129 | +#define PRINT_OPERAND_PUNCT_VALID_P(CODE) ((CODE) == 'm' || (CODE) == 'e') | ||
11130 | + | ||
11131 | +/* | ||
11132 | +A C compound statement to output to stdio stream STREAM the | ||
11133 | +assembler syntax for an instruction operand that is a memory reference | ||
11134 | +whose address is X. X is an RTL expression. | ||
11135 | + | ||
11136 | +On some machines, the syntax for a symbolic address depends on the | ||
11137 | +section that the address refers to. On these machines, define the macro | ||
11138 | +ENCODE_SECTION_INFO to store the information into the | ||
11139 | +symbol_ref, and then check for it here. (see Assembler Format.) | ||
11140 | +*/ | ||
11141 | +#define PRINT_OPERAND_ADDRESS(STREAM, X) avr32_print_operand_address(STREAM, X) | ||
11142 | + | ||
11143 | + | ||
11144 | +/** Output of Dispatch Tables **/ | ||
11145 | + | ||
11146 | +/* | ||
11147 | + * A C statement to output to the stdio stream stream an assembler | ||
11148 | + * pseudo-instruction to generate a difference between two | ||
11149 | + * labels. value and rel are the numbers of two internal labels. The | ||
11150 | + * definitions of these labels are output using | ||
11151 | + * (*targetm.asm_out.internal_label), and they must be printed in the | ||
11152 | + * same way here. For example, | ||
11153 | + * | ||
11154 | + * fprintf (stream, "\t.word L%d-L%d\n", | ||
11155 | + * value, rel) | ||
11156 | + * | ||
11157 | + * You must provide this macro on machines where the addresses in a | ||
11158 | + * dispatch table are relative to the table's own address. If defined, | ||
11159 | + * GCC will also use this macro on all machines when producing | ||
11160 | + * PIC. body is the body of the ADDR_DIFF_VEC; it is provided so that | ||
11161 | + * the mode and flags can be read. | ||
11162 | + */ | ||
11163 | +#define ASM_OUTPUT_ADDR_DIFF_ELT(STREAM, BODY, VALUE, REL) \ | ||
11164 | + fprintf(STREAM, "\tbral\t%sL%d\n", LOCAL_LABEL_PREFIX, VALUE) | ||
11165 | + | ||
11166 | +/* | ||
11167 | +This macro should be provided on machines where the addresses | ||
11168 | +in a dispatch table are absolute. | ||
11169 | + | ||
11170 | +The definition should be a C statement to output to the stdio stream | ||
11171 | +STREAM an assembler pseudo-instruction to generate a reference to | ||
11172 | +a label. VALUE is the number of an internal label whose | ||
11173 | +definition is output using ASM_OUTPUT_INTERNAL_LABEL. | ||
11174 | +For example, | ||
11175 | + | ||
11176 | +fprintf(STREAM, "\t.word L%d\n", VALUE) | ||
11177 | +*/ | ||
11178 | + | ||
11179 | +#define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE) \ | ||
11180 | + fprintf(STREAM, "\t.long %sL%d\n", LOCAL_LABEL_PREFIX, VALUE) | ||
11181 | + | ||
11182 | +/** Assembler Commands for Exception Regions */ | ||
11183 | + | ||
11184 | +/* ToDo: All of this subsection */ | ||
11185 | + | ||
11186 | +/** Assembler Commands for Alignment */ | ||
11187 | + | ||
11188 | + | ||
11189 | +/* | ||
11190 | +A C statement to output to the stdio stream STREAM an assembler | ||
11191 | +command to advance the location counter to a multiple of 2 to the | ||
11192 | +POWER bytes. POWER will be a C expression of type int. | ||
11193 | +*/ | ||
11194 | +#define ASM_OUTPUT_ALIGN(STREAM, POWER) \ | ||
11195 | + do \ | ||
11196 | + { \ | ||
11197 | + if ((POWER) != 0) \ | ||
11198 | + fprintf(STREAM, "\t.align\t%d\n", POWER); \ | ||
11199 | + } \ | ||
11200 | + while (0) | ||
11201 | + | ||
11202 | +/* | ||
11203 | +Like ASM_OUTPUT_ALIGN, except that the \nop" instruction is used for padding, if | ||
11204 | +necessary. | ||
11205 | +*/ | ||
11206 | +#define ASM_OUTPUT_ALIGN_WITH_NOP(STREAM, POWER) \ | ||
11207 | + fprintf(STREAM, "\t.balignw\t%d, 0xd703\n", (1 << POWER)) | ||
11208 | + | ||
11209 | + | ||
11210 | + | ||
11211 | +/****************************************************************************** | ||
11212 | + * Controlling Debugging Information Format | ||
11213 | + *****************************************************************************/ | ||
11214 | + | ||
11215 | +/* How to renumber registers for dbx and gdb. */ | ||
11216 | +#define DBX_REGISTER_NUMBER(REGNO) ASM_REGNUM (REGNO) | ||
11217 | + | ||
11218 | +/* The DWARF 2 CFA column which tracks the return address. */ | ||
11219 | +#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM(LR_REGNUM) | ||
11220 | + | ||
11221 | +/* | ||
11222 | +Define this macro if GCC should produce dwarf version 2 format | ||
11223 | +debugging output in response to the -g option. | ||
11224 | + | ||
11225 | +To support optional call frame debugging information, you must also | ||
11226 | +define INCOMING_RETURN_ADDR_RTX and either set | ||
11227 | +RTX_FRAME_RELATED_P on the prologue insns if you use RTL for the | ||
11228 | +prologue, or call dwarf2out_def_cfa and dwarf2out_reg_save | ||
11229 | +as appropriate from TARGET_ASM_FUNCTION_PROLOGUE if you don't. | ||
11230 | +*/ | ||
11231 | +#define DWARF2_DEBUGGING_INFO 1 | ||
11232 | + | ||
11233 | + | ||
11234 | +#define DWARF2_ASM_LINE_DEBUG_INFO 1 | ||
11235 | +#define DWARF2_FRAME_INFO 1 | ||
11236 | + | ||
11237 | + | ||
11238 | +/****************************************************************************** | ||
11239 | + * Miscellaneous Parameters | ||
11240 | + *****************************************************************************/ | ||
11241 | + | ||
11242 | +/* ToDo: a lot */ | ||
11243 | + | ||
11244 | +/* | ||
11245 | +An alias for a machine mode name. This is the machine mode that | ||
11246 | +elements of a jump-table should have. | ||
11247 | +*/ | ||
11248 | +#define CASE_VECTOR_MODE SImode | ||
11249 | + | ||
11250 | +/* | ||
11251 | +Define this macro to be a C expression to indicate when jump-tables | ||
11252 | +should contain relative addresses. If jump-tables never contain | ||
11253 | +relative addresses, then you need not define this macro. | ||
11254 | +*/ | ||
11255 | +#define CASE_VECTOR_PC_RELATIVE 0 | ||
11256 | + | ||
11257 | +/* | ||
11258 | +The maximum number of bytes that a single instruction can move quickly | ||
11259 | +between memory and registers or between two memory locations. | ||
11260 | +*/ | ||
11261 | +#define MOVE_MAX (2*UNITS_PER_WORD) | ||
11262 | + | ||
11263 | + | ||
11264 | +/* A C expression that is nonzero if on this machine the number of bits actually used | ||
11265 | + for the count of a shift operation is equal to the number of bits needed to represent | ||
11266 | + the size of the object being shifted. When this macro is nonzero, the compiler will | ||
11267 | + assume that it is safe to omit a sign-extend, zero-extend, and certain bitwise 'and' | ||
11268 | + instructions that truncates the count of a shift operation. On machines that have | ||
11269 | + instructions that act on bit-fields at variable positions, which may include 'bit test' | ||
11270 | + 378 GNU Compiler Collection (GCC) Internals | ||
11271 | + instructions, a nonzero SHIFT_COUNT_TRUNCATED also enables deletion of truncations | ||
11272 | + of the values that serve as arguments to bit-field instructions. | ||
11273 | + If both types of instructions truncate the count (for shifts) and position (for bit-field | ||
11274 | + operations), or if no variable-position bit-field instructions exist, you should define | ||
11275 | + this macro. | ||
11276 | + However, on some machines, such as the 80386 and the 680x0, truncation only applies | ||
11277 | + to shift operations and not the (real or pretended) bit-field operations. Define SHIFT_ | ||
11278 | + COUNT_TRUNCATED to be zero on such machines. Instead, add patterns to the 'md' file | ||
11279 | + that include the implied truncation of the shift instructions. | ||
11280 | + You need not dene this macro if it would always have the value of zero. */ | ||
11281 | +#define SHIFT_COUNT_TRUNCATED 1 | ||
11282 | + | ||
11283 | +/* | ||
11284 | +A C expression which is nonzero if on this machine it is safe to | ||
11285 | +convert an integer of INPREC bits to one of OUTPREC | ||
11286 | +bits (where OUTPREC is smaller than INPREC) by merely | ||
11287 | +operating on it as if it had only OUTPREC bits. | ||
11288 | + | ||
11289 | +On many machines, this expression can be 1. | ||
11290 | + | ||
11291 | +When TRULY_NOOP_TRUNCATION returns 1 for a pair of sizes for | ||
11292 | +modes for which MODES_TIEABLE_P is 0, suboptimal code can result. | ||
11293 | +If this is the case, making TRULY_NOOP_TRUNCATION return 0 in | ||
11294 | +such cases may improve things. | ||
11295 | +*/ | ||
11296 | +#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 | ||
11297 | + | ||
11298 | +/* | ||
11299 | +An alias for the machine mode for pointers. On most machines, define | ||
11300 | +this to be the integer mode corresponding to the width of a hardware | ||
11301 | +pointer; SImode on 32-bit machine or DImode on 64-bit machines. | ||
11302 | +On some machines you must define this to be one of the partial integer | ||
11303 | +modes, such as PSImode. | ||
11304 | + | ||
11305 | +The width of Pmode must be at least as large as the value of | ||
11306 | +POINTER_SIZE. If it is not equal, you must define the macro | ||
11307 | +POINTERS_EXTEND_UNSIGNED to specify how pointers are extended | ||
11308 | +to Pmode. | ||
11309 | +*/ | ||
11310 | +#define Pmode SImode | ||
11311 | + | ||
11312 | +/* | ||
11313 | +An alias for the machine mode used for memory references to functions | ||
11314 | +being called, in call RTL expressions. On most machines this | ||
11315 | +should be QImode. | ||
11316 | +*/ | ||
11317 | +#define FUNCTION_MODE SImode | ||
11318 | + | ||
11319 | + | ||
11320 | +#define REG_S_P(x) \ | ||
11321 | + (REG_P (x) || (GET_CODE (x) == SUBREG && REG_P (XEXP (x, 0)))) | ||
11322 | + | ||
11323 | + | ||
11324 | +/* If defined, modifies the length assigned to instruction INSN as a | ||
11325 | + function of the context in which it is used. LENGTH is an lvalue | ||
11326 | + that contains the initially computed length of the insn and should | ||
11327 | + be updated with the correct length of the insn. */ | ||
11328 | +#define ADJUST_INSN_LENGTH(INSN, LENGTH) \ | ||
11329 | + ((LENGTH) = avr32_adjust_insn_length ((INSN), (LENGTH))) | ||
11330 | + | ||
11331 | + | ||
11332 | +#define CLZ_DEFINED_VALUE_AT_ZERO(mode, value) \ | ||
11333 | + (value = 32, (mode == SImode)) | ||
11334 | + | ||
11335 | +#define CTZ_DEFINED_VALUE_AT_ZERO(mode, value) \ | ||
11336 | + (value = 32, (mode == SImode)) | ||
11337 | + | ||
11338 | +#define UNITS_PER_SIMD_WORD UNITS_PER_WORD | ||
11339 | + | ||
11340 | +#define STORE_FLAG_VALUE 1 | ||
11341 | + | ||
11342 | +enum avr32_builtins | ||
11343 | +{ | ||
11344 | + AVR32_BUILTIN_MTSR, | ||
11345 | + AVR32_BUILTIN_MFSR, | ||
11346 | + AVR32_BUILTIN_MTDR, | ||
11347 | + AVR32_BUILTIN_MFDR, | ||
11348 | + AVR32_BUILTIN_CACHE, | ||
11349 | + AVR32_BUILTIN_SYNC, | ||
11350 | + AVR32_BUILTIN_TLBR, | ||
11351 | + AVR32_BUILTIN_TLBS, | ||
11352 | + AVR32_BUILTIN_TLBW, | ||
11353 | + AVR32_BUILTIN_BREAKPOINT, | ||
11354 | + AVR32_BUILTIN_XCHG, | ||
11355 | + AVR32_BUILTIN_LDXI, | ||
11356 | + AVR32_BUILTIN_BSWAP16, | ||
11357 | + AVR32_BUILTIN_BSWAP32, | ||
11358 | + AVR32_BUILTIN_COP, | ||
11359 | + AVR32_BUILTIN_MVCR_W, | ||
11360 | + AVR32_BUILTIN_MVRC_W, | ||
11361 | + AVR32_BUILTIN_MVCR_D, | ||
11362 | + AVR32_BUILTIN_MVRC_D, | ||
11363 | + AVR32_BUILTIN_MULSATHH_H, | ||
11364 | + AVR32_BUILTIN_MULSATHH_W, | ||
11365 | + AVR32_BUILTIN_MULSATRNDHH_H, | ||
11366 | + AVR32_BUILTIN_MULSATRNDWH_W, | ||
11367 | + AVR32_BUILTIN_MULSATWH_W, | ||
11368 | + AVR32_BUILTIN_MACSATHH_W, | ||
11369 | + AVR32_BUILTIN_SATADD_H, | ||
11370 | + AVR32_BUILTIN_SATSUB_H, | ||
11371 | + AVR32_BUILTIN_SATADD_W, | ||
11372 | + AVR32_BUILTIN_SATSUB_W, | ||
11373 | + AVR32_BUILTIN_MULWH_D, | ||
11374 | + AVR32_BUILTIN_MULNWH_D, | ||
11375 | + AVR32_BUILTIN_MACWH_D, | ||
11376 | + AVR32_BUILTIN_MACHH_D, | ||
11377 | + AVR32_BUILTIN_MUSFR, | ||
11378 | + AVR32_BUILTIN_MUSTR, | ||
11379 | + AVR32_BUILTIN_SATS, | ||
11380 | + AVR32_BUILTIN_SATU, | ||
11381 | + AVR32_BUILTIN_SATRNDS, | ||
11382 | + AVR32_BUILTIN_SATRNDU | ||
11383 | +}; | ||
11384 | + | ||
11385 | + | ||
11386 | +#define FLOAT_LIB_COMPARE_RETURNS_BOOL(MODE, COMPARISON) \ | ||
11387 | + ((MODE == SFmode) || (MODE == DFmode)) | ||
11388 | + | ||
11389 | +#define RENAME_LIBRARY_SET ".set" | ||
11390 | + | ||
11391 | +/* Make ABI_NAME an alias for __GCC_NAME. */ | ||
11392 | +#define RENAME_LIBRARY(GCC_NAME, ABI_NAME) \ | ||
11393 | + __asm__ (".globl\t__avr32_" #ABI_NAME "\n" \ | ||
11394 | + ".set\t__avr32_" #ABI_NAME \ | ||
11395 | + ", __" #GCC_NAME "\n"); | ||
11396 | + | ||
11397 | +/* Give libgcc functions avr32 ABI name. */ | ||
11398 | +#ifdef L_muldi3 | ||
11399 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (muldi3, mul64) | ||
11400 | +#endif | ||
11401 | +#ifdef L_divdi3 | ||
11402 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (divdi3, sdiv64) | ||
11403 | +#endif | ||
11404 | +#ifdef L_udivdi3 | ||
11405 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (udivdi3, udiv64) | ||
11406 | +#endif | ||
11407 | +#ifdef L_moddi3 | ||
11408 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (moddi3, smod64) | ||
11409 | +#endif | ||
11410 | +#ifdef L_umoddi3 | ||
11411 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (umoddi3, umod64) | ||
11412 | +#endif | ||
11413 | +#ifdef L_ashldi3 | ||
11414 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (ashldi3, lsl64) | ||
11415 | +#endif | ||
11416 | +#ifdef L_lshrdi3 | ||
11417 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (lshrdi3, lsr64) | ||
11418 | +#endif | ||
11419 | +#ifdef L_ashrdi3 | ||
11420 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (ashrdi3, asr64) | ||
11421 | +#endif | ||
11422 | + | ||
11423 | +#ifdef L_fixsfdi | ||
11424 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixsfdi, f32_to_s64) | ||
11425 | +#endif | ||
11426 | +#ifdef L_fixunssfdi | ||
11427 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (fixunssfdi, f32_to_u64) | ||
11428 | +#endif | ||
11429 | +#ifdef L_floatdidf | ||
11430 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (floatdidf, s64_to_f64) | ||
11431 | +#endif | ||
11432 | +#ifdef L_floatdisf | ||
11433 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (floatdisf, s64_to_f32) | ||
11434 | +#endif | ||
11435 | + | ||
11436 | +#ifdef L_addsub_sf | ||
11437 | +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (addsf3, f32_add); RENAME_LIBRARY (subsf3, f32_sub) | ||
11438 | +#endif | ||
11439 | + | ||
11440 | +#endif | ||
11441 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32.md gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.md | ||
11442 | --- gcc-4.0.2/gcc/config/avr32/avr32.md 1970-01-01 01:00:00.000000000 +0100 | ||
11443 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32.md 2006-11-09 15:04:35.000000000 +0100 | ||
11444 | @@ -0,0 +1,4694 @@ | ||
11445 | +;; AVR32 machine description file. | ||
11446 | +;; Copyright 2003-2006 Atmel Corporation. | ||
11447 | +;; | ||
11448 | +;; Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
11449 | +;; | ||
11450 | +;; This file is part of GCC. | ||
11451 | +;; | ||
11452 | +;; This program is free software; you can redistribute it and/or modify | ||
11453 | +;; it under the terms of the GNU General Public License as published by | ||
11454 | +;; the Free Software Foundation; either version 2 of the License, or | ||
11455 | +;; (at your option) any later version. | ||
11456 | +;; | ||
11457 | +;; This program is distributed in the hope that it will be useful, | ||
11458 | +;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11459 | +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11460 | +;; GNU General Public License for more details. | ||
11461 | +;; | ||
11462 | +;; You should have received a copy of the GNU General Public License | ||
11463 | +;; along with this program; if not, write to the Free Software | ||
11464 | +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
11465 | + | ||
11466 | +;; -*- Mode: Scheme -*- | ||
11467 | + | ||
11468 | +(define_attr "type" "alu,alu2,alu_sat,mulhh,mulwh,mulww_w,mulww_d,div,machh_w,macww_w,macww_d,branch,call,load,load_rm,store,load2,load4,store2,store4,fmul,fcmps,fcmpd,fcast,fmv,fmvcpu,fldd,fstd,flds,fsts,fstm" | ||
11469 | + (const_string "alu")) | ||
11470 | + | ||
11471 | + | ||
11472 | +(define_attr "cc" "none,set_vncz,set_ncz,set_cz,set_z,bld,compare,clobber,call_set,fpcompare,from_fpcc" | ||
11473 | + (const_string "none")) | ||
11474 | + | ||
11475 | + | ||
11476 | +(define_attr "pipeline" "ap,uc" | ||
11477 | + (const_string "ap")) | ||
11478 | + | ||
11479 | +(define_attr "length" "" | ||
11480 | + (const_int 4)) | ||
11481 | + | ||
11482 | + | ||
11483 | +;; Uses of UNSPEC in this file: | ||
11484 | +(define_constants | ||
11485 | + [(UNSPEC_PUSHM 0) | ||
11486 | + (UNSPEC_POPM 1) | ||
11487 | + (UNSPEC_UDIVMODSI4_INTERNAL 2) | ||
11488 | + (UNSPEC_DIVMODSI4_INTERNAL 3) | ||
11489 | + (UNSPEC_STM 4) | ||
11490 | + (UNSPEC_LDM 5) | ||
11491 | + (UNSPEC_MOVSICC 6) | ||
11492 | + (UNSPEC_ADDSICC 7) | ||
11493 | + (UNSPEC_COND_MI 8) | ||
11494 | + (UNSPEC_COND_PL 9) | ||
11495 | + (UNSPEC_PIC_SYM 10) | ||
11496 | + (UNSPEC_PIC_BASE 11) | ||
11497 | + (UNSPEC_STORE_MULTIPLE 12) | ||
11498 | + (UNSPEC_STMFP 13) | ||
11499 | + (UNSPEC_FPCC_TO_REG 14) | ||
11500 | + (UNSPEC_REG_TO_CC 15) | ||
11501 | + (UNSPEC_FORCE_MINIPOOL 16) | ||
11502 | + (UNSPEC_SATS 17) | ||
11503 | + (UNSPEC_SATU 18) | ||
11504 | + (UNSPEC_SATRNDS 19) | ||
11505 | + (UNSPEC_SATRNDU 20) | ||
11506 | + ]) | ||
11507 | + | ||
11508 | +(define_constants | ||
11509 | + [(VUNSPEC_EPILOGUE 0) | ||
11510 | + (VUNSPEC_CACHE 1) | ||
11511 | + (VUNSPEC_MTSR 2) | ||
11512 | + (VUNSPEC_MFSR 3) | ||
11513 | + (VUNSPEC_BLOCKAGE 4) | ||
11514 | + (VUNSPEC_SYNC 5) | ||
11515 | + (VUNSPEC_TLBR 6) | ||
11516 | + (VUNSPEC_TLBW 7) | ||
11517 | + (VUNSPEC_TLBS 8) | ||
11518 | + (VUNSPEC_BREAKPOINT 9) | ||
11519 | + (VUNSPEC_MTDR 10) | ||
11520 | + (VUNSPEC_MFDR 11) | ||
11521 | + (VUNSPEC_MVCR 12) | ||
11522 | + (VUNSPEC_MVRC 13) | ||
11523 | + (VUNSPEC_COP 14) | ||
11524 | + (VUNSPEC_ALIGN 15) | ||
11525 | + (VUNSPEC_POOL_START 16) | ||
11526 | + (VUNSPEC_POOL_END 17) | ||
11527 | + (VUNSPEC_POOL_4 18) | ||
11528 | + (VUNSPEC_POOL_8 19) | ||
11529 | + (VUNSPEC_MUSFR 20) | ||
11530 | + (VUNSPEC_MUSTR 21) | ||
11531 | + ]) | ||
11532 | + | ||
11533 | +(define_constants | ||
11534 | + [ | ||
11535 | + ;; R7 = 15-7 = 8 | ||
11536 | + (FP_REGNUM 8) | ||
11537 | + ;; Return Register = R12 = 15 - 12 = 3 | ||
11538 | + (RETVAL_REGNUM 3) | ||
11539 | + ;; SP = R13 = 15 - 13 = 2 | ||
11540 | + (SP_REGNUM 2) | ||
11541 | + ;; LR = R14 = 15 - 14 = 1 | ||
11542 | + (LR_REGNUM 1) | ||
11543 | + ;; PC = R15 = 15 - 15 = 0 | ||
11544 | + (PC_REGNUM 0) | ||
11545 | + ;; FPSR = GENERAL_REGS + 1 = 17 | ||
11546 | + (FPCC_REGNUM 17) | ||
11547 | + ]) | ||
11548 | + | ||
11549 | + | ||
11550 | + | ||
11551 | + | ||
11552 | +;;****************************************************************************** | ||
11553 | +;; Macros | ||
11554 | +;;****************************************************************************** | ||
11555 | + | ||
11556 | +;; Integer Modes for basic alu insns | ||
11557 | +(define_mode_macro INTM [SI HI QI]) | ||
11558 | +(define_mode_attr alu_cc_attr [(SI "set_vncz") (HI "clobber") (QI "clobber")]) | ||
11559 | + | ||
11560 | +;; Move word modes | ||
11561 | +(define_mode_macro MOVM [SI V2HI V4QI]) | ||
11562 | + | ||
11563 | +;; For mov/addcc insns | ||
11564 | +(define_mode_macro ADDCC [SI HI QI]) | ||
11565 | +(define_mode_macro MOVCC [SI HI QI]) | ||
11566 | +(define_mode_macro CMP [DI SI HI QI]) | ||
11567 | +(define_mode_attr cmp_constraint [(DI "r") (SI "rKs21") (HI "r") (QI "r")]) | ||
11568 | +(define_mode_attr cmp_predicate [(DI "register_operand") | ||
11569 | + (SI "register_immediate_operand") | ||
11570 | + (HI "register_operand") | ||
11571 | + (QI "register_operand")]) | ||
11572 | + | ||
11573 | +;; For all conditional insns | ||
11574 | +(define_code_macro any_cond [eq ne gt ge lt le gtu geu ltu leu]) | ||
11575 | +(define_code_attr cond [(eq "eq") (ne "ne") (gt "gt") (ge "ge") (lt "lt") (le "le") | ||
11576 | + (gtu "hi") (geu "hs") (ltu "lo") (leu "ls")]) | ||
11577 | +(define_code_attr invcond [(eq "ne") (ne "eq") (gt "le") (ge "lt") (lt "ge") (le "gt") | ||
11578 | + (gtu "ls") (geu "lo") (ltu "hs") (leu "hi")]) | ||
11579 | + | ||
11580 | +;; For logical operations | ||
11581 | +(define_code_macro logical [and ior xor]) | ||
11582 | +(define_code_attr logical_insn [(and "and") (ior "or") (xor "eor")]) | ||
11583 | + | ||
11584 | +;; Load the predicates | ||
11585 | +(include "predicates.md") | ||
11586 | + | ||
11587 | + | ||
11588 | +;;****************************************************************************** | ||
11589 | +;; Automaton pipeline description for avr32 | ||
11590 | +;;****************************************************************************** | ||
11591 | + | ||
11592 | +(define_automaton "avr32_ap") | ||
11593 | + | ||
11594 | + | ||
11595 | +(define_cpu_unit "is" "avr32_ap") | ||
11596 | +(define_cpu_unit "a1,m1,da" "avr32_ap") | ||
11597 | +(define_cpu_unit "a2,m2,d" "avr32_ap") | ||
11598 | + | ||
11599 | +;;Alu instructions | ||
11600 | +(define_insn_reservation "alu_op" 1 | ||
11601 | + (and (eq_attr "pipeline" "ap") | ||
11602 | + (eq_attr "type" "alu")) | ||
11603 | + "is,a1,a2") | ||
11604 | + | ||
11605 | +(define_insn_reservation "alu2_op" 2 | ||
11606 | + (and (eq_attr "pipeline" "ap") | ||
11607 | + (eq_attr "type" "alu2")) | ||
11608 | + "is,is+a1,a1+a2,a2") | ||
11609 | + | ||
11610 | +(define_insn_reservation "alu_sat_op" 2 | ||
11611 | + (and (eq_attr "pipeline" "ap") | ||
11612 | + (eq_attr "type" "alu_sat")) | ||
11613 | + "is,a1,a2") | ||
11614 | + | ||
11615 | + | ||
11616 | +;;Mul instructions | ||
11617 | +(define_insn_reservation "mulhh_op" 2 | ||
11618 | + (and (eq_attr "pipeline" "ap") | ||
11619 | + (eq_attr "type" "mulhh,mulwh")) | ||
11620 | + "is,m1,m2") | ||
11621 | + | ||
11622 | +(define_insn_reservation "mulww_w_op" 3 | ||
11623 | + (and (eq_attr "pipeline" "ap") | ||
11624 | + (eq_attr "type" "mulww_w")) | ||
11625 | + "is,m1,m1+m2,m2") | ||
11626 | + | ||
11627 | +(define_insn_reservation "mulww_d_op" 5 | ||
11628 | + (and (eq_attr "pipeline" "ap") | ||
11629 | + (eq_attr "type" "mulww_d")) | ||
11630 | + "is,m1,m1+m2,m1+m2,m2,m2") | ||
11631 | + | ||
11632 | +(define_insn_reservation "div_op" 33 | ||
11633 | + (and (eq_attr "pipeline" "ap") | ||
11634 | + (eq_attr "type" "div")) | ||
11635 | + "is,m1,m1*31 + m2*31,m2") | ||
11636 | + | ||
11637 | +(define_insn_reservation "machh_w_op" 3 | ||
11638 | + (and (eq_attr "pipeline" "ap") | ||
11639 | + (eq_attr "type" "machh_w")) | ||
11640 | + "is*2,m1,m2") | ||
11641 | + | ||
11642 | + | ||
11643 | +(define_insn_reservation "macww_w_op" 4 | ||
11644 | + (and (eq_attr "pipeline" "ap") | ||
11645 | + (eq_attr "type" "macww_w")) | ||
11646 | + "is*2,m1,m1,m2") | ||
11647 | + | ||
11648 | + | ||
11649 | +(define_insn_reservation "macww_d_op" 6 | ||
11650 | + (and (eq_attr "pipeline" "ap") | ||
11651 | + (eq_attr "type" "macww_d")) | ||
11652 | + "is*2,m1,m1+m2,m1+m2,m2") | ||
11653 | + | ||
11654 | +;;Bypasses for Mac instructions, because of accumulator cache. | ||
11655 | +;;Set latency as low as possible in order to let the compiler let | ||
11656 | +;;mul -> mac and mac -> mac combinations which use the same | ||
11657 | +;;accumulator cache be placed close together to avoid any | ||
11658 | +;;instructions which can ruin the accumulator cache come inbetween. | ||
11659 | +(define_bypass 4 "machh_w_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11660 | +(define_bypass 5 "macww_w_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11661 | +(define_bypass 7 "macww_d_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11662 | + | ||
11663 | +(define_bypass 3 "mulhh_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11664 | +(define_bypass 4 "mulww_w_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11665 | +(define_bypass 6 "mulww_d_op" "alu_op,alu2_op,alu_sat_op,load_op" "avr32_mul_waw_bypass") | ||
11666 | + | ||
11667 | + | ||
11668 | +;;Bypasses for all mul/mac instructions followed by an instruction | ||
11669 | +;;which reads the output AND writes the result to the same register. | ||
11670 | +;;This will generate an Write After Write hazard which gives an | ||
11671 | +;;extra cycle before the result is ready. | ||
11672 | +(define_bypass 0 "machh_w_op" "machh_w_op" "avr32_valid_macmac_bypass") | ||
11673 | +(define_bypass 0 "macww_w_op" "macww_w_op" "avr32_valid_macmac_bypass") | ||
11674 | +(define_bypass 0 "macww_d_op" "macww_d_op" "avr32_valid_macmac_bypass") | ||
11675 | + | ||
11676 | +(define_bypass 0 "mulhh_op" "machh_w_op" "avr32_valid_mulmac_bypass") | ||
11677 | +(define_bypass 0 "mulww_w_op" "macww_w_op" "avr32_valid_mulmac_bypass") | ||
11678 | +(define_bypass 0 "mulww_d_op" "macww_d_op" "avr32_valid_mulmac_bypass") | ||
11679 | + | ||
11680 | +;;Branch and call instructions | ||
11681 | +;;We assume that all branches and rcalls are predicted correctly :-) | ||
11682 | +;;while calls use a lot of cycles. | ||
11683 | +(define_insn_reservation "branch_op" 0 | ||
11684 | + (and (eq_attr "pipeline" "ap") | ||
11685 | + (eq_attr "type" "branch")) | ||
11686 | + "nothing") | ||
11687 | + | ||
11688 | +(define_insn_reservation "call_op" 10 | ||
11689 | + (and (eq_attr "pipeline" "ap") | ||
11690 | + (eq_attr "type" "call")) | ||
11691 | + "nothing") | ||
11692 | + | ||
11693 | + | ||
11694 | +;;Load store instructions | ||
11695 | +(define_insn_reservation "load_op" 2 | ||
11696 | + (and (eq_attr "pipeline" "ap") | ||
11697 | + (eq_attr "type" "load")) | ||
11698 | + "is,da,d") | ||
11699 | + | ||
11700 | +(define_insn_reservation "load_rm_op" 3 | ||
11701 | + (and (eq_attr "pipeline" "ap") | ||
11702 | + (eq_attr "type" "load_rm")) | ||
11703 | + "is,da,d") | ||
11704 | + | ||
11705 | + | ||
11706 | +(define_insn_reservation "store_op" 0 | ||
11707 | + (and (eq_attr "pipeline" "ap") | ||
11708 | + (eq_attr "type" "store")) | ||
11709 | + "is,da,d") | ||
11710 | + | ||
11711 | + | ||
11712 | +(define_insn_reservation "load_double_op" 3 | ||
11713 | + (and (eq_attr "pipeline" "ap") | ||
11714 | + (eq_attr "type" "load2")) | ||
11715 | + "is,da,da+d,d") | ||
11716 | + | ||
11717 | +(define_insn_reservation "load_quad_op" 4 | ||
11718 | + (and (eq_attr "pipeline" "ap") | ||
11719 | + (eq_attr "type" "load4")) | ||
11720 | + "is,da,da+d,da+d,d") | ||
11721 | + | ||
11722 | +(define_insn_reservation "store_double_op" 0 | ||
11723 | + (and (eq_attr "pipeline" "ap") | ||
11724 | + (eq_attr "type" "store2")) | ||
11725 | + "is,da,da+d,d") | ||
11726 | + | ||
11727 | + | ||
11728 | +(define_insn_reservation "store_quad_op" 0 | ||
11729 | + (and (eq_attr "pipeline" "ap") | ||
11730 | + (eq_attr "type" "store4")) | ||
11731 | + "is,da,da+d,da+d,d") | ||
11732 | + | ||
11733 | +;;For store the operand to write to memory is read in d and | ||
11734 | +;;the real latency between any instruction and a store is therefore | ||
11735 | +;;one less than for the instructions which reads the operands in the first | ||
11736 | +;;excecution stage | ||
11737 | +(define_bypass 2 "load_double_op" "store_double_op" "avr32_store_bypass") | ||
11738 | +(define_bypass 3 "load_quad_op" "store_quad_op" "avr32_store_bypass") | ||
11739 | +(define_bypass 1 "load_op" "store_op" "avr32_store_bypass") | ||
11740 | +(define_bypass 2 "load_rm_op" "store_op" "avr32_store_bypass") | ||
11741 | +(define_bypass 1 "alu_sat_op" "store_op" "avr32_store_bypass") | ||
11742 | +(define_bypass 1 "alu2_op" "store_op" "avr32_store_bypass") | ||
11743 | +(define_bypass 1 "mulhh_op" "store_op" "avr32_store_bypass") | ||
11744 | +(define_bypass 2 "mulww_w_op" "store_op" "avr32_store_bypass") | ||
11745 | +(define_bypass 4 "mulww_d_op" "store_op" "avr32_store_bypass" ) | ||
11746 | +(define_bypass 2 "machh_w_op" "store_op" "avr32_store_bypass") | ||
11747 | +(define_bypass 3 "macww_w_op" "store_op" "avr32_store_bypass") | ||
11748 | +(define_bypass 5 "macww_d_op" "store_op" "avr32_store_bypass") | ||
11749 | + | ||
11750 | + | ||
11751 | +; Bypass for load double operation. If only the first loaded word is needed | ||
11752 | +; then the latency is 2 | ||
11753 | +(define_bypass 2 "load_double_op" | ||
11754 | + "load_op,load_rm_op,alu_sat_op, alu2_op, alu_op, mulhh_op, mulww_w_op, | ||
11755 | + mulww_d_op, machh_w_op, macww_w_op, macww_d_op" | ||
11756 | + "avr32_valid_load_double_bypass") | ||
11757 | + | ||
11758 | +; Bypass for load quad operation. If only the first or second loaded word is needed | ||
11759 | +; we set the latency to 2 | ||
11760 | +(define_bypass 2 "load_quad_op" | ||
11761 | + "load_op,load_rm_op,alu_sat_op, alu2_op, alu_op, mulhh_op, mulww_w_op, | ||
11762 | + mulww_d_op, machh_w_op, macww_w_op, macww_d_op" | ||
11763 | + "avr32_valid_load_quad_bypass") | ||
11764 | + | ||
11765 | + | ||
11766 | +;;****************************************************************************** | ||
11767 | +;; End of Automaton pipeline description for avr32 | ||
11768 | +;;****************************************************************************** | ||
11769 | + | ||
11770 | + | ||
11771 | + | ||
11772 | +;;============================================================================= | ||
11773 | +;; move | ||
11774 | +;;----------------------------------------------------------------------------- | ||
11775 | + | ||
11776 | +;;== char - 8 bits ============================================================ | ||
11777 | +(define_expand "movqi" | ||
11778 | + [(set (match_operand:QI 0 "nonimmediate_operand" "") | ||
11779 | + (match_operand:QI 1 "general_operand" ""))] | ||
11780 | + "" | ||
11781 | + { | ||
11782 | + if ( !no_new_pseudos ){ | ||
11783 | + if (GET_CODE (operands[1]) == MEM && optimize){ | ||
11784 | + rtx reg = gen_reg_rtx (SImode); | ||
11785 | + | ||
11786 | + emit_insn (gen_zero_extendqisi2 (reg, operands[1])); | ||
11787 | + operands[1] = gen_lowpart (QImode, reg); | ||
11788 | + } | ||
11789 | + | ||
11790 | + /* One of the ops has to be in a register. */ | ||
11791 | + if (GET_CODE (operands[0]) == MEM) | ||
11792 | + operands[1] = force_reg (QImode, operands[1]); | ||
11793 | + } | ||
11794 | + | ||
11795 | + }) | ||
11796 | + | ||
11797 | +(define_insn "*movqi_internal" | ||
11798 | + [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r") | ||
11799 | + (match_operand:QI 1 "general_operand" "rKs08,m,r,i"))] | ||
11800 | + "" | ||
11801 | + "@ | ||
11802 | + mov\t%0, %1 | ||
11803 | + ld.ub\t%0, %1 | ||
11804 | + st.b\t%0, %1 | ||
11805 | + mov\t%0, %1" | ||
11806 | + [(set_attr "length" "2,4,4,4") | ||
11807 | + (set_attr "type" "alu,load_rm,store,alu")]) | ||
11808 | + | ||
11809 | + | ||
11810 | + | ||
11811 | +;;== short - 16 bits ========================================================== | ||
11812 | +(define_expand "movhi" | ||
11813 | + [(set (match_operand:HI 0 "nonimmediate_operand" "") | ||
11814 | + (match_operand:HI 1 "general_operand" ""))] | ||
11815 | + "" | ||
11816 | + { | ||
11817 | + if ( !no_new_pseudos ){ | ||
11818 | + if (GET_CODE (operands[1]) == MEM && optimize){ | ||
11819 | + rtx reg = gen_reg_rtx (SImode); | ||
11820 | + | ||
11821 | + emit_insn (gen_extendhisi2 (reg, operands[1])); | ||
11822 | + operands[1] = gen_lowpart (HImode, reg); | ||
11823 | + } | ||
11824 | + | ||
11825 | + /* One of the ops has to be in a register. */ | ||
11826 | + if (GET_CODE (operands[0]) == MEM) | ||
11827 | + operands[1] = force_reg (HImode, operands[1]); | ||
11828 | + } | ||
11829 | + | ||
11830 | + }) | ||
11831 | + | ||
11832 | +(define_insn "*movhi_internal" | ||
11833 | + [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r") | ||
11834 | + (match_operand:HI 1 "general_operand" "rKs08,m,r,i"))] | ||
11835 | + "" | ||
11836 | + "@ | ||
11837 | + mov\t%0, %1 | ||
11838 | + ld.sh\t%0, %1 | ||
11839 | + st.h\t%0, %1 | ||
11840 | + mov\t%0, %1" | ||
11841 | + [(set_attr "length" "2,4,4,4") | ||
11842 | + (set_attr "type" "alu,load_rm,store,alu")]) | ||
11843 | + | ||
11844 | + | ||
11845 | +;;== int - 32 bits ============================================================ | ||
11846 | + | ||
11847 | +(define_expand "movmisalignsi" | ||
11848 | + [(set (match_operand:SI 0 "nonimmediate_operand" "") | ||
11849 | + (match_operand:SI 1 "nonimmediate_operand" ""))] | ||
11850 | + "TARGET_UNALIGNED_WORD" | ||
11851 | + { | ||
11852 | + } | ||
11853 | +) | ||
11854 | + | ||
11855 | +(define_expand "mov<mode>" | ||
11856 | + [(set (match_operand:MOVM 0 "nonimmediate_operand" "") | ||
11857 | + (match_operand:MOVM 1 "general_operand" ""))] | ||
11858 | + "" | ||
11859 | + { | ||
11860 | + | ||
11861 | + /* One of the ops has to be in a register. */ | ||
11862 | + if (GET_CODE (operands[0]) == MEM) | ||
11863 | + operands[1] = force_reg (<MODE>mode, operands[1]); | ||
11864 | + | ||
11865 | + | ||
11866 | + /* Check for out of range immediate constants as these may | ||
11867 | + occur during reloading, since it seems like reload does | ||
11868 | + not check if the immediate is legitimate. Don't know if | ||
11869 | + this is a bug? */ | ||
11870 | + if ( reload_in_progress | ||
11871 | + && GET_CODE(operands[1]) == CONST_INT | ||
11872 | + && !avr32_const_ok_for_constraint_p(INTVAL(operands[1]), 'K', "Ks21") ){ | ||
11873 | + operands[1] = force_const_mem(SImode, operands[1]); | ||
11874 | + } | ||
11875 | + | ||
11876 | + if ( (flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS) | ||
11877 | + && !avr32_legitimate_pic_operand_p(operands[1]) ) | ||
11878 | + operands[1] = legitimize_pic_address (operands[1], <MODE>mode, | ||
11879 | + (no_new_pseudos ? operands[0] : 0)); | ||
11880 | + else if ( flag_pic && avr32_address_operand(operands[1], GET_MODE(operands[1])) ) | ||
11881 | + /* If we have an address operand then this function uses the pic register. */ | ||
11882 | + current_function_uses_pic_offset_table = 1; | ||
11883 | + }) | ||
11884 | + | ||
11885 | + | ||
11886 | +(define_insn "mov<mode>_internal" | ||
11887 | + [(set (match_operand:MOVM 0 "nonimmediate_operand" "=r,r,r,m,r") | ||
11888 | + (match_operand:MOVM 1 "general_operand" "rKs08,Ks21,m,r,W"))] | ||
11889 | + "" | ||
11890 | + { | ||
11891 | + switch (which_alternative) { | ||
11892 | + case 0: | ||
11893 | + case 1: return "mov\t%0, %1"; | ||
11894 | + case 2: | ||
11895 | + if ( (REG_P(XEXP(operands[1], 0)) | ||
11896 | + && REGNO(XEXP(operands[1], 0)) == SP_REGNUM) | ||
11897 | + || (GET_CODE(XEXP(operands[1], 0)) == PLUS | ||
11898 | + && REGNO(XEXP(XEXP(operands[1], 0), 0)) == SP_REGNUM | ||
11899 | + && GET_CODE(XEXP(XEXP(operands[1], 0), 1)) == CONST_INT | ||
11900 | + && INTVAL(XEXP(XEXP(operands[1], 0), 1)) % 4 == 0 | ||
11901 | + && INTVAL(XEXP(XEXP(operands[1], 0), 1)) <= 0x1FC) ) | ||
11902 | + return "lddsp\t%0, %1"; | ||
11903 | + else if ( avr32_const_pool_ref_operand(operands[1], GET_MODE(operands[1])) ) | ||
11904 | + return "lddpc\t%0, %1"; | ||
11905 | + else | ||
11906 | + return "ld.w\t%0, %1"; | ||
11907 | + case 3: | ||
11908 | + if ( (REG_P(XEXP(operands[0], 0)) | ||
11909 | + && REGNO(XEXP(operands[0], 0)) == SP_REGNUM) | ||
11910 | + || (GET_CODE(XEXP(operands[0], 0)) == PLUS | ||
11911 | + && REGNO(XEXP(XEXP(operands[0], 0), 0)) == SP_REGNUM | ||
11912 | + && GET_CODE(XEXP(XEXP(operands[0], 0), 1)) == CONST_INT | ||
11913 | + && INTVAL(XEXP(XEXP(operands[0], 0), 1)) % 4 == 0 | ||
11914 | + && INTVAL(XEXP(XEXP(operands[0], 0), 1)) <= 0x1FC) ) | ||
11915 | + return "stdsp\t%0, %1"; | ||
11916 | + else | ||
11917 | + return "st.w\t%0, %1"; | ||
11918 | + case 4: | ||
11919 | + if ( TARGET_HAS_ASM_ADDR_PSEUDOS ) | ||
11920 | + return "lda.w\t%0, %1"; | ||
11921 | + else | ||
11922 | + return "ld.w\t%0, r6[%1@got]"; | ||
11923 | + default: | ||
11924 | + abort(); | ||
11925 | + } | ||
11926 | + } | ||
11927 | + | ||
11928 | + [(set_attr "length" "2,4,4,4,8") | ||
11929 | + (set_attr "type" "alu,alu,load,store,load") | ||
11930 | + (set_attr "cc" "none,none,none,none,clobber")]) | ||
11931 | + | ||
11932 | + | ||
11933 | +;; These instructions are for loading constants which cannot be loaded | ||
11934 | +;; directly from the constant pool because the offset is too large | ||
11935 | +;; high and lo_sum are used even tough for our case it should be | ||
11936 | +;; low and high sum :-) | ||
11937 | +(define_insn "mov_symbol_lo" | ||
11938 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
11939 | + (high:SI (match_operand:SI 1 "immediate_operand" "i" )))] | ||
11940 | + "" | ||
11941 | + "mov\t%0, lo(%1)" | ||
11942 | + [(set_attr "type" "alu") | ||
11943 | + (set_attr "length" "4")] | ||
11944 | +) | ||
11945 | + | ||
11946 | +(define_insn "add_symbol_hi" | ||
11947 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
11948 | + (lo_sum:SI (match_dup 0) | ||
11949 | + (match_operand:SI 1 "immediate_operand" "i" )))] | ||
11950 | + "" | ||
11951 | + "orh\t%0, hi(%1)" | ||
11952 | + [(set_attr "type" "alu") | ||
11953 | + (set_attr "length" "4")] | ||
11954 | +) | ||
11955 | + | ||
11956 | + | ||
11957 | + | ||
11958 | +;; When generating pic, we need to load the symbol offset into a register. | ||
11959 | +;; So that the optimizer does not confuse this with a normal symbol load | ||
11960 | +;; we use an unspec. The offset will be loaded from a constant pool entry, | ||
11961 | +;; since that is the only type of relocation we can use. | ||
11962 | +(define_insn "pic_load_addr" | ||
11963 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
11964 | + (unspec:SI [(match_operand:SI 1 "" "")] UNSPEC_PIC_SYM))] | ||
11965 | + "flag_pic && CONSTANT_POOL_ADDRESS_P(XEXP(operands[1], 0))" | ||
11966 | + "lddpc\t%0, %1" | ||
11967 | + [(set_attr "type" "load") | ||
11968 | + (set_attr "length" "4")] | ||
11969 | +) | ||
11970 | + | ||
11971 | +(define_insn "pic_compute_got_from_pc" | ||
11972 | + [(set (match_operand:SI 0 "register_operand" "+r") | ||
11973 | + (unspec:SI [(minus:SI (pc) | ||
11974 | + (match_dup 0))] UNSPEC_PIC_BASE)) | ||
11975 | + (use (label_ref (match_operand 1 "" "")))] | ||
11976 | + "flag_pic" | ||
11977 | + { | ||
11978 | + (*targetm.asm_out.internal_label) (asm_out_file, "L", | ||
11979 | + CODE_LABEL_NUMBER (operands[1])); | ||
11980 | + return \"rsub\t%0, pc\"; | ||
11981 | + } | ||
11982 | + [(set_attr "cc" "clobber") | ||
11983 | + (set_attr "length" "2")] | ||
11984 | +) | ||
11985 | + | ||
11986 | +;;== long long int - 64 bits ================================================== | ||
11987 | +(define_expand "movdi" | ||
11988 | + [(set (match_operand:DI 0 "nonimmediate_operand" "") | ||
11989 | + (match_operand:DI 1 "general_operand" ""))] | ||
11990 | + "" | ||
11991 | + { | ||
11992 | + | ||
11993 | + /* One of the ops has to be in a register. */ | ||
11994 | + if (GET_CODE (operands[0]) != REG) | ||
11995 | + operands[1] = force_reg (DImode, operands[1]); | ||
11996 | + | ||
11997 | + }) | ||
11998 | + | ||
11999 | + | ||
12000 | +(define_insn_and_split "*movdi_internal" | ||
12001 | + [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r,r,r,r,m") | ||
12002 | + (match_operand:DI 1 "general_operand" "r,Ks08,Ks21,G,m,r"))] | ||
12003 | + "" | ||
12004 | + { | ||
12005 | + switch (which_alternative ){ | ||
12006 | + case 1: | ||
12007 | + case 2: | ||
12008 | + if ( INTVAL(operands[1]) < 0 ) | ||
12009 | + return "mov\t%0, %1\;mov\t%m0, -1"; | ||
12010 | + else | ||
12011 | + return "mov\t%0, %1\;mov\t%m0, 0"; | ||
12012 | + case 0: | ||
12013 | + case 3: | ||
12014 | + return "mov\t%0, %1\;mov\t%m0, %m1"; | ||
12015 | + case 4: | ||
12016 | + if ( avr32_const_pool_ref_operand(operands[1], GET_MODE(operands[1]))) | ||
12017 | + return "ld.d\t%0, pc[%1 - .]"; | ||
12018 | + else | ||
12019 | + return "ld.d\t%0, %1"; | ||
12020 | + case 5: | ||
12021 | + return "st.d\t%0, %1"; | ||
12022 | + default: | ||
12023 | + abort(); | ||
12024 | + } | ||
12025 | + } | ||
12026 | + "reload_completed && | ||
12027 | + (REG_P(operands[0]) && | ||
12028 | + (REG_P(operands[1]) || avr32_const_double_immediate(operands[1]) || | ||
12029 | + ((GET_CODE(operands[1]) == CONST_INT) && avr32_const_ok_for_constraint_p(INTVAL(operands[1]), 'K', \"Ks21\")) ))" | ||
12030 | + [(set (match_dup 0) (match_dup 1)) | ||
12031 | + (set (match_dup 2) (match_dup 3))] | ||
12032 | + { | ||
12033 | + operands[2] = gen_highpart (SImode, operands[0]); | ||
12034 | + operands[0] = gen_lowpart (SImode, operands[0]); | ||
12035 | + if ( REG_P(operands[1]) ){ | ||
12036 | + operands[3] = gen_highpart(SImode, operands[1]); | ||
12037 | + operands[1] = gen_lowpart(SImode, operands[1]); | ||
12038 | + } else if ( GET_CODE(operands[1]) == CONST_DOUBLE ){ | ||
12039 | + operands[3] = GEN_INT(CONST_DOUBLE_LOW(operands[1])); | ||
12040 | + operands[1] = GEN_INT(CONST_DOUBLE_HIGH(operands[1])); | ||
12041 | + } else if ( GET_CODE(operands[1]) == CONST_INT ){ | ||
12042 | + operands[3] = GEN_INT((INTVAL(operands[1]) < 0) ? -1 : 0); | ||
12043 | + operands[1] = operands[1]; | ||
12044 | + } else { | ||
12045 | + internal_error("Illegal operand[1] for movdi split!"); | ||
12046 | + } | ||
12047 | + } | ||
12048 | + | ||
12049 | + [(set_attr "length" "4,6,8,8,4,4") | ||
12050 | + (set_attr "type" "alu2,alu2,alu2,alu2,load2,store2")]) | ||
12051 | + | ||
12052 | + | ||
12053 | +;;== 128 bits ================================================== | ||
12054 | +(define_expand "movti" | ||
12055 | + [(set (match_operand:TI 0 "nonimmediate_operand" "") | ||
12056 | + (match_operand:TI 1 "general_operand" ""))] | ||
12057 | + "" | ||
12058 | + { | ||
12059 | + | ||
12060 | + /* One of the ops has to be in a register. */ | ||
12061 | + if (GET_CODE (operands[0]) != REG) | ||
12062 | + operands[1] = force_reg (TImode, operands[1]); | ||
12063 | + | ||
12064 | + /* We must fix any pre_dec for loads and post_inc stores */ | ||
12065 | + if ( GET_CODE (operands[0]) == MEM | ||
12066 | + && GET_CODE (XEXP(operands[0],0)) == POST_INC ){ | ||
12067 | + emit_move_insn(gen_rtx_MEM(TImode, XEXP(XEXP(operands[0],0),0)), operands[1]); | ||
12068 | + emit_insn(gen_addsi3(XEXP(XEXP(operands[0],0),0), XEXP(XEXP(operands[0],0),0), GEN_INT(GET_MODE_SIZE(TImode)))); | ||
12069 | + DONE; | ||
12070 | + } | ||
12071 | + | ||
12072 | + if ( GET_CODE (operands[1]) == MEM | ||
12073 | + && GET_CODE (XEXP(operands[1],0)) == PRE_DEC ){ | ||
12074 | + emit_insn(gen_addsi3(XEXP(XEXP(operands[1],0),0), XEXP(XEXP(operands[1],0),0), GEN_INT(-GET_MODE_SIZE(TImode)))); | ||
12075 | + emit_move_insn(operands[0], gen_rtx_MEM(TImode, XEXP(XEXP(operands[1],0),0))); | ||
12076 | + DONE; | ||
12077 | + } | ||
12078 | + | ||
12079 | + if (GET_CODE (operands[1]) == CONST_INT){ | ||
12080 | + unsigned int sign_extend = (INTVAL(operands[1]) < 0) ? 0xFFFFFFFF : 0; | ||
12081 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 12), operands[1]); | ||
12082 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 8), GEN_INT(sign_extend)); | ||
12083 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 4), GEN_INT(sign_extend)); | ||
12084 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 0), GEN_INT(sign_extend)); | ||
12085 | + DONE; | ||
12086 | + } | ||
12087 | + | ||
12088 | + if (GET_CODE (operands[0]) == REG | ||
12089 | + && GET_CODE (operands[1]) == REG){ | ||
12090 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 12), gen_rtx_SUBREG(SImode, operands[1], 12)); | ||
12091 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 8), gen_rtx_SUBREG(SImode, operands[1], 8)); | ||
12092 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 4), gen_rtx_SUBREG(SImode, operands[1], 4)); | ||
12093 | + emit_move_insn(gen_rtx_SUBREG(SImode, operands[0], 0), gen_rtx_SUBREG(SImode, operands[1], 0)); | ||
12094 | + DONE; | ||
12095 | + } | ||
12096 | + }) | ||
12097 | + | ||
12098 | + | ||
12099 | +(define_insn "*movti_internal" | ||
12100 | + [(set (match_operand:TI 0 "nonimmediate_operand" "=r,r, <RKu00,r") | ||
12101 | + (match_operand:TI 1 "loadti_operand" " r,RKu00>,r,m"))] | ||
12102 | + "" | ||
12103 | + "@ | ||
12104 | + mov\t%T0, %T1\;mov\t%U0, %U1\;mov\t%L0, %L1\;mov\t%B0, %B1 | ||
12105 | + ldm\t%p1, %0 | ||
12106 | + stm\t%p0, %1 | ||
12107 | + ldm\t%p1, %0" | ||
12108 | + [(set_attr "length" "8,4,4,4") | ||
12109 | + (set_attr "type" "alu,load4,store4,load4")]) | ||
12110 | + | ||
12111 | + | ||
12112 | +;;== float - 32 bits ========================================================== | ||
12113 | +(define_expand "movsf" | ||
12114 | + [(set (match_operand:SF 0 "nonimmediate_operand" "") | ||
12115 | + (match_operand:SF 1 "general_operand" ""))] | ||
12116 | + "" | ||
12117 | + { | ||
12118 | + | ||
12119 | + | ||
12120 | + /* One of the ops has to be in a register. */ | ||
12121 | + if (GET_CODE (operands[0]) != REG) | ||
12122 | + operands[1] = force_reg (SFmode, operands[1]); | ||
12123 | + | ||
12124 | + }) | ||
12125 | + | ||
12126 | +(define_insn "*movsf_internal" | ||
12127 | + [(set (match_operand:SF 0 "nonimmediate_operand" "=r,r,r,m") | ||
12128 | + (match_operand:SF 1 "general_operand" "r,G,m,r"))] | ||
12129 | + "TARGET_SOFT_FLOAT" | ||
12130 | + { | ||
12131 | + switch (which_alternative) { | ||
12132 | + case 0: | ||
12133 | + case 1: return "mov\t%0, %1"; | ||
12134 | + case 2: | ||
12135 | + if ( (REG_P(XEXP(operands[1], 0)) | ||
12136 | + && REGNO(XEXP(operands[1], 0)) == SP_REGNUM) | ||
12137 | + || (GET_CODE(XEXP(operands[1], 0)) == PLUS | ||
12138 | + && REGNO(XEXP(XEXP(operands[1], 0), 0)) == SP_REGNUM | ||
12139 | + && GET_CODE(XEXP(XEXP(operands[1], 0), 1)) == CONST_INT | ||
12140 | + && INTVAL(XEXP(XEXP(operands[1], 0), 1)) % 4 == 0 | ||
12141 | + && INTVAL(XEXP(XEXP(operands[1], 0), 1)) <= 0x1FC) ) | ||
12142 | + return "lddsp\t%0, %1"; | ||
12143 | + else if ( avr32_const_pool_ref_operand(operands[1], GET_MODE(operands[1])) ) | ||
12144 | + return "lddpc\t%0, %1"; | ||
12145 | + else | ||
12146 | + return "ld.w\t%0, %1"; | ||
12147 | + case 3: | ||
12148 | + if ( (REG_P(XEXP(operands[0], 0)) | ||
12149 | + && REGNO(XEXP(operands[0], 0)) == SP_REGNUM) | ||
12150 | + || (GET_CODE(XEXP(operands[0], 0)) == PLUS | ||
12151 | + && REGNO(XEXP(XEXP(operands[0], 0), 0)) == SP_REGNUM | ||
12152 | + && GET_CODE(XEXP(XEXP(operands[0], 0), 1)) == CONST_INT | ||
12153 | + && INTVAL(XEXP(XEXP(operands[0], 0), 1)) % 4 == 0 | ||
12154 | + && INTVAL(XEXP(XEXP(operands[0], 0), 1)) <= 0x1FC) ) | ||
12155 | + return "stdsp\t%0, %1"; | ||
12156 | + else | ||
12157 | + return "st.w\t%0, %1"; | ||
12158 | + default: | ||
12159 | + abort(); | ||
12160 | + } | ||
12161 | + } | ||
12162 | + | ||
12163 | + [(set_attr "length" "2,4,4,4") | ||
12164 | + (set_attr "type" "alu,alu,load,store")]) | ||
12165 | + | ||
12166 | + | ||
12167 | + | ||
12168 | +;;== double - 64 bits ========================================================= | ||
12169 | +(define_expand "movdf" | ||
12170 | + [(set (match_operand:DF 0 "nonimmediate_operand" "") | ||
12171 | + (match_operand:DF 1 "general_operand" ""))] | ||
12172 | + "" | ||
12173 | + { | ||
12174 | + /* One of the ops has to be in a register. */ | ||
12175 | + if (GET_CODE (operands[0]) != REG){ | ||
12176 | + operands[1] = force_reg (DFmode, operands[1]); | ||
12177 | + } | ||
12178 | + }) | ||
12179 | + | ||
12180 | + | ||
12181 | +(define_insn_and_split "*movdf_internal" | ||
12182 | + [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,r,m") | ||
12183 | + (match_operand:DF 1 "general_operand" "r,G,m,r"))] | ||
12184 | + "TARGET_SOFT_FLOAT" | ||
12185 | + { | ||
12186 | + switch (which_alternative ){ | ||
12187 | + case 0: | ||
12188 | + case 1: | ||
12189 | + return "mov\t%0, %1\;mov\t%m0, %m1"; | ||
12190 | + case 2: | ||
12191 | + if ( avr32_const_pool_ref_operand(operands[1], GET_MODE(operands[1]))) | ||
12192 | + return "ld.d\t%0, pc[%1 - .]"; | ||
12193 | + else | ||
12194 | + return "ld.d\t%0, %1"; | ||
12195 | + case 3: | ||
12196 | + return "st.d\t%0, %1"; | ||
12197 | + default: | ||
12198 | + abort(); | ||
12199 | + } | ||
12200 | + } | ||
12201 | + "TARGET_SOFT_FLOAT | ||
12202 | + && reload_completed | ||
12203 | + && (REG_P(operands[0]) && REG_P(operands[1]))" | ||
12204 | + [(set (match_dup 0) (match_dup 1)) | ||
12205 | + (set (match_dup 2) (match_dup 3))] | ||
12206 | + " | ||
12207 | + { | ||
12208 | + operands[2] = gen_highpart (SImode, operands[0]); | ||
12209 | + operands[0] = gen_lowpart (SImode, operands[0]); | ||
12210 | + operands[3] = gen_highpart(SImode, operands[1]); | ||
12211 | + operands[1] = gen_lowpart(SImode, operands[1]); | ||
12212 | + } | ||
12213 | + " | ||
12214 | + | ||
12215 | + [(set_attr "length" "4,8,4,4") | ||
12216 | + (set_attr "type" "alu2,alu2,load2,store2")]) | ||
12217 | + | ||
12218 | + | ||
12219 | + | ||
12220 | + | ||
12221 | +;;============================================================================= | ||
12222 | +;; Move chunks of memory | ||
12223 | +;;============================================================================= | ||
12224 | + | ||
12225 | +(define_expand "movmemsi" | ||
12226 | + [(match_operand:BLK 0 "general_operand" "") | ||
12227 | + (match_operand:BLK 1 "general_operand" "") | ||
12228 | + (match_operand:SI 2 "const_int_operand" "") | ||
12229 | + (match_operand:SI 3 "const_int_operand" "")] | ||
12230 | + "" | ||
12231 | + " | ||
12232 | + if (avr32_gen_movmemsi (operands)) | ||
12233 | + DONE; | ||
12234 | + FAIL; | ||
12235 | + " | ||
12236 | + ) | ||
12237 | + | ||
12238 | + | ||
12239 | + | ||
12240 | + | ||
12241 | +;;============================================================================= | ||
12242 | +;; Bit field instructions | ||
12243 | +;;----------------------------------------------------------------------------- | ||
12244 | +;; Instructions to insert or extract bit-fields | ||
12245 | +;;============================================================================= | ||
12246 | + | ||
12247 | +(define_insn "insv" | ||
12248 | + [ (set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") | ||
12249 | + (match_operand:SI 1 "immediate_operand" "Ku05") | ||
12250 | + (match_operand:SI 2 "immediate_operand" "Ku05")) | ||
12251 | + (match_operand 3 "register_operand" "r"))] | ||
12252 | + "" | ||
12253 | + "bfins\t%0, %3, %2, %1" | ||
12254 | + [(set_attr "type" "alu") | ||
12255 | + (set_attr "length" "4") | ||
12256 | + (set_attr "cc" "set_ncz")]) | ||
12257 | + | ||
12258 | + | ||
12259 | + | ||
12260 | + | ||
12261 | +(define_insn "extv" | ||
12262 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
12263 | + (sign_extract:SI (match_operand:SI 1 "register_operand" "r") | ||
12264 | + (match_operand:SI 2 "immediate_operand" "Ku05") | ||
12265 | + (match_operand:SI 3 "immediate_operand" "Ku05")))] | ||
12266 | + "" | ||
12267 | + "bfexts\t%0, %1, %3, %2" | ||
12268 | + [(set_attr "type" "alu") | ||
12269 | + (set_attr "length" "4") | ||
12270 | + (set_attr "cc" "set_ncz")]) | ||
12271 | + | ||
12272 | + | ||
12273 | +(define_insn "extzv" | ||
12274 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
12275 | + (zero_extract:SI (match_operand:SI 1 "register_operand" "r") | ||
12276 | + (match_operand:SI 2 "immediate_operand" "Ku05") | ||
12277 | + (match_operand:SI 3 "immediate_operand" "Ku05")))] | ||
12278 | + "" | ||
12279 | + "bfextu\t%0, %1, %3, %2" | ||
12280 | + [(set_attr "type" "alu") | ||
12281 | + (set_attr "length" "4") | ||
12282 | + (set_attr "cc" "set_ncz")]) | ||
12283 | + | ||
12284 | + | ||
12285 | + | ||
12286 | +;;============================================================================= | ||
12287 | +;; Some peepholes for avoiding unnecessary cast instructions | ||
12288 | +;; followed by bfins. | ||
12289 | +;;----------------------------------------------------------------------------- | ||
12290 | + | ||
12291 | +(define_peephole2 | ||
12292 | + [(set (match_operand:SI 0 "register_operand" "") | ||
12293 | + (zero_extend:SI (match_operand:QI 1 "register_operand" ""))) | ||
12294 | + (set (zero_extract:SI (match_operand 2 "register_operand" "") | ||
12295 | + (match_operand:SI 3 "immediate_operand" "") | ||
12296 | + (match_operand:SI 4 "immediate_operand" "")) | ||
12297 | + (match_dup 0))] | ||
12298 | + "((peep2_reg_dead_p(2, operands[0]) && | ||
12299 | + (INTVAL(operands[3]) <= 8)))" | ||
12300 | + [(set (zero_extract:SI (match_dup 2) | ||
12301 | + (match_dup 3) | ||
12302 | + (match_dup 4)) | ||
12303 | + (match_dup 1))] | ||
12304 | + ) | ||
12305 | + | ||
12306 | +(define_peephole2 | ||
12307 | + [(set (match_operand:SI 0 "register_operand" "") | ||
12308 | + (zero_extend:SI (match_operand:HI 1 "register_operand" ""))) | ||
12309 | + (set (zero_extract:SI (match_operand 2 "register_operand" "") | ||
12310 | + (match_operand:SI 3 "immediate_operand" "") | ||
12311 | + (match_operand:SI 4 "immediate_operand" "")) | ||
12312 | + (match_dup 0))] | ||
12313 | + "((peep2_reg_dead_p(2, operands[0]) && | ||
12314 | + (INTVAL(operands[3]) <= 16)))" | ||
12315 | + [(set (zero_extract:SI (match_dup 2) | ||
12316 | + (match_dup 3) | ||
12317 | + (match_dup 4)) | ||
12318 | + (match_dup 1))] | ||
12319 | + ) | ||
12320 | + | ||
12321 | +;;============================================================================= | ||
12322 | +;; push bytes | ||
12323 | +;;----------------------------------------------------------------------------- | ||
12324 | +;; Implements the push instruction | ||
12325 | +;;============================================================================= | ||
12326 | +(define_insn "pushm" | ||
12327 | + [(set (mem:BLK (pre_dec:BLK (reg:SI SP_REGNUM))) | ||
12328 | + (unspec:BLK [(match_operand 0 "const_int_operand" "")] | ||
12329 | + UNSPEC_PUSHM))] | ||
12330 | + "" | ||
12331 | + { | ||
12332 | + if (INTVAL(operands[0])) { | ||
12333 | + return "pushm\t%r0"; | ||
12334 | + } else { | ||
12335 | + return ""; | ||
12336 | + } | ||
12337 | + } | ||
12338 | + [(set_attr "type" "store") | ||
12339 | + (set_attr "length" "2") | ||
12340 | + (set_attr "cc" "none")]) | ||
12341 | + | ||
12342 | +(define_insn "stm" | ||
12343 | + [(unspec [(match_operand 0 "register_operand" "r") | ||
12344 | + (match_operand 1 "const_int_operand" "") | ||
12345 | + (match_operand 2 "const_int_operand" "")] | ||
12346 | + UNSPEC_STM)] | ||
12347 | + "" | ||
12348 | + { | ||
12349 | + if (INTVAL(operands[1])) { | ||
12350 | + if (INTVAL(operands[2]) != 0) | ||
12351 | + return "stm\t--%0, %s1"; | ||
12352 | + else | ||
12353 | + return "stm\t%0, %s1"; | ||
12354 | + } else { | ||
12355 | + return ""; | ||
12356 | + } | ||
12357 | + } | ||
12358 | + [(set_attr "type" "store") | ||
12359 | + (set_attr "length" "4") | ||
12360 | + (set_attr "cc" "none")]) | ||
12361 | + | ||
12362 | + | ||
12363 | + | ||
12364 | +(define_insn "popm" | ||
12365 | + [(unspec [(match_operand 0 "const_int_operand" "")] | ||
12366 | + UNSPEC_POPM)] | ||
12367 | + "" | ||
12368 | + { | ||
12369 | + if (INTVAL(operands[0])) { | ||
12370 | + return "popm %r0"; | ||
12371 | + } else { | ||
12372 | + return ""; | ||
12373 | + } | ||
12374 | + } | ||
12375 | + [(set_attr "type" "load") | ||
12376 | + (set_attr "length" "2")]) | ||
12377 | + | ||
12378 | + | ||
12379 | + | ||
12380 | +;;============================================================================= | ||
12381 | +;; add | ||
12382 | +;;----------------------------------------------------------------------------- | ||
12383 | +;; Adds reg1 with reg2 and puts the result in reg0. | ||
12384 | +;;============================================================================= | ||
12385 | +(define_insn "add<mode>3" | ||
12386 | + [(set (match_operand:INTM 0 "register_operand" "=r,r,r,r,r") | ||
12387 | + (plus:INTM (match_operand:INTM 1 "register_operand" "%0,r,0,r,0") | ||
12388 | + (match_operand:INTM 2 "avr32_add_operand" "r,r,Is08,Is16,Is21")))] | ||
12389 | + "" | ||
12390 | + "@ | ||
12391 | + add %0, %2 | ||
12392 | + add %0, %1, %2 | ||
12393 | + sub %0, %n2 | ||
12394 | + sub %0, %1, %n2 | ||
12395 | + sub %0, %n2" | ||
12396 | + | ||
12397 | + [(set_attr "length" "2,4,2,4,4") | ||
12398 | + (set_attr "cc" "<INTM:alu_cc_attr>")]) | ||
12399 | + | ||
12400 | +(define_insn "*addsi3_lsl" | ||
12401 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12402 | + (plus:SI (ashift:SI (match_operand:SI 1 "register_operand" "r") | ||
12403 | + (match_operand:SI 3 "avr32_add_shift_immediate_operand" "Ku02")) | ||
12404 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12405 | + "" | ||
12406 | + "add %0, %2, %1 << %3" | ||
12407 | + [(set_attr "length" "4") | ||
12408 | + (set_attr "cc" "set_vncz")]) | ||
12409 | + | ||
12410 | + | ||
12411 | +(define_insn "*addsi3_mul" | ||
12412 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12413 | + (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "r") | ||
12414 | + (match_operand:SI 3 "immediate_operand" "Ku04" )) | ||
12415 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12416 | + "(INTVAL(operands[3]) == 0) || (INTVAL(operands[3]) == 2) || | ||
12417 | + (INTVAL(operands[3]) == 4) || (INTVAL(operands[3]) == 8)" | ||
12418 | + "add %0, %2, %1 << %p3" | ||
12419 | + [(set_attr "length" "4") | ||
12420 | + (set_attr "cc" "set_vncz")]) | ||
12421 | + | ||
12422 | + | ||
12423 | +(define_peephole2 | ||
12424 | + [(set (match_operand:SI 0 "register_operand" "") | ||
12425 | + (ashift:SI (match_operand:SI 1 "register_operand" "") | ||
12426 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
12427 | + (set (match_operand:SI 3 "register_operand" "") | ||
12428 | + (plus:SI (match_dup 0) | ||
12429 | + (match_operand:SI 4 "register_operand" "")))] | ||
12430 | + "(peep2_reg_dead_p(2, operands[0]) && | ||
12431 | + (INTVAL(operands[2]) < 4 && INTVAL(operands[2]) > 0))" | ||
12432 | + [(set (match_dup 3) | ||
12433 | + (plus:SI (ashift:SI (match_dup 1) | ||
12434 | + (match_dup 2)) | ||
12435 | + (match_dup 4)))] | ||
12436 | + ) | ||
12437 | + | ||
12438 | +(define_peephole2 | ||
12439 | + [(set (match_operand:SI 0 "register_operand" "") | ||
12440 | + (ashift:SI (match_operand:SI 1 "register_operand" "") | ||
12441 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
12442 | + (set (match_operand:SI 3 "register_operand" "") | ||
12443 | + (plus:SI (match_operand:SI 4 "register_operand" "") | ||
12444 | + (match_dup 0)))] | ||
12445 | + "(peep2_reg_dead_p(2, operands[0]) && | ||
12446 | + (INTVAL(operands[2]) < 4 && INTVAL(operands[2]) > 0))" | ||
12447 | + [(set (match_dup 3) | ||
12448 | + (plus:SI (ashift:SI (match_dup 1) | ||
12449 | + (match_dup 2)) | ||
12450 | + (match_dup 4)))] | ||
12451 | + ) | ||
12452 | + | ||
12453 | +(define_insn "adddi3" | ||
12454 | + [(set (match_operand:DI 0 "register_operand" "=r,r") | ||
12455 | + (plus:DI (match_operand:DI 1 "register_operand" "%r,0") | ||
12456 | + (match_operand:DI 2 "register_operand" "r,r")))] | ||
12457 | + "" | ||
12458 | + "@ | ||
12459 | + add %0, %1, %2\;adc %m0, %m1, %m2 | ||
12460 | + add %0, %2\;adc %m0, %m0, %m2" | ||
12461 | + [(set_attr "length" "8,6") | ||
12462 | + (set_attr "type" "alu2") | ||
12463 | + (set_attr "cc" "set_vncz")]) | ||
12464 | + | ||
12465 | + | ||
12466 | + | ||
12467 | +;;============================================================================= | ||
12468 | +;; subtract | ||
12469 | +;;----------------------------------------------------------------------------- | ||
12470 | +;; Subtract reg2 or immediate value from reg0 and puts the result in reg0. | ||
12471 | +;;============================================================================= | ||
12472 | + | ||
12473 | +(define_peephole2 | ||
12474 | + [(set (match_operand:QI 0 "register_operand" "") | ||
12475 | + (minus:QI (match_operand:QI 1 "general_operand" "") | ||
12476 | + (match_operand:QI 2 "general_operand" ""))) | ||
12477 | + (set (match_operand:QI 3 "register_operand" "") | ||
12478 | + (match_dup 0))] | ||
12479 | + "peep2_reg_dead_p(2, operands[0])" | ||
12480 | + [(set (match_dup 3) | ||
12481 | + (minus:QI (match_dup 1) (match_dup 2)))] | ||
12482 | + ) | ||
12483 | + | ||
12484 | +(define_peephole | ||
12485 | + [(set (match_operand:QI 0 "register_operand" "") | ||
12486 | + (minus:QI (match_operand:QI 1 "immediate_operand" "Ks08") | ||
12487 | + (match_operand:QI 2 "register_operand" "r"))) | ||
12488 | + (set (match_operand:QI 3 "register_operand" "r") | ||
12489 | + (match_dup 0))] | ||
12490 | + "dead_or_set_p(insn, operands[0])" | ||
12491 | + "rsub %3, %2, %1" | ||
12492 | + [(set_attr "length" "4") | ||
12493 | + (set_attr "cc" "clobber")] | ||
12494 | + ) | ||
12495 | + | ||
12496 | + | ||
12497 | + | ||
12498 | +(define_insn "sub<mode>3" | ||
12499 | + [(set (match_operand:INTM 0 "general_operand" "=r,r,r,r,r,r,r") | ||
12500 | + (minus:INTM (match_operand:INTM 1 "nonmemory_operand" "0,r,0,r,0,r,Ks08") | ||
12501 | + (match_operand:INTM 2 "nonmemory_operand" "r,r,Ks08,Ks16,Ks21,0,r")))] | ||
12502 | + "" | ||
12503 | + "@ | ||
12504 | + sub %0, %2 | ||
12505 | + sub %0, %1, %2 | ||
12506 | + sub %0, %2 | ||
12507 | + sub %0, %1, %2 | ||
12508 | + sub %0, %2 | ||
12509 | + rsub %0, %1 | ||
12510 | + rsub %0, %2, %1" | ||
12511 | + [(set_attr "length" "2,4,2,4,4,2,4") | ||
12512 | + (set_attr "cc" "<INTM:alu_cc_attr>")]) | ||
12513 | + | ||
12514 | +(define_insn "*sub<mode>3_mul" | ||
12515 | + [(set (match_operand:INTM 0 "register_operand" "=r,r,r") | ||
12516 | + (minus:INTM (match_operand:INTM 1 "register_operand" "r,0,r") | ||
12517 | + (mult:INTM (match_operand:INTM 2 "register_operand" "r,r,0") | ||
12518 | + (match_operand:SI 3 "immediate_operand" "Ku04,Ku04,Ku04" ))))] | ||
12519 | + "(INTVAL(operands[3]) == 0) || (INTVAL(operands[3]) == 2) || | ||
12520 | + (INTVAL(operands[3]) == 4) || (INTVAL(operands[3]) == 8)" | ||
12521 | + "@ | ||
12522 | + sub %0, %1, %2 << %p3 | ||
12523 | + sub %0, %0, %2 << %p3 | ||
12524 | + sub %0, %1, %0 << %p3" | ||
12525 | + [(set_attr "length" "4,4,4") | ||
12526 | + (set_attr "cc" "<INTM:alu_cc_attr>")]) | ||
12527 | + | ||
12528 | +(define_insn "*sub<mode>3_lsl" | ||
12529 | + [(set (match_operand:INTM 0 "register_operand" "=r") | ||
12530 | + (minus:INTM (ashift:INTM (match_operand:INTM 1 "register_operand" "r") | ||
12531 | + (match_operand:SI 3 "avr32_add_shift_immediate_operand" "Ku02")) | ||
12532 | + (match_operand:INTM 2 "register_operand" "r")))] | ||
12533 | + "" | ||
12534 | + "sub %0, %2, %1 << %3" | ||
12535 | + [(set_attr "length" "4") | ||
12536 | + (set_attr "cc" "<INTM:alu_cc_attr>")]) | ||
12537 | + | ||
12538 | + | ||
12539 | +(define_insn "subdi3" | ||
12540 | + [(set (match_operand:DI 0 "register_operand" "=r,r") | ||
12541 | + (minus:DI (match_operand:DI 1 "register_operand" "%r,0") | ||
12542 | + (match_operand:DI 2 "register_operand" "r,r")))] | ||
12543 | + "" | ||
12544 | + "@ | ||
12545 | + sub %0, %1, %2\;sbc %m0, %m1, %m2 | ||
12546 | + sub %0, %2\;sbc %m0, %m0, %m2" | ||
12547 | + [(set_attr "length" "8,6") | ||
12548 | + (set_attr "type" "alu2") | ||
12549 | + (set_attr "cc" "set_vncz")]) | ||
12550 | + | ||
12551 | + | ||
12552 | + | ||
12553 | +;;============================================================================= | ||
12554 | +;; multiply | ||
12555 | +;;----------------------------------------------------------------------------- | ||
12556 | +;; Multiply op1 and op2 and put the value in op0. | ||
12557 | +;;============================================================================= | ||
12558 | + | ||
12559 | + | ||
12560 | +(define_insn "mulqi3" | ||
12561 | + [(set (match_operand:QI 0 "register_operand" "=r,r,r") | ||
12562 | + (mult:QI (match_operand:QI 1 "register_operand" "%0,r,r") | ||
12563 | + (match_operand:QI 2 "avr32_mul_operand" "r,r,Ks08")))] | ||
12564 | + "" | ||
12565 | + { | ||
12566 | + switch (which_alternative){ | ||
12567 | + case 0: | ||
12568 | + return "mul %0, %2"; | ||
12569 | + case 1: | ||
12570 | + return "mul %0, %1, %2"; | ||
12571 | + case 2: | ||
12572 | + return "mul %0, %1, %2"; | ||
12573 | + default: | ||
12574 | + abort(); | ||
12575 | + } | ||
12576 | + } | ||
12577 | + [(set_attr "type" "mulww_w,mulww_w,mulwh") | ||
12578 | + (set_attr "length" "2,4,4") | ||
12579 | + (set_attr "cc" "none")]) | ||
12580 | + | ||
12581 | +(define_insn "mulsi3" | ||
12582 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
12583 | + (mult:SI (match_operand:SI 1 "register_operand" "%0,r,r") | ||
12584 | + (match_operand:SI 2 "avr32_mul_operand" "r,r,Ks08")))] | ||
12585 | + "" | ||
12586 | + { | ||
12587 | + switch (which_alternative){ | ||
12588 | + case 0: | ||
12589 | + return "mul %0, %2"; | ||
12590 | + case 1: | ||
12591 | + return "mul %0, %1, %2"; | ||
12592 | + case 2: | ||
12593 | + return "mul %0, %1, %2"; | ||
12594 | + default: | ||
12595 | + abort(); | ||
12596 | + } | ||
12597 | + } | ||
12598 | + [(set_attr "type" "mulww_w,mulww_w,mulwh") | ||
12599 | + (set_attr "length" "2,4,4") | ||
12600 | + (set_attr "cc" "none")]) | ||
12601 | + | ||
12602 | + | ||
12603 | +(define_insn "mulhisi3" | ||
12604 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12605 | + (mult:SI | ||
12606 | + (sign_extend:SI (match_operand:HI 1 "register_operand" "%r")) | ||
12607 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] | ||
12608 | + "TARGET_DSP" | ||
12609 | + "mulhh.w %0, %1:b, %2:b" | ||
12610 | + [(set_attr "type" "mulhh") | ||
12611 | + (set_attr "length" "4") | ||
12612 | + (set_attr "cc" "none")]) | ||
12613 | + | ||
12614 | +(define_peephole2 | ||
12615 | + [(match_scratch:DI 6 "r") | ||
12616 | + (set (match_operand:SI 0 "register_operand" "") | ||
12617 | + (mult:SI | ||
12618 | + (sign_extend:SI (match_operand:HI 1 "register_operand" "")) | ||
12619 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "")))) | ||
12620 | + (set (match_operand:SI 3 "register_operand" "") | ||
12621 | + (ashiftrt:SI (match_dup 0) | ||
12622 | + (const_int 16)))] | ||
12623 | + "TARGET_DSP | ||
12624 | + && (peep2_reg_dead_p(1, operands[0]) || (REGNO(operands[0]) == REGNO(operands[3])))" | ||
12625 | + [(set (match_dup 4) (sign_extend:SI (match_dup 1))) | ||
12626 | + (set (match_dup 6) | ||
12627 | + (ashift:DI (mult:DI (sign_extend:DI (match_dup 4)) | ||
12628 | + (sign_extend:DI (match_dup 2))) | ||
12629 | + (const_int 16))) | ||
12630 | + (set (match_dup 3) (match_dup 5))] | ||
12631 | + | ||
12632 | + "{ | ||
12633 | + operands[4] = gen_rtx_REG(SImode, REGNO(operands[1])); | ||
12634 | + operands[5] = gen_highpart (SImode, operands[4]); | ||
12635 | + }" | ||
12636 | + ) | ||
12637 | + | ||
12638 | +(define_insn "mulnhisi3" | ||
12639 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12640 | + (mult:SI | ||
12641 | + (sign_extend:SI (neg:HI (match_operand:HI 1 "register_operand" "r"))) | ||
12642 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))))] | ||
12643 | + "TARGET_DSP" | ||
12644 | + "mulnhh.w %0, %1:b, %2:b" | ||
12645 | + [(set_attr "type" "mulhh") | ||
12646 | + (set_attr "length" "4") | ||
12647 | + (set_attr "cc" "none")]) | ||
12648 | + | ||
12649 | +(define_insn "machisi3" | ||
12650 | + [(set (match_operand:SI 0 "register_operand" "+r") | ||
12651 | + (plus:SI (mult:SI | ||
12652 | + (sign_extend:SI (match_operand:HI 1 "register_operand" "%r")) | ||
12653 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))) | ||
12654 | + (match_dup 0)))] | ||
12655 | + "TARGET_DSP" | ||
12656 | + "machh.w %0, %1:b, %2:b" | ||
12657 | + [(set_attr "type" "machh_w") | ||
12658 | + (set_attr "length" "4") | ||
12659 | + (set_attr "cc" "none")]) | ||
12660 | + | ||
12661 | + | ||
12662 | + | ||
12663 | +(define_insn "mulsidi3" | ||
12664 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
12665 | + (mult:DI | ||
12666 | + (sign_extend:DI (match_operand:SI 1 "register_operand" "%r")) | ||
12667 | + (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))))] | ||
12668 | + "" | ||
12669 | + "muls.d %0, %1, %2" | ||
12670 | + [(set_attr "type" "mulww_d") | ||
12671 | + (set_attr "length" "4") | ||
12672 | + (set_attr "cc" "none")]) | ||
12673 | + | ||
12674 | +(define_insn "umulsidi3" | ||
12675 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
12676 | + (mult:DI | ||
12677 | + (zero_extend:DI (match_operand:SI 1 "register_operand" "%r")) | ||
12678 | + (zero_extend:DI (match_operand:SI 2 "register_operand" "r"))))] | ||
12679 | + "" | ||
12680 | + "mulu.d %0, %1, %2" | ||
12681 | + [(set_attr "type" "mulww_d") | ||
12682 | + (set_attr "length" "4") | ||
12683 | + (set_attr "cc" "none")]) | ||
12684 | + | ||
12685 | +(define_insn "*mulaccsi3" | ||
12686 | + [(set (match_operand:SI 0 "register_operand" "+r") | ||
12687 | + (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "%r") | ||
12688 | + (match_operand:SI 2 "register_operand" "r")) | ||
12689 | + (match_dup 0)))] | ||
12690 | + "" | ||
12691 | + "mac %0, %1, %2" | ||
12692 | + [(set_attr "type" "macww_w") | ||
12693 | + (set_attr "length" "4") | ||
12694 | + (set_attr "cc" "none")]) | ||
12695 | + | ||
12696 | +(define_insn "mulaccsidi3" | ||
12697 | + [(set (match_operand:DI 0 "register_operand" "+r") | ||
12698 | + (plus:DI (mult:DI | ||
12699 | + (sign_extend:DI (match_operand:SI 1 "register_operand" "%r")) | ||
12700 | + (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))) | ||
12701 | + (match_dup 0)))] | ||
12702 | + "" | ||
12703 | + "macs.d %0, %1, %2" | ||
12704 | + [(set_attr "type" "macww_d") | ||
12705 | + (set_attr "length" "4") | ||
12706 | + (set_attr "cc" "none")]) | ||
12707 | + | ||
12708 | +(define_insn "umulaccsidi3" | ||
12709 | + [(set (match_operand:DI 0 "register_operand" "+r") | ||
12710 | + (plus:DI (mult:DI | ||
12711 | + (zero_extend:DI (match_operand:SI 1 "register_operand" "%r")) | ||
12712 | + (zero_extend:DI (match_operand:SI 2 "register_operand" "r"))) | ||
12713 | + (match_dup 0)))] | ||
12714 | + "" | ||
12715 | + "macu.d %0, %1, %2" | ||
12716 | + [(set_attr "type" "macww_d") | ||
12717 | + (set_attr "length" "4") | ||
12718 | + (set_attr "cc" "none")]) | ||
12719 | + | ||
12720 | + | ||
12721 | + | ||
12722 | +;; Try to avoid Write-After-Write hazards for mul operations | ||
12723 | +;; if it can be done | ||
12724 | +(define_peephole2 | ||
12725 | + [(set (match_operand:SI 0 "register_operand" "") | ||
12726 | + (mult:SI | ||
12727 | + (sign_extend:SI (match_operand 1 "general_operand" "")) | ||
12728 | + (sign_extend:SI (match_operand 2 "general_operand" "")))) | ||
12729 | + (set (match_dup 0) | ||
12730 | + (match_operator:SI 3 "alu_operator" [(match_dup 0) | ||
12731 | + (match_operand 4 "general_operand" "")]))] | ||
12732 | + "peep2_reg_dead_p(1, operands[2])" | ||
12733 | + [(set (match_dup 5) | ||
12734 | + (mult:SI | ||
12735 | + (sign_extend:SI (match_dup 1)) | ||
12736 | + (sign_extend:SI (match_dup 2)))) | ||
12737 | + (set (match_dup 0) | ||
12738 | + (match_op_dup 3 [(match_dup 5) | ||
12739 | + (match_dup 4)]))] | ||
12740 | + "{operands[5] = gen_rtx_REG(SImode, REGNO(operands[2]));}" | ||
12741 | + ) | ||
12742 | + | ||
12743 | + | ||
12744 | + | ||
12745 | +;;============================================================================= | ||
12746 | +;; DSP instructions | ||
12747 | +;;============================================================================= | ||
12748 | +(define_insn "mulsathh_h" | ||
12749 | + [(set (match_operand:HI 0 "register_operand" "=r") | ||
12750 | + (ss_truncate:HI (ashiftrt:SI (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%r")) | ||
12751 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))) | ||
12752 | + (const_int 15))))] | ||
12753 | + "TARGET_DSP" | ||
12754 | + "mulsathh.h\t%0, %1:b, %2:b" | ||
12755 | + [(set_attr "length" "4") | ||
12756 | + (set_attr "cc" "none") | ||
12757 | + (set_attr "type" "mulhh")]) | ||
12758 | + | ||
12759 | +(define_insn "mulsatrndhh_h" | ||
12760 | + [(set (match_operand:HI 0 "register_operand" "=r") | ||
12761 | + (ss_truncate:HI (ashiftrt:SI | ||
12762 | + (plus:SI (mult:SI (sign_extend:SI (match_operand:HI 1 "register_operand" "%r")) | ||
12763 | + (sign_extend:SI (match_operand:HI 2 "register_operand" "r"))) | ||
12764 | + (const_int 1073741824)) | ||
12765 | + (const_int 15))))] | ||
12766 | + "TARGET_DSP" | ||
12767 | + "mulsatrndhh.h\t%0, %1:b, %2:b" | ||
12768 | + [(set_attr "length" "4") | ||
12769 | + (set_attr "cc" "none") | ||
12770 | + (set_attr "type" "mulhh")]) | ||
12771 | + | ||
12772 | +(define_insn "mulsathh_w" | ||
12773 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12774 | + (ss_truncate:SI (ashift:DI (mult:DI (sign_extend:DI (match_operand:HI 1 "register_operand" "%r")) | ||
12775 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12776 | + (const_int 1))))] | ||
12777 | + "TARGET_DSP" | ||
12778 | + "mulsathh.w\t%0, %1:b, %2:b" | ||
12779 | + [(set_attr "length" "4") | ||
12780 | + (set_attr "cc" "none") | ||
12781 | + (set_attr "type" "mulhh")]) | ||
12782 | + | ||
12783 | +(define_insn "mulsatwh_w" | ||
12784 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12785 | + (ss_truncate:SI (ashiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r")) | ||
12786 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12787 | + (const_int 15))))] | ||
12788 | + "TARGET_DSP" | ||
12789 | + "mulsatwh.w\t%0, %1, %2:b" | ||
12790 | + [(set_attr "length" "4") | ||
12791 | + (set_attr "cc" "none") | ||
12792 | + (set_attr "type" "mulwh")]) | ||
12793 | + | ||
12794 | +(define_insn "mulsatrndwh_w" | ||
12795 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12796 | + (ss_truncate:SI (ashiftrt:DI (plus:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r")) | ||
12797 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12798 | + (const_int 1073741824)) | ||
12799 | + (const_int 15))))] | ||
12800 | + "TARGET_DSP" | ||
12801 | + "mulsatrndwh.w\t%0, %1, %2:b" | ||
12802 | + [(set_attr "length" "4") | ||
12803 | + (set_attr "cc" "none") | ||
12804 | + (set_attr "type" "mulwh")]) | ||
12805 | + | ||
12806 | +(define_insn "macsathh_w" | ||
12807 | + [(set (match_operand:SI 0 "register_operand" "+r") | ||
12808 | + (plus:SI (match_dup 0) | ||
12809 | + (ss_truncate:SI (ashift:DI (mult:DI (sign_extend:DI (match_operand:HI 1 "register_operand" "%r")) | ||
12810 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12811 | + (const_int 1)))))] | ||
12812 | + "TARGET_DSP" | ||
12813 | + "macsathh.w\t%0, %1:b, %2:b" | ||
12814 | + [(set_attr "length" "4") | ||
12815 | + (set_attr "cc" "none") | ||
12816 | + (set_attr "type" "mulhh")]) | ||
12817 | + | ||
12818 | + | ||
12819 | +(define_insn "mulwh_d" | ||
12820 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
12821 | + (ashift:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r")) | ||
12822 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12823 | + (const_int 16)))] | ||
12824 | + "TARGET_DSP" | ||
12825 | + "mulwh.d\t%0, %1, %2:b" | ||
12826 | + [(set_attr "length" "4") | ||
12827 | + (set_attr "cc" "none") | ||
12828 | + (set_attr "type" "mulwh")]) | ||
12829 | + | ||
12830 | + | ||
12831 | +(define_insn "mulnwh_d" | ||
12832 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
12833 | + (ashift:DI (mult:DI (not:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r"))) | ||
12834 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12835 | + (const_int 16)))] | ||
12836 | + "TARGET_DSP" | ||
12837 | + "mulnwh.d\t%0, %1, %2:b" | ||
12838 | + [(set_attr "length" "4") | ||
12839 | + (set_attr "cc" "none") | ||
12840 | + (set_attr "type" "mulwh")]) | ||
12841 | + | ||
12842 | +(define_insn "macwh_d" | ||
12843 | + [(set (match_operand:DI 0 "register_operand" "+r") | ||
12844 | + (plus:DI (match_dup 0) | ||
12845 | + (ashift:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%r")) | ||
12846 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r"))) | ||
12847 | + (const_int 16))))] | ||
12848 | + "TARGET_DSP" | ||
12849 | + "macwh.d\t%0, %1, %2:b" | ||
12850 | + [(set_attr "length" "4") | ||
12851 | + (set_attr "cc" "none") | ||
12852 | + (set_attr "type" "mulwh")]) | ||
12853 | + | ||
12854 | +(define_insn "machh_d" | ||
12855 | + [(set (match_operand:DI 0 "register_operand" "+r") | ||
12856 | + (plus:DI (match_dup 0) | ||
12857 | + (mult:DI (sign_extend:DI (match_operand:HI 1 "register_operand" "%r")) | ||
12858 | + (sign_extend:DI (match_operand:HI 2 "register_operand" "r")))))] | ||
12859 | + "TARGET_DSP" | ||
12860 | + "machh.d\t%0, %1:b, %2:b" | ||
12861 | + [(set_attr "length" "4") | ||
12862 | + (set_attr "cc" "none") | ||
12863 | + (set_attr "type" "mulwh")]) | ||
12864 | + | ||
12865 | +(define_insn "satadd_w" | ||
12866 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12867 | + (ss_plus:SI (match_operand:SI 1 "register_operand" "r") | ||
12868 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12869 | + "TARGET_DSP" | ||
12870 | + "satadd.w\t%0, %1, %2" | ||
12871 | + [(set_attr "length" "4") | ||
12872 | + (set_attr "cc" "none") | ||
12873 | + (set_attr "type" "alu_sat")]) | ||
12874 | + | ||
12875 | +(define_insn "satsub_w" | ||
12876 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12877 | + (ss_minus:SI (match_operand:SI 1 "register_operand" "r") | ||
12878 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12879 | + "TARGET_DSP" | ||
12880 | + "satsub.w\t%0, %1, %2" | ||
12881 | + [(set_attr "length" "4") | ||
12882 | + (set_attr "cc" "none") | ||
12883 | + (set_attr "type" "alu_sat")]) | ||
12884 | + | ||
12885 | +(define_insn "satadd_h" | ||
12886 | + [(set (match_operand:HI 0 "register_operand" "=r") | ||
12887 | + (ss_plus:HI (match_operand:HI 1 "register_operand" "r") | ||
12888 | + (match_operand:HI 2 "register_operand" "r")))] | ||
12889 | + "TARGET_DSP" | ||
12890 | + "satadd.h\t%0, %1, %2" | ||
12891 | + [(set_attr "length" "4") | ||
12892 | + (set_attr "cc" "none") | ||
12893 | + (set_attr "type" "alu_sat")]) | ||
12894 | + | ||
12895 | +(define_insn "satsub_h" | ||
12896 | + [(set (match_operand:HI 0 "register_operand" "=r") | ||
12897 | + (ss_minus:HI (match_operand:HI 1 "register_operand" "r") | ||
12898 | + (match_operand:HI 2 "register_operand" "r")))] | ||
12899 | + "TARGET_DSP" | ||
12900 | + "satsub.h\t%0, %1, %2" | ||
12901 | + [(set_attr "length" "4") | ||
12902 | + (set_attr "cc" "none") | ||
12903 | + (set_attr "type" "alu_sat")]) | ||
12904 | + | ||
12905 | + | ||
12906 | +;;============================================================================= | ||
12907 | +;; smin | ||
12908 | +;;----------------------------------------------------------------------------- | ||
12909 | +;; Set reg0 to the smallest value of reg1 and reg2. It is used for signed | ||
12910 | +;; values in the registers. | ||
12911 | +;;============================================================================= | ||
12912 | +(define_insn "sminsi3" | ||
12913 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12914 | + (smin:SI (match_operand:SI 1 "register_operand" "r") | ||
12915 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12916 | + "" | ||
12917 | + "min %0, %1, %2" | ||
12918 | + [(set_attr "length" "4") | ||
12919 | + (set_attr "cc" "none")]) | ||
12920 | + | ||
12921 | +;;============================================================================= | ||
12922 | +;; smax | ||
12923 | +;;----------------------------------------------------------------------------- | ||
12924 | +;; Set reg0 to the largest value of reg1 and reg2. It is used for signed | ||
12925 | +;; values in the registers. | ||
12926 | +;;============================================================================= | ||
12927 | +(define_insn "smaxsi3" | ||
12928 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12929 | + (smax:SI (match_operand:SI 1 "register_operand" "r") | ||
12930 | + (match_operand:SI 2 "register_operand" "r")))] | ||
12931 | + "" | ||
12932 | + "max %0, %1, %2" | ||
12933 | + [(set_attr "length" "4") | ||
12934 | + (set_attr "cc" "none")]) | ||
12935 | + | ||
12936 | + | ||
12937 | +;;============================================================================= | ||
12938 | +;; Logical operations | ||
12939 | +;;----------------------------------------------------------------------------- | ||
12940 | + | ||
12941 | +;; Split up simple DImode logical operations. Simply perform the logical | ||
12942 | +;; operation on the upper and lower halves of the registers. | ||
12943 | +(define_split | ||
12944 | + [(set (match_operand:DI 0 "register_operand" "") | ||
12945 | + (match_operator:DI 6 "logical_binary_operator" | ||
12946 | + [(match_operand:DI 1 "register_operand" "") | ||
12947 | + (match_operand:DI 2 "register_operand" "")]))] | ||
12948 | + "reload_completed" | ||
12949 | + [(set (match_dup 0) (match_op_dup:SI 6 [(match_dup 1) (match_dup 2)])) | ||
12950 | + (set (match_dup 3) (match_op_dup:SI 6 [(match_dup 4) (match_dup 5)]))] | ||
12951 | + " | ||
12952 | + { | ||
12953 | + operands[3] = gen_highpart (SImode, operands[0]); | ||
12954 | + operands[0] = gen_lowpart (SImode, operands[0]); | ||
12955 | + operands[4] = gen_highpart (SImode, operands[1]); | ||
12956 | + operands[1] = gen_lowpart (SImode, operands[1]); | ||
12957 | + operands[5] = gen_highpart (SImode, operands[2]); | ||
12958 | + operands[2] = gen_lowpart (SImode, operands[2]); | ||
12959 | + }" | ||
12960 | +) | ||
12961 | + | ||
12962 | +;;============================================================================= | ||
12963 | +;; Logical operations with shifted operand | ||
12964 | +;;============================================================================= | ||
12965 | +(define_insn "<code>si_lshift" | ||
12966 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
12967 | + (logical:SI (match_operator:SI 4 "logical_shift_operator" | ||
12968 | + [(match_operand:SI 2 "register_operand" "r") | ||
12969 | + (match_operand:SI 3 "immediate_operand" "Ku05")]) | ||
12970 | + (match_operand:SI 1 "register_operand" "r")))] | ||
12971 | + "" | ||
12972 | + { | ||
12973 | + if ( GET_CODE(operands[4]) == ASHIFT ) | ||
12974 | + return "<logical_insn>\t%0, %1, %2 << %3"; | ||
12975 | + else | ||
12976 | + return "<logical_insn>\t%0, %1, %2 >> %3"; | ||
12977 | + } | ||
12978 | + | ||
12979 | + [(set_attr "cc" "set_z")] | ||
12980 | +) | ||
12981 | + | ||
12982 | + | ||
12983 | +;;************************************************ | ||
12984 | +;; Peepholes for detecting logical operantions | ||
12985 | +;; with shifted operands | ||
12986 | +;;************************************************ | ||
12987 | + | ||
12988 | +(define_peephole | ||
12989 | + [(set (match_operand:SI 3 "register_operand" "") | ||
12990 | + (match_operator:SI 5 "logical_shift_operator" | ||
12991 | + [(match_operand:SI 1 "register_operand" "") | ||
12992 | + (match_operand:SI 2 "immediate_operand" "")])) | ||
12993 | + (set (match_operand:SI 0 "register_operand" "") | ||
12994 | + (logical:SI (match_operand:SI 4 "register_operand" "") | ||
12995 | + (match_dup 3)))] | ||
12996 | + "(dead_or_set_p(insn, operands[3])) || (REGNO(operands[3]) == REGNO(operands[0]))" | ||
12997 | + { | ||
12998 | + if ( GET_CODE(operands[5]) == ASHIFT ) | ||
12999 | + return "<logical_insn>\t%0, %4, %1 << %2"; | ||
13000 | + else | ||
13001 | + return "<logical_insn>\t%0, %4, %1 >> %2"; | ||
13002 | + } | ||
13003 | + [(set_attr "cc" "set_z")] | ||
13004 | + ) | ||
13005 | + | ||
13006 | +(define_peephole | ||
13007 | + [(set (match_operand:SI 3 "register_operand" "") | ||
13008 | + (match_operator:SI 5 "logical_shift_operator" | ||
13009 | + [(match_operand:SI 1 "register_operand" "") | ||
13010 | + (match_operand:SI 2 "immediate_operand" "")])) | ||
13011 | + (set (match_operand:SI 0 "register_operand" "") | ||
13012 | + (logical:SI (match_dup 3) | ||
13013 | + (match_operand:SI 4 "register_operand" "")))] | ||
13014 | + "(dead_or_set_p(insn, operands[3])) || (REGNO(operands[3]) == REGNO(operands[0]))" | ||
13015 | + { | ||
13016 | + if ( GET_CODE(operands[5]) == ASHIFT ) | ||
13017 | + return "<logical_insn>\t%0, %4, %1 << %2"; | ||
13018 | + else | ||
13019 | + return "<logical_insn>\t%0, %4, %1 >> %2"; | ||
13020 | + } | ||
13021 | + [(set_attr "cc" "set_z")] | ||
13022 | + ) | ||
13023 | + | ||
13024 | + | ||
13025 | +(define_peephole2 | ||
13026 | + [(set (match_operand:SI 0 "register_operand" "") | ||
13027 | + (match_operator:SI 5 "logical_shift_operator" | ||
13028 | + [(match_operand:SI 1 "register_operand" "") | ||
13029 | + (match_operand:SI 2 "immediate_operand" "")])) | ||
13030 | + (set (match_operand:SI 3 "register_operand" "") | ||
13031 | + (logical:SI (match_operand:SI 4 "register_operand" "") | ||
13032 | + (match_dup 0)))] | ||
13033 | + "(peep2_reg_dead_p(2, operands[0])) || (REGNO(operands[3]) == REGNO(operands[0]))" | ||
13034 | + | ||
13035 | + [(set (match_dup 3) | ||
13036 | + (logical:SI (match_op_dup:SI 5 [(match_dup 1) (match_dup 2)]) | ||
13037 | + (match_dup 4)))] | ||
13038 | + | ||
13039 | + "" | ||
13040 | +) | ||
13041 | + | ||
13042 | +(define_peephole2 | ||
13043 | + [(set (match_operand:SI 0 "register_operand" "") | ||
13044 | + (match_operator:SI 5 "logical_shift_operator" | ||
13045 | + [(match_operand:SI 1 "register_operand" "") | ||
13046 | + (match_operand:SI 2 "immediate_operand" "")])) | ||
13047 | + (set (match_operand:SI 3 "register_operand" "") | ||
13048 | + (logical:SI (match_dup 0) | ||
13049 | + (match_operand:SI 4 "register_operand" "")))] | ||
13050 | + "(peep2_reg_dead_p(2, operands[0])) || (REGNO(operands[3]) == REGNO(operands[0]))" | ||
13051 | + | ||
13052 | + [(set (match_dup 3) | ||
13053 | + (logical:SI (match_op_dup:SI 5 [(match_dup 1) (match_dup 2)]) | ||
13054 | + (match_dup 4)))] | ||
13055 | + | ||
13056 | + "" | ||
13057 | +) | ||
13058 | + | ||
13059 | + | ||
13060 | +;;============================================================================= | ||
13061 | +;; and | ||
13062 | +;;----------------------------------------------------------------------------- | ||
13063 | +;; Store the result after a bitwise logical-and between reg0 and reg2 in reg0. | ||
13064 | +;;============================================================================= | ||
13065 | + | ||
13066 | +(define_insn "andnsi" | ||
13067 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13068 | + (and:SI (match_operand:SI 1 "register_operand" "0") | ||
13069 | + (not:SI (match_operand:SI 2 "register_operand" "r"))))] | ||
13070 | + "" | ||
13071 | + "andn %0, %2" | ||
13072 | + [(set_attr "cc" "set_z") | ||
13073 | + (set_attr "length" "2")] | ||
13074 | +) | ||
13075 | + | ||
13076 | + | ||
13077 | + | ||
13078 | + | ||
13079 | +(define_insn "andsi3" | ||
13080 | + [(set (match_operand:SI 0 "register_operand" "=r, r, r, r") | ||
13081 | + (and:SI (match_operand:SI 1 "register_operand" "%0, r, 0, r") | ||
13082 | + (match_operand:SI 2 "nonmemory_operand" "r, M, i, r")))] | ||
13083 | + "" | ||
13084 | + { | ||
13085 | + switch (which_alternative){ | ||
13086 | + case 0: | ||
13087 | + return "and\t%0, %2"; | ||
13088 | + case 1: | ||
13089 | + { | ||
13090 | + int i, first_set = -1; | ||
13091 | + /* Search for first bit set in mask */ | ||
13092 | + for ( i = 31; i >= 0; --i ) | ||
13093 | + if ( INTVAL(operands[2]) & (1 << i) ){ | ||
13094 | + first_set = i; | ||
13095 | + break; | ||
13096 | + } | ||
13097 | + operands[2] = gen_rtx_CONST_INT(SImode, first_set + 1); | ||
13098 | + return "bfextu\t%0, %1, 0, %2"; | ||
13099 | + } | ||
13100 | + case 2: | ||
13101 | + if ( one_bit_cleared_operand(operands[2], VOIDmode) ){ | ||
13102 | + int bitpos; | ||
13103 | + for ( bitpos = 0; bitpos < 32; bitpos++ ) | ||
13104 | + if ( !(INTVAL(operands[2]) & (1 << bitpos)) ) | ||
13105 | + break; | ||
13106 | + operands[2] = gen_rtx_CONST_INT(SImode, bitpos); | ||
13107 | + return "cbr\t%0, %2"; | ||
13108 | + } else if ( (INTVAL(operands[2]) >= 0) && | ||
13109 | + (INTVAL(operands[2]) <= 65535) ) | ||
13110 | + return "andl\t%0, %2, COH"; | ||
13111 | + else if ( (INTVAL(operands[2]) < 0) && | ||
13112 | + (INTVAL(operands[2]) >= -65536 ) ) | ||
13113 | + return "andl\t%0, lo(%2)"; | ||
13114 | + else if ( ((INTVAL(operands[2]) & 0xffff) == 0xffff) ) | ||
13115 | + return "andh\t%0, hi(%2)"; | ||
13116 | + else if ( ((INTVAL(operands[2]) & 0xffff) == 0x0) ) | ||
13117 | + return "andh\t%0, hi(%2), COH"; | ||
13118 | + else | ||
13119 | + return "andh\t%0, hi(%2)\;andl\t%0, lo(%2)"; | ||
13120 | + case 3: | ||
13121 | + return "and\t%0, %1, %2"; | ||
13122 | + default: | ||
13123 | + abort(); | ||
13124 | + } | ||
13125 | + } | ||
13126 | + | ||
13127 | + [(set_attr "length" "2,4,8,4") | ||
13128 | + (set_attr "cc" "set_z")]) | ||
13129 | + | ||
13130 | + | ||
13131 | +(define_insn "anddi3" | ||
13132 | + [(set (match_operand:DI 0 "register_operand" "=&r,&r") | ||
13133 | + (and:DI (match_operand:DI 1 "register_operand" "%0,r") | ||
13134 | + (match_operand:DI 2 "register_operand" "r,r")))] | ||
13135 | + "" | ||
13136 | + "#" | ||
13137 | + [(set_attr "length" "8") | ||
13138 | + (set_attr "cc" "clobber")] | ||
13139 | +) | ||
13140 | + | ||
13141 | +;;============================================================================= | ||
13142 | +;; or | ||
13143 | +;;----------------------------------------------------------------------------- | ||
13144 | +;; Store the result after a bitwise inclusive-or between reg0 and reg2 in reg0. | ||
13145 | +;;============================================================================= | ||
13146 | + | ||
13147 | +(define_insn "iorsi3" | ||
13148 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
13149 | + (ior:SI (match_operand:SI 1 "register_operand" "%0,0,r" ) | ||
13150 | + (match_operand:SI 2 "nonmemory_operand" "r ,i,r")))] | ||
13151 | + "" | ||
13152 | + { | ||
13153 | + switch (which_alternative){ | ||
13154 | + case 0: | ||
13155 | + return "or\t%0, %2"; | ||
13156 | + case 1: | ||
13157 | + if ( one_bit_set_operand(operands[2], VOIDmode) ){ | ||
13158 | + int bitpos; | ||
13159 | + for (bitpos = 0; bitpos < 32; bitpos++) | ||
13160 | + if (INTVAL(operands[2]) & (1 << bitpos)) | ||
13161 | + break; | ||
13162 | + operands[2] = gen_rtx_CONST_INT( SImode, bitpos); | ||
13163 | + return "sbr\t%0, %2"; | ||
13164 | + } else if ( (INTVAL(operands[2]) >= 0) && | ||
13165 | + (INTVAL(operands[2]) <= 65535) ) | ||
13166 | + return "orl\t%0, %2"; | ||
13167 | + else if ( ((INTVAL(operands[2]) & 0xffff) == 0x0) ) | ||
13168 | + return "orh\t%0, hi(%2)"; | ||
13169 | + else | ||
13170 | + return "orh\t%0, hi(%2)\;orl\t%0, lo(%2)"; | ||
13171 | + case 2: | ||
13172 | + return "or\t%0, %1, %2"; | ||
13173 | + default: | ||
13174 | + abort(); | ||
13175 | + } | ||
13176 | + } | ||
13177 | + [(set_attr "length" "2,8,4") | ||
13178 | + (set_attr "cc" "set_z")]) | ||
13179 | + | ||
13180 | + | ||
13181 | +;(define_insn "iorsi3" | ||
13182 | +; [(set (match_operand:SI 0 "register_operand" "=r, r, r") | ||
13183 | +; (ior:SI (match_operand:SI 1 "avr32_logical_insn_operand" "r, r, rA" ) | ||
13184 | +; (match_operand:SI 2 "register_operand" "0, i, r")))] | ||
13185 | +; "" | ||
13186 | +; { | ||
13187 | +; switch (which_alternative){ | ||
13188 | +; case 0: | ||
13189 | +; return "or %0, %2"; | ||
13190 | +; case 1: | ||
13191 | +; if ( one_bit_set_operand(operands[2], VOIDmode) ){ | ||
13192 | +; int i, bitpos; | ||
13193 | +; for ( i = 0; i < 32; i++ ) | ||
13194 | +; if ( INTVAL(operands[2]) & (1 << i) ){ | ||
13195 | +; bitpos = i; | ||
13196 | +; break; | ||
13197 | +; } | ||
13198 | +; operands[2] = gen_rtx_CONST_INT( SImode, bitpos); | ||
13199 | +; return "sbr %0, %2"; | ||
13200 | +; } else if ( (INTVAL(operands[2]) >= 0) && | ||
13201 | +; (INTVAL(operands[2]) <= 65535) ) | ||
13202 | +; return "orl %0, %2"; | ||
13203 | +; else if ( ((INTVAL(operands[2]) & 0xffff) == 0x0) ) | ||
13204 | +; return "orh %0, hi(%2)"; | ||
13205 | +; else | ||
13206 | +; return "orh %0, hi(%2)\;orl %0, lo(%2)"; | ||
13207 | +; case 2: | ||
13208 | +; return "or %0, %2, %1"; | ||
13209 | +; } | ||
13210 | +; } | ||
13211 | +; [(set_attr "length" "2,8,4") | ||
13212 | +; (set_attr "cc" "set_z")]) | ||
13213 | + | ||
13214 | +(define_insn "iordi3" | ||
13215 | + [(set (match_operand:DI 0 "register_operand" "=&r,&r") | ||
13216 | + (ior:DI (match_operand:DI 1 "register_operand" "%0,r") | ||
13217 | + (match_operand:DI 2 "register_operand" "r,r")))] | ||
13218 | + "" | ||
13219 | + "#" | ||
13220 | + [(set_attr "length" "8") | ||
13221 | + (set_attr "cc" "clobber")] | ||
13222 | +) | ||
13223 | + | ||
13224 | +;;============================================================================= | ||
13225 | +;; xor bytes | ||
13226 | +;;----------------------------------------------------------------------------- | ||
13227 | +;; Store the result after a bitwise exclusive-or between reg0 and reg2 in reg0. | ||
13228 | +;;============================================================================= | ||
13229 | + | ||
13230 | +(define_insn "xorsi3" | ||
13231 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
13232 | + (xor:SI (match_operand:SI 1 "register_operand" "0,0,r") | ||
13233 | + (match_operand:SI 2 "nonmemory_operand" "r,i,r")))] | ||
13234 | + "" | ||
13235 | + { | ||
13236 | + switch (which_alternative){ | ||
13237 | + case 0: | ||
13238 | + return "eor %0, %2"; | ||
13239 | + case 1: | ||
13240 | + if ( (INTVAL(operands[2]) >= 0) && | ||
13241 | + (INTVAL(operands[2]) <= 65535) ) | ||
13242 | + return "eorl %0, %2"; | ||
13243 | + else if ( ((INTVAL(operands[2]) & 0xffff) == 0x0) ) | ||
13244 | + return "eorh %0, hi(%2)"; | ||
13245 | + else | ||
13246 | + return "eorh %0, hi(%2)\;eorl %0, lo(%2)"; | ||
13247 | + case 2: | ||
13248 | + return "eor %0, %1, %2"; | ||
13249 | + default: | ||
13250 | + abort(); | ||
13251 | + } | ||
13252 | + } | ||
13253 | + | ||
13254 | + [(set_attr "length" "2,8,4") | ||
13255 | + (set_attr "cc" "set_z")]) | ||
13256 | + | ||
13257 | +(define_insn "xordi3" | ||
13258 | + [(set (match_operand:DI 0 "register_operand" "=&r,&r") | ||
13259 | + (xor:DI (match_operand:DI 1 "register_operand" "%0,r") | ||
13260 | + (match_operand:DI 2 "register_operand" "r,r")))] | ||
13261 | + "" | ||
13262 | + "#" | ||
13263 | + [(set_attr "length" "8") | ||
13264 | + (set_attr "cc" "clobber")] | ||
13265 | +) | ||
13266 | + | ||
13267 | +;;============================================================================= | ||
13268 | +;; divmod | ||
13269 | +;;----------------------------------------------------------------------------- | ||
13270 | +;; Signed division that produces both a quotient and a remainder. | ||
13271 | +;;============================================================================= | ||
13272 | +(define_expand "divmodsi4" | ||
13273 | + [(parallel [ | ||
13274 | + (parallel [ | ||
13275 | + (set (match_operand:SI 0 "register_operand" "=r") | ||
13276 | + (div:SI (match_operand:SI 1 "register_operand" "r") | ||
13277 | + (match_operand:SI 2 "register_operand" "r"))) | ||
13278 | + (set (match_operand:SI 3 "register_operand" "=r") | ||
13279 | + (mod:SI (match_dup 1) | ||
13280 | + (match_dup 2)))]) | ||
13281 | + (use (match_dup 4))])] | ||
13282 | + "" | ||
13283 | + { | ||
13284 | + if (! no_new_pseudos) { | ||
13285 | + operands[4] = gen_reg_rtx (DImode); | ||
13286 | + | ||
13287 | + emit_insn(gen_divmodsi4_internal(operands[4],operands[1],operands[2])); | ||
13288 | + emit_move_insn(operands[0], gen_rtx_SUBREG( SImode, operands[4], 4)); | ||
13289 | + emit_move_insn(operands[3], gen_rtx_SUBREG( SImode, operands[4], 0)); | ||
13290 | + | ||
13291 | + DONE; | ||
13292 | + } else { | ||
13293 | + FAIL; | ||
13294 | + } | ||
13295 | + | ||
13296 | + }) | ||
13297 | + | ||
13298 | + | ||
13299 | +(define_insn "divmodsi4_internal" | ||
13300 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
13301 | + (unspec:DI [(match_operand:SI 1 "register_operand" "r") | ||
13302 | + (match_operand:SI 2 "register_operand" "r")] | ||
13303 | + UNSPEC_DIVMODSI4_INTERNAL))] | ||
13304 | + "" | ||
13305 | + "divs %0, %1, %2" | ||
13306 | + [(set_attr "type" "div") | ||
13307 | + (set_attr "cc" "none")]) | ||
13308 | + | ||
13309 | + | ||
13310 | +;;============================================================================= | ||
13311 | +;; udivmod | ||
13312 | +;;----------------------------------------------------------------------------- | ||
13313 | +;; Unsigned division that produces both a quotient and a remainder. | ||
13314 | +;;============================================================================= | ||
13315 | +(define_expand "udivmodsi4" | ||
13316 | + [(parallel [ | ||
13317 | + (parallel [ | ||
13318 | + (set (match_operand:SI 0 "register_operand" "=r") | ||
13319 | + (udiv:SI (match_operand:SI 1 "register_operand" "r") | ||
13320 | + (match_operand:SI 2 "register_operand" "r"))) | ||
13321 | + (set (match_operand:SI 3 "register_operand" "=r") | ||
13322 | + (umod:SI (match_dup 1) | ||
13323 | + (match_dup 2)))]) | ||
13324 | + (use (match_dup 4))])] | ||
13325 | + "" | ||
13326 | + { | ||
13327 | + if (! no_new_pseudos) { | ||
13328 | + operands[4] = gen_reg_rtx (DImode); | ||
13329 | + | ||
13330 | + emit_insn(gen_udivmodsi4_internal(operands[4],operands[1],operands[2])); | ||
13331 | + emit_move_insn(operands[0], gen_rtx_SUBREG( SImode, operands[4], 4)); | ||
13332 | + emit_move_insn(operands[3], gen_rtx_SUBREG( SImode, operands[4], 0)); | ||
13333 | + | ||
13334 | + DONE; | ||
13335 | + } else { | ||
13336 | + FAIL; | ||
13337 | + } | ||
13338 | + }) | ||
13339 | + | ||
13340 | +(define_insn "udivmodsi4_internal" | ||
13341 | + [(set (match_operand:DI 0 "register_operand" "=r") | ||
13342 | + (unspec:DI [(match_operand:SI 1 "register_operand" "r") | ||
13343 | + (match_operand:SI 2 "register_operand" "r")] | ||
13344 | + UNSPEC_UDIVMODSI4_INTERNAL))] | ||
13345 | + "" | ||
13346 | + "divu %0, %1, %2" | ||
13347 | + [(set_attr "type" "div") | ||
13348 | + (set_attr "cc" "none")]) | ||
13349 | + | ||
13350 | + | ||
13351 | +;;============================================================================= | ||
13352 | +;; Arithmetic-shift left | ||
13353 | +;;----------------------------------------------------------------------------- | ||
13354 | +;; Arithmetic-shift reg0 left by reg2 or immediate value. | ||
13355 | +;;============================================================================= | ||
13356 | + | ||
13357 | +(define_insn "ashlsi3" | ||
13358 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
13359 | + (ashift:SI (match_operand:SI 1 "register_operand" "r,0,r") | ||
13360 | + (match_operand:SI 2 "nonmemory_operand" "r,Ku05,Ku05")))] | ||
13361 | + "" | ||
13362 | + "@ | ||
13363 | + lsl %0, %1, %2 | ||
13364 | + lsl %0, %2 | ||
13365 | + lsl %0, %1, %2" | ||
13366 | + [(set_attr "length" "4,2,4") | ||
13367 | + (set_attr "cc" "set_ncz")]) | ||
13368 | + | ||
13369 | +;;============================================================================= | ||
13370 | +;; Arithmetic-shift right | ||
13371 | +;;----------------------------------------------------------------------------- | ||
13372 | +;; Arithmetic-shift reg0 right by an immediate value. | ||
13373 | +;;============================================================================= | ||
13374 | + | ||
13375 | +(define_insn "ashrsi3" | ||
13376 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
13377 | + (ashiftrt:SI (match_operand:SI 1 "register_operand" "r,0,r") | ||
13378 | + (match_operand:SI 2 "nonmemory_operand" "r,Ku05,Ku05")))] | ||
13379 | + "" | ||
13380 | + "@ | ||
13381 | + asr %0, %1, %2 | ||
13382 | + asr %0, %2 | ||
13383 | + asr %0, %1, %2" | ||
13384 | + [(set_attr "length" "4,2,4") | ||
13385 | + (set_attr "cc" "set_ncz")]) | ||
13386 | + | ||
13387 | +;;============================================================================= | ||
13388 | +;; Logical shift right | ||
13389 | +;;----------------------------------------------------------------------------- | ||
13390 | +;; Logical shift reg0 right by an immediate value. | ||
13391 | +;;============================================================================= | ||
13392 | + | ||
13393 | +(define_insn "lshrsi3" | ||
13394 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r") | ||
13395 | + (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,0,r") | ||
13396 | + (match_operand:SI 2 "nonmemory_operand" "r,Ku05,Ku05")))] | ||
13397 | + "" | ||
13398 | + "@ | ||
13399 | + lsr %0, %1, %2 | ||
13400 | + lsr %0, %2 | ||
13401 | + lsr %0, %1, %2" | ||
13402 | + [(set_attr "length" "4,2,4") | ||
13403 | + (set_attr "cc" "set_ncz")]) | ||
13404 | + | ||
13405 | + | ||
13406 | +;;============================================================================= | ||
13407 | +;; neg | ||
13408 | +;;----------------------------------------------------------------------------- | ||
13409 | +;; Negate operand 1 and store the result in operand 0. | ||
13410 | +;;============================================================================= | ||
13411 | +(define_insn "negsi2" | ||
13412 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13413 | + (neg:SI (match_operand:SI 1 "register_operand" "0")))] | ||
13414 | + "" | ||
13415 | + "neg %0" | ||
13416 | + [(set_attr "length" "2") | ||
13417 | + (set_attr "cc" "set_vncz")]) | ||
13418 | + | ||
13419 | +;;============================================================================= | ||
13420 | +;; abs | ||
13421 | +;;----------------------------------------------------------------------------- | ||
13422 | +;; Store the absolute value of operand 1 into operand 0. | ||
13423 | +;;============================================================================= | ||
13424 | +(define_insn "abssi2" | ||
13425 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13426 | + (abs:SI (match_operand:SI 1 "register_operand" "0")))] | ||
13427 | + "" | ||
13428 | + "abs %0" | ||
13429 | + [(set_attr "length" "2") | ||
13430 | + (set_attr "cc" "set_z")]) | ||
13431 | + | ||
13432 | + | ||
13433 | +;;============================================================================= | ||
13434 | +;; one_cmpl | ||
13435 | +;;----------------------------------------------------------------------------- | ||
13436 | +;; Store the bitwise-complement of operand 1 into operand 0. | ||
13437 | +;;============================================================================= | ||
13438 | + | ||
13439 | +(define_insn "one_cmplsi2" | ||
13440 | + [(set (match_operand:SI 0 "register_operand" "=r,r") | ||
13441 | + (not:SI (match_operand:SI 1 "register_operand" "r,0")))] | ||
13442 | + "" | ||
13443 | + "@ | ||
13444 | + rsub %0, %1, -1 | ||
13445 | + com %0" | ||
13446 | + [(set_attr "length" "4,2") | ||
13447 | + (set_attr "cc" "set_z")]) | ||
13448 | + | ||
13449 | + | ||
13450 | +;;============================================================================= | ||
13451 | +;; Bit load | ||
13452 | +;;----------------------------------------------------------------------------- | ||
13453 | +;; Load a bit into Z and C flags | ||
13454 | +;;============================================================================= | ||
13455 | +(define_insn "bldsi" | ||
13456 | + [(set (cc0) | ||
13457 | + (and:SI (match_operand:SI 0 "register_operand" "r") | ||
13458 | + (match_operand:SI 1 "one_bit_set_operand" "i")))] | ||
13459 | + "" | ||
13460 | + "bld\t%0, %p1" | ||
13461 | + [(set_attr "length" "4") | ||
13462 | + (set_attr "cc" "bld")] | ||
13463 | + ) | ||
13464 | + | ||
13465 | + | ||
13466 | +;;============================================================================= | ||
13467 | +;; Compare | ||
13468 | +;;----------------------------------------------------------------------------- | ||
13469 | +;; Compare reg0 with reg1 or an immediate value. | ||
13470 | +;;============================================================================= | ||
13471 | + | ||
13472 | +(define_expand "cmpqi" | ||
13473 | + [(set (cc0) | ||
13474 | + (compare:QI | ||
13475 | + (match_operand:QI 0 "general_operand" "") | ||
13476 | + (match_operand:QI 1 "general_operand" "")))] | ||
13477 | + "" | ||
13478 | + "{ | ||
13479 | + | ||
13480 | + if ( GET_CODE(operands[0]) != REG | ||
13481 | + && GET_CODE(operands[0]) != SUBREG) | ||
13482 | + operands[0] = force_reg(QImode, operands[0]); | ||
13483 | + | ||
13484 | + | ||
13485 | + if ( GET_CODE(operands[1]) != REG | ||
13486 | + && GET_CODE(operands[1]) != SUBREG ) | ||
13487 | + operands[1] = force_reg(QImode, operands[1]); | ||
13488 | + | ||
13489 | + avr32_compare_op0 = operands[0]; | ||
13490 | + avr32_compare_op1 = operands[1]; | ||
13491 | + emit_insn(gen_cmpqi_internal(operands[0], operands[1])); | ||
13492 | + DONE; | ||
13493 | + }" | ||
13494 | +) | ||
13495 | + | ||
13496 | +(define_insn "cmpqi_internal" | ||
13497 | + [(set (cc0) | ||
13498 | + (compare:QI | ||
13499 | + (match_operand:QI 0 "register_operand" "r") | ||
13500 | + (match_operand:QI 1 "register_operand" "r")))] | ||
13501 | + "" | ||
13502 | + { | ||
13503 | + set_next_insn_cond(insn, | ||
13504 | + avr32_output_cmp(get_next_insn_cond(insn), QImode, operands[0], operands[1])); | ||
13505 | + return ""; | ||
13506 | + } | ||
13507 | + [(set_attr "length" "4") | ||
13508 | + (set_attr "cc" "compare")]) | ||
13509 | + | ||
13510 | +(define_expand "cmphi" | ||
13511 | + [(set (cc0) | ||
13512 | + (compare:HI | ||
13513 | + (match_operand:HI 0 "general_operand" "") | ||
13514 | + (match_operand:HI 1 "general_operand" "")))] | ||
13515 | + "" | ||
13516 | + "{ | ||
13517 | + if ( GET_CODE(operands[0]) != REG | ||
13518 | + && GET_CODE(operands[0]) != SUBREG ) | ||
13519 | + operands[0] = force_reg(HImode, operands[0]); | ||
13520 | + | ||
13521 | + | ||
13522 | + if ( GET_CODE(operands[1]) != REG | ||
13523 | + && GET_CODE(operands[1]) != SUBREG) | ||
13524 | + operands[1] = force_reg(HImode, operands[1]); | ||
13525 | + | ||
13526 | + avr32_compare_op0 = operands[0]; | ||
13527 | + avr32_compare_op1 = operands[1]; | ||
13528 | + emit_insn(gen_cmphi_internal(operands[0], operands[1])); | ||
13529 | + DONE; | ||
13530 | + }" | ||
13531 | +) | ||
13532 | + | ||
13533 | + | ||
13534 | +(define_insn "cmphi_internal" | ||
13535 | + [(set (cc0) | ||
13536 | + (compare:HI | ||
13537 | + (match_operand:HI 0 "register_operand" "r") | ||
13538 | + (match_operand:HI 1 "register_operand" "r")))] | ||
13539 | + "" | ||
13540 | + { | ||
13541 | + set_next_insn_cond(insn, | ||
13542 | + avr32_output_cmp(get_next_insn_cond(insn), HImode, operands[0], operands[1])); | ||
13543 | + return ""; | ||
13544 | + } | ||
13545 | + [(set_attr "length" "4") | ||
13546 | + (set_attr "cc" "compare")]) | ||
13547 | + | ||
13548 | + | ||
13549 | +(define_expand "cmpsi" | ||
13550 | + [(set (cc0) | ||
13551 | + (compare:SI | ||
13552 | + (match_operand:SI 0 "general_operand" "") | ||
13553 | + (match_operand:SI 1 "general_operand" "")))] | ||
13554 | + "" | ||
13555 | + "{ | ||
13556 | + if ( GET_CODE(operands[0]) != REG | ||
13557 | + && GET_CODE(operands[0]) != SUBREG ) | ||
13558 | + operands[0] = force_reg(SImode, operands[0]); | ||
13559 | + | ||
13560 | + if ( GET_CODE(operands[1]) != REG | ||
13561 | + && GET_CODE(operands[1]) != SUBREG | ||
13562 | + && GET_CODE(operands[1]) != CONST_INT ) | ||
13563 | + operands[1] = force_reg(SImode, operands[1]); | ||
13564 | + | ||
13565 | + avr32_compare_op0 = operands[0]; | ||
13566 | + avr32_compare_op1 = operands[1]; | ||
13567 | + | ||
13568 | + | ||
13569 | + emit_insn(gen_cmpsi_internal(operands[0], operands[1])); | ||
13570 | + DONE; | ||
13571 | + }" | ||
13572 | +) | ||
13573 | + | ||
13574 | + | ||
13575 | + | ||
13576 | + | ||
13577 | +(define_insn "cmpsi_internal" | ||
13578 | + [(set (cc0) | ||
13579 | + (compare:SI | ||
13580 | + (match_operand:SI 0 "register_operand" "r, r, r") | ||
13581 | + (match_operand:SI 1 "nonmemory_operand" "r, Ks06, Ks21")))] | ||
13582 | + "" | ||
13583 | + { | ||
13584 | + set_next_insn_cond(insn, | ||
13585 | + avr32_output_cmp(get_next_insn_cond(insn), SImode, operands[0], operands[1])); | ||
13586 | + return ""; | ||
13587 | + } | ||
13588 | + | ||
13589 | + [(set_attr "length" "2,2,4") | ||
13590 | + (set_attr "cc" "compare")]) | ||
13591 | + | ||
13592 | + | ||
13593 | +(define_expand "cmpdi" | ||
13594 | + [(set (cc0) | ||
13595 | + (compare:DI | ||
13596 | + (match_operand:DI 0 "register_operand" "") | ||
13597 | + (match_operand:DI 1 "register_operand" "")))] | ||
13598 | + "" | ||
13599 | + { | ||
13600 | + avr32_compare_op0 = operands[0]; | ||
13601 | + avr32_compare_op1 = operands[1]; | ||
13602 | + emit_insn(gen_cmpdi_internal(operands[0], operands[1])); | ||
13603 | + DONE; | ||
13604 | + } | ||
13605 | +) | ||
13606 | + | ||
13607 | +(define_insn "cmpdi_internal" | ||
13608 | + [(set (cc0) | ||
13609 | + (compare:DI | ||
13610 | + (match_operand:DI 0 "register_operand" "r") | ||
13611 | + (match_operand:DI 1 "register_operand" "r")))] | ||
13612 | + "" | ||
13613 | + { | ||
13614 | + set_next_insn_cond(insn, | ||
13615 | + avr32_output_cmp(get_next_insn_cond(insn), DImode, operands[0], operands[1])); | ||
13616 | + return ""; | ||
13617 | + } | ||
13618 | + | ||
13619 | + [(set_attr "length" "6") | ||
13620 | + (set_attr "type" "alu2") | ||
13621 | + (set_attr "cc" "compare")]) | ||
13622 | + | ||
13623 | + | ||
13624 | + | ||
13625 | +;;============================================================================= | ||
13626 | +;; Test if zero | ||
13627 | +;;----------------------------------------------------------------------------- | ||
13628 | +;; Compare reg against zero and set the condition codes. | ||
13629 | +;;============================================================================= | ||
13630 | + | ||
13631 | + | ||
13632 | +(define_expand "tstsi" | ||
13633 | + [(set (cc0) | ||
13634 | + (match_operand:SI 0 "register_operand" ""))] | ||
13635 | + "" | ||
13636 | + { | ||
13637 | + avr32_compare_op0 = operands[0]; | ||
13638 | + avr32_compare_op1 = gen_rtx_CONST_INT(SImode, 0); | ||
13639 | + emit_insn(gen_tstsi_internal(operands[0])); | ||
13640 | + DONE; | ||
13641 | + } | ||
13642 | +) | ||
13643 | + | ||
13644 | +(define_insn "tstsi_internal" | ||
13645 | + [(set (cc0) | ||
13646 | + (match_operand:SI 0 "register_operand" "r"))] | ||
13647 | + "" | ||
13648 | + { | ||
13649 | + set_next_insn_cond(insn, | ||
13650 | + avr32_output_cmp(get_next_insn_cond(insn), SImode, operands[0], const0_rtx)); | ||
13651 | + | ||
13652 | + return ""; | ||
13653 | + } | ||
13654 | + [(set_attr "length" "2") | ||
13655 | + (set_attr "cc" "compare")]) | ||
13656 | + | ||
13657 | + | ||
13658 | +(define_expand "tstdi" | ||
13659 | + [(set (cc0) | ||
13660 | + (match_operand:DI 0 "register_operand" ""))] | ||
13661 | + "" | ||
13662 | + { | ||
13663 | + avr32_compare_op0 = operands[0]; | ||
13664 | + avr32_compare_op1 = gen_rtx_CONST_INT(DImode, 0); | ||
13665 | + emit_insn(gen_tstdi_internal(operands[0])); | ||
13666 | + DONE; | ||
13667 | + } | ||
13668 | +) | ||
13669 | + | ||
13670 | +(define_insn "tstdi_internal" | ||
13671 | + [(set (cc0) | ||
13672 | + (match_operand:DI 0 "register_operand" "r"))] | ||
13673 | + "" | ||
13674 | + { | ||
13675 | + set_next_insn_cond(insn, | ||
13676 | + avr32_output_cmp(get_next_insn_cond(insn), DImode, operands[0], const0_rtx)); | ||
13677 | + return ""; | ||
13678 | + } | ||
13679 | + [(set_attr "length" "4") | ||
13680 | + (set_attr "type" "alu2") | ||
13681 | + (set_attr "cc" "compare")]) | ||
13682 | + | ||
13683 | + | ||
13684 | + | ||
13685 | +;;============================================================================= | ||
13686 | +;; Convert operands | ||
13687 | +;;----------------------------------------------------------------------------- | ||
13688 | +;; | ||
13689 | +;;============================================================================= | ||
13690 | +(define_insn "truncdisi2" | ||
13691 | + [(set (match_operand:SI 0 "general_operand" "") | ||
13692 | + (truncate:SI (match_operand:DI 1 "general_operand" "")))] | ||
13693 | + "" | ||
13694 | + "truncdisi2") | ||
13695 | + | ||
13696 | +;;============================================================================= | ||
13697 | +;; Extend | ||
13698 | +;;----------------------------------------------------------------------------- | ||
13699 | +;; | ||
13700 | +;;============================================================================= | ||
13701 | + | ||
13702 | + | ||
13703 | +(define_insn "extendhisi2" | ||
13704 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") | ||
13705 | + (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,r,<RKu00>,m")))] | ||
13706 | + "" | ||
13707 | + { | ||
13708 | + switch ( which_alternative ){ | ||
13709 | + case 0: | ||
13710 | + return "casts.h\t%0"; | ||
13711 | + case 1: | ||
13712 | + return "bfexts\t%0, %1, 0, 16"; | ||
13713 | + case 2: | ||
13714 | + case 3: | ||
13715 | + return "ld.sh\t%0, %1"; | ||
13716 | + default: | ||
13717 | + abort(); | ||
13718 | + } | ||
13719 | + } | ||
13720 | + [(set_attr "length" "2,4,2,4") | ||
13721 | + (set_attr "cc" "set_ncz,set_ncz,none,none") | ||
13722 | + (set_attr "type" "alu,alu,load_rm,load_rm")]) | ||
13723 | + | ||
13724 | +(define_insn "extendqisi2" | ||
13725 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") | ||
13726 | + (sign_extend:SI (match_operand:QI 1 "extendqi_operand" "0,r,RKu00,m")))] | ||
13727 | + "" | ||
13728 | + { | ||
13729 | + switch ( which_alternative ){ | ||
13730 | + case 0: | ||
13731 | + return "casts.b\t%0"; | ||
13732 | + case 1: | ||
13733 | + return "bfexts\t%0, %1, 0, 8"; | ||
13734 | + case 2: | ||
13735 | + case 3: | ||
13736 | + return "ld.sb\t%0, %1"; | ||
13737 | + default: | ||
13738 | + abort(); | ||
13739 | + } | ||
13740 | + } | ||
13741 | + [(set_attr "length" "2,4,2,4") | ||
13742 | + (set_attr "cc" "set_ncz,set_ncz,none,none") | ||
13743 | + (set_attr "type" "alu,alu,load_rm,load_rm")]) | ||
13744 | + | ||
13745 | +(define_insn "extendqihi2" | ||
13746 | + [(set (match_operand:HI 0 "register_operand" "=r,r,r,r") | ||
13747 | + (sign_extend:HI (match_operand:QI 1 "extendqi_operand" "0,r,RKu00,m")))] | ||
13748 | + "" | ||
13749 | + { | ||
13750 | + switch ( which_alternative ){ | ||
13751 | + case 0: | ||
13752 | + return "casts.b\t%0"; | ||
13753 | + case 1: | ||
13754 | + return "bfexts\t%0, %1, 0, 8"; | ||
13755 | + case 2: | ||
13756 | + case 3: | ||
13757 | + return "ld.sb\t%0, %1"; | ||
13758 | + default: | ||
13759 | + abort(); | ||
13760 | + } | ||
13761 | + } | ||
13762 | + [(set_attr "length" "2,4,2,4") | ||
13763 | + (set_attr "cc" "set_ncz,set_ncz,none,none") | ||
13764 | + (set_attr "type" "alu,alu,load_rm,load_rm")]) | ||
13765 | + | ||
13766 | + | ||
13767 | +;;============================================================================= | ||
13768 | +;; Zero-extend | ||
13769 | +;;----------------------------------------------------------------------------- | ||
13770 | +;; | ||
13771 | +;;============================================================================= | ||
13772 | + | ||
13773 | +(define_insn "zero_extendhisi2" | ||
13774 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") | ||
13775 | + (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,r,<RKu00>,m")))] | ||
13776 | + "" | ||
13777 | + { | ||
13778 | + switch ( which_alternative ){ | ||
13779 | + case 0: | ||
13780 | + return "castu.h\t%0"; | ||
13781 | + case 1: | ||
13782 | + return "bfextu\t%0, %1, 0, 16"; | ||
13783 | + case 2: | ||
13784 | + case 3: | ||
13785 | + return "ld.uh\t%0, %1"; | ||
13786 | + default: | ||
13787 | + abort(); | ||
13788 | + } | ||
13789 | + } | ||
13790 | + | ||
13791 | + [(set_attr "length" "2,4,2,4") | ||
13792 | + (set_attr "cc" "set_ncz,set_ncz,none,none") | ||
13793 | + (set_attr "type" "alu,alu,load_rm,load_rm")]) | ||
13794 | + | ||
13795 | +(define_insn "zero_extendqisi2" | ||
13796 | + [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") | ||
13797 | + (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,r,<RKu00>,m")))] | ||
13798 | + "" | ||
13799 | + { | ||
13800 | + switch ( which_alternative ){ | ||
13801 | + case 0: | ||
13802 | + return "castu.b\t%0"; | ||
13803 | + case 1: | ||
13804 | + return "bfextu\t%0, %1, 0, 8"; | ||
13805 | + case 2: | ||
13806 | + case 3: | ||
13807 | + return "ld.ub\t%0, %1"; | ||
13808 | + default: | ||
13809 | + abort(); | ||
13810 | + } | ||
13811 | + } | ||
13812 | + [(set_attr "length" "2,4,2,4") | ||
13813 | + (set_attr "cc" "set_ncz, set_ncz, none, none") | ||
13814 | + (set_attr "type" "alu, alu, load_rm, load_rm")]) | ||
13815 | + | ||
13816 | +(define_insn "zero_extendqihi2" | ||
13817 | + [(set (match_operand:HI 0 "register_operand" "=r,r,r,r") | ||
13818 | + (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0,r,<RKu00>,m")))] | ||
13819 | + "" | ||
13820 | + { | ||
13821 | + switch ( which_alternative ){ | ||
13822 | + case 0: | ||
13823 | + return "castu.b\t%0"; | ||
13824 | + case 1: | ||
13825 | + return "bfextu\t%0, %1, 0, 8"; | ||
13826 | + case 2: | ||
13827 | + case 3: | ||
13828 | + return "ld.ub\t%0, %1"; | ||
13829 | + default: | ||
13830 | + abort(); | ||
13831 | + } | ||
13832 | + } | ||
13833 | + [(set_attr "length" "2,4,2,4") | ||
13834 | + (set_attr "cc" "set_ncz, set_ncz, none, none") | ||
13835 | + (set_attr "type" "alu, alu, load_rm, load_rm")]) | ||
13836 | + | ||
13837 | + | ||
13838 | + | ||
13839 | +;;============================================================================= | ||
13840 | +;; Conditional set register | ||
13841 | +;; sr{cond4} rd | ||
13842 | +;;----------------------------------------------------------------------------- | ||
13843 | + | ||
13844 | +;;Because of the same issue as with conditional moves and adds we must | ||
13845 | +;;not separate the compare instrcution from the scc instruction as | ||
13846 | +;;they might be sheduled "badly". | ||
13847 | + | ||
13848 | +(define_expand "s<code>" | ||
13849 | + [(set (match_operand:SI 0 "register_operand" "") | ||
13850 | + (any_cond (cc0) | ||
13851 | + (const_int 0)))] | ||
13852 | + "" | ||
13853 | + { | ||
13854 | + if ( !avr32_expand_scc(<CODE>, operands) ){ | ||
13855 | + FAIL; | ||
13856 | + } | ||
13857 | + DONE; | ||
13858 | + } | ||
13859 | + ) | ||
13860 | + | ||
13861 | + | ||
13862 | +(define_insn "comparesi_and_set" | ||
13863 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13864 | + (match_operator 1 "avr32_comparison_operator" | ||
13865 | + [ (compare (match_operand:SI 2 "register_operand" "r") | ||
13866 | + (match_operand:SI 3 "general_operand" "rKs06Ks21")) | ||
13867 | + (const_int 0)]))] | ||
13868 | + "" | ||
13869 | + { | ||
13870 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[2]), operands[2], operands[3]); | ||
13871 | + return "sr%1\t%0"; | ||
13872 | + } | ||
13873 | + [(set_attr "length" "6") | ||
13874 | + (set_attr "cc" "clobber")]) | ||
13875 | + | ||
13876 | +(define_insn "comparehi_and_set" | ||
13877 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13878 | + (match_operator 1 "avr32_comparison_operator" | ||
13879 | + [ (compare (match_operand:HI 2 "register_operand" "r") | ||
13880 | + (match_operand:HI 3 "register_operand" "r")) | ||
13881 | + (const_int 0)]))] | ||
13882 | + "" | ||
13883 | + { | ||
13884 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[2]), operands[2], operands[3]); | ||
13885 | + return "sr%1\t%0"; | ||
13886 | + } | ||
13887 | + [(set_attr "length" "6") | ||
13888 | + (set_attr "cc" "clobber")]) | ||
13889 | + | ||
13890 | +(define_insn "compareqi_and_set" | ||
13891 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13892 | + (match_operator 1 "avr32_comparison_operator" | ||
13893 | + [ (compare (match_operand:QI 2 "register_operand" "r") | ||
13894 | + (match_operand:QI 3 "register_operand" "r")) | ||
13895 | + (const_int 0)]))] | ||
13896 | + "" | ||
13897 | + { | ||
13898 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[2]), operands[2], operands[3]); | ||
13899 | + return "sr%1\t%0"; | ||
13900 | + } | ||
13901 | + [(set_attr "length" "6") | ||
13902 | + (set_attr "cc" "clobber")]) | ||
13903 | + | ||
13904 | +(define_insn "*comparedi_and_set" | ||
13905 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13906 | + (match_operator 1 "avr32_comparison_operator" | ||
13907 | + [ (compare (match_operand:DI 2 "register_operand" "r") | ||
13908 | + (match_operand:DI 3 "register_operand" "r")) | ||
13909 | + (const_int 0)]))] | ||
13910 | + "" | ||
13911 | + { | ||
13912 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[2]), operands[2], operands[3]); | ||
13913 | + return "sr%1\t%0"; | ||
13914 | + } | ||
13915 | + [(set_attr "length" "6") | ||
13916 | + (set_attr "cc" "clobber")]) | ||
13917 | + | ||
13918 | +(define_insn "*tstdi_and_set" | ||
13919 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
13920 | + (match_operator 1 "avr32_comparison_operator" | ||
13921 | + [ (compare (match_operand:DI 2 "register_operand" "r") | ||
13922 | + (const_int 0)) | ||
13923 | + (const_int 0)]))] | ||
13924 | + "" | ||
13925 | + { | ||
13926 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[2]), operands[2], const0_rtx); | ||
13927 | + return "sr%1\t%0"; | ||
13928 | + } | ||
13929 | + [(set_attr "length" "6") | ||
13930 | + (set_attr "cc" "clobber")]) | ||
13931 | + | ||
13932 | + | ||
13933 | + | ||
13934 | +;;============================================================================= | ||
13935 | +;; Conditional branch | ||
13936 | +;;----------------------------------------------------------------------------- | ||
13937 | +;; Branch to label if the specified condition codes are set. | ||
13938 | +;;============================================================================= | ||
13939 | +; branch if negative | ||
13940 | +(define_insn "bmi" | ||
13941 | + [(set (pc) | ||
13942 | + (if_then_else (unspec:CC [(cc0) (const_int 0)] UNSPEC_COND_MI) | ||
13943 | + (label_ref (match_operand 0 "" "")) | ||
13944 | + (pc)))] | ||
13945 | + "" | ||
13946 | + "brmi %0" | ||
13947 | + [(set_attr "type" "branch") | ||
13948 | + (set (attr "length") | ||
13949 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
13950 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
13951 | + (const_int 2)] ; use compact branch | ||
13952 | + (const_int 4))) ; use extended branch | ||
13953 | + (set_attr "cc" "none")]) | ||
13954 | + | ||
13955 | +(define_insn "*bmi-reverse" | ||
13956 | + [(set (pc) | ||
13957 | + (if_then_else (unspec:CC [(cc0) (const_int 0)] UNSPEC_COND_MI) | ||
13958 | + (pc) | ||
13959 | + (label_ref (match_operand 0 "" ""))))] | ||
13960 | + "" | ||
13961 | + "brpl %0" | ||
13962 | + [(set_attr "type" "branch") | ||
13963 | + (set (attr "length") | ||
13964 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
13965 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
13966 | + (const_int 2)] ; use compact branch | ||
13967 | + (const_int 4))) ; use extended branch | ||
13968 | + (set_attr "cc" "none")]) | ||
13969 | + | ||
13970 | +; branch if positive | ||
13971 | +(define_insn "bpl" | ||
13972 | + [(set (pc) | ||
13973 | + (if_then_else (unspec:CC [(cc0) (const_int 0)] UNSPEC_COND_PL) | ||
13974 | + (label_ref (match_operand 0 "" "")) | ||
13975 | + (pc)))] | ||
13976 | + "" | ||
13977 | + "brpl %0" | ||
13978 | + [(set_attr "type" "branch") | ||
13979 | + (set (attr "length") | ||
13980 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
13981 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
13982 | + (const_int 2)] ; use compact branch | ||
13983 | + (const_int 4))) ; use extended branch | ||
13984 | + (set_attr "cc" "none")]) | ||
13985 | + | ||
13986 | +(define_insn "*bpl-reverse" | ||
13987 | + [(set (pc) | ||
13988 | + (if_then_else (unspec:CC [(cc0) (const_int 0)] UNSPEC_COND_PL) | ||
13989 | + (pc) | ||
13990 | + (label_ref (match_operand 0 "" ""))))] | ||
13991 | + "" | ||
13992 | + "brmi %0" | ||
13993 | + [(set_attr "type" "branch") | ||
13994 | + (set (attr "length") | ||
13995 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
13996 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
13997 | + (const_int 2)] ; use compact branch | ||
13998 | + (const_int 4))) ; use extended branch | ||
13999 | + (set_attr "cc" "none")]) | ||
14000 | + | ||
14001 | +; branch if equal | ||
14002 | +(define_insn "b<code>" | ||
14003 | + [(set (pc) | ||
14004 | + (if_then_else (any_cond:CC (cc0) | ||
14005 | + (const_int 0)) | ||
14006 | + (label_ref (match_operand 0 "" "")) | ||
14007 | + (pc)))] | ||
14008 | + "" | ||
14009 | + "br<cond> %0 " | ||
14010 | + [(set_attr "type" "branch") | ||
14011 | + (set (attr "length") | ||
14012 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
14013 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
14014 | + (const_int 2)] ; use compact branch | ||
14015 | + (const_int 4))) ; use extended branch | ||
14016 | + (set_attr "cc" "none")]) | ||
14017 | + | ||
14018 | + | ||
14019 | +(define_insn "*b<code>-reverse" | ||
14020 | + [(set (pc) | ||
14021 | + (if_then_else (any_cond:CC (cc0) | ||
14022 | + (const_int 0)) | ||
14023 | + (pc) | ||
14024 | + (label_ref (match_operand 0 "" ""))))] | ||
14025 | + "" | ||
14026 | + "br<invcond> %0 " | ||
14027 | + [(set_attr "type" "branch") | ||
14028 | + (set (attr "length") | ||
14029 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 254)) | ||
14030 | + (le (minus (pc) (match_dup 0)) (const_int 256))) | ||
14031 | + (const_int 2)] ; use compact branch | ||
14032 | + (const_int 4))) ; use extended branch | ||
14033 | + (set_attr "cc" "none")]) | ||
14034 | + | ||
14035 | + | ||
14036 | + | ||
14037 | +;============================================================================= | ||
14038 | +; Conditional Add/Subtract | ||
14039 | +;----------------------------------------------------------------------------- | ||
14040 | +; sub{cond4} Rd, imm | ||
14041 | +;============================================================================= | ||
14042 | + | ||
14043 | + | ||
14044 | +(define_expand "add<mode>cc" | ||
14045 | + [(set (match_operand:ADDCC 0 "register_operand" "") | ||
14046 | + (if_then_else:ADDCC (match_operand 1 "avr32_comparison_operator" "") | ||
14047 | + (match_operand:ADDCC 2 "register_immediate_operand" "") | ||
14048 | + (match_operand:ADDCC 3 "register_immediate_operand" "")))] | ||
14049 | + "" | ||
14050 | + { | ||
14051 | + if ( avr32_expand_addcc(<MODE>mode, operands ) ) | ||
14052 | + DONE; | ||
14053 | + else | ||
14054 | + FAIL; | ||
14055 | + } | ||
14056 | + ) | ||
14057 | + | ||
14058 | + | ||
14059 | +(define_insn "add<ADDCC:mode>cc_cmp<CMP:mode>" | ||
14060 | + [(set (match_operand:ADDCC 0 "register_operand" "=&r") | ||
14061 | + (unspec:ADDCC [(match_operand 1 "avr32_comparison_operator" "") | ||
14062 | + (match_operand:ADDCC 2 "register_operand" "0") | ||
14063 | + (match_operand:ADDCC 3 "immediate_operand" "Ks08") | ||
14064 | + (match_operand:CMP 4 "register_operand" "r") | ||
14065 | + (match_operand:CMP 5 "<CMP:cmp_predicate>" "<CMP:cmp_constraint>") | ||
14066 | + ] | ||
14067 | + UNSPEC_ADDSICC ))] | ||
14068 | + "" | ||
14069 | + { | ||
14070 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[4]), operands[4], operands[5]); | ||
14071 | + | ||
14072 | + return "sub%1\t%0, %3"; | ||
14073 | + } | ||
14074 | + [(set_attr "length" "8") | ||
14075 | + (set_attr "cc" "clobber")]) | ||
14076 | + | ||
14077 | + | ||
14078 | +;============================================================================= | ||
14079 | +; Conditional Move | ||
14080 | +;----------------------------------------------------------------------------- | ||
14081 | +; mov{cond4} Rd, (Rs/imm) | ||
14082 | +;============================================================================= | ||
14083 | +(define_expand "mov<mode>cc" | ||
14084 | + [(set (match_operand:ADDCC 0 "register_operand" "") | ||
14085 | + (if_then_else:ADDCC (match_operand 1 "avr32_comparison_operator" "") | ||
14086 | + (match_operand:ADDCC 2 "register_immediate_operand" "") | ||
14087 | + (match_operand:ADDCC 3 "register_immediate_operand" "")))] | ||
14088 | + "" | ||
14089 | + { | ||
14090 | + if ( avr32_expand_movcc(<MODE>mode, operands ) ) | ||
14091 | + DONE; | ||
14092 | + else | ||
14093 | + FAIL; | ||
14094 | + } | ||
14095 | + ) | ||
14096 | + | ||
14097 | +(define_insn "mov<MOVCC:mode>cc_cmp<CMP:mode>" | ||
14098 | + [(set (match_operand:MOVCC 0 "register_operand" "=r,r,r") | ||
14099 | + (unspec:MOVCC [(match_operand 1 "avr32_comparison_operator" "") | ||
14100 | + (match_operand:MOVCC 2 "register_immediate_operand" "0,rKs08,rKs08") | ||
14101 | + (match_operand:MOVCC 3 "register_immediate_operand" "rKs08,0,rKs08") | ||
14102 | + (match_operand:CMP 4 "register_operand" "r, r, r") | ||
14103 | + (match_operand:CMP 5 "<CMP:cmp_predicate>" "<CMP:cmp_constraint>, <CMP:cmp_constraint>, <CMP:cmp_constraint>") | ||
14104 | + ] | ||
14105 | + UNSPEC_MOVSICC ))] | ||
14106 | + "" | ||
14107 | + { | ||
14108 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[4]), operands[4], operands[5]); | ||
14109 | + | ||
14110 | + switch( which_alternative ){ | ||
14111 | + case 0: | ||
14112 | + return "mov%i1 %0, %3"; | ||
14113 | + case 1: | ||
14114 | + return "mov%1 %0, %2"; | ||
14115 | + case 2: | ||
14116 | + return "mov%1 %0, %2\;mov%i1 %0, %3"; | ||
14117 | + default: | ||
14118 | + abort(); | ||
14119 | + } | ||
14120 | + | ||
14121 | + | ||
14122 | + } | ||
14123 | + [(set_attr "length" "8,8,12") | ||
14124 | + (set_attr "cc" "clobber")]) | ||
14125 | + | ||
14126 | + | ||
14127 | +;;============================================================================= | ||
14128 | +;; jump | ||
14129 | +;;----------------------------------------------------------------------------- | ||
14130 | +;; Jump inside a function; an unconditional branch to a label. | ||
14131 | +;;============================================================================= | ||
14132 | +(define_insn "jump" | ||
14133 | + [(set (pc) | ||
14134 | + (label_ref (match_operand 0 "" "")))] | ||
14135 | + "" | ||
14136 | + { | ||
14137 | + if (get_attr_length(insn) > 4) | ||
14138 | + return "Can't jump this far"; | ||
14139 | + return (get_attr_length(insn) == 2 ? | ||
14140 | + "rjmp %0" : "bral %0"); | ||
14141 | + } | ||
14142 | + [(set_attr "type" "branch") | ||
14143 | + (set (attr "length") | ||
14144 | + (cond [(and (le (minus (match_dup 0) (pc)) (const_int 1022)) | ||
14145 | + (le (minus (pc) (match_dup 0)) (const_int 1024))) | ||
14146 | + (const_int 2) ; use rjmp | ||
14147 | + (le (match_dup 0) (const_int 1048575)) | ||
14148 | + (const_int 4)] ; use bral | ||
14149 | + (const_int 8))) ; do something else | ||
14150 | + (set_attr "cc" "none")]) | ||
14151 | + | ||
14152 | +;;============================================================================= | ||
14153 | +;; call | ||
14154 | +;;----------------------------------------------------------------------------- | ||
14155 | +;; Subroutine call instruction returning no value. | ||
14156 | +;;============================================================================= | ||
14157 | +(define_insn "call_internal" | ||
14158 | + [(parallel [(call (mem:SI (match_operand:SI 0 "avr32_call_operand" "r,U,T,W")) | ||
14159 | + (match_operand 1 "" "")) | ||
14160 | + (clobber (reg:SI LR_REGNUM))])] | ||
14161 | + "" | ||
14162 | + { | ||
14163 | + switch (which_alternative){ | ||
14164 | + case 0: | ||
14165 | + return "icall\t%0"; | ||
14166 | + case 1: | ||
14167 | + return "rcall\t%0"; | ||
14168 | + case 2: | ||
14169 | + return "mcall\t%0"; | ||
14170 | + case 3: | ||
14171 | + if ( TARGET_HAS_ASM_ADDR_PSEUDOS ) | ||
14172 | + return "call\t%0"; | ||
14173 | + else | ||
14174 | + return "mcall\tr6[%0@got]"; | ||
14175 | + default: | ||
14176 | + abort(); | ||
14177 | + } | ||
14178 | + } | ||
14179 | + [(set_attr "type" "call") | ||
14180 | + (set_attr "length" "2,4,4,10") | ||
14181 | + (set_attr "cc" "clobber")]) | ||
14182 | + | ||
14183 | + | ||
14184 | +(define_expand "call" | ||
14185 | + [(parallel [(call (match_operand:SI 0 "" "") | ||
14186 | + (match_operand 1 "" "")) | ||
14187 | + (clobber (reg:SI LR_REGNUM))])] | ||
14188 | + "" | ||
14189 | + { | ||
14190 | + rtx call_address; | ||
14191 | + if ( GET_CODE(operands[0]) != MEM ) | ||
14192 | + FAIL; | ||
14193 | + | ||
14194 | + call_address = XEXP(operands[0], 0); | ||
14195 | + | ||
14196 | + /* If assembler supports call pseudo insn and the call | ||
14197 | + address is a symbol then nothing special needs to be done. */ | ||
14198 | + if ( TARGET_HAS_ASM_ADDR_PSEUDOS | ||
14199 | + && (GET_CODE(call_address) == SYMBOL_REF) ){ | ||
14200 | + /* We must however mark the function as using the GOT if | ||
14201 | + flag_pic is set, since the call insn might turn into | ||
14202 | + a mcall using the GOT ptr register. */ | ||
14203 | + if ( flag_pic ){ | ||
14204 | + current_function_uses_pic_offset_table = 1; | ||
14205 | + emit_call_insn(gen_call_internal(call_address, operands[1])); | ||
14206 | + DONE; | ||
14207 | + } | ||
14208 | + } else { | ||
14209 | + if ( flag_pic && | ||
14210 | + GET_CODE(call_address) == SYMBOL_REF ){ | ||
14211 | + current_function_uses_pic_offset_table = 1; | ||
14212 | + emit_call_insn(gen_call_internal(call_address, operands[1])); | ||
14213 | + DONE; | ||
14214 | + } | ||
14215 | + | ||
14216 | + if ( !SYMBOL_REF_RCALL_FUNCTION_P(operands[0]) ){ | ||
14217 | + if ( optimize_size && | ||
14218 | + GET_CODE(call_address) == SYMBOL_REF ){ | ||
14219 | + call_address = force_const_mem(SImode, call_address); | ||
14220 | + } else { | ||
14221 | + call_address = force_reg(SImode, call_address); | ||
14222 | + } | ||
14223 | + } | ||
14224 | + } | ||
14225 | + emit_call_insn(gen_call_internal(call_address, operands[1])); | ||
14226 | + DONE; | ||
14227 | + } | ||
14228 | +) | ||
14229 | + | ||
14230 | +;;============================================================================= | ||
14231 | +;; call_value | ||
14232 | +;;----------------------------------------------------------------------------- | ||
14233 | +;; Subrutine call instruction returning a value. | ||
14234 | +;;============================================================================= | ||
14235 | +(define_expand "call_value" | ||
14236 | + [(parallel [(set (match_operand:SI 0 "" "") | ||
14237 | + (call (match_operand:SI 1 "" "") | ||
14238 | + (match_operand 2 "" ""))) | ||
14239 | + (clobber (reg:SI LR_REGNUM))])] | ||
14240 | + "" | ||
14241 | + { | ||
14242 | + rtx call_address; | ||
14243 | + if ( GET_CODE(operands[1]) != MEM ) | ||
14244 | + FAIL; | ||
14245 | + | ||
14246 | + call_address = XEXP(operands[1], 0); | ||
14247 | + | ||
14248 | + /* If assembler supports call pseudo insn and the call | ||
14249 | + address is a symbol then nothing special needs to be done. */ | ||
14250 | + if ( TARGET_HAS_ASM_ADDR_PSEUDOS | ||
14251 | + && (GET_CODE(call_address) == SYMBOL_REF) ){ | ||
14252 | + /* We must however mark the function as using the GOT if | ||
14253 | + flag_pic is set, since the call insn might turn into | ||
14254 | + a mcall using the GOT ptr register. */ | ||
14255 | + if ( flag_pic ) { | ||
14256 | + current_function_uses_pic_offset_table = 1; | ||
14257 | + emit_call_insn(gen_call_value_internal(operands[0], call_address, operands[2])); | ||
14258 | + DONE; | ||
14259 | + } | ||
14260 | + } else { | ||
14261 | + if ( flag_pic && | ||
14262 | + GET_CODE(call_address) == SYMBOL_REF ){ | ||
14263 | + current_function_uses_pic_offset_table = 1; | ||
14264 | + emit_call_insn(gen_call_value_internal(operands[0], call_address, operands[2])); | ||
14265 | + DONE; | ||
14266 | + } | ||
14267 | + | ||
14268 | + if ( !SYMBOL_REF_RCALL_FUNCTION_P(operands[1]) ){ | ||
14269 | + if ( optimize_size && | ||
14270 | + GET_CODE(call_address) == SYMBOL_REF){ | ||
14271 | + call_address = force_const_mem(SImode, call_address); | ||
14272 | + } else { | ||
14273 | + call_address = force_reg(SImode, call_address); | ||
14274 | + } | ||
14275 | + } | ||
14276 | + } | ||
14277 | + emit_call_insn(gen_call_value_internal(operands[0], call_address, | ||
14278 | + operands[2])); | ||
14279 | + DONE; | ||
14280 | + | ||
14281 | + }) | ||
14282 | + | ||
14283 | +(define_insn "call_value_internal" | ||
14284 | + [(parallel [(set (match_operand 0 "register_operand" "=r,r,r,r") | ||
14285 | + (call (mem:SI (match_operand:SI 1 "avr32_call_operand" "r,U,T,W")) | ||
14286 | + (match_operand 2 "" ""))) | ||
14287 | + (clobber (reg:SI LR_REGNUM))])] | ||
14288 | + ;; Operand 2 not used on the AVR32. | ||
14289 | + "" | ||
14290 | + { | ||
14291 | + switch (which_alternative){ | ||
14292 | + case 0: | ||
14293 | + return "icall\t%1"; | ||
14294 | + case 1: | ||
14295 | + return "rcall\t%1"; | ||
14296 | + case 2: | ||
14297 | + return "mcall\t%1"; | ||
14298 | + case 3: | ||
14299 | + if ( TARGET_HAS_ASM_ADDR_PSEUDOS ) | ||
14300 | + return "call\t%1"; | ||
14301 | + else | ||
14302 | + return "mcall\tr6[%1@got]"; | ||
14303 | + default: | ||
14304 | + abort(); | ||
14305 | + } | ||
14306 | + } | ||
14307 | + [(set_attr "type" "call") | ||
14308 | + (set_attr "length" "2,4,4,10") | ||
14309 | + (set_attr "cc" "call_set")]) | ||
14310 | + | ||
14311 | + | ||
14312 | +;;============================================================================= | ||
14313 | +;; untyped_call | ||
14314 | +;;----------------------------------------------------------------------------- | ||
14315 | +;; Subrutine call instruction returning a value of any type. | ||
14316 | +;; The code is copied from m68k.md (except gen_blockage is removed) | ||
14317 | +;; Fixme! | ||
14318 | +;;============================================================================= | ||
14319 | +(define_expand "untyped_call" | ||
14320 | + [(parallel [(call (match_operand 0 "avr32_call_operand" "") | ||
14321 | + (const_int 0)) | ||
14322 | + (match_operand 1 "" "") | ||
14323 | + (match_operand 2 "" "")])] | ||
14324 | + "" | ||
14325 | + { | ||
14326 | + int i; | ||
14327 | + | ||
14328 | + emit_call_insn (GEN_CALL (operands[0], const0_rtx, NULL, const0_rtx)); | ||
14329 | + | ||
14330 | + for (i = 0; i < XVECLEN (operands[2], 0); i++) { | ||
14331 | + rtx set = XVECEXP (operands[2], 0, i); | ||
14332 | + emit_move_insn (SET_DEST (set), SET_SRC (set)); | ||
14333 | + } | ||
14334 | + | ||
14335 | + /* The optimizer does not know that the call sets the function value | ||
14336 | + registers we stored in the result block. We avoid problems by | ||
14337 | + claiming that all hard registers are used and clobbered at this | ||
14338 | + point. */ | ||
14339 | + emit_insn (gen_blockage ()); | ||
14340 | + | ||
14341 | + DONE; | ||
14342 | + }) | ||
14343 | + | ||
14344 | + | ||
14345 | +;;============================================================================= | ||
14346 | +;; return | ||
14347 | +;;============================================================================= | ||
14348 | + | ||
14349 | +(define_insn "return" | ||
14350 | + [(return)] | ||
14351 | + "USE_RETURN_INSN (FALSE)" | ||
14352 | + { | ||
14353 | + avr32_output_return_instruction(TRUE, FALSE, NULL, NULL); | ||
14354 | + return ""; | ||
14355 | + } | ||
14356 | + [(set_attr "length" "4") | ||
14357 | + (set_attr "type" "call")] | ||
14358 | + ) | ||
14359 | + | ||
14360 | +(define_insn "*return_value_imm" | ||
14361 | + [(parallel [(set (reg RETVAL_REGNUM) (match_operand 0 "immediate_operand" "i")) | ||
14362 | + (use (reg RETVAL_REGNUM)) | ||
14363 | + (return)])] | ||
14364 | + "USE_RETURN_INSN (FALSE) && | ||
14365 | + ((INTVAL(operands[0]) == -1) || (INTVAL(operands[0]) == 0) || (INTVAL(operands[0]) == 1))" | ||
14366 | + { | ||
14367 | + avr32_output_return_instruction(TRUE, FALSE, NULL, operands[0]); | ||
14368 | + return ""; | ||
14369 | + } | ||
14370 | + [(set_attr "length" "4") | ||
14371 | + (set_attr "type" "call")] | ||
14372 | + ) | ||
14373 | + | ||
14374 | +(define_insn "*return_value_si" | ||
14375 | + [(set (reg RETVAL_REGNUM) (match_operand:SI 0 "register_operand" "r")) | ||
14376 | + (use (reg RETVAL_REGNUM)) | ||
14377 | + (return)] | ||
14378 | + "USE_RETURN_INSN (TRUE)" | ||
14379 | + "retal %0"; | ||
14380 | + [(set_attr "type" "call")] | ||
14381 | + ) | ||
14382 | + | ||
14383 | +(define_insn "*return_value_hi" | ||
14384 | + [(parallel [(set (reg RETVAL_REGNUM) (match_operand:HI 0 "register_operand" "r")) | ||
14385 | + (use (reg RETVAL_REGNUM)) | ||
14386 | + (return)])] | ||
14387 | + "USE_RETURN_INSN (TRUE)" | ||
14388 | + "retal %0" | ||
14389 | + [(set_attr "type" "call")] | ||
14390 | + ) | ||
14391 | + | ||
14392 | +(define_insn "*return_value_qi" | ||
14393 | + [(parallel [(set (reg RETVAL_REGNUM) (match_operand:QI 0 "register_operand" "r")) | ||
14394 | + (use (reg RETVAL_REGNUM)) | ||
14395 | + (return)])] | ||
14396 | + "USE_RETURN_INSN (TRUE)" | ||
14397 | + "retal %0" | ||
14398 | + [(set_attr "type" "call")] | ||
14399 | + ) | ||
14400 | + | ||
14401 | +;;============================================================================= | ||
14402 | +;; nop | ||
14403 | +;;----------------------------------------------------------------------------- | ||
14404 | +;; No-op instruction. | ||
14405 | +;;============================================================================= | ||
14406 | +(define_insn "nop" | ||
14407 | + [(const_int 0)] | ||
14408 | + "" | ||
14409 | + "nop" | ||
14410 | + [(set_attr "length" "2") | ||
14411 | + (set_attr "type" "alu") | ||
14412 | + (set_attr "cc" "none")]) | ||
14413 | + | ||
14414 | +;;============================================================================= | ||
14415 | +;; nonlocal_goto | ||
14416 | +;;----------------------------------------------------------------------------- | ||
14417 | +;; Jump from one function to a label in an outer function. | ||
14418 | +;; Must invalidate return stack, since the function will be exited without | ||
14419 | +;; a return | ||
14420 | +;;============================================================================= | ||
14421 | +(define_expand "nonlocal_goto" | ||
14422 | + [(use (match_operand 0 "" "")) | ||
14423 | + (use (match_operand 1 "" "")) | ||
14424 | + (use (match_operand 2 "" "")) | ||
14425 | + (use (match_operand 3 "" ""))] | ||
14426 | + "" | ||
14427 | + { | ||
14428 | + emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__nonlocal_goto"), | ||
14429 | + 0, VOIDmode, 3, | ||
14430 | + operands[0], SImode, | ||
14431 | + operands[1], Pmode, | ||
14432 | + operands[2], SImode); | ||
14433 | + | ||
14434 | + DONE; | ||
14435 | + } | ||
14436 | +) | ||
14437 | + | ||
14438 | + | ||
14439 | +(define_expand "builtin_longjmp" | ||
14440 | + [(use (match_operand 0 "" ""))] | ||
14441 | + "" | ||
14442 | + { | ||
14443 | + rtx ops[3]; | ||
14444 | + | ||
14445 | + ops[0] = gen_rtx_MEM (Pmode, gen_rtx_PLUS(SImode, operands[0], gen_rtx_CONST_INT(SImode,0))); | ||
14446 | + ops[1] = gen_rtx_MEM (Pmode, gen_rtx_PLUS(SImode, operands[0], gen_rtx_CONST_INT(SImode,4))); | ||
14447 | + ops[2] = gen_rtx_MEM (Pmode, gen_rtx_PLUS(SImode, operands[0], gen_rtx_CONST_INT(SImode,8))); | ||
14448 | + | ||
14449 | + | ||
14450 | + emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__nonlocal_goto"), | ||
14451 | + 0, VOIDmode, 3, | ||
14452 | + ops[0], SImode, | ||
14453 | + ops[1], Pmode, | ||
14454 | + ops[2], SImode); | ||
14455 | + | ||
14456 | + DONE; | ||
14457 | + } | ||
14458 | + ) | ||
14459 | + | ||
14460 | + | ||
14461 | +;;============================================================================= | ||
14462 | +;; indirect_jump | ||
14463 | +;;----------------------------------------------------------------------------- | ||
14464 | +;; Jump to an address in reg or memory. | ||
14465 | +;;============================================================================= | ||
14466 | +(define_expand "indirect_jump" | ||
14467 | + [(set (pc) | ||
14468 | + (match_operand:SI 0 "general_operand" "r,m"))] | ||
14469 | + "" | ||
14470 | + { | ||
14471 | + /* One of the ops has to be in a register. */ | ||
14472 | + if ( (flag_pic || TARGET_HAS_ASM_ADDR_PSEUDOS ) | ||
14473 | + && !avr32_legitimate_pic_operand_p(operands[0]) ) | ||
14474 | + operands[0] = legitimize_pic_address (operands[0], SImode, 0); | ||
14475 | + else if ( flag_pic && avr32_address_operand(operands[0], GET_MODE(operands[0])) ) | ||
14476 | + /* If we have an address operand then this function uses the pic register. */ | ||
14477 | + current_function_uses_pic_offset_table = 1; | ||
14478 | + }) | ||
14479 | + | ||
14480 | + | ||
14481 | +(define_insn "indirect_jump_internal" | ||
14482 | + [(set (pc) | ||
14483 | + (match_operand:SI 0 "general_operand" "r,m,W"))] | ||
14484 | + "" | ||
14485 | + { | ||
14486 | + switch( which_alternative ){ | ||
14487 | + case 0: | ||
14488 | + return "mov\tpc, %0"; | ||
14489 | + case 1: | ||
14490 | + if ( avr32_const_pool_ref_operand(operands[0], GET_MODE(operands[0])) ) | ||
14491 | + return "lddpc\tpc, %0"; | ||
14492 | + else | ||
14493 | + return "ld.w\tpc, %0"; | ||
14494 | + case 2: | ||
14495 | + if ( flag_pic ) | ||
14496 | + return "ld.w\tpc, r6[%0@got]"; | ||
14497 | + else | ||
14498 | + return "lda.w\tpc, %0"; | ||
14499 | + default: | ||
14500 | + abort(); | ||
14501 | + } | ||
14502 | + } | ||
14503 | + [(set_attr "length" "2,4,8") | ||
14504 | + (set_attr "type" "call,call,call") | ||
14505 | + (set_attr "cc" "none,none,clobber")]) | ||
14506 | + | ||
14507 | + | ||
14508 | +;;============================================================================= | ||
14509 | +;; casesi | ||
14510 | +;;============================================================================= | ||
14511 | + | ||
14512 | + | ||
14513 | +(define_expand "casesi" | ||
14514 | + [(match_operand:SI 0 "register_operand" "") ; index to jump on | ||
14515 | + (match_operand:SI 1 "const_int_operand" "") ; lower bound | ||
14516 | + (match_operand:SI 2 "const_int_operand" "") ; total range | ||
14517 | + (match_operand:SI 3 "" "") ; table label | ||
14518 | + (match_operand:SI 4 "" "")] ; Out of range label | ||
14519 | + "" | ||
14520 | + " | ||
14521 | + { | ||
14522 | + rtx reg; | ||
14523 | + if (operands[1] != const0_rtx) | ||
14524 | + { | ||
14525 | + if (!avr32_const_ok_for_constraint_p(INTVAL (operands[1]), 'I', \"Is21\")){ | ||
14526 | + reg = force_reg(SImode, GEN_INT (INTVAL (operands[1]))); | ||
14527 | + emit_insn (gen_subsi3 (reg, operands[0], | ||
14528 | + reg)); | ||
14529 | + } else { | ||
14530 | + reg = gen_reg_rtx (SImode); | ||
14531 | + emit_insn (gen_addsi3 (reg, operands[0], | ||
14532 | + GEN_INT (-INTVAL (operands[1])))); | ||
14533 | + } | ||
14534 | + operands[0] = reg; | ||
14535 | + } | ||
14536 | + | ||
14537 | + if (!avr32_const_ok_for_constraint_p(INTVAL (operands[2]), 'K', \"Ks21\")) | ||
14538 | + operands[2] = force_reg (SImode, operands[2]); | ||
14539 | + | ||
14540 | + emit_jump_insn (gen_casesi_internal (operands[0], operands[2], operands[3], | ||
14541 | + operands[4], gen_reg_rtx(SImode))); | ||
14542 | + DONE; | ||
14543 | + }" | ||
14544 | +) | ||
14545 | + | ||
14546 | +;; The USE in this pattern is needed to tell flow analysis that this is | ||
14547 | +;; a CASESI insn. It has no other purpose. | ||
14548 | +(define_insn "casesi_internal" | ||
14549 | + [(parallel [(set (pc) | ||
14550 | + (if_then_else | ||
14551 | + (leu (match_operand:SI 0 "register_operand" "r") | ||
14552 | + (match_operand:SI 1 "register_immediate_operand" "rKu03")) | ||
14553 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
14554 | + (label_ref (match_operand 2 "" "")))) | ||
14555 | + (label_ref (match_operand 3 "" "")))) | ||
14556 | + (clobber (match_operand:SI 4 "register_operand" "=r")) | ||
14557 | + (use (label_ref (match_dup 2)))])] | ||
14558 | + "" | ||
14559 | + { | ||
14560 | + if (flag_pic) | ||
14561 | + return "cp.w\t%0, %1\;brhi\t%3\;sub\t%4, pc, -(%2 - .)\;add\tpc, %4, %0 << 2"; | ||
14562 | + return "cp.w\t%0, %1\;brhi\t%3\;sub\t%4, pc, -(%2 - .)\;ld.w\tpc, %4[%0 << 2]"; | ||
14563 | + } | ||
14564 | + [(set_attr "cc" "clobber") | ||
14565 | + (set_attr "length" "16")] | ||
14566 | +) | ||
14567 | + | ||
14568 | + | ||
14569 | +(define_insn "prefetch" | ||
14570 | + [(prefetch (match_operand:SI 0 "register_operand" "r") | ||
14571 | + (match_operand 1 "const_int_operand" "") | ||
14572 | + (match_operand 2 "const_int_operand" ""))] | ||
14573 | + "" | ||
14574 | + { | ||
14575 | + return "pref\t%0[0]"; | ||
14576 | + } | ||
14577 | + | ||
14578 | + [(set_attr "length" "4") | ||
14579 | + (set_attr "type" "load") | ||
14580 | + (set_attr "cc" "none")]) | ||
14581 | + | ||
14582 | + | ||
14583 | + | ||
14584 | +;;============================================================================= | ||
14585 | +;; prologue | ||
14586 | +;;----------------------------------------------------------------------------- | ||
14587 | +;; This pattern, if defined, emits RTL for entry to a function. The function | ||
14588 | +;; entry i responsible for setting up the stack frame, initializing the frame | ||
14589 | +;; pointer register, saving callee saved registers, etc. | ||
14590 | +;;============================================================================= | ||
14591 | +(define_expand "prologue" | ||
14592 | + [(clobber (const_int 0))] | ||
14593 | + "" | ||
14594 | + " | ||
14595 | + avr32_expand_prologue(); | ||
14596 | + DONE; | ||
14597 | + " | ||
14598 | + ) | ||
14599 | + | ||
14600 | +;;============================================================================= | ||
14601 | +;; eh_return | ||
14602 | +;;----------------------------------------------------------------------------- | ||
14603 | +;; This pattern, if defined, affects the way __builtin_eh_return, and | ||
14604 | +;; thence the call frame exception handling library routines, are | ||
14605 | +;; built. It is intended to handle non-trivial actions needed along | ||
14606 | +;; the abnormal return path. | ||
14607 | +;; | ||
14608 | +;; The address of the exception handler to which the function should | ||
14609 | +;; return is passed as operand to this pattern. It will normally need | ||
14610 | +;; to copied by the pattern to some special register or memory | ||
14611 | +;; location. If the pattern needs to determine the location of the | ||
14612 | +;; target call frame in order to do so, it may use | ||
14613 | +;; EH_RETURN_STACKADJ_RTX, if defined; it will have already been | ||
14614 | +;; assigned. | ||
14615 | +;; | ||
14616 | +;; If this pattern is not defined, the default action will be to | ||
14617 | +;; simply copy the return address to EH_RETURN_HANDLER_RTX. Either | ||
14618 | +;; that macro or this pattern needs to be defined if call frame | ||
14619 | +;; exception handling is to be used. | ||
14620 | +(define_expand "eh_return" | ||
14621 | + [(use (match_operand 0 "general_operand" ""))] | ||
14622 | + "" | ||
14623 | + " | ||
14624 | + avr32_set_return_address (operands[0]); | ||
14625 | + DONE; | ||
14626 | + " | ||
14627 | + ) | ||
14628 | + | ||
14629 | +;;============================================================================= | ||
14630 | +;; ffssi2 | ||
14631 | +;;----------------------------------------------------------------------------- | ||
14632 | +(define_insn "ffssi2" | ||
14633 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14634 | + (ffs:SI (match_operand:SI 1 "register_operand" "r"))) ] | ||
14635 | + "" | ||
14636 | + "mov %0, %1 | ||
14637 | + brev %0 | ||
14638 | + clz %0, %0 | ||
14639 | + sub %0, -1 | ||
14640 | + cp %0, 33 | ||
14641 | + moveq %0, 0" | ||
14642 | + [(set_attr "length" "18") | ||
14643 | + (set_attr "cc" "clobber")] | ||
14644 | + ) | ||
14645 | + | ||
14646 | + | ||
14647 | + | ||
14648 | +;;============================================================================= | ||
14649 | +;; swap_h | ||
14650 | +;;----------------------------------------------------------------------------- | ||
14651 | +(define_insn "*swap_h" | ||
14652 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14653 | + (ior:SI (ashift:SI (match_dup 0) (const_int 16)) | ||
14654 | + (lshiftrt:SI (match_dup 0) (const_int 16))))] | ||
14655 | + "" | ||
14656 | + "swap.h %0" | ||
14657 | + [(set_attr "length" "2")] | ||
14658 | + ) | ||
14659 | + | ||
14660 | +(define_insn_and_split "bswap_16" | ||
14661 | + [ (set (match_operand:HI 0 "avr32_bswap_operand" "=r,RKs13,r") | ||
14662 | + (ior:HI (and:HI (lshiftrt:HI (match_operand:HI 1 "avr32_bswap_operand" "r,r,RKs13") | ||
14663 | + (const_int 8)) | ||
14664 | + (const_int 255)) | ||
14665 | + (ashift:HI (and:HI (match_dup 1) | ||
14666 | + (const_int 255)) | ||
14667 | + (const_int 8))))] | ||
14668 | + "" | ||
14669 | + { | ||
14670 | + switch ( which_alternative ){ | ||
14671 | + case 0: | ||
14672 | + if ( REGNO(operands[0]) == REGNO(operands[1])) | ||
14673 | + return "swap.bh\t%0"; | ||
14674 | + else | ||
14675 | + return "mov\t%0, %1\;swap.bh\t%0"; | ||
14676 | + case 1: | ||
14677 | + return "stswp.h\t%0, %1"; | ||
14678 | + case 2: | ||
14679 | + return "ldswp.sh\t%0, %1"; | ||
14680 | + default: | ||
14681 | + abort(); | ||
14682 | + } | ||
14683 | + } | ||
14684 | + | ||
14685 | + "(reload_completed && | ||
14686 | + REG_P(operands[0]) && REG_P(operands[1]) | ||
14687 | + && (REGNO(operands[0]) != REGNO(operands[1])))" | ||
14688 | + [(set (match_dup 0) (match_dup 1)) | ||
14689 | + (set (match_dup 0) | ||
14690 | + (ior:HI (and:HI (lshiftrt:HI (match_dup 0) | ||
14691 | + (const_int 8)) | ||
14692 | + (const_int 255)) | ||
14693 | + (ashift:HI (and:HI (match_dup 0) | ||
14694 | + (const_int 255)) | ||
14695 | + (const_int 8))))] | ||
14696 | + "" | ||
14697 | + | ||
14698 | + [(set_attr "length" "4,4,4") | ||
14699 | + (set_attr "type" "alu,store,load_rm")] | ||
14700 | + ) | ||
14701 | + | ||
14702 | +(define_insn_and_split "bswap_32" | ||
14703 | + [ (set (match_operand:SI 0 "avr32_bswap_operand" "=r,RKs14,r") | ||
14704 | + (ior:SI (ior:SI (lshiftrt:SI (and:SI (match_operand:SI 1 "avr32_bswap_operand" "=r,r,RKs14") | ||
14705 | + (const_int 4278190080)) | ||
14706 | + (const_int 24)) | ||
14707 | + (lshiftrt:SI (and:SI (match_dup 1) | ||
14708 | + (const_int 16711680)) | ||
14709 | + (const_int 8))) | ||
14710 | + (ior:SI (ashift:SI (and:SI (match_dup 1) | ||
14711 | + (const_int 65280)) | ||
14712 | + (const_int 8)) | ||
14713 | + (ashift:SI (and:SI (match_dup 1) | ||
14714 | + (const_int 255)) | ||
14715 | + (const_int 24)))))] | ||
14716 | + "" | ||
14717 | + { | ||
14718 | + switch ( which_alternative ){ | ||
14719 | + case 0: | ||
14720 | + if ( REGNO(operands[0]) == REGNO(operands[1])) | ||
14721 | + return "swap.b\t%0"; | ||
14722 | + else | ||
14723 | + return "mov\t%0, %1\;swap.b\t%0"; | ||
14724 | + case 1: | ||
14725 | + return "stswp.w\t%0, %1"; | ||
14726 | + case 2: | ||
14727 | + return "ldswp.w\t%0, %1"; | ||
14728 | + default: | ||
14729 | + abort(); | ||
14730 | + } | ||
14731 | + } | ||
14732 | + "(reload_completed && | ||
14733 | + REG_P(operands[0]) && REG_P(operands[1]) | ||
14734 | + && (REGNO(operands[0]) != REGNO(operands[1])))" | ||
14735 | + [(set (match_dup 0) (match_dup 1)) | ||
14736 | + (set (match_dup 0) | ||
14737 | + (ior:SI (ior:SI (lshiftrt:SI (and:SI (match_dup 0) | ||
14738 | + (const_int 4278190080)) | ||
14739 | + (const_int 24)) | ||
14740 | + (lshiftrt:SI (and:SI (match_dup 0) | ||
14741 | + (const_int 16711680)) | ||
14742 | + (const_int 8))) | ||
14743 | + (ior:SI (ashift:SI (and:SI (match_dup 0) | ||
14744 | + (const_int 65280)) | ||
14745 | + (const_int 8)) | ||
14746 | + (ashift:SI (and:SI (match_dup 0) | ||
14747 | + (const_int 255)) | ||
14748 | + (const_int 24)))))] | ||
14749 | + "" | ||
14750 | + | ||
14751 | + [(set_attr "length" "4,4,4") | ||
14752 | + (set_attr "type" "alu,store,load_rm")] | ||
14753 | + ) | ||
14754 | + | ||
14755 | + | ||
14756 | +;;============================================================================= | ||
14757 | +;; blockage | ||
14758 | +;;----------------------------------------------------------------------------- | ||
14759 | +;; UNSPEC_VOLATILE is considered to use and clobber all hard registers and | ||
14760 | +;; all of memory. This blocks insns from being moved across this point. | ||
14761 | + | ||
14762 | +(define_insn "blockage" | ||
14763 | + [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)] | ||
14764 | + "" | ||
14765 | + "" | ||
14766 | + [(set_attr "length" "0")] | ||
14767 | +) | ||
14768 | + | ||
14769 | +;;============================================================================= | ||
14770 | +;; clzsi2 | ||
14771 | +;;----------------------------------------------------------------------------- | ||
14772 | +(define_insn "clzsi2" | ||
14773 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14774 | + (clz:SI (match_operand:SI 1 "register_operand" "r"))) ] | ||
14775 | + "" | ||
14776 | + "clz %0, %1" | ||
14777 | + [(set_attr "length" "4") | ||
14778 | + (set_attr "cc" "set_z")] | ||
14779 | + ) | ||
14780 | + | ||
14781 | +;;============================================================================= | ||
14782 | +;; ctzsi2 | ||
14783 | +;;----------------------------------------------------------------------------- | ||
14784 | +(define_insn "ctzsi2" | ||
14785 | + [ (set (match_operand:SI 0 "register_operand" "=r,r") | ||
14786 | + (ctz:SI (match_operand:SI 1 "register_operand" "0,r"))) ] | ||
14787 | + "" | ||
14788 | + "@ | ||
14789 | + brev\t%0\;clz\t%0, %0 | ||
14790 | + mov\t%0, %1\;brev\t%0\;clz\t%0, %0" | ||
14791 | + [(set_attr "length" "8") | ||
14792 | + (set_attr "cc" "set_z")] | ||
14793 | + ) | ||
14794 | + | ||
14795 | +;;============================================================================= | ||
14796 | +;; cache instructions | ||
14797 | +;;----------------------------------------------------------------------------- | ||
14798 | +(define_insn "cache" | ||
14799 | + [ (unspec_volatile [(match_operand:SI 0 "register_operand" "r") | ||
14800 | + (match_operand:SI 1 "immediate_operand" "Ku05")] VUNSPEC_CACHE)] | ||
14801 | + "" | ||
14802 | + "cache %0[0], %1" | ||
14803 | + [(set_attr "length" "4")] | ||
14804 | + ) | ||
14805 | + | ||
14806 | +(define_insn "sync" | ||
14807 | + [ (unspec_volatile [(match_operand:SI 0 "immediate_operand" "Ku08")] VUNSPEC_SYNC)] | ||
14808 | + "" | ||
14809 | + "sync %0" | ||
14810 | + [(set_attr "length" "4")] | ||
14811 | + ) | ||
14812 | + | ||
14813 | +;;============================================================================= | ||
14814 | +;; TLB instructions | ||
14815 | +;;----------------------------------------------------------------------------- | ||
14816 | +(define_insn "tlbr" | ||
14817 | + [ (unspec_volatile [(const_int 0)] VUNSPEC_TLBR)] | ||
14818 | + "" | ||
14819 | + "tlbr" | ||
14820 | + [(set_attr "length" "2")] | ||
14821 | + ) | ||
14822 | + | ||
14823 | +(define_insn "tlbw" | ||
14824 | + [ (unspec_volatile [(const_int 0)] VUNSPEC_TLBW)] | ||
14825 | + "" | ||
14826 | + "tlbw" | ||
14827 | + [(set_attr "length" "2")] | ||
14828 | + ) | ||
14829 | + | ||
14830 | +(define_insn "tlbs" | ||
14831 | + [ (unspec_volatile [(const_int 0)] VUNSPEC_TLBS)] | ||
14832 | + "" | ||
14833 | + "tlbs" | ||
14834 | + [(set_attr "length" "2")] | ||
14835 | + ) | ||
14836 | + | ||
14837 | +;;============================================================================= | ||
14838 | +;; Breakpoint instruction | ||
14839 | +;;----------------------------------------------------------------------------- | ||
14840 | +(define_insn "breakpoint" | ||
14841 | + [ (unspec_volatile [(const_int 0)] VUNSPEC_BREAKPOINT)] | ||
14842 | + "" | ||
14843 | + "breakpoint" | ||
14844 | + [(set_attr "length" "2")] | ||
14845 | + ) | ||
14846 | + | ||
14847 | +;;============================================================================= | ||
14848 | +;; Xchg instruction | ||
14849 | +;;----------------------------------------------------------------------------- | ||
14850 | +(define_insn "xchg" | ||
14851 | + [ (parallel [(set (match_operand:SI 0 "register_operand" "=&r") | ||
14852 | + (mem:SI (match_operand:SI 1 "register_operand" "r"))) | ||
14853 | + (set (mem:SI (match_operand:SI 2 "register_operand" "=1")) | ||
14854 | + (match_operand:SI 3 "register_operand" "r"))])] | ||
14855 | + "" | ||
14856 | + "xchg\t%0, %1, %3" | ||
14857 | + [(set_attr "length" "4")] | ||
14858 | + ) | ||
14859 | + | ||
14860 | +;;============================================================================= | ||
14861 | +;; mtsr/mfsr instruction | ||
14862 | +;;----------------------------------------------------------------------------- | ||
14863 | +(define_insn "mtsr" | ||
14864 | + [ (unspec_volatile [(match_operand 0 "immediate_operand" "i") | ||
14865 | + (match_operand:SI 1 "register_operand" "r")] VUNSPEC_MTSR)] | ||
14866 | + "" | ||
14867 | + "mtsr\t%0, %1" | ||
14868 | + [(set_attr "length" "4")] | ||
14869 | + ) | ||
14870 | + | ||
14871 | +(define_insn "mfsr" | ||
14872 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14873 | + (unspec_volatile:SI [(match_operand 1 "immediate_operand" "i")] VUNSPEC_MFSR)) ] | ||
14874 | + "" | ||
14875 | + "mfsr\t%0, %1" | ||
14876 | + [(set_attr "length" "4")] | ||
14877 | + ) | ||
14878 | + | ||
14879 | +;;============================================================================= | ||
14880 | +;; mtdr/mfdr instruction | ||
14881 | +;;----------------------------------------------------------------------------- | ||
14882 | +(define_insn "mtdr" | ||
14883 | + [ (unspec_volatile [(match_operand 0 "immediate_operand" "i") | ||
14884 | + (match_operand:SI 1 "register_operand" "r")] VUNSPEC_MTDR)] | ||
14885 | + "" | ||
14886 | + "mtdr\t%0, %1" | ||
14887 | + [(set_attr "length" "4")] | ||
14888 | + ) | ||
14889 | + | ||
14890 | +(define_insn "mfdr" | ||
14891 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14892 | + (unspec_volatile:SI [(match_operand 1 "immediate_operand" "i")] VUNSPEC_MFDR)) ] | ||
14893 | + "" | ||
14894 | + "mfdr\t%0, %1" | ||
14895 | + [(set_attr "length" "4")] | ||
14896 | + ) | ||
14897 | + | ||
14898 | +;;============================================================================= | ||
14899 | +;; musfr | ||
14900 | +;;----------------------------------------------------------------------------- | ||
14901 | +(define_insn "musfr" | ||
14902 | + [ (unspec_volatile [(match_operand:SI 0 "register_operand" "r")] VUNSPEC_MUSFR)] | ||
14903 | + "" | ||
14904 | + "musfr\t%0" | ||
14905 | + [(set_attr "length" "2") | ||
14906 | + (set_attr "cc" "clobber")] | ||
14907 | + ) | ||
14908 | + | ||
14909 | +(define_insn "mustr" | ||
14910 | + [ (set (match_operand:SI 0 "register_operand" "=r") | ||
14911 | + (unspec_volatile:SI [(const_int 0)] VUNSPEC_MUSTR)) ] | ||
14912 | + "" | ||
14913 | + "mustr\t%0" | ||
14914 | + [(set_attr "length" "2")] | ||
14915 | + ) | ||
14916 | + | ||
14917 | +;;============================================================================= | ||
14918 | +;; Saturation Round Scale instruction | ||
14919 | +;;----------------------------------------------------------------------------- | ||
14920 | +(define_insn "sats" | ||
14921 | + [ (set (match_operand:SI 0 "register_operand" "+r") | ||
14922 | + (unspec:SI [(match_dup 0) | ||
14923 | + (match_operand 1 "immediate_operand" "Ku05") | ||
14924 | + (match_operand 2 "immediate_operand" "Ku05")] | ||
14925 | + UNSPEC_SATS)) ] | ||
14926 | + "TARGET_DSP" | ||
14927 | + "sats\t%0 >> %1, %2" | ||
14928 | + [(set_attr "type" "alu_sat") | ||
14929 | + (set_attr "length" "4")] | ||
14930 | + ) | ||
14931 | + | ||
14932 | +(define_insn "satu" | ||
14933 | + [ (set (match_operand:SI 0 "register_operand" "+r") | ||
14934 | + (unspec:SI [(match_dup 0) | ||
14935 | + (match_operand 1 "immediate_operand" "Ku05") | ||
14936 | + (match_operand 2 "immediate_operand" "Ku05")] | ||
14937 | + UNSPEC_SATU)) ] | ||
14938 | + "TARGET_DSP" | ||
14939 | + "satu\t%0 >> %1, %2" | ||
14940 | + [(set_attr "type" "alu_sat") | ||
14941 | + (set_attr "length" "4")] | ||
14942 | + ) | ||
14943 | + | ||
14944 | +(define_insn "satrnds" | ||
14945 | + [ (set (match_operand:SI 0 "register_operand" "+r") | ||
14946 | + (unspec:SI [(match_dup 0) | ||
14947 | + (match_operand 1 "immediate_operand" "Ku05") | ||
14948 | + (match_operand 2 "immediate_operand" "Ku05")] | ||
14949 | + UNSPEC_SATRNDS)) ] | ||
14950 | + "TARGET_DSP" | ||
14951 | + "satrnds\t%0 >> %1, %2" | ||
14952 | + [(set_attr "type" "alu_sat") | ||
14953 | + (set_attr "length" "4")] | ||
14954 | + ) | ||
14955 | + | ||
14956 | +(define_insn "satrndu" | ||
14957 | + [ (set (match_operand:SI 0 "register_operand" "+r") | ||
14958 | + (unspec:SI [(match_dup 0) | ||
14959 | + (match_operand 1 "immediate_operand" "Ku05") | ||
14960 | + (match_operand 2 "immediate_operand" "Ku05")] | ||
14961 | + UNSPEC_SATRNDU)) ] | ||
14962 | + "TARGET_DSP" | ||
14963 | + "sats\t%0 >> %1, %2" | ||
14964 | + [(set_attr "type" "alu_sat") | ||
14965 | + (set_attr "length" "4")] | ||
14966 | + ) | ||
14967 | + | ||
14968 | +;; Special patterns for dealing with the constant pool | ||
14969 | + | ||
14970 | +(define_insn "align_4" | ||
14971 | + [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN)] | ||
14972 | + "" | ||
14973 | + { | ||
14974 | + assemble_align (32); | ||
14975 | + return ""; | ||
14976 | + } | ||
14977 | + [(set_attr "length" "2")] | ||
14978 | +) | ||
14979 | + | ||
14980 | +(define_insn "consttable_start" | ||
14981 | + [(unspec_volatile [(const_int 0)] VUNSPEC_POOL_START)] | ||
14982 | + "" | ||
14983 | + { | ||
14984 | + return ".cpool"; | ||
14985 | + } | ||
14986 | + [(set_attr "length" "0")] | ||
14987 | + ) | ||
14988 | + | ||
14989 | +(define_insn "consttable_end" | ||
14990 | + [(unspec_volatile [(const_int 0)] VUNSPEC_POOL_END)] | ||
14991 | + "" | ||
14992 | + { | ||
14993 | + making_const_table = FALSE; | ||
14994 | + return ""; | ||
14995 | + } | ||
14996 | + [(set_attr "length" "0")] | ||
14997 | +) | ||
14998 | + | ||
14999 | + | ||
15000 | +(define_insn "consttable_4" | ||
15001 | + [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_4)] | ||
15002 | + "" | ||
15003 | + { | ||
15004 | + making_const_table = TRUE; | ||
15005 | + switch (GET_MODE_CLASS (GET_MODE (operands[0]))) | ||
15006 | + { | ||
15007 | + case MODE_FLOAT: | ||
15008 | + { | ||
15009 | + REAL_VALUE_TYPE r; | ||
15010 | + char real_string[1024]; | ||
15011 | + REAL_VALUE_FROM_CONST_DOUBLE (r, operands[0]); | ||
15012 | + real_to_decimal(real_string, &r, 1024, 0, 1); | ||
15013 | + asm_fprintf (asm_out_file, "\t.float\t%s\n", real_string); | ||
15014 | + break; | ||
15015 | + } | ||
15016 | + default: | ||
15017 | + assemble_integer (operands[0], 4, 0, 1); | ||
15018 | + break; | ||
15019 | + } | ||
15020 | + return ""; | ||
15021 | + } | ||
15022 | + [(set_attr "length" "4")] | ||
15023 | +) | ||
15024 | + | ||
15025 | +(define_insn "consttable_8" | ||
15026 | + [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_8)] | ||
15027 | + "" | ||
15028 | + { | ||
15029 | + making_const_table = TRUE; | ||
15030 | + switch (GET_MODE_CLASS (GET_MODE (operands[0]))) | ||
15031 | + { | ||
15032 | + case MODE_FLOAT: | ||
15033 | + { | ||
15034 | + REAL_VALUE_TYPE r; | ||
15035 | + char real_string[1024]; | ||
15036 | + REAL_VALUE_FROM_CONST_DOUBLE (r, operands[0]); | ||
15037 | + real_to_decimal(real_string, &r, 1024, 0, 1); | ||
15038 | + asm_fprintf (asm_out_file, "\t.double\t%s\n", real_string); | ||
15039 | + break; | ||
15040 | + } | ||
15041 | + default: | ||
15042 | + assemble_integer(operands[0], 8, 0, 1); | ||
15043 | + break; | ||
15044 | + } | ||
15045 | + return ""; | ||
15046 | + } | ||
15047 | + [(set_attr "length" "8")] | ||
15048 | +) | ||
15049 | + | ||
15050 | +;;============================================================================= | ||
15051 | +;; coprocessor instructions | ||
15052 | +;;----------------------------------------------------------------------------- | ||
15053 | +(define_insn "cop" | ||
15054 | + [ (unspec_volatile [(match_operand 0 "immediate_operand" "Ku03") | ||
15055 | + (match_operand 1 "immediate_operand" "Ku04") | ||
15056 | + (match_operand 2 "immediate_operand" "Ku04") | ||
15057 | + (match_operand 3 "immediate_operand" "Ku04") | ||
15058 | + (match_operand 4 "immediate_operand" "Ku07")] VUNSPEC_COP)] | ||
15059 | + "" | ||
15060 | + "cop\tcp%0, cr%1, cr%2, cr%3, %4" | ||
15061 | + [(set_attr "length" "4")] | ||
15062 | + ) | ||
15063 | + | ||
15064 | +(define_insn "mvcrsi" | ||
15065 | + [ (set (match_operand:SI 0 "avr32_cop_move_operand" "=r,<,Z") | ||
15066 | + (unspec_volatile:SI [(match_operand 1 "immediate_operand" "Ku03,Ku03,Ku03") | ||
15067 | + (match_operand 2 "immediate_operand" "Ku04,Ku04,Ku04")] | ||
15068 | + VUNSPEC_MVCR)) ] | ||
15069 | + "" | ||
15070 | + "@ | ||
15071 | + mvcr.w\tcp%1, %0, cr%2 | ||
15072 | + stcm.w\tcp%1, %0, cr%2 | ||
15073 | + stc.w\tcp%1, %0, cr%2" | ||
15074 | + [(set_attr "length" "4")] | ||
15075 | + ) | ||
15076 | + | ||
15077 | +(define_insn "mvcrdi" | ||
15078 | + [ (set (match_operand:DI 0 "avr32_cop_move_operand" "=r,<,Z") | ||
15079 | + (unspec_volatile:DI [(match_operand 1 "immediate_operand" "Ku03,Ku03,Ku03") | ||
15080 | + (match_operand 2 "immediate_operand" "Ku04,Ku04,Ku04")] | ||
15081 | + VUNSPEC_MVCR)) ] | ||
15082 | + "" | ||
15083 | + "@ | ||
15084 | + mvcr.d\tcp%1, %0, cr%2 | ||
15085 | + stcm.d\tcp%1, %0, cr%2-cr%i2 | ||
15086 | + stc.d\tcp%1, %0, cr%2" | ||
15087 | + [(set_attr "length" "4")] | ||
15088 | + ) | ||
15089 | + | ||
15090 | +(define_insn "mvrcsi" | ||
15091 | + [ (unspec_volatile:SI [(match_operand 0 "immediate_operand" "Ku03,Ku03,Ku03") | ||
15092 | + (match_operand 1 "immediate_operand" "Ku04,Ku04,Ku04") | ||
15093 | + (match_operand:SI 2 "avr32_cop_move_operand" "r,>,Z")] | ||
15094 | + VUNSPEC_MVRC)] | ||
15095 | + "" | ||
15096 | + { | ||
15097 | + switch (which_alternative){ | ||
15098 | + case 0: | ||
15099 | + return "mvrc.w\tcp%0, cr%1, %2"; | ||
15100 | + case 1: | ||
15101 | + return "ldcm.w\tcp%0, %2, cr%1"; | ||
15102 | + case 2: | ||
15103 | + return "ldc.w\tcp%0, cr%1, %2"; | ||
15104 | + default: | ||
15105 | + abort(); | ||
15106 | + } | ||
15107 | + } | ||
15108 | + [(set_attr "length" "4")] | ||
15109 | + ) | ||
15110 | + | ||
15111 | +(define_insn "mvrcdi" | ||
15112 | + [ (unspec_volatile:DI [(match_operand 0 "immediate_operand" "Ku03,Ku03,Ku03") | ||
15113 | + (match_operand 1 "immediate_operand" "Ku04,Ku04,Ku04") | ||
15114 | + (match_operand:DI 2 "avr32_cop_move_operand" "r,>,Z")] | ||
15115 | + VUNSPEC_MVRC)] | ||
15116 | + "" | ||
15117 | + { | ||
15118 | + switch (which_alternative){ | ||
15119 | + case 0: | ||
15120 | + return "mvrc.d\tcp%0, cr%1, %2"; | ||
15121 | + case 1: | ||
15122 | + return "ldcm.d\tcp%0, %2, cr%1-cr%i1"; | ||
15123 | + case 2: | ||
15124 | + return "ldc.d\tcp%0, cr%1, %2"; | ||
15125 | + default: | ||
15126 | + abort(); | ||
15127 | + } | ||
15128 | + } | ||
15129 | + [(set_attr "length" "4")] | ||
15130 | + ) | ||
15131 | + | ||
15132 | +;;============================================================================= | ||
15133 | +;; epilogue | ||
15134 | +;;----------------------------------------------------------------------------- | ||
15135 | +;; This pattern emits RTL for exit from a function. The function exit is | ||
15136 | +;; responsible for deallocating the stack frame, restoring callee saved | ||
15137 | +;; registers and emitting the return instruction. | ||
15138 | +;; ToDo: using TARGET_ASM_FUNCTION_PROLOGUE instead. | ||
15139 | +;;============================================================================= | ||
15140 | +(define_expand "epilogue" | ||
15141 | + [(unspec_volatile [(return)] VUNSPEC_EPILOGUE)] | ||
15142 | + "" | ||
15143 | + " | ||
15144 | + if (USE_RETURN_INSN (FALSE)){ | ||
15145 | + emit_jump_insn (gen_return ()); | ||
15146 | + DONE; | ||
15147 | + } | ||
15148 | + emit_jump_insn (gen_rtx_UNSPEC_VOLATILE (VOIDmode, | ||
15149 | + gen_rtvec (1, | ||
15150 | + gen_rtx_RETURN (VOIDmode)), | ||
15151 | + VUNSPEC_EPILOGUE)); | ||
15152 | + DONE; | ||
15153 | + " | ||
15154 | + ) | ||
15155 | + | ||
15156 | +(define_insn "*epilogue_insns" | ||
15157 | + [(unspec_volatile [(return)] VUNSPEC_EPILOGUE)] | ||
15158 | + "" | ||
15159 | + { | ||
15160 | + avr32_output_return_instruction (FALSE, FALSE, NULL, NULL); | ||
15161 | + return ""; | ||
15162 | + } | ||
15163 | + ; Length is absolute worst case | ||
15164 | + [(set_attr "type" "branch") | ||
15165 | + (set_attr "length" "12")] | ||
15166 | + ) | ||
15167 | + | ||
15168 | +(define_insn "*epilogue_insns_ret_imm" | ||
15169 | + [(parallel [(set (reg RETVAL_REGNUM) (match_operand 0 "immediate_operand" "i")) | ||
15170 | + (use (reg RETVAL_REGNUM)) | ||
15171 | + (unspec_volatile [(return)] VUNSPEC_EPILOGUE)])] | ||
15172 | + "((INTVAL(operands[0]) == -1) || (INTVAL(operands[0]) == 0) || (INTVAL(operands[0]) == 1))" | ||
15173 | + { | ||
15174 | + avr32_output_return_instruction (FALSE, FALSE, NULL, operands[0]); | ||
15175 | + return ""; | ||
15176 | + } | ||
15177 | + ; Length is absolute worst case | ||
15178 | + [(set_attr "type" "branch") | ||
15179 | + (set_attr "length" "12")] | ||
15180 | + ) | ||
15181 | + | ||
15182 | +(define_insn "sibcall_epilogue" | ||
15183 | + [(unspec_volatile [(const_int 0)] VUNSPEC_EPILOGUE)] | ||
15184 | + "" | ||
15185 | + { | ||
15186 | + avr32_output_return_instruction (FALSE, FALSE, NULL, NULL); | ||
15187 | + return ""; | ||
15188 | + } | ||
15189 | +;; Length is absolute worst case | ||
15190 | + [(set_attr "type" "branch") | ||
15191 | + (set_attr "length" "12")] | ||
15192 | + ) | ||
15193 | + | ||
15194 | +(define_insn "*sibcall_epilogue_insns_ret_imm" | ||
15195 | + [(parallel [(set (reg RETVAL_REGNUM) (match_operand 0 "immediate_operand" "i")) | ||
15196 | + (use (reg RETVAL_REGNUM)) | ||
15197 | + (unspec_volatile [(const_int 0)] VUNSPEC_EPILOGUE)])] | ||
15198 | + "((INTVAL(operands[0]) == -1) || (INTVAL(operands[0]) == 0) || (INTVAL(operands[0]) == 1))" | ||
15199 | + { | ||
15200 | + avr32_output_return_instruction (FALSE, FALSE, NULL, operands[0]); | ||
15201 | + return ""; | ||
15202 | + } | ||
15203 | + ; Length is absolute worst case | ||
15204 | + [(set_attr "type" "branch") | ||
15205 | + (set_attr "length" "12")] | ||
15206 | + ) | ||
15207 | + | ||
15208 | +(define_insn "ldxi" | ||
15209 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
15210 | + (mem:SI (plus:SI | ||
15211 | + (match_operand:SI 1 "register_operand" "r") | ||
15212 | + (mult:SI (zero_extract:SI (match_operand:SI 2 "register_operand" "r") | ||
15213 | + (const_int 8) | ||
15214 | + (match_operand:SI 3 "immediate_operand" "Ku05")) | ||
15215 | + (const_int 4)))))] | ||
15216 | + "(INTVAL(operands[3]) == 24 || INTVAL(operands[3]) == 16 || INTVAL(operands[3]) == 8 | ||
15217 | + || INTVAL(operands[3]) == 0)" | ||
15218 | + { | ||
15219 | + switch ( INTVAL(operands[3]) ){ | ||
15220 | + case 0: | ||
15221 | + return "ld.w %0, %1[%2:b << 2]"; | ||
15222 | + case 8: | ||
15223 | + return "ld.w %0, %1[%2:l << 2]"; | ||
15224 | + case 16: | ||
15225 | + return "ld.w %0, %1[%2:u << 2]"; | ||
15226 | + case 24: | ||
15227 | + return "ld.w %0, %1[%2:t << 2]"; | ||
15228 | + default: | ||
15229 | + internal_error("illegal operand for ldxi"); | ||
15230 | + } | ||
15231 | + } | ||
15232 | + [(set_attr "type" "load") | ||
15233 | + (set_attr "length" "4") | ||
15234 | + (set_attr "cc" "none")]) | ||
15235 | + | ||
15236 | + | ||
15237 | + | ||
15238 | + | ||
15239 | + | ||
15240 | + | ||
15241 | +;;============================================================================= | ||
15242 | +;; Peephole optimizing | ||
15243 | +;;----------------------------------------------------------------------------- | ||
15244 | +;; Changing | ||
15245 | +;; sub r8, r7, 8 | ||
15246 | +;; st.w r8[0x0], r12 | ||
15247 | +;; to | ||
15248 | +;; sub r8, r7, 8 | ||
15249 | +;; st.w r7[-0x8], r12 | ||
15250 | +;;============================================================================= | ||
15251 | +; (set (reg:SI 9 r8) | ||
15252 | +; (plus:SI (reg/f:SI 6 r7) | ||
15253 | +; (const_int ...))) | ||
15254 | +; (set (mem:SI (reg:SI 9 r8)) | ||
15255 | +; (reg:SI 12 r12)) | ||
15256 | +(define_peephole2 | ||
15257 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15258 | + (plus:SI (match_operand:SI 1 "register_operand" "") | ||
15259 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
15260 | + (set (mem:SI (match_dup 0)) | ||
15261 | + (match_operand:SI 3 "register_operand" ""))] | ||
15262 | + "REGNO(operands[0]) != REGNO(operands[1])" | ||
15263 | + [(set (match_dup 0) | ||
15264 | + (plus:SI (match_dup 1) | ||
15265 | + (match_dup 2))) | ||
15266 | + (set (mem:SI (plus:SI (match_dup 1) | ||
15267 | + (match_dup 2))) | ||
15268 | + (match_dup 3))] | ||
15269 | + "") | ||
15270 | + | ||
15271 | +;;============================================================================= | ||
15272 | +;; Peephole optimizing | ||
15273 | +;;----------------------------------------------------------------------------- | ||
15274 | +;; Changing | ||
15275 | +;; sub r6, r7, 4 | ||
15276 | +;; ld.w r6, r6[0x0] | ||
15277 | +;; to | ||
15278 | +;; sub r6, r7, 4 | ||
15279 | +;; ld.w r6, r7[-0x4] | ||
15280 | +;;============================================================================= | ||
15281 | +; (set (reg:SI 7 r6) | ||
15282 | +; (plus:SI (reg/f:SI 6 r7) | ||
15283 | +; (const_int -4 [0xfffffffc]))) | ||
15284 | +; (set (reg:SI 7 r6) | ||
15285 | +; (mem:SI (reg:SI 7 r6))) | ||
15286 | +(define_peephole2 | ||
15287 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15288 | + (plus:SI (match_operand:SI 1 "register_operand" "") | ||
15289 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
15290 | + (set (match_operand:SI 3 "register_operand" "") | ||
15291 | + (mem:SI (match_dup 0)))] | ||
15292 | + "REGNO(operands[0]) != REGNO(operands[1])" | ||
15293 | + [(set (match_dup 0) | ||
15294 | + (plus:SI (match_dup 1) | ||
15295 | + (match_dup 2))) | ||
15296 | + (set (match_dup 3) | ||
15297 | + (mem:SI (plus:SI (match_dup 1) | ||
15298 | + (match_dup 2))))] | ||
15299 | + "") | ||
15300 | + | ||
15301 | +;;============================================================================= | ||
15302 | +;; Peephole optimizing | ||
15303 | +;;----------------------------------------------------------------------------- | ||
15304 | +;; Changing | ||
15305 | +;; ld.sb r0, r7[-0x6] | ||
15306 | +;; cashs.b r0 | ||
15307 | +;; to | ||
15308 | +;; ld.sb r0, r7[-0x6] | ||
15309 | +;;============================================================================= | ||
15310 | +(define_peephole2 | ||
15311 | + [(set (match_operand:QI 0 "register_operand" "") | ||
15312 | + (match_operand:QI 1 "load_sb_memory_operand" "")) | ||
15313 | + (set (match_operand:SI 2 "register_operand" "") | ||
15314 | + (sign_extend:SI (match_dup 0)))] | ||
15315 | + "(REGNO(operands[0]) == REGNO(operands[2]) || peep2_reg_dead_p(2, operands[0]))" | ||
15316 | + [(set (match_dup 2) | ||
15317 | + (sign_extend:SI (match_dup 1)))] | ||
15318 | + "") | ||
15319 | + | ||
15320 | +;;============================================================================= | ||
15321 | +;; Peephole optimizing | ||
15322 | +;;----------------------------------------------------------------------------- | ||
15323 | +;; Changing | ||
15324 | +;; ld.ub r0, r7[-0x6] | ||
15325 | +;; cashu.b r0 | ||
15326 | +;; to | ||
15327 | +;; ld.ub r0, r7[-0x6] | ||
15328 | +;;============================================================================= | ||
15329 | +(define_peephole2 | ||
15330 | + [(set (match_operand:QI 0 "register_operand" "") | ||
15331 | + (match_operand:QI 1 "memory_operand" "")) | ||
15332 | + (set (match_operand:SI 2 "register_operand" "") | ||
15333 | + (zero_extend:SI (match_dup 0)))] | ||
15334 | + "(REGNO(operands[0]) == REGNO(operands[2])) || peep2_reg_dead_p(2, operands[0])" | ||
15335 | + [(set (match_dup 2) | ||
15336 | + (zero_extend:SI (match_dup 1)))] | ||
15337 | + "") | ||
15338 | + | ||
15339 | +;;============================================================================= | ||
15340 | +;; Peephole optimizing | ||
15341 | +;;----------------------------------------------------------------------------- | ||
15342 | +;; Changing | ||
15343 | +;; ld.sh r0, r7[-0x6] | ||
15344 | +;; casts.h r0 | ||
15345 | +;; to | ||
15346 | +;; ld.sh r0, r7[-0x6] | ||
15347 | +;;============================================================================= | ||
15348 | +(define_peephole2 | ||
15349 | + [(set (match_operand:HI 0 "register_operand" "") | ||
15350 | + (match_operand:HI 1 "memory_operand" "")) | ||
15351 | + (set (match_operand:SI 2 "register_operand" "") | ||
15352 | + (sign_extend:SI (match_dup 0)))] | ||
15353 | + "(REGNO(operands[0]) == REGNO(operands[2])) || peep2_reg_dead_p(2, operands[0])" | ||
15354 | + [(set (match_dup 2) | ||
15355 | + (sign_extend:SI (match_dup 1)))] | ||
15356 | + "") | ||
15357 | + | ||
15358 | +;;============================================================================= | ||
15359 | +;; Peephole optimizing | ||
15360 | +;;----------------------------------------------------------------------------- | ||
15361 | +;; Changing | ||
15362 | +;; ld.uh r0, r7[-0x6] | ||
15363 | +;; castu.h r0 | ||
15364 | +;; to | ||
15365 | +;; ld.uh r0, r7[-0x6] | ||
15366 | +;;============================================================================= | ||
15367 | +(define_peephole2 | ||
15368 | + [(set (match_operand:HI 0 "register_operand" "") | ||
15369 | + (match_operand:HI 1 "memory_operand" "")) | ||
15370 | + (set (match_operand:SI 2 "register_operand" "") | ||
15371 | + (zero_extend:SI (match_dup 0)))] | ||
15372 | + "(REGNO(operands[0]) == REGNO(operands[2])) || peep2_reg_dead_p(2, operands[0])" | ||
15373 | + [(set (match_dup 2) | ||
15374 | + (zero_extend:SI (match_dup 1)))] | ||
15375 | + "") | ||
15376 | + | ||
15377 | +;;============================================================================= | ||
15378 | +;; Peephole optimizing | ||
15379 | +;;----------------------------------------------------------------------------- | ||
15380 | +;; Changing | ||
15381 | +;; mul rd, rx, ry | ||
15382 | +;; add rd2, rd | ||
15383 | +;; to | ||
15384 | +;; mac rd2, rx, ry | ||
15385 | +;;============================================================================= | ||
15386 | +(define_peephole2 | ||
15387 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15388 | + (mult:SI (match_operand:SI 1 "register_operand" "") | ||
15389 | + (match_operand:SI 2 "register_operand" ""))) | ||
15390 | + (set (match_operand:SI 3 "register_operand" "") | ||
15391 | + (plus:SI (match_dup 3) | ||
15392 | + (match_dup 0)))] | ||
15393 | + "peep2_reg_dead_p(2, operands[0])" | ||
15394 | + [(set (match_dup 3) | ||
15395 | + (plus:SI (mult:SI (match_dup 1) | ||
15396 | + (match_dup 2)) | ||
15397 | + (match_dup 3)))] | ||
15398 | + "") | ||
15399 | + | ||
15400 | + | ||
15401 | + | ||
15402 | +;;============================================================================= | ||
15403 | +;; Peephole optimizing | ||
15404 | +;;----------------------------------------------------------------------------- | ||
15405 | +;; Changing | ||
15406 | +;; bfextu rd, rs, k5, 1 or and(h/l) rd, one_bit_set_mask | ||
15407 | +;; to | ||
15408 | +;; bld rs, k5 | ||
15409 | +;; | ||
15410 | +;; If rd is dead after the operation. | ||
15411 | +;;============================================================================= | ||
15412 | +(define_peephole2 | ||
15413 | + [ (set (match_operand:SI 0 "register_operand" "") | ||
15414 | + (zero_extract:SI (match_operand:SI 1 "register_operand" "") | ||
15415 | + (const_int 1) | ||
15416 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
15417 | + (set (cc0) | ||
15418 | + (match_dup 0))] | ||
15419 | + "peep2_reg_dead_p(2, operands[0])" | ||
15420 | + [(set (cc0) | ||
15421 | + (and:SI (match_dup 1) | ||
15422 | + (match_dup 2)))] | ||
15423 | + "operands[2] = GEN_INT(1 << INTVAL(operands[2]));") | ||
15424 | + | ||
15425 | +(define_peephole2 | ||
15426 | + [ (set (match_operand:SI 0 "register_operand" "") | ||
15427 | + (and:SI (match_operand:SI 1 "register_operand" "") | ||
15428 | + (match_operand:SI 2 "one_bit_set_operand" ""))) | ||
15429 | + (set (cc0) | ||
15430 | + (match_dup 0))] | ||
15431 | + "peep2_reg_dead_p(2, operands[0])" | ||
15432 | + [(set (cc0) | ||
15433 | + (and:SI (match_dup 1) | ||
15434 | + (match_dup 2)))] | ||
15435 | + "") | ||
15436 | + | ||
15437 | +;;============================================================================= | ||
15438 | +;; Peephole optimizing | ||
15439 | +;;----------------------------------------------------------------------------- | ||
15440 | +;; Load with extracted index: ld.w Rd, Rb[Ri:{t/u/b/l} << 2] | ||
15441 | +;; | ||
15442 | +;;============================================================================= | ||
15443 | + | ||
15444 | + | ||
15445 | +(define_peephole | ||
15446 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15447 | + (zero_extract:SI (match_operand:SI 1 "register_operand" "") | ||
15448 | + (const_int 8) | ||
15449 | + (match_operand:SI 2 "avr32_extract_shift_operand" ""))) | ||
15450 | + (set (match_operand:SI 3 "register_operand" "") | ||
15451 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15452 | + (match_operand:SI 4 "register_operand" ""))))] | ||
15453 | + | ||
15454 | + "(dead_or_set_p(insn, operands[0]))" | ||
15455 | + { | ||
15456 | + switch ( INTVAL(operands[2]) ){ | ||
15457 | + case 0: | ||
15458 | + return "ld.w %3, %4[%1:b << 2]"; | ||
15459 | + case 8: | ||
15460 | + return "ld.w %3, %4[%1:l << 2]"; | ||
15461 | + case 16: | ||
15462 | + return "ld.w %3, %4[%1:u << 2]"; | ||
15463 | + case 24: | ||
15464 | + return "ld.w %3, %4[%1:t << 2]"; | ||
15465 | + default: | ||
15466 | + internal_error("illegal operand for ldxi"); | ||
15467 | + } | ||
15468 | + } | ||
15469 | + [(set_attr "type" "load") | ||
15470 | + (set_attr "length" "4") | ||
15471 | + (set_attr "cc" "clobber")] | ||
15472 | + ) | ||
15473 | + | ||
15474 | + | ||
15475 | + | ||
15476 | +(define_peephole | ||
15477 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15478 | + (and:SI (match_operand:SI 1 "register_operand" "") (const_int 255))) | ||
15479 | + (set (match_operand:SI 2 "register_operand" "") | ||
15480 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15481 | + (match_operand:SI 3 "register_operand" ""))))] | ||
15482 | + | ||
15483 | + "(dead_or_set_p(insn, operands[0]))" | ||
15484 | + | ||
15485 | + "ld.w %2, %3[%1:b << 2]" | ||
15486 | + [(set_attr "type" "load") | ||
15487 | + (set_attr "length" "4") | ||
15488 | + (set_attr "cc" "clobber")] | ||
15489 | + ) | ||
15490 | + | ||
15491 | + | ||
15492 | +(define_peephole2 | ||
15493 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15494 | + (zero_extract:SI (match_operand:SI 1 "register_operand" "") | ||
15495 | + (const_int 8) | ||
15496 | + (match_operand:SI 2 "avr32_extract_shift_operand" ""))) | ||
15497 | + (set (match_operand:SI 3 "register_operand" "") | ||
15498 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15499 | + (match_operand:SI 4 "register_operand" ""))))] | ||
15500 | + | ||
15501 | + "(peep2_reg_dead_p(2, operands[0])) | ||
15502 | + || (REGNO(operands[0]) == REGNO(operands[3]))" | ||
15503 | + [(set (match_dup 3) | ||
15504 | + (mem:SI (plus:SI | ||
15505 | + (match_dup 4) | ||
15506 | + (mult:SI (zero_extract:SI (match_dup 1) | ||
15507 | + (const_int 8) | ||
15508 | + (match_dup 2)) | ||
15509 | + (const_int 4)))))] | ||
15510 | + ) | ||
15511 | + | ||
15512 | +(define_peephole2 | ||
15513 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15514 | + (zero_extend:SI (match_operand:QI 1 "register_operand" ""))) | ||
15515 | + (set (match_operand:SI 2 "register_operand" "") | ||
15516 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15517 | + (match_operand:SI 3 "register_operand" ""))))] | ||
15518 | + | ||
15519 | + "(peep2_reg_dead_p(2, operands[0])) | ||
15520 | + || (REGNO(operands[0]) == REGNO(operands[2]))" | ||
15521 | + [(set (match_dup 2) | ||
15522 | + (mem:SI (plus:SI | ||
15523 | + (match_dup 3) | ||
15524 | + (mult:SI (zero_extract:SI (match_dup 1) | ||
15525 | + (const_int 8) | ||
15526 | + (const_int 0)) | ||
15527 | + (const_int 4)))))] | ||
15528 | + "operands[1] = gen_rtx_REG(SImode, REGNO(operands[1]));" | ||
15529 | + ) | ||
15530 | + | ||
15531 | + | ||
15532 | +(define_peephole2 | ||
15533 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15534 | + (and:SI (match_operand:SI 1 "register_operand" "") | ||
15535 | + (const_int 255))) | ||
15536 | + (set (match_operand:SI 2 "register_operand" "") | ||
15537 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15538 | + (match_operand:SI 3 "register_operand" ""))))] | ||
15539 | + | ||
15540 | + "(peep2_reg_dead_p(2, operands[0])) | ||
15541 | + || (REGNO(operands[0]) == REGNO(operands[2]))" | ||
15542 | + [(set (match_dup 2) | ||
15543 | + (mem:SI (plus:SI | ||
15544 | + (match_dup 3) | ||
15545 | + (mult:SI (zero_extract:SI (match_dup 1) | ||
15546 | + (const_int 8) | ||
15547 | + (const_int 0)) | ||
15548 | + (const_int 4)))))] | ||
15549 | + "" | ||
15550 | + ) | ||
15551 | + | ||
15552 | + | ||
15553 | + | ||
15554 | +(define_peephole2 | ||
15555 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15556 | + (lshiftrt:SI (match_operand:SI 1 "register_operand" "") | ||
15557 | + (const_int 24))) | ||
15558 | + (set (match_operand:SI 2 "register_operand" "") | ||
15559 | + (mem:SI (plus:SI (mult:SI (match_dup 0) (const_int 4)) | ||
15560 | + (match_operand:SI 3 "register_operand" ""))))] | ||
15561 | + | ||
15562 | + "(peep2_reg_dead_p(2, operands[0])) | ||
15563 | + || (REGNO(operands[0]) == REGNO(operands[2]))" | ||
15564 | + [(set (match_dup 2) | ||
15565 | + (mem:SI (plus:SI | ||
15566 | + (match_dup 3) | ||
15567 | + (mult:SI (zero_extract:SI (match_dup 1) | ||
15568 | + (const_int 8) | ||
15569 | + (const_int 24)) | ||
15570 | + (const_int 4)))))] | ||
15571 | + "" | ||
15572 | + ) | ||
15573 | + | ||
15574 | + | ||
15575 | +;;************************************************ | ||
15576 | +;; ANDN | ||
15577 | +;; | ||
15578 | +;;************************************************ | ||
15579 | + | ||
15580 | + | ||
15581 | +(define_peephole2 | ||
15582 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15583 | + (not:SI (match_operand:SI 1 "register_operand" ""))) | ||
15584 | + (set (match_operand:SI 2 "register_operand" "") | ||
15585 | + (and:SI (match_dup 2) | ||
15586 | + (match_dup 0)))] | ||
15587 | + "peep2_reg_dead_p(2, operands[0])" | ||
15588 | + | ||
15589 | + [(set (match_dup 2) | ||
15590 | + (and:SI (match_dup 2) | ||
15591 | + (not:SI (match_dup 1)) | ||
15592 | + ))] | ||
15593 | + "" | ||
15594 | +) | ||
15595 | + | ||
15596 | +(define_peephole2 | ||
15597 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15598 | + (not:SI (match_operand:SI 1 "register_operand" ""))) | ||
15599 | + (set (match_operand:SI 2 "register_operand" "") | ||
15600 | + (and:SI (match_dup 0) | ||
15601 | + (match_dup 2) | ||
15602 | + ))] | ||
15603 | + "peep2_reg_dead_p(2, operands[0])" | ||
15604 | + | ||
15605 | + [(set (match_dup 2) | ||
15606 | + (and:SI (match_dup 2) | ||
15607 | + (not:SI (match_dup 1)) | ||
15608 | + ))] | ||
15609 | + | ||
15610 | + "" | ||
15611 | +) | ||
15612 | + | ||
15613 | + | ||
15614 | +;;================================================================= | ||
15615 | +;; Addabs peephole | ||
15616 | +;;================================================================= | ||
15617 | + | ||
15618 | +(define_peephole | ||
15619 | + [(set (match_operand:SI 2 "register_operand" "=r") | ||
15620 | + (abs:SI (match_operand:SI 1 "register_operand" "r"))) | ||
15621 | + (set (match_operand:SI 0 "register_operand" "=r") | ||
15622 | + (plus:SI (match_operand:SI 3 "register_operand" "r") | ||
15623 | + (match_dup 2)))] | ||
15624 | + "dead_or_set_p(insn, operands[2])" | ||
15625 | + "addabs %0, %3, %1" | ||
15626 | + [(set_attr "length" "4") | ||
15627 | + (set_attr "cc" "set_z")]) | ||
15628 | + | ||
15629 | +(define_peephole | ||
15630 | + [(set (match_operand:SI 2 "register_operand" "=r") | ||
15631 | + (abs:SI (match_operand:SI 1 "register_operand" "r"))) | ||
15632 | + (set (match_operand:SI 0 "register_operand" "=r") | ||
15633 | + (plus:SI (match_dup 2) | ||
15634 | + (match_operand:SI 3 "register_operand" "r")))] | ||
15635 | + "dead_or_set_p(insn, operands[2])" | ||
15636 | + "addabs %0, %3, %1" | ||
15637 | + [(set_attr "length" "4") | ||
15638 | + (set_attr "cc" "set_z")]) | ||
15639 | + | ||
15640 | + | ||
15641 | +;;================================================================= | ||
15642 | +;; Detect roundings | ||
15643 | +;;================================================================= | ||
15644 | + | ||
15645 | +(define_insn "*round" | ||
15646 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
15647 | + (ashiftrt:SI (plus:SI (match_operand:SI 1 "register_operand" "0") | ||
15648 | + (match_operand:SI 2 "immediate_operand" "i")) | ||
15649 | + (match_operand:SI 3 "immediate_operand" "i")))] | ||
15650 | + "avr32_rnd_operands(operands[2], operands[3])" | ||
15651 | + | ||
15652 | + "satrnds %0 >> %3, 31" | ||
15653 | + | ||
15654 | + [(set_attr "type" "alu_sat") | ||
15655 | + (set_attr "length" "4")] | ||
15656 | + | ||
15657 | + ) | ||
15658 | + | ||
15659 | + | ||
15660 | +(define_peephole2 | ||
15661 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15662 | + (plus:SI (match_dup 0) | ||
15663 | + (match_operand:SI 1 "immediate_operand" ""))) | ||
15664 | + (set (match_dup 0) | ||
15665 | + (ashiftrt:SI (match_dup 0) | ||
15666 | + (match_operand:SI 2 "immediate_operand" "")))] | ||
15667 | + "avr32_rnd_operands(operands[1], operands[2])" | ||
15668 | + | ||
15669 | + [(set (match_dup 0) | ||
15670 | + (ashiftrt:SI (plus:SI (match_dup 0) | ||
15671 | + (match_dup 1)) | ||
15672 | + (match_dup 2)))] | ||
15673 | + ) | ||
15674 | + | ||
15675 | +(define_peephole | ||
15676 | + [(set (match_operand:SI 0 "register_operand" "r") | ||
15677 | + (plus:SI (match_dup 0) | ||
15678 | + (match_operand:SI 1 "immediate_operand" "i"))) | ||
15679 | + (set (match_dup 0) | ||
15680 | + (ashiftrt:SI (match_dup 0) | ||
15681 | + (match_operand:SI 2 "immediate_operand" "i")))] | ||
15682 | + "avr32_rnd_operands(operands[1], operands[2])" | ||
15683 | + | ||
15684 | + "satrnds %0 >> %2, 31" | ||
15685 | + | ||
15686 | + [(set_attr "type" "alu_sat") | ||
15687 | + (set_attr "length" "4") | ||
15688 | + (set_attr "cc" "clobber")] | ||
15689 | + | ||
15690 | + ) | ||
15691 | + | ||
15692 | + | ||
15693 | + | ||
15694 | + | ||
15695 | +;;================================================================= | ||
15696 | +;; Conditional Subtract | ||
15697 | +;;================================================================= | ||
15698 | + | ||
15699 | + | ||
15700 | +(define_peephole | ||
15701 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15702 | + (minus:SI (match_operand:SI 1 "register_operand" "") | ||
15703 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
15704 | + (set (match_dup 1) | ||
15705 | + (unspec:SI [(match_operand 5 "avr32_comparison_operator" "") | ||
15706 | + (match_dup 0) | ||
15707 | + (match_dup 1) | ||
15708 | + (match_operand 3 "general_operand" "") | ||
15709 | + (match_operand 4 "general_operand" "")] | ||
15710 | + UNSPEC_MOVSICC))] | ||
15711 | + | ||
15712 | + "(dead_or_set_p(insn, operands[0])) && avr32_const_ok_for_constraint_p(INTVAL(operands[2]), 'K', \"Ks08\")" | ||
15713 | + | ||
15714 | + { | ||
15715 | + | ||
15716 | + operands[5] = avr32_output_cmp(operands[5], GET_MODE(operands[3]), operands[3], operands[4]); | ||
15717 | + | ||
15718 | + return "sub%5 %1, %2"; | ||
15719 | + } | ||
15720 | + | ||
15721 | + [(set_attr "length" "10") | ||
15722 | + (set_attr "cc" "clobber")] | ||
15723 | + ) | ||
15724 | + | ||
15725 | +(define_peephole | ||
15726 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15727 | + (plus:SI (match_operand:SI 1 "register_operand" "") | ||
15728 | + (match_operand:SI 2 "immediate_operand" ""))) | ||
15729 | + (set (match_dup 1) | ||
15730 | + (unspec:SI [(match_operand 5 "avr32_comparison_operator" "") | ||
15731 | + (match_dup 0) | ||
15732 | + (match_dup 1) | ||
15733 | + (match_operand 3 "general_operand" "") | ||
15734 | + (match_operand 4 "general_operand" "")] | ||
15735 | + UNSPEC_MOVSICC))] | ||
15736 | + | ||
15737 | + "(dead_or_set_p(insn, operands[0]) && avr32_const_ok_for_constraint_p(INTVAL(operands[2]), 'I', \"Is08\"))" | ||
15738 | + | ||
15739 | + { | ||
15740 | + operands[5] = avr32_output_cmp(operands[5], GET_MODE(operands[3]), operands[3], operands[4]); | ||
15741 | + | ||
15742 | + return "sub%5 %1, %n2"; | ||
15743 | + } | ||
15744 | + [(set_attr "length" "10") | ||
15745 | + (set_attr "cc" "clobber")] | ||
15746 | + ) | ||
15747 | + | ||
15748 | +;;================================================================= | ||
15749 | +;; mcall | ||
15750 | +;;================================================================= | ||
15751 | +(define_peephole | ||
15752 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15753 | + (match_operand 1 "avr32_const_pool_ref_operand" "")) | ||
15754 | + (parallel [(call (mem:SI (match_dup 0)) | ||
15755 | + (match_operand 2 "" "")) | ||
15756 | + (clobber (reg:SI LR_REGNUM))])] | ||
15757 | + "dead_or_set_p(insn, operands[0])" | ||
15758 | + "mcall %1" | ||
15759 | + [(set_attr "type" "call") | ||
15760 | + (set_attr "length" "4") | ||
15761 | + (set_attr "cc" "clobber")] | ||
15762 | +) | ||
15763 | + | ||
15764 | +(define_peephole | ||
15765 | + [(set (match_operand:SI 2 "register_operand" "") | ||
15766 | + (match_operand 1 "avr32_const_pool_ref_operand" "")) | ||
15767 | + (parallel [(set (match_operand 0 "register_operand" "") | ||
15768 | + (call (mem:SI (match_dup 2)) | ||
15769 | + (match_operand 3 "" ""))) | ||
15770 | + (clobber (reg:SI LR_REGNUM))])] | ||
15771 | + "dead_or_set_p(insn, operands[2])" | ||
15772 | + "mcall %1" | ||
15773 | + [(set_attr "type" "call") | ||
15774 | + (set_attr "length" "4") | ||
15775 | + (set_attr "cc" "call_set")] | ||
15776 | +) | ||
15777 | + | ||
15778 | + | ||
15779 | +(define_peephole2 | ||
15780 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15781 | + (match_operand 1 "avr32_const_pool_ref_operand" "")) | ||
15782 | + (parallel [(call (mem:SI (match_dup 0)) | ||
15783 | + (match_operand 2 "" "")) | ||
15784 | + (clobber (reg:SI LR_REGNUM))])] | ||
15785 | + "peep2_reg_dead_p(2, operands[0])" | ||
15786 | + [(parallel [(call (mem:SI (match_dup 1)) | ||
15787 | + (match_dup 2)) | ||
15788 | + (clobber (reg:SI LR_REGNUM))])] | ||
15789 | + "" | ||
15790 | +) | ||
15791 | + | ||
15792 | +(define_peephole2 | ||
15793 | + [(set (match_operand:SI 0 "register_operand" "") | ||
15794 | + (match_operand 1 "avr32_const_pool_ref_operand" "")) | ||
15795 | + (parallel [(set (match_operand 2 "register_operand" "") | ||
15796 | + (call (mem:SI (match_dup 0)) | ||
15797 | + (match_operand 3 "" ""))) | ||
15798 | + (clobber (reg:SI LR_REGNUM))])] | ||
15799 | + "(peep2_reg_dead_p(2, operands[0]) || (REGNO(operands[2]) == REGNO(operands[0])))" | ||
15800 | + [(parallel [(set (match_dup 2) | ||
15801 | + (call (mem:SI (match_dup 1)) | ||
15802 | + (match_dup 3))) | ||
15803 | + (clobber (reg:SI LR_REGNUM))])] | ||
15804 | + "" | ||
15805 | +) | ||
15806 | + | ||
15807 | +;;================================================================= | ||
15808 | +;; Returning a value | ||
15809 | +;;================================================================= | ||
15810 | + | ||
15811 | + | ||
15812 | +(define_peephole | ||
15813 | + [(set (match_operand 0 "register_operand" "") | ||
15814 | + (match_operand 1 "register_operand" "")) | ||
15815 | + (return)] | ||
15816 | + "USE_RETURN_INSN (TRUE) && (REGNO(operands[0]) == RETVAL_REGNUM) | ||
15817 | + && (REGNO(operands[1]) != LR_REGNUM) | ||
15818 | + && (REGNO_REG_CLASS(REGNO(operands[1])) == GENERAL_REGS)" | ||
15819 | + "retal %1" | ||
15820 | + [(set_attr "type" "call") | ||
15821 | + (set_attr "length" "2")] | ||
15822 | + ) | ||
15823 | + | ||
15824 | + | ||
15825 | +(define_peephole | ||
15826 | + [(set (match_operand 0 "register_operand" "r") | ||
15827 | + (match_operand 1 "immediate_operand" "i")) | ||
15828 | + (return)] | ||
15829 | + "(USE_RETURN_INSN (FALSE) && (REGNO(operands[0]) == RETVAL_REGNUM) && | ||
15830 | + ((INTVAL(operands[1]) == -1) || (INTVAL(operands[1]) == 0) || (INTVAL(operands[1]) == 1)))" | ||
15831 | + { | ||
15832 | + avr32_output_return_instruction (TRUE, FALSE, NULL, operands[1]); | ||
15833 | + return ""; | ||
15834 | + } | ||
15835 | + [(set_attr "type" "call") | ||
15836 | + (set_attr "length" "4")] | ||
15837 | + ) | ||
15838 | + | ||
15839 | +(define_peephole | ||
15840 | + [(set (match_operand 0 "register_operand" "r") | ||
15841 | + (match_operand 1 "immediate_operand" "i")) | ||
15842 | + (unspec_volatile [(return)] VUNSPEC_EPILOGUE)] | ||
15843 | + "(REGNO(operands[0]) == RETVAL_REGNUM) && | ||
15844 | + ((INTVAL(operands[1]) == -1) || (INTVAL(operands[1]) == 0) || (INTVAL(operands[1]) == 1))" | ||
15845 | + { | ||
15846 | + avr32_output_return_instruction (FALSE, FALSE, NULL, operands[1]); | ||
15847 | + return ""; | ||
15848 | + } | ||
15849 | + ; Length is absolute worst case | ||
15850 | + [(set_attr "type" "branch") | ||
15851 | + (set_attr "length" "12")] | ||
15852 | + ) | ||
15853 | + | ||
15854 | +(define_peephole | ||
15855 | + [(set (match_operand 0 "register_operand" "r") | ||
15856 | + (unspec [(match_operand 1 "avr32_comparison_operator" "") | ||
15857 | + (match_operand 2 "register_immediate_operand" "rKs08") | ||
15858 | + (match_operand 3 "register_immediate_operand" "rKs08") | ||
15859 | + (match_operand 4 "register_immediate_operand" "r") | ||
15860 | + (match_operand 5 "register_immediate_operand" "rKs21") | ||
15861 | + ] | ||
15862 | + UNSPEC_MOVSICC )) | ||
15863 | + (return)] | ||
15864 | + "USE_RETURN_INSN (TRUE) && (REGNO(operands[0]) == RETVAL_REGNUM) && | ||
15865 | + ((GET_MODE(operands[4]) == SImode) || | ||
15866 | + ((GET_MODE(operands[4]) != SImode) && (GET_CODE(operands[5]) == REG)))" | ||
15867 | + { | ||
15868 | + operands[1] = avr32_output_cmp(operands[1], GET_MODE(operands[4]), operands[4], operands[5]); | ||
15869 | + | ||
15870 | + if ( GET_CODE(operands[2]) == REG | ||
15871 | + && GET_CODE(operands[3]) == REG | ||
15872 | + && REGNO(operands[2]) != LR_REGNUM | ||
15873 | + && REGNO(operands[3]) != LR_REGNUM ){ | ||
15874 | + return "ret%1 %2\;ret%i1 %3"; | ||
15875 | + } else if ( GET_CODE(operands[2]) == REG | ||
15876 | + && GET_CODE(operands[3]) == CONST_INT ){ | ||
15877 | + if ( INTVAL(operands[3]) == -1 | ||
15878 | + || INTVAL(operands[3]) == 0 | ||
15879 | + || INTVAL(operands[3]) == 1 ){ | ||
15880 | + return "ret%1 %2\;ret%i1 %d3"; | ||
15881 | + } else { | ||
15882 | + return "mov%1 r12, %2\;mov%i1 r12, %3\;retal r12"; | ||
15883 | + } | ||
15884 | + } else if ( GET_CODE(operands[2]) == CONST_INT | ||
15885 | + && GET_CODE(operands[3]) == REG ){ | ||
15886 | + if ( INTVAL(operands[2]) == -1 | ||
15887 | + || INTVAL(operands[2]) == 0 | ||
15888 | + || INTVAL(operands[2]) == 1 ){ | ||
15889 | + return "ret%1 %d2\;ret%i1 %3"; | ||
15890 | + } else { | ||
15891 | + return "mov%1 r12, %2\;mov%i1 r12, %3\;retal r12"; | ||
15892 | + } | ||
15893 | + } else { | ||
15894 | + if ( (INTVAL(operands[2]) == -1 | ||
15895 | + || INTVAL(operands[2]) == 0 | ||
15896 | + || INTVAL(operands[2]) == 1 ) | ||
15897 | + && (INTVAL(operands[3]) == -1 | ||
15898 | + || INTVAL(operands[3]) == 0 | ||
15899 | + || INTVAL(operands[3]) == 1 )){ | ||
15900 | + return "ret%1 %d2\;ret%i1 %d3"; | ||
15901 | + } else { | ||
15902 | + return "mov%1 r12, %2\;mov%i1 r12, %3\;retal r12"; | ||
15903 | + } | ||
15904 | + } | ||
15905 | + } | ||
15906 | + | ||
15907 | + [(set_attr "length" "14") | ||
15908 | + (set_attr "cc" "clobber") | ||
15909 | + (set_attr "type" "call")]) | ||
15910 | + | ||
15911 | + | ||
15912 | +;;================================================================= | ||
15913 | +;; mulnhh.w | ||
15914 | +;;================================================================= | ||
15915 | + | ||
15916 | +(define_peephole2 | ||
15917 | + [(set (match_operand:HI 0 "register_operand" "") | ||
15918 | + (neg:HI (match_operand:HI 1 "register_operand" ""))) | ||
15919 | + (set (match_operand:SI 2 "register_operand" "") | ||
15920 | + (mult:SI | ||
15921 | + (sign_extend:SI (match_dup 0)) | ||
15922 | + (sign_extend:SI (match_operand:HI 3 "register_operand" ""))))] | ||
15923 | + "(peep2_reg_dead_p(2, operands[0])) || (REGNO(operands[2]) == REGNO(operands[0]))" | ||
15924 | + [ (set (match_dup 2) | ||
15925 | + (mult:SI | ||
15926 | + (sign_extend:SI (neg:HI (match_dup 1))) | ||
15927 | + (sign_extend:SI (match_dup 3))))] | ||
15928 | + "" | ||
15929 | + ) | ||
15930 | + | ||
15931 | +(define_peephole2 | ||
15932 | + [(set (match_operand:HI 0 "register_operand" "") | ||
15933 | + (neg:HI (match_operand:HI 1 "register_operand" ""))) | ||
15934 | + (set (match_operand:SI 2 "register_operand" "") | ||
15935 | + (mult:SI | ||
15936 | + (sign_extend:SI (match_operand:HI 3 "register_operand" "")) | ||
15937 | + (sign_extend:SI (match_dup 0))))] | ||
15938 | + "(peep2_reg_dead_p(2, operands[0])) || (REGNO(operands[2]) == REGNO(operands[0]))" | ||
15939 | + [ (set (match_dup 2) | ||
15940 | + (mult:SI | ||
15941 | + (sign_extend:SI (neg:HI (match_dup 1))) | ||
15942 | + (sign_extend:SI (match_dup 3))))] | ||
15943 | + "" | ||
15944 | + ) | ||
15945 | + | ||
15946 | + | ||
15947 | + | ||
15948 | +;;================================================================= | ||
15949 | +;; sthh.w | ||
15950 | +;;================================================================= | ||
15951 | +(define_insn "vec_setv2hi" | ||
15952 | + [(set (match_operand:V2HI 0 "register_operand" "=r") | ||
15953 | + (vec_merge:V2HI | ||
15954 | + (match_dup 0) | ||
15955 | + (vec_duplicate:V2HI | ||
15956 | + (match_operand:HI 1 "register_operand" "r")) | ||
15957 | + (const_int 1)))] | ||
15958 | + "" | ||
15959 | + "bfins\t%0, %1, 16, 16" | ||
15960 | + [(set_attr "type" "alu") | ||
15961 | + (set_attr "length" "4") | ||
15962 | + (set_attr "cc" "clobber")]) | ||
15963 | + | ||
15964 | +(define_insn "vec_setv2lo" | ||
15965 | + [(set (match_operand:V2HI 0 "register_operand" "+r") | ||
15966 | + (vec_merge:V2HI | ||
15967 | + (match_dup 0) | ||
15968 | + (vec_duplicate:V2HI | ||
15969 | + (match_operand:HI 1 "register_operand" "r")) | ||
15970 | + (const_int 2)))] | ||
15971 | + "" | ||
15972 | + "bfins\t%0, %1, 0, 16" | ||
15973 | + [(set_attr "type" "alu") | ||
15974 | + (set_attr "length" "4") | ||
15975 | + (set_attr "cc" "clobber")]) | ||
15976 | + | ||
15977 | +(define_expand "vec_setv2" | ||
15978 | + [(set (match_operand:V2HI 0 "register_operand" "") | ||
15979 | + (vec_merge:V2HI | ||
15980 | + (match_dup 0) | ||
15981 | + (vec_duplicate:V2HI | ||
15982 | + (match_operand:HI 1 "register_operand" "")) | ||
15983 | + (match_operand 2 "immediate_operand" "")))] | ||
15984 | + "" | ||
15985 | + { operands[2] = GEN_INT(INTVAL(operands[2]) + 1); } | ||
15986 | + ) | ||
15987 | + | ||
15988 | +(define_insn "vec_extractv2hi" | ||
15989 | + [(set (match_operand:HI 0 "register_operand" "=r") | ||
15990 | + (vec_select:HI | ||
15991 | + (match_operand:V2HI 1 "register_operand" "r") | ||
15992 | + (parallel [(match_operand:SI 2 "immediate_operand" "i")])))] | ||
15993 | + "" | ||
15994 | + { | ||
15995 | + if ( INTVAL(operands[2]) == 0 ) | ||
15996 | + return "bfextu\t%0, %1, 16, 16"; | ||
15997 | + else | ||
15998 | + return "bfextu\t%0, %1, 0, 16"; | ||
15999 | + } | ||
16000 | + [(set_attr "type" "alu") | ||
16001 | + (set_attr "length" "4") | ||
16002 | + (set_attr "cc" "clobber")]) | ||
16003 | + | ||
16004 | +(define_insn "vec_extractv4qi" | ||
16005 | + [(set (match_operand:QI 0 "register_operand" "=r") | ||
16006 | + (vec_select:QI | ||
16007 | + (match_operand:V4QI 1 "register_operand" "r") | ||
16008 | + (parallel [(match_operand:SI 2 "immediate_operand" "i")])))] | ||
16009 | + "" | ||
16010 | + { | ||
16011 | + switch ( INTVAL(operands[2]) ){ | ||
16012 | + case 0: | ||
16013 | + return "bfextu\t%0, %1, 24, 8"; | ||
16014 | + case 1: | ||
16015 | + return "bfextu\t%0, %1, 16, 8"; | ||
16016 | + case 2: | ||
16017 | + return "bfextu\t%0, %1, 8, 8"; | ||
16018 | + case 3: | ||
16019 | + return "bfextu\t%0, %1, 0, 8"; | ||
16020 | + default: | ||
16021 | + abort(); | ||
16022 | + } | ||
16023 | + } | ||
16024 | + [(set_attr "type" "alu") | ||
16025 | + (set_attr "length" "4") | ||
16026 | + (set_attr "cc" "clobber")]) | ||
16027 | + | ||
16028 | + | ||
16029 | +(define_insn "concatv2hi" | ||
16030 | + [(set (match_operand:V2HI 0 "register_operand" "=r, r, r") | ||
16031 | + (vec_concat:V2HI | ||
16032 | + (match_operand:HI 1 "register_operand" "r, r, 0") | ||
16033 | + (match_operand:HI 2 "register_operand" "r, 0, r")))] | ||
16034 | + "" | ||
16035 | + "@ | ||
16036 | + mov\t%0, %1\;bfins\t%0, %2, 0, 16 | ||
16037 | + bfins\t%0, %2, 0, 16 | ||
16038 | + bfins\t%0, %1, 16, 16" | ||
16039 | + [(set_attr "length" "6, 4, 4") | ||
16040 | + (set_attr "type" "alu")]) | ||
16041 | + | ||
16042 | +;(define_peephole2 | ||
16043 | +; [(set (match_operand:HI 0 "register_operand" "r") | ||
16044 | +; (plus:HI (match_operand:HI 3 "register_operand" "r") | ||
16045 | +; (match_operand:HI 4 "register_operand" "r"))) | ||
16046 | +; (set (match_operand:HI 1 "register_operand" "r") | ||
16047 | +; (minus:HI (match_dup 3) | ||
16048 | +; (match_dup 4)))] | ||
16049 | +; "REGNO(operands[0]) != REGNO(operands[3])" | ||
16050 | +; [(set (match_dup 2) | ||
16051 | +; (vec_concat:V2HI | ||
16052 | +; (minus:HI (match_dup 3) | ||
16053 | +; (match_dup 4)) | ||
16054 | +; (plus:HI (match_dup 3) (match_dup 4)))) | ||
16055 | +; (set (match_dup 1) (vec_select:HI (match_dup 2) | ||
16056 | +; (parallel [(const_int 0)])))] | ||
16057 | +; | ||
16058 | +; "operands[2] = gen_rtx_REG(V2HImode, REGNO(operands[0]));" | ||
16059 | +; ) | ||
16060 | +; | ||
16061 | +;(define_peephole2 | ||
16062 | +; [(set (match_operand:HI 0 "register_operand" "r") | ||
16063 | +; (minus:HI (match_operand:HI 3 "register_operand" "r") | ||
16064 | +; (match_operand:HI 4 "register_operand" "r"))) | ||
16065 | +; (set (match_operand:HI 1 "register_operand" "r") | ||
16066 | +; (plus:HI (match_dup 3) | ||
16067 | +; (match_dup 4)))] | ||
16068 | +; "REGNO(operands[0]) != REGNO(operands[3])" | ||
16069 | +; [(set (match_dup 2) | ||
16070 | +; (vec_concat:V2HI | ||
16071 | +; (plus:HI (match_dup 3) | ||
16072 | +; (match_dup 4)) | ||
16073 | +; (minus:HI (match_dup 3) (match_dup 4)))) | ||
16074 | +; (set (match_dup 1) (vec_select:HI (match_dup 2) | ||
16075 | +; (parallel [(const_int 0)])))] | ||
16076 | +; | ||
16077 | +; "operands[2] = gen_rtx_REG(V2HImode, REGNO(operands[0]));" | ||
16078 | +; ) | ||
16079 | + | ||
16080 | + | ||
16081 | +;(define_peephole2 | ||
16082 | +; [(match_scratch:V2HI 5 "r") | ||
16083 | +; (set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "") | ||
16084 | +; (match_operand:HI 1 "immediate_operand" ""))) | ||
16085 | +; (match_operand:HI 2 "register_operand" "r")) | ||
16086 | +; (set (mem:HI (plus:SI (match_dup 0) | ||
16087 | +; (match_operand:HI 3 "immediate_operand" ""))) | ||
16088 | +; (match_operand:HI 4 "register_operand" "r"))] | ||
16089 | +; "(GET_CODE(operands[1]) == CONST_INT) && (GET_CODE(operands[3]) == CONST_INT) | ||
16090 | +; && (INTVAL(operands[3]) == (INTVAL(operands[1]) + 2))" | ||
16091 | +; | ||
16092 | +; [(set (match_dup 5) | ||
16093 | +; (vec_concat:V2HI | ||
16094 | +; (match_dup 2) | ||
16095 | +; (match_dup 4))) | ||
16096 | +; (set (mem:V2HI (plus:SI (match_dup 0) (match_dup 1))) | ||
16097 | +; (match_dup 5))] | ||
16098 | +; "" | ||
16099 | +; ) | ||
16100 | +; | ||
16101 | + | ||
16102 | +;(define_insn "sthh_w" | ||
16103 | +; [(set (match_operand:V2HI 0 "avr32_sthh_w_memory_operand" "m") | ||
16104 | +; (vec_concat:V2HI | ||
16105 | +; (vec_select:HI (match_operand:V2HI 1 "register_operand" "r") | ||
16106 | +; (parallel [(match_operand 3 "immediate_operand" "i")])) | ||
16107 | +; (vec_select:HI (match_operand:V2HI 2 "register_operand" "r") | ||
16108 | +; (parallel [(match_operand 4 "immediate_operand" "i")]))))] | ||
16109 | +; "MEM_ALIGN(operands[0]) >= 32" | ||
16110 | +; "sthh.w\t%0, %1:%h3, %2:%h4" | ||
16111 | +; [(set_attr "length" "4") | ||
16112 | +; (set_attr "type" "store")]) | ||
16113 | +; | ||
16114 | +;(define_peephole2 | ||
16115 | +; [(set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "") | ||
16116 | +; (match_operand:HI 1 "immediate_operand" ""))) | ||
16117 | +; (match_operand:HI 2 "register_operand" "r")) | ||
16118 | +; (set (mem:HI (plus:SI (match_dup 0) | ||
16119 | +; (match_operand:HI 3 "avr32_sthh_operand" ""))) | ||
16120 | +; (match_operand:HI 4 "register_operand" "r"))] | ||
16121 | +; "(GET_CODE(operands[1]) == CONST_INT) && (GET_CODE(operands[3]) == CONST_INT) | ||
16122 | +; && (INTVAL(operands[3]) == (INTVAL(operands[1]) - 2))" | ||
16123 | +; | ||
16124 | +; [(paralell [(set (mem:HI (plus:SI (match_dup 0) | ||
16125 | +; (match_dup 3))) | ||
16126 | +; (match_dup 4)) | ||
16127 | +; (set (mem:HI (plus:SI (match_dup 0) | ||
16128 | +; (plus:SI (match_dup 3) (const_int 2)))) | ||
16129 | +; (match_dup 2))])] | ||
16130 | +; "" | ||
16131 | +; ) | ||
16132 | + | ||
16133 | + | ||
16134 | +;; Load the SIMD description | ||
16135 | +(include "simd.md") | ||
16136 | + | ||
16137 | +;; Load the FP coprocessor patterns | ||
16138 | +(include "fpcp.md") | ||
16139 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32-modes.def gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-modes.def | ||
16140 | --- gcc-4.0.2/gcc/config/avr32/avr32-modes.def 1970-01-01 01:00:00.000000000 +0100 | ||
16141 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-modes.def 2005-08-19 14:17:15.000000000 +0200 | ||
16142 | @@ -0,0 +1 @@ | ||
16143 | +VECTOR_MODES (INT, 4); /* V4QI V2HI */ | ||
16144 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/avr32-protos.h gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-protos.h | ||
16145 | --- gcc-4.0.2/gcc/config/avr32/avr32-protos.h 1970-01-01 01:00:00.000000000 +0100 | ||
16146 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/avr32-protos.h 2006-10-10 13:03:42.000000000 +0200 | ||
16147 | @@ -0,0 +1,175 @@ | ||
16148 | +/* | ||
16149 | + Prototypes for exported functions defined in avr32.c | ||
16150 | + Copyright 2003-2006 Atmel Corporation. | ||
16151 | + | ||
16152 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
16153 | + Initial porting by Anders Ådland. | ||
16154 | + | ||
16155 | + This file is part of GCC. | ||
16156 | + | ||
16157 | + This program is free software; you can redistribute it and/or modify | ||
16158 | + it under the terms of the GNU General Public License as published by | ||
16159 | + the Free Software Foundation; either version 2 of the License, or | ||
16160 | + (at your option) any later version. | ||
16161 | + | ||
16162 | + This program is distributed in the hope that it will be useful, | ||
16163 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16164 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16165 | + GNU General Public License for more details. | ||
16166 | + | ||
16167 | + You should have received a copy of the GNU General Public License | ||
16168 | + along with this program; if not, write to the Free Software | ||
16169 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
16170 | + | ||
16171 | + | ||
16172 | +#ifndef AVR32_PROTOS_H | ||
16173 | +#define AVR32_PROTOS_H | ||
16174 | + | ||
16175 | +extern const int swap_reg[]; | ||
16176 | + | ||
16177 | +extern int avr32_valid_macmac_bypass (rtx, rtx); | ||
16178 | +extern int avr32_valid_mulmac_bypass (rtx, rtx); | ||
16179 | + | ||
16180 | +extern int avr32_decode_lcomm_symbol_offset (rtx, int *); | ||
16181 | +extern void avr32_encode_lcomm_symbol_offset (tree, char *, int); | ||
16182 | + | ||
16183 | +extern const char *avr32_strip_name_encoding (const char *); | ||
16184 | + | ||
16185 | +extern rtx avr32_get_note_reg_equiv (rtx insn); | ||
16186 | + | ||
16187 | +extern int avr32_use_return_insn (int iscond); | ||
16188 | + | ||
16189 | +extern void avr32_make_reglist16 (int reglist16_vect, char *reglist16_string); | ||
16190 | + | ||
16191 | +extern void avr32_make_reglist8 (int reglist8_vect, char *reglist8_string); | ||
16192 | +extern void avr32_make_fp_reglist_w (int reglist_mask, char *reglist_string); | ||
16193 | +extern void avr32_make_fp_reglist_d (int reglist_mask, char *reglist_string); | ||
16194 | + | ||
16195 | +extern void avr32_output_return_instruction (int single_ret_inst, | ||
16196 | + int iscond, rtx cond, | ||
16197 | + rtx r12_imm); | ||
16198 | +extern void avr32_expand_prologue (void); | ||
16199 | +extern void avr32_set_return_address (rtx source); | ||
16200 | + | ||
16201 | +extern int avr32_hard_regno_mode_ok (int regno, enum machine_mode mode); | ||
16202 | +extern int avr32_extra_constraint_s (rtx value, const int strict); | ||
16203 | +extern int avr32_eh_return_data_regno (const int n); | ||
16204 | +extern int avr32_initial_elimination_offset (const int from, const int to); | ||
16205 | +extern rtx avr32_function_arg (CUMULATIVE_ARGS * cum, enum machine_mode mode, | ||
16206 | + tree type, int named); | ||
16207 | +extern void avr32_init_cumulative_args (CUMULATIVE_ARGS * cum, tree fntype, | ||
16208 | + rtx libname, tree fndecl); | ||
16209 | +extern void avr32_function_arg_advance (CUMULATIVE_ARGS * cum, | ||
16210 | + enum machine_mode mode, | ||
16211 | + tree type, int named); | ||
16212 | +#ifdef ARGS_SIZE_RTX | ||
16213 | +/* expr.h defines ARGS_SIZE_RTX and `enum direction'. */ | ||
16214 | +extern enum direction avr32_function_arg_padding (enum machine_mode mode, | ||
16215 | + tree type); | ||
16216 | +#endif /* ARGS_SIZE_RTX */ | ||
16217 | +extern rtx avr32_function_value (tree valtype, tree func); | ||
16218 | +extern rtx avr32_libcall_value (enum machine_mode mode); | ||
16219 | +extern int avr32_sched_use_dfa_pipeline_interface (void); | ||
16220 | +extern bool avr32_return_in_memory (tree type, tree fntype); | ||
16221 | +extern void avr32_regs_to_save (char *operand); | ||
16222 | +extern void avr32_target_asm_function_prologue (FILE * file, | ||
16223 | + HOST_WIDE_INT size); | ||
16224 | +extern void avr32_target_asm_function_epilogue (FILE * file, | ||
16225 | + HOST_WIDE_INT size); | ||
16226 | +extern void avr32_trampoline_template (FILE * file); | ||
16227 | +extern void avr32_initialize_trampoline (rtx addr, rtx fnaddr, | ||
16228 | + rtx static_chain); | ||
16229 | +extern int avr32_legitimate_address (enum machine_mode mode, rtx x, | ||
16230 | + int strict); | ||
16231 | +extern int avr32_legitimate_constant_p (rtx x); | ||
16232 | + | ||
16233 | +extern int avr32_legitimate_pic_operand_p (rtx x); | ||
16234 | + | ||
16235 | +extern rtx avr32_find_symbol (rtx x); | ||
16236 | +extern void avr32_select_section (rtx exp, int reloc, int align); | ||
16237 | +extern void avr32_encode_section_info (tree decl, rtx rtl, int first); | ||
16238 | +extern void avr32_asm_file_end (FILE * stream); | ||
16239 | +extern void avr32_asm_output_ascii (FILE * stream, char *ptr, int len); | ||
16240 | +extern void avr32_asm_output_common (FILE * stream, const char *name, | ||
16241 | + int size, int rounded); | ||
16242 | +extern void avr32_asm_output_label (FILE * stream, const char *name); | ||
16243 | +extern void avr32_asm_declare_object_name (FILE * stream, char *name, | ||
16244 | + tree decl); | ||
16245 | +extern void avr32_asm_globalize_label (FILE * stream, const char *name); | ||
16246 | +extern void avr32_asm_weaken_label (FILE * stream, const char *name); | ||
16247 | +extern void avr32_asm_output_external (FILE * stream, tree decl, | ||
16248 | + const char *name); | ||
16249 | +extern void avr32_asm_output_external_libcall (FILE * stream, rtx symref); | ||
16250 | +extern void avr32_asm_output_labelref (FILE * stream, const char *name); | ||
16251 | +extern void avr32_notice_update_cc (rtx exp, rtx insn); | ||
16252 | +extern void avr32_print_operand (FILE * stream, rtx x, int code); | ||
16253 | +extern void avr32_print_operand_address (FILE * stream, rtx x); | ||
16254 | + | ||
16255 | +extern int avr32_symbol (rtx x); | ||
16256 | + | ||
16257 | +extern void avr32_select_rtx_section (enum machine_mode mode, rtx x, | ||
16258 | + unsigned HOST_WIDE_INT align); | ||
16259 | + | ||
16260 | +extern int avr32_load_multiple_operation (rtx op, enum machine_mode mode); | ||
16261 | +extern int avr32_store_multiple_operation (rtx op, enum machine_mode mode); | ||
16262 | + | ||
16263 | +extern int avr32_const_ok_for_constraint_p (HOST_WIDE_INT value, char c, | ||
16264 | + const char *str); | ||
16265 | + | ||
16266 | +extern bool avr32_cannot_force_const_mem (rtx x); | ||
16267 | + | ||
16268 | +extern void avr32_init_builtins (void); | ||
16269 | + | ||
16270 | +extern rtx avr32_expand_builtin (tree exp, rtx target, rtx subtarget, | ||
16271 | + enum machine_mode mode, int ignore); | ||
16272 | + | ||
16273 | +extern bool avr32_must_pass_in_stack (enum machine_mode mode, tree type); | ||
16274 | + | ||
16275 | +extern bool avr32_strict_argument_naming (CUMULATIVE_ARGS * ca); | ||
16276 | + | ||
16277 | +extern bool avr32_pass_by_reference (CUMULATIVE_ARGS * cum, | ||
16278 | + enum machine_mode mode, | ||
16279 | + tree type, bool named); | ||
16280 | + | ||
16281 | +extern rtx avr32_gen_load_multiple (rtx * regs, int count, rtx from, | ||
16282 | + int write_back, int in_struct_p, | ||
16283 | + int scalar_p); | ||
16284 | +extern rtx avr32_gen_store_multiple (rtx * regs, int count, rtx to, | ||
16285 | + int in_struct_p, int scalar_p); | ||
16286 | +extern int avr32_gen_movmemsi (rtx * operands); | ||
16287 | + | ||
16288 | +extern int avr32_rnd_operands (rtx add, rtx shift); | ||
16289 | +extern int avr32_adjust_insn_length (rtx insn, int length); | ||
16290 | + | ||
16291 | +extern int symbol_mentioned_p (rtx x); | ||
16292 | +extern int label_mentioned_p (rtx x); | ||
16293 | +extern rtx legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg); | ||
16294 | +extern int avr32_address_register_rtx_p (rtx x, int strict_p); | ||
16295 | +extern int avr32_legitimate_index_p (enum machine_mode mode, rtx index, | ||
16296 | + int strict_p); | ||
16297 | + | ||
16298 | +extern int avr32_const_double_immediate (rtx value); | ||
16299 | +extern void avr32_init_expanders (void); | ||
16300 | +extern rtx avr32_return_addr (int count, rtx frame); | ||
16301 | +extern bool avr32_got_mentioned_p (rtx addr); | ||
16302 | + | ||
16303 | +extern void avr32_final_prescan_insn (rtx insn, rtx * opvec, int noperands); | ||
16304 | + | ||
16305 | +extern int avr32_expand_movcc (enum machine_mode mode, rtx operands[]); | ||
16306 | +extern int avr32_expand_addcc (enum machine_mode mode, rtx operands[]); | ||
16307 | +#ifdef RTX_CODE | ||
16308 | +extern int avr32_expand_scc (RTX_CODE cond, rtx * operands); | ||
16309 | +#endif | ||
16310 | + | ||
16311 | +extern int avr32_store_bypass (rtx insn_out, rtx insn_in); | ||
16312 | +extern int avr32_mul_waw_bypass (rtx insn_out, rtx insn_in); | ||
16313 | +extern int avr32_valid_load_double_bypass (rtx insn_out, rtx insn_in); | ||
16314 | +extern int avr32_valid_load_quad_bypass (rtx insn_out, rtx insn_in); | ||
16315 | +extern rtx avr32_output_cmp (rtx cond, enum machine_mode mode, | ||
16316 | + rtx op0, rtx op1); | ||
16317 | + | ||
16318 | +rtx get_next_insn_cond (rtx cur_insn); | ||
16319 | +int set_next_insn_cond (rtx cur_insn, rtx cond); | ||
16320 | +void avr32_override_options (void); | ||
16321 | + | ||
16322 | +#endif /* AVR32_PROTOS_H */ | ||
16323 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/crti.asm gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/crti.asm | ||
16324 | --- gcc-4.0.2/gcc/config/avr32/crti.asm 1970-01-01 01:00:00.000000000 +0100 | ||
16325 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/crti.asm 2006-10-10 12:36:34.000000000 +0200 | ||
16326 | @@ -0,0 +1,64 @@ | ||
16327 | +/* | ||
16328 | + Init/fini stuff for AVR32. | ||
16329 | + Copyright 2003-2006 Atmel Corporation. | ||
16330 | + | ||
16331 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
16332 | + | ||
16333 | + This file is part of GCC. | ||
16334 | + | ||
16335 | + This program is free software; you can redistribute it and/or modify | ||
16336 | + it under the terms of the GNU General Public License as published by | ||
16337 | + the Free Software Foundation; either version 2 of the License, or | ||
16338 | + (at your option) any later version. | ||
16339 | + | ||
16340 | + This program is distributed in the hope that it will be useful, | ||
16341 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16342 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16343 | + GNU General Public License for more details. | ||
16344 | + | ||
16345 | + You should have received a copy of the GNU General Public License | ||
16346 | + along with this program; if not, write to the Free Software | ||
16347 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
16348 | + | ||
16349 | + | ||
16350 | +/* The code in sections .init and .fini is supposed to be a single | ||
16351 | + regular function. The function in .init is called directly from | ||
16352 | + start in crt1.asm. The function in .fini is atexit()ed in crt1.asm | ||
16353 | + too. | ||
16354 | + | ||
16355 | + crti.asm contributes the prologue of a function to these sections, | ||
16356 | + and crtn.asm comes up the epilogue. STARTFILE_SPEC should list | ||
16357 | + crti.o before any other object files that might add code to .init | ||
16358 | + or .fini sections, and ENDFILE_SPEC should list crtn.o after any | ||
16359 | + such object files. */ | ||
16360 | + | ||
16361 | + .file "crti.asm" | ||
16362 | + | ||
16363 | + .section ".init" | ||
16364 | +/* Just load the GOT */ | ||
16365 | + .align 2 | ||
16366 | + .global _init | ||
16367 | +_init: | ||
16368 | + stm --sp, r6, lr | ||
16369 | + lddpc r6, 1f | ||
16370 | +0: | ||
16371 | + rsub r6, pc | ||
16372 | + rjmp 2f | ||
16373 | + .align 2 | ||
16374 | +1: .long 0b - _GLOBAL_OFFSET_TABLE_ | ||
16375 | +2: | ||
16376 | + | ||
16377 | + .section ".fini" | ||
16378 | +/* Just load the GOT */ | ||
16379 | + .align 2 | ||
16380 | + .global _fini | ||
16381 | +_fini: | ||
16382 | + stm --sp, r6, lr | ||
16383 | + lddpc r6, 1f | ||
16384 | +0: | ||
16385 | + rsub r6, pc | ||
16386 | + rjmp 2f | ||
16387 | + .align 2 | ||
16388 | +1: .long 0b - _GLOBAL_OFFSET_TABLE_ | ||
16389 | +2: | ||
16390 | + | ||
16391 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/crtn.asm gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/crtn.asm | ||
16392 | --- gcc-4.0.2/gcc/config/avr32/crtn.asm 1970-01-01 01:00:00.000000000 +0100 | ||
16393 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/crtn.asm 2006-10-10 12:36:34.000000000 +0200 | ||
16394 | @@ -0,0 +1,44 @@ | ||
16395 | +/* Copyright (C) 2001 Free Software Foundation, Inc. | ||
16396 | + Written By Nick Clifton | ||
16397 | + | ||
16398 | + This file is free software; you can redistribute it and/or modify it | ||
16399 | + under the terms of the GNU General Public License as published by the | ||
16400 | + Free Software Foundation; either version 2, or (at your option) any | ||
16401 | + later version. | ||
16402 | + | ||
16403 | + In addition to the permissions in the GNU General Public License, the | ||
16404 | + Free Software Foundation gives you unlimited permission to link the | ||
16405 | + compiled version of this file with other programs, and to distribute | ||
16406 | + those programs without any restriction coming from the use of this | ||
16407 | + file. (The General Public License restrictions do apply in other | ||
16408 | + respects; for example, they cover modification of the file, and | ||
16409 | + distribution when not linked into another program.) | ||
16410 | + | ||
16411 | + This file is distributed in the hope that it will be useful, but | ||
16412 | + WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16413 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16414 | + General Public License for more details. | ||
16415 | + | ||
16416 | + You should have received a copy of the GNU General Public License | ||
16417 | + along with this program; see the file COPYING. If not, write to | ||
16418 | + the Free Software Foundation, 59 Temple Place - Suite 330, | ||
16419 | + Boston, MA 02111-1307, USA. | ||
16420 | + | ||
16421 | + As a special exception, if you link this library with files | ||
16422 | + compiled with GCC to produce an executable, this does not cause | ||
16423 | + the resulting executable to be covered by the GNU General Public License. | ||
16424 | + This exception does not however invalidate any other reasons why | ||
16425 | + the executable file might be covered by the GNU General Public License. | ||
16426 | +*/ | ||
16427 | + | ||
16428 | + | ||
16429 | + | ||
16430 | + | ||
16431 | + .file "crtn.asm" | ||
16432 | + | ||
16433 | + .section ".init" | ||
16434 | + ldm sp++, r6, pc | ||
16435 | + | ||
16436 | + .section ".fini" | ||
16437 | + ldm sp++, r6, pc | ||
16438 | + | ||
16439 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/fpcp.md gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/fpcp.md | ||
16440 | --- gcc-4.0.2/gcc/config/avr32/fpcp.md 1970-01-01 01:00:00.000000000 +0100 | ||
16441 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/fpcp.md 2006-10-10 12:36:34.000000000 +0200 | ||
16442 | @@ -0,0 +1,551 @@ | ||
16443 | +;; AVR32 machine description file for Floating-Point instructions. | ||
16444 | +;; Copyright 2003-2006 Atmel Corporation. | ||
16445 | +;; | ||
16446 | +;; Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
16447 | +;; | ||
16448 | +;; This file is part of GCC. | ||
16449 | +;; | ||
16450 | +;; This program is free software; you can redistribute it and/or modify | ||
16451 | +;; it under the terms of the GNU General Public License as published by | ||
16452 | +;; the Free Software Foundation; either version 2 of the License, or | ||
16453 | +;; (at your option) any later version. | ||
16454 | +;; | ||
16455 | +;; This program is distributed in the hope that it will be useful, | ||
16456 | +;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16457 | +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16458 | +;; GNU General Public License for more details. | ||
16459 | +;; | ||
16460 | +;; You should have received a copy of the GNU General Public License | ||
16461 | +;; along with this program; if not, write to the Free Software | ||
16462 | +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
16463 | + | ||
16464 | +;; -*- Mode: Scheme -*- | ||
16465 | + | ||
16466 | +;;****************************************************************************** | ||
16467 | +;; Automaton pipeline description for floating-point coprocessor insns | ||
16468 | +;;****************************************************************************** | ||
16469 | +(define_cpu_unit "fid,fm1,fm2,fm3,fm4,fwb,fcmp,fcast" "avr32_ap") | ||
16470 | + | ||
16471 | +(define_insn_reservation "fmv_op" 1 | ||
16472 | + (and (eq_attr "pipeline" "ap") | ||
16473 | + (eq_attr "type" "fmv")) | ||
16474 | + "is,da,d,fid,fwb") | ||
16475 | + | ||
16476 | +(define_insn_reservation "fmul_op" 5 | ||
16477 | + (and (eq_attr "pipeline" "ap") | ||
16478 | + (eq_attr "type" "fmul")) | ||
16479 | + "is,da,d,fid,fm1,fm2,fm3,fm4,fwb") | ||
16480 | + | ||
16481 | +(define_insn_reservation "fcmps_op" 1 | ||
16482 | + (and (eq_attr "pipeline" "ap") | ||
16483 | + (eq_attr "type" "fcmps")) | ||
16484 | + "is,da,d,fid,fcmp") | ||
16485 | + | ||
16486 | +(define_insn_reservation "fcmpd_op" 2 | ||
16487 | + (and (eq_attr "pipeline" "ap") | ||
16488 | + (eq_attr "type" "fcmpd")) | ||
16489 | + "is,da,d,fid*2,fcmp") | ||
16490 | + | ||
16491 | +(define_insn_reservation "fcast_op" 3 | ||
16492 | + (and (eq_attr "pipeline" "ap") | ||
16493 | + (eq_attr "type" "fcast")) | ||
16494 | + "is,da,d,fid,fcmp,fcast,fwb") | ||
16495 | + | ||
16496 | +(define_insn_reservation "fmvcpu_op" 2 | ||
16497 | + (and (eq_attr "pipeline" "ap") | ||
16498 | + (eq_attr "type" "fmvcpu")) | ||
16499 | + "is,da,d") | ||
16500 | + | ||
16501 | +(define_insn_reservation "fldd_op" 1 | ||
16502 | + (and (eq_attr "pipeline" "ap") | ||
16503 | + (eq_attr "type" "fldd")) | ||
16504 | + "is,da,d,fwb") | ||
16505 | + | ||
16506 | +(define_insn_reservation "flds_op" 1 | ||
16507 | + (and (eq_attr "pipeline" "ap") | ||
16508 | + (eq_attr "type" "flds")) | ||
16509 | + "is,da,d,fwb") | ||
16510 | + | ||
16511 | +(define_insn_reservation "fsts_op" 0 | ||
16512 | + (and (eq_attr "pipeline" "ap") | ||
16513 | + (eq_attr "type" "fsts")) | ||
16514 | + "is,da*2,d") | ||
16515 | + | ||
16516 | +(define_insn_reservation "fstd_op" 0 | ||
16517 | + (and (eq_attr "pipeline" "ap") | ||
16518 | + (eq_attr "type" "fstd")) | ||
16519 | + "is,da*2,d") | ||
16520 | + | ||
16521 | + | ||
16522 | +(define_insn "*movsf_fpcp" | ||
16523 | + [(set (match_operand:SF 0 "nonimmediate_operand" "=f,f,r,f,m,r,r,r,m") | ||
16524 | + (match_operand:SF 1 "general_operand" " f,r,f,m,f,r,G,m,r"))] | ||
16525 | + "TARGET_HARD_FLOAT" | ||
16526 | + "@ | ||
16527 | + fmov.s\t%0, %1 | ||
16528 | + fmov.s\t%0, %1 | ||
16529 | + fmov.s\t%0, %1 | ||
16530 | + fld.s\t%0, %1 | ||
16531 | + fst.s\t%0, %1 | ||
16532 | + mov\t%0, %1 | ||
16533 | + mov\t%0, %1 | ||
16534 | + ld.w\t%0, %1 | ||
16535 | + st.w\t%0, %1" | ||
16536 | + [(set_attr "length" "4,4,4,4,4,2,4,4,4") | ||
16537 | + (set_attr "type" "fmv,flds,fmvcpu,flds,fsts,alu,alu,load,store")]) | ||
16538 | + | ||
16539 | +(define_insn_and_split "*movdf_fpcp" | ||
16540 | + [(set (match_operand:DF 0 "nonimmediate_operand" "=f,f,r,f,m,r,r,m") | ||
16541 | + (match_operand:DF 1 "general_operand" " f,r,f,m,f,r,m,r"))] | ||
16542 | + "TARGET_HARD_FLOAT" | ||
16543 | + "@ | ||
16544 | + fmov.d\t%0, %1 | ||
16545 | + fmov.d\t%0, %1 | ||
16546 | + fmov.d\t%0, %1 | ||
16547 | + fld.d\t%0, %1 | ||
16548 | + fst.d\t%0, %1 | ||
16549 | + mov\t%0, %1\;mov\t%m0, %m1 | ||
16550 | + ld.d\t%0, %1 | ||
16551 | + st.d\t%0, %1" | ||
16552 | + | ||
16553 | + "TARGET_HARD_FLOAT | ||
16554 | + && reload_completed | ||
16555 | + && (REG_P(operands[0]) && (REGNO_REG_CLASS(REGNO(operands[0])) == GENERAL_REGS)) | ||
16556 | + && (REG_P(operands[1]) && (REGNO_REG_CLASS(REGNO(operands[1])) == GENERAL_REGS))" | ||
16557 | + [(set (match_dup 0) (match_dup 1)) | ||
16558 | + (set (match_dup 2) (match_dup 3))] | ||
16559 | + " | ||
16560 | + { | ||
16561 | + operands[2] = gen_highpart (SImode, operands[0]); | ||
16562 | + operands[0] = gen_lowpart (SImode, operands[0]); | ||
16563 | + operands[3] = gen_highpart(SImode, operands[1]); | ||
16564 | + operands[1] = gen_lowpart(SImode, operands[1]); | ||
16565 | + } | ||
16566 | + " | ||
16567 | + | ||
16568 | + [(set_attr "length" "4,4,4,4,4,4,4,4") | ||
16569 | + (set_attr "type" "fmv,fldd,fmvcpu,fldd,fstd,alu2,load2,store2")]) | ||
16570 | + | ||
16571 | + | ||
16572 | +(define_insn "mulsf3" | ||
16573 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16574 | + (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16575 | + (match_operand:SF 2 "avr32_fp_register_operand" "f")))] | ||
16576 | + "TARGET_HARD_FLOAT" | ||
16577 | + "fmul.s\t%0, %1, %2" | ||
16578 | + [(set_attr "length" "4") | ||
16579 | + (set_attr "type" "fmul")]) | ||
16580 | + | ||
16581 | +(define_insn "nmulsf3" | ||
16582 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16583 | + (neg:SF (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16584 | + (match_operand:SF 2 "avr32_fp_register_operand" "f"))))] | ||
16585 | + "TARGET_HARD_FLOAT" | ||
16586 | + "fnmul.s\t%0, %1, %2" | ||
16587 | + [(set_attr "length" "4") | ||
16588 | + (set_attr "type" "fmul")]) | ||
16589 | + | ||
16590 | +(define_peephole2 | ||
16591 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "") | ||
16592 | + (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "") | ||
16593 | + (match_operand:SF 2 "avr32_fp_register_operand" ""))) | ||
16594 | + (set (match_operand:SF 3 "avr32_fp_register_operand" "") | ||
16595 | + (neg:SF (match_dup 0)))] | ||
16596 | + "TARGET_HARD_FLOAT && | ||
16597 | + (peep2_reg_dead_p(2, operands[0]) || (REGNO(operands[3]) == REGNO(operands[0])))" | ||
16598 | + [(set (match_dup 3) | ||
16599 | + (neg:SF (mult:SF (match_dup 1) | ||
16600 | + (match_dup 2))))] | ||
16601 | +) | ||
16602 | + | ||
16603 | + | ||
16604 | +(define_insn "macsf3" | ||
16605 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16606 | + (plus:SF (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16607 | + (match_operand:SF 2 "avr32_fp_register_operand" "f")) | ||
16608 | + (match_operand:SF 3 "avr32_fp_register_operand" "0")))] | ||
16609 | + "TARGET_HARD_FLOAT" | ||
16610 | + "fmac.s\t%0, %1, %2" | ||
16611 | + [(set_attr "length" "4") | ||
16612 | + (set_attr "type" "fmul")]) | ||
16613 | + | ||
16614 | +(define_insn "nmacsf3" | ||
16615 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16616 | + (plus:SF (neg:SF (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16617 | + (match_operand:SF 2 "avr32_fp_register_operand" "f"))) | ||
16618 | + (match_operand:SF 3 "avr32_fp_register_operand" "0")))] | ||
16619 | + "TARGET_HARD_FLOAT" | ||
16620 | + "fnmac.s\t%0, %1, %2" | ||
16621 | + [(set_attr "length" "4") | ||
16622 | + (set_attr "type" "fmul")]) | ||
16623 | + | ||
16624 | +(define_peephole2 | ||
16625 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "") | ||
16626 | + (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "") | ||
16627 | + (match_operand:SF 2 "avr32_fp_register_operand" ""))) | ||
16628 | + (set (match_operand:SF 3 "avr32_fp_register_operand" "") | ||
16629 | + (minus:SF | ||
16630 | + (match_dup 3) | ||
16631 | + (match_dup 0)))] | ||
16632 | + "TARGET_HARD_FLOAT && peep2_reg_dead_p(2, operands[0])" | ||
16633 | + [(set (match_dup 3) | ||
16634 | + (plus:SF (neg:SF (mult:SF (match_dup 1) | ||
16635 | + (match_dup 2))) | ||
16636 | + (match_dup 3)))] | ||
16637 | +) | ||
16638 | + | ||
16639 | + | ||
16640 | +(define_insn "msubacsf3" | ||
16641 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16642 | + (minus:SF (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16643 | + (match_operand:SF 2 "avr32_fp_register_operand" "f")) | ||
16644 | + (match_operand:SF 3 "avr32_fp_register_operand" "0")))] | ||
16645 | + "TARGET_HARD_FLOAT" | ||
16646 | + "fmsc.s\t%0, %1, %2" | ||
16647 | + [(set_attr "length" "4") | ||
16648 | + (set_attr "type" "fmul")]) | ||
16649 | + | ||
16650 | +(define_peephole2 | ||
16651 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "") | ||
16652 | + (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "") | ||
16653 | + (match_operand:SF 2 "avr32_fp_register_operand" ""))) | ||
16654 | + (set (match_operand:SF 3 "avr32_fp_register_operand" "") | ||
16655 | + (minus:SF | ||
16656 | + (match_dup 0) | ||
16657 | + (match_dup 3)))] | ||
16658 | + "TARGET_HARD_FLOAT && peep2_reg_dead_p(2, operands[0])" | ||
16659 | + [(set (match_dup 3) | ||
16660 | + (minus:SF (mult:SF (match_dup 1) | ||
16661 | + (match_dup 2)) | ||
16662 | + (match_dup 3)))] | ||
16663 | +) | ||
16664 | + | ||
16665 | +(define_insn "nmsubacsf3" | ||
16666 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16667 | + (minus:SF (neg:SF (mult:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16668 | + (match_operand:SF 2 "avr32_fp_register_operand" "f"))) | ||
16669 | + (match_operand:SF 3 "avr32_fp_register_operand" "0")))] | ||
16670 | + "TARGET_HARD_FLOAT" | ||
16671 | + "fnmsc.s\t%0, %1, %2" | ||
16672 | + [(set_attr "length" "4") | ||
16673 | + (set_attr "type" "fmul")]) | ||
16674 | + | ||
16675 | + | ||
16676 | + | ||
16677 | +(define_insn "addsf3" | ||
16678 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16679 | + (plus:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16680 | + (match_operand:SF 2 "avr32_fp_register_operand" "f")))] | ||
16681 | + "TARGET_HARD_FLOAT" | ||
16682 | + "fadd.s\t%0, %1, %2" | ||
16683 | + [(set_attr "length" "4") | ||
16684 | + (set_attr "type" "fmul")]) | ||
16685 | + | ||
16686 | +(define_insn "subsf3" | ||
16687 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16688 | + (minus:SF (match_operand:SF 1 "avr32_fp_register_operand" "f") | ||
16689 | + (match_operand:SF 2 "avr32_fp_register_operand" "f")))] | ||
16690 | + "TARGET_HARD_FLOAT" | ||
16691 | + "fsub.s\t%0, %1, %2" | ||
16692 | + [(set_attr "length" "4") | ||
16693 | + (set_attr "type" "fmul")]) | ||
16694 | + | ||
16695 | + | ||
16696 | +(define_insn "negsf2" | ||
16697 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16698 | + (neg:SF (match_operand:SF 1 "avr32_fp_register_operand" "f")))] | ||
16699 | + "TARGET_HARD_FLOAT" | ||
16700 | + "fneg.s\t%0, %1" | ||
16701 | + [(set_attr "length" "4") | ||
16702 | + (set_attr "type" "fmv")]) | ||
16703 | + | ||
16704 | +(define_insn "abssf2" | ||
16705 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16706 | + (abs:SF (match_operand:SF 1 "avr32_fp_register_operand" "f")))] | ||
16707 | + "TARGET_HARD_FLOAT" | ||
16708 | + "fabs.s\t%0, %1" | ||
16709 | + [(set_attr "length" "4") | ||
16710 | + (set_attr "type" "fmv")]) | ||
16711 | + | ||
16712 | +(define_insn "truncdfsf2" | ||
16713 | + [(set (match_operand:SF 0 "avr32_fp_register_operand" "=f") | ||
16714 | + (float_truncate:SF | ||
16715 | + (match_operand:DF 1 "avr32_fp_register_operand" "f")))] | ||
16716 | + "TARGET_HARD_FLOAT" | ||
16717 | + "fcastd.s\t%0, %1" | ||
16718 | + [(set_attr "length" "4") | ||
16719 | + (set_attr "type" "fcast")]) | ||
16720 | + | ||
16721 | +(define_insn "extendsfdf2" | ||
16722 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16723 | + (float_extend:DF | ||
16724 | + (match_operand:SF 1 "avr32_fp_register_operand" "f")))] | ||
16725 | + "TARGET_HARD_FLOAT" | ||
16726 | + "fcasts.d\t%0, %1" | ||
16727 | + [(set_attr "length" "4") | ||
16728 | + (set_attr "type" "fcast")]) | ||
16729 | + | ||
16730 | +(define_insn "muldf3" | ||
16731 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16732 | + (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16733 | + (match_operand:DF 2 "avr32_fp_register_operand" "f")))] | ||
16734 | + "TARGET_HARD_FLOAT" | ||
16735 | + "fmul.d\t%0, %1, %2" | ||
16736 | + [(set_attr "length" "4") | ||
16737 | + (set_attr "type" "fmul")]) | ||
16738 | + | ||
16739 | +(define_insn "nmuldf3" | ||
16740 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16741 | + (neg:DF (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16742 | + (match_operand:DF 2 "avr32_fp_register_operand" "f"))))] | ||
16743 | + "TARGET_HARD_FLOAT" | ||
16744 | + "fnmul.d\t%0, %1, %2" | ||
16745 | + [(set_attr "length" "4") | ||
16746 | + (set_attr "type" "fmul")]) | ||
16747 | + | ||
16748 | +(define_peephole2 | ||
16749 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "") | ||
16750 | + (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "") | ||
16751 | + (match_operand:DF 2 "avr32_fp_register_operand" ""))) | ||
16752 | + (set (match_operand:DF 3 "avr32_fp_register_operand" "") | ||
16753 | + (neg:DF (match_dup 0)))] | ||
16754 | + "TARGET_HARD_FLOAT && | ||
16755 | + (peep2_reg_dead_p(2, operands[0]) || (REGNO(operands[3]) == REGNO(operands[0])))" | ||
16756 | + [(set (match_dup 3) | ||
16757 | + (neg:DF (mult:DF (match_dup 1) | ||
16758 | + (match_dup 2))))] | ||
16759 | +) | ||
16760 | + | ||
16761 | +(define_insn "macdf3" | ||
16762 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16763 | + (plus:DF (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16764 | + (match_operand:DF 2 "avr32_fp_register_operand" "f")) | ||
16765 | + (match_operand:DF 3 "avr32_fp_register_operand" "0")))] | ||
16766 | + "TARGET_HARD_FLOAT" | ||
16767 | + "fmac.d\t%0, %1, %2" | ||
16768 | + [(set_attr "length" "4") | ||
16769 | + (set_attr "type" "fmul")]) | ||
16770 | + | ||
16771 | +(define_insn "msubacdf3" | ||
16772 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16773 | + (minus:DF (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16774 | + (match_operand:DF 2 "avr32_fp_register_operand" "f")) | ||
16775 | + (match_operand:DF 3 "avr32_fp_register_operand" "0")))] | ||
16776 | + "TARGET_HARD_FLOAT" | ||
16777 | + "fmsc.d\t%0, %1, %2" | ||
16778 | + [(set_attr "length" "4") | ||
16779 | + (set_attr "type" "fmul")]) | ||
16780 | + | ||
16781 | +(define_peephole2 | ||
16782 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "") | ||
16783 | + (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "") | ||
16784 | + (match_operand:DF 2 "avr32_fp_register_operand" ""))) | ||
16785 | + (set (match_operand:DF 3 "avr32_fp_register_operand" "") | ||
16786 | + (minus:DF | ||
16787 | + (match_dup 0) | ||
16788 | + (match_dup 3)))] | ||
16789 | + "TARGET_HARD_FLOAT && peep2_reg_dead_p(2, operands[0])" | ||
16790 | + [(set (match_dup 3) | ||
16791 | + (minus:DF (mult:DF (match_dup 1) | ||
16792 | + (match_dup 2)) | ||
16793 | + (match_dup 3)))] | ||
16794 | + ) | ||
16795 | + | ||
16796 | +(define_insn "nmsubacdf3" | ||
16797 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16798 | + (minus:DF (neg:DF (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16799 | + (match_operand:DF 2 "avr32_fp_register_operand" "f"))) | ||
16800 | + (match_operand:DF 3 "avr32_fp_register_operand" "0")))] | ||
16801 | + "TARGET_HARD_FLOAT" | ||
16802 | + "fnmsc.d\t%0, %1, %2" | ||
16803 | + [(set_attr "length" "4") | ||
16804 | + (set_attr "type" "fmul")]) | ||
16805 | + | ||
16806 | +(define_insn "nmacdf3" | ||
16807 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16808 | + (plus:DF (neg:DF (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16809 | + (match_operand:DF 2 "avr32_fp_register_operand" "f"))) | ||
16810 | + (match_operand:DF 3 "avr32_fp_register_operand" "0")))] | ||
16811 | + "TARGET_HARD_FLOAT" | ||
16812 | + "fnmac.d\t%0, %1, %2" | ||
16813 | + [(set_attr "length" "4") | ||
16814 | + (set_attr "type" "fmul")]) | ||
16815 | + | ||
16816 | +(define_peephole2 | ||
16817 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "") | ||
16818 | + (mult:DF (match_operand:DF 1 "avr32_fp_register_operand" "") | ||
16819 | + (match_operand:DF 2 "avr32_fp_register_operand" ""))) | ||
16820 | + (set (match_operand:DF 3 "avr32_fp_register_operand" "") | ||
16821 | + (minus:DF | ||
16822 | + (match_dup 3) | ||
16823 | + (match_dup 0)))] | ||
16824 | + "TARGET_HARD_FLOAT && peep2_reg_dead_p(2, operands[0])" | ||
16825 | + [(set (match_dup 3) | ||
16826 | + (plus:DF (neg:DF (mult:DF (match_dup 1) | ||
16827 | + (match_dup 2))) | ||
16828 | + (match_dup 3)))] | ||
16829 | +) | ||
16830 | + | ||
16831 | +(define_insn "adddf3" | ||
16832 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16833 | + (plus:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16834 | + (match_operand:DF 2 "avr32_fp_register_operand" "f")))] | ||
16835 | + "TARGET_HARD_FLOAT" | ||
16836 | + "fadd.d\t%0, %1, %2" | ||
16837 | + [(set_attr "length" "4") | ||
16838 | + (set_attr "type" "fmul")]) | ||
16839 | + | ||
16840 | +(define_insn "subdf3" | ||
16841 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16842 | + (minus:DF (match_operand:DF 1 "avr32_fp_register_operand" "f") | ||
16843 | + (match_operand:DF 2 "avr32_fp_register_operand" "f")))] | ||
16844 | + "TARGET_HARD_FLOAT" | ||
16845 | + "fsub.d\t%0, %1, %2" | ||
16846 | + [(set_attr "length" "4") | ||
16847 | + (set_attr "type" "fmul")]) | ||
16848 | + | ||
16849 | +(define_insn "negdf2" | ||
16850 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16851 | + (neg:DF (match_operand:DF 1 "avr32_fp_register_operand" "f")))] | ||
16852 | + "TARGET_HARD_FLOAT" | ||
16853 | + "fneg.d\t%0, %1" | ||
16854 | + [(set_attr "length" "4") | ||
16855 | + (set_attr "type" "fmv")]) | ||
16856 | + | ||
16857 | +(define_insn "absdf2" | ||
16858 | + [(set (match_operand:DF 0 "avr32_fp_register_operand" "=f") | ||
16859 | + (abs:DF (match_operand:DF 1 "avr32_fp_register_operand" "f")))] | ||
16860 | + "TARGET_HARD_FLOAT" | ||
16861 | + "fabs.d\t%0, %1" | ||
16862 | + [(set_attr "length" "4") | ||
16863 | + (set_attr "type" "fmv")]) | ||
16864 | + | ||
16865 | + | ||
16866 | +(define_expand "cmpdf" | ||
16867 | + [(set (cc0) | ||
16868 | + (compare:DF | ||
16869 | + (match_operand:DF 0 "general_operand" "") | ||
16870 | + (match_operand:DF 1 "general_operand" "")))] | ||
16871 | + "TARGET_HARD_FLOAT" | ||
16872 | + "{ | ||
16873 | + rtx tmpreg; | ||
16874 | + if ( !REG_P(operands[0]) ) | ||
16875 | + operands[0] = force_reg(DFmode, operands[0]); | ||
16876 | + | ||
16877 | + if ( !REG_P(operands[1]) ) | ||
16878 | + operands[1] = force_reg(DFmode, operands[1]); | ||
16879 | + | ||
16880 | + avr32_compare_op0 = operands[0]; | ||
16881 | + avr32_compare_op1 = operands[1]; | ||
16882 | + | ||
16883 | + emit_insn(gen_cmpdf_internal(operands[0], operands[1])); | ||
16884 | + | ||
16885 | + tmpreg = gen_reg_rtx(SImode); | ||
16886 | + emit_insn(gen_fpcc_to_reg(tmpreg)); | ||
16887 | + emit_insn(gen_reg_to_cc(tmpreg)); | ||
16888 | + | ||
16889 | + DONE; | ||
16890 | + }" | ||
16891 | +) | ||
16892 | + | ||
16893 | +(define_insn "cmpdf_internal" | ||
16894 | + [(set (reg:CC FPCC_REGNUM) | ||
16895 | + (compare:CC | ||
16896 | + (match_operand:DF 0 "avr32_fp_register_operand" "f") | ||
16897 | + (match_operand:DF 1 "avr32_fp_register_operand" "f")))] | ||
16898 | + "TARGET_HARD_FLOAT" | ||
16899 | + { | ||
16900 | + if (!rtx_equal_p(cc_prev_status.mdep.fpvalue, SET_SRC(PATTERN (insn))) ) | ||
16901 | + return "fcmp.d\t%0, %1"; | ||
16902 | + return ""; | ||
16903 | + } | ||
16904 | + [(set_attr "length" "4") | ||
16905 | + (set_attr "type" "fcmpd") | ||
16906 | + (set_attr "cc" "fpcompare")]) | ||
16907 | + | ||
16908 | +(define_expand "cmpsf" | ||
16909 | + [(set (cc0) | ||
16910 | + (compare:SF | ||
16911 | + (match_operand:SF 0 "general_operand" "") | ||
16912 | + (match_operand:SF 1 "general_operand" "")))] | ||
16913 | + "TARGET_HARD_FLOAT" | ||
16914 | + "{ | ||
16915 | + rtx tmpreg; | ||
16916 | + if ( !REG_P(operands[0]) ) | ||
16917 | + operands[0] = force_reg(SFmode, operands[0]); | ||
16918 | + | ||
16919 | + if ( !REG_P(operands[1]) ) | ||
16920 | + operands[1] = force_reg(SFmode, operands[1]); | ||
16921 | + | ||
16922 | + avr32_compare_op0 = operands[0]; | ||
16923 | + avr32_compare_op1 = operands[1]; | ||
16924 | + | ||
16925 | + emit_insn(gen_cmpsf_internal(operands[0], operands[1])); | ||
16926 | + | ||
16927 | + tmpreg = gen_reg_rtx(SImode); | ||
16928 | + emit_insn(gen_fpcc_to_reg(tmpreg)); | ||
16929 | + emit_insn(gen_reg_to_cc(tmpreg)); | ||
16930 | + | ||
16931 | + DONE; | ||
16932 | + }" | ||
16933 | +) | ||
16934 | + | ||
16935 | +(define_insn "cmpsf_internal" | ||
16936 | + [(set (reg:CC FPCC_REGNUM) | ||
16937 | + (compare:CC | ||
16938 | + (match_operand:SF 0 "avr32_fp_register_operand" "f") | ||
16939 | + (match_operand:SF 1 "avr32_fp_register_operand" "f")))] | ||
16940 | + "TARGET_HARD_FLOAT" | ||
16941 | + { | ||
16942 | + if (!rtx_equal_p(cc_prev_status.mdep.fpvalue, SET_SRC(PATTERN (insn))) ) | ||
16943 | + return "fcmp.s\t%0, %1"; | ||
16944 | + return ""; | ||
16945 | + } | ||
16946 | + [(set_attr "length" "4") | ||
16947 | + (set_attr "type" "fcmps") | ||
16948 | + (set_attr "cc" "fpcompare")]) | ||
16949 | + | ||
16950 | +(define_insn "fpcc_to_reg" | ||
16951 | + [(set (match_operand:SI 0 "register_operand" "=r") | ||
16952 | + (unspec:SI [(reg:CC FPCC_REGNUM)] | ||
16953 | + UNSPEC_FPCC_TO_REG))] | ||
16954 | + "TARGET_HARD_FLOAT" | ||
16955 | + "fmov.s\t%0, fsr" | ||
16956 | + [(set_attr "length" "4") | ||
16957 | + (set_attr "type" "fmvcpu")]) | ||
16958 | + | ||
16959 | +(define_insn "reg_to_cc" | ||
16960 | + [(set (cc0) | ||
16961 | + (unspec:SI [(match_operand:SI 0 "register_operand" "r")] | ||
16962 | + UNSPEC_REG_TO_CC))] | ||
16963 | + "TARGET_HARD_FLOAT" | ||
16964 | + "musfr\t%0" | ||
16965 | + [(set_attr "length" "2") | ||
16966 | + (set_attr "type" "alu") | ||
16967 | + (set_attr "cc" "from_fpcc")]) | ||
16968 | + | ||
16969 | +(define_insn "stm_fp" | ||
16970 | + [(unspec [(match_operand 0 "register_operand" "r") | ||
16971 | + (match_operand 1 "const_int_operand" "") | ||
16972 | + (match_operand 2 "const_int_operand" "")] | ||
16973 | + UNSPEC_STMFP)] | ||
16974 | + "TARGET_HARD_FLOAT" | ||
16975 | + { | ||
16976 | + int cop_reglist = INTVAL(operands[1]); | ||
16977 | + | ||
16978 | + if (INTVAL(operands[2]) != 0) | ||
16979 | + return "stcm.w\tcp0, --%0, %C1"; | ||
16980 | + else | ||
16981 | + return "stcm.w\tcp0, %0, %C1"; | ||
16982 | + | ||
16983 | + if ( cop_reglist & ~0xff ){ | ||
16984 | + operands[1] = GEN_INT(cop_reglist & ~0xff); | ||
16985 | + if (INTVAL(operands[2]) != 0) | ||
16986 | + return "stcm.d\tcp0, --%0, %D1"; | ||
16987 | + else | ||
16988 | + return "stcm.d\tcp0, %0, %D1"; | ||
16989 | + } | ||
16990 | + } | ||
16991 | + [(set_attr "type" "fstm") | ||
16992 | + (set_attr "length" "4") | ||
16993 | + (set_attr "cc" "none")]) | ||
16994 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/lib1funcs.S gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/lib1funcs.S | ||
16995 | --- gcc-4.0.2/gcc/config/avr32/lib1funcs.S 1970-01-01 01:00:00.000000000 +0100 | ||
16996 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/lib1funcs.S 2006-10-10 12:36:34.000000000 +0200 | ||
16997 | @@ -0,0 +1,1678 @@ | ||
16998 | +/*#define __IEEE_LARGE_FLOATS__*/ | ||
16999 | + | ||
17000 | +/* Adjust the unpacked double number if it is a subnormal number. | ||
17001 | + The exponent and mantissa pair are stored | ||
17002 | + in [mant_hi,mant_lo] and [exp]. A register with the correct sign bit in | ||
17003 | + the MSB is passed in [sign]. Needs two scratch | ||
17004 | + registers [scratch1] and [scratch2]. An adjusted and packed double float | ||
17005 | + is present in [mant_hi,mant_lo] after macro has executed */ | ||
17006 | +.macro adjust_subnormal_df exp, mant_lo, mant_hi, sign, scratch1, scratch2 | ||
17007 | + /* We have an exponent which is <=0 indicating a subnormal number | ||
17008 | + As it should be stored as if the exponent was 1 (although the | ||
17009 | + exponent field is all zeros to indicate a subnormal number) | ||
17010 | + we have to shift down the mantissa to its correct position. */ | ||
17011 | + neg \exp | ||
17012 | + sub \exp,-1 /* amount to shift down */ | ||
17013 | + cp.w \exp,54 | ||
17014 | + brlo 50f /* if more than 53 shift steps, the | ||
17015 | + entire mantissa will disappear | ||
17016 | + without any rounding to occur */ | ||
17017 | + mov \mant_hi, 0 | ||
17018 | + mov \mant_lo, 0 | ||
17019 | + rjmp 52f | ||
17020 | +50: | ||
17021 | + sub \exp,-10 /* do the shift to position the | ||
17022 | + mantissa at the same time | ||
17023 | + note! this does not include the | ||
17024 | + final 1 step shift to add the sign */ | ||
17025 | + | ||
17026 | + /* when shifting, save all shifted out bits in [scratch2]. we may need to | ||
17027 | + look at them to make correct rounding. */ | ||
17028 | + | ||
17029 | + rsub \scratch1,\exp,32 /* get inverted shift count */ | ||
17030 | + cp.w \exp,32 /* handle shifts >= 32 separately */ | ||
17031 | + brhs 51f | ||
17032 | + | ||
17033 | + /* small (<32) shift amount, both words are part of the shift */ | ||
17034 | + lsl \scratch2,\mant_lo,\scratch1 /* save bits to shift out from lsw*/ | ||
17035 | + lsl \scratch1,\mant_hi,\scratch1 /* get bits from msw destined for lsw*/ | ||
17036 | + lsr \mant_lo,\mant_lo,\exp /* shift down lsw */ | ||
17037 | + lsr \mant_hi,\mant_hi,\exp /* shift down msw */ | ||
17038 | + or \mant_hi,\scratch1 /* add bits from msw with prepared lsw */ | ||
17039 | + rjmp 50f | ||
17040 | + | ||
17041 | + /* large (>=32) shift amount, only lsw will have bits left after shift. | ||
17042 | + note that shift operations will use ((shift count) mod 32) so | ||
17043 | + we do not need to subtract 32 from shift count. */ | ||
17044 | +51: | ||
17045 | + lsl \scratch2,\mant_hi,\scratch1 /* save bits to shift out from msw */ | ||
17046 | + or \scratch2,\mant_lo /* also save all bits from lsw */ | ||
17047 | + mov \mant_lo,\mant_hi /* msw -> lsw (i.e. "shift 32 first") */ | ||
17048 | + mov \mant_hi,0 /* clear msw */ | ||
17049 | + lsr \mant_lo,\mant_lo,\exp /* make rest of shift inside lsw */ | ||
17050 | + | ||
17051 | +50: | ||
17052 | + /* result is almost ready to return, except that least significant bit | ||
17053 | + and the part we already shifted out may cause the result to be | ||
17054 | + rounded */ | ||
17055 | + bld \mant_lo,0 /* get bit to be shifted out */ | ||
17056 | + brcc 51f /* if bit was 0, no rounding */ | ||
17057 | + | ||
17058 | + /* msb of part to remove is 1, so rounding depends on rest of bits */ | ||
17059 | + tst \scratch2,\scratch2 /* get shifted out tail */ | ||
17060 | + brne 50f /* if rest > 0, do round */ | ||
17061 | + bld \mant_lo,1 /* we have to look at lsb in result */ | ||
17062 | + brcc 51f /* if lsb is 0, don't round */ | ||
17063 | + | ||
17064 | +50: | ||
17065 | + /* subnormal result requires rounding | ||
17066 | + rounding may cause subnormal to become smallest normal number | ||
17067 | + luckily, smallest normal number has exactly the representation | ||
17068 | + we got by rippling a one bit up from mantissa into exponent field. */ | ||
17069 | + sub \mant_lo,-1 | ||
17070 | + subcc \mant_hi,-1 | ||
17071 | + | ||
17072 | +51: | ||
17073 | + /* shift and return packed double with correct sign */ | ||
17074 | + rol \sign | ||
17075 | + ror \mant_hi | ||
17076 | + ror \mant_lo | ||
17077 | +52: | ||
17078 | +.endm | ||
17079 | + | ||
17080 | + | ||
17081 | +/* Adjust subnormal single float number with exponent [exp] | ||
17082 | + and mantissa [mant] and round. */ | ||
17083 | +.macro adjust_subnormal_sf sf, exp, mant, sign, scratch | ||
17084 | + /* subnormal number */ | ||
17085 | + rsub \exp,\exp, 1 /* shift amount */ | ||
17086 | + cp.w \exp, 25 | ||
17087 | + movhs \mant, 0 | ||
17088 | + brhs 90f /* Return zero */ | ||
17089 | + rsub \scratch, \exp, 32 | ||
17090 | + lsl \scratch, \mant,\scratch/* Check if there are any bits set | ||
17091 | + in the bits discarded in the mantissa */ | ||
17092 | + srne \scratch /* If so set the lsb of the shifted mantissa */ | ||
17093 | + lsr \mant,\mant,\exp /* Shift the mantissa */ | ||
17094 | + or \mant, \scratch /* Round lsb if any bits were shifted out */ | ||
17095 | + /* Rounding : For explaination, see round_sf. */ | ||
17096 | + mov \scratch, 0x7f /* Set rounding constant */ | ||
17097 | + bld \mant, 8 | ||
17098 | + subeq \scratch, -1 /* For odd numbers use rounding constant 0x80 */ | ||
17099 | + add \mant, \scratch /* Add rounding constant to mantissa */ | ||
17100 | + /* We can't overflow because mantissa is at least shifted one position | ||
17101 | + to the right so the implicit bit is zero. We can however get the implicit | ||
17102 | + bit set after rounding which means that we have the lowest normal number | ||
17103 | + but this is ok since this bit has the same position as the LSB of the | ||
17104 | + exponent */ | ||
17105 | + lsr \sf, \mant, 7 | ||
17106 | + /* Rotate in sign */ | ||
17107 | + lsl \sign, 1 | ||
17108 | + ror \sf | ||
17109 | +90: | ||
17110 | +.endm | ||
17111 | + | ||
17112 | + | ||
17113 | +/* Round the unpacked df number with exponent [exp] and | ||
17114 | + mantissa [mant_hi, mant_lo]. Uses scratch register | ||
17115 | + [scratch] */ | ||
17116 | +.macro round_df exp, mant_lo, mant_hi, scratch | ||
17117 | + mov \scratch, 0x3ff /* Rounding constant */ | ||
17118 | + bld \mant_lo,11 /* Check if lsb in the final result is | ||
17119 | + set */ | ||
17120 | + subeq \scratch, -1 /* Adjust rounding constant to 0x400 | ||
17121 | + if rounding 0.5 upwards */ | ||
17122 | + add \mant_lo, \scratch /* Round */ | ||
17123 | + acr \mant_hi /* If overflowing we know that | ||
17124 | + we have all zeros in the bits not | ||
17125 | + scaled out so we can leave them | ||
17126 | + but we must increase the exponent with | ||
17127 | + two since we had an implicit bit | ||
17128 | + which is lost + the extra overflow bit */ | ||
17129 | + subcs \exp, -2 /* Update exponent */ | ||
17130 | +.endm | ||
17131 | + | ||
17132 | +/* Round single float number stored in [mant] and [exp] */ | ||
17133 | +.macro round_sf exp, mant, scratch | ||
17134 | + /* Round: | ||
17135 | + For 0.5 we round to nearest even integer | ||
17136 | + for all other cases we round to nearest integer. | ||
17137 | + This means that if the digit left of the "point" (.) | ||
17138 | + is 1 we can add 0x80 to the mantissa since the | ||
17139 | + corner case 0x180 will round up to 0x200. If the | ||
17140 | + digit left of the "point" is 0 we will have to | ||
17141 | + add 0x7f since this will give 0xff and hence a | ||
17142 | + truncation/rounding downwards for the corner | ||
17143 | + case when the 9 lowest bits are 0x080 */ | ||
17144 | + mov \scratch, 0x7f /* Set rounding constant */ | ||
17145 | + /* Check if the mantissa is even or odd */ | ||
17146 | + bld \mant, 8 | ||
17147 | + subeq \scratch, -1 /* Rounding constant should be 0x80 */ | ||
17148 | + add \mant, \scratch | ||
17149 | + subcs \exp, -2 /* Adjust exponent if we overflowed */ | ||
17150 | +.endm | ||
17151 | + | ||
17152 | +/* Scale mantissa [mant_hi, mant_lo] with amount [shift_count]. | ||
17153 | + Uses scratch registers [scratch1] and [scratch2] */ | ||
17154 | +.macro scale_df shift_count, mant_lo, mant_hi, scratch1, scratch2 | ||
17155 | + /* Scale [mant_hi, mant_lo] with shift_amount. | ||
17156 | + Must not forget the sticky bits we intend to shift out. */ | ||
17157 | + | ||
17158 | + rsub \scratch1,\shift_count,32/* get (32 - shift count) | ||
17159 | + (if shift count > 32 we get a | ||
17160 | + negative value, but that will | ||
17161 | + work as well in the code below.) */ | ||
17162 | + | ||
17163 | + cp.w \shift_count,32 /* handle shifts >= 32 separately */ | ||
17164 | + brhs 70f | ||
17165 | + | ||
17166 | + /* small (<32) shift amount, both words are part of the shift | ||
17167 | + first remember whether part that is lost contains any 1 bits ... */ | ||
17168 | + lsl \scratch2,\mant_lo,\scratch1 /*shift away bits that are part of | ||
17169 | + final mantissa. only part that goes | ||
17170 | + to scratch2 are bits that will be lost */ | ||
17171 | + | ||
17172 | + /* ... and now to the actual shift */ | ||
17173 | + lsl \scratch1,\mant_hi,\scratch1 /* get bits from msw destined for lsw*/ | ||
17174 | + lsr \mant_lo,\mant_lo,\shift_count /* shift down lsw of mantissa */ | ||
17175 | + lsr \mant_hi,\mant_hi,\shift_count /* shift down msw of mantissa */ | ||
17176 | + or \mant_lo,\scratch1 /* combine these bits with prepared lsw*/ | ||
17177 | + rjmp 71f | ||
17178 | + | ||
17179 | + /* large (>=32) shift amount, only lsw will have bits left after shift. | ||
17180 | + note that shift operations will use ((shift count) mod 32) so | ||
17181 | + we do not need to subtract 32 from shift count. */ | ||
17182 | +70: | ||
17183 | + /* first remember whether part that is lost contains any 1 bits ... */ | ||
17184 | + lsl \scratch2,\mant_hi,\scratch1 /* save all lost bits from msw */ | ||
17185 | + or \scratch2,\mant_lo /* also save lost bits (all) from lsw | ||
17186 | + now scratch2<>0 if we lose any bits */ | ||
17187 | + | ||
17188 | + /* ... and now to the actual shift */ | ||
17189 | + mov \mant_lo,\mant_hi /* msw -> lsw (i.e. "shift 32 first")*/ | ||
17190 | + mov \mant_hi,0 /* clear msw */ | ||
17191 | + lsr \mant_lo,\mant_lo,\shift_count /* make rest of shift inside lsw*/ | ||
17192 | + | ||
17193 | +71: | ||
17194 | + cp.w \scratch2,0 /* if any '1' bit in part we lost ...*/ | ||
17195 | + breq 70f | ||
17196 | + | ||
17197 | + sbr \mant_lo,0 /* ... we need to set sticky bit*/ | ||
17198 | +70: | ||
17199 | +.endm | ||
17200 | + | ||
17201 | +/* Unpack exponent and mantissa from the double number | ||
17202 | + stored in [df_hi,df_lo]. The exponent is stored in [exp] | ||
17203 | + while the mantissa is stored in [df_hi,df_lo]. */ | ||
17204 | + | ||
17205 | +.macro unpack_df exp, df_lo, df_hi | ||
17206 | + lsr \exp, \df_hi,21 /* Extract exponent */ | ||
17207 | + lsl \df_hi,10 /* Get mantissa */ | ||
17208 | + or \df_hi,\df_hi,\df_lo>>21 | ||
17209 | + lsl \df_lo,11 | ||
17210 | + | ||
17211 | + neg \exp /* Fix implicit bit */ | ||
17212 | + bst \df_hi,31 | ||
17213 | + subeq \exp,1 | ||
17214 | + neg \exp /* negate back exponent */ | ||
17215 | + .endm | ||
17216 | + | ||
17217 | +/* Unpack exponent and mantissa from the single float number | ||
17218 | + stored in [sf]. The exponent is stored in [exp] | ||
17219 | + while the mantissa is stored in [sf]. */ | ||
17220 | +.macro unpack_sf exp, sf | ||
17221 | + lsr \exp, \sf, 24 | ||
17222 | + brne 80f | ||
17223 | + /* Fix subnormal number */ | ||
17224 | + lsl \sf,7 | ||
17225 | + clz \exp,\sf | ||
17226 | + lsl \sf,\sf,\exp | ||
17227 | + rsub \exp,\exp,1 | ||
17228 | + rjmp 81f | ||
17229 | +80: | ||
17230 | + lsl \sf,7 | ||
17231 | + sbr \sf, 31 /*Implicit bit*/ | ||
17232 | +81: | ||
17233 | +.endm | ||
17234 | + | ||
17235 | + | ||
17236 | + | ||
17237 | +/* Pack a single float number stored in [mant] and [exp] | ||
17238 | + into a single float number in [sf] */ | ||
17239 | +.macro pack_sf sf, exp, mant | ||
17240 | + bld \mant,31 /* implicit bit to z */ | ||
17241 | + subne \exp,1 /* if subnormal (implicit bit 0) | ||
17242 | + adjust exponent to storage format */ | ||
17243 | + | ||
17244 | + lsr \sf, \mant, 7 | ||
17245 | + bfins \sf, \exp, 24, 8 | ||
17246 | +.endm | ||
17247 | + | ||
17248 | +/* Pack exponent [exp] and mantissa [mant_hi, mant_lo] | ||
17249 | + into [df_hi, df_lo]. [df_hi] is shifted | ||
17250 | + one bit up so the sign bit can be shifted into it */ | ||
17251 | + | ||
17252 | +.macro pack_df exp, mant_lo, mant_hi, df_lo, df_hi | ||
17253 | + bld \mant_hi,31 /* implicit bit to z */ | ||
17254 | + subne \exp,1 /* if subnormal (implicit bit 0) | ||
17255 | + adjust exponent to storage format */ | ||
17256 | + | ||
17257 | + lsr \mant_lo,11 /* shift back lsw */ | ||
17258 | + or \df_lo,\mant_lo,\mant_hi<<21 /* combine with low bits from msw */ | ||
17259 | + lsl \mant_hi,1 /* get rid of implicit bit */ | ||
17260 | + lsr \mant_hi,11 /* shift back msw except for one step*/ | ||
17261 | + or \df_hi,\mant_hi,\exp<<21 /* combine msw with exponent */ | ||
17262 | +.endm | ||
17263 | + | ||
17264 | +/* Normalize single float number stored in [mant] and [exp] | ||
17265 | + using scratch register [scratch] */ | ||
17266 | +.macro normalize_sf exp, mant, scratch | ||
17267 | + /* Adjust exponent and mantissa */ | ||
17268 | + clz \scratch, \mant | ||
17269 | + sub \exp, \scratch | ||
17270 | + lsl \mant, \mant, \scratch | ||
17271 | +.endm | ||
17272 | + | ||
17273 | +/* Normalize the exponent and mantissa pair stored | ||
17274 | + in [mant_hi,mant_lo] and [exp]. Needs two scratch | ||
17275 | + registers [scratch1] and [scratch2]. */ | ||
17276 | +.macro normalize_df exp, mant_lo, mant_hi, scratch1, scratch2 | ||
17277 | + clz \scratch1,\mant_hi /* Check if we have zeros in high bits */ | ||
17278 | + breq 80f /* No need for scaling if no zeros in high bits */ | ||
17279 | + cp.w \scratch1,32 /* Check for all zeros */ | ||
17280 | + breq 81f | ||
17281 | + | ||
17282 | + /* shift amount is smaller than 32, and involves both msw and lsw*/ | ||
17283 | + rsub \scratch2,\scratch1,32 /* shift mantissa */ | ||
17284 | + lsl \mant_hi,\mant_hi,\scratch1 | ||
17285 | + lsr \scratch2,\mant_lo,\scratch2 | ||
17286 | + or \mant_hi,\scratch2 | ||
17287 | + lsl \mant_lo,\mant_lo,\scratch1 | ||
17288 | + sub \exp,\scratch1 /* adjust exponent */ | ||
17289 | + rjmp 80f /* Finished */ | ||
17290 | +81: | ||
17291 | + /* shift amount is greater than 32 */ | ||
17292 | + clz \scratch1,\mant_lo /* shift mantissa */ | ||
17293 | + sub \scratch1,-32 | ||
17294 | + mov \mant_hi,\mant_lo | ||
17295 | + lsl \mant_hi,\mant_hi,\scratch1 | ||
17296 | + mov \mant_lo,0 | ||
17297 | + sub \exp,\scratch1 /* adjust exponent */ | ||
17298 | +80: | ||
17299 | +.endm | ||
17300 | + | ||
17301 | + | ||
17302 | +#ifdef L_avr32_f64_mul | ||
17303 | + .align 2 | ||
17304 | + .global __avr32_f64_mul | ||
17305 | + .type __avr32_f64_mul,@function | ||
17306 | + | ||
17307 | +__avr32_f64_mul: | ||
17308 | + pushm r0-r3,r4-r7,lr | ||
17309 | + | ||
17310 | + /* Unpack */ | ||
17311 | + eor r12, r11, r9 /* Sign op1 ^ Sign op2 is MSB of r12*/ | ||
17312 | + lsl r11,1 /* Unpack op1 */ | ||
17313 | + lsl r9,1 /* Unpack op2 */ | ||
17314 | + | ||
17315 | + /* Sort operands op1 >= op2 */ | ||
17316 | + lddpc r5, .Linf | ||
17317 | + cp.w r10,r8 | ||
17318 | + cpc r11,r9 | ||
17319 | + brhs 0f | ||
17320 | + | ||
17321 | + mov r7,r11 /* swap operands if op2 was larger */ | ||
17322 | + mov r6,r10 | ||
17323 | + mov r11,r9 | ||
17324 | + mov r10,r8 | ||
17325 | + mov r9,r7 | ||
17326 | + mov r8,r6 | ||
17327 | + | ||
17328 | +0: | ||
17329 | + /* Check against infinity */ | ||
17330 | + cp.w r11,r5 | ||
17331 | + brlo 1f | ||
17332 | + /* infinity or nan */ | ||
17333 | + /* we have to check low word as well as nan mantissa may be 0 in msw*/ | ||
17334 | + cpc r10 | ||
17335 | + /* we know that op1 is inf or nan. if z != 1 then we have nan. | ||
17336 | + in this case, also return nan. */ | ||
17337 | + breq 0f | ||
17338 | + /* Return NaN */ | ||
17339 | + mov r11, -1 | ||
17340 | + rjmp __dfmul_return_op1 | ||
17341 | +0: | ||
17342 | + | ||
17343 | + /* op1 is infinity. op2 is smaller or same so it cannot be nan. | ||
17344 | + it can be infinity or a (sub-)normal number. | ||
17345 | + we should return op1 (infinity) except when op2 is zero when | ||
17346 | + result should be nan. */ | ||
17347 | + or r5,r9,r8 | ||
17348 | + brne __dfmul_return_op1 /* op2 is not zero. return op1.*/ | ||
17349 | + /* Return NaN */ | ||
17350 | + mov r11, -1 | ||
17351 | + rjmp __dfmul_return_op1 | ||
17352 | + | ||
17353 | +1: | ||
17354 | + /* no operand is inf/nan, and operands have been arranged in order | ||
17355 | + with op1 >= op2, implying that if we have a zero, it is found in | ||
17356 | + op2. in this case, result should be zero (with sign from both ops). */ | ||
17357 | + | ||
17358 | + or r5,r9,r8 /* check the smaller value for zero */ | ||
17359 | + brne 0f | ||
17360 | + mov r10, 0 | ||
17361 | + mov r11, 0 | ||
17362 | + rjmp __dfmul_return_op1 /* Early exit */ | ||
17363 | +0: | ||
17364 | + | ||
17365 | + /* we have two "normal" (can be subnormal) nonzero numbers in r11:r10 | ||
17366 | + and r9:r8. sign of result is already calculated in r12. | ||
17367 | + perform a normal multiplication. */ | ||
17368 | + | ||
17369 | + /* Unpack and normalize*/ | ||
17370 | + unpack_df r7 /*exp*/, r10, r11 /* mantissa */ | ||
17371 | + normalize_df r7 /*exp*/, r10, r11 /* mantissa */, r4, r5 /* scratch */ | ||
17372 | + | ||
17373 | + | ||
17374 | + /* Unpack and normalize*/ | ||
17375 | + unpack_df r6 /*exp*/, r8, r9 /* mantissa */ | ||
17376 | + normalize_df r6 /*exp*/, r8, r9 /* mantissa */, r4, r5 /* scratch */ | ||
17377 | + | ||
17378 | + /* Multiply */ | ||
17379 | + | ||
17380 | + mulu.d r0,r10,r8 | ||
17381 | + add lr,r7,r6 /* calculate new exponent after mul */ | ||
17382 | + mulu.d r2,r11,r8 | ||
17383 | + sub lr,(1023-1) /* remove exponent bias as we have | ||
17384 | + included bias from both op1 and op2 | ||
17385 | + sub one less, or in other words | ||
17386 | + add one to exponent. see below why. */ | ||
17387 | + mulu.d r6,r11,r9 | ||
17388 | + add r2,r1 | ||
17389 | + mulu.d r4,r10,r9 | ||
17390 | + | ||
17391 | + | ||
17392 | + adc r6,r6,r3 | ||
17393 | + acr r7 | ||
17394 | + | ||
17395 | + add r4,r2 | ||
17396 | + adc r6,r6,r5 | ||
17397 | + acr r7 | ||
17398 | + | ||
17399 | + // r7:r6 is now in range [0x4000...0000 - 0xffff...fffe] | ||
17400 | + // remaining bits in r0 and r4 are of no interest, except that we have | ||
17401 | + // to add a sticky bit to r10 in case we had a 1 bit in r4 or r0. | ||
17402 | + | ||
17403 | + or r4,r0 | ||
17404 | + movne r0, 1 /* If we have bits in r4 or r0 */ | ||
17405 | + or r6,r0 /* set lsb of result to 1 */ | ||
17406 | + | ||
17407 | + | ||
17408 | + // if msb is set, it was because multiplication gave an "overflow" | ||
17409 | + // of one bit so exponent should be incremented. | ||
17410 | + // we already did that above so we are done. | ||
17411 | + // if msb is *not* set it will be normalized and exponent will be | ||
17412 | + // decremented (which will compensate the one we added above). | ||
17413 | + | ||
17414 | + normalize_df lr /*exp*/, r6, r7 /* mantissa */, r8, r9 /* scratch */ | ||
17415 | + | ||
17416 | + /* Check if a subnormal result was created */ | ||
17417 | + cp.w lr, 0 | ||
17418 | + brgt 0f | ||
17419 | + | ||
17420 | + adjust_subnormal_df lr, r6, r7, r12, r8, r9 | ||
17421 | + mov r10, r6 | ||
17422 | + mov r11, r7 | ||
17423 | + popm r0-r3,r4-r7, pc | ||
17424 | +0: | ||
17425 | + | ||
17426 | + /* Round result */ | ||
17427 | + round_df lr /*exp*/, r6, r7 /* Mantissa */, r4 /*scratch*/ | ||
17428 | + cp.w lr,0x7ff | ||
17429 | + brlt 0f | ||
17430 | + /*Return infinity */ | ||
17431 | + lddpc r11, .Linf | ||
17432 | + mov r10, 0 | ||
17433 | + rjmp __dfmul_return_op1 | ||
17434 | + | ||
17435 | +0: | ||
17436 | + | ||
17437 | + /* Pack */ | ||
17438 | + pack_df lr /*exp*/, r6, r7 /* mantissa */, r10, r11 /* Output df number*/ | ||
17439 | +__dfmul_return_op1: | ||
17440 | + lsl r12,1 /* shift in sign bit */ | ||
17441 | + ror r11 | ||
17442 | + | ||
17443 | + popm r0-r3,r4-r7, pc | ||
17444 | + | ||
17445 | +#endif | ||
17446 | + | ||
17447 | + | ||
17448 | +#ifdef L_avr32_f64_addsub | ||
17449 | + .align 2 | ||
17450 | + .global __avr32_f64_sub | ||
17451 | + .type __avr32_f64_sub,@function | ||
17452 | + | ||
17453 | +__avr32_f64_sub: | ||
17454 | + pushm r4-r7,lr | ||
17455 | + | ||
17456 | + eor r12,r11,r9 // compare signs of operands | ||
17457 | + bld r12,31 | ||
17458 | + brcc __dfsub // same sign => subtract | ||
17459 | + | ||
17460 | + eorh r9,0x8000 | ||
17461 | + rjmp __dfadd // different signs => op1 + (-op2) | ||
17462 | +__dfsub: | ||
17463 | + | ||
17464 | + lsl r11,1 // unpack op1 msw and get sign in c | ||
17465 | + or r4,r11,r10 // check if all bits zero | ||
17466 | + brne 1f | ||
17467 | + | ||
17468 | + // op1 is zero, negate op2 and handle as add | ||
17469 | + eorh r9,0x8000 | ||
17470 | + // op1 is +/-0, and is unpacked with sign in c. add to op2. | ||
17471 | + // also used by sub, but op2 has been negated in this case | ||
17472 | + ror r12 // save sign of op1 in msb of r12 | ||
17473 | + lsl r9,1 // unpack msw and get sign of op2 | ||
17474 | + or r4,r9,r8 // check all bits in op2 | ||
17475 | + breq 0f | ||
17476 | + | ||
17477 | + // if op2 != 0, then return op2 unchanged. | ||
17478 | + ror r9 // pack op2 msw again with sign from c | ||
17479 | + mov r11,r9 | ||
17480 | + mov r10,r8 | ||
17481 | + popm r4-r7,pc | ||
17482 | + | ||
17483 | +0: | ||
17484 | + // both op1 and op2 zero, but sign unknown. result should and signs. | ||
17485 | + ror r9 // pack op2 msw again with sign from c | ||
17486 | + lsl r12,1 // get back sign of op1 into c ... | ||
17487 | + ror r11 // and back in original op1 | ||
17488 | + and r11,r9 // and sign bits. as op1 is zero, the | ||
17489 | + // only bit which can be 1 is sign bit | ||
17490 | + popm r4-r7,pc | ||
17491 | + | ||
17492 | +1: | ||
17493 | + ror r12 // save op1 sign in msb of r12 | ||
17494 | + | ||
17495 | + lsl r9,1 // unpack op2 msw | ||
17496 | + or r4,r8,r9 | ||
17497 | + brne 0f | ||
17498 | + // op2 is zero, return op1 | ||
17499 | + // whatever it is. the only case | ||
17500 | + // requiring special handling is if | ||
17501 | + // op1 is zero, but that was handled | ||
17502 | + // above. | ||
17503 | + lsl r12, 1 | ||
17504 | + ror r11 | ||
17505 | + popm r4-r7,pc | ||
17506 | + | ||
17507 | +0: | ||
17508 | + // make sure that op1 >= op2, flip sign if we swap ops | ||
17509 | + cp.w r10,r8 | ||
17510 | + cpc r11,r9 | ||
17511 | + brhs 0f | ||
17512 | + | ||
17513 | + com r12 // sign of op1 and result in lsb(r12) | ||
17514 | + mov r7,r11 // swap operands if op2 was larger | ||
17515 | + mov r6,r10 | ||
17516 | + mov r11,r9 | ||
17517 | + mov r10,r8 | ||
17518 | + mov r9,r7 | ||
17519 | + mov r8,r6 | ||
17520 | + | ||
17521 | +0: | ||
17522 | + // check if op1 is nan or inf. | ||
17523 | + lddpc r5,.Linf | ||
17524 | + cp.w r11,r5 | ||
17525 | + brlo 1f | ||
17526 | + /* Op 1 is nan or inf */ | ||
17527 | + // we have to check low word as well as nan mantissa may be 0 in msw | ||
17528 | + cpc r10 | ||
17529 | + // we know that op1 is inf or nan. if z != 1 then we have nan. | ||
17530 | + // if we have nan, return nan. | ||
17531 | + breq 0f | ||
17532 | + mov r11, -1 | ||
17533 | + rjmp __dfsub_return_op1 | ||
17534 | +0: | ||
17535 | + | ||
17536 | + // op1 is infinity. check if op2 is nan, infinty or a normal number. | ||
17537 | + cp.w r9,r5 | ||
17538 | + movhs r11, -1 // op2 is a normal number. return op1. | ||
17539 | + | ||
17540 | + // op2 can be infinity (of the same sign as op1) or nan. | ||
17541 | + // in both cases we should return nan. | ||
17542 | + rjmp __dfsub_return_op1 | ||
17543 | +1: | ||
17544 | + // if op1 is not inf or nan, then op2 cannot be since op1 >= op2 | ||
17545 | + | ||
17546 | + // now prepare the operands by expanding them and shifting op2 | ||
17547 | + // to the correct position for the subtract. note! if op2 is | ||
17548 | + // insignificant compared to op1, the function will take care of | ||
17549 | + // this and return op1 directly to the application. | ||
17550 | + | ||
17551 | + /* Unpack operands */ | ||
17552 | + unpack_df r7 /* exp op1*/, r10, r11 /* Mantissa op1 */ | ||
17553 | + unpack_df r6 /* exp op2*/, r8, r9 /* Mantissa op2 */ | ||
17554 | + | ||
17555 | + /* Get shift amount required for aligning op1 and op2 */ | ||
17556 | + rsub r6, r7 | ||
17557 | + breq __perform_dfsub /* No shift needed */ | ||
17558 | + | ||
17559 | + cp.w r6, 63 | ||
17560 | + brhs __dfsub_pack_result /* Op 2 insignificant compared to op1 */ | ||
17561 | + | ||
17562 | + /* Shift mantissa of op2 so that op1 and op2 are aligned */ | ||
17563 | + scale_df r6 /* shift_count*/, r8, r9 /* Mantissa */, r4, r5 /*Scratch*/ | ||
17564 | + | ||
17565 | +__perform_dfsub: | ||
17566 | + sub r10,r8 /* subtract mantissa of op2 from op1 */ | ||
17567 | + sbc r11,r11,r9 | ||
17568 | + or r4,r11,r10 /* check if result is all zeroes */ | ||
17569 | + brne 0f | ||
17570 | + popm r4-r7,pc /* Early return */ | ||
17571 | +0: | ||
17572 | + | ||
17573 | + normalize_df r7 /*exp*/, r10, r11 /* mantissa */, r8, r9 /* scratch */ | ||
17574 | + | ||
17575 | + /* Check if a subnormal result was created */ | ||
17576 | + cp.w r7, 0 | ||
17577 | + brgt 0f | ||
17578 | + | ||
17579 | + adjust_subnormal_df r7 /*exp*/, r10, r11 /* Mantissa */, r12 /*sign*/, r8, r9 /*scratch*/ | ||
17580 | + popm r4-r7,pc | ||
17581 | +0: | ||
17582 | + | ||
17583 | + /* Round result */ | ||
17584 | + round_df r7 /*exp*/, r10, r11 /* Mantissa */, r9 /*scratch*/ | ||
17585 | + cp.w r7,0x7ff | ||
17586 | + brlt __dfsub_pack_result | ||
17587 | + /*Return infinity */ | ||
17588 | + lddpc r11, .Linf | ||
17589 | + mov r10, 0 | ||
17590 | + rjmp __dfsub_return_op1 | ||
17591 | + | ||
17592 | +__dfsub_pack_result: | ||
17593 | + /* Pack */ | ||
17594 | + pack_df r7 /*exp*/, r10, r11 /* mantissa */, r10, r11 /* Output df number*/ | ||
17595 | + | ||
17596 | +__dfsub_return_op1: | ||
17597 | + lsl r12,1 | ||
17598 | + ror r11 | ||
17599 | + popm r4-r7,pc | ||
17600 | + | ||
17601 | + .align 2 | ||
17602 | + .global __avr32_f64_add | ||
17603 | + .type __avr32_f64_add,@function | ||
17604 | +__avr32_f64_add: | ||
17605 | + pushm r4-r7,lr | ||
17606 | + eor r12,r11,r9 // compare signs of operands | ||
17607 | + lsl r12,1 | ||
17608 | + brcc __dfadd // same sign => add | ||
17609 | + | ||
17610 | + eorh r9,0x8000 | ||
17611 | + rjmp __dfsub // different signs => op1 - (-op2) | ||
17612 | +__dfadd: | ||
17613 | + | ||
17614 | + lsl r11,1 // unpack op1 msw and get sign in c | ||
17615 | + or r4,r11,r10 // check if all bits zero | ||
17616 | + brne 1f | ||
17617 | + | ||
17618 | + // op1 is +/-0, and is unpacked with sign in c. add to op2. | ||
17619 | + // also used by sub, but op2 has been negated in this case | ||
17620 | + ror r12 // save sign of op1 in msb of r12 | ||
17621 | + lsl r9,1 // unpack msw and get sign of op2 | ||
17622 | + or r4,r9,r8 // check all bits in op2 | ||
17623 | + breq 0f | ||
17624 | + | ||
17625 | + // if op2 != 0, then return op2 unchanged. | ||
17626 | + ror r9 // pack op2 msw again with sign from c | ||
17627 | + mov r11,r9 | ||
17628 | + mov r10,r8 | ||
17629 | + popm r4-r7,pc | ||
17630 | + | ||
17631 | +0: | ||
17632 | + // both op1 and op2 zero, but sign unknown. result should and signs. | ||
17633 | + ror r9 // pack op2 msw again with sign from c | ||
17634 | + lsl r12,1 // get back sign of op1 into c ... | ||
17635 | + ror r11 // and back in original op1 | ||
17636 | + and r11,r9 // and sign bits. as op1 is zero, the | ||
17637 | + // only bit which can be 1 is sign bit | ||
17638 | + popm r4-r7,pc | ||
17639 | +1: | ||
17640 | + ror r12 // save op1 sign in msb of r12 | ||
17641 | + | ||
17642 | + lsl r9,1 // unpack op2 msw | ||
17643 | + or r4,r8,r9 | ||
17644 | + brne 0f | ||
17645 | + // op2 is zero, return op1 | ||
17646 | + // whatever it is. the only case | ||
17647 | + // requiring special handling is if | ||
17648 | + // op1 is zero, but that was handled | ||
17649 | + // above. | ||
17650 | + lsl r12, 1 | ||
17651 | + ror r11 | ||
17652 | + popm r4-r7,pc | ||
17653 | +0: | ||
17654 | + // make sure that exp[op1] >= exp[op2] | ||
17655 | + cp.w r11,r9 | ||
17656 | + brhs 0f | ||
17657 | + | ||
17658 | + mov r7,r11 // swap operands if op2 was larger | ||
17659 | + mov r6,r10 | ||
17660 | + mov r11,r9 | ||
17661 | + mov r10,r8 | ||
17662 | + mov r9,r7 | ||
17663 | + mov r8,r6 | ||
17664 | + | ||
17665 | +0: | ||
17666 | + // check if op1 is nan or inf. | ||
17667 | + lddpc r5,.Linf | ||
17668 | + cp.w r11,r5 | ||
17669 | + brlo 1f | ||
17670 | + /* Op 1 is nan or inf */ | ||
17671 | + // we have to check low word as well as nan mantissa may be 0 in msw | ||
17672 | + cpc r10 | ||
17673 | + // we know that op1 is inf or nan. if z != 1 then we have nan. | ||
17674 | + // if we have nan, return nan. | ||
17675 | + breq 0f | ||
17676 | + mov r11, -1 | ||
17677 | + rjmp __dfadd_return_op1 | ||
17678 | +0: | ||
17679 | + | ||
17680 | + // op1 is infinity. check if op2 is nan, infinty or a normal number. | ||
17681 | + cp.w r9,r5 | ||
17682 | + // Op2 is NaN of Inf. Return op2 but with sign of result. | ||
17683 | + // If Op2 is NaN, sign doesn't matter but no need to separate NaN | ||
17684 | + movhs r11, r9 | ||
17685 | + movhs r10, r8 | ||
17686 | + | ||
17687 | + // op2 can be infinity (of the same sign as op1) or nan. | ||
17688 | + // in both cases we should return nan. | ||
17689 | + rjmp __dfadd_return_op1 | ||
17690 | +1: | ||
17691 | + // if op1 is not inf or nan, then op2 cannot be since exp[op1] >= | ||
17692 | + // exp[op2] | ||
17693 | + | ||
17694 | + // now prepare the operands by expanding them and shifting op2 | ||
17695 | + // to the correct position for the add. note! if op2 is | ||
17696 | + // insignificant compared to op1, the function will take care of | ||
17697 | + // this and return op1 directly to the application. | ||
17698 | + | ||
17699 | + /* Unpack operands */ | ||
17700 | + unpack_df r7 /* exp op1*/, r10, r11 /* Mantissa op1 */ | ||
17701 | + unpack_df r6 /* exp op2*/, r8, r9 /* Mantissa op2 */ | ||
17702 | + | ||
17703 | + /* Get shift amount required for aligning op1 and op2 */ | ||
17704 | + rsub r6, r7 | ||
17705 | + breq __perform_dfadd /* No shift needed */ | ||
17706 | + | ||
17707 | + cp.w r6, 63 | ||
17708 | + brhs __dfadd_pack_result /* Op 2 insignificant compared to op1 */ | ||
17709 | + | ||
17710 | + /* Shift mantissa of op2 so that op1 and op2 are aligned */ | ||
17711 | + scale_df r6 /* shift_count*/, r8, r9 /* Mantissa */, r4, r5 /*Scratch*/ | ||
17712 | + | ||
17713 | +__perform_dfadd: | ||
17714 | + add r10,r8 // add mantissas | ||
17715 | + adc r11,r11,r9 | ||
17716 | + brcc 0f | ||
17717 | + ror r11 // overflow => shift down mantissa | ||
17718 | + ror r10 | ||
17719 | + brcc 1f // sticky bit shifted out? | ||
17720 | + sbr r10,0 // if so, merge it into result again | ||
17721 | +1: | ||
17722 | + sub r7,-1 // increase exponent with 1 | ||
17723 | +0: | ||
17724 | + normalize_df r7 /*exp*/, r10, r11 /* mantissa */, r8, r9 /* scratch */ | ||
17725 | + | ||
17726 | + /* Check if a subnormal result was created */ | ||
17727 | + cp.w r7, 0 | ||
17728 | + brgt 0f | ||
17729 | + | ||
17730 | + adjust_subnormal_df r7 /*exp*/, r10, r11 /* Mantissa */, r12 /*sign*/, r8, r9 /*scratch*/ | ||
17731 | + popm r4-r7,pc | ||
17732 | +0: | ||
17733 | + | ||
17734 | + /* Round result */ | ||
17735 | + round_df r7 /*exp*/, r10, r11 /* Mantissa */, r9 /*scratch*/ | ||
17736 | + cp.w r7,0x7ff | ||
17737 | + brlt __dfadd_pack_result | ||
17738 | + /*Return infinity */ | ||
17739 | + lddpc r11, .Linf | ||
17740 | + mov r10, 0 | ||
17741 | + rjmp __dfadd_return_op1 | ||
17742 | + | ||
17743 | +__dfadd_pack_result: | ||
17744 | + /* Pack */ | ||
17745 | + pack_df r7 /*exp*/, r10, r11 /* mantissa */, r10, r11 /* Output df number*/ | ||
17746 | + | ||
17747 | +__dfadd_return_op1: | ||
17748 | + lsl r12,1 | ||
17749 | + ror r11 | ||
17750 | + popm r4-r7,pc | ||
17751 | +#endif | ||
17752 | + | ||
17753 | +#ifdef L_avr32_f64_to_u32 | ||
17754 | + /* This goes into L_fixdfsi */ | ||
17755 | +#endif | ||
17756 | + | ||
17757 | + | ||
17758 | +#ifdef L_avr32_f64_to_s32 | ||
17759 | + .global __avr32_f64_to_u32 | ||
17760 | + .type __avr32_f64_to_u32,@function | ||
17761 | +__avr32_f64_to_u32: | ||
17762 | + cp.w r11, 0 | ||
17763 | + retmi 0 /* Negative returns 0 */ | ||
17764 | +#ifdef __LARGE_FLOATS__ | ||
17765 | + lsl r12,r11,1 | ||
17766 | + lsr r12,21 /* extract exponent*/ | ||
17767 | + sub r12,1023 /* convert to unbiased exponent.*/ | ||
17768 | + retlo 0 /* too small exponent implies zero. */ | ||
17769 | + cp.w r12,32 | ||
17770 | + brcc 0f | ||
17771 | + rjmp 1f | ||
17772 | +#endif | ||
17773 | + | ||
17774 | + /* Fallthrough to df to signed si conversion */ | ||
17775 | + .global __avr32_f64_to_s32 | ||
17776 | + .type __avr32_f64_to_s32,@function | ||
17777 | +__avr32_f64_to_s32: | ||
17778 | + lsl r12,r11,1 | ||
17779 | + lsr r12,21 /* extract exponent*/ | ||
17780 | + sub r12,1023 /* convert to unbiased exponent.*/ | ||
17781 | + retlo 0 /* too small exponent implies zero. */ | ||
17782 | + | ||
17783 | +#ifdef __LARGE_FLOATS__ | ||
17784 | + cp.w r12,31 | ||
17785 | + brcc 0f | ||
17786 | +#endif | ||
17787 | +1: | ||
17788 | + rsub r12,r12,31 /* shift count = 31 - exponent */ | ||
17789 | + mov r9,r11 /* save sign for later...*/ | ||
17790 | + lsl r11,11 /* remove exponent and sign*/ | ||
17791 | + sbr r11,31 /* add implicit bit*/ | ||
17792 | + or r11,r11,r10>>21 /* get rest of bits from lsw of double */ | ||
17793 | + lsr r11,r11,r12 /* shift down mantissa to final place */ | ||
17794 | + lsl r9,1 /* sign -> carry */ | ||
17795 | + retcc r11 /* if positive, we are done */ | ||
17796 | + neg r11 /* if negative float, negate result */ | ||
17797 | + ret r11 | ||
17798 | + | ||
17799 | +#ifdef __LARGE_FLOATS__ | ||
17800 | +0: | ||
17801 | + mov r12,-1 /* r11 = 0xffffffff */ | ||
17802 | + lsr r12,1 /* r11 = 0x7fffffff */ | ||
17803 | + lsl r11,1 /* sign -> carry */ | ||
17804 | + acr r12 /* r11 = signed ? 0x80000000 | ||
17805 | + : 0x7fffffff */ | ||
17806 | + ret r12 | ||
17807 | +#endif | ||
17808 | +#endif /* L_fixdfsi*/ | ||
17809 | + | ||
17810 | +#ifdef L_avr32_f64_to_u64 | ||
17811 | + /* Actual function is in L_fixdfdi */ | ||
17812 | +#endif | ||
17813 | + | ||
17814 | +#ifdef L_avr32_f64_to_s64 | ||
17815 | + .global __avr32_f64_to_u64 | ||
17816 | + .type __avr32_f64_to_u64,@function | ||
17817 | +__avr32_f64_to_u64: | ||
17818 | + cp.w r11,0 | ||
17819 | + /* Negative numbers return zero */ | ||
17820 | + movmi r10, 0 | ||
17821 | + movmi r11, 0 | ||
17822 | + retmi r11 | ||
17823 | +#ifdef __LARGE_FLOATS__ | ||
17824 | + lsl r9,r11,1 | ||
17825 | + lsr r9,21 /* get exponent*/ | ||
17826 | + sub r9,1023 /* convert to correct range*/ | ||
17827 | + /* Return zero if exponent to small */ | ||
17828 | + movlo r10, 0 | ||
17829 | + movlo r11, 0 | ||
17830 | + retlo r11 | ||
17831 | + cp.w r9,64 | ||
17832 | + mov r8,r11 /* save sign for later...*/ | ||
17833 | + brcs 1f | ||
17834 | + rjmp 2f /* Number to large */ | ||
17835 | + | ||
17836 | +#endif | ||
17837 | + | ||
17838 | + | ||
17839 | + | ||
17840 | + /* Fallthrough */ | ||
17841 | + .global __avr32_f64_to_s64 | ||
17842 | + .type __avr32_f64_to_s64,@function | ||
17843 | +__avr32_f64_to_s64: | ||
17844 | + lsl r9,r11,1 | ||
17845 | + lsr r9,21 /* get exponent*/ | ||
17846 | + sub r9,1023 /* convert to correct range*/ | ||
17847 | + /* Return zero if exponent to small */ | ||
17848 | + movlo r10, 0 | ||
17849 | + movlo r11, 0 | ||
17850 | + retlo r11 | ||
17851 | + | ||
17852 | +#ifdef __LARGE_FLOATS__ | ||
17853 | + cp.w r9,63 | ||
17854 | + mov r8,r11 /* save sign for later...*/ | ||
17855 | + brcc 2f | ||
17856 | +#else | ||
17857 | + mov r8,r11 /* save sign for later...*/ | ||
17858 | +#endif | ||
17859 | +1: | ||
17860 | + lsl r11,11 /* remove exponent */ | ||
17861 | + sbr r11,31 /* add implicit bit*/ | ||
17862 | + or r11,r11,r10>>21 /* get rest of bits from lsw of double*/ | ||
17863 | + lsl r10,11 /* align lsw correctly as well */ | ||
17864 | + rsub r9,r9,63 /* shift count = 63 - exponent */ | ||
17865 | + breq 1f | ||
17866 | + | ||
17867 | + cp.w r9,32 /* is shift count more than one reg? */ | ||
17868 | + brhs 0f | ||
17869 | + | ||
17870 | + mov r12,r11 /* save msw */ | ||
17871 | + lsr r10,r10,r9 /* small shift count, shift down lsw */ | ||
17872 | + lsr r11,r11,r9 /* small shift count, shift down msw */ | ||
17873 | + rsub r9,r9,32 /* get 32-size of shifted out tail */ | ||
17874 | + lsl r12,r12,r9 /* align part to move from msw to lsw */ | ||
17875 | + or r10,r12 /* combine to get new lsw */ | ||
17876 | + rjmp 1f | ||
17877 | + | ||
17878 | +0: | ||
17879 | + lsr r10,r11,r9 /* large shift count,only lsw get bits | ||
17880 | + note that shift count is modulo 32*/ | ||
17881 | + mov r11,0 /* msw will be 0 */ | ||
17882 | + | ||
17883 | +1: | ||
17884 | + lsl r8,1 /* sign -> carry */ | ||
17885 | + retcc r11 /* if positive, we are done */ | ||
17886 | + | ||
17887 | + neg r11 /* if negative float, negate result */ | ||
17888 | + neg r10 | ||
17889 | + scr r11 | ||
17890 | + ret r11 | ||
17891 | + | ||
17892 | + | ||
17893 | +#ifdef __LARGE_FLOATS__ | ||
17894 | +2: | ||
17895 | + mov r11,-1 /* r11 = 0xffffffff */ | ||
17896 | + lsr r11,1 /* r11 = 0x7fffffff */ | ||
17897 | + lsl r8,1 /* sign -> carry */ | ||
17898 | + acr r11 /* r11 = signed ? 0x80000000 */ | ||
17899 | + /* : 0x7fffffff */ | ||
17900 | + lsl r10,r11,31 /* extend last bit of msw*/ | ||
17901 | + asr r10,31 | ||
17902 | + ret r11 | ||
17903 | +#endif | ||
17904 | +#endif | ||
17905 | + | ||
17906 | +#ifdef L_avr32_u32_to_f64 | ||
17907 | + /* Code located in L_floatsidf */ | ||
17908 | +#endif | ||
17909 | + | ||
17910 | +#ifdef L_avr32_s32_to_f64 | ||
17911 | + .global __avr32_u32_to_f64 | ||
17912 | + .type __avr32_u32_to_f64,@function | ||
17913 | +__avr32_u32_to_f64: | ||
17914 | + sub r11, r12, 0 /* Move to r11 and force Z flag to be updated */ | ||
17915 | + mov r12, 0 /* always positive */ | ||
17916 | + rjmp 0f /* Jump to common code for floatsidf */ | ||
17917 | + | ||
17918 | + .global __avr32_s32_to_f64 | ||
17919 | + .type __avr32_s32_to_f64,@function | ||
17920 | +__avr32_s32_to_f64: | ||
17921 | + mov r11, r12 /* Keep original value in r12 for sign */ | ||
17922 | + abs r11 /* Absolute value if r12 */ | ||
17923 | +0: | ||
17924 | + mov r10,0 /* let remaining bits be zero */ | ||
17925 | + reteq r11 /* zero long will return zero float */ | ||
17926 | + | ||
17927 | + pushm lr | ||
17928 | + mov r9,31+1023 /* set exponent */ | ||
17929 | + | ||
17930 | + normalize_df r9 /*exp*/, r10, r11 /* mantissa */, r8, lr /* scratch */ | ||
17931 | + | ||
17932 | + /* Check if a subnormal result was created */ | ||
17933 | + cp.w r9, 0 | ||
17934 | + brgt 0f | ||
17935 | + | ||
17936 | + adjust_subnormal_df r9 /* exp */, r10, r11 /* Mantissa */, r12 /*sign*/, r8, lr /* scratch */ | ||
17937 | + popm pc | ||
17938 | +0: | ||
17939 | + | ||
17940 | + /* Round result */ | ||
17941 | + round_df r9 /*exp*/, r10, r11 /* Mantissa */, r8 /*scratch*/ | ||
17942 | + cp.w r9,0x7ff | ||
17943 | + brlt 0f | ||
17944 | + /*Return infinity */ | ||
17945 | + lddpc r11, .Linf | ||
17946 | + mov r10, 0 | ||
17947 | + rjmp __floatsidf_return_op1 | ||
17948 | + | ||
17949 | +0: | ||
17950 | + | ||
17951 | + /* Pack */ | ||
17952 | + pack_df r9 /*exp*/, r10, r11 /* mantissa */, r10, r11 /* Output df number*/ | ||
17953 | +__floatsidf_return_op1: | ||
17954 | + lsl r12,1 /* shift in sign bit */ | ||
17955 | + ror r11 | ||
17956 | + | ||
17957 | + popm pc | ||
17958 | +#endif | ||
17959 | + | ||
17960 | + | ||
17961 | +#ifdef L_avr32_f32_cmp_eq | ||
17962 | + .global __avr32_f32_cmp_eq | ||
17963 | + .type __avr32_f32_cmp_eq,@function | ||
17964 | +__avr32_f32_cmp_eq: | ||
17965 | + cp.w r12, r11 | ||
17966 | + brne 0f /* If not equal check for +/-0 */ | ||
17967 | + | ||
17968 | + /* Check for NaN or Inf */ | ||
17969 | + lddpc r11,.Linf_sf | ||
17970 | + lsl r12, 1 | ||
17971 | + cp.w r12, r11 | ||
17972 | + srls r12 /* 0 if NaN, 1 otherwise */ | ||
17973 | + ret r12 | ||
17974 | +0: | ||
17975 | + /* Or together the two values and shift out the sign bit. | ||
17976 | + If the result is zero, then the two values are both zero. */ | ||
17977 | + or r12, r11 | ||
17978 | + lsl r12, 1 | ||
17979 | + sreq r12 | ||
17980 | + ret r12 | ||
17981 | +#endif | ||
17982 | + | ||
17983 | +#if defined(L_avr32_f32_cmp_ge) || defined(L_avr32_f32_cmp_lt) | ||
17984 | +#ifdef L_avr32_f32_cmp_ge | ||
17985 | + .global __avr32_f32_cmp_ge | ||
17986 | + .type __avr32_f32_cmp_ge,@function | ||
17987 | +__avr32_f32_cmp_ge: | ||
17988 | +#endif | ||
17989 | +#ifdef L_avr32_f32_cmp_lt | ||
17990 | + .global __avr32_f32_cmp_lt | ||
17991 | + .type __avr32_f32_cmp_lt,@function | ||
17992 | +__avr32_f32_cmp_lt: | ||
17993 | +#endif | ||
17994 | + lsl r10, r12, 1 /* Remove sign bits */ | ||
17995 | + lsl r9, r11, 1 | ||
17996 | + lddpc r8, .Linf_sf | ||
17997 | + cp.w r10, r8 | ||
17998 | + rethi 0 /* Op0 is NaN */ | ||
17999 | + cp.w r9, r8 | ||
18000 | + rethi 0 /* Op1 is Nan */ | ||
18001 | + | ||
18002 | + eor r8, r11, r12 | ||
18003 | + bld r12, 31 | ||
18004 | +#ifdef L_avr32_f32_cmp_ge | ||
18005 | + srcc r8 /* Set result to true if op0 is positive*/ | ||
18006 | +#endif | ||
18007 | +#ifdef L_avr32_f32_cmp_lt | ||
18008 | + srcs r8 /* Set result to true if op0 is negative*/ | ||
18009 | +#endif | ||
18010 | + retmi r8 /* Return if signs are different */ | ||
18011 | + brcs 0f /* Both signs negative? */ | ||
18012 | + | ||
18013 | + /* Both signs positive */ | ||
18014 | + cp.w r12, r11 | ||
18015 | +#ifdef L_avr32_f32_cmp_ge | ||
18016 | + srhs r12 | ||
18017 | +#endif | ||
18018 | +#ifdef L_avr32_f32_cmp_lt | ||
18019 | + srlo r12 | ||
18020 | +#endif | ||
18021 | + retal r12 | ||
18022 | +0: | ||
18023 | + /* Both signs negative */ | ||
18024 | + cp.w r11, r12 | ||
18025 | +#ifdef L_avr32_f32_cmp_ge | ||
18026 | + srhs r12 | ||
18027 | +#endif | ||
18028 | +#ifdef L_avr32_f32_cmp_lt | ||
18029 | + srlo r12 | ||
18030 | +#endif | ||
18031 | + retal r12 | ||
18032 | +#endif | ||
18033 | + | ||
18034 | + | ||
18035 | +#ifdef L_avr32_f64_cmp_eq | ||
18036 | + .global __avr32_f64_cmp_eq | ||
18037 | + .type __avr32_f64_cmp_eq,@function | ||
18038 | +__avr32_f64_cmp_eq: | ||
18039 | + cp.w r10,r8 | ||
18040 | + cpc r11,r9 | ||
18041 | + brne 0f /* Both args could be zero with different sign bits */ | ||
18042 | + | ||
18043 | + /* check for NaN */ | ||
18044 | + lsl r11,1 | ||
18045 | + lddpc r12,.Linf | ||
18046 | + cp.w r10,0 | ||
18047 | + cpc r11,r12 /* check if nan or inf */ | ||
18048 | + srls r12 /* If Arg is NaN return 0 else 1*/ | ||
18049 | + ret r12 /* Return */ | ||
18050 | + | ||
18051 | +0: | ||
18052 | + lsl r11,1 /* get rid of sign bits */ | ||
18053 | + lsl r9,1 | ||
18054 | + or r11,r10 /* Check if all bits are zero */ | ||
18055 | + or r11,r9 | ||
18056 | + or r11,r8 | ||
18057 | + sreq r12 /* If all zeros the arguments are equal | ||
18058 | + so return 1 else return 0 */ | ||
18059 | + ret r12 | ||
18060 | +#endif | ||
18061 | + | ||
18062 | + | ||
18063 | +#if defined(L_avr32_f64_cmp_ge) || defined(L_avr32_f64_cmp_lt) | ||
18064 | + | ||
18065 | +#ifdef L_avr32_f64_cmp_ge | ||
18066 | + .global __avr32_f64_cmp_ge | ||
18067 | + .type __avr32_f64_cmp_ge,@function | ||
18068 | +__avr32_f64_cmp_ge: | ||
18069 | +#endif | ||
18070 | +#ifdef L_avr32_f64_cmp_lt | ||
18071 | + .global __avr32_f64_cmp_lt | ||
18072 | + .type __avr32_f64_cmp_lt,@function | ||
18073 | +__avr32_f64_cmp_lt: | ||
18074 | +#endif | ||
18075 | + | ||
18076 | + /* compare magnitude of op1 and op2 */ | ||
18077 | + pushm lr | ||
18078 | + | ||
18079 | + lsl r11,1 /* Remove sign bit of op1 */ | ||
18080 | + srcs lr /* Sign op1 to lsb of lr*/ | ||
18081 | + lsl r9,1 /* Remove sign bit of op2 */ | ||
18082 | + rol lr /* Sign op2 to lsb of lr, sign bit op1 bit 1 of lr*/ | ||
18083 | + | ||
18084 | + /* Check for Nan */ | ||
18085 | + lddpc r12,.Linf | ||
18086 | + cp.w r10,0 | ||
18087 | + cpc r11,r12 | ||
18088 | + movhi r12, 0 /* Return false for NaN */ | ||
18089 | + brhi 0f /* We have NaN */ | ||
18090 | + cp.w r8,0 | ||
18091 | + cpc r9,r12 | ||
18092 | + movhi r12, 0 /* Return false for NaN */ | ||
18093 | + brhi 0f /* We have NaN */ | ||
18094 | + | ||
18095 | + cp.w lr,3 /* both operands negative ?*/ | ||
18096 | + breq 1f | ||
18097 | + | ||
18098 | + cp.w lr,1 /* both operands positive? */ | ||
18099 | + brlo 2f | ||
18100 | + | ||
18101 | + /* Different signs. If sign of op1 is negative the difference | ||
18102 | + between op1 and op2 will always be negative, and if op1 is | ||
18103 | + positive the difference will always be positive */ | ||
18104 | +#ifdef L_avr32_f64_cmp_ge | ||
18105 | + sreq r12 | ||
18106 | +#endif | ||
18107 | +#ifdef L_avr32_f64_cmp_lt | ||
18108 | + srne r12 | ||
18109 | +#endif | ||
18110 | + popm pc | ||
18111 | + | ||
18112 | + | ||
18113 | +2: | ||
18114 | + /* Both operands positive. Just compute the difference */ | ||
18115 | + cp.w r10,r8 | ||
18116 | + cpc r11,r9 | ||
18117 | +#ifdef L_avr32_f64_cmp_ge | ||
18118 | + srhs r12 | ||
18119 | +#endif | ||
18120 | +#ifdef L_avr32_f64_cmp_lt | ||
18121 | + srlo r12 | ||
18122 | +#endif | ||
18123 | + popm pc | ||
18124 | + | ||
18125 | +1: | ||
18126 | + /* Both operands negative. Compute the difference with operands switched */ | ||
18127 | + cp r8,r10 | ||
18128 | + cpc r9,r11 | ||
18129 | +#ifdef L_avr32_f64_cmp_ge | ||
18130 | + srhs r12 | ||
18131 | +#endif | ||
18132 | +#ifdef L_avr32_f64_cmp_lt | ||
18133 | + srlo r12 | ||
18134 | +#endif | ||
18135 | +0: | ||
18136 | + popm pc | ||
18137 | +#endif | ||
18138 | + | ||
18139 | + | ||
18140 | + | ||
18141 | +#ifdef L_avr32_f64_div | ||
18142 | + .global __avr32_f64_div | ||
18143 | + .type __avr32_f64_div,@function | ||
18144 | +__avr32_f64_div: | ||
18145 | + stm --sp, r2-r7,lr | ||
18146 | + eor r12, r11, r9 /* Sign(op1) ^ Sign(op2) to msb of r12*/ | ||
18147 | + lsl r11,1 /* unpack op1*/ | ||
18148 | + lddpc lr,.Linf | ||
18149 | + lsl r9,1 /* unpack op2*/ | ||
18150 | + | ||
18151 | + cp.w r11,lr | ||
18152 | + brhs 0f /* op1 is NaN or infinity */ | ||
18153 | + cp.w r9,lr | ||
18154 | + brhs 1f /* op2 is NaN or infinity */ | ||
18155 | + or r5,r9,r8 | ||
18156 | + breq 2f /* op2 is zero */ | ||
18157 | + or r5,r11,r10 | ||
18158 | + breq __dfdiv_return_op1 /* op1 is zero return zero*/ | ||
18159 | + | ||
18160 | + /* Unpack and normalize */ | ||
18161 | + /* op1 */ | ||
18162 | + unpack_df r7 /*exp*/, r10, r11 /*df number*/ | ||
18163 | + normalize_df r7 /*exp*/, r10, r11 /*Mantissa*/, r4, r5 /*scratch*/ | ||
18164 | + | ||
18165 | + /* op1 */ | ||
18166 | + unpack_df r6 /*exp*/, r8, r9 /*df number*/ | ||
18167 | + normalize_df r6 /*exp*/, r8, r9 /*Mantissa*/, r4, r5 /*scratch*/ | ||
18168 | + | ||
18169 | + /* Compute new exponent */ | ||
18170 | + sub r7,r6 | ||
18171 | + sub r7,-1023 | ||
18172 | + | ||
18173 | + /* Do fixed point division of mantissas*/ | ||
18174 | + mov r6,55 | ||
18175 | + lsr r11,1 | ||
18176 | + ror r10 | ||
18177 | + lsr r9,1 | ||
18178 | + ror r8 | ||
18179 | + | ||
18180 | +3: | ||
18181 | + /* Check if dividend is higher or same than divisor */ | ||
18182 | + sub r2,r10,r8 | ||
18183 | + sbc r3,r11,r9 | ||
18184 | + /* If so move the difference back into the dividend */ | ||
18185 | + movhs r10, r2 | ||
18186 | + movhs r11, r3 | ||
18187 | + /* Update the Quotient */ | ||
18188 | + rol r4 | ||
18189 | + rol r5 | ||
18190 | + eorl r4,1 | ||
18191 | + | ||
18192 | + /* Shift the dividend */ | ||
18193 | + lsl r10,1 | ||
18194 | + rol r11 | ||
18195 | + | ||
18196 | + sub r6,1 | ||
18197 | + brne 3b | ||
18198 | + | ||
18199 | + /* Check if we have a remainder which will the propagate into | ||
18200 | + the last bit */ | ||
18201 | + | ||
18202 | + or r11,r11,r10 | ||
18203 | + neg r11 | ||
18204 | + rol r4 | ||
18205 | + rol r5 | ||
18206 | + | ||
18207 | + /* Adjust mantissa into correct alignment */ | ||
18208 | + lsl r11, r5,(64-56) | ||
18209 | + or r11,r11,r4>>(32-64+56) | ||
18210 | + lsl r10,r4, (64-56) | ||
18211 | + | ||
18212 | + /* Normalize result */ | ||
18213 | + normalize_df r7 /*exp*/, r10, r11 /* mantissa */, r8, r9 /* scratch */ | ||
18214 | + | ||
18215 | + /* Check if a subnormal result was created */ | ||
18216 | + cp.w r7, 0 | ||
18217 | + brgt 3f | ||
18218 | + | ||
18219 | + adjust_subnormal_df r7 /*exp*/, r10, r11 /* Mantissa */, r12 /*sign*/, r8, r9 /*scratch*/ | ||
18220 | + ldm sp++, r2-r7,pc | ||
18221 | +3: | ||
18222 | + | ||
18223 | + /* Round result */ | ||
18224 | + round_df r7 /*exp*/, r10, r11 /* Mantissa */, r9 /*scratch*/ | ||
18225 | + cp.w r7,0x7ff | ||
18226 | + brlt __dfdiv_pack_result | ||
18227 | + /*Return infinity */ | ||
18228 | + lddpc r11, .Linf | ||
18229 | + mov r10, 0 | ||
18230 | + rjmp __dfdiv_return_op1 | ||
18231 | + | ||
18232 | +__dfdiv_pack_result: | ||
18233 | + /* Pack */ | ||
18234 | + pack_df r7 /*exp*/, r10, r11 /* mantissa */, r10, r11 /* Output df number*/ | ||
18235 | + | ||
18236 | +__dfdiv_return_op1: | ||
18237 | + lsl r12,1 | ||
18238 | + ror r11 | ||
18239 | + ldm sp++, r2-r7,pc | ||
18240 | + | ||
18241 | +0: | ||
18242 | + /* Op1 is NaN or Inf */ | ||
18243 | + cpc r10 | ||
18244 | + /* If op1 is a NaN the we should return a NaN */ | ||
18245 | + brne __dfdiv_return_op1 | ||
18246 | + | ||
18247 | + /* Op1 is infinity, check op2*/ | ||
18248 | + cp.w r9,lr | ||
18249 | + brlo __dfdiv_return_op1 /* Op2 is a normal number return inf */ | ||
18250 | + /* Other combinations: return NaN */ | ||
18251 | + mov r11, -1 | ||
18252 | + ldm sp++, r2-r7,pc | ||
18253 | + | ||
18254 | +1: | ||
18255 | + /* Op2 is NaN or Inf */ | ||
18256 | + cpc r8 | ||
18257 | + /* If inf return zero else return NaN*/ | ||
18258 | + mov r10, 0 | ||
18259 | + moveq r11, 0 | ||
18260 | + movne r11, -1 | ||
18261 | + ldm sp++, r2-r7,pc | ||
18262 | + | ||
18263 | +2: | ||
18264 | + /* Op2 is zero */ | ||
18265 | + or r6,r11,r10 /* 0.0/0.0 yields NaN */ | ||
18266 | + mov r10, 0 | ||
18267 | + moveq r11, -1 /* Return NaN */ | ||
18268 | + movne r11, lr /* Return inf */ | ||
18269 | + rjmp __dfdiv_return_op1 | ||
18270 | + | ||
18271 | +#endif | ||
18272 | + | ||
18273 | + | ||
18274 | +#ifdef L_avr32_f32_div | ||
18275 | + .global __avr32_f32_div | ||
18276 | + .type __avr32_f32_div,@function | ||
18277 | +__avr32_f32_div: | ||
18278 | + eor r8, r11, r12 /* MSB(r8) = Sign(op1) ^ Sign(op2) */ | ||
18279 | + /* Unpack */ | ||
18280 | + lsl r12,1 | ||
18281 | + reteq 0 /* Return zero if op1 is zero */ | ||
18282 | + lddpc r9, .Linf_sf | ||
18283 | + lsl r11,1 | ||
18284 | + | ||
18285 | + /* Check op1 for NaN or Inf */ | ||
18286 | + cp r12,r9 | ||
18287 | + brhs 2f | ||
18288 | + | ||
18289 | + /* Check op2 for NaN or Inf */ | ||
18290 | + cp r11,r9 | ||
18291 | + brhs 3f | ||
18292 | + /* Check op2 for zero */ | ||
18293 | + tst r11,r11 | ||
18294 | + breq 4f | ||
18295 | + | ||
18296 | + /* If op1 is zero return zero */ | ||
18297 | + tst r12, r12 | ||
18298 | + reteq 0 | ||
18299 | + | ||
18300 | + /* Unpack op1*/ | ||
18301 | + unpack_sf r9 /*exp*/, r12 /*sf*/ | ||
18302 | + | ||
18303 | + /* Unpack op2*/ | ||
18304 | + unpack_sf r10 /*exp*/, r11 /*sf*/ | ||
18305 | + | ||
18306 | + /* Calculate new exponent */ | ||
18307 | + stm --sp,r7,lr | ||
18308 | + sub r9, r10 | ||
18309 | + sub r9,-127 | ||
18310 | + | ||
18311 | + /* Divide */ | ||
18312 | + mov r7,26 | ||
18313 | + | ||
18314 | + lsr r12,1 /* Make room for one more bit in mantissas */ | ||
18315 | + lsr r11,1 | ||
18316 | + | ||
18317 | +0: | ||
18318 | + sub r10,r12,r11 | ||
18319 | + movcc r12, r10 /* update dividend if divisor smaller */ | ||
18320 | + rol lr /* shift result into lr */ | ||
18321 | + eorl lr,1 /* flip bit. */ | ||
18322 | + lsl r12,1 /* Shift dividend */ | ||
18323 | + sub r7,1 | ||
18324 | + brne 0b | ||
18325 | + | ||
18326 | + /* round and scale*/ | ||
18327 | + neg r12 /* c = 1 iff r12 != 0 */ | ||
18328 | + rol lr | ||
18329 | + lsl r10,lr,(32-27) /* Adjust mantissa */ | ||
18330 | + ldm sp++, r7, lr | ||
18331 | + | ||
18332 | + | ||
18333 | + normalize_sf r9 /*exp*/, r10 /*mant*/, r11 /*scratch*/ | ||
18334 | + | ||
18335 | + /* Check for subnormal result */ | ||
18336 | + cp.w r9, 0 | ||
18337 | + brgt 0f | ||
18338 | + | ||
18339 | + /* Adjust a subnormal result */ | ||
18340 | + adjust_subnormal_sf r12 /*sf*/, r9 /*exp*/, r10 /*mant*/, r8 /*sign*/,r11 /*scratch*/ | ||
18341 | + ret r12 | ||
18342 | +0: | ||
18343 | + round_sf r9 /*exp*/, r10 /*mant*/, r11 /*scratch*/ | ||
18344 | + pack_sf r12 /*sf*/, r9 /*exp*/, r10 /*mant*/ | ||
18345 | +__divsf_return_op1: | ||
18346 | + lsl r8, 1 | ||
18347 | + ror r12 | ||
18348 | + ret r12 | ||
18349 | + | ||
18350 | +2: | ||
18351 | + /* Op1 is NaN or inf */ | ||
18352 | + retne -1 /* Return NaN if op1 is NaN */ | ||
18353 | + /* Op1 is inf check op2 */ | ||
18354 | + cp r11, r9 | ||
18355 | + brlo __divsf_return_op1 /* inf/number gives inf */ | ||
18356 | + ret -1 /* The rest gives NaN*/ | ||
18357 | +3: | ||
18358 | + /* Op1 is NaN or inf */ | ||
18359 | + reteq 0 /* Return zero if number/inf*/ | ||
18360 | + ret -1 /* Return NaN*/ | ||
18361 | +4: | ||
18362 | + /* Op2 is zero ? */ | ||
18363 | + tst r12,r12 | ||
18364 | + reteq -1 /* 0.0/0.0 is NaN */ | ||
18365 | + lddpc r12, .Linf_sf | ||
18366 | + rjmp __divsf_return_op1 | ||
18367 | + | ||
18368 | +#endif | ||
18369 | + | ||
18370 | +#ifdef L_avr32_f32_mul | ||
18371 | + .global __avr32_f32_mul | ||
18372 | + .type __avr32_f32_mul,@function | ||
18373 | +__avr32_f32_mul: | ||
18374 | + eor r8, r11, r12 /* MSB(r8) = Sign(op1) ^ Sign(op2) */ | ||
18375 | + lsl r12,1 /* unpack op1 */ | ||
18376 | + lsl r11,1 /* unpack op2 */ | ||
18377 | + | ||
18378 | + /* arrange operands so that that op1 >= op2 */ | ||
18379 | + sub r9,r12,r11 | ||
18380 | + brcc 0f | ||
18381 | + | ||
18382 | + sub r12,r9 /* swap operands if op2 was larger */ | ||
18383 | + add r11,r9 | ||
18384 | + | ||
18385 | +0: | ||
18386 | + lddpc r9,.Linf_sf | ||
18387 | + cp r12,r9 | ||
18388 | + brhs 2f | ||
18389 | + | ||
18390 | + /* Check op2 for zero */ | ||
18391 | + tst r11,r11 | ||
18392 | + reteq 0 /* Return zero */ | ||
18393 | + | ||
18394 | + /* Unpack op1 */ | ||
18395 | + unpack_sf r9 /*exp*/, r12 /*sf*/ | ||
18396 | + /* Unpack op2 */ | ||
18397 | + unpack_sf r10 /*exp*/, r11 /*sf*/ | ||
18398 | + | ||
18399 | + /* Calculate new exponent */ | ||
18400 | + add r9,r10 | ||
18401 | + | ||
18402 | + /* Do the multiplication */ | ||
18403 | + mulu.d r10,r12,r11 | ||
18404 | + | ||
18405 | + sub r9,(127-1) /* remove extra exponent bias */ | ||
18406 | + | ||
18407 | + /* Check if we have any bits in r10 which | ||
18408 | + means a rounding bit should be inserted in LSB of result */ | ||
18409 | + tst r10,r10 | ||
18410 | + srne r10 | ||
18411 | + or r12,r11,r10 | ||
18412 | + | ||
18413 | + /* Normalize */ | ||
18414 | + normalize_sf r9 /*exp*/, r12 /*mant*/, r11 /*scratch*/ | ||
18415 | + | ||
18416 | + /* Check for subnormal result */ | ||
18417 | + cp.w r9, 0 | ||
18418 | + brgt 0f | ||
18419 | + | ||
18420 | + /* Adjust a subnormal result */ | ||
18421 | + adjust_subnormal_sf r12/*sf*/, r9 /*exp*/, r12 /*mant*/, r8 /*sign*/, r11 /*scratch */ | ||
18422 | + ret r12 | ||
18423 | +0: | ||
18424 | + round_sf r9 /*exp*/, r12 /*mant*/, r11 /*scratch*/ | ||
18425 | + cp.w r9, 0xff | ||
18426 | + brlo 1f | ||
18427 | + lddpc r12,.Linf_sf | ||
18428 | + rjmp __mulsf_return_op1 | ||
18429 | +1: | ||
18430 | + pack_sf r12 /*sf*/, r9 /*exp*/, r12 /*mant*/ | ||
18431 | +__mulsf_return_op1: | ||
18432 | + lsl r8, 1 | ||
18433 | + ror r12 | ||
18434 | + ret r12 | ||
18435 | + | ||
18436 | +2: | ||
18437 | + /* Op1 is inf or NaN */ | ||
18438 | + retne -1 /* Op1 is NaN return NaN */ | ||
18439 | + | ||
18440 | + /* Op1 is inf and op2 is smaller so it is either infinity | ||
18441 | + or a subnormal number */ | ||
18442 | + cp r11,0 | ||
18443 | + brne __mulsf_return_op1 /* op2 is not zero. return op1.*/ | ||
18444 | + ret -1 /* inf * 0 return NaN */ | ||
18445 | +#endif | ||
18446 | + | ||
18447 | + | ||
18448 | +#ifdef L_avr32_s32_to_f32 | ||
18449 | + .global __avr32_s32_to_f32 | ||
18450 | + .type __avr32_s32_to_f32,@function | ||
18451 | +__avr32_s32_to_f32: | ||
18452 | + cp r12, 0 | ||
18453 | + reteq r12 /* If zero then return zero float */ | ||
18454 | + mov r11, r12 /* Keep the sign */ | ||
18455 | + abs r12 /* Compute the absolute value */ | ||
18456 | + mov r10, 31 + 127 /* Set the correct exponent */ | ||
18457 | + | ||
18458 | + /* Normalize */ | ||
18459 | + normalize_sf r10 /*exp*/, r12 /*mant*/, r9 /*scratch*/ | ||
18460 | + | ||
18461 | + /* Check for subnormal result */ | ||
18462 | + cp.w r10, 0 | ||
18463 | + brgt 0f | ||
18464 | + | ||
18465 | + /* Adjust a subnormal result */ | ||
18466 | + adjust_subnormal_sf r12/*sf*/, r10 /*exp*/, r12 /*mant*/, r11/*sign*/, r9 /*scratch*/ | ||
18467 | + ret r12 | ||
18468 | +0: | ||
18469 | + round_sf r10 /*exp*/, r12 /*mant*/, r9 /*scratch*/ | ||
18470 | + pack_sf r12 /*sf*/, r10 /*exp*/, r12 /*mant*/ | ||
18471 | +__floatsisf_return_op1: | ||
18472 | + lsl r11, 1 | ||
18473 | + ror r12 | ||
18474 | + ret r12 | ||
18475 | +#endif | ||
18476 | + | ||
18477 | +#ifdef L_avr32_u32_to_f32 | ||
18478 | + .global __avr32_u32_to_f32 | ||
18479 | + .type __avr32_u32_to_f32,@function | ||
18480 | +__avr32_u32_to_f32: | ||
18481 | + cp r12, 0 | ||
18482 | + reteq r12 /* If zero then return zero float */ | ||
18483 | + mov r10, 31 + 127 /* Set the correct exponent */ | ||
18484 | + | ||
18485 | + /* Normalize */ | ||
18486 | + normalize_sf r10 /*exp*/, r12 /*mant*/, r9 /*scratch*/ | ||
18487 | + | ||
18488 | + /* Check for subnormal result */ | ||
18489 | + cp.w r10, 0 | ||
18490 | + brgt 0f | ||
18491 | + | ||
18492 | + /* Adjust a subnormal result */ | ||
18493 | + mov r8, 0 | ||
18494 | + adjust_subnormal_sf r12/*sf*/,r10 /*exp*/, r12 /*mant*/,r8/*sign*/, r9 /*scratch*/ | ||
18495 | + ret r12 | ||
18496 | +0: | ||
18497 | + round_sf r10 /*exp*/, r12 /*mant*/, r9 /*scratch*/ | ||
18498 | + pack_sf r12 /*sf*/, r10 /*exp*/, r12 /*mant*/ | ||
18499 | +__floatunsisf_return_op1: | ||
18500 | + lsr r12,1 /* Sign bit is 0 for unsigned int */ | ||
18501 | + ret r12 | ||
18502 | +#endif | ||
18503 | + | ||
18504 | + | ||
18505 | +#ifdef L_avr32_f32_to_s32 | ||
18506 | + .global __avr32_f32_to_s32 | ||
18507 | + .type __avr32_f32_to_s32,@function | ||
18508 | +__avr32_f32_to_s32: | ||
18509 | + lsr r11,r12,23 /* Extract exponent */ | ||
18510 | + castu.b r11 | ||
18511 | + sub r11,127 /* Fix bias */ | ||
18512 | + retlo 0 /* Negative exponent yields zero integer */ | ||
18513 | + | ||
18514 | +#ifdef __IEEE_LARGE_FLOATS__ | ||
18515 | + cp r11,31 | ||
18516 | + brcc 0f | ||
18517 | +#endif | ||
18518 | + /* Shift mantissa into correct position */ | ||
18519 | + rsub r11,r11,31 /* Shift amount */ | ||
18520 | + lsl r10,r12,8 /* Get mantissa */ | ||
18521 | + sbr r10,31 /* Add implicit bit */ | ||
18522 | + lsr r10,r10,r11 /* Perform shift */ | ||
18523 | + lsl r12,1 /* Check sign */ | ||
18524 | + retcc r10 /* if positive, we are done */ | ||
18525 | + neg r10 /* if negative float, negate result */ | ||
18526 | + ret r10 | ||
18527 | + | ||
18528 | +#ifdef __IEEE_LARGE_FLOATS__ | ||
18529 | +0: | ||
18530 | + mov r11,-1 | ||
18531 | + lsr r11,1 | ||
18532 | + lsl r12,1 | ||
18533 | + acr r11 | ||
18534 | + | ||
18535 | + ret r11 | ||
18536 | +#endif | ||
18537 | +#endif | ||
18538 | + | ||
18539 | +#ifdef L_avr32_f32_to_u32 | ||
18540 | + .global __avr32_f32_to_u32 | ||
18541 | + .type __avr32_f32_to_u32,@function | ||
18542 | +__avr32_f32_to_u32: | ||
18543 | + cp r12,0 | ||
18544 | + retmi 0 /* Negative numbers gives 0 */ | ||
18545 | + bfextu r11, r12, 23, 8 /* Extract exponent */ | ||
18546 | + sub r11,127 /* Fix bias */ | ||
18547 | + retlo 0 /* Negative exponent yields zero integer */ | ||
18548 | + | ||
18549 | +#ifdef __IEEE_LARGE_FLOATS__ | ||
18550 | + cp r11,32 | ||
18551 | + brcc 0f | ||
18552 | +#endif | ||
18553 | + /* Shift mantissa into correct position */ | ||
18554 | + rsub r11,r11,31 /* Shift amount */ | ||
18555 | + lsl r12,8 /* Get mantissa */ | ||
18556 | + sbr r12,31 /* Add implicit bit */ | ||
18557 | + lsr r12,r12,r11 /* Perform shift */ | ||
18558 | + ret r12 | ||
18559 | + | ||
18560 | +#ifdef __IEEE_LARGE_FLOATS__ | ||
18561 | +0: | ||
18562 | + mov r11,-1 | ||
18563 | + lsr r11,1 | ||
18564 | + lsl r12,1 | ||
18565 | + acr r11 | ||
18566 | + | ||
18567 | + ret r11 | ||
18568 | +#endif | ||
18569 | +#endif | ||
18570 | + | ||
18571 | +#ifdef L_avr32_f32_to_f64 | ||
18572 | + .global __avr32_f32_to_f64 | ||
18573 | + .type __avr32_f32_to_f64,@function | ||
18574 | + | ||
18575 | +__avr32_f32_to_f64: | ||
18576 | + lsl r11,r12,1 /* Remove sign bit, keep original value in r12*/ | ||
18577 | + moveq r10, 0 | ||
18578 | + reteq r11 /* Return zero if input is zero */ | ||
18579 | + | ||
18580 | + bfextu r9,r11,24,8 /* Get exponent */ | ||
18581 | + cp.w r9,0xff /* check for NaN or inf */ | ||
18582 | + breq 0f | ||
18583 | + | ||
18584 | + lsl r11,7 /* Convert sf mantissa to df format */ | ||
18585 | + mov r10,0 | ||
18586 | + | ||
18587 | + /* Check if implicit bit should be set */ | ||
18588 | + cp.w r9, 0 | ||
18589 | + subeq r9,-1 /* Adjust exponent if it was 0 */ | ||
18590 | + srne r8 | ||
18591 | + or r11, r11, r8 << 31 /* Set implicit bit if needed */ | ||
18592 | + sub r9,(127-0x3ff) /* Convert exponent to df format exponent */ | ||
18593 | + | ||
18594 | + pushm lr | ||
18595 | + normalize_df r9 /*exp*/, r10, r11 /*mantissa*/, r8, lr /*scratch*/ | ||
18596 | + popm lr | ||
18597 | + pack_df r9 /*exp*/, r10, r11 /*mantissa*/, r10, r11 /*df*/ | ||
18598 | + | ||
18599 | +__extendsfdf_return_op1: | ||
18600 | + /* Rotate in sign bit */ | ||
18601 | + lsl r12, 1 | ||
18602 | + ror r11 | ||
18603 | + ret r11 | ||
18604 | + | ||
18605 | +0: | ||
18606 | + /* Inf or NaN*/ | ||
18607 | + lddpc r10, .Linf | ||
18608 | + lsl r11,8 /* check mantissa */ | ||
18609 | + movne r11, -1 /* Return NaN */ | ||
18610 | + moveq r11, r10 /* Return inf */ | ||
18611 | + rjmp __extendsfdf_return_op1 | ||
18612 | +#endif | ||
18613 | + | ||
18614 | + | ||
18615 | +#ifdef L_avr32_f64_to_f32 | ||
18616 | + .global __avr32_f64_to_f32 | ||
18617 | + .type __avr32_f64_to_f32,@function | ||
18618 | + | ||
18619 | +__avr32_f64_to_f32: | ||
18620 | + /* Unpack */ | ||
18621 | + lsl r9,r11,1 /* Unpack exponent */ | ||
18622 | + lsr r9,21 | ||
18623 | + | ||
18624 | + reteq 0 /* If exponent is 0 the number is so small | ||
18625 | + that the conversion to single float gives | ||
18626 | + zero */ | ||
18627 | + | ||
18628 | + lsl r8,r11,10 /* Adjust mantissa */ | ||
18629 | + or r12,r8,r10>>22 | ||
18630 | + | ||
18631 | + lsl r10,10 /* Check if there are any remaining bits | ||
18632 | + in the low part of the mantissa.*/ | ||
18633 | + neg r10 | ||
18634 | + rol r12 /* If there were remaining bits then set lsb | ||
18635 | + of mantissa to 1 */ | ||
18636 | + | ||
18637 | + cp r9,0x7ff | ||
18638 | + breq 2f /* Check for NaN or inf */ | ||
18639 | + | ||
18640 | + sub r9,(0x3ff-127) /* Adjust bias of exponent */ | ||
18641 | + sbr r12,31 /* set the implicit bit.*/ | ||
18642 | + | ||
18643 | + cp.w r9, 0 /* Check for subnormal number */ | ||
18644 | + brgt 0f | ||
18645 | + | ||
18646 | + /* Adjust a subnormal result */ | ||
18647 | + adjust_subnormal_sf r12/*sf*/,r9 /*exp*/, r12 /*mant*/, r11/*sign*/, r10 /*scratch*/ | ||
18648 | + ret r12 | ||
18649 | +0: | ||
18650 | + round_sf r9 /*exp*/, r12 /*mant*/, r10 /*scratch*/ | ||
18651 | + pack_sf r12 /*sf*/, r9 /*exp*/, r12 /*mant*/ | ||
18652 | +__truncdfsf_return_op1: | ||
18653 | + /* Rotate in sign bit */ | ||
18654 | + lsl r11, 1 | ||
18655 | + ror r12 | ||
18656 | + ret r12 | ||
18657 | + | ||
18658 | + | ||
18659 | +2: | ||
18660 | + /* NaN or inf */ | ||
18661 | + cbr r12,31 /* clear implicit bit */ | ||
18662 | + retne -1 /* Return NaN if mantissa not zero */ | ||
18663 | + lddpc r12,.Linf_sf | ||
18664 | + ret r12 /* Return inf */ | ||
18665 | +#endif | ||
18666 | + | ||
18667 | + | ||
18668 | + .align 2 | ||
18669 | +.Linf: | ||
18670 | + .long 0xffe00000 | ||
18671 | + | ||
18672 | + .align 2 | ||
18673 | +.Linf_sf: | ||
18674 | + .long 0xff000000 | ||
18675 | + | ||
18676 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/lib2funcs.S gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/lib2funcs.S | ||
18677 | --- gcc-4.0.2/gcc/config/avr32/lib2funcs.S 1970-01-01 01:00:00.000000000 +0100 | ||
18678 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/lib2funcs.S 2006-10-10 12:36:34.000000000 +0200 | ||
18679 | @@ -0,0 +1,21 @@ | ||
18680 | + .align 4 | ||
18681 | + .global __nonlocal_goto | ||
18682 | + .type __nonlocal_goto,@function | ||
18683 | + | ||
18684 | +/* __nonlocal_goto: This function handles nonlocal_goto's in gcc. | ||
18685 | + | ||
18686 | + parameter 0 (r12) = New Frame Pointer | ||
18687 | + parameter 1 (r11) = Address to goto | ||
18688 | + parameter 2 (r10) = New Stack Pointer | ||
18689 | + | ||
18690 | + This function invalidates the return stack, since it returns from a | ||
18691 | + function without using a return instruction. | ||
18692 | +*/ | ||
18693 | +__nonlocal_goto: | ||
18694 | + mov r7, r12 | ||
18695 | + mov sp, r10 | ||
18696 | + frs # Flush return stack | ||
18697 | + mov pc, r11 | ||
18698 | + | ||
18699 | + | ||
18700 | + | ||
18701 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/linux-elf.h gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/linux-elf.h | ||
18702 | --- gcc-4.0.2/gcc/config/avr32/linux-elf.h 1970-01-01 01:00:00.000000000 +0100 | ||
18703 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/linux-elf.h 2006-11-10 15:14:06.000000000 +0100 | ||
18704 | @@ -0,0 +1,154 @@ | ||
18705 | +/* | ||
18706 | + Linux/Elf specific definitions. | ||
18707 | + Copyright 2003-2006 Atmel Corporation. | ||
18708 | + | ||
18709 | + Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
18710 | + and Håvard Skinnemoen, Atmel Norway, <hskinnemoen@atmel.com> | ||
18711 | + | ||
18712 | + This file is part of GCC. | ||
18713 | + | ||
18714 | + This program is free software; you can redistribute it and/or modify | ||
18715 | + it under the terms of the GNU General Public License as published by | ||
18716 | + the Free Software Foundation; either version 2 of the License, or | ||
18717 | + (at your option) any later version. | ||
18718 | + | ||
18719 | + This program is distributed in the hope that it will be useful, | ||
18720 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18721 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18722 | + GNU General Public License for more details. | ||
18723 | + | ||
18724 | + You should have received a copy of the GNU General Public License | ||
18725 | + along with this program; if not, write to the Free Software | ||
18726 | + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | ||
18727 | + | ||
18728 | + | ||
18729 | + | ||
18730 | +/* elfos.h should have already been included. Now just override | ||
18731 | + any conflicting definitions and add any extras. */ | ||
18732 | + | ||
18733 | +/* Run-time Target Specification. */ | ||
18734 | +#undef TARGET_VERSION | ||
18735 | +#define TARGET_VERSION fputs (" (AVR32 GNU/Linux with ELF)", stderr); | ||
18736 | + | ||
18737 | +/* Do not assume anything about header files. */ | ||
18738 | +#define NO_IMPLICIT_EXTERN_C | ||
18739 | + | ||
18740 | +/* The GNU C++ standard library requires that these macros be defined. */ | ||
18741 | +#undef CPLUSPLUS_CPP_SPEC | ||
18742 | +#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" | ||
18743 | + | ||
18744 | +/* Now we define the strings used to build the spec file. */ | ||
18745 | +#undef LIB_SPEC | ||
18746 | +#define LIB_SPEC \ | ||
18747 | + "%{pthread:-lpthread} \ | ||
18748 | + %{shared:-lc} \ | ||
18749 | + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" | ||
18750 | + | ||
18751 | +/* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add | ||
18752 | + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | ||
18753 | + provides part of the support for getting C++ file-scope static | ||
18754 | + object constructed before entering `main'. */ | ||
18755 | + | ||
18756 | +#undef STARTFILE_SPEC | ||
18757 | +#define STARTFILE_SPEC \ | ||
18758 | + "%{!shared: \ | ||
18759 | + %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ | ||
18760 | + %{!p:%{profile:gcrt1.o%s} \ | ||
18761 | + %{!profile:crt1.o%s}}}} \ | ||
18762 | + crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" | ||
18763 | + | ||
18764 | +/* Provide a ENDFILE_SPEC appropriate for GNU/Linux. Here we tack on | ||
18765 | + the GNU/Linux magical crtend.o file (see crtstuff.c) which | ||
18766 | + provides part of the support for getting C++ file-scope static | ||
18767 | + object constructed before entering `main', followed by a normal | ||
18768 | + GNU/Linux "finalizer" file, `crtn.o'. */ | ||
18769 | + | ||
18770 | +#undef ENDFILE_SPEC | ||
18771 | +#define ENDFILE_SPEC \ | ||
18772 | + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" | ||
18773 | + | ||
18774 | +#undef ASM_SPEC | ||
18775 | +#define ASM_SPEC "%{!mno-pic:--pic} %{mrelax|O*:%{mno-relax|O0|O1: ;:--linkrelax}} %{mcpu=*:-mcpu=%*}" | ||
18776 | + | ||
18777 | +#undef LINK_SPEC | ||
18778 | +#define LINK_SPEC "%{version:-v} \ | ||
18779 | + %{static:-Bstatic} \ | ||
18780 | + %{shared:-shared} \ | ||
18781 | + %{symbolic:-Bsymbolic} \ | ||
18782 | + %{rdynamic:-export-dynamic} \ | ||
18783 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ | ||
18784 | + %{mrelax|O*:%{mno-relax|O0|O1: ;:--relax}}" | ||
18785 | + | ||
18786 | +#define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() | ||
18787 | + | ||
18788 | +/* This is how we tell the assembler that two symbols have the same value. */ | ||
18789 | +#define ASM_OUTPUT_DEF(FILE, NAME1, NAME2) \ | ||
18790 | + do \ | ||
18791 | + { \ | ||
18792 | + assemble_name (FILE, NAME1); \ | ||
18793 | + fputs (" = ", FILE); \ | ||
18794 | + assemble_name (FILE, NAME2); \ | ||
18795 | + fputc ('\n', FILE); \ | ||
18796 | + } \ | ||
18797 | + while (0) | ||
18798 | + | ||
18799 | + | ||
18800 | + | ||
18801 | +#undef CC1_SPEC | ||
18802 | +#define CC1_SPEC "%{profile:-p}" | ||
18803 | + | ||
18804 | +/* Target CPU builtins. */ | ||
18805 | +#define TARGET_CPU_CPP_BUILTINS() \ | ||
18806 | + do \ | ||
18807 | + { \ | ||
18808 | + builtin_define ("__avr32__"); \ | ||
18809 | + builtin_define ("__AVR32__"); \ | ||
18810 | + builtin_define ("__AVR32_LINUX__"); \ | ||
18811 | + builtin_define (avr32_part->macro); \ | ||
18812 | + builtin_define (avr32_arch->macro); \ | ||
18813 | + if (avr32_arch->uarch_type == UARCH_TYPE_AVR32A) \ | ||
18814 | + builtin_define ("__AVR32_AVR32A__"); \ | ||
18815 | + else \ | ||
18816 | + builtin_define ("__AVR32_AVR32B__"); \ | ||
18817 | + if (TARGET_UNALIGNED_WORD) \ | ||
18818 | + builtin_define ("__AVR32_HAS_UNALIGNED_WORD__"); \ | ||
18819 | + if (TARGET_SIMD) \ | ||
18820 | + builtin_define ("__AVR32_HAS_SIMD__"); \ | ||
18821 | + if (TARGET_DSP) \ | ||
18822 | + builtin_define ("__AVR32_HAS_DSP__"); \ | ||
18823 | + if (TARGET_RMW) \ | ||
18824 | + builtin_define ("__AVR32_HAS_RMW__"); \ | ||
18825 | + if (TARGET_BRANCH_PRED) \ | ||
18826 | + builtin_define ("__AVR32_HAS_BRANCH_PRED__"); \ | ||
18827 | + if (flag_pic) \ | ||
18828 | + { \ | ||
18829 | + builtin_define ("__PIC__"); \ | ||
18830 | + builtin_define ("__pic__"); \ | ||
18831 | + } \ | ||
18832 | + } \ | ||
18833 | + while (0) | ||
18834 | + | ||
18835 | + | ||
18836 | + | ||
18837 | +/* Call the function profiler with a given profile label. */ | ||
18838 | +#undef FUNCTION_PROFILER | ||
18839 | +#define FUNCTION_PROFILER(STREAM, LABELNO) \ | ||
18840 | + do \ | ||
18841 | + { \ | ||
18842 | + fprintf (STREAM, "\tmov\tlr, lo(mcount)\n\torh\tlr, hi(mcount)\n"); \ | ||
18843 | + fprintf (STREAM, "\ticall lr\n"); \ | ||
18844 | + } \ | ||
18845 | + while (0) | ||
18846 | + | ||
18847 | +#define NO_PROFILE_COUNTERS 1 | ||
18848 | + | ||
18849 | +/* For dynamic libraries to work */ | ||
18850 | +/* #define PLT_REG_CALL_CLOBBERED 1 */ | ||
18851 | +#define AVR32_ALWAYS_PIC 1 | ||
18852 | + | ||
18853 | +/* uclibc does not implement sinf, cosf etc. */ | ||
18854 | +#undef TARGET_C99_FUNCTIONS | ||
18855 | +#define TARGET_C99_FUNCTIONS 0 | ||
18856 | + | ||
18857 | +#define LINK_GCC_C_SEQUENCE_SPEC \ | ||
18858 | + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" | ||
18859 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/predicates.md gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/predicates.md | ||
18860 | --- gcc-4.0.2/gcc/config/avr32/predicates.md 1970-01-01 01:00:00.000000000 +0100 | ||
18861 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/predicates.md 2006-11-09 15:01:19.000000000 +0100 | ||
18862 | @@ -0,0 +1,303 @@ | ||
18863 | +;; AVR32 predicates file. | ||
18864 | +;; Copyright 2003-2006 Atmel Corporation. | ||
18865 | +;; | ||
18866 | +;; Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
18867 | +;; | ||
18868 | +;; This file is part of GCC. | ||
18869 | +;; | ||
18870 | +;; This program is free software; you can redistribute it and/or modify | ||
18871 | +;; it under the terms of the GNU General Public License as published by | ||
18872 | +;; the Free Software Foundation; either version 2 of the License, or | ||
18873 | +;; (at your option) any later version. | ||
18874 | +;; | ||
18875 | +;; This program is distributed in the hope that it will be useful, | ||
18876 | +;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18877 | +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18878 | +;; GNU General Public License for more details. | ||
18879 | +;; | ||
18880 | +;; You should have received a copy of the GNU General Public License | ||
18881 | +;; along with this program; if not, write to the Free Software | ||
18882 | +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
18883 | + | ||
18884 | + | ||
18885 | +;; True if the operand is a memory reference which contains an | ||
18886 | +;; Address consisting of a single pointer register | ||
18887 | +(define_predicate "avr32_indirect_register_operand" | ||
18888 | + (and (match_code "mem") | ||
18889 | + (match_test "register_operand(XEXP(op, 0), SImode)"))) | ||
18890 | + | ||
18891 | + | ||
18892 | + | ||
18893 | +;; Address expression with a base pointer offset with | ||
18894 | +;; a register displacement | ||
18895 | +(define_predicate "avr32_indexed_memory_operand" | ||
18896 | + (and (match_code "mem") | ||
18897 | + (match_test "GET_CODE(XEXP(op, 0)) == PLUS")) | ||
18898 | + { | ||
18899 | + | ||
18900 | + rtx op0 = XEXP(XEXP(op, 0), 0); | ||
18901 | + rtx op1 = XEXP(XEXP(op, 0), 1); | ||
18902 | + | ||
18903 | + return ((avr32_address_register_rtx_p (op0, 0) | ||
18904 | + && avr32_legitimate_index_p (GET_MODE(op), op1, 0)) | ||
18905 | + || (avr32_address_register_rtx_p (op1, 0) | ||
18906 | + && avr32_legitimate_index_p (GET_MODE(op), op0, 0))); | ||
18907 | + | ||
18908 | + }) | ||
18909 | + | ||
18910 | +;; Operand suitable for the ld.sb instruction | ||
18911 | +(define_predicate "load_sb_memory_operand" | ||
18912 | + (ior (match_operand 0 "avr32_indirect_register_operand") | ||
18913 | + (match_operand 0 "avr32_indexed_memory_operand"))) | ||
18914 | + | ||
18915 | + | ||
18916 | +;; Operand suitable as operand to insns sign extending QI values | ||
18917 | +(define_predicate "extendqi_operand" | ||
18918 | + (ior (match_operand 0 "load_sb_memory_operand") | ||
18919 | + (match_operand 0 "register_operand"))) | ||
18920 | + | ||
18921 | +(define_predicate "post_inc_memory_operand" | ||
18922 | + (and (match_code "mem") | ||
18923 | + (match_test "(GET_CODE(XEXP(op, 0)) == POST_INC) | ||
18924 | + && REG_P(XEXP(XEXP(op, 0), 0))"))) | ||
18925 | + | ||
18926 | +;; Operand suitable for loading TImode values | ||
18927 | +(define_predicate "loadti_operand" | ||
18928 | + (ior (ior (match_operand 0 "register_operand") | ||
18929 | + (match_operand 0 "avr32_indirect_register_operand")) | ||
18930 | + (match_operand 0 "post_inc_memory_operand"))) | ||
18931 | + | ||
18932 | +;; Operand suitable for add instructions | ||
18933 | +(define_predicate "avr32_add_operand" | ||
18934 | + (ior (match_operand 0 "register_operand") | ||
18935 | + (and (match_operand 0 "immediate_operand") | ||
18936 | + (match_test "CONST_OK_FOR_CONSTRAINT_P(INTVAL(op), 'I', \"Is21\")")))) | ||
18937 | + | ||
18938 | +;; Operand is a power of two immediate | ||
18939 | +(define_predicate "power_of_two_operand" | ||
18940 | + (match_code "const_int") | ||
18941 | +{ | ||
18942 | + HOST_WIDE_INT value = INTVAL (op); | ||
18943 | + | ||
18944 | + return value != 0 && (value & (value - 1)) == 0; | ||
18945 | +}) | ||
18946 | + | ||
18947 | +;; Operand is a multiple of 8 immediate | ||
18948 | +(define_predicate "multiple_of_8_operand" | ||
18949 | + (match_code "const_int") | ||
18950 | +{ | ||
18951 | + HOST_WIDE_INT value = INTVAL (op); | ||
18952 | + | ||
18953 | + return (value & 0x7) == 0 ; | ||
18954 | +}) | ||
18955 | + | ||
18956 | +;; Operand is a multiple of 16 immediate | ||
18957 | +(define_predicate "multiple_of_16_operand" | ||
18958 | + (match_code "const_int") | ||
18959 | +{ | ||
18960 | + HOST_WIDE_INT value = INTVAL (op); | ||
18961 | + | ||
18962 | + return (value & 0xf) == 0 ; | ||
18963 | +}) | ||
18964 | + | ||
18965 | +;; Operand is a mask used for masking away upper bits of a reg | ||
18966 | +(define_predicate "avr32_mask_upper_bits_operand" | ||
18967 | + (match_code "const_int") | ||
18968 | +{ | ||
18969 | + HOST_WIDE_INT value = INTVAL (op) + 1; | ||
18970 | + | ||
18971 | + return value != 1 && value != 0 && (value & (value - 1)) == 0; | ||
18972 | +}) | ||
18973 | + | ||
18974 | + | ||
18975 | +;; Operand suitable for mul instructions | ||
18976 | +(define_predicate "avr32_mul_operand" | ||
18977 | + (ior (match_operand 0 "register_operand") | ||
18978 | + (and (match_operand 0 "immediate_operand") | ||
18979 | + (match_test "CONST_OK_FOR_CONSTRAINT_P(INTVAL(op), 'K', \"Ks08\")")))) | ||
18980 | + | ||
18981 | +;; True for logical binary operators. | ||
18982 | +(define_predicate "logical_binary_operator" | ||
18983 | + (match_code "ior,xor,and")) | ||
18984 | + | ||
18985 | +;; True for logical shift operators | ||
18986 | +(define_predicate "logical_shift_operator" | ||
18987 | + (match_code "ashift,lshiftrt")) | ||
18988 | + | ||
18989 | +;; True for shift operand for logical and, or and eor insns | ||
18990 | +(define_predicate "avr32_logical_shift_operand" | ||
18991 | + (and (match_code "ashift,lshiftrt") | ||
18992 | + (ior (and (match_test "GET_CODE(XEXP(op, 1)) == CONST_INT") | ||
18993 | + (match_test "register_operand(XEXP(op, 0), GET_MODE(XEXP(op, 0)))")) | ||
18994 | + (and (match_test "GET_CODE(XEXP(op, 0)) == CONST_INT") | ||
18995 | + (match_test "register_operand(XEXP(op, 1), GET_MODE(XEXP(op, 1)))")))) | ||
18996 | + { | ||
18997 | + return 1; | ||
18998 | + } | ||
18999 | + ) | ||
19000 | + | ||
19001 | + | ||
19002 | +;; Predicate for second operand to and, ior and xor insn patterns | ||
19003 | +(define_predicate "avr32_logical_insn_operand" | ||
19004 | + (ior (match_operand 0 "register_operand") | ||
19005 | + (match_operand 0 "avr32_logical_shift_operand")) | ||
19006 | + { | ||
19007 | + return 1; | ||
19008 | + } | ||
19009 | +) | ||
19010 | + | ||
19011 | + | ||
19012 | +;; True for avr32 comparison operators | ||
19013 | +(define_predicate "avr32_comparison_operator" | ||
19014 | + (ior (match_code "eq, ne, gt, ge, lt, le, gtu, geu, ltu, leu") | ||
19015 | + (and (match_code "unspec") | ||
19016 | + (match_test "(XINT(op, 1) == UNSPEC_COND_MI) | ||
19017 | + || (XINT(op, 1) == UNSPEC_COND_PL)")))) | ||
19018 | + | ||
19019 | +;; True if this is a const_int with one bit set | ||
19020 | +(define_predicate "one_bit_set_operand" | ||
19021 | + (match_code "const_int") | ||
19022 | + { | ||
19023 | + int i; | ||
19024 | + int value; | ||
19025 | + int ones = 0; | ||
19026 | + | ||
19027 | + value = INTVAL(op); | ||
19028 | + for ( i = 0 ; i < 32; i++ ){ | ||
19029 | + if ( value & ( 1 << i ) ){ | ||
19030 | + ones++; | ||
19031 | + } | ||
19032 | + } | ||
19033 | + | ||
19034 | + return ( ones == 1 ); | ||
19035 | + }) | ||
19036 | + | ||
19037 | + | ||
19038 | +;; True if this is a const_int with one bit cleared | ||
19039 | +(define_predicate "one_bit_cleared_operand" | ||
19040 | + (match_code "const_int") | ||
19041 | + { | ||
19042 | + int i; | ||
19043 | + int value; | ||
19044 | + int zeroes = 0; | ||
19045 | + | ||
19046 | + value = INTVAL(op); | ||
19047 | + for ( i = 0 ; i < 32; i++ ){ | ||
19048 | + if ( !(value & ( 1 << i )) ){ | ||
19049 | + zeroes++; | ||
19050 | + } | ||
19051 | + } | ||
19052 | + | ||
19053 | + return ( zeroes == 1 ); | ||
19054 | + }) | ||
19055 | + | ||
19056 | + | ||
19057 | +;; True if this is a register or immediate operand | ||
19058 | +(define_predicate "register_immediate_operand" | ||
19059 | + (ior (match_operand 0 "register_operand") | ||
19060 | + (match_operand 0 "immediate_operand"))) | ||
19061 | + | ||
19062 | + | ||
19063 | +;; True is this is an operand containing a label_ref | ||
19064 | +(define_predicate "avr32_label_ref_operand" | ||
19065 | + (and (match_code "mem") | ||
19066 | + (match_test "avr32_find_symbol(op) | ||
19067 | + && (GET_CODE(avr32_find_symbol(op)) == LABEL_REF)"))) | ||
19068 | + | ||
19069 | +;; True is this is a valid symbol pointing to the constant pool | ||
19070 | +(define_predicate "avr32_const_pool_operand" | ||
19071 | + (and (match_code "symbol_ref") | ||
19072 | + (match_test "CONSTANT_POOL_ADDRESS_P(op)")) | ||
19073 | + { | ||
19074 | + return (flag_pic ? (!(symbol_mentioned_p (get_pool_constant (op)) | ||
19075 | + || label_mentioned_p (get_pool_constant (op))) | ||
19076 | + || avr32_got_mentioned_p(get_pool_constant (op))) | ||
19077 | + : true); | ||
19078 | + } | ||
19079 | +) | ||
19080 | + | ||
19081 | +;; True is this is a memory reference to the constant or mini pool | ||
19082 | +(define_predicate "avr32_const_pool_ref_operand" | ||
19083 | + (ior (match_operand 0 "avr32_label_ref_operand") | ||
19084 | + (and (match_code "mem") | ||
19085 | + (match_test "avr32_const_pool_operand(XEXP(op,0), GET_MODE(XEXP(op,0)))")))) | ||
19086 | + | ||
19087 | + | ||
19088 | + | ||
19089 | +;; True is this is a k12 offseted memory operand | ||
19090 | +(define_predicate "avr32_k12_memory_operand" | ||
19091 | + (and (match_code "mem") | ||
19092 | + (ior (match_test "REG_P(XEXP(op, 0))") | ||
19093 | + (match_test "GET_CODE(XEXP(op, 0)) == PLUS | ||
19094 | + && REG_P(XEXP(XEXP(op, 0), 0)) | ||
19095 | + && (GET_CODE(XEXP(XEXP(op, 0), 1)) == CONST_INT) | ||
19096 | + && (CONST_OK_FOR_CONSTRAINT_P(INTVAL(XEXP(XEXP(op, 0), 0)), | ||
19097 | + 'K', (mode == SImode) ? \"Ks14\" : ((mode == HImode) ? \"Ks13\" : \"Ks12\")))")))) | ||
19098 | + | ||
19099 | +;; True is this is a memory operand with an immediate displacement | ||
19100 | +(define_predicate "avr32_imm_disp_memory_operand" | ||
19101 | + (and (match_code "mem") | ||
19102 | + (match_test "GET_CODE(XEXP(op, 0)) == PLUS | ||
19103 | + && REG_P(XEXP(XEXP(op, 0), 0)) | ||
19104 | + && (GET_CODE(XEXP(XEXP(op, 0), 1)) == CONST_INT)"))) | ||
19105 | + | ||
19106 | +;; True is this is a bswap operand | ||
19107 | +(define_predicate "avr32_bswap_operand" | ||
19108 | + (ior (match_operand 0 "avr32_k12_memory_operand") | ||
19109 | + (match_operand 0 "register_operand"))) | ||
19110 | + | ||
19111 | +;; True is this is a valid coprocessor insn memory operand | ||
19112 | +(define_predicate "avr32_cop_memory_operand" | ||
19113 | + (and (match_operand 0 "memory_operand") | ||
19114 | + (not (match_test "GET_CODE(XEXP(op, 0)) == PLUS | ||
19115 | + && REG_P(XEXP(XEXP(op, 0), 0)) | ||
19116 | + && (GET_CODE(XEXP(XEXP(op, 0), 1)) == CONST_INT) | ||
19117 | + && !(CONST_OK_FOR_CONSTRAINT_P(INTVAL(XEXP(XEXP(op, 0), 0)), 'K', \"Ku10\"))")))) | ||
19118 | + | ||
19119 | +;; True is this is a valid source/destination operand | ||
19120 | +;; for moving values to/from a coprocessor | ||
19121 | +(define_predicate "avr32_cop_move_operand" | ||
19122 | + (ior (match_operand 0 "register_operand") | ||
19123 | + (match_operand 0 "avr32_cop_memory_operand"))) | ||
19124 | + | ||
19125 | + | ||
19126 | +;; True is this is a valid extract byte offset for use in | ||
19127 | +;; load extracted index insns | ||
19128 | +(define_predicate "avr32_extract_shift_operand" | ||
19129 | + (and (match_operand 0 "const_int_operand") | ||
19130 | + (match_test "(INTVAL(op) == 0) || (INTVAL(op) == 8) | ||
19131 | + || (INTVAL(op) == 16) || (INTVAL(op) == 24)"))) | ||
19132 | + | ||
19133 | +;; True is this is a floating-point register | ||
19134 | +(define_predicate "avr32_fp_register_operand" | ||
19135 | + (and (match_operand 0 "register_operand") | ||
19136 | + (match_test "REGNO_REG_CLASS(REGNO(op)) == FP_REGS"))) | ||
19137 | + | ||
19138 | +;; True is this is valid avr32 symbol operand | ||
19139 | +(define_predicate "avr32_symbol_operand" | ||
19140 | + (ior (match_code "label_ref, symbol_ref") | ||
19141 | + (and (match_code "const") | ||
19142 | + (match_test "avr32_find_symbol(op)")))) | ||
19143 | + | ||
19144 | +;; True is this is valid operand for the lda.w and call pseudo insns | ||
19145 | +(define_predicate "avr32_address_operand" | ||
19146 | + (and (match_code "label_ref, symbol_ref") | ||
19147 | + (ior (match_test "TARGET_HAS_ASM_ADDR_PSEUDOS") | ||
19148 | + (match_test "flag_pic")) )) | ||
19149 | + | ||
19150 | +;; True if this is a avr32 call operand | ||
19151 | +(define_predicate "avr32_call_operand" | ||
19152 | + (ior (ior (match_operand 0 "register_operand") | ||
19153 | + (ior (match_operand 0 "avr32_const_pool_ref_operand") | ||
19154 | + (match_operand 0 "avr32_address_operand"))) | ||
19155 | + (match_test "SYMBOL_REF_RCALL_FUNCTION_P(op)"))) | ||
19156 | + | ||
19157 | +;; Return true for operators performing ALU operations | ||
19158 | + | ||
19159 | +(define_predicate "alu_operator" | ||
19160 | + (match_code "ior, xor, and, plus, minus, ashift, lshiftrt, ashiftrt")) | ||
19161 | + | ||
19162 | +(define_predicate "avr32_add_shift_immediate_operand" | ||
19163 | + (and (match_operand 0 "immediate_operand") | ||
19164 | + (match_test "CONST_OK_FOR_CONSTRAINT_P(INTVAL(op), 'K', \"Ku02\")"))) | ||
19165 | + | ||
19166 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/simd.md gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/simd.md | ||
19167 | --- gcc-4.0.2/gcc/config/avr32/simd.md 1970-01-01 01:00:00.000000000 +0100 | ||
19168 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/simd.md 2006-10-10 12:36:34.000000000 +0200 | ||
19169 | @@ -0,0 +1,145 @@ | ||
19170 | +;; AVR32 machine description file for SIMD instructions. | ||
19171 | +;; Copyright 2003-2006 Atmel Corporation. | ||
19172 | +;; | ||
19173 | +;; Written by Ronny Pedersen, Atmel Norway, <rpedersen@atmel.com> | ||
19174 | +;; | ||
19175 | +;; This file is part of GCC. | ||
19176 | +;; | ||
19177 | +;; This program is free software; you can redistribute it and/or modify | ||
19178 | +;; it under the terms of the GNU General Public License as published by | ||
19179 | +;; the Free Software Foundation; either version 2 of the License, or | ||
19180 | +;; (at your option) any later version. | ||
19181 | +;; | ||
19182 | +;; This program is distributed in the hope that it will be useful, | ||
19183 | +;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
19184 | +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19185 | +;; GNU General Public License for more details. | ||
19186 | +;; | ||
19187 | +;; You should have received a copy of the GNU General Public License | ||
19188 | +;; along with this program; if not, write to the Free Software | ||
19189 | +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19190 | + | ||
19191 | +;; -*- Mode: Scheme -*- | ||
19192 | + | ||
19193 | + | ||
19194 | +;; Vector modes | ||
19195 | +(define_mode_macro VECM [V2HI V4QI]) | ||
19196 | +(define_mode_attr size [(V2HI "h") (V4QI "b")]) | ||
19197 | + | ||
19198 | +(define_insn "add<mode>3" | ||
19199 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19200 | + (plus:VECM (match_operand:VECM 1 "register_operand" "r") | ||
19201 | + (match_operand:VECM 2 "register_operand" "r")))] | ||
19202 | + "TARGET_SIMD" | ||
19203 | + "padd.<size>\t%0, %1, %2" | ||
19204 | + [(set_attr "length" "4") | ||
19205 | + (set_attr "type" "alu")]) | ||
19206 | + | ||
19207 | + | ||
19208 | +(define_insn "sub<mode>3" | ||
19209 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19210 | + (minus:VECM (match_operand:VECM 1 "register_operand" "r") | ||
19211 | + (match_operand:VECM 2 "register_operand" "r")))] | ||
19212 | + "TARGET_SIMD" | ||
19213 | + "psub.<size>\t%0, %1, %2" | ||
19214 | + [(set_attr "length" "4") | ||
19215 | + (set_attr "type" "alu")]) | ||
19216 | + | ||
19217 | + | ||
19218 | +(define_insn "abs<mode>2" | ||
19219 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19220 | + (abs:VECM (match_operand:VECM 1 "register_operand" "r")))] | ||
19221 | + "TARGET_SIMD" | ||
19222 | + "pabs.s<size>\t%0, %1" | ||
19223 | + [(set_attr "length" "4") | ||
19224 | + (set_attr "type" "alu")]) | ||
19225 | + | ||
19226 | +(define_insn "ashl<mode>3" | ||
19227 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19228 | + (ashift:VECM (match_operand:VECM 1 "register_operand" "r") | ||
19229 | + (match_operand:SI 2 "immediate_operand" "Ku04")))] | ||
19230 | + "TARGET_SIMD" | ||
19231 | + "plsl.<size>\t%0, %1, %2" | ||
19232 | + [(set_attr "length" "4") | ||
19233 | + (set_attr "type" "alu")]) | ||
19234 | + | ||
19235 | +(define_insn "ashr<mode>3" | ||
19236 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19237 | + (ashiftrt:VECM (match_operand:VECM 1 "register_operand" "r") | ||
19238 | + (match_operand:SI 2 "immediate_operand" "Ku04")))] | ||
19239 | + "TARGET_SIMD" | ||
19240 | + "pasr.<size>\t%0, %1, %2" | ||
19241 | + [(set_attr "length" "4") | ||
19242 | + (set_attr "type" "alu")]) | ||
19243 | + | ||
19244 | +(define_insn "lshr<mode>3" | ||
19245 | + [(set (match_operand:VECM 0 "register_operand" "=r") | ||
19246 | + (lshiftrt:VECM (match_operand:VECM 1 "register_operand" "r") | ||
19247 | + (match_operand:SI 2 "immediate_operand" "Ku04")))] | ||
19248 | + "TARGET_SIMD" | ||
19249 | + "plsr.<size>\t%0, %1, %2" | ||
19250 | + [(set_attr "length" "4") | ||
19251 | + (set_attr "type" "alu")]) | ||
19252 | + | ||
19253 | +(define_insn "smaxv2hi3" | ||
19254 | + [(set (match_operand:V2HI 0 "register_operand" "=r") | ||
19255 | + (smax:V2HI (match_operand:V2HI 1 "register_operand" "r") | ||
19256 | + (match_operand:V2HI 2 "register_operand" "r")))] | ||
19257 | + | ||
19258 | + "TARGET_SIMD" | ||
19259 | + "pmax.sh\t%0, %1, %2" | ||
19260 | + [(set_attr "length" "4") | ||
19261 | + (set_attr "type" "alu")]) | ||
19262 | + | ||
19263 | +(define_insn "sminv2hi3" | ||
19264 | + [(set (match_operand:V2HI 0 "register_operand" "=r") | ||
19265 | + (smin:V2HI (match_operand:V2HI 1 "register_operand" "r") | ||
19266 | + (match_operand:V2HI 2 "register_operand" "r")))] | ||
19267 | + | ||
19268 | + "TARGET_SIMD" | ||
19269 | + "pmin.sh\t%0, %1, %2" | ||
19270 | + [(set_attr "length" "4") | ||
19271 | + (set_attr "type" "alu")]) | ||
19272 | + | ||
19273 | +(define_insn "umaxv4qi3" | ||
19274 | + [(set (match_operand:V4QI 0 "register_operand" "=r") | ||
19275 | + (umax:V4QI (match_operand:V4QI 1 "register_operand" "r") | ||
19276 | + (match_operand:V4QI 2 "register_operand" "r")))] | ||
19277 | + | ||
19278 | + "TARGET_SIMD" | ||
19279 | + "pmax.ub\t%0, %1, %2" | ||
19280 | + [(set_attr "length" "4") | ||
19281 | + (set_attr "type" "alu")]) | ||
19282 | + | ||
19283 | +(define_insn "uminv4qi3" | ||
19284 | + [(set (match_operand:V4QI 0 "register_operand" "=r") | ||
19285 | + (umin:V4QI (match_operand:V4QI 1 "register_operand" "r") | ||
19286 | + (match_operand:V4QI 2 "register_operand" "r")))] | ||
19287 | + | ||
19288 | + "TARGET_SIMD" | ||
19289 | + "pmin.ub\t%0, %1, %2" | ||
19290 | + [(set_attr "length" "4") | ||
19291 | + (set_attr "type" "alu")]) | ||
19292 | + | ||
19293 | + | ||
19294 | +(define_insn "addsubv2hi" | ||
19295 | + [(set (match_operand:V2HI 0 "register_operand" "=r") | ||
19296 | + (vec_concat:V2HI | ||
19297 | + (plus:HI (match_operand:HI 1 "register_operand" "r") | ||
19298 | + (match_operand:HI 2 "register_operand" "r")) | ||
19299 | + (minus:HI (match_dup 1) (match_dup 2))))] | ||
19300 | + "TARGET_SIMD" | ||
19301 | + "paddsub.h\t%0, %1:b, %2:b" | ||
19302 | + [(set_attr "length" "4") | ||
19303 | + (set_attr "type" "alu")]) | ||
19304 | + | ||
19305 | +(define_insn "subaddv2hi" | ||
19306 | + [(set (match_operand:V2HI 0 "register_operand" "=r") | ||
19307 | + (vec_concat:V2HI | ||
19308 | + (minus:HI (match_operand:HI 1 "register_operand" "r") | ||
19309 | + (match_operand:HI 2 "register_operand" "r")) | ||
19310 | + (plus:HI (match_dup 1) (match_dup 2))))] | ||
19311 | + "TARGET_SIMD" | ||
19312 | + "psubadd.h\t%0, %1:b, %2:b" | ||
19313 | + [(set_attr "length" "4") | ||
19314 | + (set_attr "type" "alu")]) | ||
19315 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/t-avr32 gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/t-avr32 | ||
19316 | --- gcc-4.0.2/gcc/config/avr32/t-avr32 1970-01-01 01:00:00.000000000 +0100 | ||
19317 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/t-avr32 2006-11-24 17:10:48.000000000 +0100 | ||
19318 | @@ -0,0 +1,63 @@ | ||
19319 | + | ||
19320 | +MD_INCLUDES= $(srcdir)/config/avr32/avr32.md \ | ||
19321 | + $(srcdir)/config/avr32/fpcp.md \ | ||
19322 | + $(srcdir)/config/avr32/simd.md \ | ||
19323 | + $(srcdir)/config/avr32/predicates.md | ||
19324 | + | ||
19325 | +s-config s-conditions s-flags s-codes s-constants s-emit s-recog s-preds \ | ||
19326 | + s-opinit s-extract s-peep s-attr s-attrtab s-output: $(MD_INCLUDES) | ||
19327 | + | ||
19328 | +# We want fine grained libraries, so use the new code | ||
19329 | +# to build the floating point emulation libraries. | ||
19330 | +FPBIT = fp-bit.c | ||
19331 | +DPBIT = dp-bit.c | ||
19332 | + | ||
19333 | +LIB1ASMSRC = avr32/lib1funcs.S | ||
19334 | +LIB1ASMFUNCS = _avr32_f64_mul _avr32_f64_addsub _avr32_f64_to_u32 _avr32_f64_to_s32 \ | ||
19335 | + _avr32_f64_to_u64 _avr32_f64_to_s64 _avr32_u32_to_f64 _avr32_s32_to_f64 \ | ||
19336 | + _avr32_f64_cmp_eq _avr32_f64_cmp_ge _avr32_f64_cmp_lt \ | ||
19337 | + _avr32_f32_cmp_eq _avr32_f32_cmp_ge _avr32_f32_cmp_lt \ | ||
19338 | + _avr32_f64_div _avr32_f32_div\ | ||
19339 | + _avr32_f32_mul _avr32_s32_to_f32 _avr32_u32_to_f32 _avr32_f32_to_s32 \ | ||
19340 | + _avr32_f32_to_u32 _avr32_f32_to_f64 _avr32_f64_to_f32 | ||
19341 | + | ||
19342 | +LIB2FUNCS_EXTRA += $(srcdir)/config/avr32/lib2funcs.S | ||
19343 | + | ||
19344 | +MULTILIB_OPTIONS = march=ap/march=uc | ||
19345 | +MULTILIB_DIRNAMES = ap uc | ||
19346 | +MULTILIB_EXCEPTIONS = | ||
19347 | +MULTILIB_MATCHES = march?ap=mcpu?ap7000 | ||
19348 | +MULTILIB_MATCHES += march?ap=mcpu?ap7010 | ||
19349 | +MULTILIB_MATCHES += march?ap=mcpu?ap7020 | ||
19350 | +MULTILIB_MATCHES += march?uc=mcpu?uc3a0256 | ||
19351 | +MULTILIB_MATCHES += march?uc=mcpu?uc3a0512 | ||
19352 | +MULTILIB_MATCHES += march?uc=mcpu?uc3a1128 | ||
19353 | +MULTILIB_MATCHES += march?uc=mcpu?uc3a1256 | ||
19354 | +MULTILIB_MATCHES += march?uc=mcpu?uc3a1512 | ||
19355 | +MULTILIB_MATCHES += march?ap=mpart?ap7000 | ||
19356 | +MULTILIB_MATCHES += march?ap=mpart?ap7010 | ||
19357 | +MULTILIB_MATCHES += march?ap=mpart?ap7020 | ||
19358 | +MULTILIB_MATCHES += march?uc=mpart?uc3a0256 | ||
19359 | +MULTILIB_MATCHES += march?uc=mpart?uc3a0512 | ||
19360 | +MULTILIB_MATCHES += march?uc=mpart?uc3a1128 | ||
19361 | +MULTILIB_MATCHES += march?uc=mpart?uc3a1256 | ||
19362 | +MULTILIB_MATCHES += march?uc=mpart?uc3a1512 | ||
19363 | + | ||
19364 | +EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o | ||
19365 | + | ||
19366 | +CRTSTUFF_T_CFLAGS = -mrelax | ||
19367 | +CRTSTUFF_T_CFLAGS_S = -mrelax -fPIC | ||
19368 | +TARGET_LIBGCC2_CFLAGS += -mrelax | ||
19369 | + | ||
19370 | +LIBGCC = stmp-multilib | ||
19371 | +INSTALL_LIBGCC = install-multilib | ||
19372 | + | ||
19373 | +fp-bit.c: $(srcdir)/config/fp-bit.c | ||
19374 | + echo '#define FLOAT' > fp-bit.c | ||
19375 | + cat $(srcdir)/config/fp-bit.c >> fp-bit.c | ||
19376 | + | ||
19377 | +dp-bit.c: $(srcdir)/config/fp-bit.c | ||
19378 | + cat $(srcdir)/config/fp-bit.c > dp-bit.c | ||
19379 | + | ||
19380 | + | ||
19381 | + | ||
19382 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/t-elf gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/t-elf | ||
19383 | --- gcc-4.0.2/gcc/config/avr32/t-elf 1970-01-01 01:00:00.000000000 +0100 | ||
19384 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/t-elf 2006-03-20 13:59:57.000000000 +0100 | ||
19385 | @@ -0,0 +1,16 @@ | ||
19386 | + | ||
19387 | +# Assemble startup files. | ||
19388 | +$(T)crti.o: $(srcdir)/config/avr32/crti.asm $(GCC_PASSES) | ||
19389 | + $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) $(INCLUDES) \ | ||
19390 | + -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/avr32/crti.asm | ||
19391 | + | ||
19392 | +$(T)crtn.o: $(srcdir)/config/avr32/crtn.asm $(GCC_PASSES) | ||
19393 | + $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) $(INCLUDES) \ | ||
19394 | + -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/avr32/crtn.asm | ||
19395 | + | ||
19396 | + | ||
19397 | +# Build the libraries for both hard and soft floating point | ||
19398 | +EXTRA_MULTILIB_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crti.o crtn.o | ||
19399 | + | ||
19400 | +LIBGCC = stmp-multilib | ||
19401 | +INSTALL_LIBGCC = install-multilib | ||
19402 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/avr32/uclinux-elf.h gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/uclinux-elf.h | ||
19403 | --- gcc-4.0.2/gcc/config/avr32/uclinux-elf.h 1970-01-01 01:00:00.000000000 +0100 | ||
19404 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/avr32/uclinux-elf.h 2006-01-04 10:57:09.000000000 +0100 | ||
19405 | @@ -0,0 +1,20 @@ | ||
19406 | + | ||
19407 | +/* Run-time Target Specification. */ | ||
19408 | +#undef TARGET_VERSION | ||
19409 | +#define TARGET_VERSION fputs (" (AVR32 uClinux with ELF)", stderr) | ||
19410 | + | ||
19411 | +/* We don't want a .jcr section on uClinux. As if this makes a difference... */ | ||
19412 | +#define TARGET_USE_JCR_SECTION 0 | ||
19413 | + | ||
19414 | +/* Here we go. Drop the crtbegin/crtend stuff completely. */ | ||
19415 | +#undef STARTFILE_SPEC | ||
19416 | +#define STARTFILE_SPEC \ | ||
19417 | + "%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s}" \ | ||
19418 | + " %{!p:%{profile:gcrt1.o%s}" \ | ||
19419 | + " %{!profile:crt1.o%s}}}} crti.o%s" | ||
19420 | + | ||
19421 | +#undef ENDFILE_SPEC | ||
19422 | +#define ENDFILE_SPEC "crtn.o%s" | ||
19423 | + | ||
19424 | +#undef TARGET_DEFAULT | ||
19425 | +#define TARGET_DEFAULT (AVR32_FLAG_NO_INIT_GOT) | ||
19426 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config/host-linux.c gcc-4.0.2-atmel.0.99.2/gcc/config/host-linux.c | ||
19427 | --- gcc-4.0.2/gcc/config/host-linux.c 2005-08-01 20:00:10.000000000 +0200 | ||
19428 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config/host-linux.c 2006-03-23 13:33:12.000000000 +0100 | ||
19429 | @@ -26,6 +26,9 @@ | ||
19430 | #include "hosthooks.h" | ||
19431 | #include "hosthooks-def.h" | ||
19432 | |||
19433 | +#ifndef SSIZE_MAX | ||
19434 | +#define SSIZE_MAX LONG_MAX | ||
19435 | +#endif | ||
19436 | |||
19437 | /* Linux has a feature called exec-shield-randomize that perturbs the | ||
19438 | address of non-fixed mapped segments by a (relatively) small amount. | ||
19439 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/config.gcc gcc-4.0.2-atmel.0.99.2/gcc/config.gcc | ||
19440 | --- gcc-4.0.2/gcc/config.gcc 2005-08-09 12:57:04.000000000 +0200 | ||
19441 | +++ gcc-4.0.2-atmel.0.99.2/gcc/config.gcc 2006-02-08 17:33:56.000000000 +0100 | ||
19442 | @@ -189,9 +189,6 @@ case ${target} in | ||
19443 | | ip2k-*-elf \ | ||
19444 | | ns32k-*-netbsdelf* \ | ||
19445 | | ns32k-*-netbsd* \ | ||
19446 | - | c4x-* \ | ||
19447 | - | tic4x-* \ | ||
19448 | - | hppa1.1-*-rtems* \ | ||
19449 | ) | ||
19450 | if test "x$enable_obsolete" != xyes; then | ||
19451 | echo "*** Configuration ${target} is obsolete." >&2 | ||
19452 | @@ -251,9 +248,6 @@ arm*-*-*) | ||
19453 | cpu_type=arm | ||
19454 | extra_headers="mmintrin.h" | ||
19455 | ;; | ||
19456 | -bfin*-*) | ||
19457 | - cpu_type=bfin | ||
19458 | - ;; | ||
19459 | ep9312*-*-*) | ||
19460 | cpu_type=arm | ||
19461 | ;; | ||
19462 | @@ -735,6 +729,24 @@ avr-*-*) | ||
19463 | tm_file="avr/avr.h dbxelf.h" | ||
19464 | use_fixproto=yes | ||
19465 | ;; | ||
19466 | +avr32*-*-linux*) | ||
19467 | + tm_file="dbxelf.h elfos.h linux.h avr32/linux-elf.h avr32/avr32.h " | ||
19468 | + tmake_file="t-linux avr32/t-avr32 avr32/t-elf" | ||
19469 | + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" | ||
19470 | + extra_modes=avr32/avr32-modes.def | ||
19471 | + gnu_ld=yes | ||
19472 | + ;; | ||
19473 | +avr32*-*-uclinux*) | ||
19474 | + tm_file="dbxelf.h elfos.h linux.h avr32/linux-elf.h avr32/uclinux-elf.h avr32/avr32.h" | ||
19475 | + tmake_file="t-linux avr32/t-avr32 avr32/t-elf" | ||
19476 | + extra_modes=avr32/avr32-modes.def | ||
19477 | + gnu_ld=yes | ||
19478 | + ;; | ||
19479 | +avr32-*-*) | ||
19480 | + tm_file="dbxelf.h elfos.h avr32/avr32.h avr32/avr32-elf.h" | ||
19481 | + tmake_file="avr32/t-avr32 avr32/t-elf" | ||
19482 | + extra_modes=avr32/avr32-modes.def | ||
19483 | + ;; | ||
19484 | bfin*-elf*) | ||
19485 | tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h" | ||
19486 | tmake_file=bfin/t-bfin-elf | ||
19487 | @@ -792,14 +804,10 @@ frv-*-*linux*) | ||
19488 | linux.h frv/linux.h frv/frv-abi.h" | ||
19489 | tmake_file="${tmake_file} frv/t-frv frv/t-linux" | ||
19490 | ;; | ||
19491 | -h8300-*-rtemscoff*) | ||
19492 | +h8300-*-rtems*) | ||
19493 | tmake_file="h8300/t-h8300 t-rtems h8300/t-rtems" | ||
19494 | tm_file="h8300/h8300.h dbxcoff.h h8300/coff.h h8300/rtems.h rtems.h" | ||
19495 | ;; | ||
19496 | -h8300-*-rtems*) | ||
19497 | - tmake_file="h8300/t-h8300 h8300/t-elf t-rtems h8300/t-rtems" | ||
19498 | - tm_file="h8300/h8300.h dbxelf.h elfos.h h8300/elf.h h8300/rtems.h rtems.h" | ||
19499 | - ;; | ||
19500 | h8300-*-elf*) | ||
19501 | tmake_file="h8300/t-h8300 h8300/t-elf" | ||
19502 | tm_file="h8300/h8300.h dbxelf.h elfos.h h8300/elf.h" | ||
19503 | @@ -1560,6 +1568,9 @@ pdp11-*-bsd) | ||
19504 | pdp11-*-*) | ||
19505 | use_fixproto=yes | ||
19506 | ;; | ||
19507 | +avr-*-*) | ||
19508 | + use_fixproto=yes | ||
19509 | + ;; | ||
19510 | # port not yet contributed | ||
19511 | #powerpc-*-openbsd*) | ||
19512 | # tmake_file="${tmake_file} rs6000/t-fprules " | ||
19513 | @@ -2471,6 +2482,21 @@ case "${target}" in | ||
19514 | fi | ||
19515 | ;; | ||
19516 | |||
19517 | + avr32*-*-*) | ||
19518 | + supported_defaults="cpu" | ||
19519 | + | ||
19520 | + case "$with_cpu" in | ||
19521 | + "" \ | ||
19522 | + | morgan | ap7000 ) | ||
19523 | + # OK | ||
19524 | + ;; | ||
19525 | + *) | ||
19526 | + echo "Unknown arch used in --with-arch=$with_arch" 1>&2 | ||
19527 | + exit 1 | ||
19528 | + ;; | ||
19529 | + esac | ||
19530 | + ;; | ||
19531 | + | ||
19532 | fr*-*-*linux*) | ||
19533 | supported_defaults=cpu | ||
19534 | case "$with_cpu" in | ||
19535 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/cp/decl.c gcc-4.0.2-atmel.0.99.2/gcc/cp/decl.c | ||
19536 | --- gcc-4.0.2/gcc/cp/decl.c 2005-09-09 02:51:56.000000000 +0200 | ||
19537 | +++ gcc-4.0.2-atmel.0.99.2/gcc/cp/decl.c 2006-10-03 15:32:50.000000000 +0200 | ||
19538 | @@ -6128,6 +6128,7 @@ compute_array_index_type (tree name, tre | ||
19539 | name); | ||
19540 | else | ||
19541 | error ("size of array is not an integral constant-expression"); | ||
19542 | + size = integer_one_node; | ||
19543 | } | ||
19544 | else if (pedantic) | ||
19545 | { | ||
19546 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/c-typeck.c gcc-4.0.2-atmel.0.99.2/gcc/c-typeck.c | ||
19547 | --- gcc-4.0.2/gcc/c-typeck.c 2005-09-06 22:10:50.000000000 +0200 | ||
19548 | +++ gcc-4.0.2-atmel.0.99.2/gcc/c-typeck.c 2006-10-03 15:32:50.000000000 +0200 | ||
19549 | @@ -2742,8 +2742,13 @@ build_unary_op (enum tree_code code, tre | ||
19550 | when we have proper support for integer constant expressions. */ | ||
19551 | val = get_base_address (arg); | ||
19552 | if (val && TREE_CODE (val) == INDIRECT_REF | ||
19553 | - && integer_zerop (TREE_OPERAND (val, 0))) | ||
19554 | - return fold_convert (argtype, fold_offsetof (arg)); | ||
19555 | + && TREE_CONSTANT (TREE_OPERAND (val, 0))) | ||
19556 | + { | ||
19557 | + tree op0 = fold_convert (argtype, fold_offsetof (arg)), op1; | ||
19558 | + | ||
19559 | + op1 = fold_convert (argtype, TREE_OPERAND (val, 0)); | ||
19560 | + return fold (build2 (PLUS_EXPR, argtype, op0, op1)); | ||
19561 | + } | ||
19562 | |||
19563 | val = build1 (ADDR_EXPR, argtype, arg); | ||
19564 | |||
19565 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/doc/extend.texi gcc-4.0.2-atmel.0.99.2/gcc/doc/extend.texi | ||
19566 | --- gcc-4.0.2/gcc/doc/extend.texi 2005-07-20 12:36:23.000000000 +0200 | ||
19567 | +++ gcc-4.0.2-atmel.0.99.2/gcc/doc/extend.texi 2006-06-19 13:14:00.000000000 +0200 | ||
19568 | @@ -1723,13 +1723,6 @@ on data in the eight bit data area. Not | ||
19569 | You must use GAS and GLD from GNU binutils version 2.7 or later for | ||
19570 | this attribute to work correctly. | ||
19571 | |||
19572 | -@item exception_handler | ||
19573 | -@cindex exception handler functions on the Blackfin processor | ||
19574 | -Use this attribute on the Blackfin to indicate that the specified function | ||
19575 | -is an exception handler. The compiler will generate function entry and | ||
19576 | -exit sequences suitable for use in an exception handler when this | ||
19577 | -attribute is present. | ||
19578 | - | ||
19579 | @item far | ||
19580 | @cindex functions which handle memory bank switching | ||
19581 | On 68HC11 and 68HC12 the @code{far} attribute causes the compiler to | ||
19582 | @@ -1873,13 +1866,13 @@ this attribute to work correctly. | ||
19583 | |||
19584 | @item interrupt | ||
19585 | @cindex interrupt handler functions | ||
19586 | -Use this attribute on the ARM, AVR, C4x, M32R/D and Xstormy16 ports to indicate | ||
19587 | +Use this attribute on the ARM, AVR, AVR32, C4x, M32R/D and Xstormy16 ports to indicate | ||
19588 | that the specified function is an interrupt handler. The compiler will | ||
19589 | generate function entry and exit sequences suitable for use in an | ||
19590 | interrupt handler when this attribute is present. | ||
19591 | |||
19592 | -Note, interrupt handlers for the Blackfin, m68k, H8/300, H8/300H, H8S, and | ||
19593 | -SH processors can be specified via the @code{interrupt_handler} attribute. | ||
19594 | +Note, interrupt handlers for the m68k, H8/300, H8/300H, H8S, and SH processors | ||
19595 | +can be specified via the @code{interrupt_handler} attribute. | ||
19596 | |||
19597 | Note, on the AVR, interrupts will be enabled inside the function. | ||
19598 | |||
19599 | @@ -1892,18 +1885,21 @@ void f () __attribute__ ((interrupt ("IR | ||
19600 | |||
19601 | Permissible values for this parameter are: IRQ, FIQ, SWI, ABORT and UNDEF@. | ||
19602 | |||
19603 | -@item interrupt_handler | ||
19604 | -@cindex interrupt handler functions on the Blackfin, m68k, H8/300 and SH processors | ||
19605 | -Use this attribute on the Blackfin, m68k, H8/300, H8/300H, H8S, and SH to | ||
19606 | -indicate that the specified function is an interrupt handler. The compiler | ||
19607 | -will generate function entry and exit sequences suitable for use in an | ||
19608 | -interrupt handler when this attribute is present. | ||
19609 | +Note, for the AVR32, you can specify which banking scheme is used for | ||
19610 | +the interrupt mode this interrupt handler is used in like this: | ||
19611 | + | ||
19612 | +@smallexample | ||
19613 | +void f () __attribute__ ((interrupt ("FULL"))); | ||
19614 | +@end smallexample | ||
19615 | |||
19616 | -@item kspisusp | ||
19617 | -@cindex User stack pointer in interrupts on the Blackfin | ||
19618 | -When used together with @code{interrupt_handler}, @code{exception_handler} | ||
19619 | -or @code{nmi_handler}, code will be generated to load the stack pointer | ||
19620 | -from the USP register in the function prologue. | ||
19621 | +Permissible values for this parameter are: FULL, HALF, NONE and UNDEF. | ||
19622 | + | ||
19623 | +@item interrupt_handler | ||
19624 | +@cindex interrupt handler functions on the m68k, H8/300 and SH processors | ||
19625 | +Use this attribute on the m68k, H8/300, H8/300H, H8S, and SH to indicate that | ||
19626 | +the specified function is an interrupt handler. The compiler will generate | ||
19627 | +function entry and exit sequences suitable for use in an interrupt | ||
19628 | +handler when this attribute is present. | ||
19629 | |||
19630 | @item long_call/short_call | ||
19631 | @cindex indirect calls on ARM | ||
19632 | @@ -1983,19 +1979,6 @@ use the normal calling convention based | ||
19633 | This attribute can be used to cancel the effect of the @option{-mlong-calls} | ||
19634 | option. | ||
19635 | |||
19636 | -@item nesting | ||
19637 | -@cindex Allow nesting in an interrupt handler on the Blackfin processor. | ||
19638 | -Use this attribute together with @code{interrupt_handler}, | ||
19639 | -@code{exception_handler} or @code{nmi_handler} to indicate that the function | ||
19640 | -entry code should enable nested interrupts or exceptions. | ||
19641 | - | ||
19642 | -@item nmi_handler | ||
19643 | -@cindex NMI handler functions on the Blackfin processor | ||
19644 | -Use this attribute on the Blackfin to indicate that the specified function | ||
19645 | -is an NMI handler. The compiler will generate function entry and | ||
19646 | -exit sequences suitable for use in an NMI handler when this | ||
19647 | -attribute is present. | ||
19648 | - | ||
19649 | @item no_instrument_function | ||
19650 | @cindex @code{no_instrument_function} function attribute | ||
19651 | @opindex finstrument-functions | ||
19652 | @@ -2140,8 +2123,8 @@ disabled with the linker or the loader i | ||
19653 | problem.) | ||
19654 | |||
19655 | @item saveall | ||
19656 | -@cindex save all registers on the Blackfin, H8/300, H8/300H, and H8S | ||
19657 | -Use this attribute on the Blackfin, H8/300, H8/300H, and H8S to indicate that | ||
19658 | +@cindex save all registers on the H8/300, H8/300H, and H8S | ||
19659 | +Use this attribute on the H8/300, H8/300H, and H8S to indicate that | ||
19660 | all registers except the stack pointer should be saved in the prologue | ||
19661 | regardless of whether they are used or not. | ||
19662 | |||
19663 | @@ -3221,7 +3204,7 @@ struct my_unpacked_struct | ||
19664 | int i; | ||
19665 | @}; | ||
19666 | |||
19667 | -struct __attribute__ ((__packed__)) my_packed_struct | ||
19668 | +struct my_packed_struct __attribute__ ((__packed__)) | ||
19669 | @{ | ||
19670 | char c; | ||
19671 | int i; | ||
19672 | @@ -5449,6 +5432,7 @@ instructions, but allow the compiler to | ||
19673 | @menu | ||
19674 | * Alpha Built-in Functions:: | ||
19675 | * ARM Built-in Functions:: | ||
19676 | +* AVR32 Built-in Functions:: | ||
19677 | * Blackfin Built-in Functions:: | ||
19678 | * FR-V Built-in Functions:: | ||
19679 | * X86 Built-in Functions:: | ||
19680 | @@ -5686,6 +5670,54 @@ long long __builtin_arm_wxor (long long, | ||
19681 | long long __builtin_arm_wzero () | ||
19682 | @end smallexample | ||
19683 | |||
19684 | +@node AVR32 Built-in Functions | ||
19685 | +@subsection AVR32 Built-in Functions | ||
19686 | + | ||
19687 | + | ||
19688 | +@smallexample | ||
19689 | + | ||
19690 | +int __builtin_sats (int /*Rd*/,int /*sa*/, int /*bn*/) | ||
19691 | +int __builtin_satu (int /*Rd*/,int /*sa*/, int /*bn*/) | ||
19692 | +int __builtin_satrnds (int /*Rd*/,int /*sa*/, int /*bn*/) | ||
19693 | +int __builtin_satrndu (int /*Rd*/,int /*sa*/, int /*bn*/) | ||
19694 | +short __builtin_mulsathh_h (short, short) | ||
19695 | +int __builtin_mulsathh_w (short, short) | ||
19696 | +short __builtin_mulsatrndhh_h (short, short) | ||
19697 | +int __builtin_mulsatrndwh_w (int, short) | ||
19698 | +int __builtin_mulsatwh_w (int, short) | ||
19699 | +int __builtin_macsathh_w (int, short, short) | ||
19700 | +short __builtin_satadd_h (short, short) | ||
19701 | +short __builtin_satsub_h (short, short) | ||
19702 | +int __builtin_satadd_w (int, int) | ||
19703 | +int __builtin_satsub_w (int, int) | ||
19704 | +long long __builtin_mulwh_d(int, short) | ||
19705 | +long long __builtin_mulnwh_d(int, short) | ||
19706 | +long long __builtin_macwh_d(long long, int, short) | ||
19707 | +long long __builtin_machh_d(long long, short, short) | ||
19708 | + | ||
19709 | +void __builtin_musfr(int); | ||
19710 | +int __builtin_mustr(void); | ||
19711 | +int __builtin_mfsr(int /*Status Register Address*/) | ||
19712 | +void __builtin_mtsr(int /*Status Register Address*/, int /*Value*/) | ||
19713 | +int __builtin_mfdr(int /*Debug Register Address*/) | ||
19714 | +void __builtin_mtdr(int /*Debug Register Address*/, int /*Value*/) | ||
19715 | +void __builtin_cache(void * /*Address*/, int /*Cache Operation*/) | ||
19716 | +void __builtin_sync(int /*Sync Operation*/) | ||
19717 | +void __builtin_tlbr(void) | ||
19718 | +void __builtin_tlbs(void) | ||
19719 | +void __builtin_tlbw(void) | ||
19720 | +void __builtin_breakpoint(void) | ||
19721 | +int __builtin_xchg(void * /*Address*/, int /*Value*/ ) | ||
19722 | +short __builtin_bswap_16(short) | ||
19723 | +int __builtin_bswap_32(int) | ||
19724 | +void __builtin_cop(int/*cpnr*/, int/*crd*/, int/*crx*/, int/*cry*/, int/*op*/) | ||
19725 | +int __builtin_mvcr_w(int/*cpnr*/, int/*crs*/) | ||
19726 | +void __builtin_mvrc_w(int/*cpnr*/, int/*crd*/, int/*value*/) | ||
19727 | +long long __builtin_mvcr_d(int/*cpnr*/, int/*crs*/) | ||
19728 | +void __builtin_mvrc_d(int/*cpnr*/, int/*crd*/, long long/*value*/) | ||
19729 | + | ||
19730 | +@end smallexample | ||
19731 | + | ||
19732 | @node Blackfin Built-in Functions | ||
19733 | @subsection Blackfin Built-in Functions | ||
19734 | |||
19735 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/doc/invoke.texi gcc-4.0.2-atmel.0.99.2/gcc/doc/invoke.texi | ||
19736 | --- gcc-4.0.2/gcc/doc/invoke.texi 2005-09-02 10:12:30.000000000 +0200 | ||
19737 | +++ gcc-4.0.2-atmel.0.99.2/gcc/doc/invoke.texi 2006-02-08 17:33:56.000000000 +0100 | ||
19738 | @@ -185,7 +185,7 @@ in the following sections. | ||
19739 | -fno-default-inline -fvisibility-inlines-hidden @gol | ||
19740 | -Wabi -Wctor-dtor-privacy @gol | ||
19741 | -Wnon-virtual-dtor -Wreorder @gol | ||
19742 | --Weffc++ -Wno-deprecated -Wstrict-null-sentinel @gol | ||
19743 | +-Weffc++ -Wno-deprecated @gol | ||
19744 | -Wno-non-template-friend -Wold-style-cast @gol | ||
19745 | -Woverloaded-virtual -Wno-pmf-conversions @gol | ||
19746 | -Wsign-promo} | ||
19747 | @@ -542,6 +542,10 @@ Objective-C and Objective-C++ Dialects}. | ||
19748 | -mauto-incdec -minmax -mlong-calls -mshort @gol | ||
19749 | -msoft-reg-count=@var{count}} | ||
19750 | |||
19751 | +@emph{AVR32 Options} | ||
19752 | +@gccoptlist{-muse-rodata-section -mhard-float -msoft-float -mrelax @gol | ||
19753 | +-muse-oscall -mforce-double-align -mno-init-got -mcpu=@var{cpu}} | ||
19754 | + | ||
19755 | @emph{MCore Options} | ||
19756 | @gccoptlist{-mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates @gol | ||
19757 | -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields @gol | ||
19758 | @@ -1738,14 +1742,6 @@ to filter out those warnings. | ||
19759 | @opindex Wno-deprecated | ||
19760 | Do not warn about usage of deprecated features. @xref{Deprecated Features}. | ||
19761 | |||
19762 | -@item -Wstrict-null-sentinel @r{(C++ only)} | ||
19763 | -@opindex Wstrict-null-sentinel | ||
19764 | -Warn also about the use of an uncasted @code{NULL} as sentinel. When | ||
19765 | -compiling only with GCC this is a valid sentinel, as @code{NULL} is defined | ||
19766 | -to @code{__null}. Although it is a null pointer constant not a null pointer, | ||
19767 | -it is guaranteed to of the same size as a pointer. But this use is | ||
19768 | -not portable across different compilers. | ||
19769 | - | ||
19770 | @item -Wno-non-template-friend @r{(C++ only)} | ||
19771 | @opindex Wno-non-template-friend | ||
19772 | Disable warnings when non-templatized friend functions are declared | ||
19773 | @@ -2549,13 +2545,11 @@ get these warnings. | ||
19774 | If you want to warn about code which uses the uninitialized value of the | ||
19775 | variable in its own initializer, use the @option{-Winit-self} option. | ||
19776 | |||
19777 | -These warnings occur for individual uninitialized or clobbered | ||
19778 | -elements of structure, union or array variables as well as for | ||
19779 | -variables which are uninitialized or clobbered as a whole. They do | ||
19780 | -not occur for variables or elements declared @code{volatile}. Because | ||
19781 | -these warnings depend on optimization, the exact variables or elements | ||
19782 | -for which there are warnings will depend on the precise optimization | ||
19783 | -options and version of GCC used. | ||
19784 | +These warnings occur only for variables that are candidates for | ||
19785 | +register allocation. Therefore, they do not occur for a variable that | ||
19786 | +is declared @code{volatile}, or whose address is taken, or whose size | ||
19787 | +is other than 1, 2, 4 or 8 bytes. Also, they do not occur for | ||
19788 | +structures, unions or arrays, even when they are in registers. | ||
19789 | |||
19790 | Note that there may be no warning about a variable that is used only | ||
19791 | to compute a value that itself is never used, because such | ||
19792 | @@ -5584,10 +5578,6 @@ If number of candidates in the set is sm | ||
19793 | we always try to remove unnecessary ivs from the set during its | ||
19794 | optimization when a new iv is added to the set. | ||
19795 | |||
19796 | -@item scev-max-expr-size | ||
19797 | -Bound on size of expressions used in the scalar evolutions analyzer. | ||
19798 | -Large expressions slow the analyzer. | ||
19799 | - | ||
19800 | @item max-iterations-to-track | ||
19801 | |||
19802 | The maximum number of iterations of a loop the brute force algorithm | ||
19803 | @@ -6695,7 +6685,7 @@ that macro, which enables you to change | ||
19804 | * ARC Options:: | ||
19805 | * ARM Options:: | ||
19806 | * AVR Options:: | ||
19807 | -* Blackfin Options:: | ||
19808 | +* AVR32 Options:: | ||
19809 | * CRIS Options:: | ||
19810 | * Darwin Options:: | ||
19811 | * DEC Alpha Options:: | ||
19812 | @@ -7147,81 +7137,55 @@ comply to the C standards, but it will p | ||
19813 | size. | ||
19814 | @end table | ||
19815 | |||
19816 | -@node Blackfin Options | ||
19817 | -@subsection Blackfin Options | ||
19818 | -@cindex Blackfin Options | ||
19819 | +@node AVR32 Options | ||
19820 | +@subsection AVR32 Options | ||
19821 | +@cindex AVR32 Options | ||
19822 | |||
19823 | -@table @gcctabopt | ||
19824 | -@item -momit-leaf-frame-pointer | ||
19825 | -@opindex momit-leaf-frame-pointer | ||
19826 | -Don't keep the frame pointer in a register for leaf functions. This | ||
19827 | -avoids the instructions to save, set up and restore frame pointers and | ||
19828 | -makes an extra register available in leaf functions. The option | ||
19829 | -@option{-fomit-frame-pointer} removes the frame pointer for all functions | ||
19830 | -which might make debugging harder. | ||
19831 | +These options are defined for AVR32 implementations: | ||
19832 | |||
19833 | -@item -mspecld-anomaly | ||
19834 | -@opindex mspecld-anomaly | ||
19835 | -When enabled, the compiler will ensure that the generated code does not | ||
19836 | -contain speculative loads after jump instructions. This option is enabled | ||
19837 | -by default. | ||
19838 | - | ||
19839 | -@item -mno-specld-anomaly | ||
19840 | -@opindex mno-specld-anomaly | ||
19841 | -Don't generate extra code to prevent speculative loads from occurring. | ||
19842 | - | ||
19843 | -@item -mcsync-anomaly | ||
19844 | -@opindex mcsync-anomaly | ||
19845 | -When enabled, the compiler will ensure that the generated code does not | ||
19846 | -contain CSYNC or SSYNC instructions too soon after conditional branches. | ||
19847 | -This option is enabled by default. | ||
19848 | - | ||
19849 | -@item -mno-csync-anomaly | ||
19850 | -@opindex mno-csync-anomaly | ||
19851 | -Don't generate extra code to prevent CSYNC or SSYNC instructions from | ||
19852 | -occurring too soon after a conditional branch. | ||
19853 | - | ||
19854 | -@item -mlow-64k | ||
19855 | -@opindex mlow-64k | ||
19856 | -When enabled, the compiler is free to take advantage of the knowledge that | ||
19857 | -the entire program fits into the low 64k of memory. | ||
19858 | - | ||
19859 | -@item -mno-low-64k | ||
19860 | -@opindex mno-low-64k | ||
19861 | -Assume that the program is arbitrarily large. This is the default. | ||
19862 | +@table @gcctabopt | ||
19863 | +@item -muse-rodata-section | ||
19864 | +@opindex muse-rodata-section | ||
19865 | +Use section @samp{.rodata} for read-only data instead of @samp{.text}. | ||
19866 | |||
19867 | -@item -mid-shared-library | ||
19868 | -@opindex mid-shared-library | ||
19869 | -Generate code that supports shared libraries via the library ID method. | ||
19870 | -This allows for execute in place and shared libraries in an environment | ||
19871 | -without virtual memory management. This option implies @option{-fPIC}. | ||
19872 | +@item -mhard-float | ||
19873 | +@opindex mhard-float | ||
19874 | +Use floating-point coprocessor instructions. | ||
19875 | |||
19876 | -@item -mno-id-shared-library | ||
19877 | -@opindex mno-id-shared-library | ||
19878 | -Generate code that doesn't assume ID based shared libraries are being used. | ||
19879 | -This is the default. | ||
19880 | +@item -msoft-float | ||
19881 | +@opindex msoft-float | ||
19882 | +Use software floating-point library. | ||
19883 | |||
19884 | -@item -mshared-library-id=n | ||
19885 | -@opindex mshared-library-id | ||
19886 | -Specified the identification number of the ID based shared library being | ||
19887 | -compiled. Specifying a value of 0 will generate more compact code, specifying | ||
19888 | -other values will force the allocation of that number to the current | ||
19889 | -library but is no more space or time efficient than omitting this option. | ||
19890 | +@item -mrelax | ||
19891 | +@opindex mrelax | ||
19892 | +Enable relaxing in linker. This means that when the address of symbols | ||
19893 | +are known at link time, the linker can optimize @samp{icall} and @samp{mcall} | ||
19894 | +instructions into a @samp{rcall} instruction if possible. Loading the address | ||
19895 | +of a symbol can also be optimized. | ||
19896 | + | ||
19897 | +@item -muse-oscall | ||
19898 | +@opindex muse-oscall | ||
19899 | +When using gcc as a frontend for linking this switch forces the use of | ||
19900 | +@samp{fake} system calls in the newlib c-library. These fake system | ||
19901 | +calls are handled by some AVR32 simulators which redirects these calls | ||
19902 | +to the OS in which the simulator is running. This is practical for | ||
19903 | +being able to perform file I/O when running programs in a simulator. | ||
19904 | + | ||
19905 | +@item -mforce-double-align | ||
19906 | +@opindex mforce-double-align | ||
19907 | +Force double-word alignment for double-word memory accesses. | ||
19908 | + | ||
19909 | +@item -mno-init-got | ||
19910 | +@opindex mno-init-got | ||
19911 | +Do not initialize the GOT register before using it when compiling PIC | ||
19912 | +code. | ||
19913 | |||
19914 | -@item -mlong-calls | ||
19915 | -@itemx -mno-long-calls | ||
19916 | -@opindex mlong-calls | ||
19917 | -@opindex mno-long-calls | ||
19918 | -Tells the compiler to perform function calls by first loading the | ||
19919 | -address of the function into a register and then performing a subroutine | ||
19920 | -call on this register. This switch is needed if the target function | ||
19921 | -will lie outside of the 24 bit addressing range of the offset based | ||
19922 | -version of subroutine call instruction. | ||
19923 | +@item -mcpu=@var{cpu-type} | ||
19924 | +@opindex mcpu | ||
19925 | +Generate code for the specified cpu. Permissible names are: @samp{morgan}, | ||
19926 | +@samp{ap7000} and @samp{default}. @samp{default} is a dummy cpu which | ||
19927 | +allows all avr32 instructions. | ||
19928 | |||
19929 | -This feature is not enabled by default. Specifying | ||
19930 | -@option{-mno-long-calls} will restore the default behavior. Note these | ||
19931 | -switches have no effect on how the compiler generates code to handle | ||
19932 | -function calls via function pointers. | ||
19933 | @end table | ||
19934 | |||
19935 | @node CRIS Options | ||
19936 | @@ -10853,6 +10817,7 @@ conventions that adheres to the March 19 | ||
19937 | Application Binary Interface, PowerPC processor supplement. This is the | ||
19938 | default unless you configured GCC using @samp{powerpc-*-eabiaix}. | ||
19939 | |||
19940 | + | ||
19941 | @item -mcall-sysv-eabi | ||
19942 | @opindex mcall-sysv-eabi | ||
19943 | Specify both @option{-mcall-sysv} and @option{-meabi} options. | ||
19944 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/doc/md.texi gcc-4.0.2-atmel.0.99.2/gcc/doc/md.texi | ||
19945 | --- gcc-4.0.2/gcc/doc/md.texi 2005-08-14 01:56:45.000000000 +0200 | ||
19946 | +++ gcc-4.0.2-atmel.0.99.2/gcc/doc/md.texi 2006-07-13 09:53:31.000000000 +0200 | ||
19947 | @@ -3,6 +3,7 @@ | ||
19948 | @c This is part of the GCC manual. | ||
19949 | @c For copying conditions, see the file gcc.texi. | ||
19950 | |||
19951 | + | ||
19952 | @ifset INTERNALS | ||
19953 | @node Machine Desc | ||
19954 | @chapter Machine Descriptions | ||
19955 | @@ -1683,6 +1684,59 @@ A memory reference suitable for iWMMXt l | ||
19956 | A memory reference suitable for the ARMv4 ldrsb instruction. | ||
19957 | @end table | ||
19958 | |||
19959 | +@item AVR32 family---@file{avr32.h} | ||
19960 | +@table @code | ||
19961 | +@item f | ||
19962 | +Floating-point registers (f0 to f15) | ||
19963 | + | ||
19964 | +@item Ku@var{bits} | ||
19965 | +Unsigned constant representable with @var{bits} number of bits (Must be | ||
19966 | +two digits). I.e: An unsigned 8-bit constant is written as @samp{Ku08} | ||
19967 | + | ||
19968 | +@item Ks@var{bits} | ||
19969 | +Signed constant representable with @var{bits} number of bits (Must be | ||
19970 | +two digits). I.e: A signed 12-bit constant is written as @samp{Ks12} | ||
19971 | + | ||
19972 | +@item Is@var{bits} | ||
19973 | +The negated range of a signed constant representable with @var{bits} | ||
19974 | +number of bits. The same as @samp{Ks@var{bits}} with a negated range. | ||
19975 | +This means that the constant must be in the range @math{-2^{bits-1}-1} to @math{2^{bits-1}} | ||
19976 | + | ||
19977 | +@item G | ||
19978 | +A single/double precision floating-point immediate or 64-bit integer | ||
19979 | +immediate where the least and most significant words both can be | ||
19980 | +loaded with a move instruction. That is the the integer form of the | ||
19981 | +values in the least and most significant words both are in the range | ||
19982 | +@math{-2^{20}} to @math{2^{20}-1}. | ||
19983 | + | ||
19984 | +@item RKs@var{bits} | ||
19985 | +A memory reference where the address consists of a base register | ||
19986 | +plus a signed immediate displacement with range given by @samp{Ks@var{bits}} | ||
19987 | +which has the same format as for the signed immediate integer constraint | ||
19988 | +given above. | ||
19989 | + | ||
19990 | +@item RKu@var{bits} | ||
19991 | +A memory reference where the address consists of a base register | ||
19992 | +plus an unsigned immediate displacement with range given by @samp{Ku@var{bits}} | ||
19993 | +which has the same format as for the unsigned immediate integer constraint | ||
19994 | +given above. | ||
19995 | + | ||
19996 | +@item S | ||
19997 | +A memory reference with an immediate or register offset | ||
19998 | + | ||
19999 | +@item T | ||
20000 | +A memory reference to a constant pool entry | ||
20001 | + | ||
20002 | +@item W | ||
20003 | +A valid operand for use in the @samp{lda.w} instruction macro when | ||
20004 | +relaxing is enabled | ||
20005 | + | ||
20006 | +@item Z | ||
20007 | +A memory reference valid for coprocessor memory instructions | ||
20008 | + | ||
20009 | +@end table | ||
20010 | + | ||
20011 | + | ||
20012 | @item AVR family---@file{avr.h} | ||
20013 | @table @code | ||
20014 | @item l | ||
20015 | @@ -2069,102 +2123,6 @@ range of 1 to 2047. | ||
20016 | |||
20017 | @end table | ||
20018 | |||
20019 | -@item Blackfin family---@file{bfin.h} | ||
20020 | -@table @code | ||
20021 | -@item a | ||
20022 | -P register | ||
20023 | - | ||
20024 | -@item d | ||
20025 | -D register | ||
20026 | - | ||
20027 | -@item z | ||
20028 | -A call clobbered P register. | ||
20029 | - | ||
20030 | -@item D | ||
20031 | -Even-numbered D register | ||
20032 | - | ||
20033 | -@item W | ||
20034 | -Odd-numbered D register | ||
20035 | - | ||
20036 | -@item e | ||
20037 | -Accumulator register. | ||
20038 | - | ||
20039 | -@item A | ||
20040 | -Even-numbered accumulator register. | ||
20041 | - | ||
20042 | -@item B | ||
20043 | -Odd-numbered accumulator register. | ||
20044 | - | ||
20045 | -@item b | ||
20046 | -I register | ||
20047 | - | ||
20048 | -@item B | ||
20049 | -B register | ||
20050 | - | ||
20051 | -@item f | ||
20052 | -M register | ||
20053 | - | ||
20054 | -@item c | ||
20055 | -Registers used for circular buffering, i.e. I, B, or L registers. | ||
20056 | - | ||
20057 | -@item C | ||
20058 | -The CC register. | ||
20059 | - | ||
20060 | -@item x | ||
20061 | -Any D, P, B, M, I or L register. | ||
20062 | - | ||
20063 | -@item y | ||
20064 | -Additional registers typically used only in prologues and epilogues: RETS, | ||
20065 | -RETN, RETI, RETX, RETE, ASTAT, SEQSTAT and USP. | ||
20066 | - | ||
20067 | -@item w | ||
20068 | -Any register except accumulators or CC. | ||
20069 | - | ||
20070 | -@item Ksh | ||
20071 | -Signed 16 bit integer (in the range -32768 to 32767) | ||
20072 | - | ||
20073 | -@item Kuh | ||
20074 | -Unsigned 16 bit integer (in the range 0 to 65535) | ||
20075 | - | ||
20076 | -@item Ks7 | ||
20077 | -Signed 7 bit integer (in the range -64 to 63) | ||
20078 | - | ||
20079 | -@item Ku7 | ||
20080 | -Unsigned 7 bit integer (in the range 0 to 127) | ||
20081 | - | ||
20082 | -@item Ku5 | ||
20083 | -Unsigned 5 bit integer (in the range 0 to 31) | ||
20084 | - | ||
20085 | -@item Ks4 | ||
20086 | -Signed 4 bit integer (in the range -8 to 7) | ||
20087 | - | ||
20088 | -@item Ks3 | ||
20089 | -Signed 3 bit integer (in the range -3 to 4) | ||
20090 | - | ||
20091 | -@item Ku3 | ||
20092 | -Unsigned 3 bit integer (in the range 0 to 7) | ||
20093 | - | ||
20094 | -@item P@var{n} | ||
20095 | -Constant @var{n}, where @var{n} is a single-digit constant in the range 0 to 4. | ||
20096 | - | ||
20097 | -@item M1 | ||
20098 | -Constant 255. | ||
20099 | - | ||
20100 | -@item M2 | ||
20101 | -Constant 65535. | ||
20102 | - | ||
20103 | -@item J | ||
20104 | -An integer constant with exactly a single bit set. | ||
20105 | - | ||
20106 | -@item L | ||
20107 | -An integer constant with all bits set except exactly one. | ||
20108 | - | ||
20109 | -@item H | ||
20110 | - | ||
20111 | -@item Q | ||
20112 | -Any SYMBOL_REF. | ||
20113 | -@end table | ||
20114 | - | ||
20115 | @item IP2K---@file{ip2k.h} | ||
20116 | @table @code | ||
20117 | @item a | ||
20118 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/expr.c gcc-4.0.2-atmel.0.99.2/gcc/expr.c | ||
20119 | --- gcc-4.0.2/gcc/expr.c 2005-09-10 03:03:28.000000000 +0200 | ||
20120 | +++ gcc-4.0.2-atmel.0.99.2/gcc/expr.c 2006-10-10 12:40:42.000000000 +0200 | ||
20121 | @@ -3314,16 +3314,17 @@ emit_single_push_insn (enum machine_mode | ||
20122 | } | ||
20123 | else | ||
20124 | { | ||
20125 | + emit_move_insn (stack_pointer_rtx, | ||
20126 | + expand_binop (Pmode, | ||
20127 | #ifdef STACK_GROWS_DOWNWARD | ||
20128 | - /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC. */ | ||
20129 | - dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, | ||
20130 | - GEN_INT (-(HOST_WIDE_INT) rounded_size)); | ||
20131 | + sub_optab, | ||
20132 | #else | ||
20133 | - /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC. */ | ||
20134 | - dest_addr = gen_rtx_PLUS (Pmode, stack_pointer_rtx, | ||
20135 | - GEN_INT (rounded_size)); | ||
20136 | + add_optab, | ||
20137 | #endif | ||
20138 | - dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr); | ||
20139 | + stack_pointer_rtx, | ||
20140 | + GEN_INT (rounded_size), | ||
20141 | + NULL_RTX, 0, OPTAB_LIB_WIDEN)); | ||
20142 | + dest_addr = stack_pointer_rtx; | ||
20143 | } | ||
20144 | |||
20145 | dest = gen_rtx_MEM (mode, dest_addr); | ||
20146 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/genemit.c gcc-4.0.2-atmel.0.99.2/gcc/genemit.c | ||
20147 | --- gcc-4.0.2/gcc/genemit.c 2004-09-09 15:22:33.000000000 +0200 | ||
20148 | +++ gcc-4.0.2-atmel.0.99.2/gcc/genemit.c 2006-03-23 13:26:49.000000000 +0100 | ||
20149 | @@ -122,6 +122,24 @@ max_operand_vec (rtx insn, int arg) | ||
20150 | } | ||
20151 | |||
20152 | static void | ||
20153 | +gen_vararg_prologue(int operands) | ||
20154 | +{ | ||
20155 | + int i; | ||
20156 | + | ||
20157 | + if (operands > 1) | ||
20158 | + { | ||
20159 | + for (i = 1; i < operands; i++) | ||
20160 | + printf(" rtx operand%d ATTRIBUTE_UNUSED;\n", i); | ||
20161 | + | ||
20162 | + printf(" va_list args;\n\n"); | ||
20163 | + printf(" va_start(args, operand0);\n"); | ||
20164 | + for (i = 1; i < operands; i++) | ||
20165 | + printf(" operand%d = va_arg(args, rtx);\n", i); | ||
20166 | + printf(" va_end(args);\n\n"); | ||
20167 | + } | ||
20168 | +} | ||
20169 | + | ||
20170 | +static void | ||
20171 | print_code (RTX_CODE code) | ||
20172 | { | ||
20173 | const char *p1; | ||
20174 | @@ -406,18 +424,16 @@ gen_insn (rtx insn, int lineno) | ||
20175 | fatal ("match_dup operand number has no match_operand"); | ||
20176 | |||
20177 | /* Output the function name and argument declarations. */ | ||
20178 | - printf ("rtx\ngen_%s (", XSTR (insn, 0)); | ||
20179 | + printf ("rtx\ngen_%s ", XSTR (insn, 0)); | ||
20180 | + | ||
20181 | if (operands) | ||
20182 | - for (i = 0; i < operands; i++) | ||
20183 | - if (i) | ||
20184 | - printf (",\n\trtx operand%d ATTRIBUTE_UNUSED", i); | ||
20185 | + printf("(rtx operand0 ATTRIBUTE_UNUSED, ...)\n"); | ||
20186 | else | ||
20187 | - printf ("rtx operand%d ATTRIBUTE_UNUSED", i); | ||
20188 | - else | ||
20189 | - printf ("void"); | ||
20190 | - printf (")\n"); | ||
20191 | + printf("(void)\n"); | ||
20192 | printf ("{\n"); | ||
20193 | |||
20194 | + gen_vararg_prologue(operands); | ||
20195 | + | ||
20196 | /* Output code to construct and return the rtl for the instruction body. */ | ||
20197 | |||
20198 | if (XVECLEN (insn, 1) == 1) | ||
20199 | @@ -457,16 +473,12 @@ gen_expand (rtx expand) | ||
20200 | operands = max_operand_vec (expand, 1); | ||
20201 | |||
20202 | /* Output the function name and argument declarations. */ | ||
20203 | - printf ("rtx\ngen_%s (", XSTR (expand, 0)); | ||
20204 | + printf ("rtx\ngen_%s ", XSTR (expand, 0)); | ||
20205 | if (operands) | ||
20206 | - for (i = 0; i < operands; i++) | ||
20207 | - if (i) | ||
20208 | - printf (",\n\trtx operand%d", i); | ||
20209 | - else | ||
20210 | - printf ("rtx operand%d", i); | ||
20211 | + printf("(rtx operand0 ATTRIBUTE_UNUSED, ...)\n"); | ||
20212 | else | ||
20213 | - printf ("void"); | ||
20214 | - printf (")\n"); | ||
20215 | + printf("(void)\n"); | ||
20216 | + | ||
20217 | printf ("{\n"); | ||
20218 | |||
20219 | /* If we don't have any C code to write, only one insn is being written, | ||
20220 | @@ -476,6 +488,8 @@ gen_expand (rtx expand) | ||
20221 | && operands > max_dup_opno | ||
20222 | && XVECLEN (expand, 1) == 1) | ||
20223 | { | ||
20224 | + gen_vararg_prologue(operands); | ||
20225 | + | ||
20226 | printf (" return "); | ||
20227 | gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND, NULL); | ||
20228 | printf (";\n}\n\n"); | ||
20229 | @@ -489,6 +503,7 @@ gen_expand (rtx expand) | ||
20230 | for (; i <= max_scratch_opno; i++) | ||
20231 | printf (" rtx operand%d ATTRIBUTE_UNUSED;\n", i); | ||
20232 | printf (" rtx _val = 0;\n"); | ||
20233 | + gen_vararg_prologue(operands); | ||
20234 | printf (" start_sequence ();\n"); | ||
20235 | |||
20236 | /* The fourth operand of DEFINE_EXPAND is some code to be executed | ||
20237 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/genflags.c gcc-4.0.2-atmel.0.99.2/gcc/genflags.c | ||
20238 | --- gcc-4.0.2/gcc/genflags.c 2004-09-09 15:22:33.000000000 +0200 | ||
20239 | +++ gcc-4.0.2-atmel.0.99.2/gcc/genflags.c 2006-10-10 12:40:42.000000000 +0200 | ||
20240 | @@ -128,7 +128,6 @@ static void | ||
20241 | gen_proto (rtx insn) | ||
20242 | { | ||
20243 | int num = num_operands (insn); | ||
20244 | - int i; | ||
20245 | const char *name = XSTR (insn, 0); | ||
20246 | int truth = maybe_eval_c_test (XSTR (insn, 2)); | ||
20247 | |||
20248 | @@ -159,12 +158,7 @@ gen_proto (rtx insn) | ||
20249 | if (num == 0) | ||
20250 | fputs ("void", stdout); | ||
20251 | else | ||
20252 | - { | ||
20253 | - for (i = 1; i < num; i++) | ||
20254 | - fputs ("rtx, ", stdout); | ||
20255 | - | ||
20256 | - fputs ("rtx", stdout); | ||
20257 | - } | ||
20258 | + fputs("rtx, ...", stdout); | ||
20259 | |||
20260 | puts (");"); | ||
20261 | |||
20262 | @@ -174,12 +168,7 @@ gen_proto (rtx insn) | ||
20263 | { | ||
20264 | printf ("static inline rtx\ngen_%s", name); | ||
20265 | if (num > 0) | ||
20266 | - { | ||
20267 | - putchar ('('); | ||
20268 | - for (i = 0; i < num-1; i++) | ||
20269 | - printf ("rtx ARG_UNUSED (%c), ", 'a' + i); | ||
20270 | - printf ("rtx ARG_UNUSED (%c))\n", 'a' + i); | ||
20271 | - } | ||
20272 | + puts("(rtx ARG_UNUSED(a), ...)"); | ||
20273 | else | ||
20274 | puts ("(void)"); | ||
20275 | puts ("{\n return 0;\n}"); | ||
20276 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/genoutput.c gcc-4.0.2-atmel.0.99.2/gcc/genoutput.c | ||
20277 | --- gcc-4.0.2/gcc/genoutput.c 2004-09-09 15:22:34.000000000 +0200 | ||
20278 | +++ gcc-4.0.2-atmel.0.99.2/gcc/genoutput.c 2006-03-23 13:26:49.000000000 +0100 | ||
20279 | @@ -383,7 +383,7 @@ output_insn_data (void) | ||
20280 | } | ||
20281 | |||
20282 | if (d->name && d->name[0] != '*') | ||
20283 | - printf (" (insn_gen_fn) gen_%s,\n", d->name); | ||
20284 | + printf (" gen_%s,\n", d->name); | ||
20285 | else | ||
20286 | printf (" 0,\n"); | ||
20287 | |||
20288 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/longlong.h gcc-4.0.2-atmel.0.99.2/gcc/longlong.h | ||
20289 | --- gcc-4.0.2/gcc/longlong.h 2004-06-15 12:40:44.000000000 +0200 | ||
20290 | +++ gcc-4.0.2-atmel.0.99.2/gcc/longlong.h 2005-06-07 14:59:22.000000000 +0200 | ||
20291 | @@ -227,6 +227,39 @@ UDItype __umulsidi3 (USItype, USItype); | ||
20292 | #define UDIV_TIME 100 | ||
20293 | #endif /* __arm__ */ | ||
20294 | |||
20295 | +#if defined (__avr32__) && W_TYPE_SIZE == 32 | ||
20296 | +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
20297 | + __asm__ ("add\t%1, %4, %5\n\tadc\t%0, %2, %3" \ | ||
20298 | + : "=r" ((USItype) (sh)), \ | ||
20299 | + "=&r" ((USItype) (sl)) \ | ||
20300 | + : "r" ((USItype) (ah)), \ | ||
20301 | + "r" ((USItype) (bh)), \ | ||
20302 | + "r" ((USItype) (al)), \ | ||
20303 | + "r" ((USItype) (bl)) __CLOBBER_CC) | ||
20304 | +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ | ||
20305 | + __asm__ ("sub\t%1, %4, %5\n\tsbc\t%0, %2, %3" \ | ||
20306 | + : "=r" ((USItype) (sh)), \ | ||
20307 | + "=&r" ((USItype) (sl)) \ | ||
20308 | + : "r" ((USItype) (ah)), \ | ||
20309 | + "r" ((USItype) (bh)), \ | ||
20310 | + "r" ((USItype) (al)), \ | ||
20311 | + "r" ((USItype) (bl)) __CLOBBER_CC) | ||
20312 | + | ||
20313 | +#define __umulsidi3(a,b) ((UDItype)(a) * (UDItype)(b)) | ||
20314 | + | ||
20315 | +#define umul_ppmm(w1, w0, u, v) \ | ||
20316 | +{ \ | ||
20317 | + DWunion __w; \ | ||
20318 | + __w.ll = __umulsidi3 (u, v); \ | ||
20319 | + w1 = __w.s.high; \ | ||
20320 | + w0 = __w.s.low; \ | ||
20321 | +} | ||
20322 | + | ||
20323 | +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) | ||
20324 | +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctz (X)) | ||
20325 | +#define COUNT_LEADING_ZEROS_0 32 | ||
20326 | +#endif | ||
20327 | + | ||
20328 | #if defined (__hppa) && W_TYPE_SIZE == 32 | ||
20329 | #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ | ||
20330 | __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \ | ||
20331 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/optabs.h gcc-4.0.2-atmel.0.99.2/gcc/optabs.h | ||
20332 | --- gcc-4.0.2/gcc/optabs.h 2005-02-12 12:34:21.000000000 +0100 | ||
20333 | +++ gcc-4.0.2-atmel.0.99.2/gcc/optabs.h 2006-10-10 12:40:42.000000000 +0200 | ||
20334 | @@ -389,7 +389,7 @@ extern enum insn_code reload_out_optab[N | ||
20335 | extern GTY(()) optab code_to_optab[NUM_RTX_CODE + 1]; | ||
20336 | |||
20337 | |||
20338 | -typedef rtx (*rtxfun) (rtx); | ||
20339 | +typedef rtx (*rtxfun) (rtx, ...); | ||
20340 | |||
20341 | /* Indexed by the rtx-code for a conditional (e.g. EQ, LT,...) | ||
20342 | gives the gen_function to make a branch to test that condition. */ | ||
20343 | Binary files gcc-4.0.2/gcc/po/be.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/be.gmo differ | ||
20344 | Binary files gcc-4.0.2/gcc/po/ca.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/ca.gmo differ | ||
20345 | Binary files gcc-4.0.2/gcc/po/da.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/da.gmo differ | ||
20346 | Binary files gcc-4.0.2/gcc/po/de.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/de.gmo differ | ||
20347 | Binary files gcc-4.0.2/gcc/po/el.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/el.gmo differ | ||
20348 | Binary files gcc-4.0.2/gcc/po/es.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/es.gmo differ | ||
20349 | Binary files gcc-4.0.2/gcc/po/fr.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/fr.gmo differ | ||
20350 | Binary files gcc-4.0.2/gcc/po/ja.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/ja.gmo differ | ||
20351 | Binary files gcc-4.0.2/gcc/po/nl.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/nl.gmo differ | ||
20352 | Binary files gcc-4.0.2/gcc/po/sv.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/sv.gmo differ | ||
20353 | Binary files gcc-4.0.2/gcc/po/tr.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/tr.gmo differ | ||
20354 | Binary files gcc-4.0.2/gcc/po/zh_CN.gmo and gcc-4.0.2-atmel.0.99.2/gcc/po/zh_CN.gmo differ | ||
20355 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/testsuite/gcc.dg/cpp/mac-eol-at-eof.c gcc-4.0.2-atmel.0.99.2/gcc/testsuite/gcc.dg/cpp/mac-eol-at-eof.c | ||
20356 | --- gcc-4.0.2/gcc/testsuite/gcc.dg/cpp/mac-eol-at-eof.c 2005-02-19 20:48:02.000000000 +0100 | ||
20357 | +++ gcc-4.0.2-atmel.0.99.2/gcc/testsuite/gcc.dg/cpp/mac-eol-at-eof.c 2005-06-07 14:06:28.000000000 +0200 | ||
20358 | @@ -1 +1,3 @@ | ||
20359 | -/* Test no newline at eof warning when Mac line ending is used*/ /* { dg-do compile } */ int main() { return 0; } | ||
20360 | \ No newline at end of file | ||
20361 | +/* Test no newline at eof warning when Mac line ending is used*/ | ||
20362 | +/* { dg-do compile } */ | ||
20363 | +int main() { return 0; } | ||
20364 | diff -Nrup --ignore-space-change gcc-4.0.2/gcc/tree-ssa-operands.c gcc-4.0.2-atmel.0.99.2/gcc/tree-ssa-operands.c | ||
20365 | --- gcc-4.0.2/gcc/tree-ssa-operands.c 2005-06-24 15:23:42.000000000 +0200 | ||
20366 | +++ gcc-4.0.2-atmel.0.99.2/gcc/tree-ssa-operands.c 2005-07-15 16:06:29.000000000 +0200 | ||
20367 | @@ -1135,7 +1135,7 @@ get_expr_operands (tree stmt, tree *expr | ||
20368 | |||
20369 | if (code == COMPONENT_REF) | ||
20370 | { | ||
20371 | - if (s_ann && TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1))) | ||
20372 | + if (TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1))) | ||
20373 | s_ann->has_volatile_ops = true; | ||
20374 | get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none); | ||
20375 | } | ||
20376 | diff -Nrup --ignore-space-change gcc-4.0.2/libcpp/po/sv.po gcc-4.0.2-atmel.0.99.2/libcpp/po/sv.po | ||
20377 | --- gcc-4.0.2/libcpp/po/sv.po 2005-09-04 14:30:22.000000000 +0200 | ||
20378 | +++ gcc-4.0.2-atmel.0.99.2/libcpp/po/sv.po 2006-01-20 10:54:31.000000000 +0100 | ||
20379 | @@ -2,7 +2,7 @@ | ||
20380 | # Copyright © 2000, 2005 Free Software Foundation, Inc. | ||
20381 | # Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002. | ||
20382 | # Göran Uddeborg <goeran@uddeborg.se>, 2005. | ||
20383 | -# $Revision: 1.2 $ | ||
20384 | +# $Revision: 3550 $ | ||
20385 | # | ||
20386 | msgid "" | ||
20387 | msgstr "" | ||
20388 | Binary files gcc-4.0.2/libcpp/po/tr.gmo and gcc-4.0.2-atmel.0.99.2/libcpp/po/tr.gmo differ | ||
20389 | Binary files gcc-4.0.2/libcpp/po/vi.gmo and gcc-4.0.2-atmel.0.99.2/libcpp/po/vi.gmo differ | ||
20390 | diff -Nrup --ignore-space-change gcc-4.0.2/libffi/src/frv/eabi.S gcc-4.0.2-atmel.0.99.2/libffi/src/frv/eabi.S | ||
20391 | --- gcc-4.0.2/libffi/src/frv/eabi.S 2004-08-30 17:43:03.000000000 +0200 | ||
20392 | +++ gcc-4.0.2-atmel.0.99.2/libffi/src/frv/eabi.S 2005-07-15 16:26:03.000000000 +0200 | ||
20393 | @@ -3,7 +3,7 @@ | ||
20394 | |||
20395 | FR-V Assembly glue. | ||
20396 | |||
20397 | - $Id: sysv.S,v 1.1.1.1 1998/11/29 16:48:16 green Exp $ | ||
20398 | + $Id: eabi.S 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20399 | |||
20400 | Permission is hereby granted, free of charge, to any person obtaining | ||
20401 | a copy of this software and associated documentation files (the | ||
20402 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/AttributeList.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/AttributeList.java | ||
20403 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/AttributeList.java 2005-02-02 01:41:51.000000000 +0100 | ||
20404 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/AttributeList.java 2005-07-15 16:26:03.000000000 +0200 | ||
20405 | @@ -1,7 +1,7 @@ | ||
20406 | // SAX Attribute List Interface. | ||
20407 | // http://www.saxproject.org | ||
20408 | // No warranty; no copyright -- use this as you will. | ||
20409 | -// $Id: AttributeList.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20410 | +// $Id: AttributeList.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20411 | |||
20412 | package org.xml.sax; | ||
20413 | |||
20414 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/Attributes.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Attributes.java | ||
20415 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/Attributes.java 2005-02-02 01:41:51.000000000 +0100 | ||
20416 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Attributes.java 2005-07-15 16:26:03.000000000 +0200 | ||
20417 | @@ -2,7 +2,7 @@ | ||
20418 | // http://www.saxproject.org | ||
20419 | // Written by David Megginson | ||
20420 | // NO WARRANTY! This class is in the public domain. | ||
20421 | -// $Id: Attributes.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20422 | +// $Id: Attributes.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20423 | |||
20424 | package org.xml.sax; | ||
20425 | |||
20426 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ContentHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ContentHandler.java | ||
20427 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ContentHandler.java 2005-02-02 01:41:51.000000000 +0100 | ||
20428 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ContentHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20429 | @@ -2,7 +2,7 @@ | ||
20430 | // http://www.saxproject.org | ||
20431 | // Written by David Megginson | ||
20432 | // NO WARRANTY! This class is in the public domain. | ||
20433 | -// $Id: ContentHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20434 | +// $Id: ContentHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20435 | |||
20436 | package org.xml.sax; | ||
20437 | |||
20438 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/DocumentHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/DocumentHandler.java | ||
20439 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/DocumentHandler.java 2005-02-02 01:41:51.000000000 +0100 | ||
20440 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/DocumentHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20441 | @@ -1,7 +1,7 @@ | ||
20442 | // SAX document handler. | ||
20443 | // http://www.saxproject.org | ||
20444 | // No warranty; no copyright -- use this as you will. | ||
20445 | -// $Id: DocumentHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20446 | +// $Id: DocumentHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20447 | |||
20448 | package org.xml.sax; | ||
20449 | |||
20450 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/DTDHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/DTDHandler.java | ||
20451 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/DTDHandler.java 2005-02-02 01:41:51.000000000 +0100 | ||
20452 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/DTDHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20453 | @@ -1,7 +1,7 @@ | ||
20454 | // SAX DTD handler. | ||
20455 | // http://www.saxproject.org | ||
20456 | // No warranty; no copyright -- use this as you will. | ||
20457 | -// $Id: DTDHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20458 | +// $Id: DTDHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20459 | |||
20460 | package org.xml.sax; | ||
20461 | |||
20462 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/EntityResolver.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/EntityResolver.java | ||
20463 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/EntityResolver.java 2005-02-02 01:41:51.000000000 +0100 | ||
20464 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/EntityResolver.java 2005-07-15 16:26:03.000000000 +0200 | ||
20465 | @@ -1,7 +1,7 @@ | ||
20466 | // SAX entity resolver. | ||
20467 | // http://www.saxproject.org | ||
20468 | // No warranty; no copyright -- use this as you will. | ||
20469 | -// $Id: EntityResolver.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20470 | +// $Id: EntityResolver.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20471 | |||
20472 | package org.xml.sax; | ||
20473 | |||
20474 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ErrorHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ErrorHandler.java | ||
20475 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ErrorHandler.java 2005-02-02 01:41:51.000000000 +0100 | ||
20476 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ErrorHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20477 | @@ -1,7 +1,7 @@ | ||
20478 | // SAX error handler. | ||
20479 | // http://www.saxproject.org | ||
20480 | // No warranty; no copyright -- use this as you will. | ||
20481 | -// $Id: ErrorHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20482 | +// $Id: ErrorHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20483 | |||
20484 | package org.xml.sax; | ||
20485 | |||
20486 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Attributes2Impl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Attributes2Impl.java | ||
20487 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Attributes2Impl.java 2005-02-02 01:41:52.000000000 +0100 | ||
20488 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Attributes2Impl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20489 | @@ -1,7 +1,7 @@ | ||
20490 | // Attributes2Impl.java - extended AttributesImpl | ||
20491 | // http://www.saxproject.org | ||
20492 | // Public Domain: no warranty. | ||
20493 | -// $Id: Attributes2Impl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20494 | +// $Id: Attributes2Impl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20495 | |||
20496 | package org.xml.sax.ext; | ||
20497 | |||
20498 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Attributes2.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Attributes2.java | ||
20499 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Attributes2.java 2005-02-02 01:41:52.000000000 +0100 | ||
20500 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Attributes2.java 2005-07-15 16:26:03.000000000 +0200 | ||
20501 | @@ -1,7 +1,7 @@ | ||
20502 | // Attributes2.java - extended Attributes | ||
20503 | // http://www.saxproject.org | ||
20504 | // Public Domain: no warranty. | ||
20505 | -// $Id: Attributes2.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20506 | +// $Id: Attributes2.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20507 | |||
20508 | package org.xml.sax.ext; | ||
20509 | |||
20510 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/DeclHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/DeclHandler.java | ||
20511 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/DeclHandler.java 2005-02-02 01:41:52.000000000 +0100 | ||
20512 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/DeclHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20513 | @@ -1,7 +1,7 @@ | ||
20514 | // DeclHandler.java - Optional handler for DTD declaration events. | ||
20515 | // http://www.saxproject.org | ||
20516 | // Public Domain: no warranty. | ||
20517 | -// $Id: DeclHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20518 | +// $Id: DeclHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20519 | |||
20520 | package org.xml.sax.ext; | ||
20521 | |||
20522 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/DefaultHandler2.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/DefaultHandler2.java | ||
20523 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/DefaultHandler2.java 2005-02-02 01:41:52.000000000 +0100 | ||
20524 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/DefaultHandler2.java 2005-07-15 16:26:03.000000000 +0200 | ||
20525 | @@ -1,7 +1,7 @@ | ||
20526 | // DefaultHandler2.java - extended DefaultHandler | ||
20527 | // http://www.saxproject.org | ||
20528 | // Public Domain: no warranty. | ||
20529 | -// $Id: DefaultHandler2.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20530 | +// $Id: DefaultHandler2.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20531 | |||
20532 | package org.xml.sax.ext; | ||
20533 | |||
20534 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/EntityResolver2.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/EntityResolver2.java | ||
20535 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/EntityResolver2.java 2005-02-02 01:41:52.000000000 +0100 | ||
20536 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/EntityResolver2.java 2005-07-15 16:26:03.000000000 +0200 | ||
20537 | @@ -1,7 +1,7 @@ | ||
20538 | // EntityResolver2.java - Extended SAX entity resolver. | ||
20539 | // http://www.saxproject.org | ||
20540 | // No warranty; no copyright -- use this as you will. | ||
20541 | -// $Id: EntityResolver2.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20542 | +// $Id: EntityResolver2.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20543 | |||
20544 | package org.xml.sax.ext; | ||
20545 | |||
20546 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/LexicalHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/LexicalHandler.java | ||
20547 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/LexicalHandler.java 2005-02-02 01:41:52.000000000 +0100 | ||
20548 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/LexicalHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20549 | @@ -1,7 +1,7 @@ | ||
20550 | // LexicalHandler.java - optional handler for lexical parse events. | ||
20551 | // http://www.saxproject.org | ||
20552 | // Public Domain: no warranty. | ||
20553 | -// $Id: LexicalHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20554 | +// $Id: LexicalHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20555 | |||
20556 | package org.xml.sax.ext; | ||
20557 | |||
20558 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Locator2Impl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Locator2Impl.java | ||
20559 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Locator2Impl.java 2005-02-02 01:41:52.000000000 +0100 | ||
20560 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Locator2Impl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20561 | @@ -1,7 +1,7 @@ | ||
20562 | // Locator2Impl.java - extended LocatorImpl | ||
20563 | // http://www.saxproject.org | ||
20564 | // Public Domain: no warranty. | ||
20565 | -// $Id: Locator2Impl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20566 | +// $Id: Locator2Impl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20567 | |||
20568 | package org.xml.sax.ext; | ||
20569 | |||
20570 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Locator2.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Locator2.java | ||
20571 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/Locator2.java 2005-02-02 01:41:52.000000000 +0100 | ||
20572 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/Locator2.java 2005-07-15 16:26:03.000000000 +0200 | ||
20573 | @@ -1,7 +1,7 @@ | ||
20574 | // Locator2.java - extended Locator | ||
20575 | // http://www.saxproject.org | ||
20576 | // Public Domain: no warranty. | ||
20577 | -// $Id: Locator2.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20578 | +// $Id: Locator2.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20579 | |||
20580 | package org.xml.sax.ext; | ||
20581 | |||
20582 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/package.html gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/package.html | ||
20583 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/ext/package.html 2005-02-02 01:41:52.000000000 +0100 | ||
20584 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/ext/package.html 2005-07-15 16:26:03.000000000 +0200 | ||
20585 | @@ -1,5 +1,5 @@ | ||
20586 | <HTML><HEAD> | ||
20587 | -<!-- $Id: package.html,v 1.1 2004/12/23 22:38:42 mark Exp $ --> | ||
20588 | +<!-- $Id: package.html 3484 2005-07-15 14:26:03Z rpedersen $ --> | ||
20589 | </HEAD><BODY> | ||
20590 | |||
20591 | <p> | ||
20592 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/HandlerBase.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/HandlerBase.java | ||
20593 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/HandlerBase.java 2005-02-02 01:41:51.000000000 +0100 | ||
20594 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/HandlerBase.java 2005-07-15 16:26:03.000000000 +0200 | ||
20595 | @@ -1,7 +1,7 @@ | ||
20596 | // SAX default handler base class. | ||
20597 | // http://www.saxproject.org | ||
20598 | // No warranty; no copyright -- use this as you will. | ||
20599 | -// $Id: HandlerBase.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20600 | +// $Id: HandlerBase.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20601 | |||
20602 | package org.xml.sax; | ||
20603 | |||
20604 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/AttributeListImpl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/AttributeListImpl.java | ||
20605 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/AttributeListImpl.java 2005-02-02 01:41:53.000000000 +0100 | ||
20606 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/AttributeListImpl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20607 | @@ -1,7 +1,7 @@ | ||
20608 | // SAX default implementation for AttributeList. | ||
20609 | // http://www.saxproject.org | ||
20610 | // No warranty; no copyright -- use this as you will. | ||
20611 | -// $Id: AttributeListImpl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20612 | +// $Id: AttributeListImpl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20613 | |||
20614 | package org.xml.sax.helpers; | ||
20615 | |||
20616 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/AttributesImpl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/AttributesImpl.java | ||
20617 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/AttributesImpl.java 2005-02-02 01:41:54.000000000 +0100 | ||
20618 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/AttributesImpl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20619 | @@ -2,7 +2,7 @@ | ||
20620 | // http://www.saxproject.org | ||
20621 | // Written by David Megginson | ||
20622 | // NO WARRANTY! This class is in the public domain. | ||
20623 | -// $Id: AttributesImpl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20624 | +// $Id: AttributesImpl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20625 | |||
20626 | package org.xml.sax.helpers; | ||
20627 | |||
20628 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/DefaultHandler.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/DefaultHandler.java | ||
20629 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/DefaultHandler.java 2005-02-02 01:41:54.000000000 +0100 | ||
20630 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/DefaultHandler.java 2005-07-15 16:26:03.000000000 +0200 | ||
20631 | @@ -2,7 +2,7 @@ | ||
20632 | // http://www.saxproject.org | ||
20633 | // Written by David Megginson | ||
20634 | // NO WARRANTY! This class is in the public domain. | ||
20635 | -// $Id: DefaultHandler.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20636 | +// $Id: DefaultHandler.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20637 | |||
20638 | package org.xml.sax.helpers; | ||
20639 | |||
20640 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/LocatorImpl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/LocatorImpl.java | ||
20641 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/LocatorImpl.java 2005-02-02 01:41:54.000000000 +0100 | ||
20642 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/LocatorImpl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20643 | @@ -1,7 +1,7 @@ | ||
20644 | // SAX default implementation for Locator. | ||
20645 | // http://www.saxproject.org | ||
20646 | // No warranty; no copyright -- use this as you will. | ||
20647 | -// $Id: LocatorImpl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20648 | +// $Id: LocatorImpl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20649 | |||
20650 | package org.xml.sax.helpers; | ||
20651 | |||
20652 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/NamespaceSupport.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/NamespaceSupport.java | ||
20653 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/NamespaceSupport.java 2005-04-06 23:38:28.000000000 +0200 | ||
20654 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/NamespaceSupport.java 2005-06-07 14:06:28.000000000 +0200 | ||
20655 | @@ -2,7 +2,7 @@ | ||
20656 | // http://www.saxproject.org | ||
20657 | // Written by David Megginson | ||
20658 | // This class is in the Public Domain. NO WARRANTY! | ||
20659 | -// $Id: NamespaceSupport.java,v 1.2 2005/03/24 00:04:07 tromey Exp $ | ||
20660 | +// $Id: NamespaceSupport.java 3462 2005-06-07 12:06:28Z rpedersen $ | ||
20661 | |||
20662 | package org.xml.sax.helpers; | ||
20663 | |||
20664 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/NewInstance.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/NewInstance.java | ||
20665 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/NewInstance.java 2005-02-02 01:41:54.000000000 +0100 | ||
20666 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/NewInstance.java 2005-07-15 16:26:03.000000000 +0200 | ||
20667 | @@ -3,7 +3,7 @@ | ||
20668 | // Written by Edwin Goei, edwingo@apache.org | ||
20669 | // and by David Brownell, dbrownell@users.sourceforge.net | ||
20670 | // NO WARRANTY! This class is in the Public Domain. | ||
20671 | -// $Id: NewInstance.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20672 | +// $Id: NewInstance.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20673 | |||
20674 | package org.xml.sax.helpers; | ||
20675 | |||
20676 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/package.html gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/package.html | ||
20677 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/package.html 2005-02-02 01:41:54.000000000 +0100 | ||
20678 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/package.html 2005-07-15 16:26:03.000000000 +0200 | ||
20679 | @@ -1,5 +1,5 @@ | ||
20680 | <HTML><HEAD> | ||
20681 | -<!-- $Id: package.html,v 1.1 2004/12/23 22:38:42 mark Exp $ --> | ||
20682 | +<!-- $Id: package.html 3484 2005-07-15 14:26:03Z rpedersen $ --> | ||
20683 | </HEAD><BODY> | ||
20684 | |||
20685 | <p>This package contains "helper" classes, including | ||
20686 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/ParserAdapter.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/ParserAdapter.java | ||
20687 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/ParserAdapter.java 2005-02-02 01:41:54.000000000 +0100 | ||
20688 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/ParserAdapter.java 2005-07-15 16:26:03.000000000 +0200 | ||
20689 | @@ -2,7 +2,7 @@ | ||
20690 | // http://www.saxproject.org | ||
20691 | // Written by David Megginson | ||
20692 | // NO WARRANTY! This class is in the public domain. | ||
20693 | -// $Id: ParserAdapter.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20694 | +// $Id: ParserAdapter.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20695 | |||
20696 | package org.xml.sax.helpers; | ||
20697 | |||
20698 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/ParserFactory.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/ParserFactory.java | ||
20699 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/ParserFactory.java 2005-02-02 01:41:54.000000000 +0100 | ||
20700 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/ParserFactory.java 2005-07-15 16:26:03.000000000 +0200 | ||
20701 | @@ -1,7 +1,7 @@ | ||
20702 | // SAX parser factory. | ||
20703 | // http://www.saxproject.org | ||
20704 | // No warranty; no copyright -- use this as you will. | ||
20705 | -// $Id: ParserFactory.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20706 | +// $Id: ParserFactory.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20707 | |||
20708 | package org.xml.sax.helpers; | ||
20709 | |||
20710 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLFilterImpl.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLFilterImpl.java | ||
20711 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLFilterImpl.java 2005-02-02 01:41:54.000000000 +0100 | ||
20712 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLFilterImpl.java 2005-07-15 16:26:03.000000000 +0200 | ||
20713 | @@ -2,7 +2,7 @@ | ||
20714 | // http://www.saxproject.org | ||
20715 | // Written by David Megginson | ||
20716 | // NO WARRANTY! This class is in the Public Domain. | ||
20717 | -// $Id: XMLFilterImpl.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20718 | +// $Id: XMLFilterImpl.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20719 | |||
20720 | package org.xml.sax.helpers; | ||
20721 | |||
20722 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderAdapter.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderAdapter.java | ||
20723 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderAdapter.java 2005-02-02 01:41:54.000000000 +0100 | ||
20724 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderAdapter.java 2005-07-15 16:26:03.000000000 +0200 | ||
20725 | @@ -2,7 +2,7 @@ | ||
20726 | // http://www.saxproject.org | ||
20727 | // Written by David Megginson | ||
20728 | // NO WARRANTY! This class is in the public domain. | ||
20729 | -// $Id: XMLReaderAdapter.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20730 | +// $Id: XMLReaderAdapter.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20731 | |||
20732 | package org.xml.sax.helpers; | ||
20733 | |||
20734 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderFactory.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderFactory.java | ||
20735 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderFactory.java 2005-02-02 01:41:54.000000000 +0100 | ||
20736 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/helpers/XMLReaderFactory.java 2005-07-15 16:26:03.000000000 +0200 | ||
20737 | @@ -3,7 +3,7 @@ | ||
20738 | // Written by David Megginson | ||
20739 | // and by David Brownell | ||
20740 | // NO WARRANTY! This class is in the Public Domain. | ||
20741 | -// $Id: XMLReaderFactory.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20742 | +// $Id: XMLReaderFactory.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20743 | |||
20744 | package org.xml.sax.helpers; | ||
20745 | import java.io.BufferedReader; | ||
20746 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/InputSource.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/InputSource.java | ||
20747 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/InputSource.java 2005-02-02 01:41:51.000000000 +0100 | ||
20748 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/InputSource.java 2005-07-15 16:26:03.000000000 +0200 | ||
20749 | @@ -1,7 +1,7 @@ | ||
20750 | // SAX input source. | ||
20751 | // http://www.saxproject.org | ||
20752 | // No warranty; no copyright -- use this as you will. | ||
20753 | -// $Id: InputSource.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20754 | +// $Id: InputSource.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20755 | |||
20756 | package org.xml.sax; | ||
20757 | |||
20758 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/Locator.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Locator.java | ||
20759 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/Locator.java 2005-02-02 01:41:51.000000000 +0100 | ||
20760 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Locator.java 2005-07-15 16:26:03.000000000 +0200 | ||
20761 | @@ -1,7 +1,7 @@ | ||
20762 | // SAX locator interface for document events. | ||
20763 | // http://www.saxproject.org | ||
20764 | // No warranty; no copyright -- use this as you will. | ||
20765 | -// $Id: Locator.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20766 | +// $Id: Locator.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20767 | |||
20768 | package org.xml.sax; | ||
20769 | |||
20770 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/package.html gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/package.html | ||
20771 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/package.html 2005-02-02 01:41:51.000000000 +0100 | ||
20772 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/package.html 2005-07-15 16:26:03.000000000 +0200 | ||
20773 | @@ -1,5 +1,5 @@ | ||
20774 | <html><head> | ||
20775 | -<!-- $Id: package.html,v 1.1 2004/12/23 22:38:42 mark Exp $ --> | ||
20776 | +<!-- $Id: package.html 3484 2005-07-15 14:26:03Z rpedersen $ --> | ||
20777 | </head><body> | ||
20778 | |||
20779 | <p> This package provides the core SAX APIs. | ||
20780 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/Parser.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Parser.java | ||
20781 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/Parser.java 2005-02-02 01:41:51.000000000 +0100 | ||
20782 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/Parser.java 2005-07-15 16:26:03.000000000 +0200 | ||
20783 | @@ -1,7 +1,7 @@ | ||
20784 | // SAX parser interface. | ||
20785 | // http://www.saxproject.org | ||
20786 | // No warranty; no copyright -- use this as you will. | ||
20787 | -// $Id: Parser.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20788 | +// $Id: Parser.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20789 | |||
20790 | package org.xml.sax; | ||
20791 | |||
20792 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXException.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXException.java | ||
20793 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXException.java 2005-02-02 01:41:51.000000000 +0100 | ||
20794 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXException.java 2005-07-15 16:26:03.000000000 +0200 | ||
20795 | @@ -1,7 +1,7 @@ | ||
20796 | // SAX exception class. | ||
20797 | // http://www.saxproject.org | ||
20798 | // No warranty; no copyright -- use this as you will. | ||
20799 | -// $Id: SAXException.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20800 | +// $Id: SAXException.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20801 | |||
20802 | package org.xml.sax; | ||
20803 | |||
20804 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXNotRecognizedException.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXNotRecognizedException.java | ||
20805 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXNotRecognizedException.java 2005-02-02 01:41:51.000000000 +0100 | ||
20806 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXNotRecognizedException.java 2005-07-15 16:26:03.000000000 +0200 | ||
20807 | @@ -2,7 +2,7 @@ | ||
20808 | // http://www.saxproject.org | ||
20809 | // Written by David Megginson | ||
20810 | // NO WARRANTY! This class is in the Public Domain. | ||
20811 | -// $Id: SAXNotRecognizedException.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20812 | +// $Id: SAXNotRecognizedException.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20813 | |||
20814 | package org.xml.sax; | ||
20815 | |||
20816 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXNotSupportedException.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXNotSupportedException.java | ||
20817 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXNotSupportedException.java 2005-02-02 01:41:51.000000000 +0100 | ||
20818 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXNotSupportedException.java 2005-07-15 16:26:03.000000000 +0200 | ||
20819 | @@ -2,7 +2,7 @@ | ||
20820 | // http://www.saxproject.org | ||
20821 | // Written by David Megginson | ||
20822 | // NO WARRANTY! This class is in the Public Domain. | ||
20823 | -// $Id: SAXNotSupportedException.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20824 | +// $Id: SAXNotSupportedException.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20825 | |||
20826 | package org.xml.sax; | ||
20827 | |||
20828 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXParseException.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXParseException.java | ||
20829 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/SAXParseException.java 2005-02-02 01:41:51.000000000 +0100 | ||
20830 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/SAXParseException.java 2005-07-15 16:26:03.000000000 +0200 | ||
20831 | @@ -1,7 +1,7 @@ | ||
20832 | // SAX exception class. | ||
20833 | // http://www.saxproject.org | ||
20834 | // No warranty; no copyright -- use this as you will. | ||
20835 | -// $Id: SAXParseException.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20836 | +// $Id: SAXParseException.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20837 | |||
20838 | package org.xml.sax; | ||
20839 | |||
20840 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/XMLFilter.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/XMLFilter.java | ||
20841 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/XMLFilter.java 2005-02-02 01:41:51.000000000 +0100 | ||
20842 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/XMLFilter.java 2005-07-15 16:26:03.000000000 +0200 | ||
20843 | @@ -2,7 +2,7 @@ | ||
20844 | // http://www.saxproject.org | ||
20845 | // Written by David Megginson | ||
20846 | // NO WARRANTY! This class is in the Public Domain. | ||
20847 | -// $Id: XMLFilter.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20848 | +// $Id: XMLFilter.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20849 | |||
20850 | package org.xml.sax; | ||
20851 | |||
20852 | diff -Nrup --ignore-space-change gcc-4.0.2/libjava/external/sax/org/xml/sax/XMLReader.java gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/XMLReader.java | ||
20853 | --- gcc-4.0.2/libjava/external/sax/org/xml/sax/XMLReader.java 2005-02-02 01:41:51.000000000 +0100 | ||
20854 | +++ gcc-4.0.2-atmel.0.99.2/libjava/external/sax/org/xml/sax/XMLReader.java 2005-07-15 16:26:03.000000000 +0200 | ||
20855 | @@ -2,7 +2,7 @@ | ||
20856 | // http://www.saxproject.org | ||
20857 | // Written by David Megginson | ||
20858 | // NO WARRANTY! This class is in the Public Domain. | ||
20859 | -// $Id: XMLReader.java,v 1.1 2004/12/23 22:38:42 mark Exp $ | ||
20860 | +// $Id: XMLReader.java 3484 2005-07-15 14:26:03Z rpedersen $ | ||
20861 | |||
20862 | package org.xml.sax; | ||
20863 | |||
20864 | Binary files gcc-4.0.2/libjava/gnu/java/awt/doc-files/BitwiseXORComposite-1.png and gcc-4.0.2-atmel.0.99.2/libjava/gnu/java/awt/doc-files/BitwiseXORComposite-1.png differ | ||
20865 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/Area-1.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/Area-1.png differ | ||
20866 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/CubicCurve2D-1.png differ | ||
20867 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/CubicCurve2D-2.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/CubicCurve2D-2.png differ | ||
20868 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/CubicCurve2D-3.png differ | ||
20869 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/CubicCurve2D-4.png differ | ||
20870 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/CubicCurve2D-5.png differ | ||
20871 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/Ellipse-1.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/Ellipse-1.png differ | ||
20872 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/GeneralPath-1.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/GeneralPath-1.png differ | ||
20873 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/QuadCurve2D-1.png differ | ||
20874 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/QuadCurve2D-2.png differ | ||
20875 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/QuadCurve2D-3.png differ | ||
20876 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/QuadCurve2D-4.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/QuadCurve2D-4.png differ | ||
20877 | Binary files gcc-4.0.2/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png and gcc-4.0.2-atmel.0.99.2/libjava/java/awt/geom/doc-files/QuadCurve2D-5.png differ | ||
20878 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/BevelBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/BevelBorder-1.png differ | ||
20879 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/BevelBorder-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/BevelBorder-2.png differ | ||
20880 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/BevelBorder-3.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/BevelBorder-3.png differ | ||
20881 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/EmptyBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/EmptyBorder-1.png differ | ||
20882 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/EtchedBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/EtchedBorder-1.png differ | ||
20883 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/EtchedBorder-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/EtchedBorder-2.png differ | ||
20884 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/LineBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/LineBorder-1.png differ | ||
20885 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-1.png differ | ||
20886 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-2.png differ | ||
20887 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-3.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-3.png differ | ||
20888 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-4.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-4.png differ | ||
20889 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-5.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-5.png differ | ||
20890 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/MatteBorder-6.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/MatteBorder-6.png differ | ||
20891 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-1.png differ | ||
20892 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-2.png differ | ||
20893 | Binary files gcc-4.0.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-3.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/border/doc-files/SoftBevelBorder-3.png differ | ||
20894 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-1.png differ | ||
20895 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders-2.png differ | ||
20896 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.ButtonBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.ButtonBorder-1.png differ | ||
20897 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.FieldBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.FieldBorder-1.png differ | ||
20898 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.MarginBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.MarginBorder-1.png differ | ||
20899 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.MenuBarBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.MenuBarBorder-1.png differ | ||
20900 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.RadioButtonBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.RadioButtonBorder-1.png differ | ||
20901 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneBorder-1.png differ | ||
20902 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneBorder-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneBorder-2.png differ | ||
20903 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneDividerBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.SplitPaneDividerBorder-1.png differ | ||
20904 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.ToggleButtonBorder-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicBorders.ToggleButtonBorder-1.png differ | ||
20905 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-1.png differ | ||
20906 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-2.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-2.png differ | ||
20907 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-3.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-3.png differ | ||
20908 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-4.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-4.png differ | ||
20909 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-5.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-5.png differ | ||
20910 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-6.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-6.png differ | ||
20911 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-7.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/basic/doc-files/BasicGraphicsUtils-7.png differ | ||
20912 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/doc-files/ComponentUI-1.dia and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/doc-files/ComponentUI-1.dia differ | ||
20913 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/doc-files/ComponentUI-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/doc-files/ComponentUI-1.png differ | ||
20914 | Binary files gcc-4.0.2/libjava/javax/swing/plaf/doc-files/TreeUI-1.png and gcc-4.0.2-atmel.0.99.2/libjava/javax/swing/plaf/doc-files/TreeUI-1.png differ | ||
20915 | Binary files gcc-4.0.2/libjava/testsuite/libjava.jar/simple.jar and gcc-4.0.2-atmel.0.99.2/libjava/testsuite/libjava.jar/simple.jar differ | ||
20916 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/acinclude.m4 gcc-4.0.2-atmel.0.99.2/libstdc++-v3/acinclude.m4 | ||
20917 | --- gcc-4.0.2/libstdc++-v3/acinclude.m4 2005-06-23 11:23:59.000000000 +0200 | ||
20918 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/acinclude.m4 2006-03-28 10:54:09.000000000 +0200 | ||
20919 | @@ -139,6 +139,15 @@ AC_DEFUN([GLIBCXX_CONFIGURE], [ | ||
20920 | #enable_symvers=no | ||
20921 | #enable_hosted_libstdcxx=yes | ||
20922 | |||
20923 | + # Check for uClibc since Linux platforms use different configuration | ||
20924 | + # directories depending on the C library in use. | ||
20925 | + AC_EGREP_CPP([_using_uclibc], [ | ||
20926 | + #include <stdio.h> | ||
20927 | + #if __UCLIBC__ | ||
20928 | + _using_uclibc | ||
20929 | + #endif | ||
20930 | + ], uclibc=yes, uclibc=no) | ||
20931 | + | ||
20932 | # Find platform-specific directories containing configuration info. | ||
20933 | # Also possibly modify flags used elsewhere, as needed by the platform. | ||
20934 | GLIBCXX_CHECK_HOST | ||
20935 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/configure.host gcc-4.0.2-atmel.0.99.2/libstdc++-v3/configure.host | ||
20936 | --- gcc-4.0.2/libstdc++-v3/configure.host 2005-06-17 02:22:20.000000000 +0200 | ||
20937 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/configure.host 2006-03-28 10:54:09.000000000 +0200 | ||
20938 | @@ -193,8 +193,15 @@ case "${host_os}" in | ||
20939 | freebsd*) | ||
20940 | os_include_dir="os/bsd/freebsd" | ||
20941 | ;; | ||
20942 | + linux-uclibc*) | ||
20943 | + os_include_dir="os/uclibc-linux" | ||
20944 | + ;; | ||
20945 | gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu) | ||
20946 | + if [ "$uclibc" = "yes" ]; then | ||
20947 | + os_include_dir="os/uclibc" | ||
20948 | + else | ||
20949 | os_include_dir="os/gnu-linux" | ||
20950 | + fi | ||
20951 | ;; | ||
20952 | hpux*) | ||
20953 | os_include_dir="os/hpux" | ||
20954 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/crossconfig.m4 gcc-4.0.2-atmel.0.99.2/libstdc++-v3/crossconfig.m4 | ||
20955 | --- gcc-4.0.2/libstdc++-v3/crossconfig.m4 2005-02-01 07:56:19.000000000 +0100 | ||
20956 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/crossconfig.m4 2006-03-28 10:54:09.000000000 +0200 | ||
20957 | @@ -148,9 +148,13 @@ case "${host}" in | ||
20958 | fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) | ||
20959 | SECTION_FLAGS='-ffunction-sections -fdata-sections' | ||
20960 | AC_SUBST(SECTION_FLAGS) | ||
20961 | + GLIBCXX_CHECK_COMPILER_FEATURES | ||
20962 | GLIBCXX_CHECK_LINKER_FEATURES | ||
20963 | + GLIBCXX_CHECK_MATH_SUPPORT | ||
20964 | + GLIBCXX_CHECK_BUILTIN_MATH_SUPPORT | ||
20965 | GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT | ||
20966 | - GLIBCXX_CHECK_WCHAR_T_SUPPORT | ||
20967 | + GLIBCXX_CHECK_ICONV_SUPPORT | ||
20968 | + GLIBCXX_CHECK_STDLIB_SUPPORT | ||
20969 | |||
20970 | # For LFS. | ||
20971 | AC_DEFINE(HAVE_INT64_T) | ||
20972 | Binary files gcc-4.0.2/libstdc++-v3/docs/html/17_intro/confdeps.png and gcc-4.0.2-atmel.0.99.2/libstdc++-v3/docs/html/17_intro/confdeps.png differ | ||
20973 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/include/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/include/Makefile.in | ||
20974 | --- gcc-4.0.2/libstdc++-v3/include/Makefile.in 2005-06-22 22:39:09.000000000 +0200 | ||
20975 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/include/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
20976 | @@ -1,8 +1,8 @@ | ||
20977 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
20978 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
20979 | # @configure_input@ | ||
20980 | |||
20981 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
20982 | -# 2003, 2004 Free Software Foundation, Inc. | ||
20983 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
20984 | # This Makefile.in is free software; the Free Software Foundation | ||
20985 | # gives unlimited permission to copy and/or distribute it, | ||
20986 | # with or without modifications, as long as this notice is preserved. | ||
20987 | @@ -36,6 +36,7 @@ POST_UNINSTALL = : | ||
20988 | build_triplet = @build@ | ||
20989 | host_triplet = @host@ | ||
20990 | target_triplet = @target@ | ||
20991 | +LIBOBJDIR = | ||
20992 | DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ | ||
20993 | $(top_srcdir)/fragment.am | ||
20994 | subdir = include | ||
20995 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/libmath/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/libmath/Makefile.in | ||
20996 | --- gcc-4.0.2/libstdc++-v3/libmath/Makefile.in 2005-06-22 22:39:18.000000000 +0200 | ||
20997 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/libmath/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
20998 | @@ -1,8 +1,8 @@ | ||
20999 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21000 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21001 | # @configure_input@ | ||
21002 | |||
21003 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21004 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21005 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21006 | # This Makefile.in is free software; the Free Software Foundation | ||
21007 | # gives unlimited permission to copy and/or distribute it, | ||
21008 | # with or without modifications, as long as this notice is preserved. | ||
21009 | @@ -14,8 +14,6 @@ | ||
21010 | |||
21011 | @SET_MAKE@ | ||
21012 | |||
21013 | -SOURCES = $(libmath_la_SOURCES) | ||
21014 | - | ||
21015 | srcdir = @srcdir@ | ||
21016 | top_srcdir = @top_srcdir@ | ||
21017 | VPATH = @srcdir@ | ||
21018 | @@ -39,6 +37,7 @@ POST_UNINSTALL = : | ||
21019 | build_triplet = @build@ | ||
21020 | host_triplet = @host@ | ||
21021 | target_triplet = @target@ | ||
21022 | +LIBOBJDIR = | ||
21023 | subdir = libmath | ||
21024 | DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in | ||
21025 | ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 | ||
21026 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/libsupc++/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/libsupc++/Makefile.in | ||
21027 | --- gcc-4.0.2/libstdc++-v3/libsupc++/Makefile.in 2005-06-22 22:39:21.000000000 +0200 | ||
21028 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/libsupc++/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
21029 | @@ -1,8 +1,8 @@ | ||
21030 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21031 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21032 | # @configure_input@ | ||
21033 | |||
21034 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21035 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21036 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21037 | # This Makefile.in is free software; the Free Software Foundation | ||
21038 | # gives unlimited permission to copy and/or distribute it, | ||
21039 | # with or without modifications, as long as this notice is preserved. | ||
21040 | @@ -15,8 +15,6 @@ | ||
21041 | @SET_MAKE@ | ||
21042 | |||
21043 | |||
21044 | -SOURCES = $(libsupc___la_SOURCES) $(libsupc__convenience_la_SOURCES) | ||
21045 | - | ||
21046 | srcdir = @srcdir@ | ||
21047 | top_srcdir = @top_srcdir@ | ||
21048 | VPATH = @srcdir@ | ||
21049 | @@ -40,6 +38,7 @@ POST_UNINSTALL = : | ||
21050 | build_triplet = @build@ | ||
21051 | host_triplet = @host@ | ||
21052 | target_triplet = @target@ | ||
21053 | +LIBOBJDIR = | ||
21054 | DIST_COMMON = $(glibcxxinstall_HEADERS) $(srcdir)/Makefile.am \ | ||
21055 | $(srcdir)/Makefile.in $(top_srcdir)/fragment.am | ||
21056 | subdir = libsupc++ | ||
21057 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/Makefile.in | ||
21058 | --- gcc-4.0.2/libstdc++-v3/Makefile.in 2005-06-22 22:37:12.000000000 +0200 | ||
21059 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
21060 | @@ -1,8 +1,8 @@ | ||
21061 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21062 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21063 | # @configure_input@ | ||
21064 | |||
21065 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21066 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21067 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21068 | # This Makefile.in is free software; the Free Software Foundation | ||
21069 | # gives unlimited permission to copy and/or distribute it, | ||
21070 | # with or without modifications, as long as this notice is preserved. | ||
21071 | @@ -36,6 +36,7 @@ POST_UNINSTALL = : | ||
21072 | build_triplet = @build@ | ||
21073 | host_triplet = @host@ | ||
21074 | target_triplet = @target@ | ||
21075 | +LIBOBJDIR = | ||
21076 | DIST_COMMON = README $(am__configure_deps) $(srcdir)/../config.guess \ | ||
21077 | $(srcdir)/../config.sub $(srcdir)/../install-sh \ | ||
21078 | $(srcdir)/../ltmain.sh $(srcdir)/../missing \ | ||
21079 | @@ -408,7 +409,13 @@ uninstall-info-am: | ||
21080 | # (which will cause the Makefiles to be regenerated when you run `make'); | ||
21081 | # (2) otherwise, pass the desired values on the `make' command line. | ||
21082 | $(RECURSIVE_TARGETS): | ||
21083 | - @set fnord $$MAKEFLAGS; amf=$$2; \ | ||
21084 | + @failcom='exit 1'; \ | ||
21085 | + for f in x $$MAKEFLAGS; do \ | ||
21086 | + case $$f in \ | ||
21087 | + *=* | --[!k]*);; \ | ||
21088 | + *k*) failcom='fail=yes';; \ | ||
21089 | + esac; \ | ||
21090 | + done; \ | ||
21091 | dot_seen=no; \ | ||
21092 | target=`echo $@ | sed s/-recursive//`; \ | ||
21093 | list='$(SUBDIRS)'; for subdir in $$list; do \ | ||
21094 | @@ -420,7 +427,7 @@ $(RECURSIVE_TARGETS): | ||
21095 | local_target="$$target"; \ | ||
21096 | fi; \ | ||
21097 | (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ | ||
21098 | - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ | ||
21099 | + || eval $$failcom; \ | ||
21100 | done; \ | ||
21101 | if test "$$dot_seen" = "no"; then \ | ||
21102 | $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ | ||
21103 | @@ -428,7 +435,13 @@ $(RECURSIVE_TARGETS): | ||
21104 | |||
21105 | mostlyclean-recursive clean-recursive distclean-recursive \ | ||
21106 | maintainer-clean-recursive: | ||
21107 | - @set fnord $$MAKEFLAGS; amf=$$2; \ | ||
21108 | + @failcom='exit 1'; \ | ||
21109 | + for f in x $$MAKEFLAGS; do \ | ||
21110 | + case $$f in \ | ||
21111 | + *=* | --[!k]*);; \ | ||
21112 | + *k*) failcom='fail=yes';; \ | ||
21113 | + esac; \ | ||
21114 | + done; \ | ||
21115 | dot_seen=no; \ | ||
21116 | case "$@" in \ | ||
21117 | distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ | ||
21118 | @@ -449,7 +462,7 @@ maintainer-clean-recursive: | ||
21119 | local_target="$$target"; \ | ||
21120 | fi; \ | ||
21121 | (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ | ||
21122 | - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ | ||
21123 | + || eval $$failcom; \ | ||
21124 | done && test -z "$$fail" | ||
21125 | tags-recursive: | ||
21126 | list='$(SUBDIRS)'; for subdir in $$list; do \ | ||
21127 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/po/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/po/Makefile.in | ||
21128 | --- gcc-4.0.2/libstdc++-v3/po/Makefile.in 2005-06-22 22:39:24.000000000 +0200 | ||
21129 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/po/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
21130 | @@ -1,8 +1,8 @@ | ||
21131 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21132 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21133 | # @configure_input@ | ||
21134 | |||
21135 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21136 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21137 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21138 | # This Makefile.in is free software; the Free Software Foundation | ||
21139 | # gives unlimited permission to copy and/or distribute it, | ||
21140 | # with or without modifications, as long as this notice is preserved. | ||
21141 | @@ -36,6 +36,7 @@ POST_UNINSTALL = : | ||
21142 | build_triplet = @build@ | ||
21143 | host_triplet = @host@ | ||
21144 | target_triplet = @target@ | ||
21145 | +LIBOBJDIR = | ||
21146 | DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ | ||
21147 | $(top_srcdir)/fragment.am | ||
21148 | subdir = po | ||
21149 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/src/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/src/Makefile.in | ||
21150 | --- gcc-4.0.2/libstdc++-v3/src/Makefile.in 2005-06-22 22:39:26.000000000 +0200 | ||
21151 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/src/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
21152 | @@ -1,8 +1,8 @@ | ||
21153 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21154 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21155 | # @configure_input@ | ||
21156 | |||
21157 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21158 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21159 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21160 | # This Makefile.in is free software; the Free Software Foundation | ||
21161 | # gives unlimited permission to copy and/or distribute it, | ||
21162 | # with or without modifications, as long as this notice is preserved. | ||
21163 | @@ -14,8 +14,6 @@ | ||
21164 | |||
21165 | @SET_MAKE@ | ||
21166 | |||
21167 | -SOURCES = $(libstdc___la_SOURCES) | ||
21168 | - | ||
21169 | srcdir = @srcdir@ | ||
21170 | top_srcdir = @top_srcdir@ | ||
21171 | pkgdatadir = $(datadir)/@PACKAGE@ | ||
21172 | @@ -38,6 +36,7 @@ POST_UNINSTALL = : | ||
21173 | build_triplet = @build@ | ||
21174 | host_triplet = @host@ | ||
21175 | target_triplet = @target@ | ||
21176 | +LIBOBJDIR = | ||
21177 | DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ | ||
21178 | $(top_srcdir)/fragment.am | ||
21179 | subdir = src | ||
21180 | diff -Nrup --ignore-space-change gcc-4.0.2/libstdc++-v3/testsuite/Makefile.in gcc-4.0.2-atmel.0.99.2/libstdc++-v3/testsuite/Makefile.in | ||
21181 | --- gcc-4.0.2/libstdc++-v3/testsuite/Makefile.in 2005-06-22 22:39:30.000000000 +0200 | ||
21182 | +++ gcc-4.0.2-atmel.0.99.2/libstdc++-v3/testsuite/Makefile.in 2006-03-28 10:54:09.000000000 +0200 | ||
21183 | @@ -1,8 +1,8 @@ | ||
21184 | -# Makefile.in generated by automake 1.9.3 from Makefile.am. | ||
21185 | +# Makefile.in generated by automake 1.9.6 from Makefile.am. | ||
21186 | # @configure_input@ | ||
21187 | |||
21188 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||
21189 | -# 2003, 2004 Free Software Foundation, Inc. | ||
21190 | +# 2003, 2004, 2005 Free Software Foundation, Inc. | ||
21191 | # This Makefile.in is free software; the Free Software Foundation | ||
21192 | # gives unlimited permission to copy and/or distribute it, | ||
21193 | # with or without modifications, as long as this notice is preserved. | ||
21194 | @@ -14,8 +14,6 @@ | ||
21195 | |||
21196 | @SET_MAKE@ | ||
21197 | |||
21198 | -SOURCES = $(libv3test_a_SOURCES) | ||
21199 | - | ||
21200 | srcdir = @srcdir@ | ||
21201 | top_srcdir = @top_srcdir@ | ||
21202 | VPATH = @srcdir@ | ||
21203 | @@ -39,6 +37,7 @@ POST_UNINSTALL = : | ||
21204 | build_triplet = @build@ | ||
21205 | host_triplet = @host@ | ||
21206 | target_triplet = @target@ | ||
21207 | +LIBOBJDIR = | ||
21208 | DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ | ||
21209 | $(top_srcdir)/fragment.am | ||
21210 | subdir = testsuite | ||
21211 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/mtest.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/mtest.adb | ||
21212 | --- gcc-4.0.2/zlib/contrib/ada/mtest.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21213 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/mtest.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21214 | @@ -8,7 +8,7 @@ | ||
21215 | -- Continuous test for ZLib multithreading. If the test is fail | ||
21216 | -- Wou should provide thread safe allocation routines for the Z_Stream. | ||
21217 | -- | ||
21218 | --- $Id: mtest.adb,v 1.2 2003/08/12 12:11:05 vagul Exp $ | ||
21219 | +-- $Id: mtest.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21220 | |||
21221 | with ZLib; | ||
21222 | with Ada.Streams; | ||
21223 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/read.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/read.adb | ||
21224 | --- gcc-4.0.2/zlib/contrib/ada/read.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21225 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/read.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21226 | @@ -6,7 +6,7 @@ | ||
21227 | -- Open source license information is in the zlib.ads file. -- | ||
21228 | ---------------------------------------------------------------- | ||
21229 | |||
21230 | --- $Id: read.adb,v 1.7 2003/08/12 12:12:35 vagul Exp $ | ||
21231 | +-- $Id: read.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21232 | |||
21233 | -- Test/demo program for the generic read interface. | ||
21234 | |||
21235 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/test.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/test.adb | ||
21236 | --- gcc-4.0.2/zlib/contrib/ada/test.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21237 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/test.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21238 | @@ -6,7 +6,7 @@ | ||
21239 | -- Open source license information is in the zlib.ads file. -- | ||
21240 | ---------------------------------------------------------------- | ||
21241 | |||
21242 | --- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $ | ||
21243 | +-- $Id: test.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21244 | |||
21245 | -- The program has a few aims. | ||
21246 | -- 1. Test ZLib.Ada95 thick binding functionality. | ||
21247 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib.adb | ||
21248 | --- gcc-4.0.2/zlib/contrib/ada/zlib.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21249 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21250 | @@ -6,7 +6,7 @@ | ||
21251 | -- Open source license information is in the zlib.ads file. -- | ||
21252 | ---------------------------------------------------------------- | ||
21253 | |||
21254 | --- $Id: zlib.adb,v 1.19 2003/07/13 16:02:19 vagul Exp $ | ||
21255 | +-- $Id: zlib.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21256 | |||
21257 | with Ada.Exceptions; | ||
21258 | with Ada.Unchecked_Conversion; | ||
21259 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib.ads gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib.ads | ||
21260 | --- gcc-4.0.2/zlib/contrib/ada/zlib.ads 2004-10-11 19:44:23.000000000 +0200 | ||
21261 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib.ads 2005-07-15 16:26:03.000000000 +0200 | ||
21262 | @@ -25,7 +25,7 @@ | ||
21263 | -- covered by the GNU Public License. -- | ||
21264 | ------------------------------------------------------------------------------ | ||
21265 | |||
21266 | --- $Id: zlib.ads,v 1.17 2003/08/12 13:19:07 vagul Exp $ | ||
21267 | +-- $Id: zlib.ads 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21268 | |||
21269 | with Ada.Streams; | ||
21270 | |||
21271 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib-streams.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-streams.adb | ||
21272 | --- gcc-4.0.2/zlib/contrib/ada/zlib-streams.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21273 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-streams.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21274 | @@ -6,7 +6,7 @@ | ||
21275 | -- Open source license information is in the zlib.ads file. -- | ||
21276 | ---------------------------------------------------------------- | ||
21277 | |||
21278 | --- $Id: zlib-streams.adb,v 1.9 2003/08/12 13:15:31 vagul Exp $ | ||
21279 | +-- $Id: zlib-streams.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21280 | |||
21281 | with Ada.Unchecked_Deallocation; | ||
21282 | |||
21283 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib-streams.ads gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-streams.ads | ||
21284 | --- gcc-4.0.2/zlib/contrib/ada/zlib-streams.ads 2004-10-11 19:44:23.000000000 +0200 | ||
21285 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-streams.ads 2005-07-15 16:26:03.000000000 +0200 | ||
21286 | @@ -6,7 +6,7 @@ | ||
21287 | -- Open source license information is in the zlib.ads file. -- | ||
21288 | ---------------------------------------------------------------- | ||
21289 | |||
21290 | --- $Id: zlib-streams.ads,v 1.11 2003/08/12 13:15:31 vagul Exp $ | ||
21291 | +-- $Id: zlib-streams.ads 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21292 | |||
21293 | package ZLib.Streams is | ||
21294 | |||
21295 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib-thin.adb gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-thin.adb | ||
21296 | --- gcc-4.0.2/zlib/contrib/ada/zlib-thin.adb 2004-10-11 19:44:23.000000000 +0200 | ||
21297 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-thin.adb 2005-07-15 16:26:03.000000000 +0200 | ||
21298 | @@ -6,7 +6,7 @@ | ||
21299 | -- Open source license information is in the zlib.ads file. -- | ||
21300 | ---------------------------------------------------------------- | ||
21301 | |||
21302 | --- $Id: zlib-thin.adb,v 1.6 2003/01/21 15:26:37 vagul Exp $ | ||
21303 | +-- $Id: zlib-thin.adb 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21304 | |||
21305 | package body ZLib.Thin is | ||
21306 | |||
21307 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/contrib/ada/zlib-thin.ads gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-thin.ads | ||
21308 | --- gcc-4.0.2/zlib/contrib/ada/zlib-thin.ads 2004-10-11 19:44:23.000000000 +0200 | ||
21309 | +++ gcc-4.0.2-atmel.0.99.2/zlib/contrib/ada/zlib-thin.ads 2005-07-15 16:26:03.000000000 +0200 | ||
21310 | @@ -6,7 +6,7 @@ | ||
21311 | -- Open source license information is in the zlib.ads file. -- | ||
21312 | ---------------------------------------------------------------- | ||
21313 | |||
21314 | --- $Id: zlib-thin.ads,v 1.8 2003/08/12 13:16:51 vagul Exp $ | ||
21315 | +-- $Id: zlib-thin.ads 3484 2005-07-15 14:26:03Z rpedersen $ | ||
21316 | |||
21317 | with Interfaces.C.Strings; | ||
21318 | with System.Address_To_Access_Conversions; | ||
21319 | diff -Nrup --ignore-space-change gcc-4.0.2/zlib/zconf.in.h gcc-4.0.2-atmel.0.99.2/zlib/zconf.in.h | ||
21320 | --- gcc-4.0.2/zlib/zconf.in.h 2004-10-11 19:44:14.000000000 +0200 | ||
21321 | +++ gcc-4.0.2-atmel.0.99.2/zlib/zconf.in.h 2005-07-15 16:26:03.000000000 +0200 | ||
21322 | @@ -3,7 +3,7 @@ | ||
21323 | * For conditions of distribution and use, see copyright notice in zlib.h | ||
21324 | */ | ||
21325 | |||
21326 | -/* @(#) $Id$ */ | ||
21327 | +/* @(#) $Id: zconf.in.h 3484 2005-07-15 14:26:03Z rpedersen $ */ | ||
21328 | |||
21329 | #ifndef ZCONF_H | ||
21330 | #define ZCONF_H | ||
diff --git a/meta/packages/gcc/gcc-4.0.2/libstdc++-configure.patch b/meta/packages/gcc/gcc-4.0.2/libstdc++-configure.patch new file mode 100644 index 0000000000..8dc613104d --- /dev/null +++ b/meta/packages/gcc/gcc-4.0.2/libstdc++-configure.patch | |||
@@ -0,0 +1,10 @@ | |||
1 | --- /tmp/configure 2007-06-02 09:26:29.000000000 +0200 | ||
2 | +++ gcc-4.0.2/libstdc++-v3/configure 2007-06-02 09:26:40.135215000 +0200 | ||
3 | @@ -101472,7 +101472,6 @@ | ||
4 | _ACEOF | ||
5 | |||
6 | fi | ||
7 | -done | ||
8 | |||
9 | fi | ||
10 | |||
diff --git a/meta/packages/gcc/gcc-4.1.1/zecke-no-host-includes.patch b/meta/packages/gcc/gcc-4.0.2/zecke-no-host-includes.patch index 6afb10d6ef..6afb10d6ef 100644 --- a/meta/packages/gcc/gcc-4.1.1/zecke-no-host-includes.patch +++ b/meta/packages/gcc/gcc-4.0.2/zecke-no-host-includes.patch | |||
diff --git a/meta/packages/gcc/gcc-4.1.1/zecke-xgcc-cpp.patch b/meta/packages/gcc/gcc-4.0.2/zecke-xgcc-cpp.patch index 42ec190600..ba7d7257d9 100644 --- a/meta/packages/gcc/gcc-4.1.1/zecke-xgcc-cpp.patch +++ b/meta/packages/gcc/gcc-4.0.2/zecke-xgcc-cpp.patch | |||
@@ -1,9 +1,9 @@ | |||
1 | Index: gcc-4.1.1/Makefile.in | 1 | Index: gcc-4.0.2/Makefile.in |
2 | =================================================================== | 2 | =================================================================== |
3 | --- gcc-4.1.1.orig/Makefile.in 2006-08-06 13:32:44.000000000 +0200 | 3 | --- gcc-4.0.2.orig/Makefile.in 2006-08-06 13:17:09.000000000 +0200 |
4 | +++ gcc-4.1.1/Makefile.in 2006-08-06 13:32:46.000000000 +0200 | 4 | +++ gcc-4.0.2/Makefile.in 2006-08-06 13:18:35.000000000 +0200 |
5 | @@ -194,6 +194,7 @@ | 5 | @@ -197,6 +197,7 @@ |
6 | AS="$(COMPILER_AS_FOR_TARGET)"; export AS; \ | 6 | AS="$(AS_FOR_TARGET)"; export AS; \ |
7 | CC="$(CC_FOR_TARGET)"; export CC; \ | 7 | CC="$(CC_FOR_TARGET)"; export CC; \ |
8 | CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \ | 8 | CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \ |
9 | + CPP="$(CC_FOR_TARGET) -E"; export CCP; \ | 9 | + CPP="$(CC_FOR_TARGET) -E"; export CCP; \ |
diff --git a/meta/packages/gcc/gcc-4.1.1/100-uclibc-conf.patch b/meta/packages/gcc/gcc-4.1.1/100-uclibc-conf.patch deleted file mode 100644 index 49d576c7dd..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/100-uclibc-conf.patch +++ /dev/null | |||
@@ -1,544 +0,0 @@ | |||
1 | --- gcc-4.1.0/gcc/config/t-linux-uclibc | ||
2 | +++ gcc-4.1.0/gcc/config/t-linux-uclibc | ||
3 | @@ -0,0 +1,5 @@ | ||
4 | +# Remove glibc specific files added in t-linux | ||
5 | +SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) | ||
6 | + | ||
7 | +# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc | ||
8 | +LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) | ||
9 | --- gcc-4.1.0/gcc/config.gcc | ||
10 | +++ gcc-4.1.0/gcc/config.gcc | ||
11 | @@ -1887,7 +1887,7 @@ s390x-ibm-tpf*) | ||
12 | ;; | ||
13 | sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ | ||
14 | sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ | ||
15 | - sh-*-linux* | sh[346lbe]*-*-linux* | \ | ||
16 | + sh*-*-linux* | sh[346lbe]*-*-linux* | \ | ||
17 | sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ | ||
18 | sh64-*-netbsd* | sh64l*-*-netbsd*) | ||
19 | tmake_file="${tmake_file} sh/t-sh sh/t-elf" | ||
20 | @@ -2341,6 +2341,12 @@ m32c-*-elf*) | ||
21 | ;; | ||
22 | esac | ||
23 | |||
24 | +# Rather than hook into each target, just do it after all the linux | ||
25 | +# targets have been processed | ||
26 | +case ${target} in | ||
27 | +*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" | ||
28 | +esac | ||
29 | + | ||
30 | case ${target} in | ||
31 | i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1) | ||
32 | tmake_file="${tmake_file} i386/t-gmm_malloc" | ||
33 | --- gcc-4.1.0/boehm-gc/configure | ||
34 | +++ gcc-4.1.0/boehm-gc/configure | ||
35 | @@ -4320,6 +4320,11 @@ linux-gnu*) | ||
36 | lt_cv_deplibs_check_method=pass_all | ||
37 | ;; | ||
38 | |||
39 | +linux-uclibc*) | ||
40 | + lt_cv_deplibs_check_method=pass_all | ||
41 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
42 | + ;; | ||
43 | + | ||
44 | netbsd* | knetbsd*-gnu) | ||
45 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
46 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
47 | --- gcc-4.1.0/configure | ||
48 | +++ gcc-4.1.0/configure | ||
49 | @@ -1133,7 +1133,7 @@ no) | ||
50 | ;; | ||
51 | "") | ||
52 | case "${target}" in | ||
53 | - *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) | ||
54 | + *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) | ||
55 | # Enable libmudflap by default in GNU and friends. | ||
56 | ;; | ||
57 | *-*-freebsd*) | ||
58 | --- gcc-4.1.0/configure.in | ||
59 | +++ gcc-4.1.0/configure.in | ||
60 | @@ -341,7 +341,7 @@ no) | ||
61 | ;; | ||
62 | "") | ||
63 | case "${target}" in | ||
64 | - *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) | ||
65 | + *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) | ||
66 | # Enable libmudflap by default in GNU and friends. | ||
67 | ;; | ||
68 | *-*-freebsd*) | ||
69 | --- gcc-4.1.0/contrib/regression/objs-gcc.sh | ||
70 | +++ gcc-4.1.0/contrib/regression/objs-gcc.sh | ||
71 | @@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H | ||
72 | then | ||
73 | make all-gdb all-dejagnu all-ld || exit 1 | ||
74 | make install-gdb install-dejagnu install-ld || exit 1 | ||
75 | +elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] | ||
76 | + then | ||
77 | + make all-gdb all-dejagnu all-ld || exit 1 | ||
78 | + make install-gdb install-dejagnu install-ld || exit 1 | ||
79 | elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then | ||
80 | make bootstrap || exit 1 | ||
81 | make install || exit 1 | ||
82 | --- gcc-4.1.0/gcc/config/alpha/linux-elf.h | ||
83 | +++ gcc-4.1.0/gcc/config/alpha/linux-elf.h | ||
84 | @@ -27,7 +27,11 @@ Boston, MA 02110-1301, USA. */ | ||
85 | #define SUBTARGET_EXTRA_SPECS \ | ||
86 | { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, | ||
87 | |||
88 | +#if defined USE_UCLIBC | ||
89 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
90 | +#else | ||
91 | #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" | ||
92 | +#endif | ||
93 | |||
94 | #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ | ||
95 | %{O*:-O3} %{!O*:-O1} \ | ||
96 | --- gcc-4.1.0/gcc/config/arm/linux-elf.h | ||
97 | +++ gcc-4.1.0/gcc/config/arm/linux-elf.h | ||
98 | @@ -51,7 +51,11 @@ | ||
99 | |||
100 | #define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" | ||
101 | |||
102 | +#ifdef USE_UCLIBC | ||
103 | +#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" | ||
104 | +#else | ||
105 | #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.2" | ||
106 | +#endif | ||
107 | |||
108 | #define LINUX_TARGET_LINK_SPEC "%{h*} %{version:-v} \ | ||
109 | %{b} \ | ||
110 | --- gcc-4.1.0/gcc/config/cris/linux.h | ||
111 | +++ gcc-4.1.0/gcc/config/cris/linux.h | ||
112 | @@ -73,6 +73,25 @@ Boston, MA 02110-1301, USA. */ | ||
113 | #undef CRIS_DEFAULT_CPU_VERSION | ||
114 | #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG | ||
115 | |||
116 | +#ifdef USE_UCLIBC | ||
117 | + | ||
118 | +#undef CRIS_SUBTARGET_VERSION | ||
119 | +#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" | ||
120 | + | ||
121 | +#undef CRIS_LINK_SUBTARGET_SPEC | ||
122 | +#define CRIS_LINK_SUBTARGET_SPEC \ | ||
123 | + "-mcrislinux\ | ||
124 | + -rpath-link include/asm/../..%s\ | ||
125 | + %{shared} %{static}\ | ||
126 | + %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ | ||
127 | + %{!shared: \ | ||
128 | + %{!static: \ | ||
129 | + %{rdynamic:-export-dynamic} \ | ||
130 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ | ||
131 | + %{!r:%{O2|O3: --gc-sections}}" | ||
132 | + | ||
133 | +#else /* USE_UCLIBC */ | ||
134 | + | ||
135 | #undef CRIS_SUBTARGET_VERSION | ||
136 | #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" | ||
137 | |||
138 | @@ -87,6 +106,8 @@ Boston, MA 02110-1301, USA. */ | ||
139 | %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ | ||
140 | %{!r:%{O2|O3: --gc-sections}}" | ||
141 | |||
142 | +#endif /* USE_UCLIBC */ | ||
143 | + | ||
144 | |||
145 | /* Node: Run-time Target */ | ||
146 | |||
147 | --- gcc-4.1.0/gcc/config/i386/linux.h | ||
148 | +++ gcc-4.1.0/gcc/config/i386/linux.h | ||
149 | @@ -107,6 +107,11 @@ Boston, MA 02110-1301, USA. */ | ||
150 | #define LINK_EMULATION "elf_i386" | ||
151 | #define DYNAMIC_LINKER "/lib/ld-linux.so.2" | ||
152 | |||
153 | +#if defined USE_UCLIBC | ||
154 | +#undef DYNAMIC_LINKER | ||
155 | +#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
156 | +#endif | ||
157 | + | ||
158 | #undef SUBTARGET_EXTRA_SPECS | ||
159 | #define SUBTARGET_EXTRA_SPECS \ | ||
160 | { "link_emulation", LINK_EMULATION },\ | ||
161 | --- gcc-4.1.0/gcc/config/i386/linux64.h | ||
162 | +++ gcc-4.1.0/gcc/config/i386/linux64.h | ||
163 | @@ -54,14 +54,21 @@ Boston, MA 02110-1301, USA. */ | ||
164 | When the -shared link option is used a final link is not being | ||
165 | done. */ | ||
166 | |||
167 | +#ifdef USE_UCLIBC | ||
168 | +#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
169 | +#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" | ||
170 | +#else | ||
171 | +#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" | ||
172 | +#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" | ||
173 | +#endif | ||
174 | #undef LINK_SPEC | ||
175 | #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ | ||
176 | %{shared:-shared} \ | ||
177 | %{!shared: \ | ||
178 | %{!static: \ | ||
179 | %{rdynamic:-export-dynamic} \ | ||
180 | - %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
181 | - %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ | ||
182 | + %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ | ||
183 | + %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ | ||
184 | %{static:-static}}" | ||
185 | |||
186 | /* Similar to standard Linux, but adding -ffast-math support. */ | ||
187 | --- gcc-4.1.0/gcc/config/ia64/linux.h | ||
188 | +++ gcc-4.1.0/gcc/config/ia64/linux.h | ||
189 | @@ -37,13 +37,18 @@ do { \ | ||
190 | /* Define this for shared library support because it isn't in the main | ||
191 | linux.h file. */ | ||
192 | |||
193 | +#ifdef USE_UCLIBC | ||
194 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
195 | +#else | ||
196 | +#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" | ||
197 | +#endif | ||
198 | #undef LINK_SPEC | ||
199 | #define LINK_SPEC "\ | ||
200 | %{shared:-shared} \ | ||
201 | %{!shared: \ | ||
202 | %{!static: \ | ||
203 | %{rdynamic:-export-dynamic} \ | ||
204 | - %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ | ||
205 | + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
206 | %{static:-static}}" | ||
207 | |||
208 | |||
209 | --- gcc-4.1.0/gcc/config/m68k/linux.h | ||
210 | +++ gcc-4.1.0/gcc/config/m68k/linux.h | ||
211 | @@ -123,12 +123,17 @@ Boston, MA 02110-1301, USA. */ | ||
212 | |||
213 | /* If ELF is the default format, we should not use /lib/elf. */ | ||
214 | |||
215 | +#ifdef USE_UCLIBC | ||
216 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
217 | +#else | ||
218 | +#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" | ||
219 | +#endif | ||
220 | #undef LINK_SPEC | ||
221 | #define LINK_SPEC "-m m68kelf %{shared} \ | ||
222 | %{!shared: \ | ||
223 | %{!static: \ | ||
224 | %{rdynamic:-export-dynamic} \ | ||
225 | - %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ | ||
226 | + %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
227 | %{static}}" | ||
228 | |||
229 | /* For compatibility with linux/a.out */ | ||
230 | --- gcc-4.1.0/gcc/config/mips/linux.h | ||
231 | +++ gcc-4.1.0/gcc/config/mips/linux.h | ||
232 | @@ -105,6 +105,11 @@ Boston, MA 02110-1301, USA. */ | ||
233 | |||
234 | /* Borrowed from sparc/linux.h */ | ||
235 | #undef LINK_SPEC | ||
236 | +#ifdef USE_UCLIBC | ||
237 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
238 | +#else | ||
239 | +#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" | ||
240 | +#endif | ||
241 | #define LINK_SPEC \ | ||
242 | "%(endian_spec) \ | ||
243 | %{shared:-shared} \ | ||
244 | @@ -112,7 +117,7 @@ Boston, MA 02110-1301, USA. */ | ||
245 | %{!ibcs: \ | ||
246 | %{!static: \ | ||
247 | %{rdynamic:-export-dynamic} \ | ||
248 | - %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ | ||
249 | + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
250 | %{static:-static}}}" | ||
251 | |||
252 | #undef SUBTARGET_ASM_SPEC | ||
253 | --- gcc-4.1.0/gcc/config/pa/pa-linux.h | ||
254 | +++ gcc-4.1.0/gcc/config/pa/pa-linux.h | ||
255 | @@ -49,13 +49,18 @@ Boston, MA 02110-1301, USA. */ | ||
256 | /* Define this for shared library support because it isn't in the main | ||
257 | linux.h file. */ | ||
258 | |||
259 | +#ifdef USE_UCLIBC | ||
260 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
261 | +#else | ||
262 | +#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" | ||
263 | +#endif | ||
264 | #undef LINK_SPEC | ||
265 | #define LINK_SPEC "\ | ||
266 | %{shared:-shared} \ | ||
267 | %{!shared: \ | ||
268 | %{!static: \ | ||
269 | %{rdynamic:-export-dynamic} \ | ||
270 | - %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ | ||
271 | + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
272 | %{static:-static}}" | ||
273 | |||
274 | /* glibc's profiling functions don't need gcc to allocate counters. */ | ||
275 | --- gcc-4.1.0/gcc/config/rs6000/linux.h | ||
276 | +++ gcc-4.1.0/gcc/config/rs6000/linux.h | ||
277 | @@ -72,7 +72,11 @@ | ||
278 | #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" | ||
279 | |||
280 | #undef LINK_OS_DEFAULT_SPEC | ||
281 | +#ifdef USE_UCLIBC | ||
282 | +#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" | ||
283 | +#else | ||
284 | #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" | ||
285 | +#endif | ||
286 | |||
287 | #define LINK_GCC_C_SEQUENCE_SPEC \ | ||
288 | "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" | ||
289 | --- gcc-4.1.0/gcc/config/rs6000/sysv4.h | ||
290 | +++ gcc-4.1.0/gcc/config/rs6000/sysv4.h | ||
291 | @@ -866,6 +866,7 @@ extern int fixuplabelno; | ||
292 | mcall-linux : %(link_os_linux) ; \ | ||
293 | mcall-gnu : %(link_os_gnu) ; \ | ||
294 | mcall-netbsd : %(link_os_netbsd) ; \ | ||
295 | + mcall-linux-uclibc : %(link_os_linux_uclibc); \ | ||
296 | mcall-openbsd: %(link_os_openbsd) ; \ | ||
297 | : %(link_os_default) }" | ||
298 | |||
299 | @@ -1043,6 +1044,10 @@ extern int fixuplabelno; | ||
300 | %{rdynamic:-export-dynamic} \ | ||
301 | %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" | ||
302 | |||
303 | +#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ | ||
304 | + %{rdynamic:-export-dynamic} \ | ||
305 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" | ||
306 | + | ||
307 | #if defined(HAVE_LD_EH_FRAME_HDR) | ||
308 | # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " | ||
309 | #endif | ||
310 | @@ -1209,6 +1214,7 @@ ncrtn.o%s" | ||
311 | { "link_os_sim", LINK_OS_SIM_SPEC }, \ | ||
312 | { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ | ||
313 | { "link_os_linux", LINK_OS_LINUX_SPEC }, \ | ||
314 | + { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ | ||
315 | { "link_os_gnu", LINK_OS_GNU_SPEC }, \ | ||
316 | { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ | ||
317 | { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ | ||
318 | --- gcc-4.1.0/gcc/config/s390/linux.h | ||
319 | +++ gcc-4.1.0/gcc/config/s390/linux.h | ||
320 | @@ -77,6 +77,13 @@ Software Foundation, 51 Franklin Street, | ||
321 | #define MULTILIB_DEFAULTS { "m31" } | ||
322 | #endif | ||
323 | |||
324 | +#ifdef USE_UCLIBC | ||
325 | +#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
326 | +#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" | ||
327 | +#else | ||
328 | +#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" | ||
329 | +#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" | ||
330 | +#endif | ||
331 | #undef LINK_SPEC | ||
332 | #define LINK_SPEC \ | ||
333 | "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ | ||
334 | @@ -86,8 +93,8 @@ Software Foundation, 51 Franklin Street, | ||
335 | %{!static: \ | ||
336 | %{rdynamic:-export-dynamic} \ | ||
337 | %{!dynamic-linker: \ | ||
338 | - %{m31:-dynamic-linker /lib/ld.so.1} \ | ||
339 | - %{m64:-dynamic-linker /lib/ld64.so.1}}}}" | ||
340 | + %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ | ||
341 | + %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" | ||
342 | |||
343 | |||
344 | #define TARGET_ASM_FILE_END file_end_indicate_exec_stack | ||
345 | --- gcc-4.1.0/gcc/config/sh/linux.h | ||
346 | +++ gcc-4.1.0/gcc/config/sh/linux.h | ||
347 | @@ -56,12 +56,21 @@ Boston, MA 02110-1301, USA. */ | ||
348 | #undef SUBTARGET_LINK_EMUL_SUFFIX | ||
349 | #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" | ||
350 | #undef SUBTARGET_LINK_SPEC | ||
351 | +#ifdef USE_UCLIBC | ||
352 | +#define SUBTARGET_LINK_SPEC \ | ||
353 | + "%{shared:-shared} \ | ||
354 | + %{!static: \ | ||
355 | + %{rdynamic:-export-dynamic} \ | ||
356 | + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ | ||
357 | + %{static:-static}" | ||
358 | +#else | ||
359 | #define SUBTARGET_LINK_SPEC \ | ||
360 | "%{shared:-shared} \ | ||
361 | %{!static: \ | ||
362 | %{rdynamic:-export-dynamic} \ | ||
363 | %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
364 | %{static:-static}" | ||
365 | +#endif | ||
366 | |||
367 | /* Output assembler code to STREAM to call the profiler. */ | ||
368 | |||
369 | --- gcc-4.1.0/gcc/config/sparc/linux.h | ||
370 | +++ gcc-4.1.0/gcc/config/sparc/linux.h | ||
371 | @@ -125,6 +125,11 @@ Boston, MA 02110-1301, USA. */ | ||
372 | |||
373 | /* If ELF is the default format, we should not use /lib/elf. */ | ||
374 | |||
375 | +#ifdef USE_UCLIBC | ||
376 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
377 | +#else | ||
378 | +#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" | ||
379 | +#endif | ||
380 | #undef LINK_SPEC | ||
381 | #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ | ||
382 | %{!mno-relax:%{!r:-relax}} \ | ||
383 | @@ -132,7 +137,7 @@ Boston, MA 02110-1301, USA. */ | ||
384 | %{!ibcs: \ | ||
385 | %{!static: \ | ||
386 | %{rdynamic:-export-dynamic} \ | ||
387 | - %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
388 | + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
389 | %{static:-static}}}" | ||
390 | |||
391 | /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). | ||
392 | --- gcc-4.1.0/gcc/config/sparc/linux64.h | ||
393 | +++ gcc-4.1.0/gcc/config/sparc/linux64.h | ||
394 | @@ -162,12 +162,17 @@ Boston, MA 02110-1301, USA. */ | ||
395 | { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ | ||
396 | { "link_arch", LINK_ARCH_SPEC }, | ||
397 | |||
398 | +#ifdef USE_UCLIBC | ||
399 | +#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" | ||
400 | +#else | ||
401 | +#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" | ||
402 | +#endif | ||
403 | #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ | ||
404 | %{!shared: \ | ||
405 | %{!ibcs: \ | ||
406 | %{!static: \ | ||
407 | %{rdynamic:-export-dynamic} \ | ||
408 | - %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ | ||
409 | + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ | ||
410 | %{static:-static}}} \ | ||
411 | " | ||
412 | |||
413 | --- gcc-4.1.0/libffi/configure | ||
414 | +++ gcc-4.1.0/libffi/configure | ||
415 | @@ -3457,6 +3457,11 @@ linux-gnu*) | ||
416 | lt_cv_deplibs_check_method=pass_all | ||
417 | ;; | ||
418 | |||
419 | +linux-uclibc*) | ||
420 | + lt_cv_deplibs_check_method=pass_all | ||
421 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
422 | + ;; | ||
423 | + | ||
424 | netbsd* | knetbsd*-gnu) | ||
425 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
426 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
427 | --- gcc-4.1.0/libgfortran/configure | ||
428 | +++ gcc-4.1.0/libgfortran/configure | ||
429 | @@ -3699,6 +3699,11 @@ linux-gnu*) | ||
430 | lt_cv_deplibs_check_method=pass_all | ||
431 | ;; | ||
432 | |||
433 | +linux-uclibc*) | ||
434 | + lt_cv_deplibs_check_method=pass_all | ||
435 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
436 | + ;; | ||
437 | + | ||
438 | netbsd* | knetbsd*-gnu) | ||
439 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
440 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
441 | --- gcc-4.1.0/libjava/configure | ||
442 | +++ gcc-4.1.0/libjava/configure | ||
443 | @@ -5137,6 +5137,11 @@ linux-gnu*) | ||
444 | lt_cv_deplibs_check_method=pass_all | ||
445 | ;; | ||
446 | |||
447 | +linux-uclibc*) | ||
448 | + lt_cv_deplibs_check_method=pass_all | ||
449 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
450 | + ;; | ||
451 | + | ||
452 | netbsd* | knetbsd*-gnu) | ||
453 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
454 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
455 | --- gcc-4.1.0/libmudflap/configure | ||
456 | +++ gcc-4.1.0/libmudflap/configure | ||
457 | @@ -5382,6 +5382,11 @@ linux-gnu*) | ||
458 | lt_cv_deplibs_check_method=pass_all | ||
459 | ;; | ||
460 | |||
461 | +linux-uclibc*) | ||
462 | + lt_cv_deplibs_check_method=pass_all | ||
463 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
464 | + ;; | ||
465 | + | ||
466 | netbsd* | knetbsd*-gnu) | ||
467 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
468 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
469 | --- gcc-4.1.0/libobjc/configure | ||
470 | +++ gcc-4.1.0/libobjc/configure | ||
471 | @@ -3312,6 +3312,11 @@ linux-gnu*) | ||
472 | lt_cv_deplibs_check_method=pass_all | ||
473 | ;; | ||
474 | |||
475 | +linux-uclibc*) | ||
476 | + lt_cv_deplibs_check_method=pass_all | ||
477 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
478 | + ;; | ||
479 | + | ||
480 | netbsd* | knetbsd*-gnu) | ||
481 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
482 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
483 | --- gcc-4.1.0/libtool.m4 | ||
484 | +++ gcc-4.1.0/libtool.m4 | ||
485 | @@ -743,6 +743,11 @@ linux-gnu*) | ||
486 | lt_cv_deplibs_check_method=pass_all | ||
487 | ;; | ||
488 | |||
489 | +linux-uclibc*) | ||
490 | + lt_cv_deplibs_check_method=pass_all | ||
491 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
492 | + ;; | ||
493 | + | ||
494 | netbsd* | knetbsd*-gnu) | ||
495 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
496 | [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] | ||
497 | --- gcc-4.1.0/ltconfig | ||
498 | +++ gcc-4.1.0/ltconfig | ||
499 | @@ -603,6 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)- | ||
500 | |||
501 | # Transform linux* to *-*-linux-gnu*, to support old configure scripts. | ||
502 | case $host_os in | ||
503 | +linux-uclibc*) ;; | ||
504 | linux-gnu*) ;; | ||
505 | linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` | ||
506 | esac | ||
507 | @@ -1274,6 +1275,23 @@ linux-gnu*) | ||
508 | dynamic_linker='GNU/Linux ld.so' | ||
509 | ;; | ||
510 | |||
511 | +linux-uclibc*) | ||
512 | + version_type=linux | ||
513 | + need_lib_prefix=no | ||
514 | + need_version=no | ||
515 | + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' | ||
516 | + soname_spec='${libname}${release}.so$major' | ||
517 | + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' | ||
518 | + shlibpath_var=LD_LIBRARY_PATH | ||
519 | + shlibpath_overrides_runpath=no | ||
520 | + # This implies no fast_install, which is unacceptable. | ||
521 | + # Some rework will be needed to allow for fast_install | ||
522 | + # before this can be enabled. | ||
523 | + hardcode_into_libs=yes | ||
524 | + # Assume using the uClibc dynamic linker. | ||
525 | + dynamic_linker="uClibc ld.so" | ||
526 | + ;; | ||
527 | + | ||
528 | netbsd*) | ||
529 | need_lib_prefix=no | ||
530 | need_version=no | ||
531 | --- gcc-4.1.0/zlib/configure | ||
532 | +++ gcc-4.1.0/zlib/configure | ||
533 | @@ -3426,6 +3426,11 @@ linux-gnu*) | ||
534 | lt_cv_deplibs_check_method=pass_all | ||
535 | ;; | ||
536 | |||
537 | +linux-uclibc*) | ||
538 | + lt_cv_deplibs_check_method=pass_all | ||
539 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
540 | + ;; | ||
541 | + | ||
542 | netbsd* | knetbsd*-gnu) | ||
543 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
544 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/110-arm-eabi.patch b/meta/packages/gcc/gcc-4.1.1/110-arm-eabi.patch deleted file mode 100644 index acebe5308f..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/110-arm-eabi.patch +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | --- gcc-2005q3-1.orig/gcc/config.gcc 2005-10-31 19:02:54.000000000 +0300 | ||
2 | +++ gcc-2005q3-1/gcc/config.gcc 2006-01-27 01:09:09.000000000 +0300 | ||
3 | @@ -674,7 +674,7 @@ | ||
4 | tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" | ||
5 | tmake_file="t-slibgcc-elf-ver t-linux arm/t-arm" | ||
6 | case ${target} in | ||
7 | - arm*-*-linux-gnueabi) | ||
8 | + arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) | ||
9 | tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h" | ||
10 | tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" | ||
11 | # The BPABI long long divmod functions return a 128-bit value in | ||
12 | |||
13 | diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h | ||
14 | --- gcc-2005q3-2/gcc/config/arm/linux-eabi.h 2005-12-07 23:14:16.000000000 +0300 | ||
15 | +++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h 2006-03-29 19:02:34.000000000 +0400 | ||
16 | @@ -53,7 +53,11 @@ | ||
17 | /* Use ld-linux.so.3 so that it will be possible to run "classic" | ||
18 | GNU/Linux binaries on an EABI system. */ | ||
19 | #undef LINUX_TARGET_INTERPRETER | ||
20 | +#ifdef USE_UCLIBC | ||
21 | +#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" | ||
22 | +#else | ||
23 | #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3" | ||
24 | +#endif | ||
25 | |||
26 | /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to | ||
27 | use the GNU/Linux version, not the generic BPABI version. */ | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/200-uclibc-locale.patch b/meta/packages/gcc/gcc-4.1.1/200-uclibc-locale.patch deleted file mode 100644 index 9d65a6234e..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/200-uclibc-locale.patch +++ /dev/null | |||
@@ -1,3261 +0,0 @@ | |||
1 | diff -urN gcc-4.1.0-dist/libstdc++-v3/acinclude.m4 gcc-4.1.0/libstdc++-v3/acinclude.m4 | ||
2 | --- gcc-4.1.0-dist/libstdc++-v3/acinclude.m4 2006-03-26 12:08:28.000000000 -0700 | ||
3 | +++ gcc-4.1.0/libstdc++-v3/acinclude.m4 2006-03-25 22:06:30.000000000 -0700 | ||
4 | @@ -1071,7 +1071,7 @@ | ||
5 | AC_MSG_CHECKING([for C locale to use]) | ||
6 | GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], | ||
7 | [use MODEL for target locale package], | ||
8 | - [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) | ||
9 | + [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) | ||
10 | |||
11 | # If they didn't use this option switch, or if they specified --enable | ||
12 | # with no specific model, we'll have to look for one. If they | ||
13 | @@ -1087,6 +1087,9 @@ | ||
14 | # Default to "generic". | ||
15 | if test $enable_clocale_flag = auto; then | ||
16 | case ${target_os} in | ||
17 | + *-uclibc*) | ||
18 | + enable_clocale_flag=uclibc | ||
19 | + ;; | ||
20 | linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) | ||
21 | AC_EGREP_CPP([_GLIBCXX_ok], [ | ||
22 | #include <features.h> | ||
23 | @@ -1230,6 +1233,40 @@ | ||
24 | CTIME_CC=config/locale/generic/time_members.cc | ||
25 | CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h | ||
26 | ;; | ||
27 | + uclibc) | ||
28 | + AC_MSG_RESULT(uclibc) | ||
29 | + | ||
30 | + # Declare intention to use gettext, and add support for specific | ||
31 | + # languages. | ||
32 | + # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT | ||
33 | + ALL_LINGUAS="de fr" | ||
34 | + | ||
35 | + # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. | ||
36 | + AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) | ||
37 | + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then | ||
38 | + USE_NLS=yes | ||
39 | + fi | ||
40 | + # Export the build objects. | ||
41 | + for ling in $ALL_LINGUAS; do \ | ||
42 | + glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ | ||
43 | + glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ | ||
44 | + done | ||
45 | + AC_SUBST(glibcxx_MOFILES) | ||
46 | + AC_SUBST(glibcxx_POFILES) | ||
47 | + | ||
48 | + CLOCALE_H=config/locale/uclibc/c_locale.h | ||
49 | + CLOCALE_CC=config/locale/uclibc/c_locale.cc | ||
50 | + CCODECVT_CC=config/locale/uclibc/codecvt_members.cc | ||
51 | + CCOLLATE_CC=config/locale/uclibc/collate_members.cc | ||
52 | + CCTYPE_CC=config/locale/uclibc/ctype_members.cc | ||
53 | + CMESSAGES_H=config/locale/uclibc/messages_members.h | ||
54 | + CMESSAGES_CC=config/locale/uclibc/messages_members.cc | ||
55 | + CMONEY_CC=config/locale/uclibc/monetary_members.cc | ||
56 | + CNUMERIC_CC=config/locale/uclibc/numeric_members.cc | ||
57 | + CTIME_H=config/locale/uclibc/time_members.h | ||
58 | + CTIME_CC=config/locale/uclibc/time_members.cc | ||
59 | + CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h | ||
60 | + ;; | ||
61 | esac | ||
62 | |||
63 | # This is where the testsuite looks for locale catalogs, using the | ||
64 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h | ||
65 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 17:00:00.000000000 -0700 | ||
66 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2006-03-25 22:18:37.000000000 -0700 | ||
67 | @@ -0,0 +1,63 @@ | ||
68 | +// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- | ||
69 | + | ||
70 | +// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. | ||
71 | +// | ||
72 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
73 | +// software; you can redistribute it and/or modify it under the | ||
74 | +// terms of the GNU General Public License as published by the | ||
75 | +// Free Software Foundation; either version 2, or (at your option) | ||
76 | +// any later version. | ||
77 | + | ||
78 | +// This library is distributed in the hope that it will be useful, | ||
79 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
80 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
81 | +// GNU General Public License for more details. | ||
82 | + | ||
83 | +// You should have received a copy of the GNU General Public License along | ||
84 | +// with this library; see the file COPYING. If not, write to the Free | ||
85 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
86 | +// USA. | ||
87 | + | ||
88 | +// As a special exception, you may use this file as part of a free software | ||
89 | +// library without restriction. Specifically, if other files instantiate | ||
90 | +// templates or use macros or inline functions from this file, or you compile | ||
91 | +// this file and link it with other files to produce an executable, this | ||
92 | +// file does not by itself cause the resulting executable to be covered by | ||
93 | +// the GNU General Public License. This exception does not however | ||
94 | +// invalidate any other reasons why the executable file might be covered by | ||
95 | +// the GNU General Public License. | ||
96 | + | ||
97 | +// Written by Jakub Jelinek <jakub@redhat.com> | ||
98 | + | ||
99 | +#include <bits/c++config.h> | ||
100 | +#include <clocale> | ||
101 | + | ||
102 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
103 | +#warning clean this up | ||
104 | +#endif | ||
105 | + | ||
106 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
107 | + | ||
108 | +extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; | ||
109 | +extern "C" __typeof(strcoll_l) __strcoll_l; | ||
110 | +extern "C" __typeof(strftime_l) __strftime_l; | ||
111 | +extern "C" __typeof(strtod_l) __strtod_l; | ||
112 | +extern "C" __typeof(strtof_l) __strtof_l; | ||
113 | +extern "C" __typeof(strtold_l) __strtold_l; | ||
114 | +extern "C" __typeof(strxfrm_l) __strxfrm_l; | ||
115 | +extern "C" __typeof(newlocale) __newlocale; | ||
116 | +extern "C" __typeof(freelocale) __freelocale; | ||
117 | +extern "C" __typeof(duplocale) __duplocale; | ||
118 | +extern "C" __typeof(uselocale) __uselocale; | ||
119 | + | ||
120 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
121 | +extern "C" __typeof(iswctype_l) __iswctype_l; | ||
122 | +extern "C" __typeof(towlower_l) __towlower_l; | ||
123 | +extern "C" __typeof(towupper_l) __towupper_l; | ||
124 | +extern "C" __typeof(wcscoll_l) __wcscoll_l; | ||
125 | +extern "C" __typeof(wcsftime_l) __wcsftime_l; | ||
126 | +extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; | ||
127 | +extern "C" __typeof(wctype_l) __wctype_l; | ||
128 | +#endif | ||
129 | + | ||
130 | +#endif // GLIBC 2.3 and later | ||
131 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc | ||
132 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 17:00:00.000000000 -0700 | ||
133 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc 2006-03-25 22:18:37.000000000 -0700 | ||
134 | @@ -0,0 +1,152 @@ | ||
135 | +// Wrapper for underlying C-language localization -*- C++ -*- | ||
136 | + | ||
137 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005 | ||
138 | +// Free Software Foundation, Inc. | ||
139 | +// | ||
140 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
141 | +// software; you can redistribute it and/or modify it under the | ||
142 | +// terms of the GNU General Public License as published by the | ||
143 | +// Free Software Foundation; either version 2, or (at your option) | ||
144 | +// any later version. | ||
145 | + | ||
146 | +// This library is distributed in the hope that it will be useful, | ||
147 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
148 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
149 | +// GNU General Public License for more details. | ||
150 | + | ||
151 | +// You should have received a copy of the GNU General Public License along | ||
152 | +// with this library; see the file COPYING. If not, write to the Free | ||
153 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
154 | +// USA. | ||
155 | + | ||
156 | +// As a special exception, you may use this file as part of a free software | ||
157 | +// library without restriction. Specifically, if other files instantiate | ||
158 | +// templates or use macros or inline functions from this file, or you compile | ||
159 | +// this file and link it with other files to produce an executable, this | ||
160 | +// file does not by itself cause the resulting executable to be covered by | ||
161 | +// the GNU General Public License. This exception does not however | ||
162 | +// invalidate any other reasons why the executable file might be covered by | ||
163 | +// the GNU General Public License. | ||
164 | + | ||
165 | +// | ||
166 | +// ISO C++ 14882: 22.8 Standard locale categories. | ||
167 | +// | ||
168 | + | ||
169 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
170 | + | ||
171 | +#include <cerrno> // For errno | ||
172 | +#include <locale> | ||
173 | +#include <stdexcept> | ||
174 | +#include <langinfo.h> | ||
175 | +#include <bits/c++locale_internal.h> | ||
176 | + | ||
177 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
178 | +#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) | ||
179 | +#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) | ||
180 | +#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) | ||
181 | +#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) | ||
182 | +#define __strtof_l(S, E, L) strtof((S), (E)) | ||
183 | +#define __strtod_l(S, E, L) strtod((S), (E)) | ||
184 | +#define __strtold_l(S, E, L) strtold((S), (E)) | ||
185 | +#warning should dummy __newlocale check for C|POSIX ? | ||
186 | +#define __newlocale(a, b, c) NULL | ||
187 | +#define __freelocale(a) ((void)0) | ||
188 | +#define __duplocale(a) __c_locale() | ||
189 | +#endif | ||
190 | + | ||
191 | +namespace std | ||
192 | +{ | ||
193 | + template<> | ||
194 | + void | ||
195 | + __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, | ||
196 | + const __c_locale& __cloc) | ||
197 | + { | ||
198 | + char* __sanity; | ||
199 | + errno = 0; | ||
200 | + float __f = __strtof_l(__s, &__sanity, __cloc); | ||
201 | + if (__sanity != __s && errno != ERANGE) | ||
202 | + __v = __f; | ||
203 | + else | ||
204 | + __err |= ios_base::failbit; | ||
205 | + } | ||
206 | + | ||
207 | + template<> | ||
208 | + void | ||
209 | + __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, | ||
210 | + const __c_locale& __cloc) | ||
211 | + { | ||
212 | + char* __sanity; | ||
213 | + errno = 0; | ||
214 | + double __d = __strtod_l(__s, &__sanity, __cloc); | ||
215 | + if (__sanity != __s && errno != ERANGE) | ||
216 | + __v = __d; | ||
217 | + else | ||
218 | + __err |= ios_base::failbit; | ||
219 | + } | ||
220 | + | ||
221 | + template<> | ||
222 | + void | ||
223 | + __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, | ||
224 | + const __c_locale& __cloc) | ||
225 | + { | ||
226 | + char* __sanity; | ||
227 | + errno = 0; | ||
228 | + long double __ld = __strtold_l(__s, &__sanity, __cloc); | ||
229 | + if (__sanity != __s && errno != ERANGE) | ||
230 | + __v = __ld; | ||
231 | + else | ||
232 | + __err |= ios_base::failbit; | ||
233 | + } | ||
234 | + | ||
235 | + void | ||
236 | + locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, | ||
237 | + __c_locale __old) | ||
238 | + { | ||
239 | + __cloc = __newlocale(1 << LC_ALL, __s, __old); | ||
240 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
241 | + if (!__cloc) | ||
242 | + { | ||
243 | + // This named locale is not supported by the underlying OS. | ||
244 | + __throw_runtime_error(__N("locale::facet::_S_create_c_locale " | ||
245 | + "name not valid")); | ||
246 | + } | ||
247 | +#endif | ||
248 | + } | ||
249 | + | ||
250 | + void | ||
251 | + locale::facet::_S_destroy_c_locale(__c_locale& __cloc) | ||
252 | + { | ||
253 | + if (__cloc && _S_get_c_locale() != __cloc) | ||
254 | + __freelocale(__cloc); | ||
255 | + } | ||
256 | + | ||
257 | + __c_locale | ||
258 | + locale::facet::_S_clone_c_locale(__c_locale& __cloc) | ||
259 | + { return __duplocale(__cloc); } | ||
260 | +} // namespace std | ||
261 | + | ||
262 | +namespace __gnu_cxx | ||
263 | +{ | ||
264 | + const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = | ||
265 | + { | ||
266 | + "LC_CTYPE", | ||
267 | + "LC_NUMERIC", | ||
268 | + "LC_TIME", | ||
269 | + "LC_COLLATE", | ||
270 | + "LC_MONETARY", | ||
271 | + "LC_MESSAGES", | ||
272 | +#if _GLIBCXX_NUM_CATEGORIES != 0 | ||
273 | + "LC_PAPER", | ||
274 | + "LC_NAME", | ||
275 | + "LC_ADDRESS", | ||
276 | + "LC_TELEPHONE", | ||
277 | + "LC_MEASUREMENT", | ||
278 | + "LC_IDENTIFICATION" | ||
279 | +#endif | ||
280 | + }; | ||
281 | +} | ||
282 | + | ||
283 | +namespace std | ||
284 | +{ | ||
285 | + const char* const* const locale::_S_categories = __gnu_cxx::category_names; | ||
286 | +} // namespace std | ||
287 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h | ||
288 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 17:00:00.000000000 -0700 | ||
289 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h 2006-03-26 13:03:42.000000000 -0700 | ||
290 | @@ -0,0 +1,117 @@ | ||
291 | +// Wrapper for underlying C-language localization -*- C++ -*- | ||
292 | + | ||
293 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||
294 | +// | ||
295 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
296 | +// software; you can redistribute it and/or modify it under the | ||
297 | +// terms of the GNU General Public License as published by the | ||
298 | +// Free Software Foundation; either version 2, or (at your option) | ||
299 | +// any later version. | ||
300 | + | ||
301 | +// This library is distributed in the hope that it will be useful, | ||
302 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
303 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
304 | +// GNU General Public License for more details. | ||
305 | + | ||
306 | +// You should have received a copy of the GNU General Public License along | ||
307 | +// with this library; see the file COPYING. If not, write to the Free | ||
308 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
309 | +// USA. | ||
310 | + | ||
311 | +// As a special exception, you may use this file as part of a free software | ||
312 | +// library without restriction. Specifically, if other files instantiate | ||
313 | +// templates or use macros or inline functions from this file, or you compile | ||
314 | +// this file and link it with other files to produce an executable, this | ||
315 | +// file does not by itself cause the resulting executable to be covered by | ||
316 | +// the GNU General Public License. This exception does not however | ||
317 | +// invalidate any other reasons why the executable file might be covered by | ||
318 | +// the GNU General Public License. | ||
319 | + | ||
320 | +// | ||
321 | +// ISO C++ 14882: 22.8 Standard locale categories. | ||
322 | +// | ||
323 | + | ||
324 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
325 | + | ||
326 | +#ifndef _C_LOCALE_H | ||
327 | +#define _C_LOCALE_H 1 | ||
328 | + | ||
329 | +#pragma GCC system_header | ||
330 | + | ||
331 | +#include <cstring> // get std::strlen | ||
332 | +#include <cstdio> // get std::snprintf or std::sprintf | ||
333 | +#include <clocale> | ||
334 | +#include <langinfo.h> // For codecvt | ||
335 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
336 | +#warning fix this | ||
337 | +#endif | ||
338 | +#ifdef __UCLIBC_HAS_LOCALE__ | ||
339 | +#include <iconv.h> // For codecvt using iconv, iconv_t | ||
340 | +#endif | ||
341 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
342 | +#include <libintl.h> // For messages | ||
343 | +#endif | ||
344 | + | ||
345 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
346 | +#warning what is _GLIBCXX_C_LOCALE_GNU for | ||
347 | +#endif | ||
348 | +#define _GLIBCXX_C_LOCALE_GNU 1 | ||
349 | + | ||
350 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
351 | +#warning fix categories | ||
352 | +#endif | ||
353 | +// #define _GLIBCXX_NUM_CATEGORIES 6 | ||
354 | +#define _GLIBCXX_NUM_CATEGORIES 0 | ||
355 | + | ||
356 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
357 | +namespace __gnu_cxx | ||
358 | +{ | ||
359 | + extern "C" __typeof(uselocale) __uselocale; | ||
360 | +} | ||
361 | +#endif | ||
362 | + | ||
363 | +namespace std | ||
364 | +{ | ||
365 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
366 | + typedef __locale_t __c_locale; | ||
367 | +#else | ||
368 | + typedef int* __c_locale; | ||
369 | +#endif | ||
370 | + | ||
371 | + // Convert numeric value of type _Tv to string and return length of | ||
372 | + // string. If snprintf is available use it, otherwise fall back to | ||
373 | + // the unsafe sprintf which, in general, can be dangerous and should | ||
374 | + // be avoided. | ||
375 | + template<typename _Tv> | ||
376 | + int | ||
377 | + __convert_from_v(char* __out, | ||
378 | + const int __size __attribute__ ((__unused__)), | ||
379 | + const char* __fmt, | ||
380 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
381 | + _Tv __v, const __c_locale& __cloc, int __prec) | ||
382 | + { | ||
383 | + __c_locale __old = __gnu_cxx::__uselocale(__cloc); | ||
384 | +#else | ||
385 | + _Tv __v, const __c_locale&, int __prec) | ||
386 | + { | ||
387 | +# ifdef __UCLIBC_HAS_LOCALE__ | ||
388 | + char* __old = std::setlocale(LC_ALL, NULL); | ||
389 | + char* __sav = new char[std::strlen(__old) + 1]; | ||
390 | + std::strcpy(__sav, __old); | ||
391 | + std::setlocale(LC_ALL, "C"); | ||
392 | +# endif | ||
393 | +#endif | ||
394 | + | ||
395 | + const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); | ||
396 | + | ||
397 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
398 | + __gnu_cxx::__uselocale(__old); | ||
399 | +#elif defined __UCLIBC_HAS_LOCALE__ | ||
400 | + std::setlocale(LC_ALL, __sav); | ||
401 | + delete [] __sav; | ||
402 | +#endif | ||
403 | + return __ret; | ||
404 | + } | ||
405 | +} | ||
406 | + | ||
407 | +#endif | ||
408 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc | ||
409 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
410 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
411 | @@ -0,0 +1,306 @@ | ||
412 | +// std::codecvt implementation details, GNU version -*- C++ -*- | ||
413 | + | ||
414 | +// Copyright (C) 2002, 2003 Free Software Foundation, Inc. | ||
415 | +// | ||
416 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
417 | +// software; you can redistribute it and/or modify it under the | ||
418 | +// terms of the GNU General Public License as published by the | ||
419 | +// Free Software Foundation; either version 2, or (at your option) | ||
420 | +// any later version. | ||
421 | + | ||
422 | +// This library is distributed in the hope that it will be useful, | ||
423 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
424 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
425 | +// GNU General Public License for more details. | ||
426 | + | ||
427 | +// You should have received a copy of the GNU General Public License along | ||
428 | +// with this library; see the file COPYING. If not, write to the Free | ||
429 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
430 | +// USA. | ||
431 | + | ||
432 | +// As a special exception, you may use this file as part of a free software | ||
433 | +// library without restriction. Specifically, if other files instantiate | ||
434 | +// templates or use macros or inline functions from this file, or you compile | ||
435 | +// this file and link it with other files to produce an executable, this | ||
436 | +// file does not by itself cause the resulting executable to be covered by | ||
437 | +// the GNU General Public License. This exception does not however | ||
438 | +// invalidate any other reasons why the executable file might be covered by | ||
439 | +// the GNU General Public License. | ||
440 | + | ||
441 | +// | ||
442 | +// ISO C++ 14882: 22.2.1.5 - Template class codecvt | ||
443 | +// | ||
444 | + | ||
445 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
446 | + | ||
447 | +#include <locale> | ||
448 | +#include <bits/c++locale_internal.h> | ||
449 | + | ||
450 | +namespace std | ||
451 | +{ | ||
452 | + // Specializations. | ||
453 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
454 | + codecvt_base::result | ||
455 | + codecvt<wchar_t, char, mbstate_t>:: | ||
456 | + do_out(state_type& __state, const intern_type* __from, | ||
457 | + const intern_type* __from_end, const intern_type*& __from_next, | ||
458 | + extern_type* __to, extern_type* __to_end, | ||
459 | + extern_type*& __to_next) const | ||
460 | + { | ||
461 | + result __ret = ok; | ||
462 | + state_type __tmp_state(__state); | ||
463 | + | ||
464 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
465 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
466 | +#endif | ||
467 | + | ||
468 | + // wcsnrtombs is *very* fast but stops if encounters NUL characters: | ||
469 | + // in case we fall back to wcrtomb and then continue, in a loop. | ||
470 | + // NB: wcsnrtombs is a GNU extension | ||
471 | + for (__from_next = __from, __to_next = __to; | ||
472 | + __from_next < __from_end && __to_next < __to_end | ||
473 | + && __ret == ok;) | ||
474 | + { | ||
475 | + const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', | ||
476 | + __from_end - __from_next); | ||
477 | + if (!__from_chunk_end) | ||
478 | + __from_chunk_end = __from_end; | ||
479 | + | ||
480 | + __from = __from_next; | ||
481 | + const size_t __conv = wcsnrtombs(__to_next, &__from_next, | ||
482 | + __from_chunk_end - __from_next, | ||
483 | + __to_end - __to_next, &__state); | ||
484 | + if (__conv == static_cast<size_t>(-1)) | ||
485 | + { | ||
486 | + // In case of error, in order to stop at the exact place we | ||
487 | + // have to start again from the beginning with a series of | ||
488 | + // wcrtomb. | ||
489 | + for (; __from < __from_next; ++__from) | ||
490 | + __to_next += wcrtomb(__to_next, *__from, &__tmp_state); | ||
491 | + __state = __tmp_state; | ||
492 | + __ret = error; | ||
493 | + } | ||
494 | + else if (__from_next && __from_next < __from_chunk_end) | ||
495 | + { | ||
496 | + __to_next += __conv; | ||
497 | + __ret = partial; | ||
498 | + } | ||
499 | + else | ||
500 | + { | ||
501 | + __from_next = __from_chunk_end; | ||
502 | + __to_next += __conv; | ||
503 | + } | ||
504 | + | ||
505 | + if (__from_next < __from_end && __ret == ok) | ||
506 | + { | ||
507 | + extern_type __buf[MB_LEN_MAX]; | ||
508 | + __tmp_state = __state; | ||
509 | + const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); | ||
510 | + if (__conv > static_cast<size_t>(__to_end - __to_next)) | ||
511 | + __ret = partial; | ||
512 | + else | ||
513 | + { | ||
514 | + memcpy(__to_next, __buf, __conv); | ||
515 | + __state = __tmp_state; | ||
516 | + __to_next += __conv; | ||
517 | + ++__from_next; | ||
518 | + } | ||
519 | + } | ||
520 | + } | ||
521 | + | ||
522 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
523 | + __uselocale(__old); | ||
524 | +#endif | ||
525 | + | ||
526 | + return __ret; | ||
527 | + } | ||
528 | + | ||
529 | + codecvt_base::result | ||
530 | + codecvt<wchar_t, char, mbstate_t>:: | ||
531 | + do_in(state_type& __state, const extern_type* __from, | ||
532 | + const extern_type* __from_end, const extern_type*& __from_next, | ||
533 | + intern_type* __to, intern_type* __to_end, | ||
534 | + intern_type*& __to_next) const | ||
535 | + { | ||
536 | + result __ret = ok; | ||
537 | + state_type __tmp_state(__state); | ||
538 | + | ||
539 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
540 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
541 | +#endif | ||
542 | + | ||
543 | + // mbsnrtowcs is *very* fast but stops if encounters NUL characters: | ||
544 | + // in case we store a L'\0' and then continue, in a loop. | ||
545 | + // NB: mbsnrtowcs is a GNU extension | ||
546 | + for (__from_next = __from, __to_next = __to; | ||
547 | + __from_next < __from_end && __to_next < __to_end | ||
548 | + && __ret == ok;) | ||
549 | + { | ||
550 | + const extern_type* __from_chunk_end; | ||
551 | + __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', | ||
552 | + __from_end | ||
553 | + - __from_next)); | ||
554 | + if (!__from_chunk_end) | ||
555 | + __from_chunk_end = __from_end; | ||
556 | + | ||
557 | + __from = __from_next; | ||
558 | + size_t __conv = mbsnrtowcs(__to_next, &__from_next, | ||
559 | + __from_chunk_end - __from_next, | ||
560 | + __to_end - __to_next, &__state); | ||
561 | + if (__conv == static_cast<size_t>(-1)) | ||
562 | + { | ||
563 | + // In case of error, in order to stop at the exact place we | ||
564 | + // have to start again from the beginning with a series of | ||
565 | + // mbrtowc. | ||
566 | + for (;; ++__to_next, __from += __conv) | ||
567 | + { | ||
568 | + __conv = mbrtowc(__to_next, __from, __from_end - __from, | ||
569 | + &__tmp_state); | ||
570 | + if (__conv == static_cast<size_t>(-1) | ||
571 | + || __conv == static_cast<size_t>(-2)) | ||
572 | + break; | ||
573 | + } | ||
574 | + __from_next = __from; | ||
575 | + __state = __tmp_state; | ||
576 | + __ret = error; | ||
577 | + } | ||
578 | + else if (__from_next && __from_next < __from_chunk_end) | ||
579 | + { | ||
580 | + // It is unclear what to return in this case (see DR 382). | ||
581 | + __to_next += __conv; | ||
582 | + __ret = partial; | ||
583 | + } | ||
584 | + else | ||
585 | + { | ||
586 | + __from_next = __from_chunk_end; | ||
587 | + __to_next += __conv; | ||
588 | + } | ||
589 | + | ||
590 | + if (__from_next < __from_end && __ret == ok) | ||
591 | + { | ||
592 | + if (__to_next < __to_end) | ||
593 | + { | ||
594 | + // XXX Probably wrong for stateful encodings | ||
595 | + __tmp_state = __state; | ||
596 | + ++__from_next; | ||
597 | + *__to_next++ = L'\0'; | ||
598 | + } | ||
599 | + else | ||
600 | + __ret = partial; | ||
601 | + } | ||
602 | + } | ||
603 | + | ||
604 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
605 | + __uselocale(__old); | ||
606 | +#endif | ||
607 | + | ||
608 | + return __ret; | ||
609 | + } | ||
610 | + | ||
611 | + int | ||
612 | + codecvt<wchar_t, char, mbstate_t>:: | ||
613 | + do_encoding() const throw() | ||
614 | + { | ||
615 | + // XXX This implementation assumes that the encoding is | ||
616 | + // stateless and is either single-byte or variable-width. | ||
617 | + int __ret = 0; | ||
618 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
619 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
620 | +#endif | ||
621 | + if (MB_CUR_MAX == 1) | ||
622 | + __ret = 1; | ||
623 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
624 | + __uselocale(__old); | ||
625 | +#endif | ||
626 | + return __ret; | ||
627 | + } | ||
628 | + | ||
629 | + int | ||
630 | + codecvt<wchar_t, char, mbstate_t>:: | ||
631 | + do_max_length() const throw() | ||
632 | + { | ||
633 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
634 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
635 | +#endif | ||
636 | + // XXX Probably wrong for stateful encodings. | ||
637 | + int __ret = MB_CUR_MAX; | ||
638 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
639 | + __uselocale(__old); | ||
640 | +#endif | ||
641 | + return __ret; | ||
642 | + } | ||
643 | + | ||
644 | + int | ||
645 | + codecvt<wchar_t, char, mbstate_t>:: | ||
646 | + do_length(state_type& __state, const extern_type* __from, | ||
647 | + const extern_type* __end, size_t __max) const | ||
648 | + { | ||
649 | + int __ret = 0; | ||
650 | + state_type __tmp_state(__state); | ||
651 | + | ||
652 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
653 | + __c_locale __old = __uselocale(_M_c_locale_codecvt); | ||
654 | +#endif | ||
655 | + | ||
656 | + // mbsnrtowcs is *very* fast but stops if encounters NUL characters: | ||
657 | + // in case we advance past it and then continue, in a loop. | ||
658 | + // NB: mbsnrtowcs is a GNU extension | ||
659 | + | ||
660 | + // A dummy internal buffer is needed in order for mbsnrtocws to consider | ||
661 | + // its fourth parameter (it wouldn't with NULL as first parameter). | ||
662 | + wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) | ||
663 | + * __max)); | ||
664 | + while (__from < __end && __max) | ||
665 | + { | ||
666 | + const extern_type* __from_chunk_end; | ||
667 | + __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', | ||
668 | + __end | ||
669 | + - __from)); | ||
670 | + if (!__from_chunk_end) | ||
671 | + __from_chunk_end = __end; | ||
672 | + | ||
673 | + const extern_type* __tmp_from = __from; | ||
674 | + size_t __conv = mbsnrtowcs(__to, &__from, | ||
675 | + __from_chunk_end - __from, | ||
676 | + __max, &__state); | ||
677 | + if (__conv == static_cast<size_t>(-1)) | ||
678 | + { | ||
679 | + // In case of error, in order to stop at the exact place we | ||
680 | + // have to start again from the beginning with a series of | ||
681 | + // mbrtowc. | ||
682 | + for (__from = __tmp_from;; __from += __conv) | ||
683 | + { | ||
684 | + __conv = mbrtowc(NULL, __from, __end - __from, | ||
685 | + &__tmp_state); | ||
686 | + if (__conv == static_cast<size_t>(-1) | ||
687 | + || __conv == static_cast<size_t>(-2)) | ||
688 | + break; | ||
689 | + } | ||
690 | + __state = __tmp_state; | ||
691 | + __ret += __from - __tmp_from; | ||
692 | + break; | ||
693 | + } | ||
694 | + if (!__from) | ||
695 | + __from = __from_chunk_end; | ||
696 | + | ||
697 | + __ret += __from - __tmp_from; | ||
698 | + __max -= __conv; | ||
699 | + | ||
700 | + if (__from < __end && __max) | ||
701 | + { | ||
702 | + // XXX Probably wrong for stateful encodings | ||
703 | + __tmp_state = __state; | ||
704 | + ++__from; | ||
705 | + ++__ret; | ||
706 | + --__max; | ||
707 | + } | ||
708 | + } | ||
709 | + | ||
710 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
711 | + __uselocale(__old); | ||
712 | +#endif | ||
713 | + | ||
714 | + return __ret; | ||
715 | + } | ||
716 | +#endif | ||
717 | +} | ||
718 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc | ||
719 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
720 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
721 | @@ -0,0 +1,80 @@ | ||
722 | +// std::collate implementation details, GNU version -*- C++ -*- | ||
723 | + | ||
724 | +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. | ||
725 | +// | ||
726 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
727 | +// software; you can redistribute it and/or modify it under the | ||
728 | +// terms of the GNU General Public License as published by the | ||
729 | +// Free Software Foundation; either version 2, or (at your option) | ||
730 | +// any later version. | ||
731 | + | ||
732 | +// This library is distributed in the hope that it will be useful, | ||
733 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
734 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
735 | +// GNU General Public License for more details. | ||
736 | + | ||
737 | +// You should have received a copy of the GNU General Public License along | ||
738 | +// with this library; see the file COPYING. If not, write to the Free | ||
739 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
740 | +// USA. | ||
741 | + | ||
742 | +// As a special exception, you may use this file as part of a free software | ||
743 | +// library without restriction. Specifically, if other files instantiate | ||
744 | +// templates or use macros or inline functions from this file, or you compile | ||
745 | +// this file and link it with other files to produce an executable, this | ||
746 | +// file does not by itself cause the resulting executable to be covered by | ||
747 | +// the GNU General Public License. This exception does not however | ||
748 | +// invalidate any other reasons why the executable file might be covered by | ||
749 | +// the GNU General Public License. | ||
750 | + | ||
751 | +// | ||
752 | +// ISO C++ 14882: 22.2.4.1.2 collate virtual functions | ||
753 | +// | ||
754 | + | ||
755 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
756 | + | ||
757 | +#include <locale> | ||
758 | +#include <bits/c++locale_internal.h> | ||
759 | + | ||
760 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
761 | +#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) | ||
762 | +#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) | ||
763 | +#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) | ||
764 | +#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) | ||
765 | +#endif | ||
766 | + | ||
767 | +namespace std | ||
768 | +{ | ||
769 | + // These are basically extensions to char_traits, and perhaps should | ||
770 | + // be put there instead of here. | ||
771 | + template<> | ||
772 | + int | ||
773 | + collate<char>::_M_compare(const char* __one, const char* __two) const | ||
774 | + { | ||
775 | + int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); | ||
776 | + return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); | ||
777 | + } | ||
778 | + | ||
779 | + template<> | ||
780 | + size_t | ||
781 | + collate<char>::_M_transform(char* __to, const char* __from, | ||
782 | + size_t __n) const | ||
783 | + { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } | ||
784 | + | ||
785 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
786 | + template<> | ||
787 | + int | ||
788 | + collate<wchar_t>::_M_compare(const wchar_t* __one, | ||
789 | + const wchar_t* __two) const | ||
790 | + { | ||
791 | + int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); | ||
792 | + return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); | ||
793 | + } | ||
794 | + | ||
795 | + template<> | ||
796 | + size_t | ||
797 | + collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, | ||
798 | + size_t __n) const | ||
799 | + { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } | ||
800 | +#endif | ||
801 | +} | ||
802 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc | ||
803 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
804 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
805 | @@ -0,0 +1,314 @@ | ||
806 | +// std::ctype implementation details, GNU version -*- C++ -*- | ||
807 | + | ||
808 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
809 | +// | ||
810 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
811 | +// software; you can redistribute it and/or modify it under the | ||
812 | +// terms of the GNU General Public License as published by the | ||
813 | +// Free Software Foundation; either version 2, or (at your option) | ||
814 | +// any later version. | ||
815 | + | ||
816 | +// This library is distributed in the hope that it will be useful, | ||
817 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
818 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
819 | +// GNU General Public License for more details. | ||
820 | + | ||
821 | +// You should have received a copy of the GNU General Public License along | ||
822 | +// with this library; see the file COPYING. If not, write to the Free | ||
823 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
824 | +// USA. | ||
825 | + | ||
826 | +// As a special exception, you may use this file as part of a free software | ||
827 | +// library without restriction. Specifically, if other files instantiate | ||
828 | +// templates or use macros or inline functions from this file, or you compile | ||
829 | +// this file and link it with other files to produce an executable, this | ||
830 | +// file does not by itself cause the resulting executable to be covered by | ||
831 | +// the GNU General Public License. This exception does not however | ||
832 | +// invalidate any other reasons why the executable file might be covered by | ||
833 | +// the GNU General Public License. | ||
834 | + | ||
835 | +// | ||
836 | +// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. | ||
837 | +// | ||
838 | + | ||
839 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
840 | + | ||
841 | +#define _LIBC | ||
842 | +#include <locale> | ||
843 | +#undef _LIBC | ||
844 | +#include <bits/c++locale_internal.h> | ||
845 | + | ||
846 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
847 | +#define __wctype_l(S, L) wctype((S)) | ||
848 | +#define __towupper_l(C, L) towupper((C)) | ||
849 | +#define __towlower_l(C, L) towlower((C)) | ||
850 | +#define __iswctype_l(C, M, L) iswctype((C), (M)) | ||
851 | +#endif | ||
852 | + | ||
853 | +namespace std | ||
854 | +{ | ||
855 | + // NB: The other ctype<char> specializations are in src/locale.cc and | ||
856 | + // various /config/os/* files. | ||
857 | + template<> | ||
858 | + ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) | ||
859 | + : ctype<char>(0, false, __refs) | ||
860 | + { | ||
861 | + if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) | ||
862 | + { | ||
863 | + this->_S_destroy_c_locale(this->_M_c_locale_ctype); | ||
864 | + this->_S_create_c_locale(this->_M_c_locale_ctype, __s); | ||
865 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
866 | + this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; | ||
867 | + this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; | ||
868 | + this->_M_table = this->_M_c_locale_ctype->__ctype_b; | ||
869 | +#endif | ||
870 | + } | ||
871 | + } | ||
872 | + | ||
873 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
874 | + ctype<wchar_t>::__wmask_type | ||
875 | + ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const | ||
876 | + { | ||
877 | + __wmask_type __ret; | ||
878 | + switch (__m) | ||
879 | + { | ||
880 | + case space: | ||
881 | + __ret = __wctype_l("space", _M_c_locale_ctype); | ||
882 | + break; | ||
883 | + case print: | ||
884 | + __ret = __wctype_l("print", _M_c_locale_ctype); | ||
885 | + break; | ||
886 | + case cntrl: | ||
887 | + __ret = __wctype_l("cntrl", _M_c_locale_ctype); | ||
888 | + break; | ||
889 | + case upper: | ||
890 | + __ret = __wctype_l("upper", _M_c_locale_ctype); | ||
891 | + break; | ||
892 | + case lower: | ||
893 | + __ret = __wctype_l("lower", _M_c_locale_ctype); | ||
894 | + break; | ||
895 | + case alpha: | ||
896 | + __ret = __wctype_l("alpha", _M_c_locale_ctype); | ||
897 | + break; | ||
898 | + case digit: | ||
899 | + __ret = __wctype_l("digit", _M_c_locale_ctype); | ||
900 | + break; | ||
901 | + case punct: | ||
902 | + __ret = __wctype_l("punct", _M_c_locale_ctype); | ||
903 | + break; | ||
904 | + case xdigit: | ||
905 | + __ret = __wctype_l("xdigit", _M_c_locale_ctype); | ||
906 | + break; | ||
907 | + case alnum: | ||
908 | + __ret = __wctype_l("alnum", _M_c_locale_ctype); | ||
909 | + break; | ||
910 | + case graph: | ||
911 | + __ret = __wctype_l("graph", _M_c_locale_ctype); | ||
912 | + break; | ||
913 | + default: | ||
914 | + __ret = __wmask_type(); | ||
915 | + } | ||
916 | + return __ret; | ||
917 | + } | ||
918 | + | ||
919 | + wchar_t | ||
920 | + ctype<wchar_t>::do_toupper(wchar_t __c) const | ||
921 | + { return __towupper_l(__c, _M_c_locale_ctype); } | ||
922 | + | ||
923 | + const wchar_t* | ||
924 | + ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const | ||
925 | + { | ||
926 | + while (__lo < __hi) | ||
927 | + { | ||
928 | + *__lo = __towupper_l(*__lo, _M_c_locale_ctype); | ||
929 | + ++__lo; | ||
930 | + } | ||
931 | + return __hi; | ||
932 | + } | ||
933 | + | ||
934 | + wchar_t | ||
935 | + ctype<wchar_t>::do_tolower(wchar_t __c) const | ||
936 | + { return __towlower_l(__c, _M_c_locale_ctype); } | ||
937 | + | ||
938 | + const wchar_t* | ||
939 | + ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const | ||
940 | + { | ||
941 | + while (__lo < __hi) | ||
942 | + { | ||
943 | + *__lo = __towlower_l(*__lo, _M_c_locale_ctype); | ||
944 | + ++__lo; | ||
945 | + } | ||
946 | + return __hi; | ||
947 | + } | ||
948 | + | ||
949 | + bool | ||
950 | + ctype<wchar_t>:: | ||
951 | + do_is(mask __m, wchar_t __c) const | ||
952 | + { | ||
953 | + // The case of __m == ctype_base::space is particularly important, | ||
954 | + // due to its use in many istream functions. Therefore we deal with | ||
955 | + // it first, exploiting the knowledge that on GNU systems _M_bit[5] | ||
956 | + // is the mask corresponding to ctype_base::space. NB: an encoding | ||
957 | + // change would not affect correctness! | ||
958 | + bool __ret = false; | ||
959 | + if (__m == _M_bit[5]) | ||
960 | + __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); | ||
961 | + else | ||
962 | + { | ||
963 | + // Highest bitmask in ctype_base == 10, but extra in "C" | ||
964 | + // library for blank. | ||
965 | + const size_t __bitmasksize = 11; | ||
966 | + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
967 | + if (__m & _M_bit[__bitcur]) | ||
968 | + { | ||
969 | + if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
970 | + { | ||
971 | + __ret = true; | ||
972 | + break; | ||
973 | + } | ||
974 | + else if (__m == _M_bit[__bitcur]) | ||
975 | + break; | ||
976 | + } | ||
977 | + } | ||
978 | + return __ret; | ||
979 | + } | ||
980 | + | ||
981 | + const wchar_t* | ||
982 | + ctype<wchar_t>:: | ||
983 | + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const | ||
984 | + { | ||
985 | + for (; __lo < __hi; ++__vec, ++__lo) | ||
986 | + { | ||
987 | + // Highest bitmask in ctype_base == 10, but extra in "C" | ||
988 | + // library for blank. | ||
989 | + const size_t __bitmasksize = 11; | ||
990 | + mask __m = 0; | ||
991 | + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) | ||
992 | + if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) | ||
993 | + __m |= _M_bit[__bitcur]; | ||
994 | + *__vec = __m; | ||
995 | + } | ||
996 | + return __hi; | ||
997 | + } | ||
998 | + | ||
999 | + const wchar_t* | ||
1000 | + ctype<wchar_t>:: | ||
1001 | + do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const | ||
1002 | + { | ||
1003 | + while (__lo < __hi && !this->do_is(__m, *__lo)) | ||
1004 | + ++__lo; | ||
1005 | + return __lo; | ||
1006 | + } | ||
1007 | + | ||
1008 | + const wchar_t* | ||
1009 | + ctype<wchar_t>:: | ||
1010 | + do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const | ||
1011 | + { | ||
1012 | + while (__lo < __hi && this->do_is(__m, *__lo) != 0) | ||
1013 | + ++__lo; | ||
1014 | + return __lo; | ||
1015 | + } | ||
1016 | + | ||
1017 | + wchar_t | ||
1018 | + ctype<wchar_t>:: | ||
1019 | + do_widen(char __c) const | ||
1020 | + { return _M_widen[static_cast<unsigned char>(__c)]; } | ||
1021 | + | ||
1022 | + const char* | ||
1023 | + ctype<wchar_t>:: | ||
1024 | + do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const | ||
1025 | + { | ||
1026 | + while (__lo < __hi) | ||
1027 | + { | ||
1028 | + *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; | ||
1029 | + ++__lo; | ||
1030 | + ++__dest; | ||
1031 | + } | ||
1032 | + return __hi; | ||
1033 | + } | ||
1034 | + | ||
1035 | + char | ||
1036 | + ctype<wchar_t>:: | ||
1037 | + do_narrow(wchar_t __wc, char __dfault) const | ||
1038 | + { | ||
1039 | + if (__wc >= 0 && __wc < 128 && _M_narrow_ok) | ||
1040 | + return _M_narrow[__wc]; | ||
1041 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1042 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1043 | +#endif | ||
1044 | + const int __c = wctob(__wc); | ||
1045 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1046 | + __uselocale(__old); | ||
1047 | +#endif | ||
1048 | + return (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1049 | + } | ||
1050 | + | ||
1051 | + const wchar_t* | ||
1052 | + ctype<wchar_t>:: | ||
1053 | + do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, | ||
1054 | + char* __dest) const | ||
1055 | + { | ||
1056 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1057 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1058 | +#endif | ||
1059 | + if (_M_narrow_ok) | ||
1060 | + while (__lo < __hi) | ||
1061 | + { | ||
1062 | + if (*__lo >= 0 && *__lo < 128) | ||
1063 | + *__dest = _M_narrow[*__lo]; | ||
1064 | + else | ||
1065 | + { | ||
1066 | + const int __c = wctob(*__lo); | ||
1067 | + *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1068 | + } | ||
1069 | + ++__lo; | ||
1070 | + ++__dest; | ||
1071 | + } | ||
1072 | + else | ||
1073 | + while (__lo < __hi) | ||
1074 | + { | ||
1075 | + const int __c = wctob(*__lo); | ||
1076 | + *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); | ||
1077 | + ++__lo; | ||
1078 | + ++__dest; | ||
1079 | + } | ||
1080 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1081 | + __uselocale(__old); | ||
1082 | +#endif | ||
1083 | + return __hi; | ||
1084 | + } | ||
1085 | + | ||
1086 | + void | ||
1087 | + ctype<wchar_t>::_M_initialize_ctype() | ||
1088 | + { | ||
1089 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1090 | + __c_locale __old = __uselocale(_M_c_locale_ctype); | ||
1091 | +#endif | ||
1092 | + wint_t __i; | ||
1093 | + for (__i = 0; __i < 128; ++__i) | ||
1094 | + { | ||
1095 | + const int __c = wctob(__i); | ||
1096 | + if (__c == EOF) | ||
1097 | + break; | ||
1098 | + else | ||
1099 | + _M_narrow[__i] = static_cast<char>(__c); | ||
1100 | + } | ||
1101 | + if (__i == 128) | ||
1102 | + _M_narrow_ok = true; | ||
1103 | + else | ||
1104 | + _M_narrow_ok = false; | ||
1105 | + for (size_t __j = 0; | ||
1106 | + __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) | ||
1107 | + _M_widen[__j] = btowc(__j); | ||
1108 | + | ||
1109 | + for (size_t __k = 0; __k <= 11; ++__k) | ||
1110 | + { | ||
1111 | + _M_bit[__k] = static_cast<mask>(_ISbit(__k)); | ||
1112 | + _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); | ||
1113 | + } | ||
1114 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1115 | + __uselocale(__old); | ||
1116 | +#endif | ||
1117 | + } | ||
1118 | +#endif // _GLIBCXX_USE_WCHAR_T | ||
1119 | +} | ||
1120 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc | ||
1121 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
1122 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
1123 | @@ -0,0 +1,100 @@ | ||
1124 | +// std::messages implementation details, GNU version -*- C++ -*- | ||
1125 | + | ||
1126 | +// Copyright (C) 2001, 2002 Free Software Foundation, Inc. | ||
1127 | +// | ||
1128 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1129 | +// software; you can redistribute it and/or modify it under the | ||
1130 | +// terms of the GNU General Public License as published by the | ||
1131 | +// Free Software Foundation; either version 2, or (at your option) | ||
1132 | +// any later version. | ||
1133 | + | ||
1134 | +// This library is distributed in the hope that it will be useful, | ||
1135 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1136 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1137 | +// GNU General Public License for more details. | ||
1138 | + | ||
1139 | +// You should have received a copy of the GNU General Public License along | ||
1140 | +// with this library; see the file COPYING. If not, write to the Free | ||
1141 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
1142 | +// USA. | ||
1143 | + | ||
1144 | +// As a special exception, you may use this file as part of a free software | ||
1145 | +// library without restriction. Specifically, if other files instantiate | ||
1146 | +// templates or use macros or inline functions from this file, or you compile | ||
1147 | +// this file and link it with other files to produce an executable, this | ||
1148 | +// file does not by itself cause the resulting executable to be covered by | ||
1149 | +// the GNU General Public License. This exception does not however | ||
1150 | +// invalidate any other reasons why the executable file might be covered by | ||
1151 | +// the GNU General Public License. | ||
1152 | + | ||
1153 | +// | ||
1154 | +// ISO C++ 14882: 22.2.7.1.2 messages virtual functions | ||
1155 | +// | ||
1156 | + | ||
1157 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1158 | + | ||
1159 | +#include <locale> | ||
1160 | +#include <bits/c++locale_internal.h> | ||
1161 | + | ||
1162 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1163 | +#warning fix gettext stuff | ||
1164 | +#endif | ||
1165 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
1166 | +extern "C" char *__dcgettext(const char *domainname, | ||
1167 | + const char *msgid, int category); | ||
1168 | +#undef gettext | ||
1169 | +#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) | ||
1170 | +#else | ||
1171 | +#undef gettext | ||
1172 | +#define gettext(msgid) (msgid) | ||
1173 | +#endif | ||
1174 | + | ||
1175 | +namespace std | ||
1176 | +{ | ||
1177 | + // Specializations. | ||
1178 | + template<> | ||
1179 | + string | ||
1180 | + messages<char>::do_get(catalog, int, int, const string& __dfault) const | ||
1181 | + { | ||
1182 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1183 | + __c_locale __old = __uselocale(_M_c_locale_messages); | ||
1184 | + const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); | ||
1185 | + __uselocale(__old); | ||
1186 | + return string(__msg); | ||
1187 | +#elif defined __UCLIBC_HAS_LOCALE__ | ||
1188 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1189 | + setlocale(LC_ALL, _M_name_messages); | ||
1190 | + const char* __msg = gettext(__dfault.c_str()); | ||
1191 | + setlocale(LC_ALL, __old); | ||
1192 | + free(__old); | ||
1193 | + return string(__msg); | ||
1194 | +#else | ||
1195 | + const char* __msg = gettext(__dfault.c_str()); | ||
1196 | + return string(__msg); | ||
1197 | +#endif | ||
1198 | + } | ||
1199 | + | ||
1200 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
1201 | + template<> | ||
1202 | + wstring | ||
1203 | + messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const | ||
1204 | + { | ||
1205 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1206 | + __c_locale __old = __uselocale(_M_c_locale_messages); | ||
1207 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1208 | + __uselocale(__old); | ||
1209 | + return _M_convert_from_char(__msg); | ||
1210 | +# elif defined __UCLIBC_HAS_LOCALE__ | ||
1211 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1212 | + setlocale(LC_ALL, _M_name_messages); | ||
1213 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1214 | + setlocale(LC_ALL, __old); | ||
1215 | + free(__old); | ||
1216 | + return _M_convert_from_char(__msg); | ||
1217 | +# else | ||
1218 | + char* __msg = gettext(_M_convert_to_char(__dfault)); | ||
1219 | + return _M_convert_from_char(__msg); | ||
1220 | +# endif | ||
1221 | + } | ||
1222 | +#endif | ||
1223 | +} | ||
1224 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h | ||
1225 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 17:00:00.000000000 -0700 | ||
1226 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h 2006-03-25 22:18:37.000000000 -0700 | ||
1227 | @@ -0,0 +1,121 @@ | ||
1228 | +// std::messages implementation details, GNU version -*- C++ -*- | ||
1229 | + | ||
1230 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||
1231 | +// | ||
1232 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1233 | +// software; you can redistribute it and/or modify it under the | ||
1234 | +// terms of the GNU General Public License as published by the | ||
1235 | +// Free Software Foundation; either version 2, or (at your option) | ||
1236 | +// any later version. | ||
1237 | + | ||
1238 | +// This library is distributed in the hope that it will be useful, | ||
1239 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1240 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1241 | +// GNU General Public License for more details. | ||
1242 | + | ||
1243 | +// You should have received a copy of the GNU General Public License along | ||
1244 | +// with this library; see the file COPYING. If not, write to the Free | ||
1245 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
1246 | +// USA. | ||
1247 | + | ||
1248 | +// As a special exception, you may use this file as part of a free software | ||
1249 | +// library without restriction. Specifically, if other files instantiate | ||
1250 | +// templates or use macros or inline functions from this file, or you compile | ||
1251 | +// this file and link it with other files to produce an executable, this | ||
1252 | +// file does not by itself cause the resulting executable to be covered by | ||
1253 | +// the GNU General Public License. This exception does not however | ||
1254 | +// invalidate any other reasons why the executable file might be covered by | ||
1255 | +// the GNU General Public License. | ||
1256 | + | ||
1257 | +// | ||
1258 | +// ISO C++ 14882: 22.2.7.1.2 messages functions | ||
1259 | +// | ||
1260 | + | ||
1261 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1262 | + | ||
1263 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1264 | +#warning fix prototypes for *textdomain funcs | ||
1265 | +#endif | ||
1266 | +#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ | ||
1267 | +extern "C" char *__textdomain(const char *domainname); | ||
1268 | +extern "C" char *__bindtextdomain(const char *domainname, | ||
1269 | + const char *dirname); | ||
1270 | +#else | ||
1271 | +#undef __textdomain | ||
1272 | +#undef __bindtextdomain | ||
1273 | +#define __textdomain(D) ((void)0) | ||
1274 | +#define __bindtextdomain(D,P) ((void)0) | ||
1275 | +#endif | ||
1276 | + | ||
1277 | + // Non-virtual member functions. | ||
1278 | + template<typename _CharT> | ||
1279 | + messages<_CharT>::messages(size_t __refs) | ||
1280 | + : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), | ||
1281 | + _M_name_messages(_S_get_c_name()) | ||
1282 | + { } | ||
1283 | + | ||
1284 | + template<typename _CharT> | ||
1285 | + messages<_CharT>::messages(__c_locale __cloc, const char* __s, | ||
1286 | + size_t __refs) | ||
1287 | + : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL) | ||
1288 | + { | ||
1289 | + const size_t __len = std::strlen(__s) + 1; | ||
1290 | + char* __tmp = new char[__len]; | ||
1291 | + std::memcpy(__tmp, __s, __len); | ||
1292 | + _M_name_messages = __tmp; | ||
1293 | + | ||
1294 | + // Last to avoid leaking memory if new throws. | ||
1295 | + _M_c_locale_messages = _S_clone_c_locale(__cloc); | ||
1296 | + } | ||
1297 | + | ||
1298 | + template<typename _CharT> | ||
1299 | + typename messages<_CharT>::catalog | ||
1300 | + messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, | ||
1301 | + const char* __dir) const | ||
1302 | + { | ||
1303 | + __bindtextdomain(__s.c_str(), __dir); | ||
1304 | + return this->do_open(__s, __loc); | ||
1305 | + } | ||
1306 | + | ||
1307 | + // Virtual member functions. | ||
1308 | + template<typename _CharT> | ||
1309 | + messages<_CharT>::~messages() | ||
1310 | + { | ||
1311 | + if (_M_name_messages != _S_get_c_name()) | ||
1312 | + delete [] _M_name_messages; | ||
1313 | + _S_destroy_c_locale(_M_c_locale_messages); | ||
1314 | + } | ||
1315 | + | ||
1316 | + template<typename _CharT> | ||
1317 | + typename messages<_CharT>::catalog | ||
1318 | + messages<_CharT>::do_open(const basic_string<char>& __s, | ||
1319 | + const locale&) const | ||
1320 | + { | ||
1321 | + // No error checking is done, assume the catalog exists and can | ||
1322 | + // be used. | ||
1323 | + __textdomain(__s.c_str()); | ||
1324 | + return 0; | ||
1325 | + } | ||
1326 | + | ||
1327 | + template<typename _CharT> | ||
1328 | + void | ||
1329 | + messages<_CharT>::do_close(catalog) const | ||
1330 | + { } | ||
1331 | + | ||
1332 | + // messages_byname | ||
1333 | + template<typename _CharT> | ||
1334 | + messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) | ||
1335 | + : messages<_CharT>(__refs) | ||
1336 | + { | ||
1337 | + if (this->_M_name_messages != locale::facet::_S_get_c_name()) | ||
1338 | + delete [] this->_M_name_messages; | ||
1339 | + char* __tmp = new char[std::strlen(__s) + 1]; | ||
1340 | + std::strcpy(__tmp, __s); | ||
1341 | + this->_M_name_messages = __tmp; | ||
1342 | + | ||
1343 | + if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) | ||
1344 | + { | ||
1345 | + this->_S_destroy_c_locale(this->_M_c_locale_messages); | ||
1346 | + this->_S_create_c_locale(this->_M_c_locale_messages, __s); | ||
1347 | + } | ||
1348 | + } | ||
1349 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc | ||
1350 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
1351 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
1352 | @@ -0,0 +1,692 @@ | ||
1353 | +// std::moneypunct implementation details, GNU version -*- C++ -*- | ||
1354 | + | ||
1355 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
1356 | +// | ||
1357 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1358 | +// software; you can redistribute it and/or modify it under the | ||
1359 | +// terms of the GNU General Public License as published by the | ||
1360 | +// Free Software Foundation; either version 2, or (at your option) | ||
1361 | +// any later version. | ||
1362 | + | ||
1363 | +// This library is distributed in the hope that it will be useful, | ||
1364 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1365 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1366 | +// GNU General Public License for more details. | ||
1367 | + | ||
1368 | +// You should have received a copy of the GNU General Public License along | ||
1369 | +// with this library; see the file COPYING. If not, write to the Free | ||
1370 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
1371 | +// USA. | ||
1372 | + | ||
1373 | +// As a special exception, you may use this file as part of a free software | ||
1374 | +// library without restriction. Specifically, if other files instantiate | ||
1375 | +// templates or use macros or inline functions from this file, or you compile | ||
1376 | +// this file and link it with other files to produce an executable, this | ||
1377 | +// file does not by itself cause the resulting executable to be covered by | ||
1378 | +// the GNU General Public License. This exception does not however | ||
1379 | +// invalidate any other reasons why the executable file might be covered by | ||
1380 | +// the GNU General Public License. | ||
1381 | + | ||
1382 | +// | ||
1383 | +// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions | ||
1384 | +// | ||
1385 | + | ||
1386 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
1387 | + | ||
1388 | +#define _LIBC | ||
1389 | +#include <locale> | ||
1390 | +#undef _LIBC | ||
1391 | +#include <bits/c++locale_internal.h> | ||
1392 | + | ||
1393 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1394 | +#warning optimize this for uclibc | ||
1395 | +#warning tailor for stub locale support | ||
1396 | +#endif | ||
1397 | + | ||
1398 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
1399 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
1400 | +#endif | ||
1401 | + | ||
1402 | +namespace std | ||
1403 | +{ | ||
1404 | + // Construct and return valid pattern consisting of some combination of: | ||
1405 | + // space none symbol sign value | ||
1406 | + money_base::pattern | ||
1407 | + money_base::_S_construct_pattern(char __precedes, char __space, char __posn) | ||
1408 | + { | ||
1409 | + pattern __ret; | ||
1410 | + | ||
1411 | + // This insanely complicated routine attempts to construct a valid | ||
1412 | + // pattern for use with monyepunct. A couple of invariants: | ||
1413 | + | ||
1414 | + // if (__precedes) symbol -> value | ||
1415 | + // else value -> symbol | ||
1416 | + | ||
1417 | + // if (__space) space | ||
1418 | + // else none | ||
1419 | + | ||
1420 | + // none == never first | ||
1421 | + // space never first or last | ||
1422 | + | ||
1423 | + // Any elegant implementations of this are welcome. | ||
1424 | + switch (__posn) | ||
1425 | + { | ||
1426 | + case 0: | ||
1427 | + case 1: | ||
1428 | + // 1 The sign precedes the value and symbol. | ||
1429 | + __ret.field[0] = sign; | ||
1430 | + if (__space) | ||
1431 | + { | ||
1432 | + // Pattern starts with sign. | ||
1433 | + if (__precedes) | ||
1434 | + { | ||
1435 | + __ret.field[1] = symbol; | ||
1436 | + __ret.field[3] = value; | ||
1437 | + } | ||
1438 | + else | ||
1439 | + { | ||
1440 | + __ret.field[1] = value; | ||
1441 | + __ret.field[3] = symbol; | ||
1442 | + } | ||
1443 | + __ret.field[2] = space; | ||
1444 | + } | ||
1445 | + else | ||
1446 | + { | ||
1447 | + // Pattern starts with sign and ends with none. | ||
1448 | + if (__precedes) | ||
1449 | + { | ||
1450 | + __ret.field[1] = symbol; | ||
1451 | + __ret.field[2] = value; | ||
1452 | + } | ||
1453 | + else | ||
1454 | + { | ||
1455 | + __ret.field[1] = value; | ||
1456 | + __ret.field[2] = symbol; | ||
1457 | + } | ||
1458 | + __ret.field[3] = none; | ||
1459 | + } | ||
1460 | + break; | ||
1461 | + case 2: | ||
1462 | + // 2 The sign follows the value and symbol. | ||
1463 | + if (__space) | ||
1464 | + { | ||
1465 | + // Pattern either ends with sign. | ||
1466 | + if (__precedes) | ||
1467 | + { | ||
1468 | + __ret.field[0] = symbol; | ||
1469 | + __ret.field[2] = value; | ||
1470 | + } | ||
1471 | + else | ||
1472 | + { | ||
1473 | + __ret.field[0] = value; | ||
1474 | + __ret.field[2] = symbol; | ||
1475 | + } | ||
1476 | + __ret.field[1] = space; | ||
1477 | + __ret.field[3] = sign; | ||
1478 | + } | ||
1479 | + else | ||
1480 | + { | ||
1481 | + // Pattern ends with sign then none. | ||
1482 | + if (__precedes) | ||
1483 | + { | ||
1484 | + __ret.field[0] = symbol; | ||
1485 | + __ret.field[1] = value; | ||
1486 | + } | ||
1487 | + else | ||
1488 | + { | ||
1489 | + __ret.field[0] = value; | ||
1490 | + __ret.field[1] = symbol; | ||
1491 | + } | ||
1492 | + __ret.field[2] = sign; | ||
1493 | + __ret.field[3] = none; | ||
1494 | + } | ||
1495 | + break; | ||
1496 | + case 3: | ||
1497 | + // 3 The sign immediately precedes the symbol. | ||
1498 | + if (__precedes) | ||
1499 | + { | ||
1500 | + __ret.field[0] = sign; | ||
1501 | + __ret.field[1] = symbol; | ||
1502 | + if (__space) | ||
1503 | + { | ||
1504 | + __ret.field[2] = space; | ||
1505 | + __ret.field[3] = value; | ||
1506 | + } | ||
1507 | + else | ||
1508 | + { | ||
1509 | + __ret.field[2] = value; | ||
1510 | + __ret.field[3] = none; | ||
1511 | + } | ||
1512 | + } | ||
1513 | + else | ||
1514 | + { | ||
1515 | + __ret.field[0] = value; | ||
1516 | + if (__space) | ||
1517 | + { | ||
1518 | + __ret.field[1] = space; | ||
1519 | + __ret.field[2] = sign; | ||
1520 | + __ret.field[3] = symbol; | ||
1521 | + } | ||
1522 | + else | ||
1523 | + { | ||
1524 | + __ret.field[1] = sign; | ||
1525 | + __ret.field[2] = symbol; | ||
1526 | + __ret.field[3] = none; | ||
1527 | + } | ||
1528 | + } | ||
1529 | + break; | ||
1530 | + case 4: | ||
1531 | + // 4 The sign immediately follows the symbol. | ||
1532 | + if (__precedes) | ||
1533 | + { | ||
1534 | + __ret.field[0] = symbol; | ||
1535 | + __ret.field[1] = sign; | ||
1536 | + if (__space) | ||
1537 | + { | ||
1538 | + __ret.field[2] = space; | ||
1539 | + __ret.field[3] = value; | ||
1540 | + } | ||
1541 | + else | ||
1542 | + { | ||
1543 | + __ret.field[2] = value; | ||
1544 | + __ret.field[3] = none; | ||
1545 | + } | ||
1546 | + } | ||
1547 | + else | ||
1548 | + { | ||
1549 | + __ret.field[0] = value; | ||
1550 | + if (__space) | ||
1551 | + { | ||
1552 | + __ret.field[1] = space; | ||
1553 | + __ret.field[2] = symbol; | ||
1554 | + __ret.field[3] = sign; | ||
1555 | + } | ||
1556 | + else | ||
1557 | + { | ||
1558 | + __ret.field[1] = symbol; | ||
1559 | + __ret.field[2] = sign; | ||
1560 | + __ret.field[3] = none; | ||
1561 | + } | ||
1562 | + } | ||
1563 | + break; | ||
1564 | + default: | ||
1565 | + __ret = pattern(); | ||
1566 | + } | ||
1567 | + return __ret; | ||
1568 | + } | ||
1569 | + | ||
1570 | + template<> | ||
1571 | + void | ||
1572 | + moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1573 | + const char*) | ||
1574 | + { | ||
1575 | + if (!_M_data) | ||
1576 | + _M_data = new __moneypunct_cache<char, true>; | ||
1577 | + | ||
1578 | + if (!__cloc) | ||
1579 | + { | ||
1580 | + // "C" locale | ||
1581 | + _M_data->_M_decimal_point = '.'; | ||
1582 | + _M_data->_M_thousands_sep = ','; | ||
1583 | + _M_data->_M_grouping = ""; | ||
1584 | + _M_data->_M_grouping_size = 0; | ||
1585 | + _M_data->_M_curr_symbol = ""; | ||
1586 | + _M_data->_M_curr_symbol_size = 0; | ||
1587 | + _M_data->_M_positive_sign = ""; | ||
1588 | + _M_data->_M_positive_sign_size = 0; | ||
1589 | + _M_data->_M_negative_sign = ""; | ||
1590 | + _M_data->_M_negative_sign_size = 0; | ||
1591 | + _M_data->_M_frac_digits = 0; | ||
1592 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1593 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1594 | + | ||
1595 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1596 | + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; | ||
1597 | + } | ||
1598 | + else | ||
1599 | + { | ||
1600 | + // Named locale. | ||
1601 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, | ||
1602 | + __cloc)); | ||
1603 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, | ||
1604 | + __cloc)); | ||
1605 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1606 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1607 | + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1608 | + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); | ||
1609 | + | ||
1610 | + char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); | ||
1611 | + if (!__nposn) | ||
1612 | + _M_data->_M_negative_sign = "()"; | ||
1613 | + else | ||
1614 | + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, | ||
1615 | + __cloc); | ||
1616 | + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); | ||
1617 | + | ||
1618 | + // _Intl == true | ||
1619 | + _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); | ||
1620 | + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); | ||
1621 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, | ||
1622 | + __cloc)); | ||
1623 | + char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); | ||
1624 | + char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); | ||
1625 | + char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); | ||
1626 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1627 | + __pposn); | ||
1628 | + char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); | ||
1629 | + char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); | ||
1630 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1631 | + __nposn); | ||
1632 | + } | ||
1633 | + } | ||
1634 | + | ||
1635 | + template<> | ||
1636 | + void | ||
1637 | + moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1638 | + const char*) | ||
1639 | + { | ||
1640 | + if (!_M_data) | ||
1641 | + _M_data = new __moneypunct_cache<char, false>; | ||
1642 | + | ||
1643 | + if (!__cloc) | ||
1644 | + { | ||
1645 | + // "C" locale | ||
1646 | + _M_data->_M_decimal_point = '.'; | ||
1647 | + _M_data->_M_thousands_sep = ','; | ||
1648 | + _M_data->_M_grouping = ""; | ||
1649 | + _M_data->_M_grouping_size = 0; | ||
1650 | + _M_data->_M_curr_symbol = ""; | ||
1651 | + _M_data->_M_curr_symbol_size = 0; | ||
1652 | + _M_data->_M_positive_sign = ""; | ||
1653 | + _M_data->_M_positive_sign_size = 0; | ||
1654 | + _M_data->_M_negative_sign = ""; | ||
1655 | + _M_data->_M_negative_sign_size = 0; | ||
1656 | + _M_data->_M_frac_digits = 0; | ||
1657 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1658 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1659 | + | ||
1660 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1661 | + _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; | ||
1662 | + } | ||
1663 | + else | ||
1664 | + { | ||
1665 | + // Named locale. | ||
1666 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, | ||
1667 | + __cloc)); | ||
1668 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, | ||
1669 | + __cloc)); | ||
1670 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1671 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1672 | + _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1673 | + _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); | ||
1674 | + | ||
1675 | + char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); | ||
1676 | + if (!__nposn) | ||
1677 | + _M_data->_M_negative_sign = "()"; | ||
1678 | + else | ||
1679 | + _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, | ||
1680 | + __cloc); | ||
1681 | + _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); | ||
1682 | + | ||
1683 | + // _Intl == false | ||
1684 | + _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); | ||
1685 | + _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); | ||
1686 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); | ||
1687 | + char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); | ||
1688 | + char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); | ||
1689 | + char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); | ||
1690 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1691 | + __pposn); | ||
1692 | + char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); | ||
1693 | + char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); | ||
1694 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1695 | + __nposn); | ||
1696 | + } | ||
1697 | + } | ||
1698 | + | ||
1699 | + template<> | ||
1700 | + moneypunct<char, true>::~moneypunct() | ||
1701 | + { delete _M_data; } | ||
1702 | + | ||
1703 | + template<> | ||
1704 | + moneypunct<char, false>::~moneypunct() | ||
1705 | + { delete _M_data; } | ||
1706 | + | ||
1707 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
1708 | + template<> | ||
1709 | + void | ||
1710 | + moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1711 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1712 | + const char*) | ||
1713 | +#else | ||
1714 | + const char* __name) | ||
1715 | +#endif | ||
1716 | + { | ||
1717 | + if (!_M_data) | ||
1718 | + _M_data = new __moneypunct_cache<wchar_t, true>; | ||
1719 | + | ||
1720 | + if (!__cloc) | ||
1721 | + { | ||
1722 | + // "C" locale | ||
1723 | + _M_data->_M_decimal_point = L'.'; | ||
1724 | + _M_data->_M_thousands_sep = L','; | ||
1725 | + _M_data->_M_grouping = ""; | ||
1726 | + _M_data->_M_grouping_size = 0; | ||
1727 | + _M_data->_M_curr_symbol = L""; | ||
1728 | + _M_data->_M_curr_symbol_size = 0; | ||
1729 | + _M_data->_M_positive_sign = L""; | ||
1730 | + _M_data->_M_positive_sign_size = 0; | ||
1731 | + _M_data->_M_negative_sign = L""; | ||
1732 | + _M_data->_M_negative_sign_size = 0; | ||
1733 | + _M_data->_M_frac_digits = 0; | ||
1734 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1735 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1736 | + | ||
1737 | + // Use ctype::widen code without the facet... | ||
1738 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1739 | + _M_data->_M_atoms[__i] = | ||
1740 | + static_cast<wchar_t>(money_base::_S_atoms[__i]); | ||
1741 | + } | ||
1742 | + else | ||
1743 | + { | ||
1744 | + // Named locale. | ||
1745 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1746 | + __c_locale __old = __uselocale(__cloc); | ||
1747 | +#else | ||
1748 | + // Switch to named locale so that mbsrtowcs will work. | ||
1749 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1750 | + setlocale(LC_ALL, __name); | ||
1751 | +#endif | ||
1752 | + | ||
1753 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1754 | +#warning fix this... should be monetary | ||
1755 | +#endif | ||
1756 | +#ifdef __UCLIBC__ | ||
1757 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1758 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
1759 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
1760 | +# else | ||
1761 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
1762 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
1763 | +# endif | ||
1764 | +#else | ||
1765 | + union { char *__s; wchar_t __w; } __u; | ||
1766 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); | ||
1767 | + _M_data->_M_decimal_point = __u.__w; | ||
1768 | + | ||
1769 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); | ||
1770 | + _M_data->_M_thousands_sep = __u.__w; | ||
1771 | +#endif | ||
1772 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1773 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1774 | + | ||
1775 | + const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1776 | + const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); | ||
1777 | + const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); | ||
1778 | + | ||
1779 | + wchar_t* __wcs_ps = 0; | ||
1780 | + wchar_t* __wcs_ns = 0; | ||
1781 | + const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); | ||
1782 | + try | ||
1783 | + { | ||
1784 | + mbstate_t __state; | ||
1785 | + size_t __len = strlen(__cpossign); | ||
1786 | + if (__len) | ||
1787 | + { | ||
1788 | + ++__len; | ||
1789 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1790 | + __wcs_ps = new wchar_t[__len]; | ||
1791 | + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); | ||
1792 | + _M_data->_M_positive_sign = __wcs_ps; | ||
1793 | + } | ||
1794 | + else | ||
1795 | + _M_data->_M_positive_sign = L""; | ||
1796 | + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); | ||
1797 | + | ||
1798 | + __len = strlen(__cnegsign); | ||
1799 | + if (!__nposn) | ||
1800 | + _M_data->_M_negative_sign = L"()"; | ||
1801 | + else if (__len) | ||
1802 | + { | ||
1803 | + ++__len; | ||
1804 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1805 | + __wcs_ns = new wchar_t[__len]; | ||
1806 | + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); | ||
1807 | + _M_data->_M_negative_sign = __wcs_ns; | ||
1808 | + } | ||
1809 | + else | ||
1810 | + _M_data->_M_negative_sign = L""; | ||
1811 | + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); | ||
1812 | + | ||
1813 | + // _Intl == true. | ||
1814 | + __len = strlen(__ccurr); | ||
1815 | + if (__len) | ||
1816 | + { | ||
1817 | + ++__len; | ||
1818 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1819 | + wchar_t* __wcs = new wchar_t[__len]; | ||
1820 | + mbsrtowcs(__wcs, &__ccurr, __len, &__state); | ||
1821 | + _M_data->_M_curr_symbol = __wcs; | ||
1822 | + } | ||
1823 | + else | ||
1824 | + _M_data->_M_curr_symbol = L""; | ||
1825 | + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); | ||
1826 | + } | ||
1827 | + catch (...) | ||
1828 | + { | ||
1829 | + delete _M_data; | ||
1830 | + _M_data = 0; | ||
1831 | + delete __wcs_ps; | ||
1832 | + delete __wcs_ns; | ||
1833 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1834 | + __uselocale(__old); | ||
1835 | +#else | ||
1836 | + setlocale(LC_ALL, __old); | ||
1837 | + free(__old); | ||
1838 | +#endif | ||
1839 | + __throw_exception_again; | ||
1840 | + } | ||
1841 | + | ||
1842 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, | ||
1843 | + __cloc)); | ||
1844 | + char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); | ||
1845 | + char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); | ||
1846 | + char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); | ||
1847 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
1848 | + __pposn); | ||
1849 | + char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); | ||
1850 | + char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); | ||
1851 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
1852 | + __nposn); | ||
1853 | + | ||
1854 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1855 | + __uselocale(__old); | ||
1856 | +#else | ||
1857 | + setlocale(LC_ALL, __old); | ||
1858 | + free(__old); | ||
1859 | +#endif | ||
1860 | + } | ||
1861 | + } | ||
1862 | + | ||
1863 | + template<> | ||
1864 | + void | ||
1865 | + moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, | ||
1866 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1867 | + const char*) | ||
1868 | +#else | ||
1869 | + const char* __name) | ||
1870 | +#endif | ||
1871 | + { | ||
1872 | + if (!_M_data) | ||
1873 | + _M_data = new __moneypunct_cache<wchar_t, false>; | ||
1874 | + | ||
1875 | + if (!__cloc) | ||
1876 | + { | ||
1877 | + // "C" locale | ||
1878 | + _M_data->_M_decimal_point = L'.'; | ||
1879 | + _M_data->_M_thousands_sep = L','; | ||
1880 | + _M_data->_M_grouping = ""; | ||
1881 | + _M_data->_M_grouping_size = 0; | ||
1882 | + _M_data->_M_curr_symbol = L""; | ||
1883 | + _M_data->_M_curr_symbol_size = 0; | ||
1884 | + _M_data->_M_positive_sign = L""; | ||
1885 | + _M_data->_M_positive_sign_size = 0; | ||
1886 | + _M_data->_M_negative_sign = L""; | ||
1887 | + _M_data->_M_negative_sign_size = 0; | ||
1888 | + _M_data->_M_frac_digits = 0; | ||
1889 | + _M_data->_M_pos_format = money_base::_S_default_pattern; | ||
1890 | + _M_data->_M_neg_format = money_base::_S_default_pattern; | ||
1891 | + | ||
1892 | + // Use ctype::widen code without the facet... | ||
1893 | + for (size_t __i = 0; __i < money_base::_S_end; ++__i) | ||
1894 | + _M_data->_M_atoms[__i] = | ||
1895 | + static_cast<wchar_t>(money_base::_S_atoms[__i]); | ||
1896 | + } | ||
1897 | + else | ||
1898 | + { | ||
1899 | + // Named locale. | ||
1900 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1901 | + __c_locale __old = __uselocale(__cloc); | ||
1902 | +#else | ||
1903 | + // Switch to named locale so that mbsrtowcs will work. | ||
1904 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
1905 | + setlocale(LC_ALL, __name); | ||
1906 | +#endif | ||
1907 | + | ||
1908 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
1909 | +#warning fix this... should be monetary | ||
1910 | +#endif | ||
1911 | +#ifdef __UCLIBC__ | ||
1912 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
1913 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
1914 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
1915 | +# else | ||
1916 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
1917 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
1918 | +# endif | ||
1919 | +#else | ||
1920 | + union { char *__s; wchar_t __w; } __u; | ||
1921 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); | ||
1922 | + _M_data->_M_decimal_point = __u.__w; | ||
1923 | + | ||
1924 | + __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); | ||
1925 | + _M_data->_M_thousands_sep = __u.__w; | ||
1926 | +#endif | ||
1927 | + _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); | ||
1928 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
1929 | + | ||
1930 | + const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); | ||
1931 | + const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); | ||
1932 | + const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); | ||
1933 | + | ||
1934 | + wchar_t* __wcs_ps = 0; | ||
1935 | + wchar_t* __wcs_ns = 0; | ||
1936 | + const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); | ||
1937 | + try | ||
1938 | + { | ||
1939 | + mbstate_t __state; | ||
1940 | + size_t __len; | ||
1941 | + __len = strlen(__cpossign); | ||
1942 | + if (__len) | ||
1943 | + { | ||
1944 | + ++__len; | ||
1945 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1946 | + __wcs_ps = new wchar_t[__len]; | ||
1947 | + mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); | ||
1948 | + _M_data->_M_positive_sign = __wcs_ps; | ||
1949 | + } | ||
1950 | + else | ||
1951 | + _M_data->_M_positive_sign = L""; | ||
1952 | + _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); | ||
1953 | + | ||
1954 | + __len = strlen(__cnegsign); | ||
1955 | + if (!__nposn) | ||
1956 | + _M_data->_M_negative_sign = L"()"; | ||
1957 | + else if (__len) | ||
1958 | + { | ||
1959 | + ++__len; | ||
1960 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1961 | + __wcs_ns = new wchar_t[__len]; | ||
1962 | + mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); | ||
1963 | + _M_data->_M_negative_sign = __wcs_ns; | ||
1964 | + } | ||
1965 | + else | ||
1966 | + _M_data->_M_negative_sign = L""; | ||
1967 | + _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); | ||
1968 | + | ||
1969 | + // _Intl == true. | ||
1970 | + __len = strlen(__ccurr); | ||
1971 | + if (__len) | ||
1972 | + { | ||
1973 | + ++__len; | ||
1974 | + memset(&__state, 0, sizeof(mbstate_t)); | ||
1975 | + wchar_t* __wcs = new wchar_t[__len]; | ||
1976 | + mbsrtowcs(__wcs, &__ccurr, __len, &__state); | ||
1977 | + _M_data->_M_curr_symbol = __wcs; | ||
1978 | + } | ||
1979 | + else | ||
1980 | + _M_data->_M_curr_symbol = L""; | ||
1981 | + _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); | ||
1982 | + } | ||
1983 | + catch (...) | ||
1984 | + { | ||
1985 | + delete _M_data; | ||
1986 | + _M_data = 0; | ||
1987 | + delete __wcs_ps; | ||
1988 | + delete __wcs_ns; | ||
1989 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
1990 | + __uselocale(__old); | ||
1991 | +#else | ||
1992 | + setlocale(LC_ALL, __old); | ||
1993 | + free(__old); | ||
1994 | +#endif | ||
1995 | + __throw_exception_again; | ||
1996 | + } | ||
1997 | + | ||
1998 | + _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); | ||
1999 | + char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); | ||
2000 | + char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); | ||
2001 | + char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); | ||
2002 | + _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, | ||
2003 | + __pposn); | ||
2004 | + char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); | ||
2005 | + char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); | ||
2006 | + _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, | ||
2007 | + __nposn); | ||
2008 | + | ||
2009 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2010 | + __uselocale(__old); | ||
2011 | +#else | ||
2012 | + setlocale(LC_ALL, __old); | ||
2013 | + free(__old); | ||
2014 | +#endif | ||
2015 | + } | ||
2016 | + } | ||
2017 | + | ||
2018 | + template<> | ||
2019 | + moneypunct<wchar_t, true>::~moneypunct() | ||
2020 | + { | ||
2021 | + if (_M_data->_M_positive_sign_size) | ||
2022 | + delete [] _M_data->_M_positive_sign; | ||
2023 | + if (_M_data->_M_negative_sign_size | ||
2024 | + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) | ||
2025 | + delete [] _M_data->_M_negative_sign; | ||
2026 | + if (_M_data->_M_curr_symbol_size) | ||
2027 | + delete [] _M_data->_M_curr_symbol; | ||
2028 | + delete _M_data; | ||
2029 | + } | ||
2030 | + | ||
2031 | + template<> | ||
2032 | + moneypunct<wchar_t, false>::~moneypunct() | ||
2033 | + { | ||
2034 | + if (_M_data->_M_positive_sign_size) | ||
2035 | + delete [] _M_data->_M_positive_sign; | ||
2036 | + if (_M_data->_M_negative_sign_size | ||
2037 | + && wcscmp(_M_data->_M_negative_sign, L"()") != 0) | ||
2038 | + delete [] _M_data->_M_negative_sign; | ||
2039 | + if (_M_data->_M_curr_symbol_size) | ||
2040 | + delete [] _M_data->_M_curr_symbol; | ||
2041 | + delete _M_data; | ||
2042 | + } | ||
2043 | +#endif | ||
2044 | +} | ||
2045 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc | ||
2046 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
2047 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
2048 | @@ -0,0 +1,173 @@ | ||
2049 | +// std::numpunct implementation details, GNU version -*- C++ -*- | ||
2050 | + | ||
2051 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
2052 | +// | ||
2053 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2054 | +// software; you can redistribute it and/or modify it under the | ||
2055 | +// terms of the GNU General Public License as published by the | ||
2056 | +// Free Software Foundation; either version 2, or (at your option) | ||
2057 | +// any later version. | ||
2058 | + | ||
2059 | +// This library is distributed in the hope that it will be useful, | ||
2060 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2061 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2062 | +// GNU General Public License for more details. | ||
2063 | + | ||
2064 | +// You should have received a copy of the GNU General Public License along | ||
2065 | +// with this library; see the file COPYING. If not, write to the Free | ||
2066 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
2067 | +// USA. | ||
2068 | + | ||
2069 | +// As a special exception, you may use this file as part of a free software | ||
2070 | +// library without restriction. Specifically, if other files instantiate | ||
2071 | +// templates or use macros or inline functions from this file, or you compile | ||
2072 | +// this file and link it with other files to produce an executable, this | ||
2073 | +// file does not by itself cause the resulting executable to be covered by | ||
2074 | +// the GNU General Public License. This exception does not however | ||
2075 | +// invalidate any other reasons why the executable file might be covered by | ||
2076 | +// the GNU General Public License. | ||
2077 | + | ||
2078 | +// | ||
2079 | +// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions | ||
2080 | +// | ||
2081 | + | ||
2082 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2083 | + | ||
2084 | +#define _LIBC | ||
2085 | +#include <locale> | ||
2086 | +#undef _LIBC | ||
2087 | +#include <bits/c++locale_internal.h> | ||
2088 | + | ||
2089 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2090 | +#warning tailor for stub locale support | ||
2091 | +#endif | ||
2092 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
2093 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
2094 | +#endif | ||
2095 | + | ||
2096 | +namespace std | ||
2097 | +{ | ||
2098 | + template<> | ||
2099 | + void | ||
2100 | + numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) | ||
2101 | + { | ||
2102 | + if (!_M_data) | ||
2103 | + _M_data = new __numpunct_cache<char>; | ||
2104 | + | ||
2105 | + if (!__cloc) | ||
2106 | + { | ||
2107 | + // "C" locale | ||
2108 | + _M_data->_M_grouping = ""; | ||
2109 | + _M_data->_M_grouping_size = 0; | ||
2110 | + _M_data->_M_use_grouping = false; | ||
2111 | + | ||
2112 | + _M_data->_M_decimal_point = '.'; | ||
2113 | + _M_data->_M_thousands_sep = ','; | ||
2114 | + | ||
2115 | + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) | ||
2116 | + _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; | ||
2117 | + | ||
2118 | + for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) | ||
2119 | + _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; | ||
2120 | + } | ||
2121 | + else | ||
2122 | + { | ||
2123 | + // Named locale. | ||
2124 | + _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, | ||
2125 | + __cloc)); | ||
2126 | + _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, | ||
2127 | + __cloc)); | ||
2128 | + | ||
2129 | + // Check for NULL, which implies no grouping. | ||
2130 | + if (_M_data->_M_thousands_sep == '\0') | ||
2131 | + _M_data->_M_grouping = ""; | ||
2132 | + else | ||
2133 | + _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); | ||
2134 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
2135 | + } | ||
2136 | + | ||
2137 | + // NB: There is no way to extact this info from posix locales. | ||
2138 | + // _M_truename = __nl_langinfo_l(YESSTR, __cloc); | ||
2139 | + _M_data->_M_truename = "true"; | ||
2140 | + _M_data->_M_truename_size = 4; | ||
2141 | + // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); | ||
2142 | + _M_data->_M_falsename = "false"; | ||
2143 | + _M_data->_M_falsename_size = 5; | ||
2144 | + } | ||
2145 | + | ||
2146 | + template<> | ||
2147 | + numpunct<char>::~numpunct() | ||
2148 | + { delete _M_data; } | ||
2149 | + | ||
2150 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
2151 | + template<> | ||
2152 | + void | ||
2153 | + numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) | ||
2154 | + { | ||
2155 | + if (!_M_data) | ||
2156 | + _M_data = new __numpunct_cache<wchar_t>; | ||
2157 | + | ||
2158 | + if (!__cloc) | ||
2159 | + { | ||
2160 | + // "C" locale | ||
2161 | + _M_data->_M_grouping = ""; | ||
2162 | + _M_data->_M_grouping_size = 0; | ||
2163 | + _M_data->_M_use_grouping = false; | ||
2164 | + | ||
2165 | + _M_data->_M_decimal_point = L'.'; | ||
2166 | + _M_data->_M_thousands_sep = L','; | ||
2167 | + | ||
2168 | + // Use ctype::widen code without the facet... | ||
2169 | + for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) | ||
2170 | + _M_data->_M_atoms_out[__i] = | ||
2171 | + static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); | ||
2172 | + | ||
2173 | + for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) | ||
2174 | + _M_data->_M_atoms_in[__j] = | ||
2175 | + static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); | ||
2176 | + } | ||
2177 | + else | ||
2178 | + { | ||
2179 | + // Named locale. | ||
2180 | + // NB: In the GNU model wchar_t is always 32 bit wide. | ||
2181 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2182 | +#warning fix this | ||
2183 | +#endif | ||
2184 | +#ifdef __UCLIBC__ | ||
2185 | +# ifdef __UCLIBC_HAS_XLOCALE__ | ||
2186 | + _M_data->_M_decimal_point = __cloc->decimal_point_wc; | ||
2187 | + _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; | ||
2188 | +# else | ||
2189 | + _M_data->_M_decimal_point = __global_locale->decimal_point_wc; | ||
2190 | + _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; | ||
2191 | +# endif | ||
2192 | +#else | ||
2193 | + union { char *__s; wchar_t __w; } __u; | ||
2194 | + __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); | ||
2195 | + _M_data->_M_decimal_point = __u.__w; | ||
2196 | + | ||
2197 | + __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); | ||
2198 | + _M_data->_M_thousands_sep = __u.__w; | ||
2199 | +#endif | ||
2200 | + | ||
2201 | + if (_M_data->_M_thousands_sep == L'\0') | ||
2202 | + _M_data->_M_grouping = ""; | ||
2203 | + else | ||
2204 | + _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); | ||
2205 | + _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); | ||
2206 | + } | ||
2207 | + | ||
2208 | + // NB: There is no way to extact this info from posix locales. | ||
2209 | + // _M_truename = __nl_langinfo_l(YESSTR, __cloc); | ||
2210 | + _M_data->_M_truename = L"true"; | ||
2211 | + _M_data->_M_truename_size = 4; | ||
2212 | + // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); | ||
2213 | + _M_data->_M_falsename = L"false"; | ||
2214 | + _M_data->_M_falsename_size = 5; | ||
2215 | + } | ||
2216 | + | ||
2217 | + template<> | ||
2218 | + numpunct<wchar_t>::~numpunct() | ||
2219 | + { delete _M_data; } | ||
2220 | + #endif | ||
2221 | +} | ||
2222 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc | ||
2223 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 17:00:00.000000000 -0700 | ||
2224 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc 2006-03-25 22:18:37.000000000 -0700 | ||
2225 | @@ -0,0 +1,406 @@ | ||
2226 | +// std::time_get, std::time_put implementation, GNU version -*- C++ -*- | ||
2227 | + | ||
2228 | +// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | ||
2229 | +// | ||
2230 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2231 | +// software; you can redistribute it and/or modify it under the | ||
2232 | +// terms of the GNU General Public License as published by the | ||
2233 | +// Free Software Foundation; either version 2, or (at your option) | ||
2234 | +// any later version. | ||
2235 | + | ||
2236 | +// This library is distributed in the hope that it will be useful, | ||
2237 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2238 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2239 | +// GNU General Public License for more details. | ||
2240 | + | ||
2241 | +// You should have received a copy of the GNU General Public License along | ||
2242 | +// with this library; see the file COPYING. If not, write to the Free | ||
2243 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
2244 | +// USA. | ||
2245 | + | ||
2246 | +// As a special exception, you may use this file as part of a free software | ||
2247 | +// library without restriction. Specifically, if other files instantiate | ||
2248 | +// templates or use macros or inline functions from this file, or you compile | ||
2249 | +// this file and link it with other files to produce an executable, this | ||
2250 | +// file does not by itself cause the resulting executable to be covered by | ||
2251 | +// the GNU General Public License. This exception does not however | ||
2252 | +// invalidate any other reasons why the executable file might be covered by | ||
2253 | +// the GNU General Public License. | ||
2254 | + | ||
2255 | +// | ||
2256 | +// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions | ||
2257 | +// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions | ||
2258 | +// | ||
2259 | + | ||
2260 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2261 | + | ||
2262 | +#include <locale> | ||
2263 | +#include <bits/c++locale_internal.h> | ||
2264 | + | ||
2265 | +#ifdef __UCLIBC_MJN3_ONLY__ | ||
2266 | +#warning tailor for stub locale support | ||
2267 | +#endif | ||
2268 | +#ifndef __UCLIBC_HAS_XLOCALE__ | ||
2269 | +#define __nl_langinfo_l(N, L) nl_langinfo((N)) | ||
2270 | +#endif | ||
2271 | + | ||
2272 | +namespace std | ||
2273 | +{ | ||
2274 | + template<> | ||
2275 | + void | ||
2276 | + __timepunct<char>:: | ||
2277 | + _M_put(char* __s, size_t __maxlen, const char* __format, | ||
2278 | + const tm* __tm) const | ||
2279 | + { | ||
2280 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2281 | + const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, | ||
2282 | + _M_c_locale_timepunct); | ||
2283 | +#else | ||
2284 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
2285 | + setlocale(LC_ALL, _M_name_timepunct); | ||
2286 | + const size_t __len = strftime(__s, __maxlen, __format, __tm); | ||
2287 | + setlocale(LC_ALL, __old); | ||
2288 | + free(__old); | ||
2289 | +#endif | ||
2290 | + // Make sure __s is null terminated. | ||
2291 | + if (__len == 0) | ||
2292 | + __s[0] = '\0'; | ||
2293 | + } | ||
2294 | + | ||
2295 | + template<> | ||
2296 | + void | ||
2297 | + __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) | ||
2298 | + { | ||
2299 | + if (!_M_data) | ||
2300 | + _M_data = new __timepunct_cache<char>; | ||
2301 | + | ||
2302 | + if (!__cloc) | ||
2303 | + { | ||
2304 | + // "C" locale | ||
2305 | + _M_c_locale_timepunct = _S_get_c_locale(); | ||
2306 | + | ||
2307 | + _M_data->_M_date_format = "%m/%d/%y"; | ||
2308 | + _M_data->_M_date_era_format = "%m/%d/%y"; | ||
2309 | + _M_data->_M_time_format = "%H:%M:%S"; | ||
2310 | + _M_data->_M_time_era_format = "%H:%M:%S"; | ||
2311 | + _M_data->_M_date_time_format = ""; | ||
2312 | + _M_data->_M_date_time_era_format = ""; | ||
2313 | + _M_data->_M_am = "AM"; | ||
2314 | + _M_data->_M_pm = "PM"; | ||
2315 | + _M_data->_M_am_pm_format = ""; | ||
2316 | + | ||
2317 | + // Day names, starting with "C"'s Sunday. | ||
2318 | + _M_data->_M_day1 = "Sunday"; | ||
2319 | + _M_data->_M_day2 = "Monday"; | ||
2320 | + _M_data->_M_day3 = "Tuesday"; | ||
2321 | + _M_data->_M_day4 = "Wednesday"; | ||
2322 | + _M_data->_M_day5 = "Thursday"; | ||
2323 | + _M_data->_M_day6 = "Friday"; | ||
2324 | + _M_data->_M_day7 = "Saturday"; | ||
2325 | + | ||
2326 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2327 | + _M_data->_M_aday1 = "Sun"; | ||
2328 | + _M_data->_M_aday2 = "Mon"; | ||
2329 | + _M_data->_M_aday3 = "Tue"; | ||
2330 | + _M_data->_M_aday4 = "Wed"; | ||
2331 | + _M_data->_M_aday5 = "Thu"; | ||
2332 | + _M_data->_M_aday6 = "Fri"; | ||
2333 | + _M_data->_M_aday7 = "Sat"; | ||
2334 | + | ||
2335 | + // Month names, starting with "C"'s January. | ||
2336 | + _M_data->_M_month01 = "January"; | ||
2337 | + _M_data->_M_month02 = "February"; | ||
2338 | + _M_data->_M_month03 = "March"; | ||
2339 | + _M_data->_M_month04 = "April"; | ||
2340 | + _M_data->_M_month05 = "May"; | ||
2341 | + _M_data->_M_month06 = "June"; | ||
2342 | + _M_data->_M_month07 = "July"; | ||
2343 | + _M_data->_M_month08 = "August"; | ||
2344 | + _M_data->_M_month09 = "September"; | ||
2345 | + _M_data->_M_month10 = "October"; | ||
2346 | + _M_data->_M_month11 = "November"; | ||
2347 | + _M_data->_M_month12 = "December"; | ||
2348 | + | ||
2349 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2350 | + _M_data->_M_amonth01 = "Jan"; | ||
2351 | + _M_data->_M_amonth02 = "Feb"; | ||
2352 | + _M_data->_M_amonth03 = "Mar"; | ||
2353 | + _M_data->_M_amonth04 = "Apr"; | ||
2354 | + _M_data->_M_amonth05 = "May"; | ||
2355 | + _M_data->_M_amonth06 = "Jun"; | ||
2356 | + _M_data->_M_amonth07 = "Jul"; | ||
2357 | + _M_data->_M_amonth08 = "Aug"; | ||
2358 | + _M_data->_M_amonth09 = "Sep"; | ||
2359 | + _M_data->_M_amonth10 = "Oct"; | ||
2360 | + _M_data->_M_amonth11 = "Nov"; | ||
2361 | + _M_data->_M_amonth12 = "Dec"; | ||
2362 | + } | ||
2363 | + else | ||
2364 | + { | ||
2365 | + _M_c_locale_timepunct = _S_clone_c_locale(__cloc); | ||
2366 | + | ||
2367 | + _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); | ||
2368 | + _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); | ||
2369 | + _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); | ||
2370 | + _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); | ||
2371 | + _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); | ||
2372 | + _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, | ||
2373 | + __cloc); | ||
2374 | + _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); | ||
2375 | + _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); | ||
2376 | + _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); | ||
2377 | + | ||
2378 | + // Day names, starting with "C"'s Sunday. | ||
2379 | + _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); | ||
2380 | + _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); | ||
2381 | + _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); | ||
2382 | + _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); | ||
2383 | + _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); | ||
2384 | + _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); | ||
2385 | + _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); | ||
2386 | + | ||
2387 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2388 | + _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); | ||
2389 | + _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); | ||
2390 | + _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); | ||
2391 | + _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); | ||
2392 | + _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); | ||
2393 | + _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); | ||
2394 | + _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); | ||
2395 | + | ||
2396 | + // Month names, starting with "C"'s January. | ||
2397 | + _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); | ||
2398 | + _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); | ||
2399 | + _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); | ||
2400 | + _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); | ||
2401 | + _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); | ||
2402 | + _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); | ||
2403 | + _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); | ||
2404 | + _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); | ||
2405 | + _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); | ||
2406 | + _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); | ||
2407 | + _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); | ||
2408 | + _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); | ||
2409 | + | ||
2410 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2411 | + _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); | ||
2412 | + _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); | ||
2413 | + _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); | ||
2414 | + _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); | ||
2415 | + _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); | ||
2416 | + _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); | ||
2417 | + _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); | ||
2418 | + _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); | ||
2419 | + _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); | ||
2420 | + _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); | ||
2421 | + _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); | ||
2422 | + _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); | ||
2423 | + } | ||
2424 | + } | ||
2425 | + | ||
2426 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
2427 | + template<> | ||
2428 | + void | ||
2429 | + __timepunct<wchar_t>:: | ||
2430 | + _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, | ||
2431 | + const tm* __tm) const | ||
2432 | + { | ||
2433 | +#ifdef __UCLIBC_HAS_XLOCALE__ | ||
2434 | + __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); | ||
2435 | + const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, | ||
2436 | + _M_c_locale_timepunct); | ||
2437 | +#else | ||
2438 | + char* __old = strdup(setlocale(LC_ALL, NULL)); | ||
2439 | + setlocale(LC_ALL, _M_name_timepunct); | ||
2440 | + const size_t __len = wcsftime(__s, __maxlen, __format, __tm); | ||
2441 | + setlocale(LC_ALL, __old); | ||
2442 | + free(__old); | ||
2443 | +#endif | ||
2444 | + // Make sure __s is null terminated. | ||
2445 | + if (__len == 0) | ||
2446 | + __s[0] = L'\0'; | ||
2447 | + } | ||
2448 | + | ||
2449 | + template<> | ||
2450 | + void | ||
2451 | + __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) | ||
2452 | + { | ||
2453 | + if (!_M_data) | ||
2454 | + _M_data = new __timepunct_cache<wchar_t>; | ||
2455 | + | ||
2456 | +#warning wide time stuff | ||
2457 | +// if (!__cloc) | ||
2458 | + { | ||
2459 | + // "C" locale | ||
2460 | + _M_c_locale_timepunct = _S_get_c_locale(); | ||
2461 | + | ||
2462 | + _M_data->_M_date_format = L"%m/%d/%y"; | ||
2463 | + _M_data->_M_date_era_format = L"%m/%d/%y"; | ||
2464 | + _M_data->_M_time_format = L"%H:%M:%S"; | ||
2465 | + _M_data->_M_time_era_format = L"%H:%M:%S"; | ||
2466 | + _M_data->_M_date_time_format = L""; | ||
2467 | + _M_data->_M_date_time_era_format = L""; | ||
2468 | + _M_data->_M_am = L"AM"; | ||
2469 | + _M_data->_M_pm = L"PM"; | ||
2470 | + _M_data->_M_am_pm_format = L""; | ||
2471 | + | ||
2472 | + // Day names, starting with "C"'s Sunday. | ||
2473 | + _M_data->_M_day1 = L"Sunday"; | ||
2474 | + _M_data->_M_day2 = L"Monday"; | ||
2475 | + _M_data->_M_day3 = L"Tuesday"; | ||
2476 | + _M_data->_M_day4 = L"Wednesday"; | ||
2477 | + _M_data->_M_day5 = L"Thursday"; | ||
2478 | + _M_data->_M_day6 = L"Friday"; | ||
2479 | + _M_data->_M_day7 = L"Saturday"; | ||
2480 | + | ||
2481 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2482 | + _M_data->_M_aday1 = L"Sun"; | ||
2483 | + _M_data->_M_aday2 = L"Mon"; | ||
2484 | + _M_data->_M_aday3 = L"Tue"; | ||
2485 | + _M_data->_M_aday4 = L"Wed"; | ||
2486 | + _M_data->_M_aday5 = L"Thu"; | ||
2487 | + _M_data->_M_aday6 = L"Fri"; | ||
2488 | + _M_data->_M_aday7 = L"Sat"; | ||
2489 | + | ||
2490 | + // Month names, starting with "C"'s January. | ||
2491 | + _M_data->_M_month01 = L"January"; | ||
2492 | + _M_data->_M_month02 = L"February"; | ||
2493 | + _M_data->_M_month03 = L"March"; | ||
2494 | + _M_data->_M_month04 = L"April"; | ||
2495 | + _M_data->_M_month05 = L"May"; | ||
2496 | + _M_data->_M_month06 = L"June"; | ||
2497 | + _M_data->_M_month07 = L"July"; | ||
2498 | + _M_data->_M_month08 = L"August"; | ||
2499 | + _M_data->_M_month09 = L"September"; | ||
2500 | + _M_data->_M_month10 = L"October"; | ||
2501 | + _M_data->_M_month11 = L"November"; | ||
2502 | + _M_data->_M_month12 = L"December"; | ||
2503 | + | ||
2504 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2505 | + _M_data->_M_amonth01 = L"Jan"; | ||
2506 | + _M_data->_M_amonth02 = L"Feb"; | ||
2507 | + _M_data->_M_amonth03 = L"Mar"; | ||
2508 | + _M_data->_M_amonth04 = L"Apr"; | ||
2509 | + _M_data->_M_amonth05 = L"May"; | ||
2510 | + _M_data->_M_amonth06 = L"Jun"; | ||
2511 | + _M_data->_M_amonth07 = L"Jul"; | ||
2512 | + _M_data->_M_amonth08 = L"Aug"; | ||
2513 | + _M_data->_M_amonth09 = L"Sep"; | ||
2514 | + _M_data->_M_amonth10 = L"Oct"; | ||
2515 | + _M_data->_M_amonth11 = L"Nov"; | ||
2516 | + _M_data->_M_amonth12 = L"Dec"; | ||
2517 | + } | ||
2518 | +#if 0 | ||
2519 | + else | ||
2520 | + { | ||
2521 | + _M_c_locale_timepunct = _S_clone_c_locale(__cloc); | ||
2522 | + | ||
2523 | + union { char *__s; wchar_t *__w; } __u; | ||
2524 | + | ||
2525 | + __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); | ||
2526 | + _M_data->_M_date_format = __u.__w; | ||
2527 | + __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); | ||
2528 | + _M_data->_M_date_era_format = __u.__w; | ||
2529 | + __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); | ||
2530 | + _M_data->_M_time_format = __u.__w; | ||
2531 | + __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); | ||
2532 | + _M_data->_M_time_era_format = __u.__w; | ||
2533 | + __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); | ||
2534 | + _M_data->_M_date_time_format = __u.__w; | ||
2535 | + __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); | ||
2536 | + _M_data->_M_date_time_era_format = __u.__w; | ||
2537 | + __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); | ||
2538 | + _M_data->_M_am = __u.__w; | ||
2539 | + __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); | ||
2540 | + _M_data->_M_pm = __u.__w; | ||
2541 | + __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); | ||
2542 | + _M_data->_M_am_pm_format = __u.__w; | ||
2543 | + | ||
2544 | + // Day names, starting with "C"'s Sunday. | ||
2545 | + __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); | ||
2546 | + _M_data->_M_day1 = __u.__w; | ||
2547 | + __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); | ||
2548 | + _M_data->_M_day2 = __u.__w; | ||
2549 | + __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); | ||
2550 | + _M_data->_M_day3 = __u.__w; | ||
2551 | + __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); | ||
2552 | + _M_data->_M_day4 = __u.__w; | ||
2553 | + __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); | ||
2554 | + _M_data->_M_day5 = __u.__w; | ||
2555 | + __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); | ||
2556 | + _M_data->_M_day6 = __u.__w; | ||
2557 | + __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); | ||
2558 | + _M_data->_M_day7 = __u.__w; | ||
2559 | + | ||
2560 | + // Abbreviated day names, starting with "C"'s Sun. | ||
2561 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); | ||
2562 | + _M_data->_M_aday1 = __u.__w; | ||
2563 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); | ||
2564 | + _M_data->_M_aday2 = __u.__w; | ||
2565 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); | ||
2566 | + _M_data->_M_aday3 = __u.__w; | ||
2567 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); | ||
2568 | + _M_data->_M_aday4 = __u.__w; | ||
2569 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); | ||
2570 | + _M_data->_M_aday5 = __u.__w; | ||
2571 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); | ||
2572 | + _M_data->_M_aday6 = __u.__w; | ||
2573 | + __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); | ||
2574 | + _M_data->_M_aday7 = __u.__w; | ||
2575 | + | ||
2576 | + // Month names, starting with "C"'s January. | ||
2577 | + __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); | ||
2578 | + _M_data->_M_month01 = __u.__w; | ||
2579 | + __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); | ||
2580 | + _M_data->_M_month02 = __u.__w; | ||
2581 | + __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); | ||
2582 | + _M_data->_M_month03 = __u.__w; | ||
2583 | + __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); | ||
2584 | + _M_data->_M_month04 = __u.__w; | ||
2585 | + __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); | ||
2586 | + _M_data->_M_month05 = __u.__w; | ||
2587 | + __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); | ||
2588 | + _M_data->_M_month06 = __u.__w; | ||
2589 | + __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); | ||
2590 | + _M_data->_M_month07 = __u.__w; | ||
2591 | + __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); | ||
2592 | + _M_data->_M_month08 = __u.__w; | ||
2593 | + __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); | ||
2594 | + _M_data->_M_month09 = __u.__w; | ||
2595 | + __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); | ||
2596 | + _M_data->_M_month10 = __u.__w; | ||
2597 | + __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); | ||
2598 | + _M_data->_M_month11 = __u.__w; | ||
2599 | + __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); | ||
2600 | + _M_data->_M_month12 = __u.__w; | ||
2601 | + | ||
2602 | + // Abbreviated month names, starting with "C"'s Jan. | ||
2603 | + __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); | ||
2604 | + _M_data->_M_amonth01 = __u.__w; | ||
2605 | + __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); | ||
2606 | + _M_data->_M_amonth02 = __u.__w; | ||
2607 | + __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); | ||
2608 | + _M_data->_M_amonth03 = __u.__w; | ||
2609 | + __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); | ||
2610 | + _M_data->_M_amonth04 = __u.__w; | ||
2611 | + __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); | ||
2612 | + _M_data->_M_amonth05 = __u.__w; | ||
2613 | + __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); | ||
2614 | + _M_data->_M_amonth06 = __u.__w; | ||
2615 | + __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); | ||
2616 | + _M_data->_M_amonth07 = __u.__w; | ||
2617 | + __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); | ||
2618 | + _M_data->_M_amonth08 = __u.__w; | ||
2619 | + __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); | ||
2620 | + _M_data->_M_amonth09 = __u.__w; | ||
2621 | + __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); | ||
2622 | + _M_data->_M_amonth10 = __u.__w; | ||
2623 | + __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); | ||
2624 | + _M_data->_M_amonth11 = __u.__w; | ||
2625 | + __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); | ||
2626 | + _M_data->_M_amonth12 = __u.__w; | ||
2627 | + } | ||
2628 | +#endif // 0 | ||
2629 | + } | ||
2630 | +#endif | ||
2631 | +} | ||
2632 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h | ||
2633 | --- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 17:00:00.000000000 -0700 | ||
2634 | +++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h 2005-10-21 02:34:06.000000000 -0600 | ||
2635 | @@ -0,0 +1,76 @@ | ||
2636 | +// std::time_get, std::time_put implementation, GNU version -*- C++ -*- | ||
2637 | + | ||
2638 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||
2639 | +// | ||
2640 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2641 | +// software; you can redistribute it and/or modify it under the | ||
2642 | +// terms of the GNU General Public License as published by the | ||
2643 | +// Free Software Foundation; either version 2, or (at your option) | ||
2644 | +// any later version. | ||
2645 | + | ||
2646 | +// This library is distributed in the hope that it will be useful, | ||
2647 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2648 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2649 | +// GNU General Public License for more details. | ||
2650 | + | ||
2651 | +// You should have received a copy of the GNU General Public License along | ||
2652 | +// with this library; see the file COPYING. If not, write to the Free | ||
2653 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
2654 | +// USA. | ||
2655 | + | ||
2656 | +// As a special exception, you may use this file as part of a free software | ||
2657 | +// library without restriction. Specifically, if other files instantiate | ||
2658 | +// templates or use macros or inline functions from this file, or you compile | ||
2659 | +// this file and link it with other files to produce an executable, this | ||
2660 | +// file does not by itself cause the resulting executable to be covered by | ||
2661 | +// the GNU General Public License. This exception does not however | ||
2662 | +// invalidate any other reasons why the executable file might be covered by | ||
2663 | +// the GNU General Public License. | ||
2664 | + | ||
2665 | +// | ||
2666 | +// ISO C++ 14882: 22.2.5.1.2 - time_get functions | ||
2667 | +// ISO C++ 14882: 22.2.5.3.2 - time_put functions | ||
2668 | +// | ||
2669 | + | ||
2670 | +// Written by Benjamin Kosnik <bkoz@redhat.com> | ||
2671 | + | ||
2672 | + template<typename _CharT> | ||
2673 | + __timepunct<_CharT>::__timepunct(size_t __refs) | ||
2674 | + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), | ||
2675 | + _M_name_timepunct(_S_get_c_name()) | ||
2676 | + { _M_initialize_timepunct(); } | ||
2677 | + | ||
2678 | + template<typename _CharT> | ||
2679 | + __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) | ||
2680 | + : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), | ||
2681 | + _M_name_timepunct(_S_get_c_name()) | ||
2682 | + { _M_initialize_timepunct(); } | ||
2683 | + | ||
2684 | + template<typename _CharT> | ||
2685 | + __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, | ||
2686 | + size_t __refs) | ||
2687 | + : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), | ||
2688 | + _M_name_timepunct(NULL) | ||
2689 | + { | ||
2690 | + const size_t __len = std::strlen(__s) + 1; | ||
2691 | + char* __tmp = new char[__len]; | ||
2692 | + std::memcpy(__tmp, __s, __len); | ||
2693 | + _M_name_timepunct = __tmp; | ||
2694 | + | ||
2695 | + try | ||
2696 | + { _M_initialize_timepunct(__cloc); } | ||
2697 | + catch(...) | ||
2698 | + { | ||
2699 | + delete [] _M_name_timepunct; | ||
2700 | + __throw_exception_again; | ||
2701 | + } | ||
2702 | + } | ||
2703 | + | ||
2704 | + template<typename _CharT> | ||
2705 | + __timepunct<_CharT>::~__timepunct() | ||
2706 | + { | ||
2707 | + if (_M_name_timepunct != _S_get_c_name()) | ||
2708 | + delete [] _M_name_timepunct; | ||
2709 | + delete _M_data; | ||
2710 | + _S_destroy_c_locale(_M_c_locale_timepunct); | ||
2711 | + } | ||
2712 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h | ||
2713 | --- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 17:00:00.000000000 -0700 | ||
2714 | +++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h 2006-03-25 22:06:30.000000000 -0700 | ||
2715 | @@ -0,0 +1,64 @@ | ||
2716 | +// Locale support -*- C++ -*- | ||
2717 | + | ||
2718 | +// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 | ||
2719 | +// Free Software Foundation, Inc. | ||
2720 | +// | ||
2721 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2722 | +// software; you can redistribute it and/or modify it under the | ||
2723 | +// terms of the GNU General Public License as published by the | ||
2724 | +// Free Software Foundation; either version 2, or (at your option) | ||
2725 | +// any later version. | ||
2726 | + | ||
2727 | +// This library is distributed in the hope that it will be useful, | ||
2728 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2729 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2730 | +// GNU General Public License for more details. | ||
2731 | + | ||
2732 | +// You should have received a copy of the GNU General Public License along | ||
2733 | +// with this library; see the file COPYING. If not, write to the Free | ||
2734 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2735 | +// USA. | ||
2736 | + | ||
2737 | +// As a special exception, you may use this file as part of a free software | ||
2738 | +// library without restriction. Specifically, if other files instantiate | ||
2739 | +// templates or use macros or inline functions from this file, or you compile | ||
2740 | +// this file and link it with other files to produce an executable, this | ||
2741 | +// file does not by itself cause the resulting executable to be covered by | ||
2742 | +// the GNU General Public License. This exception does not however | ||
2743 | +// invalidate any other reasons why the executable file might be covered by | ||
2744 | +// the GNU General Public License. | ||
2745 | + | ||
2746 | +// | ||
2747 | +// ISO C++ 14882: 22.1 Locales | ||
2748 | +// | ||
2749 | + | ||
2750 | +/** @file ctype_base.h | ||
2751 | + * This is an internal header file, included by other library headers. | ||
2752 | + * You should not attempt to use it directly. | ||
2753 | + */ | ||
2754 | + | ||
2755 | +// Information as gleaned from /usr/include/ctype.h | ||
2756 | + | ||
2757 | + /// @brief Base class for ctype. | ||
2758 | + struct ctype_base | ||
2759 | + { | ||
2760 | + // Note: In uClibc, the following two types depend on configuration. | ||
2761 | + | ||
2762 | + // Non-standard typedefs. | ||
2763 | + typedef const __ctype_touplow_t* __to_type; | ||
2764 | + | ||
2765 | + // NB: Offsets into ctype<char>::_M_table force a particular size | ||
2766 | + // on the mask type. Because of this, we don't use an enum. | ||
2767 | + typedef __ctype_mask_t mask; | ||
2768 | + static const mask upper = _ISupper; | ||
2769 | + static const mask lower = _ISlower; | ||
2770 | + static const mask alpha = _ISalpha; | ||
2771 | + static const mask digit = _ISdigit; | ||
2772 | + static const mask xdigit = _ISxdigit; | ||
2773 | + static const mask space = _ISspace; | ||
2774 | + static const mask print = _ISprint; | ||
2775 | + static const mask graph = _ISalpha | _ISdigit | _ISpunct; | ||
2776 | + static const mask cntrl = _IScntrl; | ||
2777 | + static const mask punct = _ISpunct; | ||
2778 | + static const mask alnum = _ISalpha | _ISdigit; | ||
2779 | + }; | ||
2780 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h | ||
2781 | --- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 17:00:00.000000000 -0700 | ||
2782 | +++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h 2006-03-25 22:06:30.000000000 -0700 | ||
2783 | @@ -0,0 +1,69 @@ | ||
2784 | +// Locale support -*- C++ -*- | ||
2785 | + | ||
2786 | +// Copyright (C) 2000, 2002 Free Software Foundation, Inc. | ||
2787 | +// | ||
2788 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2789 | +// software; you can redistribute it and/or modify it under the | ||
2790 | +// terms of the GNU General Public License as published by the | ||
2791 | +// Free Software Foundation; either version 2, or (at your option) | ||
2792 | +// any later version. | ||
2793 | + | ||
2794 | +// This library is distributed in the hope that it will be useful, | ||
2795 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2796 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2797 | +// GNU General Public License for more details. | ||
2798 | + | ||
2799 | +// You should have received a copy of the GNU General Public License along | ||
2800 | +// with this library; see the file COPYING. If not, write to the Free | ||
2801 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2802 | +// USA. | ||
2803 | + | ||
2804 | +// As a special exception, you may use this file as part of a free software | ||
2805 | +// library without restriction. Specifically, if other files instantiate | ||
2806 | +// templates or use macros or inline functions from this file, or you compile | ||
2807 | +// this file and link it with other files to produce an executable, this | ||
2808 | +// file does not by itself cause the resulting executable to be covered by | ||
2809 | +// the GNU General Public License. This exception does not however | ||
2810 | +// invalidate any other reasons why the executable file might be covered by | ||
2811 | +// the GNU General Public License. | ||
2812 | + | ||
2813 | +// | ||
2814 | +// ISO C++ 14882: 22.1 Locales | ||
2815 | +// | ||
2816 | + | ||
2817 | +// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) | ||
2818 | +// functions go in ctype.cc | ||
2819 | + | ||
2820 | + bool | ||
2821 | + ctype<char>:: | ||
2822 | + is(mask __m, char __c) const | ||
2823 | + { return _M_table[static_cast<unsigned char>(__c)] & __m; } | ||
2824 | + | ||
2825 | + const char* | ||
2826 | + ctype<char>:: | ||
2827 | + is(const char* __low, const char* __high, mask* __vec) const | ||
2828 | + { | ||
2829 | + while (__low < __high) | ||
2830 | + *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; | ||
2831 | + return __high; | ||
2832 | + } | ||
2833 | + | ||
2834 | + const char* | ||
2835 | + ctype<char>:: | ||
2836 | + scan_is(mask __m, const char* __low, const char* __high) const | ||
2837 | + { | ||
2838 | + while (__low < __high | ||
2839 | + && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) | ||
2840 | + ++__low; | ||
2841 | + return __low; | ||
2842 | + } | ||
2843 | + | ||
2844 | + const char* | ||
2845 | + ctype<char>:: | ||
2846 | + scan_not(mask __m, const char* __low, const char* __high) const | ||
2847 | + { | ||
2848 | + while (__low < __high | ||
2849 | + && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) | ||
2850 | + ++__low; | ||
2851 | + return __low; | ||
2852 | + } | ||
2853 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h | ||
2854 | --- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 17:00:00.000000000 -0700 | ||
2855 | +++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2006-03-25 22:06:30.000000000 -0700 | ||
2856 | @@ -0,0 +1,92 @@ | ||
2857 | +// Locale support -*- C++ -*- | ||
2858 | + | ||
2859 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 | ||
2860 | +// Free Software Foundation, Inc. | ||
2861 | +// | ||
2862 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2863 | +// software; you can redistribute it and/or modify it under the | ||
2864 | +// terms of the GNU General Public License as published by the | ||
2865 | +// Free Software Foundation; either version 2, or (at your option) | ||
2866 | +// any later version. | ||
2867 | + | ||
2868 | +// This library is distributed in the hope that it will be useful, | ||
2869 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2870 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2871 | +// GNU General Public License for more details. | ||
2872 | + | ||
2873 | +// You should have received a copy of the GNU General Public License along | ||
2874 | +// with this library; see the file COPYING. If not, write to the Free | ||
2875 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2876 | +// USA. | ||
2877 | + | ||
2878 | +// As a special exception, you may use this file as part of a free software | ||
2879 | +// library without restriction. Specifically, if other files instantiate | ||
2880 | +// templates or use macros or inline functions from this file, or you compile | ||
2881 | +// this file and link it with other files to produce an executable, this | ||
2882 | +// file does not by itself cause the resulting executable to be covered by | ||
2883 | +// the GNU General Public License. This exception does not however | ||
2884 | +// invalidate any other reasons why the executable file might be covered by | ||
2885 | +// the GNU General Public License. | ||
2886 | + | ||
2887 | +// | ||
2888 | +// ISO C++ 14882: 22.1 Locales | ||
2889 | +// | ||
2890 | + | ||
2891 | +// Information as gleaned from /usr/include/ctype.h | ||
2892 | + | ||
2893 | + const ctype_base::mask* | ||
2894 | + ctype<char>::classic_table() throw() | ||
2895 | + { return __C_ctype_b; } | ||
2896 | + | ||
2897 | + ctype<char>::ctype(__c_locale, const mask* __table, bool __del, | ||
2898 | + size_t __refs) | ||
2899 | + : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), | ||
2900 | + _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) | ||
2901 | + { | ||
2902 | + _M_toupper = __C_ctype_toupper; | ||
2903 | + _M_tolower = __C_ctype_tolower; | ||
2904 | + _M_table = __table ? __table : __C_ctype_b; | ||
2905 | + memset(_M_widen, 0, sizeof(_M_widen)); | ||
2906 | + memset(_M_narrow, 0, sizeof(_M_narrow)); | ||
2907 | + } | ||
2908 | + | ||
2909 | + ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) | ||
2910 | + : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), | ||
2911 | + _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) | ||
2912 | + { | ||
2913 | + _M_toupper = __C_ctype_toupper; | ||
2914 | + _M_tolower = __C_ctype_tolower; | ||
2915 | + _M_table = __table ? __table : __C_ctype_b; | ||
2916 | + memset(_M_widen, 0, sizeof(_M_widen)); | ||
2917 | + memset(_M_narrow, 0, sizeof(_M_narrow)); | ||
2918 | + } | ||
2919 | + | ||
2920 | + char | ||
2921 | + ctype<char>::do_toupper(char __c) const | ||
2922 | + { return _M_toupper[static_cast<unsigned char>(__c)]; } | ||
2923 | + | ||
2924 | + const char* | ||
2925 | + ctype<char>::do_toupper(char* __low, const char* __high) const | ||
2926 | + { | ||
2927 | + while (__low < __high) | ||
2928 | + { | ||
2929 | + *__low = _M_toupper[static_cast<unsigned char>(*__low)]; | ||
2930 | + ++__low; | ||
2931 | + } | ||
2932 | + return __high; | ||
2933 | + } | ||
2934 | + | ||
2935 | + char | ||
2936 | + ctype<char>::do_tolower(char __c) const | ||
2937 | + { return _M_tolower[static_cast<unsigned char>(__c)]; } | ||
2938 | + | ||
2939 | + const char* | ||
2940 | + ctype<char>::do_tolower(char* __low, const char* __high) const | ||
2941 | + { | ||
2942 | + while (__low < __high) | ||
2943 | + { | ||
2944 | + *__low = _M_tolower[static_cast<unsigned char>(*__low)]; | ||
2945 | + ++__low; | ||
2946 | + } | ||
2947 | + return __high; | ||
2948 | + } | ||
2949 | diff -urN gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h | ||
2950 | --- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 17:00:00.000000000 -0700 | ||
2951 | +++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h 2006-03-25 22:06:30.000000000 -0700 | ||
2952 | @@ -0,0 +1,44 @@ | ||
2953 | +// Specific definitions for GNU/Linux -*- C++ -*- | ||
2954 | + | ||
2955 | +// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. | ||
2956 | +// | ||
2957 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
2958 | +// software; you can redistribute it and/or modify it under the | ||
2959 | +// terms of the GNU General Public License as published by the | ||
2960 | +// Free Software Foundation; either version 2, or (at your option) | ||
2961 | +// any later version. | ||
2962 | + | ||
2963 | +// This library is distributed in the hope that it will be useful, | ||
2964 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
2965 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
2966 | +// GNU General Public License for more details. | ||
2967 | + | ||
2968 | +// You should have received a copy of the GNU General Public License along | ||
2969 | +// with this library; see the file COPYING. If not, write to the Free | ||
2970 | +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, | ||
2971 | +// USA. | ||
2972 | + | ||
2973 | +// As a special exception, you may use this file as part of a free software | ||
2974 | +// library without restriction. Specifically, if other files instantiate | ||
2975 | +// templates or use macros or inline functions from this file, or you compile | ||
2976 | +// this file and link it with other files to produce an executable, this | ||
2977 | +// file does not by itself cause the resulting executable to be covered by | ||
2978 | +// the GNU General Public License. This exception does not however | ||
2979 | +// invalidate any other reasons why the executable file might be covered by | ||
2980 | +// the GNU General Public License. | ||
2981 | + | ||
2982 | +#ifndef _GLIBCXX_OS_DEFINES | ||
2983 | +#define _GLIBCXX_OS_DEFINES 1 | ||
2984 | + | ||
2985 | +// System-specific #define, typedefs, corrections, etc, go here. This | ||
2986 | +// file will come before all others. | ||
2987 | + | ||
2988 | +// This keeps isanum, et al from being propagated as macros. | ||
2989 | +#define __NO_CTYPE 1 | ||
2990 | + | ||
2991 | +#include <features.h> | ||
2992 | + | ||
2993 | +// We must not see the optimized string functions GNU libc defines. | ||
2994 | +#define __NO_STRING_INLINES | ||
2995 | + | ||
2996 | +#endif | ||
2997 | diff -urN gcc-4.1.0-dist/libstdc++-v3/configure gcc-4.1.0/libstdc++-v3/configure | ||
2998 | --- gcc-4.1.0-dist/libstdc++-v3/configure 2006-03-26 12:08:28.000000000 -0700 | ||
2999 | +++ gcc-4.1.0/libstdc++-v3/configure 2006-03-25 22:06:30.000000000 -0700 | ||
3000 | @@ -4005,6 +4005,11 @@ | ||
3001 | lt_cv_deplibs_check_method=pass_all | ||
3002 | ;; | ||
3003 | |||
3004 | +linux-uclibc*) | ||
3005 | + lt_cv_deplibs_check_method=pass_all | ||
3006 | + lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` | ||
3007 | + ;; | ||
3008 | + | ||
3009 | netbsd* | knetbsd*-gnu) | ||
3010 | if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then | ||
3011 | lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' | ||
3012 | @@ -5740,7 +5745,7 @@ | ||
3013 | enableval="$enable_clocale" | ||
3014 | |||
3015 | case "$enableval" in | ||
3016 | - generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; | ||
3017 | + generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; | ||
3018 | *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 | ||
3019 | echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} | ||
3020 | { (exit 1); exit 1; }; } ;; | ||
3021 | @@ -5765,6 +5770,9 @@ | ||
3022 | # Default to "generic". | ||
3023 | if test $enable_clocale_flag = auto; then | ||
3024 | case ${target_os} in | ||
3025 | + linux-uclibc*) | ||
3026 | + enable_clocale_flag=uclibc | ||
3027 | + ;; | ||
3028 | linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) | ||
3029 | cat >conftest.$ac_ext <<_ACEOF | ||
3030 | /* confdefs.h. */ | ||
3031 | @@ -5995,6 +6003,76 @@ | ||
3032 | CTIME_CC=config/locale/generic/time_members.cc | ||
3033 | CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h | ||
3034 | ;; | ||
3035 | + uclibc) | ||
3036 | + echo "$as_me:$LINENO: result: uclibc" >&5 | ||
3037 | +echo "${ECHO_T}uclibc" >&6 | ||
3038 | + | ||
3039 | + # Declare intention to use gettext, and add support for specific | ||
3040 | + # languages. | ||
3041 | + # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT | ||
3042 | + ALL_LINGUAS="de fr" | ||
3043 | + | ||
3044 | + # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. | ||
3045 | + # Extract the first word of "msgfmt", so it can be a program name with args. | ||
3046 | +set dummy msgfmt; ac_word=$2 | ||
3047 | +echo "$as_me:$LINENO: checking for $ac_word" >&5 | ||
3048 | +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 | ||
3049 | +if test "${ac_cv_prog_check_msgfmt+set}" = set; then | ||
3050 | + echo $ECHO_N "(cached) $ECHO_C" >&6 | ||
3051 | +else | ||
3052 | + if test -n "$check_msgfmt"; then | ||
3053 | + ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. | ||
3054 | +else | ||
3055 | +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | ||
3056 | +for as_dir in $PATH | ||
3057 | +do | ||
3058 | + IFS=$as_save_IFS | ||
3059 | + test -z "$as_dir" && as_dir=. | ||
3060 | + for ac_exec_ext in '' $ac_executable_extensions; do | ||
3061 | + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then | ||
3062 | + ac_cv_prog_check_msgfmt="yes" | ||
3063 | + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 | ||
3064 | + break 2 | ||
3065 | + fi | ||
3066 | +done | ||
3067 | +done | ||
3068 | + | ||
3069 | + test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" | ||
3070 | +fi | ||
3071 | +fi | ||
3072 | +check_msgfmt=$ac_cv_prog_check_msgfmt | ||
3073 | +if test -n "$check_msgfmt"; then | ||
3074 | + echo "$as_me:$LINENO: result: $check_msgfmt" >&5 | ||
3075 | +echo "${ECHO_T}$check_msgfmt" >&6 | ||
3076 | +else | ||
3077 | + echo "$as_me:$LINENO: result: no" >&5 | ||
3078 | +echo "${ECHO_T}no" >&6 | ||
3079 | +fi | ||
3080 | + | ||
3081 | + if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then | ||
3082 | + USE_NLS=yes | ||
3083 | + fi | ||
3084 | + # Export the build objects. | ||
3085 | + for ling in $ALL_LINGUAS; do \ | ||
3086 | + glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ | ||
3087 | + glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ | ||
3088 | + done | ||
3089 | + | ||
3090 | + | ||
3091 | + | ||
3092 | + CLOCALE_H=config/locale/uclibc/c_locale.h | ||
3093 | + CLOCALE_CC=config/locale/uclibc/c_locale.cc | ||
3094 | + CCODECVT_CC=config/locale/uclibc/codecvt_members.cc | ||
3095 | + CCOLLATE_CC=config/locale/uclibc/collate_members.cc | ||
3096 | + CCTYPE_CC=config/locale/uclibc/ctype_members.cc | ||
3097 | + CMESSAGES_H=config/locale/uclibc/messages_members.h | ||
3098 | + CMESSAGES_CC=config/locale/uclibc/messages_members.cc | ||
3099 | + CMONEY_CC=config/locale/uclibc/monetary_members.cc | ||
3100 | + CNUMERIC_CC=config/locale/uclibc/numeric_members.cc | ||
3101 | + CTIME_H=config/locale/uclibc/time_members.h | ||
3102 | + CTIME_CC=config/locale/uclibc/time_members.cc | ||
3103 | + CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h | ||
3104 | + ;; | ||
3105 | esac | ||
3106 | |||
3107 | # This is where the testsuite looks for locale catalogs, using the | ||
3108 | diff -urN gcc-4.1.0-dist/libstdc++-v3/configure.host gcc-4.1.0/libstdc++-v3/configure.host | ||
3109 | --- gcc-4.1.0-dist/libstdc++-v3/configure.host 2006-03-26 12:08:28.000000000 -0700 | ||
3110 | +++ gcc-4.1.0/libstdc++-v3/configure.host 2006-03-25 22:06:30.000000000 -0700 | ||
3111 | @@ -261,6 +261,12 @@ | ||
3112 | ;; | ||
3113 | esac | ||
3114 | |||
3115 | +# Override for uClibc since linux-uclibc gets mishandled above. | ||
3116 | +case "${host_os}" in | ||
3117 | + *-uclibc*) | ||
3118 | + os_include_dir="os/uclibc" | ||
3119 | + ;; | ||
3120 | +esac | ||
3121 | |||
3122 | # Set any OS-dependent and CPU-dependent bits. | ||
3123 | # THIS TABLE IS SORTED. KEEP IT THAT WAY. | ||
3124 | diff -urN gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4 gcc-4.1.0/libstdc++-v3/crossconfig.m4 | ||
3125 | --- gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4 2006-03-26 12:08:28.000000000 -0700 | ||
3126 | +++ gcc-4.1.0/libstdc++-v3/crossconfig.m4 2006-03-25 22:06:30.000000000 -0700 | ||
3127 | @@ -143,6 +143,99 @@ | ||
3128 | ;; | ||
3129 | esac | ||
3130 | ;; | ||
3131 | + *-uclibc*) | ||
3132 | +# Temporary hack until we implement the float versions of the libm funcs | ||
3133 | + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ | ||
3134 | + machine/endian.h machine/param.h sys/machine.h sys/types.h \ | ||
3135 | + fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) | ||
3136 | + SECTION_FLAGS='-ffunction-sections -fdata-sections' | ||
3137 | + AC_SUBST(SECTION_FLAGS) | ||
3138 | + GLIBCXX_CHECK_LINKER_FEATURES | ||
3139 | + GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT | ||
3140 | + GLIBCXX_CHECK_WCHAR_T_SUPPORT | ||
3141 | + | ||
3142 | + # For LFS. | ||
3143 | + AC_DEFINE(HAVE_INT64_T) | ||
3144 | + case "$target" in | ||
3145 | + *-uclinux*) | ||
3146 | + # Don't enable LFS with uClinux | ||
3147 | + ;; | ||
3148 | + *) | ||
3149 | + AC_DEFINE(_GLIBCXX_USE_LFS) | ||
3150 | + esac | ||
3151 | + | ||
3152 | + # For showmanyc_helper(). | ||
3153 | + AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) | ||
3154 | + GLIBCXX_CHECK_POLL | ||
3155 | + GLIBCXX_CHECK_S_ISREG_OR_S_IFREG | ||
3156 | + | ||
3157 | + # For xsputn_2(). | ||
3158 | + AC_CHECK_HEADERS(sys/uio.h) | ||
3159 | + GLIBCXX_CHECK_WRITEV | ||
3160 | + | ||
3161 | +# AC_DEFINE(HAVE_ACOSF) | ||
3162 | +# AC_DEFINE(HAVE_ASINF) | ||
3163 | +# AC_DEFINE(HAVE_ATANF) | ||
3164 | +# AC_DEFINE(HAVE_ATAN2F) | ||
3165 | + AC_DEFINE(HAVE_CEILF) | ||
3166 | + AC_DEFINE(HAVE_COPYSIGN) | ||
3167 | +# AC_DEFINE(HAVE_COPYSIGNF) | ||
3168 | +# AC_DEFINE(HAVE_COSF) | ||
3169 | +# AC_DEFINE(HAVE_COSHF) | ||
3170 | +# AC_DEFINE(HAVE_EXPF) | ||
3171 | +# AC_DEFINE(HAVE_FABSF) | ||
3172 | + AC_DEFINE(HAVE_FINITE) | ||
3173 | + AC_DEFINE(HAVE_FINITEF) | ||
3174 | + AC_DEFINE(HAVE_FLOORF) | ||
3175 | +# AC_DEFINE(HAVE_FMODF) | ||
3176 | +# AC_DEFINE(HAVE_FREXPF) | ||
3177 | + AC_DEFINE(HAVE_HYPOT) | ||
3178 | +# AC_DEFINE(HAVE_HYPOTF) | ||
3179 | + AC_DEFINE(HAVE_ISINF) | ||
3180 | + AC_DEFINE(HAVE_ISINFF) | ||
3181 | + AC_DEFINE(HAVE_ISNAN) | ||
3182 | + AC_DEFINE(HAVE_ISNANF) | ||
3183 | +# AC_DEFINE(HAVE_LOGF) | ||
3184 | +# AC_DEFINE(HAVE_LOG10F) | ||
3185 | +# AC_DEFINE(HAVE_MODFF) | ||
3186 | +# AC_DEFINE(HAVE_SINF) | ||
3187 | +# AC_DEFINE(HAVE_SINHF) | ||
3188 | +# AC_DEFINE(HAVE_SINCOS) | ||
3189 | +# AC_DEFINE(HAVE_SINCOSF) | ||
3190 | + AC_DEFINE(HAVE_SQRTF) | ||
3191 | +# AC_DEFINE(HAVE_TANF) | ||
3192 | +# AC_DEFINE(HAVE_TANHF) | ||
3193 | + if test x"long_double_math_on_this_cpu" = x"yes"; then | ||
3194 | + AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) | ||
3195 | +# AC_DEFINE(HAVE_ACOSL) | ||
3196 | +# AC_DEFINE(HAVE_ASINL) | ||
3197 | +# AC_DEFINE(HAVE_ATANL) | ||
3198 | +# AC_DEFINE(HAVE_ATAN2L) | ||
3199 | +# AC_DEFINE(HAVE_CEILL) | ||
3200 | +# AC_DEFINE(HAVE_COPYSIGNL) | ||
3201 | +# AC_DEFINE(HAVE_COSL) | ||
3202 | +# AC_DEFINE(HAVE_COSHL) | ||
3203 | +# AC_DEFINE(HAVE_EXPL) | ||
3204 | +# AC_DEFINE(HAVE_FABSL) | ||
3205 | +# AC_DEFINE(HAVE_FINITEL) | ||
3206 | +# AC_DEFINE(HAVE_FLOORL) | ||
3207 | +# AC_DEFINE(HAVE_FMODL) | ||
3208 | +# AC_DEFINE(HAVE_FREXPL) | ||
3209 | +# AC_DEFINE(HAVE_HYPOTL) | ||
3210 | +# AC_DEFINE(HAVE_ISINFL) | ||
3211 | +# AC_DEFINE(HAVE_ISNANL) | ||
3212 | +# AC_DEFINE(HAVE_LOGL) | ||
3213 | +# AC_DEFINE(HAVE_LOG10L) | ||
3214 | +# AC_DEFINE(HAVE_MODFL) | ||
3215 | +# AC_DEFINE(HAVE_POWL) | ||
3216 | +# AC_DEFINE(HAVE_SINL) | ||
3217 | +# AC_DEFINE(HAVE_SINHL) | ||
3218 | +# AC_DEFINE(HAVE_SINCOSL) | ||
3219 | +# AC_DEFINE(HAVE_SQRTL) | ||
3220 | +# AC_DEFINE(HAVE_TANL) | ||
3221 | +# AC_DEFINE(HAVE_TANHL) | ||
3222 | + fi | ||
3223 | + ;; | ||
3224 | *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) | ||
3225 | AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ | ||
3226 | machine/endian.h machine/param.h sys/machine.h sys/types.h \ | ||
3227 | @@ -157,7 +250,7 @@ | ||
3228 | AC_DEFINE(HAVE_INT64_T) | ||
3229 | case "$target" in | ||
3230 | *-uclinux*) | ||
3231 | - # Don't enable LFS with uClibc | ||
3232 | + # Don't enable LFS with uClinux | ||
3233 | ;; | ||
3234 | *) | ||
3235 | AC_DEFINE(_GLIBCXX_USE_LFS) | ||
3236 | diff -urN gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h | ||
3237 | --- gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h 2006-03-26 12:08:28.000000000 -0700 | ||
3238 | +++ gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h 2006-03-25 22:06:30.000000000 -0700 | ||
3239 | @@ -101,7 +101,9 @@ | ||
3240 | using std::wmemcpy; | ||
3241 | using std::wmemmove; | ||
3242 | using std::wmemset; | ||
3243 | +#if _GLIBCXX_HAVE_WCSFTIME | ||
3244 | using std::wcsftime; | ||
3245 | +#endif | ||
3246 | |||
3247 | #if _GLIBCXX_USE_C99 | ||
3248 | using std::wcstold; | ||
3249 | diff -urN gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h | ||
3250 | --- gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h 2006-03-26 12:08:28.000000000 -0700 | ||
3251 | +++ gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h 2006-03-25 22:06:30.000000000 -0700 | ||
3252 | @@ -180,7 +180,9 @@ | ||
3253 | using ::wcscoll; | ||
3254 | using ::wcscpy; | ||
3255 | using ::wcscspn; | ||
3256 | +#if _GLIBCXX_HAVE_WCSFTIME | ||
3257 | using ::wcsftime; | ||
3258 | +#endif | ||
3259 | using ::wcslen; | ||
3260 | using ::wcsncat; | ||
3261 | using ::wcsncmp; | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/300-libstdc++-pic.patch b/meta/packages/gcc/gcc-4.1.1/300-libstdc++-pic.patch deleted file mode 100644 index 89d03a85e5..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/300-libstdc++-pic.patch +++ /dev/null | |||
@@ -1,46 +0,0 @@ | |||
1 | # DP: Build and install libstdc++_pic.a library. | ||
2 | |||
3 | --- gcc-4.1.0/libstdc++-v3/src/Makefile.am 2004-11-15 17:33:05.000000000 -0600 | ||
4 | +++ gcc-4.1.0-patched/libstdc++-v3/src/Makefile.am 2005-04-25 20:05:59.186930896 -0500 | ||
5 | @@ -214,6 +214,10 @@ | ||
6 | $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ | ||
7 | |||
8 | |||
9 | +install-exec-local: | ||
10 | + $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o | ||
11 | + $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) | ||
12 | + | ||
13 | # Added bits to build debug library. | ||
14 | if GLIBCXX_BUILD_DEBUG | ||
15 | all-local: build_debug | ||
16 | --- gcc-4.1.0/libstdc++-v3/src/Makefile.in 2005-04-11 19:13:08.000000000 -0500 | ||
17 | +++ gcc-4.1.0-patched/libstdc++-v3/src/Makefile.in 2005-04-25 20:12:33.284316275 -0500 | ||
18 | @@ -627,7 +627,7 @@ | ||
19 | |||
20 | install-data-am: install-data-local | ||
21 | |||
22 | -install-exec-am: install-toolexeclibLTLIBRARIES | ||
23 | +install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local | ||
24 | |||
25 | install-info: install-info-am | ||
26 | |||
27 | @@ -660,6 +660,7 @@ | ||
28 | distclean-libtool distclean-tags distdir dvi dvi-am html \ | ||
29 | html-am info info-am install install-am install-data \ | ||
30 | install-data-am install-data-local install-exec \ | ||
31 | + install-exec-local \ | ||
32 | install-exec-am install-info install-info-am install-man \ | ||
33 | install-strip install-toolexeclibLTLIBRARIES installcheck \ | ||
34 | installcheck-am installdirs maintainer-clean \ | ||
35 | @@ -745,6 +746,11 @@ | ||
36 | install_debug: | ||
37 | (cd ${debugdir} && $(MAKE) \ | ||
38 | toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) | ||
39 | + | ||
40 | +install-exec-local: | ||
41 | + $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o | ||
42 | + $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) | ||
43 | + | ||
44 | # Tell versions [3.59,3.63) of GNU make to not export all variables. | ||
45 | # Otherwise a system limit (for SysV at least) may be exceeded. | ||
46 | .NOEXPORT: | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/301-missing-execinfo_h.patch b/meta/packages/gcc/gcc-4.1.1/301-missing-execinfo_h.patch deleted file mode 100644 index 0e2092f3fb..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/301-missing-execinfo_h.patch +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | --- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 | ||
2 | +++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 | ||
3 | @@ -500,7 +500,7 @@ | ||
4 | #ifdef __linux__ | ||
5 | # include <features.h> | ||
6 | # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ | ||
7 | - && !defined(__ia64__) | ||
8 | + && !defined(__ia64__) && !defined(__UCLIBC__) | ||
9 | # ifndef GC_HAVE_BUILTIN_BACKTRACE | ||
10 | # define GC_HAVE_BUILTIN_BACKTRACE | ||
11 | # endif | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/302-c99-snprintf.patch b/meta/packages/gcc/gcc-4.1.1/302-c99-snprintf.patch deleted file mode 100644 index dfb22d681b..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/302-c99-snprintf.patch +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | --- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig 2005-04-29 00:08:41.000000000 -0500 | ||
2 | +++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h 2005-04-29 00:08:45.000000000 -0500 | ||
3 | @@ -142,7 +142,7 @@ | ||
4 | using ::vsprintf; | ||
5 | } | ||
6 | |||
7 | -#if _GLIBCXX_USE_C99 | ||
8 | +#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) | ||
9 | |||
10 | #undef snprintf | ||
11 | #undef vfscanf | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/303-c99-complex-ugly-hack.patch b/meta/packages/gcc/gcc-4.1.1/303-c99-complex-ugly-hack.patch deleted file mode 100644 index 2ccc80d9bb..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/303-c99-complex-ugly-hack.patch +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | --- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 | ||
2 | +++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 | ||
3 | @@ -7194,6 +7194,9 @@ | ||
4 | cat >>conftest.$ac_ext <<_ACEOF | ||
5 | /* end confdefs.h. */ | ||
6 | #include <complex.h> | ||
7 | +#ifdef __UCLIBC__ | ||
8 | +#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs | ||
9 | +#endif | ||
10 | int | ||
11 | main () | ||
12 | { | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/304-index_macro.patch b/meta/packages/gcc/gcc-4.1.1/304-index_macro.patch deleted file mode 100644 index 1fac112fa9..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/304-index_macro.patch +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | --- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 | ||
2 | +++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 | ||
3 | @@ -59,6 +59,9 @@ | ||
4 | #include <bits/allocator.h> | ||
5 | #include <ext/hash_fun.h> | ||
6 | |||
7 | +/* cope w/ index defined as macro, SuSv3 proposal */ | ||
8 | +#undef index | ||
9 | + | ||
10 | # ifdef __GC | ||
11 | # define __GC_CONST const | ||
12 | # else | ||
13 | --- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 | ||
14 | +++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 | ||
15 | @@ -53,6 +53,9 @@ | ||
16 | #include <ext/memory> // For uninitialized_copy_n | ||
17 | #include <ext/numeric> // For power | ||
18 | |||
19 | +/* cope w/ index defined as macro, SuSv3 proposal */ | ||
20 | +#undef index | ||
21 | + | ||
22 | namespace __gnu_cxx | ||
23 | { | ||
24 | using std::size_t; | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/602-sdk-libstdc++-includes.patch b/meta/packages/gcc/gcc-4.1.1/602-sdk-libstdc++-includes.patch deleted file mode 100644 index 23fce7544d..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/602-sdk-libstdc++-includes.patch +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | --- gcc-4.1.0/libstdc++-v3/fragment.am 2005-03-21 11:40:14.000000000 -0600 | ||
2 | +++ gcc-4.1.0-patched/libstdc++-v3/fragment.am 2005-04-25 20:14:39.856251785 -0500 | ||
3 | @@ -21,5 +21,5 @@ | ||
4 | $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once | ||
5 | |||
6 | # -I/-D flags to pass when compiling. | ||
7 | -AM_CPPFLAGS = $(GLIBCXX_INCLUDES) | ||
8 | +AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include | ||
9 | |||
10 | --- gcc-4.1.0/libstdc++-v3/libmath/Makefile.am 2005-03-21 11:40:18.000000000 -0600 | ||
11 | +++ gcc-4.1.0-patched/libstdc++-v3/libmath/Makefile.am 2005-04-25 20:14:39.682280735 -0500 | ||
12 | @@ -35,7 +35,7 @@ | ||
13 | |||
14 | libmath_la_SOURCES = stubs.c | ||
15 | |||
16 | -AM_CPPFLAGS = $(CANADIAN_INCLUDES) | ||
17 | +AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include | ||
18 | |||
19 | # Only compiling "C" sources in this directory. | ||
20 | LIBTOOL = @LIBTOOL@ --tag CC | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/740-sh-pr24836.patch b/meta/packages/gcc/gcc-4.1.1/740-sh-pr24836.patch deleted file mode 100644 index 7992282cff..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/740-sh-pr24836.patch +++ /dev/null | |||
@@ -1,25 +0,0 @@ | |||
1 | http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348 | ||
2 | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836 | ||
3 | |||
4 | --- gcc/gcc/configure.ac (revision 106699) | ||
5 | +++ gcc/gcc/configure.ac (working copy) | ||
6 | @@ -2446,7 +2446,7 @@ | ||
7 | tls_first_minor=14 | ||
8 | tls_as_opt="-m64 -Aesame --fatal-warnings" | ||
9 | ;; | ||
10 | - sh-*-* | sh[34]-*-*) | ||
11 | + sh-*-* | sh[34]*-*-*) | ||
12 | conftest_s=' | ||
13 | .section ".tdata","awT",@progbits | ||
14 | foo: .long 25 | ||
15 | --- gcc/gcc/configure | ||
16 | +++ gcc/gcc/configure | ||
17 | @@ -14846,7 +14846,7 @@ | ||
18 | tls_first_minor=14 | ||
19 | tls_as_opt="-m64 -Aesame --fatal-warnings" | ||
20 | ;; | ||
21 | - sh-*-* | sh[34]-*-*) | ||
22 | + sh-*-* | sh[34]*-*-*) | ||
23 | conftest_s=' | ||
24 | .section ".tdata","awT",@progbits | ||
25 | foo: .long 25 | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/800-arm-bigendian.patch b/meta/packages/gcc/gcc-4.1.1/800-arm-bigendian.patch deleted file mode 100644 index 1fa5ae1cd2..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/800-arm-bigendian.patch +++ /dev/null | |||
@@ -1,67 +0,0 @@ | |||
1 | By Lennert Buytenhek <buytenh@wantstofly.org> | ||
2 | Adds support for arm*b-linux* big-endian ARM targets | ||
3 | |||
4 | See http://gcc.gnu.org/PR16350 | ||
5 | |||
6 | --- gcc-4.1.0/gcc/config/arm/linux-elf.h | ||
7 | +++ gcc-4.1.0/gcc/config/arm/linux-elf.h | ||
8 | @@ -28,19 +28,33 @@ | ||
9 | #undef TARGET_VERSION | ||
10 | #define TARGET_VERSION fputs (" (ARM GNU/Linux with ELF)", stderr); | ||
11 | |||
12 | +/* | ||
13 | + * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* | ||
14 | + * (big endian) configurations. | ||
15 | + */ | ||
16 | +#if TARGET_BIG_ENDIAN_DEFAULT | ||
17 | +#define TARGET_ENDIAN_DEFAULT MASK_BIG_END | ||
18 | +#define TARGET_ENDIAN_OPTION "mbig-endian" | ||
19 | +#define TARGET_LINKER_EMULATION "armelfb_linux" | ||
20 | +#else | ||
21 | +#define TARGET_ENDIAN_DEFAULT 0 | ||
22 | +#define TARGET_ENDIAN_OPTION "mlittle-endian" | ||
23 | +#define TARGET_LINKER_EMULATION "armelf_linux" | ||
24 | +#endif | ||
25 | + | ||
26 | #undef TARGET_DEFAULT_FLOAT_ABI | ||
27 | #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD | ||
28 | |||
29 | #undef TARGET_DEFAULT | ||
30 | -#define TARGET_DEFAULT (0) | ||
31 | +#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) | ||
32 | |||
33 | #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 | ||
34 | |||
35 | -#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" | ||
36 | +#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" | ||
37 | |||
38 | #undef MULTILIB_DEFAULTS | ||
39 | #define MULTILIB_DEFAULTS \ | ||
40 | - { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } | ||
41 | + { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } | ||
42 | |||
43 | /* Now we define the strings used to build the spec file. */ | ||
44 | #undef LIB_SPEC | ||
45 | @@ -61,7 +75,7 @@ | ||
46 | %{rdynamic:-export-dynamic} \ | ||
47 | %{!dynamic-linker:-dynamic-linker " LINUX_TARGET_INTERPRETER "} \ | ||
48 | -X \ | ||
49 | - %{mbig-endian:-EB}" \ | ||
50 | + %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ | ||
51 | SUBTARGET_EXTRA_LINK_SPEC | ||
52 | |||
53 | #undef LINK_SPEC | ||
54 | --- gcc-4.1.0/gcc/config.gcc | ||
55 | +++ gcc-4.1.0/gcc/config.gcc | ||
56 | @@ -672,6 +672,11 @@ | ||
57 | ;; | ||
58 | arm*-*-linux*) # ARM GNU/Linux with ELF | ||
59 | tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" | ||
60 | + case $target in | ||
61 | + arm*b-*) | ||
62 | + tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" | ||
63 | + ;; | ||
64 | + esac | ||
65 | tmake_file="${tmake_file} t-linux arm/t-arm" | ||
66 | case ${target} in | ||
67 | arm*-*-linux-gnueabi) | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/801-arm-bigendian-eabi.patch b/meta/packages/gcc/gcc-4.1.1/801-arm-bigendian-eabi.patch deleted file mode 100644 index 54490fc24f..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/801-arm-bigendian-eabi.patch +++ /dev/null | |||
@@ -1,14 +0,0 @@ | |||
1 | Index: gcc-4.1.1/gcc/config/arm/linux-eabi.h | ||
2 | =================================================================== | ||
3 | --- gcc-4.1.1.orig/gcc/config/arm/linux-eabi.h 2007-02-20 14:51:33.416193250 +0100 | ||
4 | +++ gcc-4.1.1/gcc/config/arm/linux-eabi.h 2007-02-20 14:52:11.622581000 +0100 | ||
5 | @@ -48,7 +48,8 @@ | ||
6 | #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi | ||
7 | |||
8 | #undef SUBTARGET_EXTRA_LINK_SPEC | ||
9 | -#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux_eabi" | ||
10 | +#define SUBTARGET_EXTRA_LINK_SPEC \ | ||
11 | + " %{mbig-endian:-m armelfb_linux_eabi} %{mlittle-endian:-m armelf_linux_eabi} " | ||
12 | |||
13 | /* Use ld-linux.so.3 so that it will be possible to run "classic" | ||
14 | GNU/Linux binaries on an EABI system. */ | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/README b/meta/packages/gcc/gcc-4.1.1/README deleted file mode 100644 index b85840dc20..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/README +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | The numbered patches come from | ||
2 | http://www.uclibc.org/cgi-bin/viewcvs.cgi/trunk/buildroot/toolchain/gcc/4.1.1/ | ||
3 | Other patches are locally added to fix things (mostly inherited and reapplied | ||
4 | from gcc 3.4.4 where applicable) | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/arm-nolibfloat.patch b/meta/packages/gcc/gcc-4.1.1/arm-nolibfloat.patch deleted file mode 100644 index c4897c0330..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/arm-nolibfloat.patch +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | # Dimitry Andric <dimitry@andric.com>, 2004-05-01 | ||
2 | # | ||
3 | # * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed | ||
4 | # anymore. (The required functions are now in libgcc.) | ||
5 | # | ||
6 | # Fixes errors like | ||
7 | # arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat | ||
8 | # collect2: ld returned 1 exit status | ||
9 | # make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 | ||
10 | # when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat | ||
11 | |||
12 | Index: gcc-4.0.2/gcc/config/arm/linux-elf.h | ||
13 | =================================================================== | ||
14 | --- gcc-4.0.2.orig/gcc/config/arm/linux-elf.h 2005-03-04 16:14:01.000000000 +0000 | ||
15 | +++ gcc-4.0.2/gcc/config/arm/linux-elf.h 2005-11-11 18:02:54.000000000 +0000 | ||
16 | @@ -56,7 +56,7 @@ | ||
17 | %{shared:-lc} \ | ||
18 | %{!shared:%{profile:-lc_p}%{!profile:-lc}}" | ||
19 | |||
20 | -#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" | ||
21 | +#define LIBGCC_SPEC "-lgcc" | ||
22 | |||
23 | /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add | ||
24 | the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/arm-softfloat.patch b/meta/packages/gcc/gcc-4.1.1/arm-softfloat.patch deleted file mode 100644 index c86c83ed15..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/arm-softfloat.patch +++ /dev/null | |||
@@ -1,16 +0,0 @@ | |||
1 | Index: gcc-4.0.2/gcc/config/arm/t-linux | ||
2 | =================================================================== | ||
3 | --- gcc-4.0.2.orig/gcc/config/arm/t-linux 2004-05-15 12:41:35.000000000 +0000 | ||
4 | +++ gcc-4.0.2/gcc/config/arm/t-linux 2005-11-11 16:07:53.000000000 +0000 | ||
5 | @@ -4,7 +4,10 @@ | ||
6 | LIBGCC2_DEBUG_CFLAGS = -g0 | ||
7 | |||
8 | LIB1ASMSRC = arm/lib1funcs.asm | ||
9 | -LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx | ||
10 | +LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ | ||
11 | + _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ | ||
12 | + _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ | ||
13 | + _fixsfsi _fixunssfsi _floatdidf _floatdisf | ||
14 | |||
15 | # MULTILIB_OPTIONS = mhard-float/msoft-float | ||
16 | # MULTILIB_DIRNAMES = hard-float soft-float | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/arm-thumb-cache.patch b/meta/packages/gcc/gcc-4.1.1/arm-thumb-cache.patch deleted file mode 100644 index fa63846c8c..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/arm-thumb-cache.patch +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | --- gcc-4.1.1/gcc/config/arm/linux-gas.h- 2005-06-25 03:22:41.000000000 +0200 | ||
2 | +++ gcc-4.1.1/gcc/config/arm/linux-gas.h 2006-06-18 10:23:46.000000000 +0200 | ||
3 | @@ -44,6 +44,7 @@ | ||
4 | |||
5 | /* Clear the instruction cache from `beg' to `end'. This makes an | ||
6 | inline system call to SYS_cacheflush. */ | ||
7 | +#if !defined(__thumb__) | ||
8 | #define CLEAR_INSN_CACHE(BEG, END) \ | ||
9 | { \ | ||
10 | register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ | ||
11 | @@ -53,3 +54,18 @@ | ||
12 | : "=r" (_beg) \ | ||
13 | : "0" (_beg), "r" (_end), "r" (_flg)); \ | ||
14 | } | ||
15 | +#else | ||
16 | +#define CLEAR_INSN_CACHE(BEG, END) \ | ||
17 | +{ \ | ||
18 | + register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ | ||
19 | + register unsigned long _end __asm ("a2") = (unsigned long) (END); \ | ||
20 | + register unsigned long _flg __asm ("a3") = 0; \ | ||
21 | + register unsigned long _swi __asm ("a4") = 0xf0002; \ | ||
22 | + __asm __volatile ("push {r7}\n" \ | ||
23 | + " mov r7,a4\n" \ | ||
24 | + " swi 0 @ sys_cacheflush\n" \ | ||
25 | + " pop {r7}\n" \ | ||
26 | + : "=r" (_beg) \ | ||
27 | + : "0" (_beg), "r" (_end), "r" (_flg), "r" (_swi)); \ | ||
28 | +} | ||
29 | +#endif | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/arm-thumb.patch b/meta/packages/gcc/gcc-4.1.1/arm-thumb.patch deleted file mode 100644 index 69e2f68cf2..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/arm-thumb.patch +++ /dev/null | |||
@@ -1,64 +0,0 @@ | |||
1 | |||
2 | # | ||
3 | # Patch managed by http://www.holgerschurig.de/patcher.html | ||
4 | # | ||
5 | |||
6 | --- gcc-4.1.1/gcc/config/arm/lib1funcs.asm~gcc | ||
7 | +++ gcc-4.1.1/gcc/config/arm/lib1funcs.asm | ||
8 | @@ -995,10 +995,24 @@ | ||
9 | .code 32 | ||
10 | FUNC_START div0 | ||
11 | |||
12 | +#if ! defined __thumb__ | ||
13 | stmfd sp!, {r1, lr} | ||
14 | mov r0, #SIGFPE | ||
15 | bl SYM(raise) __PLT__ | ||
16 | RETLDM r1 | ||
17 | +#else | ||
18 | + push {r1, lr} | ||
19 | + mov r0, #SIGFPE | ||
20 | + bl SYM(raise) __PLT__ | ||
21 | +#if __ARM_ARCH__ > 4 | ||
22 | + pop {r1, pc} | ||
23 | +#else | ||
24 | + @ on 4T that won't work | ||
25 | + pop {r1} | ||
26 | + pop {r3} | ||
27 | + bx r3 | ||
28 | +#endif | ||
29 | +#endif | ||
30 | |||
31 | FUNC_END div0 | ||
32 | |||
33 | @@ -1141,11 +1155,12 @@ | ||
34 | code here switches to the correct mode before executing the function. */ | ||
35 | |||
36 | .text | ||
37 | - .align 0 | ||
38 | + .align 1 | ||
39 | .force_thumb | ||
40 | |||
41 | .macro call_via register | ||
42 | THUMB_FUNC_START _call_via_\register | ||
43 | + .hidden SYM (_call_via_\register) | ||
44 | |||
45 | bx \register | ||
46 | nop | ||
47 | @@ -1242,6 +1257,7 @@ | ||
48 | .code 16 | ||
49 | |||
50 | THUMB_FUNC_START _interwork_call_via_\register | ||
51 | + .hidden SYM (_interwork_call_via_\register) | ||
52 | |||
53 | bx pc | ||
54 | nop | ||
55 | --- gcc-4.1.1/gcc/config/arm/t-linux~gcc | ||
56 | +++ gcc-4.1.1/gcc/config/arm/t-linux | ||
57 | @@ -7,6 +7,7 @@ | ||
58 | LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ | ||
59 | _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ | ||
60 | _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ | ||
61 | + _call_via_rX \ | ||
62 | _fixsfsi _fixunssfsi _floatdidf _floatdisf | ||
63 | |||
64 | # MULTILIB_OPTIONS = mhard-float/msoft-float | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/cse.patch b/meta/packages/gcc/gcc-4.1.1/cse.patch deleted file mode 100644 index 88b22c714f..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/cse.patch +++ /dev/null | |||
@@ -1,75 +0,0 @@ | |||
1 | -- gcc-4_1-branch/gcc/cse.c 2006/07/20 14:20:26 115619 | ||
2 | +++ gcc-4_1-branch/gcc/cse.c 2006/07/20 15:07:25 115620 | ||
3 | @@ -4697,6 +4697,8 @@ | ||
4 | unsigned src_const_hash; | ||
5 | /* Table entry for constant equivalent for SET_SRC, if any. */ | ||
6 | struct table_elt *src_const_elt; | ||
7 | + /* Table entry for the destination address. */ | ||
8 | + struct table_elt *dest_addr_elt; | ||
9 | }; | ||
10 | |||
11 | static void | ||
12 | @@ -5936,6 +5938,40 @@ | ||
13 | so that the destination goes into that class. */ | ||
14 | sets[i].src_elt = src_eqv_elt; | ||
15 | |||
16 | + /* Record destination addresses in the hash table. This allows us to | ||
17 | + check if they are invalidated by other sets. */ | ||
18 | + for (i = 0; i < n_sets; i++) | ||
19 | + { | ||
20 | + if (sets[i].rtl) | ||
21 | + { | ||
22 | + rtx x = sets[i].inner_dest; | ||
23 | + struct table_elt *elt; | ||
24 | + enum machine_mode mode; | ||
25 | + unsigned hash; | ||
26 | + | ||
27 | + if (MEM_P (x)) | ||
28 | + { | ||
29 | + x = XEXP (x, 0); | ||
30 | + mode = GET_MODE (x); | ||
31 | + hash = HASH (x, mode); | ||
32 | + elt = lookup (x, hash, mode); | ||
33 | + if (!elt) | ||
34 | + { | ||
35 | + if (insert_regs (x, NULL, 0)) | ||
36 | + { | ||
37 | + rehash_using_reg (x); | ||
38 | + hash = HASH (x, mode); | ||
39 | + } | ||
40 | + elt = insert (x, NULL, hash, mode); | ||
41 | + } | ||
42 | + | ||
43 | + sets[i].dest_addr_elt = elt; | ||
44 | + } | ||
45 | + else | ||
46 | + sets[i].dest_addr_elt = NULL; | ||
47 | + } | ||
48 | + } | ||
49 | + | ||
50 | invalidate_from_clobbers (x); | ||
51 | |||
52 | /* Some registers are invalidated by subroutine calls. Memory is | ||
53 | @@ -6028,12 +6064,20 @@ | ||
54 | } | ||
55 | |||
56 | /* We may have just removed some of the src_elt's from the hash table. | ||
57 | - So replace each one with the current head of the same class. */ | ||
58 | + So replace each one with the current head of the same class. | ||
59 | + Also check if destination addresses have been removed. */ | ||
60 | |||
61 | for (i = 0; i < n_sets; i++) | ||
62 | if (sets[i].rtl) | ||
63 | { | ||
64 | - if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0) | ||
65 | + if (sets[i].dest_addr_elt | ||
66 | + && sets[i].dest_addr_elt->first_same_value == 0) | ||
67 | + { | ||
68 | + /* The elt was removed, which means this destination s not | ||
69 | + valid after this instruction. */ | ||
70 | + sets[i].rtl = NULL_RTX; | ||
71 | + } | ||
72 | + else if (sets[i].src_elt && sets[i].src_elt->first_same_value == 0) | ||
73 | /* If elt was removed, find current head of same class, | ||
74 | or 0 if nothing remains of that class. */ | ||
75 | { | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/fix-ICE-in-arm_unwind_emit_set.diff b/meta/packages/gcc/gcc-4.1.1/fix-ICE-in-arm_unwind_emit_set.diff deleted file mode 100644 index 568e15abff..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/fix-ICE-in-arm_unwind_emit_set.diff +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | --- trunk/gcc/config/arm/arm.c 2006/09/19 13:18:27 117055 | ||
2 | +++ trunk/gcc/config/arm/arm.c 2006/09/19 13:19:24 117056 | ||
3 | @@ -15415,6 +15415,15 @@ | ||
4 | /* Move from sp to reg. */ | ||
5 | asm_fprintf (asm_out_file, "\t.movsp %r\n", REGNO (e0)); | ||
6 | } | ||
7 | + else if (GET_CODE (e1) == PLUS | ||
8 | + && GET_CODE (XEXP (e1, 0)) == REG | ||
9 | + && REGNO (XEXP (e1, 0)) == SP_REGNUM | ||
10 | + && GET_CODE (XEXP (e1, 1)) == CONST_INT) | ||
11 | + { | ||
12 | + /* Set reg to offset from sp. */ | ||
13 | + asm_fprintf (asm_out_file, "\t.movsp %r, #%d\n", | ||
14 | + REGNO (e0), (int)INTVAL(XEXP (e1, 1))); | ||
15 | + } | ||
16 | else | ||
17 | abort (); | ||
18 | break; | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/gcc-4.1.1-pr13685-1.patch b/meta/packages/gcc/gcc-4.1.1/gcc-4.1.1-pr13685-1.patch deleted file mode 100644 index a56b1307df..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/gcc-4.1.1-pr13685-1.patch +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | Submitted By: Alexander E. Patrakov | ||
2 | Date: 2006-12-11 | ||
3 | Initial Package Version: 4.1.1 | ||
4 | Upstream Status: backport | ||
5 | Origin: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28621 | ||
6 | Description: Fix crash of programs compiled with -Os -ffast-math | ||
7 | (affects procps on the LiveCD) | ||
8 | --- gcc-4.1.1/gcc/config/i386/i386.c | ||
9 | +++ gcc-4.1.1/gcc/config/i386/i386.c | ||
10 | @@ -1502,12 +1502,10 @@ | ||
11 | } | ||
12 | |||
13 | /* Validate -mpreferred-stack-boundary= value, or provide default. | ||
14 | - The default of 128 bits is for Pentium III's SSE __m128, but we | ||
15 | - don't want additional code to keep the stack aligned when | ||
16 | - optimizing for code size. */ | ||
17 | - ix86_preferred_stack_boundary = (optimize_size | ||
18 | - ? TARGET_64BIT ? 128 : 32 | ||
19 | - : 128); | ||
20 | + The default of 128 bits is for Pentium III's SSE __m128, We can't | ||
21 | + change it because of optimize_size. Otherwise, we can't mix object | ||
22 | + files compiled with -Os and -On. */ | ||
23 | + ix86_preferred_stack_boundary = 128; | ||
24 | if (ix86_preferred_stack_boundary_string) | ||
25 | { | ||
26 | i = atoi (ix86_preferred_stack_boundary_string); | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/gcc-ignore-cache.patch b/meta/packages/gcc/gcc-4.1.1/gcc-ignore-cache.patch deleted file mode 100644 index 396b4b2345..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/gcc-ignore-cache.patch +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | --- /gcc/orig-configure 2007-03-11 21:50:28.000000000 +0200 | ||
2 | +++ /gcc/configure 2007-03-11 21:53:27.000000000 +0200 | ||
3 | @@ -12272,9 +12272,11 @@ | ||
4 | esac | ||
5 | saved_CFLAGS="${CFLAGS}" | ||
6 | CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \ | ||
7 | + CONFIG_SITE="" | ||
8 | ${realsrcdir}/configure \ | ||
9 | --enable-languages=${enable_languages-all} \ | ||
10 | - --target=$target_alias --host=$build_alias --build=$build_alias | ||
11 | + --target=$target_alias --host=$build_alias --build=$build_alias \ | ||
12 | + --cache-file=./tmp-cache | ||
13 | CFLAGS="${saved_CFLAGS}" | ||
14 | |||
15 | # We just finished tests for the build machine, so rename | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/gcc41-configure.in.patch b/meta/packages/gcc/gcc-4.1.1/gcc41-configure.in.patch deleted file mode 100644 index 3d33bcb978..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/gcc41-configure.in.patch +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | --- gcc-3.4.4/configure.in.orig 2005-08-09 19:57:51.504323183 -0700 | ||
2 | +++ gcc-3.4.4/configure.in 2005-08-09 20:00:12.073168623 -0700 | ||
3 | @@ -1907,7 +1907,7 @@ | ||
4 | *) gxx_include_dir=${with_gxx_include_dir} ;; | ||
5 | esac | ||
6 | |||
7 | -FLAGS_FOR_TARGET= | ||
8 | +FLAGS_FOR_TARGET="$ARCH_FLAGS_FOR_TARGET" | ||
9 | case " $target_configdirs " in | ||
10 | *" newlib "*) | ||
11 | case " $target_configargs " in | ||
12 | --- gcc-3.4.4/configure.orig 2005-08-09 21:02:29.668360660 -0700 | ||
13 | +++ gcc-3.4.4/configure 2005-08-09 21:02:50.157649970 -0700 | ||
14 | @@ -2669,7 +2669,7 @@ | ||
15 | *) gxx_include_dir=${with_gxx_include_dir} ;; | ||
16 | esac | ||
17 | |||
18 | -FLAGS_FOR_TARGET= | ||
19 | +FLAGS_FOR_TARGET="$ARCH_FLAGS_FOR_TARGET" | ||
20 | case " $target_configdirs " in | ||
21 | *" newlib "*) | ||
22 | case " $target_configargs " in | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/ldflags.patch b/meta/packages/gcc/gcc-4.1.1/ldflags.patch deleted file mode 100644 index 9576f60778..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/ldflags.patch +++ /dev/null | |||
@@ -1,22 +0,0 @@ | |||
1 | --- /tmp/Makefile.in 2006-02-23 20:56:01.399758728 +0100 | ||
2 | +++ gcc-4.1-20060217/Makefile.in 2006-02-23 20:56:16.874406224 +0100 | ||
3 | @@ -334,7 +334,7 @@ | ||
4 | CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) | ||
5 | LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET) | ||
6 | LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates | ||
7 | -LDFLAGS_FOR_TARGET = | ||
8 | +LDFLAGS_FOR_TARGET = @LDFLAGS@ | ||
9 | PICFLAG_FOR_TARGET = | ||
10 | |||
11 | # ------------------------------------ | ||
12 | --- /tmp/Makefile.tpl 2006-02-23 20:50:34.077519272 +0100 | ||
13 | +++ gcc-4.1-20060217/Makefile.tpl 2006-02-23 21:04:31.092273688 +0100 | ||
14 | @@ -337,7 +337,7 @@ | ||
15 | CXXFLAGS_FOR_TARGET = $(CXXFLAGS) $(SYSROOT_CFLAGS_FOR_TARGET) | ||
16 | LIBCFLAGS_FOR_TARGET = $(CFLAGS_FOR_TARGET) | ||
17 | LIBCXXFLAGS_FOR_TARGET = $(CXXFLAGS_FOR_TARGET) -fno-implicit-templates | ||
18 | -LDFLAGS_FOR_TARGET = | ||
19 | +LDFLAGS_FOR_TARGET = @LDFLAGS@ | ||
20 | PICFLAG_FOR_TARGET = | ||
21 | |||
22 | # ------------------------------------ | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/ppc-gcc-41-20060515.patch b/meta/packages/gcc/gcc-4.1.1/ppc-gcc-41-20060515.patch deleted file mode 100644 index 166e79c7e9..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/ppc-gcc-41-20060515.patch +++ /dev/null | |||
@@ -1,2225 +0,0 @@ | |||
1 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/ChangeLog gcc-41-20060515/gcc/ChangeLog | ||
2 | --- gcc-41-20060515.orig/gcc/ChangeLog 2006-05-15 11:14:20.000000000 -0500 | ||
3 | +++ gcc-41-20060515/gcc/ChangeLog 2006-05-15 14:00:27.693964000 -0500 | ||
4 | @@ -724,6 +724,51 @@ | ||
5 | * reload1.c (choose_reload_regs): Added call of regno_clobbered_p | ||
6 | with new meaning of SETS. | ||
7 | |||
8 | +2006-02-14 Jakub Jelinek <jakub@redhat.com> | ||
9 | + Aldy Hernandez <aldyh@redhat.com> | ||
10 | + | ||
11 | + PR target/25864 | ||
12 | + * configure.ac: Add --with{out}-long-double-128 configure option. | ||
13 | + (TARGET_DEFAULT_LONG_DOUBLE_128): New test. | ||
14 | + * configure: Rebuilt. | ||
15 | + * config.in: Rebuilt. | ||
16 | + * doc/install.texi (Options specification): Document | ||
17 | + --with-long-double-128. | ||
18 | + | ||
19 | + * config.gcc (sparc-*-linux*): Add sparc/t-linux to tmake_file. | ||
20 | + (sparc64-*-linux*): Likewise. | ||
21 | + * config/sparc/t-linux64 (SHLIB_MAPFILES): Removed. | ||
22 | + * config/sparc/t-linux: New file. | ||
23 | + * config/sparc/libgcc-sparc-glibc.ver (__fixtfdi, __fixunstfdi, | ||
24 | + __floatditf): Export at GCC_LDBL_3.0 if -m32 -mlong-double-128. | ||
25 | + (__divtc3, __multc3, __powitf2): Export at GCC_LDBL_4.0.0 if | ||
26 | + -m32 -mlong-double-128. | ||
27 | + | ||
28 | + * config.gcc (alpha*-*-linux*): Add alpha/t-linux to tmake_file. | ||
29 | + * config/alpha/t-linux: New file. | ||
30 | + * config/alpha/libgcc-alpha-ldbl.ver: New file. | ||
31 | + | ||
32 | + * config/sparc/linux.h (TARGET_OS_CPP_BUILTINS): Define | ||
33 | + __LONG_DOUBLE_128__ if TARGET_LONG_DOUBLE_128. | ||
34 | + (CPP_SUBTARGET_SPEC): Don't add -D__LONG_DOUBLE_128__ here. | ||
35 | + * config/sparc/linux64.h (TARGET_OS_CPP_BUILTINS): Define | ||
36 | + __LONG_DOUBLE_128__ if TARGET_LONG_DOUBLE_128 and TARGET_ARCH32. | ||
37 | + (CPP_ARCH32_SPEC): Remove. | ||
38 | + | ||
39 | + * config/s390/s390.c (override_options): Handle | ||
40 | + TARGET_DEFAULT_LONG_DOUBLE_128. | ||
41 | + | ||
42 | + * config/alpha/alpha.c (override_options): Handle | ||
43 | + TARGET_DEFAULT_LONG_DOUBLE_128. | ||
44 | + | ||
45 | + * config/sparc/sparc.c (sparc_override_options): Handle | ||
46 | + TARGET_DEFAULT_LONG_DOUBLE_128. | ||
47 | + | ||
48 | + * config/rs6000/linux.h [TARGET_DEFAULT_LONG_DOUBLE_128] | ||
49 | + (RS6000_DEFAULT_LONG_DOUBLE_SIZE): Define to 128. | ||
50 | + * config/rs6000/linux64.h [TARGET_DEFAULT_LONG_DOUBLE_128] | ||
51 | + (RS6000_DEFAULT_LONG_DOUBLE_SIZE): Define to 128. | ||
52 | + | ||
53 | 2006-02-19 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | ||
54 | |||
55 | * doc/install.texi: Add missing `@samp'. | ||
56 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/alpha/alpha.c gcc-41-20060515/gcc/config/alpha/alpha.c | ||
57 | --- gcc-41-20060515.orig/gcc/config/alpha/alpha.c 2006-05-15 11:13:49.000000000 -0500 | ||
58 | +++ gcc-41-20060515/gcc/config/alpha/alpha.c 2006-05-15 13:47:27.566272961 -0500 | ||
59 | @@ -516,6 +516,11 @@ override_options (void) | ||
60 | REAL_MODE_FORMAT (DFmode) = &vax_g_format; | ||
61 | REAL_MODE_FORMAT (TFmode) = NULL; | ||
62 | } | ||
63 | + | ||
64 | +#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
65 | + if (!(target_flags_explicit & MASK_LONG_DOUBLE_128)) | ||
66 | + target_flags |= MASK_LONG_DOUBLE_128; | ||
67 | +#endif | ||
68 | } | ||
69 | |||
70 | /* Returns 1 if VALUE is a mask that contains full bytes of zero or ones. */ | ||
71 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/alpha/libgcc-alpha-ldbl.ver gcc-41-20060515/gcc/config/alpha/libgcc-alpha-ldbl.ver | ||
72 | --- gcc-41-20060515.orig/gcc/config/alpha/libgcc-alpha-ldbl.ver 1969-12-31 18:00:00.000000000 -0600 | ||
73 | +++ gcc-41-20060515/gcc/config/alpha/libgcc-alpha-ldbl.ver 2006-05-15 13:47:27.566272961 -0500 | ||
74 | @@ -0,0 +1,32 @@ | ||
75 | +%ifdef __LONG_DOUBLE_128__ | ||
76 | + | ||
77 | +# long double 128 bit support in libgcc_s.so.1 is only available | ||
78 | +# when configured with --with-long-double-128. Make sure all the | ||
79 | +# symbols are available at @@GCC_LDBL_* versions to make it clear | ||
80 | +# there is a configurable symbol set. | ||
81 | + | ||
82 | +%exclude { | ||
83 | + __fixtfdi | ||
84 | + __fixunstfdi | ||
85 | + __floatditf | ||
86 | + | ||
87 | + __divtc3 | ||
88 | + __multc3 | ||
89 | + __powitf2 | ||
90 | +} | ||
91 | + | ||
92 | +%inherit GCC_LDBL_3.0 GCC_3.0 | ||
93 | +GCC_LDBL_3.0 { | ||
94 | + __fixtfdi | ||
95 | + __fixunstfdi | ||
96 | + __floatditf | ||
97 | +} | ||
98 | + | ||
99 | +%inherit GCC_LDBL_4.0.0 GCC_4.0.0 | ||
100 | +GCC_LDBL_4.0.0 { | ||
101 | + __divtc3 | ||
102 | + __multc3 | ||
103 | + __powitf2 | ||
104 | +} | ||
105 | + | ||
106 | +%endif | ||
107 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/alpha/t-linux gcc-41-20060515/gcc/config/alpha/t-linux | ||
108 | --- gcc-41-20060515.orig/gcc/config/alpha/t-linux 1969-12-31 18:00:00.000000000 -0600 | ||
109 | +++ gcc-41-20060515/gcc/config/alpha/t-linux 2006-05-15 13:47:27.567272807 -0500 | ||
110 | @@ -0,0 +1 @@ | ||
111 | +SHLIB_MAPFILES += $(srcdir)/config/alpha/libgcc-alpha-ldbl.ver | ||
112 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/rs6000/linux64.h gcc-41-20060515/gcc/config/rs6000/linux64.h | ||
113 | --- gcc-41-20060515.orig/gcc/config/rs6000/linux64.h 2006-05-15 11:14:02.000000000 -0500 | ||
114 | +++ gcc-41-20060515/gcc/config/rs6000/linux64.h 2006-05-15 13:47:27.568272653 -0500 | ||
115 | @@ -570,3 +570,8 @@ while (0) | ||
116 | #endif | ||
117 | |||
118 | #define POWERPC_LINUX | ||
119 | + | ||
120 | +/* ppc{32,64} linux has 128-bit long double support in glibc 2.4 and later. */ | ||
121 | +#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
122 | +#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128 | ||
123 | +#endif | ||
124 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/rs6000/linux.h gcc-41-20060515/gcc/config/rs6000/linux.h | ||
125 | --- gcc-41-20060515.orig/gcc/config/rs6000/linux.h 2006-05-15 11:14:02.000000000 -0500 | ||
126 | +++ gcc-41-20060515/gcc/config/rs6000/linux.h 2006-05-15 13:47:27.567272807 -0500 | ||
127 | @@ -120,3 +120,8 @@ | ||
128 | #endif | ||
129 | |||
130 | #define POWERPC_LINUX | ||
131 | + | ||
132 | +/* ppc linux has 128-bit long double support in glibc 2.4 and later. */ | ||
133 | +#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
134 | +#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128 | ||
135 | +#endif | ||
136 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/s390/s390.c gcc-41-20060515/gcc/config/s390/s390.c | ||
137 | --- gcc-41-20060515.orig/gcc/config/s390/s390.c 2006-05-15 11:13:50.000000000 -0500 | ||
138 | +++ gcc-41-20060515/gcc/config/s390/s390.c 2006-05-15 13:47:27.574271730 -0500 | ||
139 | @@ -1415,6 +1415,11 @@ override_options (void) | ||
140 | } | ||
141 | else if (s390_stack_guard) | ||
142 | error ("-mstack-guard implies use of -mstack-size"); | ||
143 | + | ||
144 | +#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
145 | + if (!(target_flags_explicit & MASK_LONG_DOUBLE_128)) | ||
146 | + target_flags |= MASK_LONG_DOUBLE_128; | ||
147 | +#endif | ||
148 | } | ||
149 | |||
150 | /* Map for smallest class containing reg regno. */ | ||
151 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/libgcc-sparc-glibc.ver gcc-41-20060515/gcc/config/sparc/libgcc-sparc-glibc.ver | ||
152 | --- gcc-41-20060515.orig/gcc/config/sparc/libgcc-sparc-glibc.ver 2006-05-15 11:13:55.000000000 -0500 | ||
153 | +++ gcc-41-20060515/gcc/config/sparc/libgcc-sparc-glibc.ver 2006-05-15 13:47:27.574271730 -0500 | ||
154 | @@ -26,3 +26,36 @@ GLIBC_VER { | ||
155 | __frame_state_for | ||
156 | __register_frame_info_table | ||
157 | } | ||
158 | + | ||
159 | +%if !defined (__arch64__) && defined (__LONG_DOUBLE_128__) | ||
160 | + | ||
161 | +# long double 128 bit support from 32-bit libgcc_s.so.1 is only available | ||
162 | +# when configured with --with-long-double-128. Make sure all the | ||
163 | +# symbols are available at @@GCC_LDBL_* versions to make it clear | ||
164 | +# there is a configurable symbol set. | ||
165 | + | ||
166 | +%exclude { | ||
167 | + __fixtfdi | ||
168 | + __fixunstfdi | ||
169 | + __floatditf | ||
170 | + | ||
171 | + __divtc3 | ||
172 | + __multc3 | ||
173 | + __powitf2 | ||
174 | +} | ||
175 | + | ||
176 | +%inherit GCC_LDBL_3.0 GCC_3.0 | ||
177 | +GCC_LDBL_3.0 { | ||
178 | + __fixtfdi | ||
179 | + __fixunstfdi | ||
180 | + __floatditf | ||
181 | +} | ||
182 | + | ||
183 | +%inherit GCC_LDBL_4.0.0 GCC_4.0.0 | ||
184 | +GCC_LDBL_4.0.0 { | ||
185 | + __divtc3 | ||
186 | + __multc3 | ||
187 | + __powitf2 | ||
188 | +} | ||
189 | + | ||
190 | +%endif | ||
191 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/linux64.h gcc-41-20060515/gcc/config/sparc/linux64.h | ||
192 | --- gcc-41-20060515.orig/gcc/config/sparc/linux64.h 2006-05-15 11:13:55.000000000 -0500 | ||
193 | +++ gcc-41-20060515/gcc/config/sparc/linux64.h 2006-05-15 13:47:27.576271422 -0500 | ||
194 | @@ -20,22 +20,24 @@ along with GCC; see the file COPYING. I | ||
195 | the Free Software Foundation, 51 Franklin Street, Fifth Floor, | ||
196 | Boston, MA 02110-1301, USA. */ | ||
197 | |||
198 | -#define TARGET_OS_CPP_BUILTINS() \ | ||
199 | - do \ | ||
200 | - { \ | ||
201 | - builtin_define_std ("unix"); \ | ||
202 | - builtin_define_std ("linux"); \ | ||
203 | - builtin_define ("_LONGLONG"); \ | ||
204 | - builtin_define ("__gnu_linux__"); \ | ||
205 | - builtin_assert ("system=linux"); \ | ||
206 | - builtin_assert ("system=unix"); \ | ||
207 | - builtin_assert ("system=posix"); \ | ||
208 | - if (flag_pic) \ | ||
209 | - { \ | ||
210 | - builtin_define ("__PIC__"); \ | ||
211 | - builtin_define ("__pic__"); \ | ||
212 | - } \ | ||
213 | - } \ | ||
214 | +#define TARGET_OS_CPP_BUILTINS() \ | ||
215 | + do \ | ||
216 | + { \ | ||
217 | + builtin_define_std ("unix"); \ | ||
218 | + builtin_define_std ("linux"); \ | ||
219 | + builtin_define ("_LONGLONG"); \ | ||
220 | + builtin_define ("__gnu_linux__"); \ | ||
221 | + builtin_assert ("system=linux"); \ | ||
222 | + builtin_assert ("system=unix"); \ | ||
223 | + builtin_assert ("system=posix"); \ | ||
224 | + if (flag_pic) \ | ||
225 | + { \ | ||
226 | + builtin_define ("__PIC__"); \ | ||
227 | + builtin_define ("__pic__"); \ | ||
228 | + } \ | ||
229 | + if (TARGET_ARCH32 && TARGET_LONG_DOUBLE_128) \ | ||
230 | + builtin_define ("__LONG_DOUBLE_128__"); \ | ||
231 | + } \ | ||
232 | while (0) | ||
233 | |||
234 | /* Don't assume anything about the header files. */ | ||
235 | @@ -59,13 +61,6 @@ Boston, MA 02110-1301, USA. */ | ||
236 | #undef ASM_CPU_DEFAULT_SPEC | ||
237 | #define ASM_CPU_DEFAULT_SPEC "-Av9a" | ||
238 | |||
239 | -#ifdef SPARC_BI_ARCH | ||
240 | - | ||
241 | -#undef CPP_ARCH32_SPEC | ||
242 | -#define CPP_ARCH32_SPEC "%{mlong-double-128:-D__LONG_DOUBLE_128__}" | ||
243 | - | ||
244 | -#endif | ||
245 | - | ||
246 | /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add | ||
247 | the GNU/Linux magical crtbegin.o file (see crtstuff.c) which | ||
248 | provides part of the support for getting C++ file-scope static | ||
249 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/linux.h gcc-41-20060515/gcc/config/sparc/linux.h | ||
250 | --- gcc-41-20060515.orig/gcc/config/sparc/linux.h 2006-05-15 11:13:55.000000000 -0500 | ||
251 | +++ gcc-41-20060515/gcc/config/sparc/linux.h 2006-05-15 13:47:27.575271576 -0500 | ||
252 | @@ -23,17 +23,19 @@ Boston, MA 02110-1301, USA. */ | ||
253 | #define TARGET_OS_CPP_BUILTINS() \ | ||
254 | do \ | ||
255 | { \ | ||
256 | - builtin_define_std ("unix"); \ | ||
257 | - builtin_define_std ("linux"); \ | ||
258 | - builtin_define ("__gnu_linux__"); \ | ||
259 | - builtin_assert ("system=linux"); \ | ||
260 | - builtin_assert ("system=unix"); \ | ||
261 | - builtin_assert ("system=posix"); \ | ||
262 | - if (flag_pic) \ | ||
263 | - { \ | ||
264 | - builtin_define ("__PIC__"); \ | ||
265 | - builtin_define ("__pic__"); \ | ||
266 | - } \ | ||
267 | + builtin_define_std ("unix"); \ | ||
268 | + builtin_define_std ("linux"); \ | ||
269 | + builtin_define ("__gnu_linux__"); \ | ||
270 | + builtin_assert ("system=linux"); \ | ||
271 | + builtin_assert ("system=unix"); \ | ||
272 | + builtin_assert ("system=posix"); \ | ||
273 | + if (flag_pic) \ | ||
274 | + { \ | ||
275 | + builtin_define ("__PIC__"); \ | ||
276 | + builtin_define ("__pic__"); \ | ||
277 | + } \ | ||
278 | + if (TARGET_LONG_DOUBLE_128) \ | ||
279 | + builtin_define ("__LONG_DOUBLE_128__"); \ | ||
280 | } \ | ||
281 | while (0) | ||
282 | |||
283 | @@ -100,8 +102,7 @@ Boston, MA 02110-1301, USA. */ | ||
284 | |||
285 | #undef CPP_SUBTARGET_SPEC | ||
286 | #define CPP_SUBTARGET_SPEC \ | ||
287 | -"%{posix:-D_POSIX_SOURCE} \ | ||
288 | -%{pthread:-D_REENTRANT} %{mlong-double-128:-D__LONG_DOUBLE_128__}" | ||
289 | +"%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}" | ||
290 | |||
291 | #undef LIB_SPEC | ||
292 | #define LIB_SPEC \ | ||
293 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/sparc.c gcc-41-20060515/gcc/config/sparc/sparc.c | ||
294 | --- gcc-41-20060515.orig/gcc/config/sparc/sparc.c 2006-05-15 11:13:55.000000000 -0500 | ||
295 | +++ gcc-41-20060515/gcc/config/sparc/sparc.c 2006-05-15 13:47:27.581270653 -0500 | ||
296 | @@ -790,6 +790,11 @@ sparc_override_options (void) | ||
297 | sparc_costs = &ultrasparc3_costs; | ||
298 | break; | ||
299 | }; | ||
300 | + | ||
301 | +#ifdef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
302 | + if (!(target_flags_explicit & MASK_LONG_DOUBLE_128)) | ||
303 | + target_flags |= MASK_LONG_DOUBLE_128; | ||
304 | +#endif | ||
305 | } | ||
306 | |||
307 | #ifdef SUBTARGET_ATTRIBUTE_TABLE | ||
308 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/t-linux gcc-41-20060515/gcc/config/sparc/t-linux | ||
309 | --- gcc-41-20060515.orig/gcc/config/sparc/t-linux 1969-12-31 18:00:00.000000000 -0600 | ||
310 | +++ gcc-41-20060515/gcc/config/sparc/t-linux 2006-05-15 13:47:27.582270499 -0500 | ||
311 | @@ -0,0 +1,5 @@ | ||
312 | +# Override t-slibgcc-elf-ver to export some libgcc symbols with | ||
313 | +# the symbol versions that glibc used. | ||
314 | +# Avoid the t-linux version file. | ||
315 | +SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ | ||
316 | + $(srcdir)/config/sparc/libgcc-sparc-glibc.ver | ||
317 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config/sparc/t-linux64 gcc-41-20060515/gcc/config/sparc/t-linux64 | ||
318 | --- gcc-41-20060515.orig/gcc/config/sparc/t-linux64 2006-05-15 11:13:55.000000000 -0500 | ||
319 | +++ gcc-41-20060515/gcc/config/sparc/t-linux64 2006-05-15 13:47:27.582270499 -0500 | ||
320 | @@ -8,12 +8,6 @@ INSTALL_LIBGCC = install-multilib | ||
321 | EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o \ | ||
322 | crtfastmath.o | ||
323 | |||
324 | -# Override t-slibgcc-elf-ver to export some libgcc symbols with | ||
325 | -# the symbol versions that glibc used. | ||
326 | -# Avoid the t-linux version file. | ||
327 | -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ | ||
328 | - $(srcdir)/config/sparc/libgcc-sparc-glibc.ver | ||
329 | - | ||
330 | CRTSTUFF_T_CFLAGS = `if test x$$($(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) \ | ||
331 | -print-multi-os-directory) \ | ||
332 | = x../lib64; then echo -mcmodel=medany; fi` | ||
333 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config.gcc gcc-41-20060515/gcc/config.gcc | ||
334 | --- gcc-41-20060515.orig/gcc/config.gcc 2006-05-15 11:14:20.000000000 -0500 | ||
335 | +++ gcc-41-20060515/gcc/config.gcc 2006-05-15 13:47:27.555274654 -0500 | ||
336 | @@ -568,7 +568,7 @@ alpha*-*-unicosmk*) | ||
337 | alpha*-*-linux*) | ||
338 | tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h" | ||
339 | target_cpu_default="MASK_GAS" | ||
340 | - tmake_file="${tmake_file} alpha/t-crtfm alpha/t-alpha alpha/t-ieee" | ||
341 | + tmake_file="${tmake_file} alpha/t-crtfm alpha/t-alpha alpha/t-ieee alpha/t-linux" | ||
342 | ;; | ||
343 | alpha*-*-gnu*) | ||
344 | target_cpu_default="MASK_GAS" | ||
345 | @@ -2056,7 +2056,7 @@ sparc-*-elf*) | ||
346 | sparc-*-linux*) # SPARC's running GNU/Linux, libc6 | ||
347 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux.h" | ||
348 | extra_options="${extra_options} sparc/long-double-switch.opt" | ||
349 | - tmake_file="${tmake_file} sparc/t-crtfm" | ||
350 | + tmake_file="${tmake_file} sparc/t-linux sparc/t-crtfm" | ||
351 | ;; | ||
352 | sparc-*-rtems*) | ||
353 | tm_file="${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h" | ||
354 | @@ -2175,7 +2175,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd* | ||
355 | sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux | ||
356 | tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sparc/linux64.h" | ||
357 | extra_options="${extra_options} sparc/long-double-switch.opt" | ||
358 | - tmake_file="${tmake_file} sparc/t-linux64 sparc/t-crtfm" | ||
359 | + tmake_file="${tmake_file} sparc/t-linux sparc/t-linux64 sparc/t-crtfm" | ||
360 | ;; | ||
361 | sparc64-*-netbsd*) | ||
362 | tm_file="sparc/biarch64.h ${tm_file}" | ||
363 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/config.in gcc-41-20060515/gcc/config.in | ||
364 | --- gcc-41-20060515.orig/gcc/config.in 2006-05-15 11:14:20.000000000 -0500 | ||
365 | +++ gcc-41-20060515/gcc/config.in 2006-05-15 13:47:27.559274038 -0500 | ||
366 | @@ -1277,6 +1277,12 @@ | ||
367 | #endif | ||
368 | |||
369 | |||
370 | +/* Define if TFmode long double should be the default */ | ||
371 | +#ifndef USED_FOR_TARGET | ||
372 | +#undef TARGET_DEFAULT_LONG_DOUBLE_128 | ||
373 | +#endif | ||
374 | + | ||
375 | + | ||
376 | /* Define if your target C library provides stack protector support */ | ||
377 | #ifndef USED_FOR_TARGET | ||
378 | #undef TARGET_LIBC_PROVIDES_SSP | ||
379 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/configure gcc-41-20060515/gcc/configure | ||
380 | --- gcc-41-20060515.orig/gcc/configure 2006-05-15 11:14:19.000000000 -0500 | ||
381 | +++ gcc-41-20060515/gcc/configure 2006-05-15 13:47:27.594268652 -0500 | ||
382 | @@ -931,6 +931,7 @@ Optional Packages: | ||
383 | --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib | ||
384 | --without-libiconv-prefix don't search for libiconv in includedir and libdir | ||
385 | --with-system-libunwind use installed libunwind | ||
386 | + --with-long-double-128 Use 128-bit long double by default. | ||
387 | --with-gc={page,zone} choose the garbage collection mechanism to use | ||
388 | with the compiler | ||
389 | --with-system-zlib use installed libz | ||
390 | @@ -7492,7 +7493,7 @@ if test "${gcc_cv_prog_makeinfo_modern+s | ||
391 | else | ||
392 | ac_prog_version=`$MAKEINFO --version 2>&1 | | ||
393 | sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'` | ||
394 | - echo "configure:7495: version of makeinfo is $ac_prog_version" >&5 | ||
395 | + echo "configure:7496: version of makeinfo is $ac_prog_version" >&5 | ||
396 | case $ac_prog_version in | ||
397 | '') gcc_cv_prog_makeinfo_modern=no;; | ||
398 | 4.[2-9]*) | ||
399 | @@ -16213,6 +16214,46 @@ _ACEOF | ||
400 | |||
401 | fi | ||
402 | |||
403 | +# Check if TFmode long double should be used by default or not. | ||
404 | +# Some glibc targets used DFmode long double, but with glibc 2.4 | ||
405 | +# and later they can use TFmode. | ||
406 | +case "$target" in | ||
407 | + powerpc*-*-*gnu* | \ | ||
408 | + sparc*-*-linux* | \ | ||
409 | + s390*-*-linux* | \ | ||
410 | + alpha*-*-linux*) | ||
411 | + | ||
412 | +# Check whether --with-long-double-128 or --without-long-double-128 was given. | ||
413 | +if test "${with_long_double_128+set}" = set; then | ||
414 | + withval="$with_long_double_128" | ||
415 | + gcc_cv_target_ldbl128="$with_long_double_128" | ||
416 | +else | ||
417 | + gcc_cv_target_ldbl128=no | ||
418 | + if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then | ||
419 | + if test "x$with_sysroot" = x; then | ||
420 | + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include" | ||
421 | + elif test "x$with_sysroot" = xyes; then | ||
422 | + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-root/usr/include" | ||
423 | + else | ||
424 | + glibc_header_dir="${with_sysroot}/usr/include" | ||
425 | + fi | ||
426 | + else | ||
427 | + glibc_header_dir=/usr/include | ||
428 | + fi | ||
429 | + grep '^ *#[ ]*define[ ][ ]*__LONG_DOUBLE_MATH_OPTIONAL' \ | ||
430 | + $glibc_header_dir/bits/wordsize.h > /dev/null 2>&1 \ | ||
431 | + && gcc_cv_target_ldbl128=yes | ||
432 | +fi; | ||
433 | + ;; | ||
434 | +esac | ||
435 | +if test x$gcc_cv_target_ldbl128 = xyes; then | ||
436 | + | ||
437 | +cat >>confdefs.h <<\_ACEOF | ||
438 | +#define TARGET_DEFAULT_LONG_DOUBLE_128 1 | ||
439 | +_ACEOF | ||
440 | + | ||
441 | +fi | ||
442 | + | ||
443 | # Find out what GC implementation we want, or may, use. | ||
444 | |||
445 | # Check whether --with-gc or --without-gc was given. | ||
446 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/configure.ac gcc-41-20060515/gcc/configure.ac | ||
447 | --- gcc-41-20060515.orig/gcc/configure.ac 2006-05-15 11:14:20.000000000 -0500 | ||
448 | +++ gcc-41-20060515/gcc/configure.ac 2006-05-15 13:47:27.597400000 -0500 | ||
449 | @@ -3130,6 +3130,39 @@ if test x$gcc_cv_libc_provides_ssp = xye | ||
450 | [Define if your target C library provides stack protector support]) | ||
451 | fi | ||
452 | |||
453 | +# Check if TFmode long double should be used by default or not. | ||
454 | +# Some glibc targets used DFmode long double, but with glibc 2.4 | ||
455 | +# and later they can use TFmode. | ||
456 | +case "$target" in | ||
457 | + powerpc*-*-*gnu* | \ | ||
458 | + sparc*-*-linux* | \ | ||
459 | + s390*-*-linux* | \ | ||
460 | + alpha*-*-linux*) | ||
461 | + AC_ARG_WITH(long-double-128, | ||
462 | +[ --with-long-double-128 Use 128-bit long double by default.], | ||
463 | + gcc_cv_target_ldbl128="$with_long_double_128", | ||
464 | + [gcc_cv_target_ldbl128=no | ||
465 | + if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then | ||
466 | + if test "x$with_sysroot" = x; then | ||
467 | + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include" | ||
468 | + elif test "x$with_sysroot" = xyes; then | ||
469 | + glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-root/usr/include" | ||
470 | + else | ||
471 | + glibc_header_dir="${with_sysroot}/usr/include" | ||
472 | + fi | ||
473 | + else | ||
474 | + glibc_header_dir=/usr/include | ||
475 | + fi | ||
476 | + grep '^[ ]*#[ ]*define[ ][ ]*__LONG_DOUBLE_MATH_OPTIONAL' \ | ||
477 | + $glibc_header_dir/bits/wordsize.h > /dev/null 2>&1 \ | ||
478 | + && gcc_cv_target_ldbl128=yes]) | ||
479 | + ;; | ||
480 | +esac | ||
481 | +if test x$gcc_cv_target_ldbl128 = xyes; then | ||
482 | + AC_DEFINE(TARGET_DEFAULT_LONG_DOUBLE_128, 1, | ||
483 | + [Define if TFmode long double should be the default]) | ||
484 | +fi | ||
485 | + | ||
486 | # Find out what GC implementation we want, or may, use. | ||
487 | AC_ARG_WITH(gc, | ||
488 | [ --with-gc={page,zone} choose the garbage collection mechanism to use | ||
489 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/gcc/doc/install.texi gcc-41-20060515/gcc/doc/install.texi | ||
490 | --- gcc-41-20060515.orig/gcc/doc/install.texi 2006-05-15 11:10:10.000000000 -0500 | ||
491 | +++ gcc-41-20060515/gcc/doc/install.texi 2006-05-15 13:47:27.600399538 -0500 | ||
492 | @@ -1224,6 +1224,14 @@ error message. | ||
493 | All support for systems which have been obsoleted in one release of GCC | ||
494 | is removed entirely in the next major release, unless someone steps | ||
495 | forward to maintain the port. | ||
496 | + | ||
497 | +@item --with-long-double-128 | ||
498 | +Specify if @code{long double} type should be 128-bit by default on selected | ||
499 | +GNU/Linux architectures. If using @code{--without-long-double-128}, | ||
500 | +@code{long double} will be by default 64-bit, the same as @code{double} type. | ||
501 | +When neither of these configure options are used, the default will be | ||
502 | +128-bit @code{long double} when built against GNU C Library 2.4 and later, | ||
503 | +64-bit @code{long double} otherwise. | ||
504 | @end table | ||
505 | |||
506 | @subheading Cross-Compiler-Specific Options | ||
507 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/ChangeLog gcc-41-20060515/libstdc++-v3/ChangeLog | ||
508 | --- gcc-41-20060515.orig/libstdc++-v3/ChangeLog 2006-05-15 11:15:42.000000000 -0500 | ||
509 | +++ gcc-41-20060515/libstdc++-v3/ChangeLog 2006-05-15 14:02:07.401662657 -0500 | ||
510 | @@ -153,6 +153,64 @@ | ||
511 | Likewise. | ||
512 | * docs/html/ext/pb_assoc/tree_assoc_cntnr_node_iterator.html: Likewise. | ||
513 | |||
514 | +2006-02-07 Jakub Jelinek <jakub@redhat.com> | ||
515 | + Benjamin Kosnik <bkoz@redhat.com> | ||
516 | + | ||
517 | + PR target/25864 | ||
518 | + * configure.ac (_GLIBCXX_LONG_DOUBLE_COMPAT): New check. | ||
519 | + If true, set also port_specific_symbol_files and create | ||
520 | + as_symver_specs. | ||
521 | + (GLIBCXX_LDBL_COMPAT): New GLIBCXX_CONDITIONAL. | ||
522 | + * configure: Rebuilt. | ||
523 | + * config.h.in: Rebuilt. | ||
524 | + * config/os/gnu-linux/ldbl-extra.ver: New file. | ||
525 | + * config/linker-map.gnu: Make sure no __float128 symbols are | ||
526 | + exported. | ||
527 | + * include/bits/c++config (_GLIBCXX_LONG_DOUBLE_COMPAT, | ||
528 | + _GLIBCXX_LDBL_NAMESPACE, _GLIBCXX_BEGIN_LDBL_NAMESPACE, | ||
529 | + _GLIBCXX_END_LDBL_NAMESPACE): Define. | ||
530 | + * include/bits/localefwd.h: Use them to conditionally scope facets. | ||
531 | + * include/bits/locale_facets.h: Surround std::{money,num}_{get,put} | ||
532 | + with _GLIBCXX_BEGIN_LDBL_NAMESPACE and _GLIBCXX_END_LDBL_NAMESPACE. | ||
533 | + [_GLIBCXX_LONG_DOUBLE_COMPAT] (std::money_get): Add __do_get method. | ||
534 | + [_GLIBCXX_LONG_DOUBLE_COMPAT] (std::money_put): Add __do_put method. | ||
535 | + [_GLIBCXX_LONG_DOUBLE_COMPAT] (std::num_get): Add __do_get method. | ||
536 | + [_GLIBCXX_LONG_DOUBLE_COMPAT] (std::num_put): Add __do_put method. | ||
537 | + * include/bits/locale_facets.tcc: Surround std::{money,num}_{get,put} | ||
538 | + with _GLIBCXX_BEGIN_LDBL_NAMESPACE and _GLIBCXX_END_LDBL_NAMESPACE. | ||
539 | + (std::money_get::__do_get, std::money_put::__do_put, | ||
540 | + std::num_get::__do_get, std::num_put::__do_put): New | ||
541 | + specializations. | ||
542 | + * include/Makefile.am: Conditionally define | ||
543 | + _GLIBCXX_LONG_DOUBLE_COMPAT in c++config. | ||
544 | + * include/Makefile.in: Regenerate. | ||
545 | + * src/locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT] (_GLIBCXX_LOC_ID, | ||
546 | + _GLIBCXX_SYNC_ID): Define, use them. | ||
547 | + * src/compatibility-ldbl.cc: New file. | ||
548 | + * src/complex_io.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Add compatibility | ||
549 | + symbols. | ||
550 | + * src/limits.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
551 | + * src/locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
552 | + * src/locale-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
553 | + * src/locale-misc-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
554 | + * src/istream-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
555 | + * src/ostream-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
556 | + * src/locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
557 | + * src/wlocale-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
558 | + * src/compatibility.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise. | ||
559 | + * config/locale/generic/c_locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: | ||
560 | + Likewise. | ||
561 | + * config/locale/gnu/c_locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: | ||
562 | + Likewise. | ||
563 | + * src/Makefile.am (libstdc++-symbol.ver): Append instead of | ||
564 | + insert in the middle if port specific symbol file requests it. | ||
565 | + (ldbl_compat_sources): New variable. | ||
566 | + (sources): Use it. | ||
567 | + (compatibility-ldbl.lo, compatibility-ldbl.o): New rules. | ||
568 | + * src/Makefile.in: Rebuilt. | ||
569 | + * testsuite/testsuite_abi.cc: Recognize GLIBCXX_LDBL_3.4, | ||
570 | + GLIBCXX_LDBL_3.4.7, CXXABI_LDBL_1.3. | ||
571 | + | ||
572 | 2006-02-07 Paolo Carlini <pcarlini@suse.de> | ||
573 | |||
574 | * include/tr1/hashtable: Trivial formatting fixes. | ||
575 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/config/linker-map.gnu gcc-41-20060515/libstdc++-v3/config/linker-map.gnu | ||
576 | --- gcc-41-20060515.orig/libstdc++-v3/config/linker-map.gnu 2006-05-15 11:15:41.000000000 -0500 | ||
577 | +++ gcc-41-20060515/libstdc++-v3/config/linker-map.gnu 2006-05-15 13:47:27.603399076 -0500 | ||
578 | @@ -1,6 +1,6 @@ | ||
579 | ## Linker script for GNU ld 2.13.91+ only. | ||
580 | ## | ||
581 | -## Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | ||
582 | +## Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. | ||
583 | ## | ||
584 | ## This file is part of the libstdc++ version 3 distribution. | ||
585 | ## | ||
586 | @@ -44,7 +44,10 @@ GLIBCXX_3.4 { | ||
587 | std::basic_[j-n]*; | ||
588 | std::basic_o[a-e]*; | ||
589 | # std::basic_ofstream; | ||
590 | - std::basic_o[g-z]*; | ||
591 | +# std::basic_o[g-z]*; | ||
592 | + std::basic_o[g-r]*; | ||
593 | + std::basic_ostr[a-d]*; | ||
594 | + std::basic_ostr[f-z]*; | ||
595 | std::basic_[p-r]*; | ||
596 | std::basic_streambuf*; | ||
597 | # std::basic_string | ||
598 | @@ -88,7 +91,14 @@ GLIBCXX_3.4 { | ||
599 | std::locale::_[J-Ra-z]*; | ||
600 | std::locale::_S_normalize_category*; | ||
601 | std::locale::_[T-Za-z]*; | ||
602 | - std::[A-Zm-r]*; | ||
603 | +# std::[A-Zm-r]*; | ||
604 | + std::[A-Zmp-r]*; | ||
605 | + std::n[^u]*; | ||
606 | + std::nu[^m]*; | ||
607 | + std::num[^e]*; | ||
608 | + std::ostrstream*; | ||
609 | + std::out_of_range*; | ||
610 | + std::overflow_error*; | ||
611 | std::set_new_handler*; | ||
612 | std::set_terminate*; | ||
613 | std::set_unexpected*; | ||
614 | @@ -256,7 +266,7 @@ GLIBCXX_3.4 { | ||
615 | _ZNSi[0-9][a-h]*; | ||
616 | _ZNSi[0-9][j-z]*; | ||
617 | _ZNSi6ignoreE[il][il]; | ||
618 | - _ZNSirsE*; | ||
619 | + _ZNSirsE*[^g]; | ||
620 | |||
621 | # std::basic_istream<wchar_t> | ||
622 | _ZNSt13basic_istreamIwSt11char_traitsIwEEC*; | ||
623 | @@ -265,7 +275,7 @@ GLIBCXX_3.4 { | ||
624 | _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][a-h]*; | ||
625 | _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][j-z]*; | ||
626 | _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[il][ijlm]; | ||
627 | - _ZNSt13basic_istreamIwSt11char_traitsIwEErsE*; | ||
628 | + _ZNSt13basic_istreamIwSt11char_traitsIwEErsE*[^g]; | ||
629 | |||
630 | # std::istream operators and inserters | ||
631 | _ZSt7getlineI[cw]St11char_traitsI[cw]ESaI[cw]EERSt13basic_istream*; | ||
632 | @@ -277,6 +287,37 @@ GLIBCXX_3.4 { | ||
633 | _ZStrsIe[cw]St11char_traitsI[cw]EERSt13basic_istream*; | ||
634 | _ZStrsIf[cw]St11char_traitsI[cw]EERSt13basic_istream*; | ||
635 | |||
636 | + # std::basic_ostream<char> | ||
637 | + _ZNSoC*; | ||
638 | + _ZNSoD*; | ||
639 | + _ZNKSo6sentrycvbEv; | ||
640 | + _ZNSo8_M_write*; | ||
641 | + _ZNSo[0-9][a-z]*; | ||
642 | + _ZNSolsE*[^g]; | ||
643 | + | ||
644 | + # std::basic_ostream<wchar_t> | ||
645 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEEC*; | ||
646 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEED*; | ||
647 | + _ZNKSt13basic_ostreamIwSt11char_traitsIwEE[0-9][a-z]*; | ||
648 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw; | ||
649 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv; | ||
650 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpE*; | ||
651 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv; | ||
652 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKw*; | ||
653 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentry*; | ||
654 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_write*; | ||
655 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*[^g]; | ||
656 | + | ||
657 | + # std::ostream operators and inserters | ||
658 | + _ZSt4end[ls]I[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
659 | + _ZSt5flushI[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
660 | + _ZStlsI[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
661 | + _ZStlsI[cw]St11char_traitsI[cw]ESaI[cw]EERSt13basic_ostream*; | ||
662 | + _ZStlsISt11char_traitsI[cw]EERSt13basic_ostream*; | ||
663 | + _ZStlsId[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
664 | + _ZStlsIe[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
665 | + _ZStlsIf[cw]St11char_traitsI[cw]EERSt13basic_ostream*; | ||
666 | + | ||
667 | # std::locale destructors | ||
668 | _ZNSt6localeD*; | ||
669 | |||
670 | @@ -292,14 +333,23 @@ GLIBCXX_3.4 { | ||
671 | _ZNSt8ios_base4InitD*; | ||
672 | |||
673 | # bool std::has_facet | ||
674 | - _ZSt9has_facet*; | ||
675 | + _ZSt9has_facetIS*; | ||
676 | |||
677 | # std::num_get | ||
678 | _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*; | ||
679 | |||
680 | + # std::num_put | ||
681 | + _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*; | ||
682 | + | ||
683 | # std::money_get | ||
684 | _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*; | ||
685 | |||
686 | + # std::money_put | ||
687 | + _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*; | ||
688 | + | ||
689 | + # std::numeric_limits | ||
690 | + _ZNSt14numeric_limitsI[^g]*; | ||
691 | + | ||
692 | # std::_Rb_tree | ||
693 | _ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base; | ||
694 | _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base; | ||
695 | @@ -327,7 +377,7 @@ GLIBCXX_3.4 { | ||
696 | _ZNSt12__basic_fileIcED*; | ||
697 | |||
698 | # std::__convert_to_v | ||
699 | - _ZSt14__convert_to_v*; | ||
700 | + _ZSt14__convert_to_vI[^g]*; | ||
701 | |||
702 | # __gnu_cxx::stdio_sync_filebuf | ||
703 | _ZTVN9__gnu_cxx18stdio_sync_filebufI[cw]St11char_traitsI[cw]EEE; | ||
704 | @@ -399,7 +449,8 @@ GLIBCXX_3.4 { | ||
705 | _ZTSN9__gnu_cxx13stdio_filebufI[cw]St11char_traitsI[cw]EEE; | ||
706 | |||
707 | # function-scope static objects requires a guard variable. | ||
708 | - _ZGVNSt*; | ||
709 | + _ZGVNSt[^1]*; | ||
710 | + _ZGVNSt1[^7]*; | ||
711 | |||
712 | # virtual function thunks | ||
713 | _ZThn8_NS*; | ||
714 | @@ -665,9 +716,9 @@ CXXABI_1.3 { | ||
715 | _ZTVN10__cxxabiv121__vmi_class_type_infoE; | ||
716 | |||
717 | # typeinfo structure (and some names) | ||
718 | - _ZTI[a-z]; | ||
719 | - _ZTIP[a-z]; | ||
720 | - _ZTIPK[a-z]; | ||
721 | + _ZTI[a-fh-z]; | ||
722 | + _ZTIP[a-fh-z]; | ||
723 | + _ZTIPK[a-fh-z]; | ||
724 | _ZTIN10__cxxabiv117__array_type_infoE; | ||
725 | _ZTIN10__cxxabiv117__class_type_infoE; | ||
726 | _ZTIN10__cxxabiv116__enum_type_infoE; | ||
727 | @@ -680,9 +731,9 @@ CXXABI_1.3 { | ||
728 | _ZTIN10__cxxabiv121__vmi_class_type_infoE; | ||
729 | |||
730 | # typeinfo name | ||
731 | - _ZTS[a-z]; | ||
732 | - _ZTSP[a-z]; | ||
733 | - _ZTSPK[a-z]; | ||
734 | + _ZTS[a-fh-z]; | ||
735 | + _ZTSP[a-fh-z]; | ||
736 | + _ZTSPK[a-fh-z]; | ||
737 | _ZTSN10__cxxabiv117__array_type_infoE; | ||
738 | _ZTSN10__cxxabiv117__class_type_infoE; | ||
739 | _ZTSN10__cxxabiv116__enum_type_infoE; | ||
740 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/config/locale/generic/c_locale.cc gcc-41-20060515/libstdc++-v3/config/locale/generic/c_locale.cc | ||
741 | --- gcc-41-20060515.orig/libstdc++-v3/config/locale/generic/c_locale.cc 2006-05-15 11:15:39.000000000 -0500 | ||
742 | +++ gcc-41-20060515/libstdc++-v3/config/locale/generic/c_locale.cc 2006-05-15 13:47:27.605398768 -0500 | ||
743 | @@ -1,6 +1,6 @@ | ||
744 | // Wrapper for underlying C-language localization -*- C++ -*- | ||
745 | |||
746 | -// Copyright (C) 2001, 2002, 2003, 2004, 2005 | ||
747 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 | ||
748 | // Free Software Foundation, Inc. | ||
749 | // | ||
750 | // This file is part of the GNU ISO C++ Library. This library is free | ||
751 | @@ -168,3 +168,10 @@ namespace std | ||
752 | { | ||
753 | const char* const* const locale::_S_categories = __gnu_cxx::category_names; | ||
754 | } // namespace std | ||
755 | + | ||
756 | +// XXX GLIBCXX_ABI Deprecated | ||
757 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
758 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
759 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl))) | ||
760 | +_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKPi, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKPi); | ||
761 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
762 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/config/locale/gnu/c_locale.cc gcc-41-20060515/libstdc++-v3/config/locale/gnu/c_locale.cc | ||
763 | --- gcc-41-20060515.orig/libstdc++-v3/config/locale/gnu/c_locale.cc 2006-05-15 11:15:39.000000000 -0500 | ||
764 | +++ gcc-41-20060515/libstdc++-v3/config/locale/gnu/c_locale.cc 2006-05-15 13:47:27.606398615 -0500 | ||
765 | @@ -1,6 +1,6 @@ | ||
766 | // Wrapper for underlying C-language localization -*- C++ -*- | ||
767 | |||
768 | -// Copyright (C) 2001, 2002, 2003, 2004, 2005 | ||
769 | +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 | ||
770 | // Free Software Foundation, Inc. | ||
771 | // | ||
772 | // This file is part of the GNU ISO C++ Library. This library is free | ||
773 | @@ -132,3 +132,10 @@ namespace std | ||
774 | { | ||
775 | const char* const* const locale::_S_categories = __gnu_cxx::category_names; | ||
776 | } // namespace std | ||
777 | + | ||
778 | +// XXX GLIBCXX_ABI Deprecated | ||
779 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
780 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
781 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl))) | ||
782 | +_GLIBCXX_LDBL_COMPAT(_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct, _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct); | ||
783 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
784 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver gcc-41-20060515/libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver | ||
785 | --- gcc-41-20060515.orig/libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver 1969-12-31 18:00:00.000000000 -0600 | ||
786 | +++ gcc-41-20060515/libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver 2006-05-15 13:47:27.606398615 -0500 | ||
787 | @@ -0,0 +1,19 @@ | ||
788 | +# Appended to version file. | ||
789 | + | ||
790 | +GLIBCXX_LDBL_3.4 { | ||
791 | + _ZNSt14numeric_limitsIg*; | ||
792 | + _ZNSirsERg; | ||
793 | + _ZNSolsEg; | ||
794 | + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERg; | ||
795 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEg; | ||
796 | + _ZSt14__convert_to_vIgEvPKcRT_RSt12_Ios_IostateRKP*; | ||
797 | + _ZStlsIg[cw]St11char_traitsI[cw]EERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E; | ||
798 | + _ZStrsIg[cw]St11char_traitsI[cw]EERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E; | ||
799 | + *__gnu_cxx_ldbl128*; | ||
800 | +}; | ||
801 | + | ||
802 | +CXXABI_LDBL_1.3 { | ||
803 | + _ZT[IS]g; | ||
804 | + _ZT[IS]Pg; | ||
805 | + _ZT[IS]PKg; | ||
806 | +}; | ||
807 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/config.h.in gcc-41-20060515/libstdc++-v3/config.h.in | ||
808 | --- gcc-41-20060515.orig/libstdc++-v3/config.h.in 2006-05-15 11:15:42.000000000 -0500 | ||
809 | +++ gcc-41-20060515/libstdc++-v3/config.h.in 2006-05-15 13:47:27.601399384 -0500 | ||
810 | @@ -658,6 +658,9 @@ | ||
811 | /* Define to 1 if a full hosted library is built, or 0 if freestanding. */ | ||
812 | #undef _GLIBCXX_HOSTED | ||
813 | |||
814 | +/* Define if compatibility should be provided for -mlong-double-64. */ | ||
815 | +#undef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
816 | + | ||
817 | /* Define if ptrdiff_t is int. */ | ||
818 | #undef _GLIBCXX_PTRDIFF_T_IS_INT | ||
819 | |||
820 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/configure gcc-41-20060515/libstdc++-v3/configure | ||
821 | --- gcc-41-20060515.orig/libstdc++-v3/configure 2006-05-15 11:15:42.000000000 -0500 | ||
822 | +++ gcc-41-20060515/libstdc++-v3/configure 2006-05-15 13:47:27.664389689 -0500 | ||
823 | @@ -309,7 +309,7 @@ ac_includes_default="\ | ||
824 | # include <unistd.h> | ||
825 | #endif" | ||
826 | |||
827 | -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS glibcxx_thread_h WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_MAP port_specific_symbol_files ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_DARWIN_EXPORT_TRUE ENABLE_SYMVERS_DARWIN_EXPORT_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS' | ||
828 | +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS glibcxx_thread_h WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_MAP port_specific_symbol_files ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_DARWIN_EXPORT_TRUE ENABLE_SYMVERS_DARWIN_EXPORT_FALSE GLIBCXX_LDBL_COMPAT_TRUE GLIBCXX_LDBL_COMPAT_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS' | ||
829 | ac_subst_files='' | ||
830 | |||
831 | # Initialize some variables set by options. | ||
832 | @@ -87959,6 +87959,72 @@ echo "${ECHO_T}$glibcxx_ptrdiff_t_is_i" | ||
833 | echo "$as_me: versioning on shared library symbols is $enable_symvers" >&6;} | ||
834 | |||
835 | |||
836 | +ac_ldbl_compat=no | ||
837 | +case "$target" in | ||
838 | + powerpc*-*-*gnu* | \ | ||
839 | + sparc*-*-linux* | \ | ||
840 | + s390*-*-linux* | \ | ||
841 | + alpha*-*-linux*) | ||
842 | + cat >conftest.$ac_ext <<_ACEOF | ||
843 | +/* confdefs.h. */ | ||
844 | +_ACEOF | ||
845 | +cat confdefs.h >>conftest.$ac_ext | ||
846 | +cat >>conftest.$ac_ext <<_ACEOF | ||
847 | +/* end confdefs.h. */ | ||
848 | + | ||
849 | +int | ||
850 | +main () | ||
851 | +{ | ||
852 | + | ||
853 | +#if !defined __LONG_DOUBLE_128__ || (defined(__sparc__) && defined(__arch64__)) | ||
854 | +#error no need for long double compatibility | ||
855 | +#endif | ||
856 | + | ||
857 | + ; | ||
858 | + return 0; | ||
859 | +} | ||
860 | +_ACEOF | ||
861 | +rm -f conftest.$ac_objext | ||
862 | +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 | ||
863 | + (eval $ac_compile) 2>conftest.er1 | ||
864 | + ac_status=$? | ||
865 | + grep -v '^ *+' conftest.er1 >conftest.err | ||
866 | + rm -f conftest.er1 | ||
867 | + cat conftest.err >&5 | ||
868 | + echo "$as_me:$LINENO: \$? = $ac_status" >&5 | ||
869 | + (exit $ac_status); } && | ||
870 | + { ac_try='test -z "$ac_c_werror_flag" | ||
871 | + || test ! -s conftest.err' | ||
872 | + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 | ||
873 | + (eval $ac_try) 2>&5 | ||
874 | + ac_status=$? | ||
875 | + echo "$as_me:$LINENO: \$? = $ac_status" >&5 | ||
876 | + (exit $ac_status); }; } && | ||
877 | + { ac_try='test -s conftest.$ac_objext' | ||
878 | + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 | ||
879 | + (eval $ac_try) 2>&5 | ||
880 | + ac_status=$? | ||
881 | + echo "$as_me:$LINENO: \$? = $ac_status" >&5 | ||
882 | + (exit $ac_status); }; }; then | ||
883 | + ac_ldbl_compat=yes | ||
884 | +else | ||
885 | + echo "$as_me: failed program was:" >&5 | ||
886 | +sed 's/^/| /' conftest.$ac_ext >&5 | ||
887 | + | ||
888 | +ac_ldbl_compat=no | ||
889 | +fi | ||
890 | +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext | ||
891 | + if test "$ac_ldbl_compat" = yes; then | ||
892 | + | ||
893 | +cat >>confdefs.h <<\_ACEOF | ||
894 | +#define _GLIBCXX_LONG_DOUBLE_COMPAT 1 | ||
895 | +_ACEOF | ||
896 | + | ||
897 | + port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver" | ||
898 | + fi | ||
899 | +esac | ||
900 | + | ||
901 | + | ||
902 | # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE. | ||
903 | |||
904 | if $GLIBCXX_IS_NATIVE ; then | ||
905 | @@ -88811,6 +88877,17 @@ fi | ||
906 | |||
907 | |||
908 | |||
909 | +if test $ac_ldbl_compat = yes; then | ||
910 | + GLIBCXX_LDBL_COMPAT_TRUE= | ||
911 | + GLIBCXX_LDBL_COMPAT_FALSE='#' | ||
912 | +else | ||
913 | + GLIBCXX_LDBL_COMPAT_TRUE='#' | ||
914 | + GLIBCXX_LDBL_COMPAT_FALSE= | ||
915 | +fi | ||
916 | + | ||
917 | + | ||
918 | + | ||
919 | + | ||
920 | cat >confcache <<\_ACEOF | ||
921 | # This file is a shell script that caches the results of configure | ||
922 | # tests run on this system so they can be shared between configure | ||
923 | @@ -89166,6 +89243,13 @@ echo "$as_me: error: conditional \"ENABL | ||
924 | Usually this means the macro was only invoked conditionally." >&2;} | ||
925 | { (exit 1); exit 1; }; } | ||
926 | fi | ||
927 | +if test -z "${GLIBCXX_LDBL_COMPAT_TRUE}" && test -z "${GLIBCXX_LDBL_COMPAT_FALSE}"; then | ||
928 | + { { echo "$as_me:$LINENO: error: conditional \"GLIBCXX_LDBL_COMPAT\" was never defined. | ||
929 | +Usually this means the macro was only invoked conditionally." >&5 | ||
930 | +echo "$as_me: error: conditional \"GLIBCXX_LDBL_COMPAT\" was never defined. | ||
931 | +Usually this means the macro was only invoked conditionally." >&2;} | ||
932 | + { (exit 1); exit 1; }; } | ||
933 | +fi | ||
934 | |||
935 | : ${CONFIG_STATUS=./config.status} | ||
936 | ac_clean_files_save=$ac_clean_files | ||
937 | @@ -89836,6 +89920,8 @@ s,@ENABLE_SYMVERS_GNU_TRUE@,$ENABLE_SYMV | ||
938 | s,@ENABLE_SYMVERS_GNU_FALSE@,$ENABLE_SYMVERS_GNU_FALSE,;t t | ||
939 | s,@ENABLE_SYMVERS_DARWIN_EXPORT_TRUE@,$ENABLE_SYMVERS_DARWIN_EXPORT_TRUE,;t t | ||
940 | s,@ENABLE_SYMVERS_DARWIN_EXPORT_FALSE@,$ENABLE_SYMVERS_DARWIN_EXPORT_FALSE,;t t | ||
941 | +s,@GLIBCXX_LDBL_COMPAT_TRUE@,$GLIBCXX_LDBL_COMPAT_TRUE,;t t | ||
942 | +s,@GLIBCXX_LDBL_COMPAT_FALSE@,$GLIBCXX_LDBL_COMPAT_FALSE,;t t | ||
943 | s,@baseline_dir@,$baseline_dir,;t t | ||
944 | s,@ATOMICITY_SRCDIR@,$ATOMICITY_SRCDIR,;t t | ||
945 | s,@ATOMIC_WORD_SRCDIR@,$ATOMIC_WORD_SRCDIR,;t t | ||
946 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/configure.ac gcc-41-20060515/libstdc++-v3/configure.ac | ||
947 | --- gcc-41-20060515.orig/libstdc++-v3/configure.ac 2006-05-15 11:15:42.000000000 -0500 | ||
948 | +++ gcc-41-20060515/libstdc++-v3/configure.ac 2006-05-15 13:47:27.665389535 -0500 | ||
949 | @@ -281,6 +281,25 @@ fi | ||
950 | # This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no. | ||
951 | GLIBCXX_ENABLE_SYMVERS([yes]) | ||
952 | |||
953 | +ac_ldbl_compat=no | ||
954 | +case "$target" in | ||
955 | + powerpc*-*-*gnu* | \ | ||
956 | + sparc*-*-linux* | \ | ||
957 | + s390*-*-linux* | \ | ||
958 | + alpha*-*-linux*) | ||
959 | + AC_TRY_COMPILE(, [ | ||
960 | +#if !defined __LONG_DOUBLE_128__ || (defined(__sparc__) && defined(__arch64__)) | ||
961 | +#error no need for long double compatibility | ||
962 | +#endif | ||
963 | + ], [ac_ldbl_compat=yes], [ac_ldbl_compat=no]) | ||
964 | + if test "$ac_ldbl_compat" = yes; then | ||
965 | + AC_DEFINE([_GLIBCXX_LONG_DOUBLE_COMPAT],1, | ||
966 | + [Define if compatibility should be provided for -mlong-double-64.]) | ||
967 | + port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver" | ||
968 | + fi | ||
969 | +esac | ||
970 | +GLIBCXX_CONDITIONAL(GLIBCXX_LDBL_COMPAT, test $ac_ldbl_compat = yes) | ||
971 | + | ||
972 | # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE. | ||
973 | GLIBCXX_CONFIGURE_TESTSUITE | ||
974 | |||
975 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/bits/c++config gcc-41-20060515/libstdc++-v3/include/bits/c++config | ||
976 | --- gcc-41-20060515.orig/libstdc++-v3/include/bits/c++config 2006-05-15 11:14:38.000000000 -0500 | ||
977 | +++ gcc-41-20060515/libstdc++-v3/include/bits/c++config 2006-05-15 13:47:27.668389073 -0500 | ||
978 | @@ -1,6 +1,6 @@ | ||
979 | // Predefined symbols and macros -*- C++ -*- | ||
980 | |||
981 | -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
982 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | ||
983 | // Free Software Foundation, Inc. | ||
984 | // | ||
985 | // This file is part of the GNU ISO C++ Library. This library is free | ||
986 | @@ -65,6 +65,26 @@ namespace std | ||
987 | # define _GLIBCXX_STD std | ||
988 | #endif | ||
989 | |||
990 | +/* Define if compatibility should be provided for -mlong-double-64. */ | ||
991 | +#undef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
992 | + | ||
993 | +// XXX GLIBCXX_ABI Deprecated | ||
994 | +// Namespace associations for long double 128 mode. | ||
995 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
996 | +# define _GLIBCXX_LDBL_NAMESPACE __gnu_cxx_ldbl128:: | ||
997 | +# define _GLIBCXX_BEGIN_LDBL_NAMESPACE namespace __gnu_cxx_ldbl128 { | ||
998 | +# define _GLIBCXX_END_LDBL_NAMESPACE } | ||
999 | +namespace std | ||
1000 | +{ | ||
1001 | + namespace __gnu_cxx_ldbl128 { } | ||
1002 | + using namespace __gnu_cxx_ldbl128 __attribute__((__strong__)); | ||
1003 | +} | ||
1004 | +#else | ||
1005 | +# define _GLIBCXX_LDBL_NAMESPACE | ||
1006 | +# define _GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1007 | +# define _GLIBCXX_END_LDBL_NAMESPACE | ||
1008 | +#endif | ||
1009 | + | ||
1010 | // Allow use of "export template." This is currently not a feature | ||
1011 | // that g++ supports. | ||
1012 | // #define _GLIBCXX_EXPORT_TEMPLATE 1 | ||
1013 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/bits/locale_facets.h gcc-41-20060515/libstdc++-v3/include/bits/locale_facets.h | ||
1014 | --- gcc-41-20060515.orig/libstdc++-v3/include/bits/locale_facets.h 2006-05-15 11:14:38.000000000 -0500 | ||
1015 | +++ gcc-41-20060515/libstdc++-v3/include/bits/locale_facets.h 2006-05-15 13:47:27.673388304 -0500 | ||
1016 | @@ -1,6 +1,6 @@ | ||
1017 | // Locale support -*- C++ -*- | ||
1018 | |||
1019 | -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
1020 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | ||
1021 | // Free Software Foundation, Inc. | ||
1022 | // | ||
1023 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1024 | @@ -1910,6 +1910,7 @@ namespace std | ||
1025 | ~numpunct_byname() { } | ||
1026 | }; | ||
1027 | |||
1028 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1029 | /** | ||
1030 | * @brief Facet for parsing number strings. | ||
1031 | * | ||
1032 | @@ -2176,13 +2177,27 @@ namespace std | ||
1033 | do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, | ||
1034 | double&) const; | ||
1035 | |||
1036 | + // XXX GLIBCXX_ABI Deprecated | ||
1037 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1038 | + virtual iter_type | ||
1039 | + __do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, | ||
1040 | + double&) const; | ||
1041 | +#else | ||
1042 | virtual iter_type | ||
1043 | do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, | ||
1044 | long double&) const; | ||
1045 | +#endif | ||
1046 | |||
1047 | virtual iter_type | ||
1048 | do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, | ||
1049 | void*&) const; | ||
1050 | + | ||
1051 | + // XXX GLIBCXX_ABI Deprecated | ||
1052 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1053 | + virtual iter_type | ||
1054 | + do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, | ||
1055 | + long double&) const; | ||
1056 | +#endif | ||
1057 | //@} | ||
1058 | }; | ||
1059 | |||
1060 | @@ -2438,17 +2453,30 @@ namespace std | ||
1061 | virtual iter_type | ||
1062 | do_put(iter_type, ios_base&, char_type __fill, double __v) const; | ||
1063 | |||
1064 | + // XXX GLIBCXX_ABI Deprecated | ||
1065 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1066 | + virtual iter_type | ||
1067 | + __do_put(iter_type, ios_base&, char_type __fill, double __v) const; | ||
1068 | +#else | ||
1069 | virtual iter_type | ||
1070 | do_put(iter_type, ios_base&, char_type __fill, long double __v) const; | ||
1071 | +#endif | ||
1072 | |||
1073 | virtual iter_type | ||
1074 | do_put(iter_type, ios_base&, char_type __fill, const void* __v) const; | ||
1075 | + | ||
1076 | + // XXX GLIBCXX_ABI Deprecated | ||
1077 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1078 | + virtual iter_type | ||
1079 | + do_put(iter_type, ios_base&, char_type __fill, long double __v) const; | ||
1080 | +#endif | ||
1081 | //@} | ||
1082 | }; | ||
1083 | |||
1084 | template <typename _CharT, typename _OutIter> | ||
1085 | locale::id num_put<_CharT, _OutIter>::id; | ||
1086 | |||
1087 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1088 | |||
1089 | /** | ||
1090 | * @brief Facet for localized string comparison. | ||
1091 | @@ -3953,6 +3981,7 @@ namespace std | ||
1092 | template<typename _CharT, bool _Intl> | ||
1093 | const bool moneypunct_byname<_CharT, _Intl>::intl; | ||
1094 | |||
1095 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1096 | /** | ||
1097 | * @brief Facet for parsing monetary amounts. | ||
1098 | * | ||
1099 | @@ -4064,9 +4093,16 @@ namespace std | ||
1100 | * value. This function is a hook for derived classes to change the | ||
1101 | * value returned. @see get() for details. | ||
1102 | */ | ||
1103 | + // XXX GLIBCXX_ABI Deprecated | ||
1104 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1105 | + virtual iter_type | ||
1106 | + __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, | ||
1107 | + ios_base::iostate& __err, double& __units) const; | ||
1108 | +#else | ||
1109 | virtual iter_type | ||
1110 | do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, | ||
1111 | ios_base::iostate& __err, long double& __units) const; | ||
1112 | +#endif | ||
1113 | |||
1114 | /** | ||
1115 | * @brief Read and parse a monetary value. | ||
1116 | @@ -4079,6 +4115,13 @@ namespace std | ||
1117 | do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, | ||
1118 | ios_base::iostate& __err, string_type& __digits) const; | ||
1119 | |||
1120 | + // XXX GLIBCXX_ABI Deprecated | ||
1121 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1122 | + virtual iter_type | ||
1123 | + do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io, | ||
1124 | + ios_base::iostate& __err, long double& __units) const; | ||
1125 | +#endif | ||
1126 | + | ||
1127 | template<bool _Intl> | ||
1128 | iter_type | ||
1129 | _M_extract(iter_type __s, iter_type __end, ios_base& __io, | ||
1130 | @@ -4191,9 +4234,16 @@ namespace std | ||
1131 | * @param units Place to store result of parsing. | ||
1132 | * @return Iterator after writing. | ||
1133 | */ | ||
1134 | + // XXX GLIBCXX_ABI Deprecated | ||
1135 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1136 | + virtual iter_type | ||
1137 | + __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, | ||
1138 | + double __units) const; | ||
1139 | +#else | ||
1140 | virtual iter_type | ||
1141 | do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, | ||
1142 | long double __units) const; | ||
1143 | +#endif | ||
1144 | |||
1145 | /** | ||
1146 | * @brief Format and output a monetary value. | ||
1147 | @@ -4217,6 +4267,13 @@ namespace std | ||
1148 | do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, | ||
1149 | const string_type& __digits) const; | ||
1150 | |||
1151 | + // XXX GLIBCXX_ABI Deprecated | ||
1152 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1153 | + virtual iter_type | ||
1154 | + do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, | ||
1155 | + long double __units) const; | ||
1156 | +#endif | ||
1157 | + | ||
1158 | template<bool _Intl> | ||
1159 | iter_type | ||
1160 | _M_insert(iter_type __s, ios_base& __io, char_type __fill, | ||
1161 | @@ -4226,6 +4283,8 @@ namespace std | ||
1162 | template<typename _CharT, typename _OutIter> | ||
1163 | locale::id money_put<_CharT, _OutIter>::id; | ||
1164 | |||
1165 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1166 | + | ||
1167 | /** | ||
1168 | * @brief Messages facet base class providing catalog typedef. | ||
1169 | */ | ||
1170 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/bits/locale_facets.tcc gcc-41-20060515/libstdc++-v3/include/bits/locale_facets.tcc | ||
1171 | --- gcc-41-20060515.orig/libstdc++-v3/include/bits/locale_facets.tcc 2006-05-15 11:14:38.000000000 -0500 | ||
1172 | +++ gcc-41-20060515/libstdc++-v3/include/bits/locale_facets.tcc 2006-05-15 13:47:27.676387842 -0500 | ||
1173 | @@ -1,6 +1,6 @@ | ||
1174 | // Locale support -*- C++ -*- | ||
1175 | |||
1176 | -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 | ||
1177 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | ||
1178 | // Free Software Foundation, Inc. | ||
1179 | // | ||
1180 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1181 | @@ -272,6 +272,8 @@ namespace std | ||
1182 | __verify_grouping(const char* __grouping, size_t __grouping_size, | ||
1183 | const string& __grouping_tmp); | ||
1184 | |||
1185 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1186 | + | ||
1187 | template<typename _CharT, typename _InIter> | ||
1188 | _InIter | ||
1189 | num_get<_CharT, _InIter>:: | ||
1190 | @@ -446,6 +448,8 @@ namespace std | ||
1191 | return __beg; | ||
1192 | } | ||
1193 | |||
1194 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1195 | + | ||
1196 | template<typename _ValueT> | ||
1197 | struct __to_unsigned_type | ||
1198 | { typedef _ValueT __type; }; | ||
1199 | @@ -460,6 +464,8 @@ namespace std | ||
1200 | { typedef unsigned long long __type; }; | ||
1201 | #endif | ||
1202 | |||
1203 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1204 | + | ||
1205 | template<typename _CharT, typename _InIter> | ||
1206 | template<typename _ValueT> | ||
1207 | _InIter | ||
1208 | @@ -772,6 +778,21 @@ namespace std | ||
1209 | return __beg; | ||
1210 | } | ||
1211 | |||
1212 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1213 | + template<typename _CharT, typename _InIter> | ||
1214 | + _InIter | ||
1215 | + num_get<_CharT, _InIter>:: | ||
1216 | + __do_get(iter_type __beg, iter_type __end, ios_base& __io, | ||
1217 | + ios_base::iostate& __err, double& __v) const | ||
1218 | + { | ||
1219 | + string __xtrc; | ||
1220 | + __xtrc.reserve(32); | ||
1221 | + __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc); | ||
1222 | + std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale()); | ||
1223 | + return __beg; | ||
1224 | + } | ||
1225 | +#endif | ||
1226 | + | ||
1227 | template<typename _CharT, typename _InIter> | ||
1228 | _InIter | ||
1229 | num_get<_CharT, _InIter>:: | ||
1230 | @@ -822,6 +843,8 @@ namespace std | ||
1231 | __len = static_cast<int>(__w); | ||
1232 | } | ||
1233 | |||
1234 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1235 | + | ||
1236 | // Forwarding functions to peel signed from unsigned integer types and | ||
1237 | // either cast or compute the absolute value for the former, depending | ||
1238 | // on __basefield. | ||
1239 | @@ -911,6 +934,8 @@ namespace std | ||
1240 | return __bufend - __buf; | ||
1241 | } | ||
1242 | |||
1243 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1244 | + | ||
1245 | template<typename _CharT, typename _OutIter> | ||
1246 | void | ||
1247 | num_put<_CharT, _OutIter>:: | ||
1248 | @@ -1233,6 +1258,14 @@ namespace std | ||
1249 | do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const | ||
1250 | { return _M_insert_float(__s, __io, __fill, char(), __v); } | ||
1251 | |||
1252 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1253 | + template<typename _CharT, typename _OutIter> | ||
1254 | + _OutIter | ||
1255 | + num_put<_CharT, _OutIter>:: | ||
1256 | + __do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const | ||
1257 | + { return _M_insert_float(__s, __io, __fill, char(), __v); } | ||
1258 | +#endif | ||
1259 | + | ||
1260 | template<typename _CharT, typename _OutIter> | ||
1261 | _OutIter | ||
1262 | num_put<_CharT, _OutIter>:: | ||
1263 | @@ -1474,6 +1507,23 @@ namespace std | ||
1264 | return __beg; | ||
1265 | } | ||
1266 | |||
1267 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1268 | + template<typename _CharT, typename _InIter> | ||
1269 | + _InIter | ||
1270 | + money_get<_CharT, _InIter>:: | ||
1271 | + __do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io, | ||
1272 | + ios_base::iostate& __err, double& __units) const | ||
1273 | + { | ||
1274 | + string __str; | ||
1275 | + if (__intl) | ||
1276 | + __beg = _M_extract<true>(__beg, __end, __io, __err, __str); | ||
1277 | + else | ||
1278 | + __beg = _M_extract<false>(__beg, __end, __io, __err, __str); | ||
1279 | + std::__convert_to_v(__str.c_str(), __units, __err, _S_get_c_locale()); | ||
1280 | + return __beg; | ||
1281 | + } | ||
1282 | +#endif | ||
1283 | + | ||
1284 | template<typename _CharT, typename _InIter> | ||
1285 | _InIter | ||
1286 | money_get<_CharT, _InIter>:: | ||
1287 | @@ -1678,7 +1728,18 @@ namespace std | ||
1288 | __io.width(0); | ||
1289 | return __s; | ||
1290 | } | ||
1291 | - | ||
1292 | + | ||
1293 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__ | ||
1294 | + template<typename _CharT, typename _OutIter> | ||
1295 | + _OutIter | ||
1296 | + money_put<_CharT, _OutIter>:: | ||
1297 | + __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, | ||
1298 | + double __units) const | ||
1299 | + { | ||
1300 | + return this->do_put(__s, __intl, __io, __fill, (long double) __units); | ||
1301 | + } | ||
1302 | +#endif | ||
1303 | + | ||
1304 | template<typename _CharT, typename _OutIter> | ||
1305 | _OutIter | ||
1306 | money_put<_CharT, _OutIter>:: | ||
1307 | @@ -1726,6 +1787,7 @@ namespace std | ||
1308 | { return __intl ? _M_insert<true>(__s, __io, __fill, __digits) | ||
1309 | : _M_insert<false>(__s, __io, __fill, __digits); } | ||
1310 | |||
1311 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1312 | |||
1313 | // NB: Not especially useful. Without an ios_base object or some | ||
1314 | // kind of locale reference, we are left clawing at the air where | ||
1315 | @@ -2511,12 +2573,12 @@ namespace std | ||
1316 | extern template class moneypunct<char, true>; | ||
1317 | extern template class moneypunct_byname<char, false>; | ||
1318 | extern template class moneypunct_byname<char, true>; | ||
1319 | - extern template class money_get<char>; | ||
1320 | - extern template class money_put<char>; | ||
1321 | + extern template class _GLIBCXX_LDBL_NAMESPACE money_get<char>; | ||
1322 | + extern template class _GLIBCXX_LDBL_NAMESPACE money_put<char>; | ||
1323 | extern template class numpunct<char>; | ||
1324 | extern template class numpunct_byname<char>; | ||
1325 | - extern template class num_get<char>; | ||
1326 | - extern template class num_put<char>; | ||
1327 | + extern template class _GLIBCXX_LDBL_NAMESPACE num_get<char>; | ||
1328 | + extern template class _GLIBCXX_LDBL_NAMESPACE num_put<char>; | ||
1329 | extern template class __timepunct<char>; | ||
1330 | extern template class time_put<char>; | ||
1331 | extern template class time_put_byname<char>; | ||
1332 | @@ -2638,12 +2700,12 @@ namespace std | ||
1333 | extern template class moneypunct<wchar_t, true>; | ||
1334 | extern template class moneypunct_byname<wchar_t, false>; | ||
1335 | extern template class moneypunct_byname<wchar_t, true>; | ||
1336 | - extern template class money_get<wchar_t>; | ||
1337 | - extern template class money_put<wchar_t>; | ||
1338 | + extern template class _GLIBCXX_LDBL_NAMESPACE money_get<wchar_t>; | ||
1339 | + extern template class _GLIBCXX_LDBL_NAMESPACE money_put<wchar_t>; | ||
1340 | extern template class numpunct<wchar_t>; | ||
1341 | extern template class numpunct_byname<wchar_t>; | ||
1342 | - extern template class num_get<wchar_t>; | ||
1343 | - extern template class num_put<wchar_t>; | ||
1344 | + extern template class _GLIBCXX_LDBL_NAMESPACE num_get<wchar_t>; | ||
1345 | + extern template class _GLIBCXX_LDBL_NAMESPACE num_put<wchar_t>; | ||
1346 | extern template class __timepunct<wchar_t>; | ||
1347 | extern template class time_put<wchar_t>; | ||
1348 | extern template class time_put_byname<wchar_t>; | ||
1349 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/bits/localefwd.h gcc-41-20060515/libstdc++-v3/include/bits/localefwd.h | ||
1350 | --- gcc-41-20060515.orig/libstdc++-v3/include/bits/localefwd.h 2006-05-15 11:14:38.000000000 -0500 | ||
1351 | +++ gcc-41-20060515/libstdc++-v3/include/bits/localefwd.h 2006-05-15 13:47:27.676387842 -0500 | ||
1352 | @@ -129,10 +129,12 @@ namespace std | ||
1353 | class codecvt_byname; | ||
1354 | |||
1355 | // 22.2.2 and 22.2.3 numeric | ||
1356 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1357 | template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> > | ||
1358 | class num_get; | ||
1359 | template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> > | ||
1360 | class num_put; | ||
1361 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1362 | template<typename _CharT> class numpunct; | ||
1363 | template<typename _CharT> class numpunct_byname; | ||
1364 | |||
1365 | @@ -155,10 +157,12 @@ namespace std | ||
1366 | |||
1367 | // 22.2.6 money | ||
1368 | class money_base; | ||
1369 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1370 | template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> > | ||
1371 | class money_get; | ||
1372 | template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> > | ||
1373 | class money_put; | ||
1374 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1375 | template<typename _CharT, bool _Intl = false> | ||
1376 | class moneypunct; | ||
1377 | template<typename _CharT, bool _Intl = false> | ||
1378 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/Makefile.am gcc-41-20060515/libstdc++-v3/include/Makefile.am | ||
1379 | --- gcc-41-20060515.orig/libstdc++-v3/include/Makefile.am 2006-05-15 11:14:39.000000000 -0500 | ||
1380 | +++ gcc-41-20060515/libstdc++-v3/include/Makefile.am 2006-05-15 13:47:27.666389381 -0500 | ||
1381 | @@ -825,13 +825,18 @@ ${host_builddir}/c++config.h: ${top_buil | ||
1382 | ${glibcxx_srcdir}/include/bits/c++config \ | ||
1383 | stamp-${host_alias} \ | ||
1384 | ${toplevel_srcdir}/gcc/DATESTAMP | ||
1385 | - @cat ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ | ||
1386 | + @ldbl_compat='' ;\ | ||
1387 | + grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ | ||
1388 | + ${CONFIG_HEADER} > /dev/null 2>&1 \ | ||
1389 | + && ldbl_compat='s,^#undef _GLIBCXX_LONG_DOUBLE_COMPAT$$,#define _GLIBCXX_LONG_DOUBLE_COMPAT 1,' ;\ | ||
1390 | + sed -e "$$ldbl_compat" ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ | ||
1391 | sed -e 's/^/#define __GLIBCXX__ /' \ | ||
1392 | - < ${toplevel_srcdir}/gcc/DATESTAMP >> $@ ;\ | ||
1393 | + < ${toplevel_srcdir}/gcc/DATESTAMP >> $@ ;\ | ||
1394 | sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ | ||
1395 | -e 's/PACKAGE/_GLIBCXX_PACKAGE/g' \ | ||
1396 | -e 's/VERSION/_GLIBCXX_VERSION/g' \ | ||
1397 | -e 's/WORDS_/_GLIBCXX_WORDS_/g' \ | ||
1398 | + -e '/[ ]_GLIBCXX_LONG_DOUBLE_COMPAT[ ]/d' \ | ||
1399 | < ${CONFIG_HEADER} >> $@ ;\ | ||
1400 | echo "#endif // _CXXCONFIG_" >>$@ | ||
1401 | |||
1402 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/include/Makefile.in gcc-41-20060515/libstdc++-v3/include/Makefile.in | ||
1403 | --- gcc-41-20060515.orig/libstdc++-v3/include/Makefile.in 2006-05-15 11:14:39.000000000 -0500 | ||
1404 | +++ gcc-41-20060515/libstdc++-v3/include/Makefile.in 2006-05-15 13:47:27.668389073 -0500 | ||
1405 | @@ -1203,13 +1203,18 @@ ${host_builddir}/c++config.h: ${top_buil | ||
1406 | ${glibcxx_srcdir}/include/bits/c++config \ | ||
1407 | stamp-${host_alias} \ | ||
1408 | ${toplevel_srcdir}/gcc/DATESTAMP | ||
1409 | - @cat ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ | ||
1410 | + @ldbl_compat='' ;\ | ||
1411 | + grep "^[ ]*#[ ]*define[ ][ ]*_GLIBCXX_LONG_DOUBLE_COMPAT[ ][ ]*1[ ]*$$" \ | ||
1412 | + ${CONFIG_HEADER} > /dev/null 2>&1 \ | ||
1413 | + && ldbl_compat='s,^#undef _GLIBCXX_LONG_DOUBLE_COMPAT$$,#define _GLIBCXX_LONG_DOUBLE_COMPAT 1,' ;\ | ||
1414 | + sed -e "$$ldbl_compat" ${glibcxx_srcdir}/include/bits/c++config > $@ ;\ | ||
1415 | sed -e 's/^/#define __GLIBCXX__ /' \ | ||
1416 | - < ${toplevel_srcdir}/gcc/DATESTAMP >> $@ ;\ | ||
1417 | + < ${toplevel_srcdir}/gcc/DATESTAMP >> $@ ;\ | ||
1418 | sed -e 's/HAVE_/_GLIBCXX_HAVE_/g' \ | ||
1419 | -e 's/PACKAGE/_GLIBCXX_PACKAGE/g' \ | ||
1420 | -e 's/VERSION/_GLIBCXX_VERSION/g' \ | ||
1421 | -e 's/WORDS_/_GLIBCXX_WORDS_/g' \ | ||
1422 | + -e '/[ ]_GLIBCXX_LONG_DOUBLE_COMPAT[ ]/d' \ | ||
1423 | < ${CONFIG_HEADER} >> $@ ;\ | ||
1424 | echo "#endif // _CXXCONFIG_" >>$@ | ||
1425 | |||
1426 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/compatibility.cc gcc-41-20060515/libstdc++-v3/src/compatibility.cc | ||
1427 | --- gcc-41-20060515.orig/libstdc++-v3/src/compatibility.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1428 | +++ gcc-41-20060515/libstdc++-v3/src/compatibility.cc 2006-05-15 13:47:27.681387073 -0500 | ||
1429 | @@ -1,6 +1,6 @@ | ||
1430 | // Compatibility symbols for previous versions -*- C++ -*- | ||
1431 | |||
1432 | -// Copyright (C) 2005 | ||
1433 | +// Copyright (C) 2005, 2006 | ||
1434 | // Free Software Foundation, Inc. | ||
1435 | // | ||
1436 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1437 | @@ -49,6 +49,7 @@ | ||
1438 | #include <istream> | ||
1439 | #include <fstream> | ||
1440 | #include <sstream> | ||
1441 | +#include <cmath> | ||
1442 | |||
1443 | namespace std | ||
1444 | { | ||
1445 | @@ -362,6 +363,107 @@ namespace std | ||
1446 | |||
1447 | #endif | ||
1448 | |||
1449 | +// gcc-4.1.0 | ||
1450 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1451 | +#define _GLIBCXX_MATHL_WRAPPER(name, argdecl, args, ver) \ | ||
1452 | +extern "C" double \ | ||
1453 | +__ ## name ## l_wrapper argdecl \ | ||
1454 | +{ \ | ||
1455 | + return name args; \ | ||
1456 | +} \ | ||
1457 | +asm (".symver __" #name "l_wrapper, " #name "l@" #ver) | ||
1458 | + | ||
1459 | +#define _GLIBCXX_MATHL_WRAPPER1(name, ver) \ | ||
1460 | + _GLIBCXX_MATHL_WRAPPER (name, (double x), (x), ver) | ||
1461 | + | ||
1462 | +#define _GLIBCXX_MATHL_WRAPPER2(name, ver) \ | ||
1463 | + _GLIBCXX_MATHL_WRAPPER (name, (double x, double y), (x, y), ver) | ||
1464 | + | ||
1465 | +#ifdef _GLIBCXX_HAVE_ACOSL | ||
1466 | +_GLIBCXX_MATHL_WRAPPER1 (acos, GLIBCXX_3.4.3); | ||
1467 | +#endif | ||
1468 | +#ifdef _GLIBCXX_HAVE_ASINL | ||
1469 | +_GLIBCXX_MATHL_WRAPPER1 (asin, GLIBCXX_3.4.3); | ||
1470 | +#endif | ||
1471 | +#ifdef _GLIBCXX_HAVE_ATAN2L | ||
1472 | +_GLIBCXX_MATHL_WRAPPER2 (atan2, GLIBCXX_3.4); | ||
1473 | +#endif | ||
1474 | +#ifdef _GLIBCXX_HAVE_ATANL | ||
1475 | +_GLIBCXX_MATHL_WRAPPER1 (atan, GLIBCXX_3.4.3); | ||
1476 | +#endif | ||
1477 | +#ifdef _GLIBCXX_HAVE_CEILL | ||
1478 | +_GLIBCXX_MATHL_WRAPPER1 (ceil, GLIBCXX_3.4.3); | ||
1479 | +#endif | ||
1480 | +#ifdef _GLIBCXX_HAVE_COSHL | ||
1481 | +_GLIBCXX_MATHL_WRAPPER1 (cosh, GLIBCXX_3.4); | ||
1482 | +#endif | ||
1483 | +#ifdef _GLIBCXX_HAVE_COSL | ||
1484 | +_GLIBCXX_MATHL_WRAPPER1 (cos, GLIBCXX_3.4); | ||
1485 | +#endif | ||
1486 | +#ifdef _GLIBCXX_HAVE_EXPL | ||
1487 | +_GLIBCXX_MATHL_WRAPPER1 (exp, GLIBCXX_3.4); | ||
1488 | +#endif | ||
1489 | +#ifdef _GLIBCXX_HAVE_FLOORL | ||
1490 | +_GLIBCXX_MATHL_WRAPPER1 (floor, GLIBCXX_3.4.3); | ||
1491 | +#endif | ||
1492 | +#ifdef _GLIBCXX_HAVE_FMODL | ||
1493 | +_GLIBCXX_MATHL_WRAPPER2 (fmod, GLIBCXX_3.4.3); | ||
1494 | +#endif | ||
1495 | +#ifdef _GLIBCXX_HAVE_FREXPL | ||
1496 | +_GLIBCXX_MATHL_WRAPPER (frexp, (double x, int *y), (x, y), GLIBCXX_3.4.3); | ||
1497 | +#endif | ||
1498 | +#ifdef _GLIBCXX_HAVE_HYPOTL | ||
1499 | +_GLIBCXX_MATHL_WRAPPER2 (hypot, GLIBCXX_3.4); | ||
1500 | +#endif | ||
1501 | +#ifdef _GLIBCXX_HAVE_LDEXPL | ||
1502 | +_GLIBCXX_MATHL_WRAPPER (ldexp, (double x, int y), (x, y), GLIBCXX_3.4.3); | ||
1503 | +#endif | ||
1504 | +#ifdef _GLIBCXX_HAVE_LOG10L | ||
1505 | +_GLIBCXX_MATHL_WRAPPER1 (log10, GLIBCXX_3.4); | ||
1506 | +#endif | ||
1507 | +#ifdef _GLIBCXX_HAVE_LOGL | ||
1508 | +_GLIBCXX_MATHL_WRAPPER1 (log, GLIBCXX_3.4); | ||
1509 | +#endif | ||
1510 | +#ifdef _GLIBCXX_HAVE_MODFL | ||
1511 | +_GLIBCXX_MATHL_WRAPPER (modf, (double x, double *y), (x, y), GLIBCXX_3.4.3); | ||
1512 | +#endif | ||
1513 | +#ifdef _GLIBCXX_HAVE_POWL | ||
1514 | +_GLIBCXX_MATHL_WRAPPER2 (pow, GLIBCXX_3.4); | ||
1515 | +#endif | ||
1516 | +#ifdef _GLIBCXX_HAVE_SINHL | ||
1517 | +_GLIBCXX_MATHL_WRAPPER1 (sinh, GLIBCXX_3.4); | ||
1518 | +#endif | ||
1519 | +#ifdef _GLIBCXX_HAVE_SINL | ||
1520 | +_GLIBCXX_MATHL_WRAPPER1 (sin, GLIBCXX_3.4); | ||
1521 | +#endif | ||
1522 | +#ifdef _GLIBCXX_HAVE_SQRTL | ||
1523 | +_GLIBCXX_MATHL_WRAPPER1 (sqrt, GLIBCXX_3.4); | ||
1524 | +#endif | ||
1525 | +#ifdef _GLIBCXX_HAVE_TANHL | ||
1526 | +_GLIBCXX_MATHL_WRAPPER1 (tanh, GLIBCXX_3.4); | ||
1527 | +#endif | ||
1528 | +#ifdef _GLIBCXX_HAVE_TANL | ||
1529 | +_GLIBCXX_MATHL_WRAPPER1 (tan, GLIBCXX_3.4); | ||
1530 | +#endif | ||
1531 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1532 | + | ||
1533 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1534 | +extern void *_ZTVN10__cxxabiv123__fundamental_type_infoE[]; | ||
1535 | +extern void *_ZTVN10__cxxabiv119__pointer_type_infoE[]; | ||
1536 | +extern __attribute__((used, weak)) const char _ZTSe[2] = "e"; | ||
1537 | +extern __attribute__((used, weak)) const char _ZTSPe[3] = "Pe"; | ||
1538 | +extern __attribute__((used, weak)) const char _ZTSPKe[4] = "PKe"; | ||
1539 | +extern __attribute__((used, weak)) const void *_ZTIe[2] | ||
1540 | + = { (void *) &_ZTVN10__cxxabiv123__fundamental_type_infoE[2], | ||
1541 | + (void *) _ZTSe }; | ||
1542 | +extern __attribute__((used, weak)) const void *_ZTIPe[4] | ||
1543 | + = { (void *) &_ZTVN10__cxxabiv119__pointer_type_infoE[2], | ||
1544 | + (void *) _ZTSPe, (void *) 0L, (void *) _ZTIe }; | ||
1545 | +extern __attribute__((used, weak)) const void *_ZTIPKe[4] | ||
1546 | + = { (void *) &_ZTVN10__cxxabiv119__pointer_type_infoE[2], | ||
1547 | + (void *) _ZTSPKe, (void *) 1L, (void *) _ZTIe }; | ||
1548 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1549 | + | ||
1550 | #ifdef __APPLE__ | ||
1551 | #if (defined(__ppc__) || defined (__ppc64__)) && defined (PIC) | ||
1552 | /* __eprintf shouldn't have been made visible from libstdc++, or | ||
1553 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/compatibility-ldbl.cc gcc-41-20060515/libstdc++-v3/src/compatibility-ldbl.cc | ||
1554 | --- gcc-41-20060515.orig/libstdc++-v3/src/compatibility-ldbl.cc 1969-12-31 18:00:00.000000000 -0600 | ||
1555 | +++ gcc-41-20060515/libstdc++-v3/src/compatibility-ldbl.cc 2006-05-15 13:47:27.680387227 -0500 | ||
1556 | @@ -0,0 +1,73 @@ | ||
1557 | +// Compatibility symbols for -mlong-double-64 compatibility -*- C++ -*- | ||
1558 | + | ||
1559 | +// Copyright (C) 2006 | ||
1560 | +// Free Software Foundation, Inc. | ||
1561 | +// | ||
1562 | +// This file is part of the GNU ISO C++ Library. This library is free | ||
1563 | +// software; you can redistribute it and/or modify it under the | ||
1564 | +// terms of the GNU General Public License as published by the | ||
1565 | +// Free Software Foundation; either version 2, or (at your option) | ||
1566 | +// any later version. | ||
1567 | + | ||
1568 | +// This library is distributed in the hope that it will be useful, | ||
1569 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
1570 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
1571 | +// GNU General Public License for more details. | ||
1572 | + | ||
1573 | +// You should have received a copy of the GNU General Public License along | ||
1574 | +// with this library; see the file COPYING. If not, write to the Free | ||
1575 | +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | ||
1576 | +// USA. | ||
1577 | + | ||
1578 | +// As a special exception, you may use this file as part of a free software | ||
1579 | +// library without restriction. Specifically, if other files instantiate | ||
1580 | +// templates or use macros or inline functions from this file, or you compile | ||
1581 | +// this file and link it with other files to produce an executable, this | ||
1582 | +// file does not by itself cause the resulting executable to be covered by | ||
1583 | +// the GNU General Public License. This exception does not however | ||
1584 | +// invalidate any other reasons why the executable file might be covered by | ||
1585 | +// the GNU General Public License. | ||
1586 | + | ||
1587 | +#include <locale> | ||
1588 | + | ||
1589 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1590 | + | ||
1591 | +#ifdef __LONG_DOUBLE_128__ | ||
1592 | +#error "compatibility-ldbl.cc must be compiled with -mlong-double-64" | ||
1593 | +#endif | ||
1594 | + | ||
1595 | +namespace std | ||
1596 | +{ | ||
1597 | +#define C char | ||
1598 | + template class num_get<C, istreambuf_iterator<C> >; | ||
1599 | + template class num_put<C, ostreambuf_iterator<C> >; | ||
1600 | + template class money_get<C, istreambuf_iterator<C> >; | ||
1601 | + template class money_put<C, ostreambuf_iterator<C> >; | ||
1602 | + template const num_put<C>& use_facet<num_put<C> >(const locale&); | ||
1603 | + template const num_get<C>& use_facet<num_get<C> >(const locale&); | ||
1604 | + template const money_put<C>& use_facet<money_put<C> >(const locale&); | ||
1605 | + template const money_get<C>& use_facet<money_get<C> >(const locale&); | ||
1606 | + template bool has_facet<num_put<C> >(const locale&); | ||
1607 | + template bool has_facet<num_get<C> >(const locale&); | ||
1608 | + template bool has_facet<money_put<C> >(const locale&); | ||
1609 | + template bool has_facet<money_get<C> >(const locale&); | ||
1610 | +#undef C | ||
1611 | +#ifdef _GLIBCXX_USE_WCHAR_T | ||
1612 | +#define C wchar_t | ||
1613 | + template class num_get<C, istreambuf_iterator<C> >; | ||
1614 | + template class num_put<C, ostreambuf_iterator<C> >; | ||
1615 | + template class money_get<C, istreambuf_iterator<C> >; | ||
1616 | + template class money_put<C, ostreambuf_iterator<C> >; | ||
1617 | + template const num_put<C>& use_facet<num_put<C> >(const locale&); | ||
1618 | + template const num_get<C>& use_facet<num_get<C> >(const locale&); | ||
1619 | + template const money_put<C>& use_facet<money_put<C> >(const locale&); | ||
1620 | + template const money_get<C>& use_facet<money_get<C> >(const locale&); | ||
1621 | + template bool has_facet<num_put<C> >(const locale&); | ||
1622 | + template bool has_facet<num_get<C> >(const locale&); | ||
1623 | + template bool has_facet<money_put<C> >(const locale&); | ||
1624 | + template bool has_facet<money_get<C> >(const locale&); | ||
1625 | +#undef C | ||
1626 | +#endif | ||
1627 | +} | ||
1628 | + | ||
1629 | +#endif | ||
1630 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/complex_io.cc gcc-41-20060515/libstdc++-v3/src/complex_io.cc | ||
1631 | --- gcc-41-20060515.orig/libstdc++-v3/src/complex_io.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1632 | +++ gcc-41-20060515/libstdc++-v3/src/complex_io.cc 2006-05-15 13:47:27.681387073 -0500 | ||
1633 | @@ -1,6 +1,6 @@ | ||
1634 | // The template and inlines for the -*- C++ -*- complex number classes. | ||
1635 | |||
1636 | -// Copyright (C) 2000, 2001 Free Software Foundation, Inc. | ||
1637 | +// Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc. | ||
1638 | // | ||
1639 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1640 | // software; you can redistribute it and/or modify it under the | ||
1641 | @@ -91,3 +91,20 @@ namespace std | ||
1642 | const complex<long double>&); | ||
1643 | #endif //_GLIBCXX_USE_WCHAR_T | ||
1644 | } // namespace std | ||
1645 | + | ||
1646 | +// XXX GLIBCXX_ABI Deprecated | ||
1647 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1648 | + | ||
1649 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
1650 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
1651 | + | ||
1652 | +_GLIBCXX_LDBL_COMPAT (_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E, | ||
1653 | + _ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E); | ||
1654 | +_GLIBCXX_LDBL_COMPAT (_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E, | ||
1655 | + _ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E); | ||
1656 | +_GLIBCXX_LDBL_COMPAT (_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E, | ||
1657 | + _ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E); | ||
1658 | +_GLIBCXX_LDBL_COMPAT (_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E, | ||
1659 | + _ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E); | ||
1660 | + | ||
1661 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1662 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/istream-inst.cc gcc-41-20060515/libstdc++-v3/src/istream-inst.cc | ||
1663 | --- gcc-41-20060515.orig/libstdc++-v3/src/istream-inst.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1664 | +++ gcc-41-20060515/libstdc++-v3/src/istream-inst.cc 2006-05-15 13:47:27.682386919 -0500 | ||
1665 | @@ -1,6 +1,6 @@ | ||
1666 | // Explicit instantiation file. | ||
1667 | |||
1668 | -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 | ||
1669 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2006 | ||
1670 | // Free Software Foundation, Inc. | ||
1671 | // | ||
1672 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1673 | @@ -68,3 +68,19 @@ namespace std | ||
1674 | template wistream& operator>>(wistream&, _Setw); | ||
1675 | #endif | ||
1676 | } // namespace std | ||
1677 | + | ||
1678 | +// XXX GLIBCXX_ABI Deprecated | ||
1679 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1680 | + | ||
1681 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
1682 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
1683 | +_GLIBCXX_LDBL_COMPAT (_ZNSirsERd, _ZNSirsERe); | ||
1684 | +_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd, | ||
1685 | + _ZNSt13basic_istreamIwSt11char_traitsIwEErsERe); | ||
1686 | +// These 2 are in GCC 4.2+ only so far | ||
1687 | +// _GLIBCXX_LDBL_COMPAT (_ZNSi10_M_extractIdEERSiRT_, | ||
1688 | +// _ZNSi10_M_extractIeEERSiRT_); | ||
1689 | +// _GLIBCXX_LDBL_COMPAT (_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIdEERS2_RT_, | ||
1690 | +// _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIeEERS2_RT_); | ||
1691 | + | ||
1692 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1693 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/limits.cc gcc-41-20060515/libstdc++-v3/src/limits.cc | ||
1694 | --- gcc-41-20060515.orig/libstdc++-v3/src/limits.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1695 | +++ gcc-41-20060515/libstdc++-v3/src/limits.cc 2006-05-15 13:47:27.683386765 -0500 | ||
1696 | @@ -1,6 +1,6 @@ | ||
1697 | // Static data members of -*- C++ -*- numeric_limits classes | ||
1698 | |||
1699 | -// Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. | ||
1700 | +// Copyright (C) 1999, 2001, 2002, 2006 Free Software Foundation, Inc. | ||
1701 | // | ||
1702 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1703 | // software; you can redistribute it and/or modify it under the | ||
1704 | @@ -447,3 +447,34 @@ namespace std | ||
1705 | const bool numeric_limits<long double>::tinyness_before; | ||
1706 | const float_round_style numeric_limits<long double>::round_style; | ||
1707 | } // namespace std | ||
1708 | + | ||
1709 | +// XXX GLIBCXX_ABI Deprecated | ||
1710 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1711 | + | ||
1712 | +#define _GLIBCXX_NUM_LIM_COMPAT(type, member, len) \ | ||
1713 | + extern "C" type _ZNSt14numeric_limitsIeE ## len ## member ## E \ | ||
1714 | + __attribute__ ((alias ("_ZNSt14numeric_limitsIdE" #len #member "E"))) | ||
1715 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_specialized, 14); | ||
1716 | +_GLIBCXX_NUM_LIM_COMPAT (int, digits, 6); | ||
1717 | +_GLIBCXX_NUM_LIM_COMPAT (int, digits10, 8); | ||
1718 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_signed, 9); | ||
1719 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_integer, 10); | ||
1720 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_exact, 8); | ||
1721 | +_GLIBCXX_NUM_LIM_COMPAT (int, radix, 5); | ||
1722 | +_GLIBCXX_NUM_LIM_COMPAT (int, min_exponent, 12); | ||
1723 | +_GLIBCXX_NUM_LIM_COMPAT (int, min_exponent10, 14); | ||
1724 | +_GLIBCXX_NUM_LIM_COMPAT (int, max_exponent, 12); | ||
1725 | +_GLIBCXX_NUM_LIM_COMPAT (int, max_exponent10, 14); | ||
1726 | +_GLIBCXX_NUM_LIM_COMPAT (bool, has_infinity, 12); | ||
1727 | +_GLIBCXX_NUM_LIM_COMPAT (bool, has_quiet_NaN, 13); | ||
1728 | +_GLIBCXX_NUM_LIM_COMPAT (bool, has_signaling_NaN, 17); | ||
1729 | +_GLIBCXX_NUM_LIM_COMPAT (std::float_denorm_style, has_denorm, 10); | ||
1730 | +_GLIBCXX_NUM_LIM_COMPAT (bool, has_denorm_loss, 15); | ||
1731 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_iec559, 9); | ||
1732 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_bounded, 10); | ||
1733 | +_GLIBCXX_NUM_LIM_COMPAT (bool, is_modulo, 9); | ||
1734 | +_GLIBCXX_NUM_LIM_COMPAT (bool, traps, 5); | ||
1735 | +_GLIBCXX_NUM_LIM_COMPAT (bool, tinyness_before, 15); | ||
1736 | +_GLIBCXX_NUM_LIM_COMPAT (std::float_round_style, round_style, 11); | ||
1737 | + | ||
1738 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1739 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/locale.cc gcc-41-20060515/libstdc++-v3/src/locale.cc | ||
1740 | --- gcc-41-20060515.orig/libstdc++-v3/src/locale.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1741 | +++ gcc-41-20060515/libstdc++-v3/src/locale.cc 2006-05-15 14:06:44.932155273 -0500 | ||
1742 | @@ -41,6 +41,21 @@ namespace __gnu_internal | ||
1743 | static __glibcxx_mutex_define_initialized(locale_cache_mutex); | ||
1744 | } | ||
1745 | |||
1746 | +// XXX GLIBCXX_ABI Deprecated | ||
1747 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1748 | +# define _GLIBCXX_LOC_ID(mangled) extern std::locale::id mangled | ||
1749 | +_GLIBCXX_LOC_ID (_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1750 | +_GLIBCXX_LOC_ID (_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1751 | +_GLIBCXX_LOC_ID (_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1752 | +_GLIBCXX_LOC_ID (_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1753 | +# ifdef _GLIBCXX_USE_WCHAR_T | ||
1754 | +_GLIBCXX_LOC_ID (_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1755 | +_GLIBCXX_LOC_ID (_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1756 | +_GLIBCXX_LOC_ID (_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1757 | +_GLIBCXX_LOC_ID (_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1758 | +# endif | ||
1759 | +#endif | ||
1760 | + | ||
1761 | namespace std | ||
1762 | { | ||
1763 | // Definitions for static const data members of locale. | ||
1764 | @@ -397,9 +412,29 @@ namespace std | ||
1765 | locale::id::_M_id() const | ||
1766 | { | ||
1767 | if (!_M_index) | ||
1768 | - _M_index = 1 + __gnu_cxx::__exchange_and_add(&_S_refcount, 1); | ||
1769 | + { | ||
1770 | + // XXX GLIBCXX_ABI Deprecated | ||
1771 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1772 | + locale::id *f = 0; | ||
1773 | +# define _GLIBCXX_SYNC_ID(facet, mangled) \ | ||
1774 | + if (this == &::mangled) \ | ||
1775 | + f = &facet::id | ||
1776 | + _GLIBCXX_SYNC_ID (num_get<char>, _ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1777 | + _GLIBCXX_SYNC_ID (num_put<char>, _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1778 | + _GLIBCXX_SYNC_ID (money_get<char>, _ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1779 | + _GLIBCXX_SYNC_ID (money_put<char>, _ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE); | ||
1780 | +# ifdef _GLIBCXX_USE_WCHAR_T | ||
1781 | + _GLIBCXX_SYNC_ID (num_get<wchar_t>, _ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1782 | + _GLIBCXX_SYNC_ID (num_put<wchar_t>, _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1783 | + _GLIBCXX_SYNC_ID (money_get<wchar_t>, _ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1784 | + _GLIBCXX_SYNC_ID (money_put<wchar_t>, _ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE); | ||
1785 | +# endif | ||
1786 | + if (f) | ||
1787 | + _M_index = 1 + f->_M_id(); | ||
1788 | + else | ||
1789 | +#endif | ||
1790 | + _M_index = 1 + __gnu_cxx::__exchange_and_add(&_S_refcount, 1); | ||
1791 | + } | ||
1792 | return _M_index - 1; | ||
1793 | } | ||
1794 | } // namespace std | ||
1795 | - | ||
1796 | - | ||
1797 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/locale-inst.cc gcc-41-20060515/libstdc++-v3/src/locale-inst.cc | ||
1798 | --- gcc-41-20060515.orig/libstdc++-v3/src/locale-inst.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1799 | +++ gcc-41-20060515/libstdc++-v3/src/locale-inst.cc 2006-05-15 13:47:27.684386611 -0500 | ||
1800 | @@ -1,6 +1,6 @@ | ||
1801 | // Locale support -*- C++ -*- | ||
1802 | |||
1803 | -// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 | ||
1804 | +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2006 | ||
1805 | // Free Software Foundation, Inc. | ||
1806 | // | ||
1807 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1808 | @@ -37,6 +37,7 @@ | ||
1809 | // Instantiation configuration. | ||
1810 | #ifndef C | ||
1811 | # define C char | ||
1812 | +# define C_is_char | ||
1813 | #endif | ||
1814 | |||
1815 | namespace std | ||
1816 | @@ -48,6 +49,7 @@ namespace std | ||
1817 | template struct __moneypunct_cache<C, true>; | ||
1818 | template class moneypunct_byname<C, false>; | ||
1819 | template class moneypunct_byname<C, true>; | ||
1820 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1821 | template class money_get<C, istreambuf_iterator<C> >; | ||
1822 | template class money_put<C, ostreambuf_iterator<C> >; | ||
1823 | template | ||
1824 | @@ -73,11 +75,13 @@ namespace std | ||
1825 | money_put<C, ostreambuf_iterator<C> >:: | ||
1826 | _M_insert<false>(ostreambuf_iterator<C>, ios_base&, C, | ||
1827 | const string_type&) const; | ||
1828 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1829 | |||
1830 | // numpunct, numpunct_byname, num_get, and num_put | ||
1831 | template class numpunct<C>; | ||
1832 | template struct __numpunct_cache<C>; | ||
1833 | template class numpunct_byname<C>; | ||
1834 | +_GLIBCXX_BEGIN_LDBL_NAMESPACE | ||
1835 | template class num_get<C, istreambuf_iterator<C> >; | ||
1836 | template class num_put<C, ostreambuf_iterator<C> >; | ||
1837 | template | ||
1838 | @@ -161,7 +165,8 @@ namespace std | ||
1839 | num_put<C, ostreambuf_iterator<C> >:: | ||
1840 | _M_insert_float(ostreambuf_iterator<C>, ios_base&, C, char, | ||
1841 | long double) const; | ||
1842 | - | ||
1843 | +_GLIBCXX_END_LDBL_NAMESPACE | ||
1844 | + | ||
1845 | // time_get and time_put | ||
1846 | template class __timepunct<C>; | ||
1847 | template struct __timepunct_cache<C>; | ||
1848 | @@ -314,3 +319,44 @@ namespace std | ||
1849 | ios_base::fmtflags, bool); | ||
1850 | #endif | ||
1851 | } // namespace std | ||
1852 | + | ||
1853 | +// XXX GLIBCXX_ABI Deprecated | ||
1854 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined C_is_char | ||
1855 | + | ||
1856 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
1857 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
1858 | + | ||
1859 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1860 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1861 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1862 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1863 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1864 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1865 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1866 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1867 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1868 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1869 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
1870 | + _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
1871 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES4_S4_RSt8ios_basecT_, | ||
1872 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_); | ||
1873 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES4_S4_RSt8ios_basecT_, | ||
1874 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_); | ||
1875 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES4_S4_RSt8ios_basecT_, | ||
1876 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_); | ||
1877 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES4_S4_RSt8ios_basecT_, | ||
1878 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_); | ||
1879 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES4_S4_RSt8ios_baseccT_, | ||
1880 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_); | ||
1881 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_, | ||
1882 | + _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_); | ||
1883 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, | ||
1884 | + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); | ||
1885 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, | ||
1886 | + _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); | ||
1887 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKSs, | ||
1888 | + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs); | ||
1889 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKSs, | ||
1890 | + _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs); | ||
1891 | + | ||
1892 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1893 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/locale-misc-inst.cc gcc-41-20060515/libstdc++-v3/src/locale-misc-inst.cc | ||
1894 | --- gcc-41-20060515.orig/libstdc++-v3/src/locale-misc-inst.cc 2006-05-15 11:14:42.000000000 -0500 | ||
1895 | +++ gcc-41-20060515/libstdc++-v3/src/locale-misc-inst.cc 2006-05-15 13:47:27.685386457 -0500 | ||
1896 | @@ -1,6 +1,7 @@ | ||
1897 | // Locale support -*- C++ -*- | ||
1898 | |||
1899 | -// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. | ||
1900 | +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006 | ||
1901 | +// Free Software Foundation, Inc. | ||
1902 | // | ||
1903 | // This file is part of the GNU ISO C++ Library. This library is free | ||
1904 | // software; you can redistribute it and/or modify it under the | ||
1905 | @@ -45,3 +46,19 @@ namespace std | ||
1906 | __convert_from_v(char*, const int, const char*, long double, | ||
1907 | const __c_locale&, int); | ||
1908 | } // namespace std | ||
1909 | + | ||
1910 | +// XXX GLIBCXX_ABI Deprecated | ||
1911 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1912 | + | ||
1913 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
1914 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
1915 | + | ||
1916 | +# if _GLIBCXX_C_LOCALE_GNU | ||
1917 | +_GLIBCXX_LDBL_COMPAT(_ZSt16__convert_from_vIdEiPciPKcT_RKP15__locale_structi, | ||
1918 | + _ZSt16__convert_from_vIeEiPciPKcT_RKP15__locale_structi); | ||
1919 | +# else | ||
1920 | +_GLIBCXX_LDBL_COMPAT(_ZSt16__convert_from_vIdEiPciPKcT_RKPii, | ||
1921 | + _ZSt16__convert_from_vIeEiPciPKcT_RKPii); | ||
1922 | +# endif | ||
1923 | + | ||
1924 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
1925 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/Makefile.am gcc-41-20060515/libstdc++-v3/src/Makefile.am | ||
1926 | --- gcc-41-20060515.orig/libstdc++-v3/src/Makefile.am 2006-05-15 11:14:42.000000000 -0500 | ||
1927 | +++ gcc-41-20060515/libstdc++-v3/src/Makefile.am 2006-05-15 13:47:27.677387688 -0500 | ||
1928 | @@ -35,10 +35,15 @@ libstdc++-symbol.ver: ${glibcxx_srcdir} | ||
1929 | $(port_specific_symbol_files) | ||
1930 | cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver | ||
1931 | if test "x$(port_specific_symbol_files)" != x; then \ | ||
1932 | - sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \ | ||
1933 | - sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \ | ||
1934 | - cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \ | ||
1935 | - rm tmp.top tmp.bottom; \ | ||
1936 | + if grep '^# Appended to version file.' \ | ||
1937 | + $(port_specific_symbol_files) /dev/null > /dev/null 2>&1; then \ | ||
1938 | + cat $(port_specific_symbol_files) >> $@; \ | ||
1939 | + else \ | ||
1940 | + sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \ | ||
1941 | + sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \ | ||
1942 | + cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \ | ||
1943 | + rm tmp.top tmp.bottom; \ | ||
1944 | + fi; \ | ||
1945 | fi | ||
1946 | |||
1947 | if ENABLE_SYMVERS_GNU | ||
1948 | @@ -113,6 +118,12 @@ c++locale.cc: ${glibcxx_srcdir}/$(CLOCAL | ||
1949 | basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) | ||
1950 | $(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true | ||
1951 | |||
1952 | +if GLIBCXX_LDBL_COMPAT | ||
1953 | +ldbl_compat_sources = compatibility-ldbl.cc | ||
1954 | +else | ||
1955 | +ldbl_compat_sources = | ||
1956 | +endif | ||
1957 | + | ||
1958 | # Sources present in the src directory. | ||
1959 | sources = \ | ||
1960 | bitmap_allocator.cc \ | ||
1961 | @@ -160,7 +171,8 @@ sources = \ | ||
1962 | wlocale-inst.cc \ | ||
1963 | wstring-inst.cc \ | ||
1964 | ${host_sources} \ | ||
1965 | - ${host_sources_extra} | ||
1966 | + ${host_sources_extra} \ | ||
1967 | + ${ldbl_compat_sources} | ||
1968 | |||
1969 | VPATH = $(top_srcdir)/src:$(top_srcdir) | ||
1970 | |||
1971 | @@ -191,6 +203,15 @@ concept-inst.lo: concept-inst.cc | ||
1972 | concept-inst.o: concept-inst.cc | ||
1973 | $(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $< | ||
1974 | |||
1975 | +if GLIBCXX_LDBL_COMPAT | ||
1976 | +# Use special rules for compatibility-ldbl.cc compilation, as we need to | ||
1977 | +# pass -mlong-double-64. | ||
1978 | +compatibility-ldbl.lo: compatibility-ldbl.cc | ||
1979 | + $(LTCXXCOMPILE) -mlong-double-64 -c $< | ||
1980 | +compatibility-ldbl.o: compatibility-ldbl.cc | ||
1981 | + $(CXXCOMPILE) -mlong-double-64 -c $< | ||
1982 | +endif | ||
1983 | + | ||
1984 | # AM_CXXFLAGS needs to be in each subdirectory so that it can be | ||
1985 | # modified in a per-library or per-sub-library way. Need to manually | ||
1986 | # set this option because CONFIG_CXXFLAGS has to be after | ||
1987 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/Makefile.in gcc-41-20060515/libstdc++-v3/src/Makefile.in | ||
1988 | --- gcc-41-20060515.orig/libstdc++-v3/src/Makefile.in 2006-05-15 11:14:42.000000000 -0500 | ||
1989 | +++ gcc-41-20060515/libstdc++-v3/src/Makefile.in 2006-05-15 13:47:27.679387380 -0500 | ||
1990 | @@ -59,11 +59,27 @@ am__strip_dir = `echo $$p | sed -e 's|^. | ||
1991 | am__installdirs = "$(DESTDIR)$(toolexeclibdir)" | ||
1992 | toolexeclibLTLIBRARIES_INSTALL = $(INSTALL) | ||
1993 | LTLIBRARIES = $(toolexeclib_LTLIBRARIES) | ||
1994 | +am__libstdc___la_SOURCES_DIST = bitmap_allocator.cc pool_allocator.cc \ | ||
1995 | + mt_allocator.cc codecvt.cc compatibility.cc complex_io.cc \ | ||
1996 | + ctype.cc debug.cc debug_list.cc functexcept.cc \ | ||
1997 | + globals_locale.cc globals_io.cc ios.cc ios_failure.cc \ | ||
1998 | + ios_init.cc ios_locale.cc limits.cc list.cc locale.cc \ | ||
1999 | + locale_init.cc locale_facets.cc localename.cc stdexcept.cc \ | ||
2000 | + strstream.cc tree.cc allocator-inst.cc concept-inst.cc \ | ||
2001 | + fstream-inst.cc ext-inst.cc ios-inst.cc iostream-inst.cc \ | ||
2002 | + istream-inst.cc istream.cc locale-inst.cc locale-misc-inst.cc \ | ||
2003 | + misc-inst.cc ostream-inst.cc sstream-inst.cc streambuf-inst.cc \ | ||
2004 | + streambuf.cc string-inst.cc valarray-inst.cc wlocale-inst.cc \ | ||
2005 | + wstring-inst.cc atomicity.cc codecvt_members.cc \ | ||
2006 | + collate_members.cc ctype_members.cc messages_members.cc \ | ||
2007 | + monetary_members.cc numeric_members.cc time_members.cc \ | ||
2008 | + basic_file.cc c++locale.cc compatibility-ldbl.cc | ||
2009 | am__objects_1 = atomicity.lo codecvt_members.lo collate_members.lo \ | ||
2010 | ctype_members.lo messages_members.lo monetary_members.lo \ | ||
2011 | numeric_members.lo time_members.lo | ||
2012 | am__objects_2 = basic_file.lo c++locale.lo | ||
2013 | -am__objects_3 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ | ||
2014 | +@GLIBCXX_LDBL_COMPAT_TRUE@am__objects_3 = compatibility-ldbl.lo | ||
2015 | +am__objects_4 = bitmap_allocator.lo pool_allocator.lo mt_allocator.lo \ | ||
2016 | codecvt.lo compatibility.lo complex_io.lo ctype.lo debug.lo \ | ||
2017 | debug_list.lo functexcept.lo globals_locale.lo globals_io.lo \ | ||
2018 | ios.lo ios_failure.lo ios_init.lo ios_locale.lo limits.lo \ | ||
2019 | @@ -74,8 +90,9 @@ am__objects_3 = bitmap_allocator.lo pool | ||
2020 | locale-inst.lo locale-misc-inst.lo misc-inst.lo \ | ||
2021 | ostream-inst.lo sstream-inst.lo streambuf-inst.lo streambuf.lo \ | ||
2022 | string-inst.lo valarray-inst.lo wlocale-inst.lo \ | ||
2023 | - wstring-inst.lo $(am__objects_1) $(am__objects_2) | ||
2024 | -am_libstdc___la_OBJECTS = $(am__objects_3) | ||
2025 | + wstring-inst.lo $(am__objects_1) $(am__objects_2) \ | ||
2026 | + $(am__objects_3) | ||
2027 | +am_libstdc___la_OBJECTS = $(am__objects_4) | ||
2028 | libstdc___la_OBJECTS = $(am_libstdc___la_OBJECTS) | ||
2029 | DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) | ||
2030 | depcomp = | ||
2031 | @@ -84,7 +101,7 @@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_IN | ||
2032 | $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) | ||
2033 | CXXLD = $(CXX) | ||
2034 | SOURCES = $(libstdc___la_SOURCES) | ||
2035 | -DIST_SOURCES = $(libstdc___la_SOURCES) | ||
2036 | +DIST_SOURCES = $(am__libstdc___la_SOURCES_DIST) | ||
2037 | ETAGS = etags | ||
2038 | CTAGS = ctags | ||
2039 | DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||
2040 | @@ -152,6 +169,8 @@ GLIBCXX_C_HEADERS_C_TRUE = @GLIBCXX_C_HE | ||
2041 | GLIBCXX_HOSTED_FALSE = @GLIBCXX_HOSTED_FALSE@ | ||
2042 | GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ | ||
2043 | GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ | ||
2044 | +GLIBCXX_LDBL_COMPAT_FALSE = @GLIBCXX_LDBL_COMPAT_FALSE@ | ||
2045 | +GLIBCXX_LDBL_COMPAT_TRUE = @GLIBCXX_LDBL_COMPAT_TRUE@ | ||
2046 | INSTALL_DATA = @INSTALL_DATA@ | ||
2047 | INSTALL_PROGRAM = @INSTALL_PROGRAM@ | ||
2048 | INSTALL_SCRIPT = @INSTALL_SCRIPT@ | ||
2049 | @@ -302,6 +321,8 @@ host_sources_extra = \ | ||
2050 | basic_file.cc \ | ||
2051 | c++locale.cc | ||
2052 | |||
2053 | +@GLIBCXX_LDBL_COMPAT_FALSE@ldbl_compat_sources = | ||
2054 | +@GLIBCXX_LDBL_COMPAT_TRUE@ldbl_compat_sources = compatibility-ldbl.cc | ||
2055 | |||
2056 | # Sources present in the src directory. | ||
2057 | sources = \ | ||
2058 | @@ -350,7 +371,8 @@ sources = \ | ||
2059 | wlocale-inst.cc \ | ||
2060 | wstring-inst.cc \ | ||
2061 | ${host_sources} \ | ||
2062 | - ${host_sources_extra} | ||
2063 | + ${host_sources_extra} \ | ||
2064 | + ${ldbl_compat_sources} | ||
2065 | |||
2066 | libstdc___la_SOURCES = $(sources) | ||
2067 | libstdc___la_LIBADD = \ | ||
2068 | @@ -677,10 +699,15 @@ libstdc++-symbol.ver: ${glibcxx_srcdir} | ||
2069 | $(port_specific_symbol_files) | ||
2070 | cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver | ||
2071 | if test "x$(port_specific_symbol_files)" != x; then \ | ||
2072 | - sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \ | ||
2073 | - sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \ | ||
2074 | - cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \ | ||
2075 | - rm tmp.top tmp.bottom; \ | ||
2076 | + if grep '^# Appended to version file.' \ | ||
2077 | + $(port_specific_symbol_files) /dev/null > /dev/null 2>&1; then \ | ||
2078 | + cat $(port_specific_symbol_files) >> $@; \ | ||
2079 | + else \ | ||
2080 | + sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \ | ||
2081 | + sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \ | ||
2082 | + cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \ | ||
2083 | + rm tmp.top tmp.bottom; \ | ||
2084 | + fi; \ | ||
2085 | fi | ||
2086 | @ENABLE_SYMVERS_DARWIN_EXPORT_TRUE@@ENABLE_SYMVERS_GNU_FALSE@libstdc++-symbol.explist : libstdc++-symbol.ver \ | ||
2087 | @ENABLE_SYMVERS_DARWIN_EXPORT_TRUE@@ENABLE_SYMVERS_GNU_FALSE@ ${glibcxx_srcdir}/scripts/make_exports.pl \ | ||
2088 | @@ -733,6 +760,13 @@ concept-inst.lo: concept-inst.cc | ||
2089 | concept-inst.o: concept-inst.cc | ||
2090 | $(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $< | ||
2091 | |||
2092 | +# Use special rules for compatibility-ldbl.cc compilation, as we need to | ||
2093 | +# pass -mlong-double-64. | ||
2094 | +@GLIBCXX_LDBL_COMPAT_TRUE@compatibility-ldbl.lo: compatibility-ldbl.cc | ||
2095 | +@GLIBCXX_LDBL_COMPAT_TRUE@ $(LTCXXCOMPILE) -mlong-double-64 -c $< | ||
2096 | +@GLIBCXX_LDBL_COMPAT_TRUE@compatibility-ldbl.o: compatibility-ldbl.cc | ||
2097 | +@GLIBCXX_LDBL_COMPAT_TRUE@ $(CXXCOMPILE) -mlong-double-64 -c $< | ||
2098 | + | ||
2099 | # Added bits to build debug library. | ||
2100 | @GLIBCXX_BUILD_DEBUG_TRUE@all-local: build_debug | ||
2101 | @GLIBCXX_BUILD_DEBUG_TRUE@install-data-local: install_debug | ||
2102 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/ostream-inst.cc gcc-41-20060515/libstdc++-v3/src/ostream-inst.cc | ||
2103 | --- gcc-41-20060515.orig/libstdc++-v3/src/ostream-inst.cc 2006-05-15 11:14:42.000000000 -0500 | ||
2104 | +++ gcc-41-20060515/libstdc++-v3/src/ostream-inst.cc 2006-05-15 13:47:27.685386457 -0500 | ||
2105 | @@ -1,6 +1,6 @@ | ||
2106 | // Explicit instantiation file. | ||
2107 | |||
2108 | -// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 | ||
2109 | +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2006 | ||
2110 | // Free Software Foundation, Inc. | ||
2111 | // | ||
2112 | // This file is part of the GNU ISO C++ Library. This library is free | ||
2113 | @@ -74,3 +74,19 @@ namespace std | ||
2114 | template wostream& operator<<(wostream&, _Setw); | ||
2115 | #endif | ||
2116 | } // namespace std | ||
2117 | + | ||
2118 | +// XXX GLIBCXX_ABI Deprecated | ||
2119 | +#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT | ||
2120 | + | ||
2121 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
2122 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
2123 | +_GLIBCXX_LDBL_COMPAT (_ZNSolsEd, _ZNSolsEe); | ||
2124 | +_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd, | ||
2125 | + _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe); | ||
2126 | +// These 2 are in GCC 4.2+ only so far | ||
2127 | +// _GLIBCXX_LDBL_COMPAT (_ZNSo9_M_insertIdEERSoT_, | ||
2128 | +// _ZNSo9_M_insertIeEERSoT_); | ||
2129 | +// _GLIBCXX_LDBL_COMPAT (_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIdEERS2_T_, | ||
2130 | +// _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIeEERS2_T_); | ||
2131 | + | ||
2132 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
2133 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/src/wlocale-inst.cc gcc-41-20060515/libstdc++-v3/src/wlocale-inst.cc | ||
2134 | --- gcc-41-20060515.orig/libstdc++-v3/src/wlocale-inst.cc 2006-05-15 11:14:42.000000000 -0500 | ||
2135 | +++ gcc-41-20060515/libstdc++-v3/src/wlocale-inst.cc 2006-05-15 13:47:27.686386303 -0500 | ||
2136 | @@ -1,6 +1,7 @@ | ||
2137 | // Locale support -*- C++ -*- | ||
2138 | |||
2139 | -// Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. | ||
2140 | +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006 | ||
2141 | +// Free Software Foundation, Inc. | ||
2142 | // | ||
2143 | // This file is part of the GNU ISO C++ Library. This library is free | ||
2144 | // software; you can redistribute it and/or modify it under the | ||
2145 | @@ -36,4 +37,45 @@ | ||
2146 | #ifdef _GLIBCXX_USE_WCHAR_T | ||
2147 | #define C wchar_t | ||
2148 | #include "locale-inst.cc" | ||
2149 | + | ||
2150 | +// XXX GLIBCXX_ABI Deprecated | ||
2151 | +#if defined _GLIBCXX_LONG_DOUBLE_COMPAT | ||
2152 | + | ||
2153 | +#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ | ||
2154 | + extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) | ||
2155 | + | ||
2156 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2157 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2158 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2159 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2160 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2161 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2162 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2163 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2164 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2165 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2166 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, | ||
2167 | + _ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); | ||
2168 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES4_S4_RSt8ios_basewT_, | ||
2169 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_); | ||
2170 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES4_S4_RSt8ios_basewT_, | ||
2171 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES3_S3_RSt8ios_basewT_); | ||
2172 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES4_S4_RSt8ios_basewT_, | ||
2173 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES3_S3_RSt8ios_basewT_); | ||
2174 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES4_S4_RSt8ios_basewT_, | ||
2175 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES3_S3_RSt8ios_basewT_); | ||
2176 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES4_S4_RSt8ios_basewcT_, | ||
2177 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_); | ||
2178 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_, | ||
2179 | + _ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIeEES3_S3_RSt8ios_basewcT_); | ||
2180 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, | ||
2181 | + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); | ||
2182 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, | ||
2183 | + _ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); | ||
2184 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE, | ||
2185 | + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE); | ||
2186 | +_GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES4_S4_RSt8ios_basewRKSbIwS3_SaIwEE, | ||
2187 | + _ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE); | ||
2188 | + | ||
2189 | +#endif // _GLIBCXX_LONG_DOUBLE_COMPAT | ||
2190 | #endif | ||
2191 | diff -urpN -X /home/bergner/cvs/dontdiff gcc-41-20060515.orig/libstdc++-v3/testsuite/testsuite_abi.cc gcc-41-20060515/libstdc++-v3/testsuite/testsuite_abi.cc | ||
2192 | --- gcc-41-20060515.orig/libstdc++-v3/testsuite/testsuite_abi.cc 2006-05-15 11:15:38.000000000 -0500 | ||
2193 | +++ gcc-41-20060515/libstdc++-v3/testsuite/testsuite_abi.cc 2006-05-15 14:14:57.231341148 -0500 | ||
2194 | @@ -187,8 +187,11 @@ check_version(symbol& test, bool added) | ||
2195 | known_versions.push_back("GLIBCXX_3.4.6"); | ||
2196 | known_versions.push_back("GLIBCXX_3.4.7"); | ||
2197 | known_versions.push_back("GLIBCXX_3.4.8"); | ||
2198 | + known_versions.push_back("GLIBCXX_LDBL_3.4"); | ||
2199 | + known_versions.push_back("GLIBCXX_LDBL_3.4.7"); | ||
2200 | known_versions.push_back("CXXABI_1.3"); | ||
2201 | known_versions.push_back("CXXABI_1.3.1"); | ||
2202 | + known_versions.push_back("CXXABI_LDBL_1.3"); | ||
2203 | } | ||
2204 | compat_list::iterator begin = known_versions.begin(); | ||
2205 | compat_list::iterator end = known_versions.end(); | ||
2206 | @@ -224,9 +227,7 @@ check_version(symbol& test, bool added) | ||
2207 | // New version labels are ok. The rest are not. | ||
2208 | compat_list::iterator it2 = find(begin, end, test.name); | ||
2209 | if (it2 != end) | ||
2210 | - { | ||
2211 | - test.version_status = symbol::compatible; | ||
2212 | - } | ||
2213 | + test.version_status = symbol::compatible; | ||
2214 | else | ||
2215 | test.version_status = symbol::incompatible; | ||
2216 | } | ||
2217 | @@ -370,7 +371,7 @@ compare_symbols(const char* baseline_fil | ||
2218 | added_names.erase(it); | ||
2219 | } | ||
2220 | else | ||
2221 | - missing_names.push_back(what); | ||
2222 | + missing_names.push_back(what); | ||
2223 | } | ||
2224 | |||
2225 | // Check missing names for compatibility. | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/ppc-sfp-long-double-gcc411-7.patch b/meta/packages/gcc/gcc-4.1.1/ppc-sfp-long-double-gcc411-7.patch deleted file mode 100644 index e3a87c87d0..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/ppc-sfp-long-double-gcc411-7.patch +++ /dev/null | |||
@@ -1,4271 +0,0 @@ | |||
1 | * config/rs6000/darwin-ldouble.c: Build file for SOFT_FLOAT. | ||
2 | (strong_alias): Define. | ||
3 | (__gcc_qmul): Provide non-FMA for soft-float. | ||
4 | (__gcc_qdiv): Same. | ||
5 | (__gcc_qneg): New. | ||
6 | (__gcc_qeq): New. | ||
7 | (__gcc_qle): New. | ||
8 | (__gcc_qge): New. | ||
9 | (__gcc_qunord): New. | ||
10 | (__gcc_stoq): New. | ||
11 | (__gcc_dtoq): New. | ||
12 | (__gcc_qtos): New. | ||
13 | (__gcc_qtod): New. | ||
14 | (__gcc_qtoi): New. | ||
15 | (__gcc_qtou): New. | ||
16 | (__gcc_itoq): New. | ||
17 | (__gcc_utoq): New. | ||
18 | (fmsub): New. | ||
19 | * config/rs6000/rs6000.c (rs6000_emit_move): Handle TFmode | ||
20 | constant for soft-float. | ||
21 | (rs6000_init_libfuncs): Initialize soft-float functions. | ||
22 | * config/rs6000/libgcc-ppc-glibc.ver: Version soft-float symbols. | ||
23 | * config/rs6000/rs6000.md (movtf): Allow soft-float. | ||
24 | (movtf_softfloat): New. | ||
25 | * config/rs6000/t-ppccomm (TARGET_LIBGCC2_CFLAGS): Add | ||
26 | -mlong-double-128. | ||
27 | (ldblspecs): Remove. | ||
28 | * config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Do not warn | ||
29 | about long double soft float. | ||
30 | |||
31 | diff -urN gcc-4.1.1/gcc/config/rs6000/darwin-ldouble.c gcc-4.1.1-patched/gcc/config/rs6000/darwin-ldouble.c | ||
32 | --- gcc-4.1.1/gcc/config/rs6000/darwin-ldouble.c 2006-03-23 16:23:58.000000000 -0600 | ||
33 | +++ gcc-4.1.1-patched/gcc/config/rs6000/darwin-ldouble.c 2006-09-12 14:30:16.000000000 -0500 | ||
34 | @@ -49,7 +49,8 @@ | ||
35 | |||
36 | This code currently assumes big-endian. */ | ||
37 | |||
38 | -#if (!defined (__NO_FPRS__) && !defined (__LITTLE_ENDIAN__) \ | ||
39 | +#if ((!defined (__NO_FPRS__) || defined (_SOFT_FLOAT)) \ | ||
40 | + && !defined (__LITTLE_ENDIAN__) \ | ||
41 | && (defined (__MACH__) || defined (__powerpc__) || defined (_AIX))) | ||
42 | |||
43 | #define fabs(x) __builtin_fabs(x) | ||
44 | @@ -60,14 +61,19 @@ | ||
45 | |||
46 | #define nonfinite(a) unlikely (! isless (fabs (a), inf ())) | ||
47 | |||
48 | +/* Define ALIASNAME as a strong alias for NAME. */ | ||
49 | +# define strong_alias(name, aliasname) _strong_alias(name, aliasname) | ||
50 | +# define _strong_alias(name, aliasname) \ | ||
51 | + extern __typeof (name) aliasname __attribute__ ((alias (#name))); | ||
52 | + | ||
53 | /* All these routines actually take two long doubles as parameters, | ||
54 | but GCC currently generates poor code when a union is used to turn | ||
55 | a long double into a pair of doubles. */ | ||
56 | |||
57 | -extern long double __gcc_qadd (double, double, double, double); | ||
58 | -extern long double __gcc_qsub (double, double, double, double); | ||
59 | -extern long double __gcc_qmul (double, double, double, double); | ||
60 | -extern long double __gcc_qdiv (double, double, double, double); | ||
61 | +long double __gcc_qadd (double, double, double, double); | ||
62 | +long double __gcc_qsub (double, double, double, double); | ||
63 | +long double __gcc_qmul (double, double, double, double); | ||
64 | +long double __gcc_qdiv (double, double, double, double); | ||
65 | |||
66 | #if defined __ELF__ && defined SHARED \ | ||
67 | && (defined __powerpc64__ || !(defined __linux__ || defined __gnu_hurd__)) | ||
68 | @@ -139,6 +145,10 @@ | ||
69 | return __gcc_qadd (a, b, -c, -d); | ||
70 | } | ||
71 | |||
72 | +#ifdef _SOFT_FLOAT | ||
73 | +static double fmsub (double, double, double); | ||
74 | +#endif | ||
75 | + | ||
76 | long double | ||
77 | __gcc_qmul (double a, double b, double c, double d) | ||
78 | { | ||
79 | @@ -154,7 +164,11 @@ | ||
80 | /* Sum terms of two highest orders. */ | ||
81 | |||
82 | /* Use fused multiply-add to get low part of a * c. */ | ||
83 | +#ifndef _SOFT_FLOAT | ||
84 | asm ("fmsub %0,%1,%2,%3" : "=f"(tau) : "f"(a), "f"(c), "f"(t)); | ||
85 | +#else | ||
86 | + tau = fmsub (a, c, t); | ||
87 | +#endif | ||
88 | v = a*d; | ||
89 | w = b*c; | ||
90 | tau += v + w; /* Add in other second-order terms. */ | ||
91 | @@ -187,7 +201,11 @@ | ||
92 | numerically necessary. */ | ||
93 | |||
94 | /* Use fused multiply-add to get low part of c * t. */ | ||
95 | +#ifndef _SOFT_FLOAT | ||
96 | asm ("fmsub %0,%1,%2,%3" : "=f"(sigma) : "f"(c), "f"(t), "f"(s)); | ||
97 | +#else | ||
98 | + sigma = fmsub (c, t, s); | ||
99 | +#endif | ||
100 | v = a - s; | ||
101 | |||
102 | tau = ((v-sigma)+w)/c; /* Correction to t. */ | ||
103 | @@ -201,4 +219,3959 @@ | ||
104 | return z.ldval; | ||
105 | } | ||
106 | |||
107 | +#ifdef _SOFT_FLOAT | ||
108 | + | ||
109 | +long double __gcc_qneg (double, double); | ||
110 | +int __gcc_qeq (double, double, double, double); | ||
111 | +int __gcc_qne (double, double, double, double); | ||
112 | +int __gcc_qge (double, double, double, double); | ||
113 | +int __gcc_qle (double, double, double, double); | ||
114 | +int __gcc_qunord (double, double, double, double); | ||
115 | +long double __gcc_stoq (float); | ||
116 | +long double __gcc_dtoq (double); | ||
117 | +float __gcc_qtos (double, double); | ||
118 | +double __gcc_qtod (double, double); | ||
119 | +int __gcc_qtoi (double, double); | ||
120 | +unsigned int __gcc_qtou (double, double); | ||
121 | +long double __gcc_itoq (int); | ||
122 | +long double __gcc_utoq (unsigned int); | ||
123 | + | ||
124 | +extern int __eqdf2 (double, double); | ||
125 | +extern int __ledf2 (double, double); | ||
126 | +extern int __gedf2 (double, double); | ||
127 | +extern int __unorddf2 (double, double); | ||
128 | + | ||
129 | +/* Negate 'long double' value and return the result. */ | ||
130 | +long double | ||
131 | +__gcc_qneg (double a, double aa) | ||
132 | +{ | ||
133 | + longDblUnion x; | ||
134 | + | ||
135 | + x.dval[0] = -a; | ||
136 | + x.dval[1] = -aa; | ||
137 | + return x.ldval; | ||
138 | +} | ||
139 | + | ||
140 | +/* Compare two 'long double' values for equality. */ | ||
141 | +int | ||
142 | +__gcc_qeq (double a, double aa, double c, double cc) | ||
143 | +{ | ||
144 | + if (__eqdf2 (a, c) == 0) | ||
145 | + return __eqdf2 (aa, cc); | ||
146 | + return 1; | ||
147 | +} | ||
148 | + | ||
149 | +strong_alias (__gcc_qeq, __gcc_qne); | ||
150 | + | ||
151 | +/* Compare two 'long double' values for less than or equal. */ | ||
152 | +int | ||
153 | +__gcc_qle (double a, double aa, double c, double cc) | ||
154 | +{ | ||
155 | + if (__eqdf2 (a, c) == 0) | ||
156 | + return __ledf2 (aa, cc); | ||
157 | + return __ledf2 (a, c); | ||
158 | +} | ||
159 | + | ||
160 | +strong_alias (__gcc_qle, __gcc_qlt); | ||
161 | + | ||
162 | +/* Compare two 'long double' values for greater than or equal. */ | ||
163 | +int | ||
164 | +__gcc_qge (double a, double aa, double c, double cc) | ||
165 | +{ | ||
166 | + if (__eqdf2 (a, c) == 0) | ||
167 | + return __gedf2 (aa, cc); | ||
168 | + return __gedf2 (a, c); | ||
169 | +} | ||
170 | + | ||
171 | +strong_alias (__gcc_qge, __gcc_qgt); | ||
172 | + | ||
173 | +/* Compare two 'long double' values for unordered. */ | ||
174 | +int | ||
175 | +__gcc_qunord (double a, double aa, double c, double cc) | ||
176 | +{ | ||
177 | + if (__eqdf2 (a, c) == 0) | ||
178 | + return __unorddf2 (aa, cc); | ||
179 | + return __unorddf2 (a, c); | ||
180 | +} | ||
181 | + | ||
182 | +/* Convert single to long double. */ | ||
183 | +long double | ||
184 | +__gcc_stoq (float a) | ||
185 | +{ | ||
186 | + longDblUnion x; | ||
187 | + | ||
188 | + x.dval[0] = (double) a; | ||
189 | + x.dval[1] = 0.0; | ||
190 | + | ||
191 | + return x.ldval; | ||
192 | +} | ||
193 | + | ||
194 | +/* Convert double to long double. */ | ||
195 | +long double | ||
196 | +__gcc_dtoq (double a) | ||
197 | +{ | ||
198 | + longDblUnion x; | ||
199 | + | ||
200 | + x.dval[0] = a; | ||
201 | + x.dval[1] = 0.0; | ||
202 | + | ||
203 | + return x.ldval; | ||
204 | +} | ||
205 | + | ||
206 | +/* Convert long double to single. */ | ||
207 | +float | ||
208 | +__gcc_qtos (double a, double aa __attribute__ ((__unused__))) | ||
209 | +{ | ||
210 | + return (float) a; | ||
211 | +} | ||
212 | + | ||
213 | +/* Convert long double to double. */ | ||
214 | +double | ||
215 | +__gcc_qtod (double a, double aa __attribute__ ((__unused__))) | ||
216 | +{ | ||
217 | + return a; | ||
218 | +} | ||
219 | + | ||
220 | +/* Convert long double to int. */ | ||
221 | +int | ||
222 | +__gcc_qtoi (double a, double aa) | ||
223 | +{ | ||
224 | + double z = a + aa; | ||
225 | + return (int) z; | ||
226 | +} | ||
227 | + | ||
228 | +/* Convert long double to unsigned int. */ | ||
229 | +unsigned int | ||
230 | +__gcc_qtou (double a, double aa) | ||
231 | +{ | ||
232 | + double z = a + aa; | ||
233 | + return (unsigned int) z; | ||
234 | +} | ||
235 | + | ||
236 | +/* Convert int to long double. */ | ||
237 | +long double | ||
238 | +__gcc_itoq (int a) | ||
239 | +{ | ||
240 | + return __gcc_dtoq ((double) a); | ||
241 | +} | ||
242 | + | ||
243 | +/* Convert unsigned int to long double. */ | ||
244 | +long double | ||
245 | +__gcc_utoq (unsigned int a) | ||
246 | +{ | ||
247 | + return __gcc_dtoq ((double) a); | ||
248 | +} | ||
249 | + | ||
250 | +typedef int QItype __attribute__ ((mode (QI))); | ||
251 | +typedef int SItype __attribute__ ((mode (SI))); | ||
252 | +typedef int DItype __attribute__ ((mode (DI))); | ||
253 | +typedef unsigned int UQItype __attribute__ ((mode (QI))); | ||
254 | +typedef unsigned int USItype __attribute__ ((mode (SI))); | ||
255 | +typedef unsigned int UDItype __attribute__ ((mode (DI))); | ||
256 | + | ||
257 | +typedef unsigned int UHWtype __attribute__ ((mode (HI))); | ||
258 | +extern const UQItype __clz_tab[256]; | ||
259 | +extern void abort (void); | ||
260 | +typedef float DFtype __attribute__ ((mode (DF))); | ||
261 | + | ||
262 | +union _FP_UNION_D | ||
263 | +{ | ||
264 | + DFtype flt; | ||
265 | + struct | ||
266 | + { | ||
267 | + | ||
268 | + unsigned sign:1; | ||
269 | + unsigned exp:11; | ||
270 | + unsigned frac1:53 - (((unsigned long) 1 << (53 - 1) % 32) != 0) - 32; | ||
271 | + unsigned frac0:32; | ||
272 | + } bits __attribute__ ((packed)); | ||
273 | +}; | ||
274 | +typedef float TFtype __attribute__ ((mode (TF))); | ||
275 | + | ||
276 | +union _FP_UNION_Q | ||
277 | +{ | ||
278 | + TFtype flt; | ||
279 | + struct | ||
280 | + { | ||
281 | + | ||
282 | + unsigned sign:1; | ||
283 | + unsigned exp:15; | ||
284 | + unsigned long frac3:113 - (((unsigned long) 1 << (113 - 1) % 32) != | ||
285 | + 0) - (32 * 3); | ||
286 | + unsigned long frac2:32; | ||
287 | + unsigned long frac1:32; | ||
288 | + unsigned long frac0:32; | ||
289 | + } bits __attribute__ ((packed)); | ||
290 | +}; | ||
291 | + | ||
292 | +static double | ||
293 | +fmsub (double a, double b, double c) | ||
294 | +{ | ||
295 | + int _fex = 0; | ||
296 | + long A_c __attribute__ ((unused)), A_s, A_e; | ||
297 | + unsigned long A_f0, A_f1; | ||
298 | + long B_c __attribute__ ((unused)), B_s, B_e; | ||
299 | + unsigned long B_f0, B_f1; | ||
300 | + long C_c __attribute__ ((unused)), C_s, C_e; | ||
301 | + unsigned long C_f0, C_f1; | ||
302 | + long X_c __attribute__ ((unused)), X_s, X_e; | ||
303 | + unsigned long X_f[4]; | ||
304 | + long Y_c __attribute__ ((unused)), Y_s, Y_e; | ||
305 | + unsigned long Y_f[4]; | ||
306 | + long Z_c __attribute__ ((unused)), Z_s, Z_e; | ||
307 | + unsigned long Z_f[4]; | ||
308 | + long U_c __attribute__ ((unused)), U_s, U_e; | ||
309 | + unsigned long U_f[4]; | ||
310 | + long V_c __attribute__ ((unused)), V_s, V_e; | ||
311 | + unsigned long V_f[4]; | ||
312 | + long R_c __attribute__ ((unused)), R_s, R_e; | ||
313 | + unsigned long R_f0, R_f1; | ||
314 | + double r; | ||
315 | + long double u, v, x, y, z; | ||
316 | + | ||
317 | +/* FP_INIT_ROUNDMODE */ | ||
318 | + do | ||
319 | + { | ||
320 | + } | ||
321 | + while (0); | ||
322 | + | ||
323 | +/* FP_UNPACK_RAW_D (A, a) */ | ||
324 | + do | ||
325 | + { | ||
326 | + union _FP_UNION_D _flo; | ||
327 | + _flo.flt = (a); | ||
328 | + A_f0 = _flo.bits.frac0; | ||
329 | + A_f1 = _flo.bits.frac1; | ||
330 | + A_e = _flo.bits.exp; | ||
331 | + A_s = _flo.bits.sign; | ||
332 | + } | ||
333 | + while (0); | ||
334 | + | ||
335 | +/* FP_UNPACK_RAW_D (B, b) */ | ||
336 | + do | ||
337 | + { | ||
338 | + union _FP_UNION_D _flo; | ||
339 | + _flo.flt = (b); | ||
340 | + B_f0 = _flo.bits.frac0; | ||
341 | + B_f1 = _flo.bits.frac1; | ||
342 | + B_e = _flo.bits.exp; | ||
343 | + B_s = _flo.bits.sign; | ||
344 | + } | ||
345 | + while (0); | ||
346 | + | ||
347 | +/* FP_UNPACK_RAW_D (C, c) */ | ||
348 | + do | ||
349 | + { | ||
350 | + union _FP_UNION_D _flo; | ||
351 | + _flo.flt = (c); | ||
352 | + C_f0 = _flo.bits.frac0; | ||
353 | + C_f1 = _flo.bits.frac1; | ||
354 | + C_e = _flo.bits.exp; | ||
355 | + C_s = _flo.bits.sign; | ||
356 | + } | ||
357 | + while (0); | ||
358 | + | ||
359 | + /* Extend double to quad. */ | ||
360 | +/* FP_EXTEND(Q,D,4,2,X,A) */ | ||
361 | + do | ||
362 | + { | ||
363 | + if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1) | ||
364 | + abort (); | ||
365 | + X_s = A_s; | ||
366 | + do | ||
367 | + { | ||
368 | + X_f[0] = A_f0; | ||
369 | + X_f[1] = A_f1; | ||
370 | + X_f[2] = X_f[3] = 0; | ||
371 | + } | ||
372 | + while (0); | ||
373 | + if ((((A_e + 1) & 2047) > 1)) | ||
374 | + { | ||
375 | + X_e = A_e + 16383 - 1023; | ||
376 | + do | ||
377 | + { | ||
378 | + long _up, _down, _skip, _i; | ||
379 | + _skip = ((113 - 53)) / 32; | ||
380 | + _up = ((113 - 53)) % 32; | ||
381 | + _down = 32 - _up; | ||
382 | + if (!_up) | ||
383 | + for (_i = 3; _i >= _skip; --_i) | ||
384 | + X_f[_i] = X_f[_i - _skip]; | ||
385 | + else | ||
386 | + { | ||
387 | + for (_i = 3; _i > _skip; --_i) | ||
388 | + X_f[_i] = | ||
389 | + X_f[_i - _skip] << _up | X_f[_i - _skip - 1] >> _down; | ||
390 | + X_f[_i--] = X_f[0] << _up; | ||
391 | + } | ||
392 | + for (; _i >= 0; --_i) | ||
393 | + X_f[_i] = 0; | ||
394 | + } | ||
395 | + while (0); | ||
396 | + } | ||
397 | + else | ||
398 | + { | ||
399 | + if (A_e == 0) | ||
400 | + { | ||
401 | + if (((A_f1 | A_f0) == 0)) | ||
402 | + X_e = 0; | ||
403 | + else | ||
404 | + { | ||
405 | + int _lz; | ||
406 | + _fex |= (0); | ||
407 | + do | ||
408 | + { | ||
409 | + if (A_f1) | ||
410 | + do | ||
411 | + { | ||
412 | + if (sizeof (unsigned long) == | ||
413 | + sizeof (unsigned int)) | ||
414 | + _lz = __builtin_clz (A_f1); | ||
415 | + else if (sizeof (unsigned long) == | ||
416 | + sizeof (unsigned long)) | ||
417 | + _lz = __builtin_clzl (A_f1); | ||
418 | + else if (sizeof (unsigned long) == | ||
419 | + sizeof (unsigned long long)) | ||
420 | + _lz = __builtin_clzll (A_f1); | ||
421 | + else | ||
422 | + abort (); | ||
423 | + } | ||
424 | + while (0); | ||
425 | + else | ||
426 | + { | ||
427 | + do | ||
428 | + { | ||
429 | + if (sizeof (unsigned long) == | ||
430 | + sizeof (unsigned int)) | ||
431 | + _lz = __builtin_clz (A_f0); | ||
432 | + else if (sizeof (unsigned long) == | ||
433 | + sizeof (unsigned long)) | ||
434 | + _lz = __builtin_clzl (A_f0); | ||
435 | + else if (sizeof (unsigned long) == | ||
436 | + sizeof (unsigned long long)) | ||
437 | + _lz = __builtin_clzll (A_f0); | ||
438 | + else | ||
439 | + abort (); | ||
440 | + } | ||
441 | + while (0); | ||
442 | + _lz += 32; | ||
443 | + } | ||
444 | + } | ||
445 | + while (0); | ||
446 | + do | ||
447 | + { | ||
448 | + long _up, _down, _skip, _i; | ||
449 | + _skip = (_lz + 113 - (2 * 32)) / 32; | ||
450 | + _up = (_lz + 113 - (2 * 32)) % 32; | ||
451 | + _down = 32 - _up; | ||
452 | + if (!_up) | ||
453 | + for (_i = 3; _i >= _skip; --_i) | ||
454 | + X_f[_i] = X_f[_i - _skip]; | ||
455 | + else | ||
456 | + { | ||
457 | + for (_i = 3; _i > _skip; --_i) | ||
458 | + X_f[_i] = | ||
459 | + X_f[_i - _skip] << _up | X_f[_i - _skip - | ||
460 | + 1] >> _down; | ||
461 | + X_f[_i--] = X_f[0] << _up; | ||
462 | + } | ||
463 | + for (; _i >= 0; --_i) | ||
464 | + X_f[_i] = 0; | ||
465 | + } | ||
466 | + while (0); | ||
467 | + X_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz); | ||
468 | + } | ||
469 | + } | ||
470 | + else | ||
471 | + { | ||
472 | + X_e = 32767; | ||
473 | + if (!((A_f1 | A_f0) == 0)) | ||
474 | + { | ||
475 | + if (!((A_f1) & ((unsigned long) 1 << (53 - 2) % 32))) | ||
476 | + _fex |= (0); | ||
477 | + do | ||
478 | + { | ||
479 | + long _up, _down, _skip, _i; | ||
480 | + _skip = ((113 - 53)) / 32; | ||
481 | + _up = ((113 - 53)) % 32; | ||
482 | + _down = 32 - _up; | ||
483 | + if (!_up) | ||
484 | + for (_i = 3; _i >= _skip; --_i) | ||
485 | + X_f[_i] = X_f[_i - _skip]; | ||
486 | + else | ||
487 | + { | ||
488 | + for (_i = 3; _i > _skip; --_i) | ||
489 | + X_f[_i] = | ||
490 | + X_f[_i - _skip] << _up | X_f[_i - _skip - | ||
491 | + 1] >> _down; | ||
492 | + X_f[_i--] = X_f[0] << _up; | ||
493 | + } | ||
494 | + for (; _i >= 0; --_i) | ||
495 | + X_f[_i] = 0; | ||
496 | + } | ||
497 | + while (0); | ||
498 | + } | ||
499 | + } | ||
500 | + } | ||
501 | + } | ||
502 | + while (0); | ||
503 | + | ||
504 | +/* FP_EXTEND(Q,D,4,2,Y,B) */ | ||
505 | + do | ||
506 | + { | ||
507 | + if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1) | ||
508 | + abort (); | ||
509 | + Y_s = B_s; | ||
510 | + do | ||
511 | + { | ||
512 | + Y_f[0] = B_f0; | ||
513 | + Y_f[1] = B_f1; | ||
514 | + Y_f[2] = Y_f[3] = 0; | ||
515 | + } | ||
516 | + while (0); | ||
517 | + if ((((B_e + 1) & 2047) > 1)) | ||
518 | + { | ||
519 | + Y_e = B_e + 16383 - 1023; | ||
520 | + do | ||
521 | + { | ||
522 | + long _up, _down, _skip, _i; | ||
523 | + _skip = ((113 - 53)) / 32; | ||
524 | + _up = ((113 - 53)) % 32; | ||
525 | + _down = 32 - _up; | ||
526 | + if (!_up) | ||
527 | + for (_i = 3; _i >= _skip; --_i) | ||
528 | + Y_f[_i] = Y_f[_i - _skip]; | ||
529 | + else | ||
530 | + { | ||
531 | + for (_i = 3; _i > _skip; --_i) | ||
532 | + Y_f[_i] = | ||
533 | + Y_f[_i - _skip] << _up | Y_f[_i - _skip - 1] >> _down; | ||
534 | + Y_f[_i--] = Y_f[0] << _up; | ||
535 | + } | ||
536 | + for (; _i >= 0; --_i) | ||
537 | + Y_f[_i] = 0; | ||
538 | + } | ||
539 | + while (0); | ||
540 | + } | ||
541 | + else | ||
542 | + { | ||
543 | + if (B_e == 0) | ||
544 | + { | ||
545 | + if (((B_f1 | B_f0) == 0)) | ||
546 | + Y_e = 0; | ||
547 | + else | ||
548 | + { | ||
549 | + int _lz; | ||
550 | + _fex |= (0); | ||
551 | + do | ||
552 | + { | ||
553 | + if (B_f1) | ||
554 | + do | ||
555 | + { | ||
556 | + if (sizeof (unsigned long) == | ||
557 | + sizeof (unsigned int)) | ||
558 | + _lz = __builtin_clz (B_f1); | ||
559 | + else if (sizeof (unsigned long) == | ||
560 | + sizeof (unsigned long)) | ||
561 | + _lz = __builtin_clzl (B_f1); | ||
562 | + else if (sizeof (unsigned long) == | ||
563 | + sizeof (unsigned long long)) | ||
564 | + _lz = __builtin_clzll (B_f1); | ||
565 | + else | ||
566 | + abort (); | ||
567 | + } | ||
568 | + while (0); | ||
569 | + else | ||
570 | + { | ||
571 | + do | ||
572 | + { | ||
573 | + if (sizeof (unsigned long) == | ||
574 | + sizeof (unsigned int)) | ||
575 | + _lz = __builtin_clz (B_f0); | ||
576 | + else if (sizeof (unsigned long) == | ||
577 | + sizeof (unsigned long)) | ||
578 | + _lz = __builtin_clzl (B_f0); | ||
579 | + else if (sizeof (unsigned long) == | ||
580 | + sizeof (unsigned long long)) | ||
581 | + _lz = __builtin_clzll (B_f0); | ||
582 | + else | ||
583 | + abort (); | ||
584 | + } | ||
585 | + while (0); | ||
586 | + _lz += 32; | ||
587 | + } | ||
588 | + } | ||
589 | + while (0); | ||
590 | + do | ||
591 | + { | ||
592 | + long _up, _down, _skip, _i; | ||
593 | + _skip = (_lz + 113 - (2 * 32)) / 32; | ||
594 | + _up = (_lz + 113 - (2 * 32)) % 32; | ||
595 | + _down = 32 - _up; | ||
596 | + if (!_up) | ||
597 | + for (_i = 3; _i >= _skip; --_i) | ||
598 | + Y_f[_i] = Y_f[_i - _skip]; | ||
599 | + else | ||
600 | + { | ||
601 | + for (_i = 3; _i > _skip; --_i) | ||
602 | + Y_f[_i] = | ||
603 | + Y_f[_i - _skip] << _up | Y_f[_i - _skip - | ||
604 | + 1] >> _down; | ||
605 | + Y_f[_i--] = Y_f[0] << _up; | ||
606 | + } | ||
607 | + for (; _i >= 0; --_i) | ||
608 | + Y_f[_i] = 0; | ||
609 | + } | ||
610 | + while (0); | ||
611 | + Y_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz); | ||
612 | + } | ||
613 | + } | ||
614 | + else | ||
615 | + { | ||
616 | + Y_e = 32767; | ||
617 | + if (!((B_f1 | B_f0) == 0)) | ||
618 | + { | ||
619 | + if (!((B_f1) & ((unsigned long) 1 << (53 - 2) % 32))) | ||
620 | + _fex |= (0); | ||
621 | + do | ||
622 | + { | ||
623 | + long _up, _down, _skip, _i; | ||
624 | + _skip = ((113 - 53)) / 32; | ||
625 | + _up = ((113 - 53)) % 32; | ||
626 | + _down = 32 - _up; | ||
627 | + if (!_up) | ||
628 | + for (_i = 3; _i >= _skip; --_i) | ||
629 | + Y_f[_i] = Y_f[_i - _skip]; | ||
630 | + else | ||
631 | + { | ||
632 | + for (_i = 3; _i > _skip; --_i) | ||
633 | + Y_f[_i] = | ||
634 | + Y_f[_i - _skip] << _up | Y_f[_i - _skip - | ||
635 | + 1] >> _down; | ||
636 | + Y_f[_i--] = Y_f[0] << _up; | ||
637 | + } | ||
638 | + for (; _i >= 0; --_i) | ||
639 | + Y_f[_i] = 0; | ||
640 | + } | ||
641 | + while (0); | ||
642 | + } | ||
643 | + } | ||
644 | + } | ||
645 | + } | ||
646 | + while (0); | ||
647 | + | ||
648 | +/* FP_EXTEND(Q,D,4,2,Z,C) */ | ||
649 | + do | ||
650 | + { | ||
651 | + if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1) | ||
652 | + abort (); | ||
653 | + Z_s = C_s; | ||
654 | + do | ||
655 | + { | ||
656 | + Z_f[0] = C_f0; | ||
657 | + Z_f[1] = C_f1; | ||
658 | + Z_f[2] = Z_f[3] = 0; | ||
659 | + } | ||
660 | + while (0); | ||
661 | + if ((((C_e + 1) & 2047) > 1)) | ||
662 | + { | ||
663 | + Z_e = C_e + 16383 - 1023; | ||
664 | + do | ||
665 | + { | ||
666 | + long _up, _down, _skip, _i; | ||
667 | + _skip = ((113 - 53)) / 32; | ||
668 | + _up = ((113 - 53)) % 32; | ||
669 | + _down = 32 - _up; | ||
670 | + if (!_up) | ||
671 | + for (_i = 3; _i >= _skip; --_i) | ||
672 | + Z_f[_i] = Z_f[_i - _skip]; | ||
673 | + else | ||
674 | + { | ||
675 | + for (_i = 3; _i > _skip; --_i) | ||
676 | + Z_f[_i] = | ||
677 | + Z_f[_i - _skip] << _up | Z_f[_i - _skip - 1] >> _down; | ||
678 | + Z_f[_i--] = Z_f[0] << _up; | ||
679 | + } | ||
680 | + for (; _i >= 0; --_i) | ||
681 | + Z_f[_i] = 0; | ||
682 | + } | ||
683 | + while (0); | ||
684 | + } | ||
685 | + else | ||
686 | + { | ||
687 | + if (C_e == 0) | ||
688 | + { | ||
689 | + if (((C_f1 | C_f0) == 0)) | ||
690 | + Z_e = 0; | ||
691 | + else | ||
692 | + { | ||
693 | + int _lz; | ||
694 | + _fex |= (0); | ||
695 | + do | ||
696 | + { | ||
697 | + if (C_f1) | ||
698 | + do | ||
699 | + { | ||
700 | + if (sizeof (unsigned long) == | ||
701 | + sizeof (unsigned int)) | ||
702 | + _lz = __builtin_clz (C_f1); | ||
703 | + else if (sizeof (unsigned long) == | ||
704 | + sizeof (unsigned long)) | ||
705 | + _lz = __builtin_clzl (C_f1); | ||
706 | + else if (sizeof (unsigned long) == | ||
707 | + sizeof (unsigned long long)) | ||
708 | + _lz = __builtin_clzll (C_f1); | ||
709 | + else | ||
710 | + abort (); | ||
711 | + } | ||
712 | + while (0); | ||
713 | + else | ||
714 | + { | ||
715 | + do | ||
716 | + { | ||
717 | + if (sizeof (unsigned long) == | ||
718 | + sizeof (unsigned int)) | ||
719 | + _lz = __builtin_clz (C_f0); | ||
720 | + else if (sizeof (unsigned long) == | ||
721 | + sizeof (unsigned long)) | ||
722 | + _lz = __builtin_clzl (C_f0); | ||
723 | + else if (sizeof (unsigned long) == | ||
724 | + sizeof (unsigned long long)) | ||
725 | + _lz = __builtin_clzll (C_f0); | ||
726 | + else | ||
727 | + abort (); | ||
728 | + } | ||
729 | + while (0); | ||
730 | + _lz += 32; | ||
731 | + } | ||
732 | + } | ||
733 | + while (0); | ||
734 | + do | ||
735 | + { | ||
736 | + long _up, _down, _skip, _i; | ||
737 | + _skip = (_lz + 113 - (2 * 32)) / 32; | ||
738 | + _up = (_lz + 113 - (2 * 32)) % 32; | ||
739 | + _down = 32 - _up; | ||
740 | + if (!_up) | ||
741 | + for (_i = 3; _i >= _skip; --_i) | ||
742 | + Z_f[_i] = Z_f[_i - _skip]; | ||
743 | + else | ||
744 | + { | ||
745 | + for (_i = 3; _i > _skip; --_i) | ||
746 | + Z_f[_i] = | ||
747 | + Z_f[_i - _skip] << _up | Z_f[_i - _skip - | ||
748 | + 1] >> _down; | ||
749 | + Z_f[_i--] = Z_f[0] << _up; | ||
750 | + } | ||
751 | + for (; _i >= 0; --_i) | ||
752 | + Z_f[_i] = 0; | ||
753 | + } | ||
754 | + while (0); | ||
755 | + Z_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz); | ||
756 | + } | ||
757 | + } | ||
758 | + else | ||
759 | + { | ||
760 | + Z_e = 32767; | ||
761 | + if (!((C_f1 | C_f0) == 0)) | ||
762 | + { | ||
763 | + if (!((C_f1) & ((unsigned long) 1 << (53 - 2) % 32))) | ||
764 | + _fex |= (0); | ||
765 | + do | ||
766 | + { | ||
767 | + long _up, _down, _skip, _i; | ||
768 | + _skip = ((113 - 53)) / 32; | ||
769 | + _up = ((113 - 53)) % 32; | ||
770 | + _down = 32 - _up; | ||
771 | + if (!_up) | ||
772 | + for (_i = 3; _i >= _skip; --_i) | ||
773 | + Z_f[_i] = Z_f[_i - _skip]; | ||
774 | + else | ||
775 | + { | ||
776 | + for (_i = 3; _i > _skip; --_i) | ||
777 | + Z_f[_i] = | ||
778 | + Z_f[_i - _skip] << _up | Z_f[_i - _skip - | ||
779 | + 1] >> _down; | ||
780 | + Z_f[_i--] = Z_f[0] << _up; | ||
781 | + } | ||
782 | + for (; _i >= 0; --_i) | ||
783 | + Z_f[_i] = 0; | ||
784 | + } | ||
785 | + while (0); | ||
786 | + } | ||
787 | + } | ||
788 | + } | ||
789 | + } | ||
790 | + while (0); | ||
791 | + | ||
792 | +/* FP_PACK_RAW_Q(x,X) */ | ||
793 | + do | ||
794 | + { | ||
795 | + union _FP_UNION_Q _flo; | ||
796 | + _flo.bits.frac0 = X_f[0]; | ||
797 | + _flo.bits.frac1 = X_f[1]; | ||
798 | + _flo.bits.frac2 = X_f[2]; | ||
799 | + _flo.bits.frac3 = X_f[3]; | ||
800 | + _flo.bits.exp = X_e; | ||
801 | + _flo.bits.sign = X_s; | ||
802 | + (x) = _flo.flt; | ||
803 | + } | ||
804 | + while (0); | ||
805 | + | ||
806 | +/* FP_PACK_RAW_Q(y,Y) */ | ||
807 | + do | ||
808 | + { | ||
809 | + union _FP_UNION_Q _flo; | ||
810 | + _flo.bits.frac0 = Y_f[0]; | ||
811 | + _flo.bits.frac1 = Y_f[1]; | ||
812 | + _flo.bits.frac2 = Y_f[2]; | ||
813 | + _flo.bits.frac3 = Y_f[3]; | ||
814 | + _flo.bits.exp = Y_e; | ||
815 | + _flo.bits.sign = Y_s; | ||
816 | + (y) = _flo.flt; | ||
817 | + } | ||
818 | + while (0); | ||
819 | + | ||
820 | +/* FP_PACK_RAW_Q(z,Z) */ | ||
821 | + do | ||
822 | + { | ||
823 | + union _FP_UNION_Q _flo; | ||
824 | + _flo.bits.frac0 = Z_f[0]; | ||
825 | + _flo.bits.frac1 = Z_f[1]; | ||
826 | + _flo.bits.frac2 = Z_f[2]; | ||
827 | + _flo.bits.frac3 = Z_f[3]; | ||
828 | + _flo.bits.exp = Z_e; | ||
829 | + _flo.bits.sign = Z_s; | ||
830 | + (z) = _flo.flt; | ||
831 | + } | ||
832 | + while (0); | ||
833 | + | ||
834 | +/* FP_HANDLE_EXCEPTIONS */ | ||
835 | + do | ||
836 | + { | ||
837 | + } | ||
838 | + while (0); | ||
839 | + | ||
840 | + /* Multiply. */ | ||
841 | +/* FP_INIT_ROUNDMODE */ | ||
842 | + do | ||
843 | + { | ||
844 | + } | ||
845 | + while (0); | ||
846 | + | ||
847 | +/* FP_UNPACK_Q(X,x) */ | ||
848 | + do | ||
849 | + { | ||
850 | + do | ||
851 | + { | ||
852 | + union _FP_UNION_Q _flo; | ||
853 | + _flo.flt = (x); | ||
854 | + X_f[0] = _flo.bits.frac0; | ||
855 | + X_f[1] = _flo.bits.frac1; | ||
856 | + X_f[2] = _flo.bits.frac2; | ||
857 | + X_f[3] = _flo.bits.frac3; | ||
858 | + X_e = _flo.bits.exp; | ||
859 | + X_s = _flo.bits.sign; | ||
860 | + } | ||
861 | + while (0); | ||
862 | + do | ||
863 | + { | ||
864 | + switch (X_e) | ||
865 | + { | ||
866 | + default: | ||
867 | + (X_f[3]) |= ((unsigned long) 1 << (113 - 1) % 32); | ||
868 | + do | ||
869 | + { | ||
870 | + long _up, _down, _skip, _i; | ||
871 | + _skip = (3) / 32; | ||
872 | + _up = (3) % 32; | ||
873 | + _down = 32 - _up; | ||
874 | + if (!_up) | ||
875 | + for (_i = 3; _i >= _skip; --_i) | ||
876 | + X_f[_i] = X_f[_i - _skip]; | ||
877 | + else | ||
878 | + { | ||
879 | + for (_i = 3; _i > _skip; --_i) | ||
880 | + X_f[_i] = | ||
881 | + X_f[_i - _skip] << _up | X_f[_i - _skip - | ||
882 | + 1] >> _down; | ||
883 | + X_f[_i--] = X_f[0] << _up; | ||
884 | + } | ||
885 | + for (; _i >= 0; --_i) | ||
886 | + X_f[_i] = 0; | ||
887 | + } | ||
888 | + while (0); | ||
889 | + X_e -= 16383; | ||
890 | + X_c = 0; | ||
891 | + break; | ||
892 | + case 0: | ||
893 | + if (((X_f[0] | X_f[1] | X_f[2] | X_f[3]) == 0)) | ||
894 | + X_c = 1; | ||
895 | + else | ||
896 | + { | ||
897 | + long _shift; | ||
898 | + do | ||
899 | + { | ||
900 | + if (X_f[3]) | ||
901 | + { | ||
902 | + do | ||
903 | + { | ||
904 | + if (sizeof (unsigned long) == | ||
905 | + sizeof (unsigned int)) | ||
906 | + _shift = __builtin_clz (X_f[3]); | ||
907 | + else if (sizeof (unsigned long) == | ||
908 | + sizeof (unsigned long)) | ||
909 | + _shift = __builtin_clzl (X_f[3]); | ||
910 | + else if (sizeof (unsigned long) == | ||
911 | + sizeof (unsigned long long)) | ||
912 | + _shift = __builtin_clzll (X_f[3]); | ||
913 | + else | ||
914 | + abort (); | ||
915 | + } | ||
916 | + while (0); | ||
917 | + } | ||
918 | + else if (X_f[2]) | ||
919 | + { | ||
920 | + do | ||
921 | + { | ||
922 | + if (sizeof (unsigned long) == | ||
923 | + sizeof (unsigned int)) | ||
924 | + _shift = __builtin_clz (X_f[2]); | ||
925 | + else if (sizeof (unsigned long) == | ||
926 | + sizeof (unsigned long)) | ||
927 | + _shift = __builtin_clzl (X_f[2]); | ||
928 | + else if (sizeof (unsigned long) == | ||
929 | + sizeof (unsigned long long)) | ||
930 | + _shift = __builtin_clzll (X_f[2]); | ||
931 | + else | ||
932 | + abort (); | ||
933 | + } | ||
934 | + while (0); | ||
935 | + _shift += 32; | ||
936 | + } | ||
937 | + else if (X_f[1]) | ||
938 | + { | ||
939 | + do | ||
940 | + { | ||
941 | + if (sizeof (unsigned long) == | ||
942 | + sizeof (unsigned int)) | ||
943 | + _shift = __builtin_clz (X_f[1]); | ||
944 | + else if (sizeof (unsigned long) == | ||
945 | + sizeof (unsigned long)) | ||
946 | + _shift = __builtin_clzl (X_f[1]); | ||
947 | + else if (sizeof (unsigned long) == | ||
948 | + sizeof (unsigned long long)) | ||
949 | + _shift = __builtin_clzll (X_f[1]); | ||
950 | + else | ||
951 | + abort (); | ||
952 | + } | ||
953 | + while (0); | ||
954 | + _shift += 32 * 2; | ||
955 | + } | ||
956 | + else | ||
957 | + { | ||
958 | + do | ||
959 | + { | ||
960 | + if (sizeof (unsigned long) == | ||
961 | + sizeof (unsigned int)) | ||
962 | + _shift = __builtin_clz (X_f[0]); | ||
963 | + else if (sizeof (unsigned long) == | ||
964 | + sizeof (unsigned long)) | ||
965 | + _shift = __builtin_clzl (X_f[0]); | ||
966 | + else if (sizeof (unsigned long) == | ||
967 | + sizeof (unsigned long long)) | ||
968 | + _shift = __builtin_clzll (X_f[0]); | ||
969 | + else | ||
970 | + abort (); | ||
971 | + } | ||
972 | + while (0); | ||
973 | + _shift += 32 * 3; | ||
974 | + } | ||
975 | + } | ||
976 | + while (0); | ||
977 | + _shift -= ((4 * 32) - 113); | ||
978 | + do | ||
979 | + { | ||
980 | + long _up, _down, _skip, _i; | ||
981 | + _skip = ((_shift + 3)) / 32; | ||
982 | + _up = ((_shift + 3)) % 32; | ||
983 | + _down = 32 - _up; | ||
984 | + if (!_up) | ||
985 | + for (_i = 3; _i >= _skip; --_i) | ||
986 | + X_f[_i] = X_f[_i - _skip]; | ||
987 | + else | ||
988 | + { | ||
989 | + for (_i = 3; _i > _skip; --_i) | ||
990 | + X_f[_i] = | ||
991 | + X_f[_i - _skip] << _up | X_f[_i - _skip - | ||
992 | + 1] >> _down; | ||
993 | + X_f[_i--] = X_f[0] << _up; | ||
994 | + } | ||
995 | + for (; _i >= 0; --_i) | ||
996 | + X_f[_i] = 0; | ||
997 | + } | ||
998 | + while (0); | ||
999 | + X_e -= 16383 - 1 + _shift; | ||
1000 | + X_c = 0; | ||
1001 | + _fex |= (0); | ||
1002 | + } | ||
1003 | + break; | ||
1004 | + case 32767: | ||
1005 | + if (((X_f[0] | X_f[1] | X_f[2] | X_f[3]) == 0)) | ||
1006 | + X_c = 2; | ||
1007 | + else | ||
1008 | + { | ||
1009 | + X_c = 3; | ||
1010 | + if (!((X_f[3]) & ((unsigned long) 1 << (113 - 2) % 32))) | ||
1011 | + _fex |= (0); | ||
1012 | + } break; | ||
1013 | + } | ||
1014 | + } | ||
1015 | + while (0); | ||
1016 | + } | ||
1017 | + while (0); | ||
1018 | + | ||
1019 | +/* FP_UNPACK_Q(Y,y) */ | ||
1020 | + do | ||
1021 | + { | ||
1022 | + do | ||
1023 | + { | ||
1024 | + union _FP_UNION_Q _flo; | ||
1025 | + _flo.flt = (y); | ||
1026 | + Y_f[0] = _flo.bits.frac0; | ||
1027 | + Y_f[1] = _flo.bits.frac1; | ||
1028 | + Y_f[2] = _flo.bits.frac2; | ||
1029 | + Y_f[3] = _flo.bits.frac3; | ||
1030 | + Y_e = _flo.bits.exp; | ||
1031 | + Y_s = _flo.bits.sign; | ||
1032 | + } | ||
1033 | + while (0); | ||
1034 | + do | ||
1035 | + { | ||
1036 | + switch (Y_e) | ||
1037 | + { | ||
1038 | + default: | ||
1039 | + (Y_f[3]) |= ((unsigned long) 1 << (113 - 1) % 32); | ||
1040 | + do | ||
1041 | + { | ||
1042 | + long _up, _down, _skip, _i; | ||
1043 | + _skip = (3) / 32; | ||
1044 | + _up = (3) % 32; | ||
1045 | + _down = 32 - _up; | ||
1046 | + if (!_up) | ||
1047 | + for (_i = 3; _i >= _skip; --_i) | ||
1048 | + Y_f[_i] = Y_f[_i - _skip]; | ||
1049 | + else | ||
1050 | + { | ||
1051 | + for (_i = 3; _i > _skip; --_i) | ||
1052 | + Y_f[_i] = | ||
1053 | + Y_f[_i - _skip] << _up | Y_f[_i - _skip - | ||
1054 | + 1] >> _down; | ||
1055 | + Y_f[_i--] = Y_f[0] << _up; | ||
1056 | + } | ||
1057 | + for (; _i >= 0; --_i) | ||
1058 | + Y_f[_i] = 0; | ||
1059 | + } | ||
1060 | + while (0); | ||
1061 | + Y_e -= 16383; | ||
1062 | + Y_c = 0; | ||
1063 | + break; | ||
1064 | + case 0: | ||
1065 | + if (((Y_f[0] | Y_f[1] | Y_f[2] | Y_f[3]) == 0)) | ||
1066 | + Y_c = 1; | ||
1067 | + else | ||
1068 | + { | ||
1069 | + long _shift; | ||
1070 | + do | ||
1071 | + { | ||
1072 | + if (Y_f[3]) | ||
1073 | + { | ||
1074 | + do | ||
1075 | + { | ||
1076 | + if (sizeof (unsigned long) == | ||
1077 | + sizeof (unsigned int)) | ||
1078 | + _shift = __builtin_clz (Y_f[3]); | ||
1079 | + else if (sizeof (unsigned long) == | ||
1080 | + sizeof (unsigned long)) | ||
1081 | + _shift = __builtin_clzl (Y_f[3]); | ||
1082 | + else if (sizeof (unsigned long) == | ||
1083 | + sizeof (unsigned long long)) | ||
1084 | + _shift = __builtin_clzll (Y_f[3]); | ||
1085 | + else | ||
1086 | + abort (); | ||
1087 | + } | ||
1088 | + while (0); | ||
1089 | + } | ||
1090 | + else if (Y_f[2]) | ||
1091 | + { | ||
1092 | + do | ||
1093 | + { | ||
1094 | + if (sizeof (unsigned long) == | ||
1095 | + sizeof (unsigned int)) | ||
1096 | + _shift = __builtin_clz (Y_f[2]); | ||
1097 | + else if (sizeof (unsigned long) == | ||
1098 | + sizeof (unsigned long)) | ||
1099 | + _shift = __builtin_clzl (Y_f[2]); | ||
1100 | + else if (sizeof (unsigned long) == | ||
1101 | + sizeof (unsigned long long)) | ||
1102 | + _shift = __builtin_clzll (Y_f[2]); | ||
1103 | + else | ||
1104 | + abort (); | ||
1105 | + } | ||
1106 | + while (0); | ||
1107 | + _shift += 32; | ||
1108 | + } | ||
1109 | + else if (Y_f[1]) | ||
1110 | + { | ||
1111 | + do | ||
1112 | + { | ||
1113 | + if (sizeof (unsigned long) == | ||
1114 | + sizeof (unsigned int)) | ||
1115 | + _shift = __builtin_clz (Y_f[1]); | ||
1116 | + else if (sizeof (unsigned long) == | ||
1117 | + sizeof (unsigned long)) | ||
1118 | + _shift = __builtin_clzl (Y_f[1]); | ||
1119 | + else if (sizeof (unsigned long) == | ||
1120 | + sizeof (unsigned long long)) | ||
1121 | + _shift = __builtin_clzll (Y_f[1]); | ||
1122 | + else | ||
1123 | + abort (); | ||
1124 | + } | ||
1125 | + while (0); | ||
1126 | + _shift += 32 * 2; | ||
1127 | + } | ||
1128 | + else | ||
1129 | + { | ||
1130 | + do | ||
1131 | + { | ||
1132 | + if (sizeof (unsigned long) == | ||
1133 | + sizeof (unsigned int)) | ||
1134 | + _shift = __builtin_clz (Y_f[0]); | ||
1135 | + else if (sizeof (unsigned long) == | ||
1136 | + sizeof (unsigned long)) | ||
1137 | + _shift = __builtin_clzl (Y_f[0]); | ||
1138 | + else if (sizeof (unsigned long) == | ||
1139 | + sizeof (unsigned long long)) | ||
1140 | + _shift = __builtin_clzll (Y_f[0]); | ||
1141 | + else | ||
1142 | + abort (); | ||
1143 | + } | ||
1144 | + while (0); | ||
1145 | + _shift += 32 * 3; | ||
1146 | + } | ||
1147 | + } | ||
1148 | + while (0); | ||
1149 | + _shift -= ((4 * 32) - 113); | ||
1150 | + do | ||
1151 | + { | ||
1152 | + long _up, _down, _skip, _i; | ||
1153 | + _skip = ((_shift + 3)) / 32; | ||
1154 | + _up = ((_shift + 3)) % 32; | ||
1155 | + _down = 32 - _up; | ||
1156 | + if (!_up) | ||
1157 | + for (_i = 3; _i >= _skip; --_i) | ||
1158 | + Y_f[_i] = Y_f[_i - _skip]; | ||
1159 | + else | ||
1160 | + { | ||
1161 | + for (_i = 3; _i > _skip; --_i) | ||
1162 | + Y_f[_i] = | ||
1163 | + Y_f[_i - _skip] << _up | Y_f[_i - _skip - | ||
1164 | + 1] >> _down; | ||
1165 | + Y_f[_i--] = Y_f[0] << _up; | ||
1166 | + } | ||
1167 | + for (; _i >= 0; --_i) | ||
1168 | + Y_f[_i] = 0; | ||
1169 | + } | ||
1170 | + while (0); | ||
1171 | + Y_e -= 16383 - 1 + _shift; | ||
1172 | + Y_c = 0; | ||
1173 | + _fex |= (0); | ||
1174 | + } | ||
1175 | + break; | ||
1176 | + case 32767: | ||
1177 | + if (((Y_f[0] | Y_f[1] | Y_f[2] | Y_f[3]) == 0)) | ||
1178 | + Y_c = 2; | ||
1179 | + else | ||
1180 | + { | ||
1181 | + Y_c = 3; | ||
1182 | + if (!((Y_f[3]) & ((unsigned long) 1 << (113 - 2) % 32))) | ||
1183 | + _fex |= (0); | ||
1184 | + } break; | ||
1185 | + } | ||
1186 | + } | ||
1187 | + while (0); | ||
1188 | + } | ||
1189 | + while (0); | ||
1190 | + | ||
1191 | +/* FP_MUL_Q(U,X,Y) */ | ||
1192 | + do | ||
1193 | + { | ||
1194 | + U_s = X_s ^ Y_s; | ||
1195 | + switch ((((X_c) << 2) | (Y_c))) | ||
1196 | + { | ||
1197 | + case (((0) << 2) | (0)): | ||
1198 | + U_c = 0; | ||
1199 | + U_e = X_e + Y_e + 1; | ||
1200 | + do | ||
1201 | + { | ||
1202 | + unsigned long _z_f[8]; | ||
1203 | + unsigned long _b_f0, _b_f1; | ||
1204 | + unsigned long _c_f0, _c_f1; | ||
1205 | + unsigned long _d_f0, _d_f1; | ||
1206 | + unsigned long _e_f0, _e_f1; | ||
1207 | + unsigned long _f_f0, _f_f1; | ||
1208 | + do | ||
1209 | + { | ||
1210 | + USItype __m0 = (X_f[0]), __m1 = (Y_f[0]); | ||
1211 | + __asm__ ("mulhwu %0,%1,%2": "=r" ((_z_f[1])):"%r" (X_f[0]), | ||
1212 | + "r" (Y_f | ||
1213 | + [0])); | ||
1214 | + ((_z_f[0])) = __m0 * __m1; | ||
1215 | + } | ||
1216 | + while (0); | ||
1217 | + do | ||
1218 | + { | ||
1219 | + USItype __m0 = (X_f[0]), __m1 = (Y_f[1]); | ||
1220 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[0]), | ||
1221 | + "r" (Y_f | ||
1222 | + [1])); | ||
1223 | + (_b_f0) = __m0 * __m1; | ||
1224 | + } | ||
1225 | + while (0); | ||
1226 | + do | ||
1227 | + { | ||
1228 | + USItype __m0 = (X_f[1]), __m1 = (Y_f[0]); | ||
1229 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[1]), | ||
1230 | + "r" (Y_f | ||
1231 | + [0])); | ||
1232 | + (_c_f0) = __m0 * __m1; | ||
1233 | + } | ||
1234 | + while (0); | ||
1235 | + do | ||
1236 | + { | ||
1237 | + USItype __m0 = (X_f[1]), __m1 = (Y_f[1]); | ||
1238 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[1]), | ||
1239 | + "r" (Y_f | ||
1240 | + [1])); | ||
1241 | + (_d_f0) = __m0 * __m1; | ||
1242 | + } | ||
1243 | + while (0); | ||
1244 | + do | ||
1245 | + { | ||
1246 | + USItype __m0 = (X_f[0]), __m1 = (Y_f[2]); | ||
1247 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[0]), | ||
1248 | + "r" (Y_f | ||
1249 | + [2])); | ||
1250 | + (_e_f0) = __m0 * __m1; | ||
1251 | + } | ||
1252 | + while (0); | ||
1253 | + do | ||
1254 | + { | ||
1255 | + USItype __m0 = (X_f[2]), __m1 = (Y_f[0]); | ||
1256 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_f_f1):"%r" (X_f[2]), | ||
1257 | + "r" (Y_f | ||
1258 | + [0])); | ||
1259 | + (_f_f0) = __m0 * __m1; | ||
1260 | + } | ||
1261 | + while (0); | ||
1262 | + do | ||
1263 | + { | ||
1264 | + unsigned long _c1, _c2; | ||
1265 | + (_z_f[1]) = _b_f0 + (_z_f[1]); | ||
1266 | + _c1 = (_z_f[1]) < _b_f0; | ||
1267 | + (_z_f[2]) = _b_f1 + 0; | ||
1268 | + _c2 = (_z_f[2]) < _b_f1; | ||
1269 | + (_z_f[2]) += _c1; | ||
1270 | + _c2 |= (_z_f[2]) < _c1; | ||
1271 | + (_z_f[3]) = 0 + 0 + _c2; | ||
1272 | + } | ||
1273 | + while (0); | ||
1274 | + do | ||
1275 | + { | ||
1276 | + unsigned long _c1, _c2; | ||
1277 | + (_z_f[1]) = _c_f0 + (_z_f[1]); | ||
1278 | + _c1 = (_z_f[1]) < _c_f0; | ||
1279 | + (_z_f[2]) = _c_f1 + (_z_f[2]); | ||
1280 | + _c2 = (_z_f[2]) < _c_f1; | ||
1281 | + (_z_f[2]) += _c1; | ||
1282 | + _c2 |= (_z_f[2]) < _c1; | ||
1283 | + (_z_f[3]) = 0 + (_z_f[3]) + _c2; | ||
1284 | + } | ||
1285 | + while (0); | ||
1286 | + do | ||
1287 | + { | ||
1288 | + unsigned long _c1, _c2; | ||
1289 | + (_z_f[2]) = _d_f0 + (_z_f[2]); | ||
1290 | + _c1 = (_z_f[2]) < _d_f0; | ||
1291 | + (_z_f[3]) = _d_f1 + (_z_f[3]); | ||
1292 | + _c2 = (_z_f[3]) < _d_f1; | ||
1293 | + (_z_f[3]) += _c1; | ||
1294 | + _c2 |= (_z_f[3]) < _c1; | ||
1295 | + (_z_f[4]) = 0 + 0 + _c2; | ||
1296 | + } | ||
1297 | + while (0); | ||
1298 | + do | ||
1299 | + { | ||
1300 | + unsigned long _c1, _c2; | ||
1301 | + (_z_f[2]) = _e_f0 + (_z_f[2]); | ||
1302 | + _c1 = (_z_f[2]) < _e_f0; | ||
1303 | + (_z_f[3]) = _e_f1 + (_z_f[3]); | ||
1304 | + _c2 = (_z_f[3]) < _e_f1; | ||
1305 | + (_z_f[3]) += _c1; | ||
1306 | + _c2 |= (_z_f[3]) < _c1; | ||
1307 | + (_z_f[4]) = 0 + (_z_f[4]) + _c2; | ||
1308 | + } | ||
1309 | + while (0); | ||
1310 | + do | ||
1311 | + { | ||
1312 | + unsigned long _c1, _c2; | ||
1313 | + (_z_f[2]) = _f_f0 + (_z_f[2]); | ||
1314 | + _c1 = (_z_f[2]) < _f_f0; | ||
1315 | + (_z_f[3]) = _f_f1 + (_z_f[3]); | ||
1316 | + _c2 = (_z_f[3]) < _f_f1; | ||
1317 | + (_z_f[3]) += _c1; | ||
1318 | + _c2 |= (_z_f[3]) < _c1; | ||
1319 | + (_z_f[4]) = 0 + (_z_f[4]) + _c2; | ||
1320 | + } | ||
1321 | + while (0); | ||
1322 | + do | ||
1323 | + { | ||
1324 | + USItype __m0 = (X_f[0]), __m1 = (Y_f[3]); | ||
1325 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[0]), | ||
1326 | + "r" (Y_f | ||
1327 | + [3])); | ||
1328 | + (_b_f0) = __m0 * __m1; | ||
1329 | + } | ||
1330 | + while (0); | ||
1331 | + do | ||
1332 | + { | ||
1333 | + USItype __m0 = (X_f[3]), __m1 = (Y_f[0]); | ||
1334 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[3]), | ||
1335 | + "r" (Y_f | ||
1336 | + [0])); | ||
1337 | + (_c_f0) = __m0 * __m1; | ||
1338 | + } | ||
1339 | + while (0); | ||
1340 | + do | ||
1341 | + { | ||
1342 | + USItype __m0 = (X_f[1]), __m1 = (Y_f[2]); | ||
1343 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[1]), | ||
1344 | + "r" (Y_f | ||
1345 | + [2])); | ||
1346 | + (_d_f0) = __m0 * __m1; | ||
1347 | + } | ||
1348 | + while (0); | ||
1349 | + do | ||
1350 | + { | ||
1351 | + USItype __m0 = (X_f[2]), __m1 = (Y_f[1]); | ||
1352 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[2]), | ||
1353 | + "r" (Y_f | ||
1354 | + [1])); | ||
1355 | + (_e_f0) = __m0 * __m1; | ||
1356 | + } | ||
1357 | + while (0); | ||
1358 | + do | ||
1359 | + { | ||
1360 | + unsigned long _c1, _c2; | ||
1361 | + (_z_f[3]) = _b_f0 + (_z_f[3]); | ||
1362 | + _c1 = (_z_f[3]) < _b_f0; | ||
1363 | + (_z_f[4]) = _b_f1 + (_z_f[4]); | ||
1364 | + _c2 = (_z_f[4]) < _b_f1; | ||
1365 | + (_z_f[4]) += _c1; | ||
1366 | + _c2 |= (_z_f[4]) < _c1; | ||
1367 | + (_z_f[5]) = 0 + 0 + _c2; | ||
1368 | + } | ||
1369 | + while (0); | ||
1370 | + do | ||
1371 | + { | ||
1372 | + unsigned long _c1, _c2; | ||
1373 | + (_z_f[3]) = _c_f0 + (_z_f[3]); | ||
1374 | + _c1 = (_z_f[3]) < _c_f0; | ||
1375 | + (_z_f[4]) = _c_f1 + (_z_f[4]); | ||
1376 | + _c2 = (_z_f[4]) < _c_f1; | ||
1377 | + (_z_f[4]) += _c1; | ||
1378 | + _c2 |= (_z_f[4]) < _c1; | ||
1379 | + (_z_f[5]) = 0 + (_z_f[5]) + _c2; | ||
1380 | + } | ||
1381 | + while (0); | ||
1382 | + do | ||
1383 | + { | ||
1384 | + unsigned long _c1, _c2; | ||
1385 | + (_z_f[3]) = _d_f0 + (_z_f[3]); | ||
1386 | + _c1 = (_z_f[3]) < _d_f0; | ||
1387 | + (_z_f[4]) = _d_f1 + (_z_f[4]); | ||
1388 | + _c2 = (_z_f[4]) < _d_f1; | ||
1389 | + (_z_f[4]) += _c1; | ||
1390 | + _c2 |= (_z_f[4]) < _c1; | ||
1391 | + (_z_f[5]) = 0 + (_z_f[5]) + _c2; | ||
1392 | + } | ||
1393 | + while (0); | ||
1394 | + do | ||
1395 | + { | ||
1396 | + unsigned long _c1, _c2; | ||
1397 | + (_z_f[3]) = _e_f0 + (_z_f[3]); | ||
1398 | + _c1 = (_z_f[3]) < _e_f0; | ||
1399 | + (_z_f[4]) = _e_f1 + (_z_f[4]); | ||
1400 | + _c2 = (_z_f[4]) < _e_f1; | ||
1401 | + (_z_f[4]) += _c1; | ||
1402 | + _c2 |= (_z_f[4]) < _c1; | ||
1403 | + (_z_f[5]) = 0 + (_z_f[5]) + _c2; | ||
1404 | + } | ||
1405 | + while (0); | ||
1406 | + do | ||
1407 | + { | ||
1408 | + USItype __m0 = (X_f[2]), __m1 = (Y_f[2]); | ||
1409 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[2]), | ||
1410 | + "r" (Y_f | ||
1411 | + [2])); | ||
1412 | + (_b_f0) = __m0 * __m1; | ||
1413 | + } | ||
1414 | + while (0); | ||
1415 | + do | ||
1416 | + { | ||
1417 | + USItype __m0 = (X_f[1]), __m1 = (Y_f[3]); | ||
1418 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[1]), | ||
1419 | + "r" (Y_f | ||
1420 | + [3])); | ||
1421 | + (_c_f0) = __m0 * __m1; | ||
1422 | + } | ||
1423 | + while (0); | ||
1424 | + do | ||
1425 | + { | ||
1426 | + USItype __m0 = (X_f[3]), __m1 = (Y_f[1]); | ||
1427 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[3]), | ||
1428 | + "r" (Y_f | ||
1429 | + [1])); | ||
1430 | + (_d_f0) = __m0 * __m1; | ||
1431 | + } | ||
1432 | + while (0); | ||
1433 | + do | ||
1434 | + { | ||
1435 | + USItype __m0 = (X_f[2]), __m1 = (Y_f[3]); | ||
1436 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[2]), | ||
1437 | + "r" (Y_f | ||
1438 | + [3])); | ||
1439 | + (_e_f0) = __m0 * __m1; | ||
1440 | + } | ||
1441 | + while (0); | ||
1442 | + do | ||
1443 | + { | ||
1444 | + USItype __m0 = (X_f[3]), __m1 = (Y_f[2]); | ||
1445 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_f_f1):"%r" (X_f[3]), | ||
1446 | + "r" (Y_f | ||
1447 | + [2])); | ||
1448 | + (_f_f0) = __m0 * __m1; | ||
1449 | + } | ||
1450 | + while (0); | ||
1451 | + do | ||
1452 | + { | ||
1453 | + unsigned long _c1, _c2; | ||
1454 | + (_z_f[4]) = _b_f0 + (_z_f[4]); | ||
1455 | + _c1 = (_z_f[4]) < _b_f0; | ||
1456 | + (_z_f[5]) = _b_f1 + (_z_f[5]); | ||
1457 | + _c2 = (_z_f[5]) < _b_f1; | ||
1458 | + (_z_f[5]) += _c1; | ||
1459 | + _c2 |= (_z_f[5]) < _c1; | ||
1460 | + (_z_f[6]) = 0 + 0 + _c2; | ||
1461 | + } | ||
1462 | + while (0); | ||
1463 | + do | ||
1464 | + { | ||
1465 | + unsigned long _c1, _c2; | ||
1466 | + (_z_f[4]) = _c_f0 + (_z_f[4]); | ||
1467 | + _c1 = (_z_f[4]) < _c_f0; | ||
1468 | + (_z_f[5]) = _c_f1 + (_z_f[5]); | ||
1469 | + _c2 = (_z_f[5]) < _c_f1; | ||
1470 | + (_z_f[5]) += _c1; | ||
1471 | + _c2 |= (_z_f[5]) < _c1; | ||
1472 | + (_z_f[6]) = 0 + (_z_f[6]) + _c2; | ||
1473 | + } | ||
1474 | + while (0); | ||
1475 | + do | ||
1476 | + { | ||
1477 | + unsigned long _c1, _c2; | ||
1478 | + (_z_f[4]) = _d_f0 + (_z_f[4]); | ||
1479 | + _c1 = (_z_f[4]) < _d_f0; | ||
1480 | + (_z_f[5]) = _d_f1 + (_z_f[5]); | ||
1481 | + _c2 = (_z_f[5]) < _d_f1; | ||
1482 | + (_z_f[5]) += _c1; | ||
1483 | + _c2 |= (_z_f[5]) < _c1; | ||
1484 | + (_z_f[6]) = 0 + (_z_f[6]) + _c2; | ||
1485 | + } | ||
1486 | + while (0); | ||
1487 | + do | ||
1488 | + { | ||
1489 | + unsigned long _c1, _c2; | ||
1490 | + (_z_f[5]) = _e_f0 + (_z_f[5]); | ||
1491 | + _c1 = (_z_f[5]) < _e_f0; | ||
1492 | + (_z_f[6]) = _e_f1 + (_z_f[6]); | ||
1493 | + _c2 = (_z_f[6]) < _e_f1; | ||
1494 | + (_z_f[6]) += _c1; | ||
1495 | + _c2 |= (_z_f[6]) < _c1; | ||
1496 | + (_z_f[7]) = 0 + 0 + _c2; | ||
1497 | + } | ||
1498 | + while (0); | ||
1499 | + do | ||
1500 | + { | ||
1501 | + unsigned long _c1, _c2; | ||
1502 | + (_z_f[5]) = _f_f0 + (_z_f[5]); | ||
1503 | + _c1 = (_z_f[5]) < _f_f0; | ||
1504 | + (_z_f[6]) = _f_f1 + (_z_f[6]); | ||
1505 | + _c2 = (_z_f[6]) < _f_f1; | ||
1506 | + (_z_f[6]) += _c1; | ||
1507 | + _c2 |= (_z_f[6]) < _c1; | ||
1508 | + (_z_f[7]) = 0 + (_z_f[7]) + _c2; | ||
1509 | + } | ||
1510 | + while (0); | ||
1511 | + do | ||
1512 | + { | ||
1513 | + USItype __m0 = (X_f[3]), __m1 = (Y_f[3]); | ||
1514 | + __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[3]), | ||
1515 | + "r" (Y_f | ||
1516 | + [3])); | ||
1517 | + (_b_f0) = __m0 * __m1; | ||
1518 | + } | ||
1519 | + while (0); | ||
1520 | + do | ||
1521 | + { | ||
1522 | + if (__builtin_constant_p ((_z_f[7])) && ((_z_f[7])) == 0) | ||
1523 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"r" (_b_f1), "%r" (_b_f0), | ||
1524 | + "rI" ((_z_f | ||
1525 | + [6]))); | ||
1526 | + else if (__builtin_constant_p ((_z_f[7])) | ||
1527 | + && ((_z_f[7])) == ~(USItype) 0) | ||
1528 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"r" (_b_f1), "%r" (_b_f0), | ||
1529 | + "rI" ((_z_f | ||
1530 | + [6]))); | ||
1531 | + else | ||
1532 | + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"%r" (_b_f1), "r" ((_z_f[7])), "%r" (_b_f0), | ||
1533 | + "rI" ((_z_f | ||
1534 | + [6]))); | ||
1535 | + } | ||
1536 | + while (0); | ||
1537 | + do | ||
1538 | + { | ||
1539 | + long _up, _down, _skip, _i; | ||
1540 | + unsigned long _s; | ||
1541 | + _skip = ((3 + 113) - 1) / 32; | ||
1542 | + _down = ((3 + 113) - 1) % 32; | ||
1543 | + _up = 32 - _down; | ||
1544 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
1545 | + _s |= _z_f[_i]; | ||
1546 | + if (!_down) | ||
1547 | + for (_i = 0; _i <= 7 - _skip; ++_i) | ||
1548 | + _z_f[_i] = _z_f[_i + _skip]; | ||
1549 | + else | ||
1550 | + { | ||
1551 | + _s |= _z_f[_i] << _up; | ||
1552 | + for (_i = 0; _i < 7 - _skip; ++_i) | ||
1553 | + _z_f[_i] = | ||
1554 | + _z_f[_i + _skip] >> _down | _z_f[_i + _skip + | ||
1555 | + 1] << _up; | ||
1556 | + _z_f[_i++] = _z_f[7] >> _down; | ||
1557 | + } | ||
1558 | + for (; _i < 8; ++_i) | ||
1559 | + _z_f[_i] = 0; | ||
1560 | + _z_f[0] |= (_s != 0); | ||
1561 | + } | ||
1562 | + while (0); | ||
1563 | + (U_f[3] = (_z_f[3]), U_f[2] = (_z_f[2]), U_f[1] = | ||
1564 | + (_z_f[1]), U_f[0] = (_z_f[0])); | ||
1565 | + } | ||
1566 | + while (0); | ||
1567 | + if (((U_f[3]) & ((unsigned long) 1 << ((3 + 113) % 32)))) | ||
1568 | + do | ||
1569 | + { | ||
1570 | + int _sticky; | ||
1571 | + do | ||
1572 | + { | ||
1573 | + long _up, _down, _skip, _i; | ||
1574 | + unsigned long _s; | ||
1575 | + _skip = (1) / 32; | ||
1576 | + _down = (1) % 32; | ||
1577 | + _up = 32 - _down; | ||
1578 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
1579 | + _s |= U_f[_i]; | ||
1580 | + if (!_down) | ||
1581 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
1582 | + U_f[_i] = U_f[_i + _skip]; | ||
1583 | + else | ||
1584 | + { | ||
1585 | + _s |= U_f[_i] << _up; | ||
1586 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
1587 | + U_f[_i] = | ||
1588 | + U_f[_i + _skip] >> _down | U_f[_i + _skip + | ||
1589 | + 1] << _up; | ||
1590 | + U_f[_i++] = U_f[3] >> _down; | ||
1591 | + } | ||
1592 | + for (; _i < 4; ++_i) | ||
1593 | + U_f[_i] = 0; | ||
1594 | + _sticky = (_s != 0); | ||
1595 | + } | ||
1596 | + while (0); | ||
1597 | + U_f[0] |= _sticky; | ||
1598 | + } | ||
1599 | + while (0); | ||
1600 | + else | ||
1601 | + U_e--; | ||
1602 | + break; | ||
1603 | + case (((3) << 2) | (3)): | ||
1604 | + do | ||
1605 | + { | ||
1606 | + if (((X_f[3]) & ((unsigned long) 1 << (113 - 2) % 32)) | ||
1607 | + && !((Y_f[3]) & ((unsigned long) 1 << (113 - 2) % 32))) | ||
1608 | + { | ||
1609 | + U_s = Y_s; | ||
1610 | + (U_f[0] = Y_f[0], U_f[1] = Y_f[1], U_f[2] = Y_f[2], U_f[3] = | ||
1611 | + Y_f[3]); | ||
1612 | + } | ||
1613 | + else | ||
1614 | + { | ||
1615 | + U_s = X_s; | ||
1616 | + (U_f[0] = X_f[0], U_f[1] = X_f[1], U_f[2] = X_f[2], U_f[3] = | ||
1617 | + X_f[3]); | ||
1618 | + } | ||
1619 | + U_c = 3; | ||
1620 | + } | ||
1621 | + while (0); | ||
1622 | + break; | ||
1623 | + case (((3) << 2) | (0)): | ||
1624 | + case (((3) << 2) | (2)): | ||
1625 | + case (((3) << 2) | (1)): | ||
1626 | + U_s = X_s; | ||
1627 | + case (((2) << 2) | (2)): | ||
1628 | + case (((2) << 2) | (0)): | ||
1629 | + case (((1) << 2) | (0)): | ||
1630 | + case (((1) << 2) | (1)): | ||
1631 | + (U_f[0] = X_f[0], U_f[1] = X_f[1], U_f[2] = X_f[2], U_f[3] = | ||
1632 | + X_f[3]); | ||
1633 | + U_c = X_c; | ||
1634 | + break; | ||
1635 | + case (((0) << 2) | (3)): | ||
1636 | + case (((2) << 2) | (3)): | ||
1637 | + case (((1) << 2) | (3)): | ||
1638 | + U_s = Y_s; | ||
1639 | + case (((0) << 2) | (2)): | ||
1640 | + case (((0) << 2) | (1)): | ||
1641 | + (U_f[0] = Y_f[0], U_f[1] = Y_f[1], U_f[2] = Y_f[2], U_f[3] = | ||
1642 | + Y_f[3]); | ||
1643 | + U_c = Y_c; | ||
1644 | + break; | ||
1645 | + case (((2) << 2) | (1)): | ||
1646 | + case (((1) << 2) | (2)): | ||
1647 | + U_s = 0; | ||
1648 | + U_c = 3; | ||
1649 | + (U_f[3] = | ||
1650 | + ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1), U_f[2] = | ||
1651 | + -1, U_f[1] = -1, U_f[0] = -1); | ||
1652 | + _fex |= (0); | ||
1653 | + break; | ||
1654 | + default: | ||
1655 | + abort (); | ||
1656 | + } | ||
1657 | + } | ||
1658 | + while (0); | ||
1659 | + | ||
1660 | +/* FP_PACK_Q(u,U) */ | ||
1661 | + do | ||
1662 | + { | ||
1663 | + do | ||
1664 | + { | ||
1665 | + switch (U_c) | ||
1666 | + { | ||
1667 | + case 0: | ||
1668 | + U_e += 16383; | ||
1669 | + if (U_e > 0) | ||
1670 | + { | ||
1671 | + do | ||
1672 | + { | ||
1673 | + if ((U_f[0]) & 7) | ||
1674 | + _fex |= (0); | ||
1675 | + switch (0) | ||
1676 | + { | ||
1677 | + case 0: | ||
1678 | + do | ||
1679 | + { | ||
1680 | + if (((U_f[0]) & 15) != ((unsigned long) 1 << 2)) | ||
1681 | + do | ||
1682 | + { | ||
1683 | + unsigned long _t; | ||
1684 | + _t = | ||
1685 | + ((U_f[0] += | ||
1686 | + ((unsigned long) 1 << 2)) < | ||
1687 | + ((unsigned long) 1 << 2)); | ||
1688 | + U_f[1] += _t; | ||
1689 | + _t = (U_f[1] < _t); | ||
1690 | + U_f[2] += _t; | ||
1691 | + _t = (U_f[2] < _t); | ||
1692 | + U_f[3] += _t; | ||
1693 | + } | ||
1694 | + while (0); | ||
1695 | + } | ||
1696 | + while (0); | ||
1697 | + break; | ||
1698 | + case 1: | ||
1699 | + (void) 0; | ||
1700 | + break; | ||
1701 | + case 2: | ||
1702 | + do | ||
1703 | + { | ||
1704 | + if (!U_s && ((U_f[0]) & 7)) | ||
1705 | + do | ||
1706 | + { | ||
1707 | + unsigned long _t; | ||
1708 | + _t = | ||
1709 | + ((U_f[0] += | ||
1710 | + ((unsigned long) 1 << 3)) < | ||
1711 | + ((unsigned long) 1 << 3)); | ||
1712 | + U_f[1] += _t; | ||
1713 | + _t = (U_f[1] < _t); | ||
1714 | + U_f[2] += _t; | ||
1715 | + _t = (U_f[2] < _t); | ||
1716 | + U_f[3] += _t; | ||
1717 | + } | ||
1718 | + while (0); | ||
1719 | + } | ||
1720 | + while (0); | ||
1721 | + break; | ||
1722 | + case 3: | ||
1723 | + do | ||
1724 | + { | ||
1725 | + if (U_s && ((U_f[0]) & 7)) | ||
1726 | + do | ||
1727 | + { | ||
1728 | + unsigned long _t; | ||
1729 | + _t = | ||
1730 | + ((U_f[0] += | ||
1731 | + ((unsigned long) 1 << 3)) < | ||
1732 | + ((unsigned long) 1 << 3)); | ||
1733 | + U_f[1] += _t; | ||
1734 | + _t = (U_f[1] < _t); | ||
1735 | + U_f[2] += _t; | ||
1736 | + _t = (U_f[2] < _t); | ||
1737 | + U_f[3] += _t; | ||
1738 | + } | ||
1739 | + while (0); | ||
1740 | + } | ||
1741 | + while (0); | ||
1742 | + break; | ||
1743 | + } | ||
1744 | + } | ||
1745 | + while (0); | ||
1746 | + if (((U_f[3]) & ((unsigned long) 1 << ((3 + 113) % 32)))) | ||
1747 | + { | ||
1748 | + ((U_f[3]) &= ~((unsigned long) 1 << ((3 + 113) % 32))); | ||
1749 | + U_e++; | ||
1750 | + } | ||
1751 | + do | ||
1752 | + { | ||
1753 | + long _up, _down, _skip, _i; | ||
1754 | + _skip = (3) / 32; | ||
1755 | + _down = (3) % 32; | ||
1756 | + _up = 32 - _down; | ||
1757 | + if (!_down) | ||
1758 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
1759 | + U_f[_i] = U_f[_i + _skip]; | ||
1760 | + else | ||
1761 | + { | ||
1762 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
1763 | + U_f[_i] = | ||
1764 | + U_f[_i + _skip] >> _down | U_f[_i + _skip + | ||
1765 | + 1] << _up; | ||
1766 | + U_f[_i++] = U_f[3] >> _down; | ||
1767 | + } | ||
1768 | + for (; _i < 4; ++_i) | ||
1769 | + U_f[_i] = 0; | ||
1770 | + } | ||
1771 | + while (0); | ||
1772 | + if (U_e >= 32767) | ||
1773 | + { | ||
1774 | + switch (0) | ||
1775 | + { | ||
1776 | + case 0: | ||
1777 | + U_c = 2; | ||
1778 | + break; | ||
1779 | + case 2: | ||
1780 | + if (!U_s) | ||
1781 | + U_c = 2; | ||
1782 | + break; | ||
1783 | + case 3: | ||
1784 | + if (U_s) | ||
1785 | + U_c = 2; | ||
1786 | + break; | ||
1787 | + } | ||
1788 | + if (U_c == 2) | ||
1789 | + { | ||
1790 | + U_e = 32767; | ||
1791 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0); | ||
1792 | + } | ||
1793 | + else | ||
1794 | + { | ||
1795 | + U_e = 32767 - 1; | ||
1796 | + (U_f[3] = (~(signed long) 0), U_f[2] = | ||
1797 | + (~(signed long) 0), U_f[1] = | ||
1798 | + (~(signed long) 0), U_f[0] = (~(signed long) 0)); | ||
1799 | + } _fex |= (0); | ||
1800 | + _fex |= (0); | ||
1801 | + } | ||
1802 | + } | ||
1803 | + else | ||
1804 | + { | ||
1805 | + U_e = -U_e + 1; | ||
1806 | + if (U_e <= (3 + 113)) | ||
1807 | + { | ||
1808 | + do | ||
1809 | + { | ||
1810 | + int _sticky; | ||
1811 | + do | ||
1812 | + { | ||
1813 | + long _up, _down, _skip, _i; | ||
1814 | + unsigned long _s; | ||
1815 | + _skip = (U_e) / 32; | ||
1816 | + _down = (U_e) % 32; | ||
1817 | + _up = 32 - _down; | ||
1818 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
1819 | + _s |= U_f[_i]; | ||
1820 | + if (!_down) | ||
1821 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
1822 | + U_f[_i] = U_f[_i + _skip]; | ||
1823 | + else | ||
1824 | + { | ||
1825 | + _s |= U_f[_i] << _up; | ||
1826 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
1827 | + U_f[_i] = | ||
1828 | + U_f[_i + _skip] >> _down | U_f[_i + | ||
1829 | + _skip + | ||
1830 | + 1] << | ||
1831 | + _up; | ||
1832 | + U_f[_i++] = U_f[3] >> _down; | ||
1833 | + } | ||
1834 | + for (; _i < 4; ++_i) | ||
1835 | + U_f[_i] = 0; | ||
1836 | + _sticky = (_s != 0); | ||
1837 | + } | ||
1838 | + while (0); | ||
1839 | + U_f[0] |= _sticky; | ||
1840 | + } | ||
1841 | + while (0); | ||
1842 | + do | ||
1843 | + { | ||
1844 | + if ((U_f[0]) & 7) | ||
1845 | + _fex |= (0); | ||
1846 | + switch (0) | ||
1847 | + { | ||
1848 | + case 0: | ||
1849 | + do | ||
1850 | + { | ||
1851 | + if (((U_f[0]) & 15) != | ||
1852 | + ((unsigned long) 1 << 2)) | ||
1853 | + do | ||
1854 | + { | ||
1855 | + unsigned long _t; | ||
1856 | + _t = | ||
1857 | + ((U_f[0] += | ||
1858 | + ((unsigned long) 1 << 2)) < | ||
1859 | + ((unsigned long) 1 << 2)); | ||
1860 | + U_f[1] += _t; | ||
1861 | + _t = (U_f[1] < _t); | ||
1862 | + U_f[2] += _t; | ||
1863 | + _t = (U_f[2] < _t); | ||
1864 | + U_f[3] += _t; | ||
1865 | + } | ||
1866 | + while (0); | ||
1867 | + } | ||
1868 | + while (0); | ||
1869 | + break; | ||
1870 | + case 1: | ||
1871 | + (void) 0; | ||
1872 | + break; | ||
1873 | + case 2: | ||
1874 | + do | ||
1875 | + { | ||
1876 | + if (!U_s && ((U_f[0]) & 7)) | ||
1877 | + do | ||
1878 | + { | ||
1879 | + unsigned long _t; | ||
1880 | + _t = | ||
1881 | + ((U_f[0] += | ||
1882 | + ((unsigned long) 1 << 3)) < | ||
1883 | + ((unsigned long) 1 << 3)); | ||
1884 | + U_f[1] += _t; | ||
1885 | + _t = (U_f[1] < _t); | ||
1886 | + U_f[2] += _t; | ||
1887 | + _t = (U_f[2] < _t); | ||
1888 | + U_f[3] += _t; | ||
1889 | + } | ||
1890 | + while (0); | ||
1891 | + } | ||
1892 | + while (0); | ||
1893 | + break; | ||
1894 | + case 3: | ||
1895 | + do | ||
1896 | + { | ||
1897 | + if (U_s && ((U_f[0]) & 7)) | ||
1898 | + do | ||
1899 | + { | ||
1900 | + unsigned long _t; | ||
1901 | + _t = | ||
1902 | + ((U_f[0] += | ||
1903 | + ((unsigned long) 1 << 3)) < | ||
1904 | + ((unsigned long) 1 << 3)); | ||
1905 | + U_f[1] += _t; | ||
1906 | + _t = (U_f[1] < _t); | ||
1907 | + U_f[2] += _t; | ||
1908 | + _t = (U_f[2] < _t); | ||
1909 | + U_f[3] += _t; | ||
1910 | + } | ||
1911 | + while (0); | ||
1912 | + } | ||
1913 | + while (0); | ||
1914 | + break; | ||
1915 | + } | ||
1916 | + } | ||
1917 | + while (0); | ||
1918 | + if ((U_f[3]) & | ||
1919 | + (((unsigned long) 1 << ((3 + 113) % 32)) >> 1)) | ||
1920 | + { | ||
1921 | + U_e = 1; | ||
1922 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0); | ||
1923 | + } | ||
1924 | + else | ||
1925 | + { | ||
1926 | + U_e = 0; | ||
1927 | + do | ||
1928 | + { | ||
1929 | + long _up, _down, _skip, _i; | ||
1930 | + _skip = (3) / 32; | ||
1931 | + _down = (3) % 32; | ||
1932 | + _up = 32 - _down; | ||
1933 | + if (!_down) | ||
1934 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
1935 | + U_f[_i] = U_f[_i + _skip]; | ||
1936 | + else | ||
1937 | + { | ||
1938 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
1939 | + U_f[_i] = | ||
1940 | + U_f[_i + _skip] >> _down | U_f[_i + | ||
1941 | + _skip + | ||
1942 | + 1] << | ||
1943 | + _up; | ||
1944 | + U_f[_i++] = U_f[3] >> _down; | ||
1945 | + } | ||
1946 | + for (; _i < 4; ++_i) | ||
1947 | + U_f[_i] = 0; | ||
1948 | + } | ||
1949 | + while (0); | ||
1950 | + _fex |= (0); | ||
1951 | + } | ||
1952 | + } | ||
1953 | + else | ||
1954 | + { | ||
1955 | + U_e = 0; | ||
1956 | + if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
1957 | + { | ||
1958 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1); | ||
1959 | + do | ||
1960 | + { | ||
1961 | + if ((U_f[0]) & 7) | ||
1962 | + _fex |= (0); | ||
1963 | + switch (0) | ||
1964 | + { | ||
1965 | + case 0: | ||
1966 | + do | ||
1967 | + { | ||
1968 | + if (((U_f[0]) & 15) != | ||
1969 | + ((unsigned long) 1 << 2)) | ||
1970 | + do | ||
1971 | + { | ||
1972 | + unsigned long _t; | ||
1973 | + _t = | ||
1974 | + ((U_f[0] += | ||
1975 | + ((unsigned long) 1 << 2)) < | ||
1976 | + ((unsigned long) 1 << 2)); | ||
1977 | + U_f[1] += _t; | ||
1978 | + _t = (U_f[1] < _t); | ||
1979 | + U_f[2] += _t; | ||
1980 | + _t = (U_f[2] < _t); | ||
1981 | + U_f[3] += _t; | ||
1982 | + } | ||
1983 | + while (0); | ||
1984 | + } | ||
1985 | + while (0); | ||
1986 | + break; | ||
1987 | + case 1: | ||
1988 | + (void) 0; | ||
1989 | + break; | ||
1990 | + case 2: | ||
1991 | + do | ||
1992 | + { | ||
1993 | + if (!U_s && ((U_f[0]) & 7)) | ||
1994 | + do | ||
1995 | + { | ||
1996 | + unsigned long _t; | ||
1997 | + _t = | ||
1998 | + ((U_f[0] += | ||
1999 | + ((unsigned long) 1 << 3)) < | ||
2000 | + ((unsigned long) 1 << 3)); | ||
2001 | + U_f[1] += _t; | ||
2002 | + _t = (U_f[1] < _t); | ||
2003 | + U_f[2] += _t; | ||
2004 | + _t = (U_f[2] < _t); | ||
2005 | + U_f[3] += _t; | ||
2006 | + } | ||
2007 | + while (0); | ||
2008 | + } | ||
2009 | + while (0); | ||
2010 | + break; | ||
2011 | + case 3: | ||
2012 | + do | ||
2013 | + { | ||
2014 | + if (U_s && ((U_f[0]) & 7)) | ||
2015 | + do | ||
2016 | + { | ||
2017 | + unsigned long _t; | ||
2018 | + _t = | ||
2019 | + ((U_f[0] += | ||
2020 | + ((unsigned long) 1 << 3)) < | ||
2021 | + ((unsigned long) 1 << 3)); | ||
2022 | + U_f[1] += _t; | ||
2023 | + _t = (U_f[1] < _t); | ||
2024 | + U_f[2] += _t; | ||
2025 | + _t = (U_f[2] < _t); | ||
2026 | + U_f[3] += _t; | ||
2027 | + } | ||
2028 | + while (0); | ||
2029 | + } | ||
2030 | + while (0); | ||
2031 | + break; | ||
2032 | + } | ||
2033 | + } | ||
2034 | + while (0); | ||
2035 | + (U_f[0]) >>= (3); | ||
2036 | + } | ||
2037 | + _fex |= (0); | ||
2038 | + } | ||
2039 | + } | ||
2040 | + break; | ||
2041 | + case 1: | ||
2042 | + U_e = 0; | ||
2043 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0); | ||
2044 | + break; | ||
2045 | + case 2: | ||
2046 | + U_e = 32767; | ||
2047 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0); | ||
2048 | + break; | ||
2049 | + case 3: | ||
2050 | + U_e = 32767; | ||
2051 | + if (!1) | ||
2052 | + { | ||
2053 | + (U_f[3] = | ||
2054 | + ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1), | ||
2055 | + U_f[2] = -1, U_f[1] = -1, U_f[0] = -1); | ||
2056 | + U_s = 0; | ||
2057 | + } | ||
2058 | + else | ||
2059 | + (U_f[3]) |= ((unsigned long) 1 << (113 - 2) % 32); | ||
2060 | + break; | ||
2061 | + } | ||
2062 | + } | ||
2063 | + while (0); | ||
2064 | + do | ||
2065 | + { | ||
2066 | + union _FP_UNION_Q _flo; | ||
2067 | + _flo.bits.frac0 = U_f[0]; | ||
2068 | + _flo.bits.frac1 = U_f[1]; | ||
2069 | + _flo.bits.frac2 = U_f[2]; | ||
2070 | + _flo.bits.frac3 = U_f[3]; | ||
2071 | + _flo.bits.exp = U_e; | ||
2072 | + _flo.bits.sign = U_s; | ||
2073 | + (u) = _flo.flt; | ||
2074 | + } | ||
2075 | + while (0); | ||
2076 | + } | ||
2077 | + while (0); | ||
2078 | + | ||
2079 | +/* FP_HANDLE_EXCEPTIONS */ | ||
2080 | + do | ||
2081 | + { | ||
2082 | + } | ||
2083 | + while (0); | ||
2084 | + | ||
2085 | + /* Subtract. */ | ||
2086 | +/* FP_INIT_ROUNDMODE */ | ||
2087 | + do | ||
2088 | + { | ||
2089 | + } | ||
2090 | + while (0); | ||
2091 | + | ||
2092 | +/* FP_UNPACK_SEMIRAW_Q(U,u) */ | ||
2093 | + do | ||
2094 | + { | ||
2095 | + do | ||
2096 | + { | ||
2097 | + union _FP_UNION_Q _flo; | ||
2098 | + _flo.flt = (u); | ||
2099 | + U_f[0] = _flo.bits.frac0; | ||
2100 | + U_f[1] = _flo.bits.frac1; | ||
2101 | + U_f[2] = _flo.bits.frac2; | ||
2102 | + U_f[3] = _flo.bits.frac3; | ||
2103 | + U_e = _flo.bits.exp; | ||
2104 | + U_s = _flo.bits.sign; | ||
2105 | + } | ||
2106 | + while (0); | ||
2107 | + do | ||
2108 | + { | ||
2109 | + long _up, _down, _skip, _i; | ||
2110 | + _skip = (3) / 32; | ||
2111 | + _up = (3) % 32; | ||
2112 | + _down = 32 - _up; | ||
2113 | + if (!_up) | ||
2114 | + for (_i = 3; _i >= _skip; --_i) | ||
2115 | + U_f[_i] = U_f[_i - _skip]; | ||
2116 | + else | ||
2117 | + { | ||
2118 | + for (_i = 3; _i > _skip; --_i) | ||
2119 | + U_f[_i] = | ||
2120 | + U_f[_i - _skip] << _up | U_f[_i - _skip - 1] >> _down; | ||
2121 | + U_f[_i--] = U_f[0] << _up; | ||
2122 | + } | ||
2123 | + for (; _i >= 0; --_i) | ||
2124 | + U_f[_i] = 0; | ||
2125 | + } | ||
2126 | + while (0); | ||
2127 | + } | ||
2128 | + while (0); | ||
2129 | + | ||
2130 | +/* FP_UNPACK_SEMIRAW_Q(Z,z) */ | ||
2131 | + do | ||
2132 | + { | ||
2133 | + do | ||
2134 | + { | ||
2135 | + union _FP_UNION_Q _flo; | ||
2136 | + _flo.flt = (z); | ||
2137 | + Z_f[0] = _flo.bits.frac0; | ||
2138 | + Z_f[1] = _flo.bits.frac1; | ||
2139 | + Z_f[2] = _flo.bits.frac2; | ||
2140 | + Z_f[3] = _flo.bits.frac3; | ||
2141 | + Z_e = _flo.bits.exp; | ||
2142 | + Z_s = _flo.bits.sign; | ||
2143 | + } | ||
2144 | + while (0); | ||
2145 | + do | ||
2146 | + { | ||
2147 | + long _up, _down, _skip, _i; | ||
2148 | + _skip = (3) / 32; | ||
2149 | + _up = (3) % 32; | ||
2150 | + _down = 32 - _up; | ||
2151 | + if (!_up) | ||
2152 | + for (_i = 3; _i >= _skip; --_i) | ||
2153 | + Z_f[_i] = Z_f[_i - _skip]; | ||
2154 | + else | ||
2155 | + { | ||
2156 | + for (_i = 3; _i > _skip; --_i) | ||
2157 | + Z_f[_i] = | ||
2158 | + Z_f[_i - _skip] << _up | Z_f[_i - _skip - 1] >> _down; | ||
2159 | + Z_f[_i--] = Z_f[0] << _up; | ||
2160 | + } | ||
2161 | + for (; _i >= 0; --_i) | ||
2162 | + Z_f[_i] = 0; | ||
2163 | + } | ||
2164 | + while (0); | ||
2165 | + } | ||
2166 | + while (0); | ||
2167 | + | ||
2168 | +/* FP_SUB_Q(V,U,Z) */ | ||
2169 | + do | ||
2170 | + { | ||
2171 | + if (!(Z_e == 32767 && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))) | ||
2172 | + Z_s ^= 1; | ||
2173 | + do | ||
2174 | + { | ||
2175 | + if (U_s == Z_s) | ||
2176 | + { | ||
2177 | + V_s = U_s; | ||
2178 | + int ediff = U_e - Z_e; | ||
2179 | + if (ediff > 0) | ||
2180 | + { | ||
2181 | + V_e = U_e; | ||
2182 | + if (Z_e == 0) | ||
2183 | + { | ||
2184 | + if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2185 | + { | ||
2186 | + do | ||
2187 | + { | ||
2188 | + if (U_e == 32767 | ||
2189 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == | ||
2190 | + 0) | ||
2191 | + && !((U_f[3]) & | ||
2192 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2193 | + 32))) | ||
2194 | + _fex |= (0); | ||
2195 | + } | ||
2196 | + while (0); | ||
2197 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2198 | + U_f[2], V_f[3] = U_f[3]); | ||
2199 | + goto add_done; | ||
2200 | + } | ||
2201 | + else | ||
2202 | + { | ||
2203 | + _fex |= (0); | ||
2204 | + ediff--; | ||
2205 | + if (ediff == 0) | ||
2206 | + { | ||
2207 | + do | ||
2208 | + { | ||
2209 | + unsigned long _c1, _c2, _c3; | ||
2210 | + V_f[0] = U_f[0] + Z_f[0]; | ||
2211 | + _c1 = V_f[0] < U_f[0]; | ||
2212 | + V_f[1] = U_f[1] + Z_f[1]; | ||
2213 | + _c2 = V_f[1] < U_f[1]; | ||
2214 | + V_f[1] += _c1; | ||
2215 | + _c2 |= V_f[1] < _c1; | ||
2216 | + V_f[2] = U_f[2] + Z_f[2]; | ||
2217 | + _c3 = V_f[2] < U_f[2]; | ||
2218 | + V_f[2] += _c2; | ||
2219 | + _c3 |= V_f[2] < _c2; | ||
2220 | + V_f[3] = U_f[3] + Z_f[3] + _c3; | ||
2221 | + } | ||
2222 | + while (0); | ||
2223 | + goto add3; | ||
2224 | + } | ||
2225 | + if (U_e == 32767) | ||
2226 | + { | ||
2227 | + do | ||
2228 | + { | ||
2229 | + if (U_e == 32767 | ||
2230 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) | ||
2231 | + == 0) | ||
2232 | + && !((U_f[3]) & | ||
2233 | + ((unsigned long) 1 << (113 - 2 + 3) | ||
2234 | + % 32))) | ||
2235 | + _fex |= (0); | ||
2236 | + } | ||
2237 | + while (0); | ||
2238 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2239 | + U_f[2], V_f[3] = U_f[3]); | ||
2240 | + goto add_done; | ||
2241 | + } | ||
2242 | + goto add1; | ||
2243 | + } | ||
2244 | + } | ||
2245 | + else if (U_e == 32767) | ||
2246 | + { | ||
2247 | + do | ||
2248 | + { | ||
2249 | + if (U_e == 32767 | ||
2250 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0) | ||
2251 | + && !((U_f[3]) & | ||
2252 | + ((unsigned long) 1 << (113 - 2 + 3) % 32))) | ||
2253 | + _fex |= (0); | ||
2254 | + } | ||
2255 | + while (0); | ||
2256 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2257 | + U_f[2], V_f[3] = U_f[3]); | ||
2258 | + goto add_done; | ||
2259 | + } | ||
2260 | + (Z_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32); | ||
2261 | + add1:if (ediff <= (3 + 113)) | ||
2262 | + do | ||
2263 | + { | ||
2264 | + int _sticky; | ||
2265 | + do | ||
2266 | + { | ||
2267 | + long _up, _down, _skip, _i; | ||
2268 | + unsigned long _s; | ||
2269 | + _skip = (ediff) / 32; | ||
2270 | + _down = (ediff) % 32; | ||
2271 | + _up = 32 - _down; | ||
2272 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
2273 | + _s |= Z_f[_i]; | ||
2274 | + if (!_down) | ||
2275 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2276 | + Z_f[_i] = Z_f[_i + _skip]; | ||
2277 | + else | ||
2278 | + { | ||
2279 | + _s |= Z_f[_i] << _up; | ||
2280 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2281 | + Z_f[_i] = | ||
2282 | + Z_f[_i + _skip] >> _down | Z_f[_i + | ||
2283 | + _skip + | ||
2284 | + 1] << _up; | ||
2285 | + Z_f[_i++] = Z_f[3] >> _down; | ||
2286 | + } | ||
2287 | + for (; _i < 4; ++_i) | ||
2288 | + Z_f[_i] = 0; | ||
2289 | + _sticky = (_s != 0); | ||
2290 | + } | ||
2291 | + while (0); | ||
2292 | + Z_f[0] |= _sticky; | ||
2293 | + } | ||
2294 | + while (0); | ||
2295 | + else if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2296 | + (Z_f[3] = 0, Z_f[2] = 0, Z_f[1] = 0, Z_f[0] = 1); | ||
2297 | + do | ||
2298 | + { | ||
2299 | + unsigned long _c1, _c2, _c3; | ||
2300 | + V_f[0] = U_f[0] + Z_f[0]; | ||
2301 | + _c1 = V_f[0] < U_f[0]; | ||
2302 | + V_f[1] = U_f[1] + Z_f[1]; | ||
2303 | + _c2 = V_f[1] < U_f[1]; | ||
2304 | + V_f[1] += _c1; | ||
2305 | + _c2 |= V_f[1] < _c1; | ||
2306 | + V_f[2] = U_f[2] + Z_f[2]; | ||
2307 | + _c3 = V_f[2] < U_f[2]; | ||
2308 | + V_f[2] += _c2; | ||
2309 | + _c3 |= V_f[2] < _c2; | ||
2310 | + V_f[3] = U_f[3] + Z_f[3] + _c3; | ||
2311 | + } | ||
2312 | + while (0); | ||
2313 | + } | ||
2314 | + else if (ediff < 0) | ||
2315 | + { | ||
2316 | + ediff = -ediff; | ||
2317 | + V_e = Z_e; | ||
2318 | + if (U_e == 0) | ||
2319 | + { | ||
2320 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
2321 | + { | ||
2322 | + do | ||
2323 | + { | ||
2324 | + if (Z_e == 32767 | ||
2325 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == | ||
2326 | + 0) | ||
2327 | + && !((Z_f[3]) & | ||
2328 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2329 | + 32))) | ||
2330 | + _fex |= (0); | ||
2331 | + } | ||
2332 | + while (0); | ||
2333 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2334 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2335 | + goto add_done; | ||
2336 | + } | ||
2337 | + else | ||
2338 | + { | ||
2339 | + _fex |= (0); | ||
2340 | + ediff--; | ||
2341 | + if (ediff == 0) | ||
2342 | + { | ||
2343 | + do | ||
2344 | + { | ||
2345 | + unsigned long _c1, _c2, _c3; | ||
2346 | + V_f[0] = Z_f[0] + U_f[0]; | ||
2347 | + _c1 = V_f[0] < Z_f[0]; | ||
2348 | + V_f[1] = Z_f[1] + U_f[1]; | ||
2349 | + _c2 = V_f[1] < Z_f[1]; | ||
2350 | + V_f[1] += _c1; | ||
2351 | + _c2 |= V_f[1] < _c1; | ||
2352 | + V_f[2] = Z_f[2] + U_f[2]; | ||
2353 | + _c3 = V_f[2] < Z_f[2]; | ||
2354 | + V_f[2] += _c2; | ||
2355 | + _c3 |= V_f[2] < _c2; | ||
2356 | + V_f[3] = Z_f[3] + U_f[3] + _c3; | ||
2357 | + } | ||
2358 | + while (0); | ||
2359 | + goto add3; | ||
2360 | + } | ||
2361 | + if (Z_e == 32767) | ||
2362 | + { | ||
2363 | + do | ||
2364 | + { | ||
2365 | + if (Z_e == 32767 | ||
2366 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) | ||
2367 | + == 0) | ||
2368 | + && !((Z_f[3]) & | ||
2369 | + ((unsigned long) 1 << (113 - 2 + 3) | ||
2370 | + % 32))) | ||
2371 | + _fex |= (0); | ||
2372 | + } | ||
2373 | + while (0); | ||
2374 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2375 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2376 | + goto add_done; | ||
2377 | + } | ||
2378 | + goto add2; | ||
2379 | + } | ||
2380 | + } | ||
2381 | + else if (Z_e == 32767) | ||
2382 | + { | ||
2383 | + do | ||
2384 | + { | ||
2385 | + if (Z_e == 32767 | ||
2386 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0) | ||
2387 | + && !((Z_f[3]) & | ||
2388 | + ((unsigned long) 1 << (113 - 2 + 3) % 32))) | ||
2389 | + _fex |= (0); | ||
2390 | + } | ||
2391 | + while (0); | ||
2392 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2393 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2394 | + goto add_done; | ||
2395 | + } | ||
2396 | + (U_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32); | ||
2397 | + add2:if (ediff <= (3 + 113)) | ||
2398 | + do | ||
2399 | + { | ||
2400 | + int _sticky; | ||
2401 | + do | ||
2402 | + { | ||
2403 | + long _up, _down, _skip, _i; | ||
2404 | + unsigned long _s; | ||
2405 | + _skip = (ediff) / 32; | ||
2406 | + _down = (ediff) % 32; | ||
2407 | + _up = 32 - _down; | ||
2408 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
2409 | + _s |= U_f[_i]; | ||
2410 | + if (!_down) | ||
2411 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2412 | + U_f[_i] = U_f[_i + _skip]; | ||
2413 | + else | ||
2414 | + { | ||
2415 | + _s |= U_f[_i] << _up; | ||
2416 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2417 | + U_f[_i] = | ||
2418 | + U_f[_i + _skip] >> _down | U_f[_i + | ||
2419 | + _skip + | ||
2420 | + 1] << _up; | ||
2421 | + U_f[_i++] = U_f[3] >> _down; | ||
2422 | + } | ||
2423 | + for (; _i < 4; ++_i) | ||
2424 | + U_f[_i] = 0; | ||
2425 | + _sticky = (_s != 0); | ||
2426 | + } | ||
2427 | + while (0); | ||
2428 | + U_f[0] |= _sticky; | ||
2429 | + } | ||
2430 | + while (0); | ||
2431 | + else if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
2432 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1); | ||
2433 | + do | ||
2434 | + { | ||
2435 | + unsigned long _c1, _c2, _c3; | ||
2436 | + V_f[0] = Z_f[0] + U_f[0]; | ||
2437 | + _c1 = V_f[0] < Z_f[0]; | ||
2438 | + V_f[1] = Z_f[1] + U_f[1]; | ||
2439 | + _c2 = V_f[1] < Z_f[1]; | ||
2440 | + V_f[1] += _c1; | ||
2441 | + _c2 |= V_f[1] < _c1; | ||
2442 | + V_f[2] = Z_f[2] + U_f[2]; | ||
2443 | + _c3 = V_f[2] < Z_f[2]; | ||
2444 | + V_f[2] += _c2; | ||
2445 | + _c3 |= V_f[2] < _c2; | ||
2446 | + V_f[3] = Z_f[3] + U_f[3] + _c3; | ||
2447 | + } | ||
2448 | + while (0); | ||
2449 | + } | ||
2450 | + else | ||
2451 | + { | ||
2452 | + if (!(((U_e + 1) & 32767) > 1)) | ||
2453 | + { | ||
2454 | + if (U_e == 0) | ||
2455 | + { | ||
2456 | + V_e = 0; | ||
2457 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
2458 | + { | ||
2459 | + if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2460 | + _fex |= (0); | ||
2461 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2462 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2463 | + goto add_done; | ||
2464 | + } | ||
2465 | + else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2466 | + { | ||
2467 | + _fex |= (0); | ||
2468 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2469 | + U_f[2], V_f[3] = U_f[3]); | ||
2470 | + goto add_done; | ||
2471 | + } | ||
2472 | + else | ||
2473 | + { | ||
2474 | + _fex |= (0); | ||
2475 | + do | ||
2476 | + { | ||
2477 | + unsigned long _c1, _c2, _c3; | ||
2478 | + V_f[0] = U_f[0] + Z_f[0]; | ||
2479 | + _c1 = V_f[0] < U_f[0]; | ||
2480 | + V_f[1] = U_f[1] + Z_f[1]; | ||
2481 | + _c2 = V_f[1] < U_f[1]; | ||
2482 | + V_f[1] += _c1; | ||
2483 | + _c2 |= V_f[1] < _c1; | ||
2484 | + V_f[2] = U_f[2] + Z_f[2]; | ||
2485 | + _c3 = V_f[2] < U_f[2]; | ||
2486 | + V_f[2] += _c2; | ||
2487 | + _c3 |= V_f[2] < _c2; | ||
2488 | + V_f[3] = U_f[3] + Z_f[3] + _c3; | ||
2489 | + } | ||
2490 | + while (0); | ||
2491 | + if ((V_f[3]) & | ||
2492 | + ((unsigned long) 1 << (113 - 1 + 3) % 32)) | ||
2493 | + { | ||
2494 | + (V_f[3]) &= | ||
2495 | + ~(unsigned long) ((unsigned long) 1 << | ||
2496 | + (113 - 1 + 3) % 32); | ||
2497 | + V_e = 1; | ||
2498 | + } | ||
2499 | + goto add_done; | ||
2500 | + } | ||
2501 | + } | ||
2502 | + else | ||
2503 | + { | ||
2504 | + do | ||
2505 | + { | ||
2506 | + if (U_e == 32767 | ||
2507 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == | ||
2508 | + 0) | ||
2509 | + && !((U_f[3]) & | ||
2510 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2511 | + 32))) | ||
2512 | + _fex |= (0); | ||
2513 | + } | ||
2514 | + while (0); | ||
2515 | + do | ||
2516 | + { | ||
2517 | + if (Z_e == 32767 | ||
2518 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == | ||
2519 | + 0) | ||
2520 | + && !((Z_f[3]) & | ||
2521 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2522 | + 32))) | ||
2523 | + _fex |= (0); | ||
2524 | + } | ||
2525 | + while (0); | ||
2526 | + V_e = 32767; | ||
2527 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
2528 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2529 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2530 | + else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2531 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2532 | + U_f[2], V_f[3] = U_f[3]); | ||
2533 | + else | ||
2534 | + do | ||
2535 | + { | ||
2536 | + do | ||
2537 | + { | ||
2538 | + long _up, _down, _skip, _i; | ||
2539 | + _skip = (3) / 32; | ||
2540 | + _down = (3) % 32; | ||
2541 | + _up = 32 - _down; | ||
2542 | + if (!_down) | ||
2543 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2544 | + U_f[_i] = U_f[_i + _skip]; | ||
2545 | + else | ||
2546 | + { | ||
2547 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2548 | + U_f[_i] = | ||
2549 | + U_f[_i + | ||
2550 | + _skip] >> _down | U_f[_i + | ||
2551 | + _skip + | ||
2552 | + 1] << | ||
2553 | + _up; | ||
2554 | + U_f[_i++] = U_f[3] >> _down; | ||
2555 | + } | ||
2556 | + for (; _i < 4; ++_i) | ||
2557 | + U_f[_i] = 0; | ||
2558 | + } | ||
2559 | + while (0); | ||
2560 | + do | ||
2561 | + { | ||
2562 | + long _up, _down, _skip, _i; | ||
2563 | + _skip = (3) / 32; | ||
2564 | + _down = (3) % 32; | ||
2565 | + _up = 32 - _down; | ||
2566 | + if (!_down) | ||
2567 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2568 | + Z_f[_i] = Z_f[_i + _skip]; | ||
2569 | + else | ||
2570 | + { | ||
2571 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2572 | + Z_f[_i] = | ||
2573 | + Z_f[_i + | ||
2574 | + _skip] >> _down | Z_f[_i + | ||
2575 | + _skip + | ||
2576 | + 1] << | ||
2577 | + _up; | ||
2578 | + Z_f[_i++] = Z_f[3] >> _down; | ||
2579 | + } | ||
2580 | + for (; _i < 4; ++_i) | ||
2581 | + Z_f[_i] = 0; | ||
2582 | + } | ||
2583 | + while (0); | ||
2584 | + do | ||
2585 | + { | ||
2586 | + if (((U_f[3]) & | ||
2587 | + ((unsigned long) 1 << (113 - 2) % | ||
2588 | + 32)) | ||
2589 | + && !((Z_f[3]) & | ||
2590 | + ((unsigned long) 1 << (113 - 2) % | ||
2591 | + 32))) | ||
2592 | + { | ||
2593 | + V_s = Z_s; | ||
2594 | + (V_f[0] = Z_f[0], V_f[1] = | ||
2595 | + Z_f[1], V_f[2] = Z_f[2], V_f[3] = | ||
2596 | + Z_f[3]); | ||
2597 | + } | ||
2598 | + else | ||
2599 | + { | ||
2600 | + V_s = U_s; | ||
2601 | + (V_f[0] = U_f[0], V_f[1] = | ||
2602 | + U_f[1], V_f[2] = U_f[2], V_f[3] = | ||
2603 | + U_f[3]); | ||
2604 | + } | ||
2605 | + V_c = 3; | ||
2606 | + } | ||
2607 | + while (0); | ||
2608 | + do | ||
2609 | + { | ||
2610 | + long _up, _down, _skip, _i; | ||
2611 | + _skip = (3) / 32; | ||
2612 | + _up = (3) % 32; | ||
2613 | + _down = 32 - _up; | ||
2614 | + if (!_up) | ||
2615 | + for (_i = 3; _i >= _skip; --_i) | ||
2616 | + V_f[_i] = V_f[_i - _skip]; | ||
2617 | + else | ||
2618 | + { | ||
2619 | + for (_i = 3; _i > _skip; --_i) | ||
2620 | + V_f[_i] = | ||
2621 | + V_f[_i - _skip] << _up | V_f[_i - | ||
2622 | + _skip | ||
2623 | + - | ||
2624 | + 1] >> | ||
2625 | + _down; | ||
2626 | + V_f[_i--] = V_f[0] << _up; | ||
2627 | + } | ||
2628 | + for (; _i >= 0; --_i) | ||
2629 | + V_f[_i] = 0; | ||
2630 | + } | ||
2631 | + while (0); | ||
2632 | + } | ||
2633 | + while (0); | ||
2634 | + goto add_done; | ||
2635 | + } | ||
2636 | + } | ||
2637 | + do | ||
2638 | + { | ||
2639 | + unsigned long _c1, _c2, _c3; | ||
2640 | + V_f[0] = U_f[0] + Z_f[0]; | ||
2641 | + _c1 = V_f[0] < U_f[0]; | ||
2642 | + V_f[1] = U_f[1] + Z_f[1]; | ||
2643 | + _c2 = V_f[1] < U_f[1]; | ||
2644 | + V_f[1] += _c1; | ||
2645 | + _c2 |= V_f[1] < _c1; | ||
2646 | + V_f[2] = U_f[2] + Z_f[2]; | ||
2647 | + _c3 = V_f[2] < U_f[2]; | ||
2648 | + V_f[2] += _c2; | ||
2649 | + _c3 |= V_f[2] < _c2; | ||
2650 | + V_f[3] = U_f[3] + Z_f[3] + _c3; | ||
2651 | + } | ||
2652 | + while (0); | ||
2653 | + V_e = U_e + 1; | ||
2654 | + do | ||
2655 | + { | ||
2656 | + int _sticky; | ||
2657 | + do | ||
2658 | + { | ||
2659 | + long _up, _down, _skip, _i; | ||
2660 | + unsigned long _s; | ||
2661 | + _skip = (1) / 32; | ||
2662 | + _down = (1) % 32; | ||
2663 | + _up = 32 - _down; | ||
2664 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
2665 | + _s |= V_f[_i]; | ||
2666 | + if (!_down) | ||
2667 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2668 | + V_f[_i] = V_f[_i + _skip]; | ||
2669 | + else | ||
2670 | + { | ||
2671 | + _s |= V_f[_i] << _up; | ||
2672 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2673 | + V_f[_i] = | ||
2674 | + V_f[_i + _skip] >> _down | V_f[_i + _skip + | ||
2675 | + 1] << _up; | ||
2676 | + V_f[_i++] = V_f[3] >> _down; | ||
2677 | + } | ||
2678 | + for (; _i < 4; ++_i) | ||
2679 | + V_f[_i] = 0; | ||
2680 | + _sticky = (_s != 0); | ||
2681 | + } | ||
2682 | + while (0); | ||
2683 | + V_f[0] |= _sticky; | ||
2684 | + } | ||
2685 | + while (0); | ||
2686 | + if (V_e == 32767) | ||
2687 | + do | ||
2688 | + { | ||
2689 | + if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s)) | ||
2690 | + { | ||
2691 | + V_e = 32767; | ||
2692 | + (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0); | ||
2693 | + } | ||
2694 | + else | ||
2695 | + { | ||
2696 | + V_e = 32767 - 1; | ||
2697 | + _fex |= (0); | ||
2698 | + _fex |= (0); | ||
2699 | + (V_f[3] = (~(signed long) 0), V_f[2] = | ||
2700 | + (~(signed long) 0), V_f[1] = | ||
2701 | + (~(signed long) 0), V_f[0] = (~(signed long) 0)); | ||
2702 | + } | ||
2703 | + } | ||
2704 | + while (0); | ||
2705 | + goto add_done; | ||
2706 | + } | ||
2707 | + add3:if ((V_f[3]) & | ||
2708 | + ((unsigned long) 1 << (113 - 1 + 3) % 32)) | ||
2709 | + { | ||
2710 | + (V_f[3]) &= | ||
2711 | + ~(unsigned long) ((unsigned long) 1 << (113 - 1 + 3) % | ||
2712 | + 32); | ||
2713 | + V_e++; | ||
2714 | + do | ||
2715 | + { | ||
2716 | + int _sticky; | ||
2717 | + do | ||
2718 | + { | ||
2719 | + long _up, _down, _skip, _i; | ||
2720 | + unsigned long _s; | ||
2721 | + _skip = (1) / 32; | ||
2722 | + _down = (1) % 32; | ||
2723 | + _up = 32 - _down; | ||
2724 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
2725 | + _s |= V_f[_i]; | ||
2726 | + if (!_down) | ||
2727 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2728 | + V_f[_i] = V_f[_i + _skip]; | ||
2729 | + else | ||
2730 | + { | ||
2731 | + _s |= V_f[_i] << _up; | ||
2732 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2733 | + V_f[_i] = | ||
2734 | + V_f[_i + _skip] >> _down | V_f[_i + _skip + | ||
2735 | + 1] << _up; | ||
2736 | + V_f[_i++] = V_f[3] >> _down; | ||
2737 | + } | ||
2738 | + for (; _i < 4; ++_i) | ||
2739 | + V_f[_i] = 0; | ||
2740 | + _sticky = (_s != 0); | ||
2741 | + } | ||
2742 | + while (0); | ||
2743 | + V_f[0] |= _sticky; | ||
2744 | + } | ||
2745 | + while (0); | ||
2746 | + if (V_e == 32767) | ||
2747 | + do | ||
2748 | + { | ||
2749 | + if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s)) | ||
2750 | + { | ||
2751 | + V_e = 32767; | ||
2752 | + (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0); | ||
2753 | + } | ||
2754 | + else | ||
2755 | + { | ||
2756 | + V_e = 32767 - 1; | ||
2757 | + _fex |= (0); | ||
2758 | + _fex |= (0); | ||
2759 | + (V_f[3] = (~(signed long) 0), V_f[2] = | ||
2760 | + (~(signed long) 0), V_f[1] = | ||
2761 | + (~(signed long) 0), V_f[0] = (~(signed long) 0)); | ||
2762 | + } | ||
2763 | + } | ||
2764 | + while (0); | ||
2765 | + } | ||
2766 | + add_done:; | ||
2767 | + } | ||
2768 | + else | ||
2769 | + { | ||
2770 | + int ediff = U_e - Z_e; | ||
2771 | + if (ediff > 0) | ||
2772 | + { | ||
2773 | + V_e = U_e; | ||
2774 | + V_s = U_s; | ||
2775 | + if (Z_e == 0) | ||
2776 | + { | ||
2777 | + if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2778 | + { | ||
2779 | + do | ||
2780 | + { | ||
2781 | + if (U_e == 32767 | ||
2782 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == | ||
2783 | + 0) | ||
2784 | + && !((U_f[3]) & | ||
2785 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2786 | + 32))) | ||
2787 | + _fex |= (0); | ||
2788 | + } | ||
2789 | + while (0); | ||
2790 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2791 | + U_f[2], V_f[3] = U_f[3]); | ||
2792 | + goto sub_done; | ||
2793 | + } | ||
2794 | + else | ||
2795 | + { | ||
2796 | + _fex |= (0); | ||
2797 | + ediff--; | ||
2798 | + if (ediff == 0) | ||
2799 | + { | ||
2800 | + do | ||
2801 | + { | ||
2802 | + unsigned long _c1, _c2, _c3; | ||
2803 | + V_f[0] = U_f[0] - Z_f[0]; | ||
2804 | + _c1 = V_f[0] > U_f[0]; | ||
2805 | + V_f[1] = U_f[1] - Z_f[1]; | ||
2806 | + _c2 = V_f[1] > U_f[1]; | ||
2807 | + V_f[1] -= _c1; | ||
2808 | + _c2 |= _c1 && (Z_f[1] == U_f[1]); | ||
2809 | + V_f[2] = U_f[2] - Z_f[2]; | ||
2810 | + _c3 = V_f[2] > U_f[2]; | ||
2811 | + V_f[2] -= _c2; | ||
2812 | + _c3 |= _c2 && (Z_f[2] == U_f[2]); | ||
2813 | + V_f[3] = U_f[3] - Z_f[3] - _c3; | ||
2814 | + } | ||
2815 | + while (0); | ||
2816 | + goto sub3; | ||
2817 | + } | ||
2818 | + if (U_e == 32767) | ||
2819 | + { | ||
2820 | + do | ||
2821 | + { | ||
2822 | + if (U_e == 32767 | ||
2823 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) | ||
2824 | + == 0) | ||
2825 | + && !((U_f[3]) & | ||
2826 | + ((unsigned long) 1 << (113 - 2 + 3) | ||
2827 | + % 32))) | ||
2828 | + _fex |= (0); | ||
2829 | + } | ||
2830 | + while (0); | ||
2831 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2832 | + U_f[2], V_f[3] = U_f[3]); | ||
2833 | + goto sub_done; | ||
2834 | + } | ||
2835 | + goto sub1; | ||
2836 | + } | ||
2837 | + } | ||
2838 | + else if (U_e == 32767) | ||
2839 | + { | ||
2840 | + do | ||
2841 | + { | ||
2842 | + if (U_e == 32767 | ||
2843 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0) | ||
2844 | + && !((U_f[3]) & | ||
2845 | + ((unsigned long) 1 << (113 - 2 + 3) % 32))) | ||
2846 | + _fex |= (0); | ||
2847 | + } | ||
2848 | + while (0); | ||
2849 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
2850 | + U_f[2], V_f[3] = U_f[3]); | ||
2851 | + goto sub_done; | ||
2852 | + } | ||
2853 | + (Z_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32); | ||
2854 | + sub1:if (ediff <= (3 + 113)) | ||
2855 | + do | ||
2856 | + { | ||
2857 | + int _sticky; | ||
2858 | + do | ||
2859 | + { | ||
2860 | + long _up, _down, _skip, _i; | ||
2861 | + unsigned long _s; | ||
2862 | + _skip = (ediff) / 32; | ||
2863 | + _down = (ediff) % 32; | ||
2864 | + _up = 32 - _down; | ||
2865 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
2866 | + _s |= Z_f[_i]; | ||
2867 | + if (!_down) | ||
2868 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
2869 | + Z_f[_i] = Z_f[_i + _skip]; | ||
2870 | + else | ||
2871 | + { | ||
2872 | + _s |= Z_f[_i] << _up; | ||
2873 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
2874 | + Z_f[_i] = | ||
2875 | + Z_f[_i + _skip] >> _down | Z_f[_i + | ||
2876 | + _skip + | ||
2877 | + 1] << _up; | ||
2878 | + Z_f[_i++] = Z_f[3] >> _down; | ||
2879 | + } | ||
2880 | + for (; _i < 4; ++_i) | ||
2881 | + Z_f[_i] = 0; | ||
2882 | + _sticky = (_s != 0); | ||
2883 | + } | ||
2884 | + while (0); | ||
2885 | + Z_f[0] |= _sticky; | ||
2886 | + } | ||
2887 | + while (0); | ||
2888 | + else if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
2889 | + (Z_f[3] = 0, Z_f[2] = 0, Z_f[1] = 0, Z_f[0] = 1); | ||
2890 | + do | ||
2891 | + { | ||
2892 | + unsigned long _c1, _c2, _c3; | ||
2893 | + V_f[0] = U_f[0] - Z_f[0]; | ||
2894 | + _c1 = V_f[0] > U_f[0]; | ||
2895 | + V_f[1] = U_f[1] - Z_f[1]; | ||
2896 | + _c2 = V_f[1] > U_f[1]; | ||
2897 | + V_f[1] -= _c1; | ||
2898 | + _c2 |= _c1 && (Z_f[1] == U_f[1]); | ||
2899 | + V_f[2] = U_f[2] - Z_f[2]; | ||
2900 | + _c3 = V_f[2] > U_f[2]; | ||
2901 | + V_f[2] -= _c2; | ||
2902 | + _c3 |= _c2 && (Z_f[2] == U_f[2]); | ||
2903 | + V_f[3] = U_f[3] - Z_f[3] - _c3; | ||
2904 | + } | ||
2905 | + while (0); | ||
2906 | + } | ||
2907 | + else if (ediff < 0) | ||
2908 | + { | ||
2909 | + ediff = -ediff; | ||
2910 | + V_e = Z_e; | ||
2911 | + V_s = Z_s; | ||
2912 | + if (U_e == 0) | ||
2913 | + { | ||
2914 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
2915 | + { | ||
2916 | + do | ||
2917 | + { | ||
2918 | + if (Z_e == 32767 | ||
2919 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == | ||
2920 | + 0) | ||
2921 | + && !((Z_f[3]) & | ||
2922 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
2923 | + 32))) | ||
2924 | + _fex |= (0); | ||
2925 | + } | ||
2926 | + while (0); | ||
2927 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2928 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2929 | + goto sub_done; | ||
2930 | + } | ||
2931 | + else | ||
2932 | + { | ||
2933 | + _fex |= (0); | ||
2934 | + ediff--; | ||
2935 | + if (ediff == 0) | ||
2936 | + { | ||
2937 | + do | ||
2938 | + { | ||
2939 | + unsigned long _c1, _c2, _c3; | ||
2940 | + V_f[0] = Z_f[0] - U_f[0]; | ||
2941 | + _c1 = V_f[0] > Z_f[0]; | ||
2942 | + V_f[1] = Z_f[1] - U_f[1]; | ||
2943 | + _c2 = V_f[1] > Z_f[1]; | ||
2944 | + V_f[1] -= _c1; | ||
2945 | + _c2 |= _c1 && (U_f[1] == Z_f[1]); | ||
2946 | + V_f[2] = Z_f[2] - U_f[2]; | ||
2947 | + _c3 = V_f[2] > Z_f[2]; | ||
2948 | + V_f[2] -= _c2; | ||
2949 | + _c3 |= _c2 && (U_f[2] == Z_f[2]); | ||
2950 | + V_f[3] = Z_f[3] - U_f[3] - _c3; | ||
2951 | + } | ||
2952 | + while (0); | ||
2953 | + goto sub3; | ||
2954 | + } | ||
2955 | + if (Z_e == 32767) | ||
2956 | + { | ||
2957 | + do | ||
2958 | + { | ||
2959 | + if (Z_e == 32767 | ||
2960 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) | ||
2961 | + == 0) | ||
2962 | + && !((Z_f[3]) & | ||
2963 | + ((unsigned long) 1 << (113 - 2 + 3) | ||
2964 | + % 32))) | ||
2965 | + _fex |= (0); | ||
2966 | + } | ||
2967 | + while (0); | ||
2968 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2969 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2970 | + goto sub_done; | ||
2971 | + } | ||
2972 | + goto sub2; | ||
2973 | + } | ||
2974 | + } | ||
2975 | + else if (Z_e == 32767) | ||
2976 | + { | ||
2977 | + do | ||
2978 | + { | ||
2979 | + if (Z_e == 32767 | ||
2980 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0) | ||
2981 | + && !((Z_f[3]) & | ||
2982 | + ((unsigned long) 1 << (113 - 2 + 3) % 32))) | ||
2983 | + _fex |= (0); | ||
2984 | + } | ||
2985 | + while (0); | ||
2986 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
2987 | + Z_f[2], V_f[3] = Z_f[3]); | ||
2988 | + goto sub_done; | ||
2989 | + } | ||
2990 | + (U_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32); | ||
2991 | + sub2:if (ediff <= (3 + 113)) | ||
2992 | + do | ||
2993 | + { | ||
2994 | + int _sticky; | ||
2995 | + do | ||
2996 | + { | ||
2997 | + long _up, _down, _skip, _i; | ||
2998 | + unsigned long _s; | ||
2999 | + _skip = (ediff) / 32; | ||
3000 | + _down = (ediff) % 32; | ||
3001 | + _up = 32 - _down; | ||
3002 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
3003 | + _s |= U_f[_i]; | ||
3004 | + if (!_down) | ||
3005 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3006 | + U_f[_i] = U_f[_i + _skip]; | ||
3007 | + else | ||
3008 | + { | ||
3009 | + _s |= U_f[_i] << _up; | ||
3010 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3011 | + U_f[_i] = | ||
3012 | + U_f[_i + _skip] >> _down | U_f[_i + | ||
3013 | + _skip + | ||
3014 | + 1] << _up; | ||
3015 | + U_f[_i++] = U_f[3] >> _down; | ||
3016 | + } | ||
3017 | + for (; _i < 4; ++_i) | ||
3018 | + U_f[_i] = 0; | ||
3019 | + _sticky = (_s != 0); | ||
3020 | + } | ||
3021 | + while (0); | ||
3022 | + U_f[0] |= _sticky; | ||
3023 | + } | ||
3024 | + while (0); | ||
3025 | + else if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
3026 | + (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1); | ||
3027 | + do | ||
3028 | + { | ||
3029 | + unsigned long _c1, _c2, _c3; | ||
3030 | + V_f[0] = Z_f[0] - U_f[0]; | ||
3031 | + _c1 = V_f[0] > Z_f[0]; | ||
3032 | + V_f[1] = Z_f[1] - U_f[1]; | ||
3033 | + _c2 = V_f[1] > Z_f[1]; | ||
3034 | + V_f[1] -= _c1; | ||
3035 | + _c2 |= _c1 && (U_f[1] == Z_f[1]); | ||
3036 | + V_f[2] = Z_f[2] - U_f[2]; | ||
3037 | + _c3 = V_f[2] > Z_f[2]; | ||
3038 | + V_f[2] -= _c2; | ||
3039 | + _c3 |= _c2 && (U_f[2] == Z_f[2]); | ||
3040 | + V_f[3] = Z_f[3] - U_f[3] - _c3; | ||
3041 | + } | ||
3042 | + while (0); | ||
3043 | + } | ||
3044 | + else | ||
3045 | + { | ||
3046 | + if (!(((U_e + 1) & 32767) > 1)) | ||
3047 | + { | ||
3048 | + if (U_e == 0) | ||
3049 | + { | ||
3050 | + V_e = 0; | ||
3051 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
3052 | + { | ||
3053 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
3054 | + Z_f[2], V_f[3] = Z_f[3]); | ||
3055 | + if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
3056 | + V_s = (0 == 3); | ||
3057 | + else | ||
3058 | + { | ||
3059 | + _fex |= (0); | ||
3060 | + V_s = Z_s; | ||
3061 | + } | ||
3062 | + goto sub_done; | ||
3063 | + } | ||
3064 | + else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
3065 | + { | ||
3066 | + _fex |= (0); | ||
3067 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
3068 | + U_f[2], V_f[3] = U_f[3]); | ||
3069 | + V_s = U_s; | ||
3070 | + goto sub_done; | ||
3071 | + } | ||
3072 | + else | ||
3073 | + { | ||
3074 | + _fex |= (0); | ||
3075 | + do | ||
3076 | + { | ||
3077 | + unsigned long _c1, _c2, _c3; | ||
3078 | + V_f[0] = U_f[0] - Z_f[0]; | ||
3079 | + _c1 = V_f[0] > U_f[0]; | ||
3080 | + V_f[1] = U_f[1] - Z_f[1]; | ||
3081 | + _c2 = V_f[1] > U_f[1]; | ||
3082 | + V_f[1] -= _c1; | ||
3083 | + _c2 |= _c1 && (Z_f[1] == U_f[1]); | ||
3084 | + V_f[2] = U_f[2] - Z_f[2]; | ||
3085 | + _c3 = V_f[2] > U_f[2]; | ||
3086 | + V_f[2] -= _c2; | ||
3087 | + _c3 |= _c2 && (Z_f[2] == U_f[2]); | ||
3088 | + V_f[3] = U_f[3] - Z_f[3] - _c3; | ||
3089 | + } | ||
3090 | + while (0); | ||
3091 | + V_s = U_s; | ||
3092 | + if ((V_f[3]) & | ||
3093 | + ((unsigned long) 1 << (113 - 1 + 3) % 32)) | ||
3094 | + { | ||
3095 | + do | ||
3096 | + { | ||
3097 | + unsigned long _c1, _c2, _c3; | ||
3098 | + V_f[0] = Z_f[0] - U_f[0]; | ||
3099 | + _c1 = V_f[0] > Z_f[0]; | ||
3100 | + V_f[1] = Z_f[1] - U_f[1]; | ||
3101 | + _c2 = V_f[1] > Z_f[1]; | ||
3102 | + V_f[1] -= _c1; | ||
3103 | + _c2 |= _c1 && (U_f[1] == Z_f[1]); | ||
3104 | + V_f[2] = Z_f[2] - U_f[2]; | ||
3105 | + _c3 = V_f[2] > Z_f[2]; | ||
3106 | + V_f[2] -= _c2; | ||
3107 | + _c3 |= _c2 && (U_f[2] == Z_f[2]); | ||
3108 | + V_f[3] = Z_f[3] - U_f[3] - _c3; | ||
3109 | + } | ||
3110 | + while (0); | ||
3111 | + V_s = Z_s; | ||
3112 | + } | ||
3113 | + else | ||
3114 | + if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == | ||
3115 | + 0)) | ||
3116 | + V_s = (0 == 3); | ||
3117 | + goto sub_done; | ||
3118 | + } | ||
3119 | + } | ||
3120 | + else | ||
3121 | + { | ||
3122 | + do | ||
3123 | + { | ||
3124 | + if (U_e == 32767 | ||
3125 | + && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == | ||
3126 | + 0) | ||
3127 | + && !((U_f[3]) & | ||
3128 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
3129 | + 32))) | ||
3130 | + _fex |= (0); | ||
3131 | + } | ||
3132 | + while (0); | ||
3133 | + do | ||
3134 | + { | ||
3135 | + if (Z_e == 32767 | ||
3136 | + && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == | ||
3137 | + 0) | ||
3138 | + && !((Z_f[3]) & | ||
3139 | + ((unsigned long) 1 << (113 - 2 + 3) % | ||
3140 | + 32))) | ||
3141 | + _fex |= (0); | ||
3142 | + } | ||
3143 | + while (0); | ||
3144 | + V_e = 32767; | ||
3145 | + if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)) | ||
3146 | + { | ||
3147 | + if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
3148 | + { | ||
3149 | + V_s = 0; | ||
3150 | + (V_f[3] = | ||
3151 | + ((((unsigned long) 1 << (113 - 2) % | ||
3152 | + 32) << 1) - 1), V_f[2] = -1, V_f[1] = | ||
3153 | + -1, V_f[0] = -1); | ||
3154 | + do | ||
3155 | + { | ||
3156 | + long _up, _down, _skip, _i; | ||
3157 | + _skip = (3) / 32; | ||
3158 | + _up = (3) % 32; | ||
3159 | + _down = 32 - _up; | ||
3160 | + if (!_up) | ||
3161 | + for (_i = 3; _i >= _skip; --_i) | ||
3162 | + V_f[_i] = V_f[_i - _skip]; | ||
3163 | + else | ||
3164 | + { | ||
3165 | + for (_i = 3; _i > _skip; --_i) | ||
3166 | + V_f[_i] = | ||
3167 | + V_f[_i - | ||
3168 | + _skip] << _up | V_f[_i - | ||
3169 | + _skip - | ||
3170 | + 1] >> | ||
3171 | + _down; | ||
3172 | + V_f[_i--] = V_f[0] << _up; | ||
3173 | + } | ||
3174 | + for (; _i >= 0; --_i) | ||
3175 | + V_f[_i] = 0; | ||
3176 | + } | ||
3177 | + while (0); | ||
3178 | + _fex |= (0); | ||
3179 | + } | ||
3180 | + else | ||
3181 | + { | ||
3182 | + V_s = Z_s; | ||
3183 | + (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] = | ||
3184 | + Z_f[2], V_f[3] = Z_f[3]); | ||
3185 | + } | ||
3186 | + } | ||
3187 | + else | ||
3188 | + { | ||
3189 | + if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)) | ||
3190 | + { | ||
3191 | + V_s = U_s; | ||
3192 | + (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] = | ||
3193 | + U_f[2], V_f[3] = U_f[3]); | ||
3194 | + } | ||
3195 | + else | ||
3196 | + { | ||
3197 | + do | ||
3198 | + { | ||
3199 | + do | ||
3200 | + { | ||
3201 | + long _up, _down, _skip, _i; | ||
3202 | + _skip = (3) / 32; | ||
3203 | + _down = (3) % 32; | ||
3204 | + _up = 32 - _down; | ||
3205 | + if (!_down) | ||
3206 | + for (_i = 0; _i <= 3 - _skip; | ||
3207 | + ++_i) | ||
3208 | + U_f[_i] = U_f[_i + _skip]; | ||
3209 | + else | ||
3210 | + { | ||
3211 | + for (_i = 0; _i < 3 - _skip; | ||
3212 | + ++_i) | ||
3213 | + U_f[_i] = | ||
3214 | + U_f[_i + | ||
3215 | + _skip] >> _down | U_f[_i | ||
3216 | + + | ||
3217 | + _skip | ||
3218 | + + | ||
3219 | + 1] | ||
3220 | + << _up; | ||
3221 | + U_f[_i++] = U_f[3] >> _down; | ||
3222 | + } | ||
3223 | + for (; _i < 4; ++_i) | ||
3224 | + U_f[_i] = 0; | ||
3225 | + } | ||
3226 | + while (0); | ||
3227 | + do | ||
3228 | + { | ||
3229 | + long _up, _down, _skip, _i; | ||
3230 | + _skip = (3) / 32; | ||
3231 | + _down = (3) % 32; | ||
3232 | + _up = 32 - _down; | ||
3233 | + if (!_down) | ||
3234 | + for (_i = 0; _i <= 3 - _skip; | ||
3235 | + ++_i) | ||
3236 | + Z_f[_i] = Z_f[_i + _skip]; | ||
3237 | + else | ||
3238 | + { | ||
3239 | + for (_i = 0; _i < 3 - _skip; | ||
3240 | + ++_i) | ||
3241 | + Z_f[_i] = | ||
3242 | + Z_f[_i + | ||
3243 | + _skip] >> _down | Z_f[_i | ||
3244 | + + | ||
3245 | + _skip | ||
3246 | + + | ||
3247 | + 1] | ||
3248 | + << _up; | ||
3249 | + Z_f[_i++] = Z_f[3] >> _down; | ||
3250 | + } | ||
3251 | + for (; _i < 4; ++_i) | ||
3252 | + Z_f[_i] = 0; | ||
3253 | + } | ||
3254 | + while (0); | ||
3255 | + do | ||
3256 | + { | ||
3257 | + if (((U_f[3]) & | ||
3258 | + ((unsigned long) 1 << (113 - 2) | ||
3259 | + % 32)) | ||
3260 | + && !((Z_f[3]) & | ||
3261 | + ((unsigned long) 1 << | ||
3262 | + (113 - 2) % 32))) | ||
3263 | + { | ||
3264 | + V_s = Z_s; | ||
3265 | + (V_f[0] = Z_f[0], V_f[1] = | ||
3266 | + Z_f[1], V_f[2] = | ||
3267 | + Z_f[2], V_f[3] = Z_f[3]); | ||
3268 | + } | ||
3269 | + else | ||
3270 | + { | ||
3271 | + V_s = U_s; | ||
3272 | + (V_f[0] = U_f[0], V_f[1] = | ||
3273 | + U_f[1], V_f[2] = | ||
3274 | + U_f[2], V_f[3] = U_f[3]); | ||
3275 | + } | ||
3276 | + V_c = 3; | ||
3277 | + } | ||
3278 | + while (0); | ||
3279 | + do | ||
3280 | + { | ||
3281 | + long _up, _down, _skip, _i; | ||
3282 | + _skip = (3) / 32; | ||
3283 | + _up = (3) % 32; | ||
3284 | + _down = 32 - _up; | ||
3285 | + if (!_up) | ||
3286 | + for (_i = 3; _i >= _skip; --_i) | ||
3287 | + V_f[_i] = V_f[_i - _skip]; | ||
3288 | + else | ||
3289 | + { | ||
3290 | + for (_i = 3; _i > _skip; --_i) | ||
3291 | + V_f[_i] = | ||
3292 | + V_f[_i - | ||
3293 | + _skip] << _up | V_f[_i - | ||
3294 | + _skip | ||
3295 | + - | ||
3296 | + 1] | ||
3297 | + >> _down; | ||
3298 | + V_f[_i--] = V_f[0] << _up; | ||
3299 | + } | ||
3300 | + for (; _i >= 0; --_i) | ||
3301 | + V_f[_i] = 0; | ||
3302 | + } | ||
3303 | + while (0); | ||
3304 | + } | ||
3305 | + while (0); | ||
3306 | + } | ||
3307 | + } | ||
3308 | + goto sub_done; | ||
3309 | + } | ||
3310 | + } | ||
3311 | + V_e = U_e; | ||
3312 | + do | ||
3313 | + { | ||
3314 | + unsigned long _c1, _c2, _c3; | ||
3315 | + V_f[0] = U_f[0] - Z_f[0]; | ||
3316 | + _c1 = V_f[0] > U_f[0]; | ||
3317 | + V_f[1] = U_f[1] - Z_f[1]; | ||
3318 | + _c2 = V_f[1] > U_f[1]; | ||
3319 | + V_f[1] -= _c1; | ||
3320 | + _c2 |= _c1 && (Z_f[1] == U_f[1]); | ||
3321 | + V_f[2] = U_f[2] - Z_f[2]; | ||
3322 | + _c3 = V_f[2] > U_f[2]; | ||
3323 | + V_f[2] -= _c2; | ||
3324 | + _c3 |= _c2 && (Z_f[2] == U_f[2]); | ||
3325 | + V_f[3] = U_f[3] - Z_f[3] - _c3; | ||
3326 | + } | ||
3327 | + while (0); | ||
3328 | + V_s = U_s; | ||
3329 | + if ((V_f[3]) & ((unsigned long) 1 << (113 - 1 + 3) % 32)) | ||
3330 | + { | ||
3331 | + do | ||
3332 | + { | ||
3333 | + unsigned long _c1, _c2, _c3; | ||
3334 | + V_f[0] = Z_f[0] - U_f[0]; | ||
3335 | + _c1 = V_f[0] > Z_f[0]; | ||
3336 | + V_f[1] = Z_f[1] - U_f[1]; | ||
3337 | + _c2 = V_f[1] > Z_f[1]; | ||
3338 | + V_f[1] -= _c1; | ||
3339 | + _c2 |= _c1 && (U_f[1] == Z_f[1]); | ||
3340 | + V_f[2] = Z_f[2] - U_f[2]; | ||
3341 | + _c3 = V_f[2] > Z_f[2]; | ||
3342 | + V_f[2] -= _c2; | ||
3343 | + _c3 |= _c2 && (U_f[2] == Z_f[2]); | ||
3344 | + V_f[3] = Z_f[3] - U_f[3] - _c3; | ||
3345 | + } | ||
3346 | + while (0); | ||
3347 | + V_s = Z_s; | ||
3348 | + } | ||
3349 | + else if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0)) | ||
3350 | + { | ||
3351 | + V_e = 0; | ||
3352 | + V_s = (0 == 3); | ||
3353 | + goto sub_done; | ||
3354 | + } | ||
3355 | + goto norm; | ||
3356 | + } | ||
3357 | + sub3:if ((V_f[3]) & | ||
3358 | + ((unsigned long) 1 << (113 - 1 + 3) % 32)) | ||
3359 | + { | ||
3360 | + int diff; | ||
3361 | + (V_f[3]) &= ((unsigned long) 1 << (113 - 1 + 3) % 32) - 1; | ||
3362 | + norm:do | ||
3363 | + { | ||
3364 | + if (V_f[3]) | ||
3365 | + { | ||
3366 | + do | ||
3367 | + { | ||
3368 | + if (sizeof (unsigned long) == | ||
3369 | + sizeof (unsigned int)) | ||
3370 | + diff = __builtin_clz (V_f[3]); | ||
3371 | + else if (sizeof (unsigned long) == | ||
3372 | + sizeof (unsigned long)) | ||
3373 | + diff = __builtin_clzl (V_f[3]); | ||
3374 | + else if (sizeof (unsigned long) == | ||
3375 | + sizeof (unsigned long long)) | ||
3376 | + diff = __builtin_clzll (V_f[3]); | ||
3377 | + else | ||
3378 | + abort (); | ||
3379 | + } | ||
3380 | + while (0); | ||
3381 | + } | ||
3382 | + else if (V_f[2]) | ||
3383 | + { | ||
3384 | + do | ||
3385 | + { | ||
3386 | + if (sizeof (unsigned long) == | ||
3387 | + sizeof (unsigned int)) | ||
3388 | + diff = __builtin_clz (V_f[2]); | ||
3389 | + else if (sizeof (unsigned long) == | ||
3390 | + sizeof (unsigned long)) | ||
3391 | + diff = __builtin_clzl (V_f[2]); | ||
3392 | + else if (sizeof (unsigned long) == | ||
3393 | + sizeof (unsigned long long)) | ||
3394 | + diff = __builtin_clzll (V_f[2]); | ||
3395 | + else | ||
3396 | + abort (); | ||
3397 | + } | ||
3398 | + while (0); | ||
3399 | + diff += 32; | ||
3400 | + } | ||
3401 | + else if (V_f[1]) | ||
3402 | + { | ||
3403 | + do | ||
3404 | + { | ||
3405 | + if (sizeof (unsigned long) == | ||
3406 | + sizeof (unsigned int)) | ||
3407 | + diff = __builtin_clz (V_f[1]); | ||
3408 | + else if (sizeof (unsigned long) == | ||
3409 | + sizeof (unsigned long)) | ||
3410 | + diff = __builtin_clzl (V_f[1]); | ||
3411 | + else if (sizeof (unsigned long) == | ||
3412 | + sizeof (unsigned long long)) | ||
3413 | + diff = __builtin_clzll (V_f[1]); | ||
3414 | + else | ||
3415 | + abort (); | ||
3416 | + } | ||
3417 | + while (0); | ||
3418 | + diff += 32 * 2; | ||
3419 | + } | ||
3420 | + else | ||
3421 | + { | ||
3422 | + do | ||
3423 | + { | ||
3424 | + if (sizeof (unsigned long) == | ||
3425 | + sizeof (unsigned int)) | ||
3426 | + diff = __builtin_clz (V_f[0]); | ||
3427 | + else if (sizeof (unsigned long) == | ||
3428 | + sizeof (unsigned long)) | ||
3429 | + diff = __builtin_clzl (V_f[0]); | ||
3430 | + else if (sizeof (unsigned long) == | ||
3431 | + sizeof (unsigned long long)) | ||
3432 | + diff = __builtin_clzll (V_f[0]); | ||
3433 | + else | ||
3434 | + abort (); | ||
3435 | + } | ||
3436 | + while (0); | ||
3437 | + diff += 32 * 3; | ||
3438 | + } | ||
3439 | + } | ||
3440 | + while (0); | ||
3441 | + diff -= ((4 * 32) - (3 + 113)); | ||
3442 | + do | ||
3443 | + { | ||
3444 | + long _up, _down, _skip, _i; | ||
3445 | + _skip = (diff) / 32; | ||
3446 | + _up = (diff) % 32; | ||
3447 | + _down = 32 - _up; | ||
3448 | + if (!_up) | ||
3449 | + for (_i = 3; _i >= _skip; --_i) | ||
3450 | + V_f[_i] = V_f[_i - _skip]; | ||
3451 | + else | ||
3452 | + { | ||
3453 | + for (_i = 3; _i > _skip; --_i) | ||
3454 | + V_f[_i] = | ||
3455 | + V_f[_i - _skip] << _up | V_f[_i - _skip - | ||
3456 | + 1] >> _down; | ||
3457 | + V_f[_i--] = V_f[0] << _up; | ||
3458 | + } | ||
3459 | + for (; _i >= 0; --_i) | ||
3460 | + V_f[_i] = 0; | ||
3461 | + } | ||
3462 | + while (0); | ||
3463 | + if (V_e <= diff) | ||
3464 | + { | ||
3465 | + diff = diff - V_e + 1; | ||
3466 | + do | ||
3467 | + { | ||
3468 | + int _sticky; | ||
3469 | + do | ||
3470 | + { | ||
3471 | + long _up, _down, _skip, _i; | ||
3472 | + unsigned long _s; | ||
3473 | + _skip = (diff) / 32; | ||
3474 | + _down = (diff) % 32; | ||
3475 | + _up = 32 - _down; | ||
3476 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
3477 | + _s |= V_f[_i]; | ||
3478 | + if (!_down) | ||
3479 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3480 | + V_f[_i] = V_f[_i + _skip]; | ||
3481 | + else | ||
3482 | + { | ||
3483 | + _s |= V_f[_i] << _up; | ||
3484 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3485 | + V_f[_i] = | ||
3486 | + V_f[_i + _skip] >> _down | V_f[_i + | ||
3487 | + _skip + | ||
3488 | + 1] << | ||
3489 | + _up; | ||
3490 | + V_f[_i++] = V_f[3] >> _down; | ||
3491 | + } | ||
3492 | + for (; _i < 4; ++_i) | ||
3493 | + V_f[_i] = 0; | ||
3494 | + _sticky = (_s != 0); | ||
3495 | + } | ||
3496 | + while (0); | ||
3497 | + V_f[0] |= _sticky; | ||
3498 | + } | ||
3499 | + while (0); | ||
3500 | + V_e = 0; | ||
3501 | + } | ||
3502 | + else | ||
3503 | + { | ||
3504 | + V_e -= diff; | ||
3505 | + (V_f[3]) &= | ||
3506 | + ~(unsigned long) ((unsigned long) 1 << (113 - 1 + 3) % | ||
3507 | + 32); | ||
3508 | + } | ||
3509 | + } | ||
3510 | + sub_done:; | ||
3511 | + } | ||
3512 | + } | ||
3513 | + while (0); | ||
3514 | + } | ||
3515 | + while (0); | ||
3516 | + | ||
3517 | +/* FP_PACK_SEMIRAW_Q(v,V) */ | ||
3518 | + do | ||
3519 | + { | ||
3520 | + do | ||
3521 | + { | ||
3522 | + do | ||
3523 | + { | ||
3524 | + if ((V_f[0]) & 7) | ||
3525 | + _fex |= (0); | ||
3526 | + switch (0) | ||
3527 | + { | ||
3528 | + case 0: | ||
3529 | + do | ||
3530 | + { | ||
3531 | + if (((V_f[0]) & 15) != ((unsigned long) 1 << 2)) | ||
3532 | + do | ||
3533 | + { | ||
3534 | + unsigned long _t; | ||
3535 | + _t = | ||
3536 | + ((V_f[0] += | ||
3537 | + ((unsigned long) 1 << 2)) < | ||
3538 | + ((unsigned long) 1 << 2)); | ||
3539 | + V_f[1] += _t; | ||
3540 | + _t = (V_f[1] < _t); | ||
3541 | + V_f[2] += _t; | ||
3542 | + _t = (V_f[2] < _t); | ||
3543 | + V_f[3] += _t; | ||
3544 | + } | ||
3545 | + while (0); | ||
3546 | + } | ||
3547 | + while (0); | ||
3548 | + break; | ||
3549 | + case 1: | ||
3550 | + (void) 0; | ||
3551 | + break; | ||
3552 | + case 2: | ||
3553 | + do | ||
3554 | + { | ||
3555 | + if (!V_s && ((V_f[0]) & 7)) | ||
3556 | + do | ||
3557 | + { | ||
3558 | + unsigned long _t; | ||
3559 | + _t = | ||
3560 | + ((V_f[0] += | ||
3561 | + ((unsigned long) 1 << 3)) < | ||
3562 | + ((unsigned long) 1 << 3)); | ||
3563 | + V_f[1] += _t; | ||
3564 | + _t = (V_f[1] < _t); | ||
3565 | + V_f[2] += _t; | ||
3566 | + _t = (V_f[2] < _t); | ||
3567 | + V_f[3] += _t; | ||
3568 | + } | ||
3569 | + while (0); | ||
3570 | + } | ||
3571 | + while (0); | ||
3572 | + break; | ||
3573 | + case 3: | ||
3574 | + do | ||
3575 | + { | ||
3576 | + if (V_s && ((V_f[0]) & 7)) | ||
3577 | + do | ||
3578 | + { | ||
3579 | + unsigned long _t; | ||
3580 | + _t = | ||
3581 | + ((V_f[0] += | ||
3582 | + ((unsigned long) 1 << 3)) < | ||
3583 | + ((unsigned long) 1 << 3)); | ||
3584 | + V_f[1] += _t; | ||
3585 | + _t = (V_f[1] < _t); | ||
3586 | + V_f[2] += _t; | ||
3587 | + _t = (V_f[2] < _t); | ||
3588 | + V_f[3] += _t; | ||
3589 | + } | ||
3590 | + while (0); | ||
3591 | + } | ||
3592 | + while (0); | ||
3593 | + break; | ||
3594 | + } | ||
3595 | + } | ||
3596 | + while (0); | ||
3597 | + if ((V_f[3]) & (((unsigned long) 1 << ((3 + 113) % 32)) >> 1)) | ||
3598 | + { | ||
3599 | + (V_f[3]) &= ~(((unsigned long) 1 << ((3 + 113) % 32)) >> 1); | ||
3600 | + V_e++; | ||
3601 | + if (V_e == 32767) | ||
3602 | + do | ||
3603 | + { | ||
3604 | + if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s)) | ||
3605 | + { | ||
3606 | + V_e = 32767; | ||
3607 | + (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0); | ||
3608 | + } | ||
3609 | + else | ||
3610 | + { | ||
3611 | + V_e = 32767 - 1; | ||
3612 | + _fex |= (0); | ||
3613 | + _fex |= (0); | ||
3614 | + (V_f[3] = (~(signed long) 0), V_f[2] = | ||
3615 | + (~(signed long) 0), V_f[1] = | ||
3616 | + (~(signed long) 0), V_f[0] = (~(signed long) 0)); | ||
3617 | + } | ||
3618 | + } | ||
3619 | + while (0); | ||
3620 | + } | ||
3621 | + do | ||
3622 | + { | ||
3623 | + long _up, _down, _skip, _i; | ||
3624 | + _skip = (3) / 32; | ||
3625 | + _down = (3) % 32; | ||
3626 | + _up = 32 - _down; | ||
3627 | + if (!_down) | ||
3628 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3629 | + V_f[_i] = V_f[_i + _skip]; | ||
3630 | + else | ||
3631 | + { | ||
3632 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3633 | + V_f[_i] = | ||
3634 | + V_f[_i + _skip] >> _down | V_f[_i + _skip + 1] << _up; | ||
3635 | + V_f[_i++] = V_f[3] >> _down; | ||
3636 | + } | ||
3637 | + for (; _i < 4; ++_i) | ||
3638 | + V_f[_i] = 0; | ||
3639 | + } | ||
3640 | + while (0); | ||
3641 | + if (!(((V_e + 1) & 32767) > 1) | ||
3642 | + && !((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0)) | ||
3643 | + { | ||
3644 | + if (V_e == 0) | ||
3645 | + _fex |= (0); | ||
3646 | + else | ||
3647 | + { | ||
3648 | + if (!1) | ||
3649 | + { | ||
3650 | + (V_f[3] = | ||
3651 | + ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1), | ||
3652 | + V_f[2] = -1, V_f[1] = -1, V_f[0] = -1); | ||
3653 | + V_s = 0; | ||
3654 | + } | ||
3655 | + else | ||
3656 | + (V_f[3]) |= ((unsigned long) 1 << (113 - 2) % 32); | ||
3657 | + } | ||
3658 | + } | ||
3659 | + } | ||
3660 | + while (0); | ||
3661 | + do | ||
3662 | + { | ||
3663 | + union _FP_UNION_Q _flo; | ||
3664 | + _flo.bits.frac0 = V_f[0]; | ||
3665 | + _flo.bits.frac1 = V_f[1]; | ||
3666 | + _flo.bits.frac2 = V_f[2]; | ||
3667 | + _flo.bits.frac3 = V_f[3]; | ||
3668 | + _flo.bits.exp = V_e; | ||
3669 | + _flo.bits.sign = V_s; | ||
3670 | + (v) = _flo.flt; | ||
3671 | + } | ||
3672 | + while (0); | ||
3673 | + } | ||
3674 | + while (0); | ||
3675 | + | ||
3676 | +/* FP_HANDLE_EXCEPTIONS */ | ||
3677 | + do | ||
3678 | + { | ||
3679 | + } | ||
3680 | + while (0); | ||
3681 | + | ||
3682 | + /* Truncate quad to double. */ | ||
3683 | +/* FP_INIT_ROUNDMODE */ | ||
3684 | + do | ||
3685 | + { | ||
3686 | + } | ||
3687 | + while (0); | ||
3688 | + | ||
3689 | +/* FP_UNPACK_SEMIRAW_Q(V,v) */ | ||
3690 | + do | ||
3691 | + { | ||
3692 | + do | ||
3693 | + { | ||
3694 | + union _FP_UNION_Q _flo; | ||
3695 | + _flo.flt = (v); | ||
3696 | + V_f[0] = _flo.bits.frac0; | ||
3697 | + V_f[1] = _flo.bits.frac1; | ||
3698 | + V_f[2] = _flo.bits.frac2; | ||
3699 | + V_f[3] = _flo.bits.frac3; | ||
3700 | + V_e = _flo.bits.exp; | ||
3701 | + V_s = _flo.bits.sign; | ||
3702 | + } | ||
3703 | + while (0); | ||
3704 | + do | ||
3705 | + { | ||
3706 | + long _up, _down, _skip, _i; | ||
3707 | + _skip = (3) / 32; | ||
3708 | + _up = (3) % 32; | ||
3709 | + _down = 32 - _up; | ||
3710 | + if (!_up) | ||
3711 | + for (_i = 3; _i >= _skip; --_i) | ||
3712 | + V_f[_i] = V_f[_i - _skip]; | ||
3713 | + else | ||
3714 | + { | ||
3715 | + for (_i = 3; _i > _skip; --_i) | ||
3716 | + V_f[_i] = | ||
3717 | + V_f[_i - _skip] << _up | V_f[_i - _skip - 1] >> _down; | ||
3718 | + V_f[_i--] = V_f[0] << _up; | ||
3719 | + } | ||
3720 | + for (; _i >= 0; --_i) | ||
3721 | + V_f[_i] = 0; | ||
3722 | + } | ||
3723 | + while (0); | ||
3724 | + } | ||
3725 | + while (0); | ||
3726 | + | ||
3727 | +/* FP_TRUNC(D,Q,2,4,R,V) */ | ||
3728 | + do | ||
3729 | + { | ||
3730 | + if (113 < 53 || 16383 < 1023 + 53 - 1) | ||
3731 | + abort (); | ||
3732 | + R_s = V_s; | ||
3733 | + if ((((V_e + 1) & 32767) > 1)) | ||
3734 | + { | ||
3735 | + R_e = V_e + 1023 - 16383; | ||
3736 | + if (R_e >= 2047) | ||
3737 | + do | ||
3738 | + { | ||
3739 | + if (0 == 0 || (0 == 2 && !R_s) || (0 == 3 && R_s)) | ||
3740 | + { | ||
3741 | + R_e = 2047; | ||
3742 | + (R_f0 = 0, R_f1 = 0); | ||
3743 | + } | ||
3744 | + else | ||
3745 | + { | ||
3746 | + R_e = 2047 - 1; | ||
3747 | + _fex |= (0); | ||
3748 | + _fex |= (0); | ||
3749 | + (R_f0 = (~(signed long) 0), R_f1 = (~(signed long) 0)); | ||
3750 | + } | ||
3751 | + } | ||
3752 | + while (0); | ||
3753 | + else | ||
3754 | + { | ||
3755 | + if (R_e <= 0) | ||
3756 | + { | ||
3757 | + if (R_e <= 1 - 53) | ||
3758 | + (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0); | ||
3759 | + else | ||
3760 | + { | ||
3761 | + (V_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32); | ||
3762 | + do | ||
3763 | + { | ||
3764 | + int _sticky; | ||
3765 | + do | ||
3766 | + { | ||
3767 | + long _up, _down, _skip, _i; | ||
3768 | + unsigned long _s; | ||
3769 | + _skip = (((3 + 113) - (3 + 53) + 1 - R_e)) / 32; | ||
3770 | + _down = (((3 + 113) - (3 + 53) + 1 - R_e)) % 32; | ||
3771 | + _up = 32 - _down; | ||
3772 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
3773 | + _s |= V_f[_i]; | ||
3774 | + if (!_down) | ||
3775 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3776 | + V_f[_i] = V_f[_i + _skip]; | ||
3777 | + else | ||
3778 | + { | ||
3779 | + _s |= V_f[_i] << _up; | ||
3780 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3781 | + V_f[_i] = | ||
3782 | + V_f[_i + _skip] >> _down | V_f[_i + | ||
3783 | + _skip + | ||
3784 | + 1] << | ||
3785 | + _up; | ||
3786 | + V_f[_i++] = V_f[3] >> _down; | ||
3787 | + } | ||
3788 | + for (; _i < 4; ++_i) | ||
3789 | + V_f[_i] = 0; | ||
3790 | + _sticky = (_s != 0); | ||
3791 | + } | ||
3792 | + while (0); | ||
3793 | + V_f[0] |= _sticky; | ||
3794 | + } | ||
3795 | + while (0); | ||
3796 | + } | ||
3797 | + R_e = 0; | ||
3798 | + } | ||
3799 | + else | ||
3800 | + do | ||
3801 | + { | ||
3802 | + int _sticky; | ||
3803 | + do | ||
3804 | + { | ||
3805 | + long _up, _down, _skip, _i; | ||
3806 | + unsigned long _s; | ||
3807 | + _skip = (((3 + 113) - (3 + 53))) / 32; | ||
3808 | + _down = (((3 + 113) - (3 + 53))) % 32; | ||
3809 | + _up = 32 - _down; | ||
3810 | + for (_s = _i = 0; _i < _skip; ++_i) | ||
3811 | + _s |= V_f[_i]; | ||
3812 | + if (!_down) | ||
3813 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3814 | + V_f[_i] = V_f[_i + _skip]; | ||
3815 | + else | ||
3816 | + { | ||
3817 | + _s |= V_f[_i] << _up; | ||
3818 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3819 | + V_f[_i] = | ||
3820 | + V_f[_i + _skip] >> _down | V_f[_i + _skip + | ||
3821 | + 1] << _up; | ||
3822 | + V_f[_i++] = V_f[3] >> _down; | ||
3823 | + } | ||
3824 | + for (; _i < 4; ++_i) | ||
3825 | + V_f[_i] = 0; | ||
3826 | + _sticky = (_s != 0); | ||
3827 | + } | ||
3828 | + while (0); | ||
3829 | + V_f[0] |= _sticky; | ||
3830 | + } | ||
3831 | + while (0); | ||
3832 | + do | ||
3833 | + { | ||
3834 | + R_f0 = V_f[0]; | ||
3835 | + R_f1 = V_f[1]; | ||
3836 | + } | ||
3837 | + while (0); | ||
3838 | + } | ||
3839 | + } | ||
3840 | + else | ||
3841 | + { | ||
3842 | + if (V_e == 0) | ||
3843 | + { | ||
3844 | + R_e = 0; | ||
3845 | + (R_f0 = 0, R_f1 = 0); | ||
3846 | + if (!((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0)) | ||
3847 | + { | ||
3848 | + _fex |= (0); | ||
3849 | + _fex |= (0); | ||
3850 | + } | ||
3851 | + } | ||
3852 | + else | ||
3853 | + { | ||
3854 | + R_e = 2047; | ||
3855 | + if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0)) | ||
3856 | + (R_f0 = 0, R_f1 = 0); | ||
3857 | + else | ||
3858 | + { | ||
3859 | + do | ||
3860 | + { | ||
3861 | + if (V_e == 32767 | ||
3862 | + && !((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0) | ||
3863 | + && !((V_f[3]) & | ||
3864 | + ((unsigned long) 1 << (113 - 2 + 3) % 32))) | ||
3865 | + _fex |= (0); | ||
3866 | + } | ||
3867 | + while (0); | ||
3868 | + do | ||
3869 | + { | ||
3870 | + long _up, _down, _skip, _i; | ||
3871 | + _skip = (((3 + 113) - (3 + 53))) / 32; | ||
3872 | + _down = (((3 + 113) - (3 + 53))) % 32; | ||
3873 | + _up = 32 - _down; | ||
3874 | + if (!_down) | ||
3875 | + for (_i = 0; _i <= 3 - _skip; ++_i) | ||
3876 | + V_f[_i] = V_f[_i + _skip]; | ||
3877 | + else | ||
3878 | + { | ||
3879 | + for (_i = 0; _i < 3 - _skip; ++_i) | ||
3880 | + V_f[_i] = | ||
3881 | + V_f[_i + _skip] >> _down | V_f[_i + _skip + | ||
3882 | + 1] << _up; | ||
3883 | + V_f[_i++] = V_f[3] >> _down; | ||
3884 | + } | ||
3885 | + for (; _i < 4; ++_i) | ||
3886 | + V_f[_i] = 0; | ||
3887 | + } | ||
3888 | + while (0); | ||
3889 | + do | ||
3890 | + { | ||
3891 | + R_f0 = V_f[0]; | ||
3892 | + R_f1 = V_f[1]; | ||
3893 | + } | ||
3894 | + while (0); | ||
3895 | + (R_f1) |= ((unsigned long) 1 << (53 - 2 + 3) % 32); | ||
3896 | + } | ||
3897 | + } | ||
3898 | + } | ||
3899 | + } | ||
3900 | + while (0); | ||
3901 | + | ||
3902 | +/* FP_PACK_SEMIRAW_D(r,R) */ | ||
3903 | + do | ||
3904 | + { | ||
3905 | + do | ||
3906 | + { | ||
3907 | + do | ||
3908 | + { | ||
3909 | + if ((R_f0) & 7) | ||
3910 | + _fex |= (0); | ||
3911 | + switch (0) | ||
3912 | + { | ||
3913 | + case 0: | ||
3914 | + do | ||
3915 | + { | ||
3916 | + if (((R_f0) & 15) != ((unsigned long) 1 << 2)) | ||
3917 | + do | ||
3918 | + { | ||
3919 | + if (__builtin_constant_p (0) && (0) == 0) | ||
3920 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3921 | + "rI" (((unsigned long) 1 << | ||
3922 | + 2))); | ||
3923 | + else if (__builtin_constant_p (0) | ||
3924 | + && (0) == ~(USItype) 0) | ||
3925 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3926 | + "rI" (((unsigned long) 1 << | ||
3927 | + 2))); | ||
3928 | + else | ||
3929 | + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0), | ||
3930 | + "rI" (((unsigned long) 1 << | ||
3931 | + 2))); | ||
3932 | + } | ||
3933 | + while (0); | ||
3934 | + } | ||
3935 | + while (0); | ||
3936 | + break; | ||
3937 | + case 1: | ||
3938 | + (void) 0; | ||
3939 | + break; | ||
3940 | + case 2: | ||
3941 | + do | ||
3942 | + { | ||
3943 | + if (!R_s && ((R_f0) & 7)) | ||
3944 | + do | ||
3945 | + { | ||
3946 | + if (__builtin_constant_p (0) && (0) == 0) | ||
3947 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3948 | + "rI" (((unsigned long) 1 << | ||
3949 | + 3))); | ||
3950 | + else if (__builtin_constant_p (0) | ||
3951 | + && (0) == ~(USItype) 0) | ||
3952 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3953 | + "rI" (((unsigned long) 1 << | ||
3954 | + 3))); | ||
3955 | + else | ||
3956 | + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0), | ||
3957 | + "rI" (((unsigned long) 1 << | ||
3958 | + 3))); | ||
3959 | + } | ||
3960 | + while (0); | ||
3961 | + } | ||
3962 | + while (0); | ||
3963 | + break; | ||
3964 | + case 3: | ||
3965 | + do | ||
3966 | + { | ||
3967 | + if (R_s && ((R_f0) & 7)) | ||
3968 | + do | ||
3969 | + { | ||
3970 | + if (__builtin_constant_p (0) && (0) == 0) | ||
3971 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3972 | + "rI" (((unsigned long) 1 << | ||
3973 | + 3))); | ||
3974 | + else if (__builtin_constant_p (0) | ||
3975 | + && (0) == ~(USItype) 0) | ||
3976 | + __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0), | ||
3977 | + "rI" (((unsigned long) 1 << | ||
3978 | + 3))); | ||
3979 | + else | ||
3980 | + __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0), | ||
3981 | + "rI" (((unsigned long) 1 << | ||
3982 | + 3))); | ||
3983 | + } | ||
3984 | + while (0); | ||
3985 | + } | ||
3986 | + while (0); | ||
3987 | + break; | ||
3988 | + } | ||
3989 | + } | ||
3990 | + while (0); | ||
3991 | + if ((R_f1) & (((unsigned long) 1 << (3 + 53) % 32) >> 1)) | ||
3992 | + { | ||
3993 | + (R_f1) &= ~(((unsigned long) 1 << (3 + 53) % 32) >> 1); | ||
3994 | + R_e++; | ||
3995 | + if (R_e == 2047) | ||
3996 | + do | ||
3997 | + { | ||
3998 | + if (0 == 0 || (0 == 2 && !R_s) || (0 == 3 && R_s)) | ||
3999 | + { | ||
4000 | + R_e = 2047; | ||
4001 | + (R_f0 = 0, R_f1 = 0); | ||
4002 | + } | ||
4003 | + else | ||
4004 | + { | ||
4005 | + R_e = 2047 - 1; | ||
4006 | + _fex |= (0); | ||
4007 | + _fex |= (0); | ||
4008 | + (R_f0 = (~(signed long) 0), R_f1 = | ||
4009 | + (~(signed long) 0)); | ||
4010 | + } | ||
4011 | + } | ||
4012 | + while (0); | ||
4013 | + } | ||
4014 | + (void) (((3) < 32) ? ( | ||
4015 | + { | ||
4016 | + R_f0 = R_f0 >> (3) | R_f1 << (32 - (3)); R_f1 >>= (3);}):( | ||
4017 | + { | ||
4018 | + R_f0 = R_f1 >> ((3) - 32); R_f1 = 0;})); | ||
4019 | + if (!(((R_e + 1) & 2047) > 1) && !((R_f1 | R_f0) == 0)) | ||
4020 | + { | ||
4021 | + if (R_e == 0) | ||
4022 | + _fex |= (0); | ||
4023 | + else | ||
4024 | + { | ||
4025 | + if (!1) | ||
4026 | + { | ||
4027 | + (R_f0 = -1, R_f1 = | ||
4028 | + ((((unsigned long) 1 << (53 - 2) % 32) << 1) - 1)); | ||
4029 | + R_s = 0; | ||
4030 | + } | ||
4031 | + else | ||
4032 | + (R_f1) |= ((unsigned long) 1 << (53 - 2) % 32); | ||
4033 | + } | ||
4034 | + } | ||
4035 | + } | ||
4036 | + while (0); | ||
4037 | + do | ||
4038 | + { | ||
4039 | + union _FP_UNION_D _flo; | ||
4040 | + _flo.bits.frac0 = R_f0; | ||
4041 | + _flo.bits.frac1 = R_f1; | ||
4042 | + _flo.bits.exp = R_e; | ||
4043 | + _flo.bits.sign = R_s; | ||
4044 | + (r) = _flo.flt; | ||
4045 | + } | ||
4046 | + while (0); | ||
4047 | + } | ||
4048 | + while (0); | ||
4049 | + | ||
4050 | +/* FP_HANDLE_EXCEPTIONS */ | ||
4051 | + do | ||
4052 | + { | ||
4053 | + } | ||
4054 | + while (0); | ||
4055 | + | ||
4056 | + return r; | ||
4057 | +} | ||
4058 | + | ||
4059 | + | ||
4060 | +#endif | ||
4061 | + | ||
4062 | #endif | ||
4063 | diff -urN gcc42-trunc-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver gcc42-patched-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver | ||
4064 | --- gcc42-trunc-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver 2006-08-02 11:07:16.000000000 -0500 | ||
4065 | +++ gcc42-patched-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver 2006-09-01 08:28:29.000000000 -0500 | ||
4066 | @@ -21,11 +21,32 @@ | ||
4067 | %else | ||
4068 | GCC_3.4.4 { | ||
4069 | %endif | ||
4070 | +%else | ||
4071 | +GCC_4.2.0 { | ||
4072 | +%endif | ||
4073 | |||
4074 | # long double support | ||
4075 | __gcc_qadd | ||
4076 | __gcc_qsub | ||
4077 | __gcc_qmul | ||
4078 | __gcc_qdiv | ||
4079 | -} | ||
4080 | + | ||
4081 | +%ifdef _SOFT_FLOAT | ||
4082 | + __gcc_qneg | ||
4083 | + __gcc_qeq | ||
4084 | + __gcc_qne | ||
4085 | + __gcc_ggt | ||
4086 | + __gcc_qge | ||
4087 | + __gcc_qlt | ||
4088 | + __gcc_qle | ||
4089 | + __gcc_qunord | ||
4090 | + __gcc_stoq | ||
4091 | + __gcc_dtoq | ||
4092 | + __gcc_qtos | ||
4093 | + __gcc_qtod | ||
4094 | + __gcc_qtoi | ||
4095 | + __gcc_qtou | ||
4096 | + __gcc_itoq | ||
4097 | + __gcc_utoq | ||
4098 | %endif | ||
4099 | +} | ||
4100 | diff -urN gcc42-trunc-20060802/gcc/config/rs6000/rs6000.c gcc42-patched-20060802/gcc/config/rs6000/rs6000.c | ||
4101 | --- gcc42-trunc-20060802/gcc/config/rs6000/rs6000.c 2006-08-02 11:07:16.000000000 -0500 | ||
4102 | +++ gcc42-patched-20060802/gcc/config/rs6000/rs6000.c 2006-09-01 08:28:29.000000000 -0500 | ||
4103 | @@ -4016,8 +4016,7 @@ | ||
4104 | |||
4105 | /* 128-bit constant floating-point values on Darwin should really be | ||
4106 | loaded as two parts. */ | ||
4107 | - if (!TARGET_IEEEQUAD | ||
4108 | - && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128 | ||
4109 | + if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128 | ||
4110 | && mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE) | ||
4111 | { | ||
4112 | /* DImode is used, not DFmode, because simplify_gen_subreg doesn't | ||
4113 | @@ -9175,9 +9174,6 @@ | ||
4114 | static void | ||
4115 | rs6000_init_libfuncs (void) | ||
4116 | { | ||
4117 | - if (!TARGET_HARD_FLOAT) | ||
4118 | - return; | ||
4119 | - | ||
4120 | if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF | ||
4121 | && !TARGET_POWER2 && !TARGET_POWERPC) | ||
4122 | { | ||
4123 | @@ -9196,6 +9192,27 @@ | ||
4124 | set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub"); | ||
4125 | set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul"); | ||
4126 | set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv"); | ||
4127 | + | ||
4128 | + if (TARGET_SOFT_FLOAT) | ||
4129 | + { | ||
4130 | + set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg"); | ||
4131 | + set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq"); | ||
4132 | + set_optab_libfunc (ne_optab, TFmode, "__gcc_qne"); | ||
4133 | + set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt"); | ||
4134 | + set_optab_libfunc (ge_optab, TFmode, "__gcc_qge"); | ||
4135 | + set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt"); | ||
4136 | + set_optab_libfunc (le_optab, TFmode, "__gcc_qle"); | ||
4137 | + set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord"); | ||
4138 | + | ||
4139 | + set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq"); | ||
4140 | + set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq"); | ||
4141 | + set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos"); | ||
4142 | + set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod"); | ||
4143 | + set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi"); | ||
4144 | + set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou"); | ||
4145 | + set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq"); | ||
4146 | + set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq"); | ||
4147 | + } | ||
4148 | } | ||
4149 | else | ||
4150 | { | ||
4151 | diff -urN gcc42-trunc-20060802/gcc/config/rs6000/rs6000.md gcc42-patched-20060802/gcc/config/rs6000/rs6000.md | ||
4152 | --- gcc42-trunc-20060802/gcc/config/rs6000/rs6000.md 2006-08-02 11:07:16.000000000 -0500 | ||
4153 | +++ gcc42-patched-20060802/gcc/config/rs6000/rs6000.md 2006-09-01 08:28:29.000000000 -0500 | ||
4154 | @@ -7920,42 +7920,44 @@ | ||
4155 | "") | ||
4156 | |||
4157 | (define_insn "*movcc_internal1" | ||
4158 | - [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,?y,r,r,r,r,q,cl,r,m") | ||
4159 | - (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,h,r,r,m,r"))] | ||
4160 | + [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,?y,y,r,r,r,r,r,q,cl,r,m") | ||
4161 | + (match_operand:CC 1 "general_operand" "y,r,r,O,x,y,r,I,h,r,r,m,r"))] | ||
4162 | "register_operand (operands[0], CCmode) | ||
4163 | || register_operand (operands[1], CCmode)" | ||
4164 | "@ | ||
4165 | mcrf %0,%1 | ||
4166 | mtcrf 128,%1 | ||
4167 | {rlinm|rlwinm} %1,%1,%F0,0xffffffff\;mtcrf %R0,%1\;{rlinm|rlwinm} %1,%1,%f0,0xffffffff | ||
4168 | + crxor %0,%0,%0 | ||
4169 | mfcr %0%Q1 | ||
4170 | mfcr %0%Q1\;{rlinm|rlwinm} %0,%0,%f1,0xf0000000 | ||
4171 | mr %0,%1 | ||
4172 | + {lil|li} %0,%1 | ||
4173 | mf%1 %0 | ||
4174 | mt%0 %1 | ||
4175 | mt%0 %1 | ||
4176 | {l%U1%X1|lwz%U1%X1} %0,%1 | ||
4177 | {st%U0%U1|stw%U0%U1} %1,%0" | ||
4178 | [(set (attr "type") | ||
4179 | - (cond [(eq_attr "alternative" "0") | ||
4180 | + (cond [(eq_attr "alternative" "0,3") | ||
4181 | (const_string "cr_logical") | ||
4182 | (eq_attr "alternative" "1,2") | ||
4183 | (const_string "mtcr") | ||
4184 | - (eq_attr "alternative" "5,7") | ||
4185 | + (eq_attr "alternative" "6,7,9") | ||
4186 | (const_string "integer") | ||
4187 | - (eq_attr "alternative" "6") | ||
4188 | - (const_string "mfjmpr") | ||
4189 | (eq_attr "alternative" "8") | ||
4190 | + (const_string "mfjmpr") | ||
4191 | + (eq_attr "alternative" "10") | ||
4192 | (const_string "mtjmpr") | ||
4193 | - (eq_attr "alternative" "9") | ||
4194 | + (eq_attr "alternative" "11") | ||
4195 | (const_string "load") | ||
4196 | - (eq_attr "alternative" "10") | ||
4197 | + (eq_attr "alternative" "12") | ||
4198 | (const_string "store") | ||
4199 | (ne (symbol_ref "TARGET_MFCRF") (const_int 0)) | ||
4200 | (const_string "mfcrf") | ||
4201 | ] | ||
4202 | (const_string "mfcr"))) | ||
4203 | - (set_attr "length" "4,4,12,4,8,4,4,4,4,4,4")]) | ||
4204 | + (set_attr "length" "4,4,12,4,4,8,4,4,4,4,4,4,4")]) | ||
4205 | |||
4206 | ;; For floating-point, we normally deal with the floating-point registers | ||
4207 | ;; unless -msoft-float is used. The sole exception is that parameter passing | ||
4208 | @@ -8313,8 +8315,7 @@ | ||
4209 | (define_expand "movtf" | ||
4210 | [(set (match_operand:TF 0 "general_operand" "") | ||
4211 | (match_operand:TF 1 "any_operand" ""))] | ||
4212 | - "!TARGET_IEEEQUAD | ||
4213 | - && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128" | ||
4214 | + "!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128" | ||
4215 | "{ rs6000_emit_move (operands[0], operands[1], TFmode); DONE; }") | ||
4216 | |||
4217 | ; It's important to list the o->f and f->o moves before f->f because | ||
4218 | @@ -8333,6 +8334,19 @@ | ||
4219 | { rs6000_split_multireg_move (operands[0], operands[1]); DONE; } | ||
4220 | [(set_attr "length" "8,8,8,20,20,16")]) | ||
4221 | |||
4222 | +(define_insn_and_split "*movtf_softfloat" | ||
4223 | + [(set (match_operand:TF 0 "nonimmediate_operand" "=r,Y,r") | ||
4224 | + (match_operand:TF 1 "input_operand" "YGHF,r,r"))] | ||
4225 | + "!TARGET_IEEEQUAD | ||
4226 | + && (TARGET_SOFT_FLOAT || !TARGET_FPRS) && TARGET_LONG_DOUBLE_128 | ||
4227 | + && (gpc_reg_operand (operands[0], TFmode) | ||
4228 | + || gpc_reg_operand (operands[1], TFmode))" | ||
4229 | + "#" | ||
4230 | + "&& reload_completed" | ||
4231 | + [(pc)] | ||
4232 | +{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; } | ||
4233 | + [(set_attr "length" "20,20,16")]) | ||
4234 | + | ||
4235 | (define_expand "extenddftf2" | ||
4236 | [(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "") | ||
4237 | (float_extend:TF (match_operand:DF 1 "input_operand" ""))) | ||
4238 | diff -urN gcc42-trunc-20060802/gcc/config/rs6000/sysv4.h gcc42-patched-20060802/gcc/config/rs6000/sysv4.h | ||
4239 | --- gcc42-trunc-20060802/gcc/config/rs6000/sysv4.h 2006-08-02 11:07:16.000000000 -0500 | ||
4240 | +++ gcc42-patched-20060802/gcc/config/rs6000/sysv4.h 2006-09-01 08:28:29.000000000 -0500 | ||
4241 | @@ -215,10 +215,6 @@ | ||
4242 | error ("-msecure-plt not supported by your assembler"); \ | ||
4243 | } \ | ||
4244 | \ | ||
4245 | - if (TARGET_SOFT_FLOAT && TARGET_LONG_DOUBLE_128 \ | ||
4246 | - && rs6000_explicit_options.long_double) \ | ||
4247 | - warning (0, "-msoft-float and -mlong-double-128 not supported"); \ | ||
4248 | - \ | ||
4249 | /* Treat -fPIC the same as -mrelocatable. */ \ | ||
4250 | if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX) \ | ||
4251 | { \ | ||
4252 | diff -urN gcc42-trunc-20060802/gcc/config/rs6000/t-ppccomm gcc42-patched-20060802/gcc/config/rs6000/t-ppccomm | ||
4253 | --- gcc42-trunc-20060802/gcc/config/rs6000/t-ppccomm 2006-08-02 11:07:16.000000000 -0500 | ||
4254 | +++ gcc42-patched-20060802/gcc/config/rs6000/t-ppccomm 2006-09-01 08:28:29.000000000 -0500 | ||
4255 | @@ -12,15 +12,8 @@ | ||
4256 | cat $(srcdir)/config/rs6000/tramp.asm > tramp.S | ||
4257 | |||
4258 | ifneq (,$findstring gnu,$(target)) | ||
4259 | -TARGET_LIBGCC2_CFLAGS += -specs=ldblspecs | ||
4260 | - | ||
4261 | +TARGET_LIBGCC2_CFLAGS += -mlong-double-128 | ||
4262 | SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc-glibc.ver | ||
4263 | - | ||
4264 | -# Hack to use -mlong-double-128 only when not compiling nof libgcc | ||
4265 | -mklibgcc: ldblspecs | ||
4266 | - | ||
4267 | -ldblspecs: specs | ||
4268 | - sed -e '/cc1_options/{ n; s/$$/ %{!msoft-float:-mlong-double-128}/; }' < specs > $@ | ||
4269 | endif | ||
4270 | |||
4271 | # Switch synonyms | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/sh3-installfix-fixheaders.patch b/meta/packages/gcc/gcc-4.1.1/sh3-installfix-fixheaders.patch deleted file mode 100644 index a06cd2e075..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/sh3-installfix-fixheaders.patch +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | --- gcc-4.1.1/gcc/Makefile.in_orig 2007-01-31 21:24:23.000000000 +0000 | ||
2 | +++ gcc-4.1.1/gcc/Makefile.in 2007-01-31 21:24:43.000000000 +0000 | ||
3 | @@ -3772,8 +3772,6 @@ | ||
4 | $(INSTALL_SCRIPT) $(mkinstalldirs) \ | ||
5 | $(DESTDIR)$(itoolsdir)/mkinstalldirs ; \ | ||
6 | $(INSTALL_SCRIPT) $(srcdir)/fixproto $(DESTDIR)$(itoolsdir)/fixproto ; \ | ||
7 | - $(INSTALL_PROGRAM) build/fix-header$(build_exeext) \ | ||
8 | - $(DESTDIR)$(itoolsdir)/fix-header$(build_exeext) ; \ | ||
9 | else :; fi | ||
10 | echo 'SYSTEM_HEADER_DIR="'"$(SYSTEM_HEADER_DIR)"'"' \ | ||
11 | > $(DESTDIR)$(itoolsdatadir)/mkheaders.conf | ||
diff --git a/meta/packages/gcc/gcc-4.1.1/unbreak-armv4t.patch b/meta/packages/gcc/gcc-4.1.1/unbreak-armv4t.patch deleted file mode 100644 index b3399abfdb..0000000000 --- a/meta/packages/gcc/gcc-4.1.1/unbreak-armv4t.patch +++ /dev/null | |||
@@ -1,12 +0,0 @@ | |||
1 | diff -urN gcc-4.1.1/gcc/config/arm/linux-eabi.h gcc-4.1.1-arm9tdmi/gcc/config/arm/linux-eabi.h | ||
2 | --- gcc-4.1.1/gcc/config/arm/linux-eabi.h 2006-10-22 11:11:49.000000000 -0700 | ||
3 | +++ gcc-4.1.1-arm9tdmi/gcc/config/arm/linux-eabi.h 2006-10-24 21:34:01.000000000 -0700 | ||
4 | @@ -45,7 +45,7 @@ | ||
5 | The ARM10TDMI core is the default for armv5t, so set | ||
6 | SUBTARGET_CPU_DEFAULT to achieve this. */ | ||
7 | #undef SUBTARGET_CPU_DEFAULT | ||
8 | -#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi | ||
9 | +#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi | ||
10 | |||
11 | #undef SUBTARGET_EXTRA_LINK_SPEC | ||
12 | #define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux_eabi" | ||
diff --git a/meta/packages/gcc/gcc-4.1.2.inc b/meta/packages/gcc/gcc-4.1.2.inc new file mode 100644 index 0000000000..fdce5afc2b --- /dev/null +++ b/meta/packages/gcc/gcc-4.1.2.inc | |||
@@ -0,0 +1,60 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | DEPENDS = "mpfr gmp" | ||
4 | |||
5 | SRC_URI = "ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2 \ | ||
6 | file://100-uclibc-conf.patch;patch=1 \ | ||
7 | file://110-arm-eabi.patch;patch=1 \ | ||
8 | file://200-uclibc-locale.patch;patch=1 \ | ||
9 | file://300-libstdc++-pic.patch;patch=1 \ | ||
10 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
11 | file://302-c99-snprintf.patch;patch=1 \ | ||
12 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
13 | file://304-index_macro.patch;patch=1 \ | ||
14 | file://602-sdk-libstdc++-includes.patch;patch=1 \ | ||
15 | file://740-sh-pr24836.patch;patch=1 \ | ||
16 | file://800-arm-bigendian.patch;patch=1 \ | ||
17 | file://arm-nolibfloat.patch;patch=1 \ | ||
18 | file://arm-softfloat.patch;patch=1 \ | ||
19 | file://gcc41-configure.in.patch;patch=1 \ | ||
20 | file://arm-thumb.patch;patch=1 \ | ||
21 | file://arm-thumb-cache.patch;patch=1 \ | ||
22 | file://ldflags.patch;patch=1 \ | ||
23 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
24 | file://unbreak-armv4t.patch;patch=1 \ | ||
25 | file://fix-ICE-in-arm_unwind_emit_set.diff;patch=1 \ | ||
26 | file://cache-amnesia.patch;patch=1 \ | ||
27 | file://gfortran.patch;patch=1 \ | ||
28 | file://gcc-4.0.2-e300c2c3.patch;patch=1 \ | ||
29 | file://pr34130.patch;patch=1 \ | ||
30 | " | ||
31 | |||
32 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " | ||
33 | |||
34 | SRC_URI_avr32 = "http://www.angstrom-distribution.org/unstable/sources/gcc-4.1.2-atmel.1.1.0.tar.gz \ | ||
35 | # file://100-uclibc-conf.patch;patch=1 \ | ||
36 | # file://200-uclibc-locale.patch;patch=1 \ | ||
37 | # file://300-libstdc++-pic.patch;patch=1 \ | ||
38 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
39 | file://302-c99-snprintf.patch;patch=1 \ | ||
40 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
41 | file://304-index_macro.patch;patch=1 \ | ||
42 | file://602-sdk-libstdc++-includes.patch;patch=1 \ | ||
43 | file://gcc41-configure.in.patch;patch=1 \ | ||
44 | file://ldflags.patch;patch=1 \ | ||
45 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
46 | file://cache-amnesia.patch;patch=1 \ | ||
47 | " | ||
48 | |||
49 | do_compile_prepend_avr32() { | ||
50 | ln -sf ${S}/libstdc++-v3/config/os/uclibc/ ${S}/libstdc++-v3/config/os/uclibc-linux | ||
51 | } | ||
52 | |||
53 | |||
54 | # Language Overrides | ||
55 | FORTRAN = "" | ||
56 | JAVA = "" | ||
57 | |||
58 | EXTRA_OECONF += " --disable-libssp " | ||
59 | |||
60 | ARM_INSTRUCTION_SET = "arm" | ||
diff --git a/meta/packages/gcc/gcc-4.2.2.inc b/meta/packages/gcc/gcc-4.2.2.inc new file mode 100644 index 0000000000..2674fccdbe --- /dev/null +++ b/meta/packages/gcc/gcc-4.2.2.inc | |||
@@ -0,0 +1,74 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | DEPENDS = "mpfr gmp" | ||
4 | |||
5 | SRC_URI = "ftp://ftp.gnu.org/pub/gnu/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | ||
6 | file://100-uclibc-conf.patch;patch=1 \ | ||
7 | file://103-uclibc-conf-noupstream.patch;patch=1 \ | ||
8 | file://200-uclibc-locale.patch;patch=1 \ | ||
9 | file://203-uclibc-locale-no__x.patch;patch=1 \ | ||
10 | file://204-uclibc-locale-wchar_fix.patch;patch=1 \ | ||
11 | file://205-uclibc-locale-update.patch;patch=1 \ | ||
12 | file://300-libstdc++-pic.patch;patch=1 \ | ||
13 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
14 | file://302-c99-snprintf.patch;patch=1 \ | ||
15 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
16 | file://304-index_macro.patch;patch=1 \ | ||
17 | file://305-libmudflap-susv3-legacy.patch;patch=1 \ | ||
18 | file://306-libstdc++-namespace.patch;patch=1 \ | ||
19 | file://307-locale_facets.patch;patch=1 \ | ||
20 | file://402-libbackend_dep_gcov-iov.h.patch;patch=1 \ | ||
21 | file://602-sdk-libstdc++-includes.patch;patch=1 \ | ||
22 | file://740-sh-pr24836.patch;patch=1 \ | ||
23 | file://800-arm-bigendian.patch;patch=1 \ | ||
24 | file://801-arm-bigendian-eabi.patch;patch=1 \ | ||
25 | file://904-flatten-switch-stmt-00.patch;patch=1 \ | ||
26 | file://arm-nolibfloat.patch;patch=1 \ | ||
27 | file://arm-softfloat.patch;patch=1 \ | ||
28 | file://gcc41-configure.in.patch;patch=1 \ | ||
29 | file://arm-thumb.patch;patch=1 \ | ||
30 | file://arm-thumb-cache.patch;patch=1 \ | ||
31 | file://ldflags.patch;patch=1 \ | ||
32 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
33 | file://unbreak-armv4t.patch;patch=1 \ | ||
34 | file://fix-ICE-in-arm_unwind_emit_set.diff;patch=1 \ | ||
35 | file://cache-amnesia.patch;patch=1 \ | ||
36 | file://gfortran.patch;patch=1 \ | ||
37 | file://gcc-4.0.2-e300c2c3.patch;patch=1 \ | ||
38 | file://pr34130.patch;patch=1 \ | ||
39 | file://fortran-static-linking.patch;patch=1 \ | ||
40 | file://intermask-bigendian.patch;patch=1 \ | ||
41 | " | ||
42 | |||
43 | SRC_URI_append_ep93xx = " \ | ||
44 | file://arm-crunch-saveregs.patch;patch=1 \ | ||
45 | file://arm-crunch-20000320.patch;patch=1 \ | ||
46 | file://arm-crunch-compare.patch;patch=1 \ | ||
47 | file://arm-crunch-compare-unordered.patch;patch=1 \ | ||
48 | file://arm-crunch-compare-geu.patch;patch=1 \ | ||
49 | file://arm-crunch-eabi-ieee754.patch;patch=1 \ | ||
50 | file://arm-crunch-eabi-ieee754-div.patch;patch=1 \ | ||
51 | file://arm-crunch-64bit-disable0.patch;patch=1 \ | ||
52 | file://arm-crunch-offset.patch;patch=1 \ | ||
53 | file://arm-crunch-fp_consts.patch;patch=1 \ | ||
54 | file://arm-crunch-neg2.patch;patch=1 \ | ||
55 | file://arm-crunch-predicates3.patch;patch=1 \ | ||
56 | file://arm-crunch-cfcvtds-disable.patch;patch=1 \ | ||
57 | file://arm-crunch-floatsi-disable.patch;patch=1 \ | ||
58 | file://arm-crunch-truncsi-disable.patch;patch=1 \ | ||
59 | file://arm-crunch-cfcvt64-disable.patch;patch=1 \ | ||
60 | file://arm-crunch-cirrus-bugfixes.patch;patch=1 \ | ||
61 | " | ||
62 | |||
63 | PACKAGE_ARCH_ep93xx = "${MACHINE_ARCH}" | ||
64 | |||
65 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " | ||
66 | |||
67 | # Language Overrides | ||
68 | FORTRAN = "" | ||
69 | FORTRAN_linux-gnueabi = ",fortran" | ||
70 | JAVA = "" | ||
71 | |||
72 | EXTRA_OECONF += " --disable-libssp --disable-bootstrap " | ||
73 | |||
74 | ARM_INSTRUCTION_SET = "arm" \ No newline at end of file | ||
diff --git a/meta/packages/gcc/gcc-common.inc b/meta/packages/gcc/gcc-common.inc new file mode 100644 index 0000000000..1097614969 --- /dev/null +++ b/meta/packages/gcc/gcc-common.inc | |||
@@ -0,0 +1,35 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | |||
6 | inherit autotools gettext | ||
7 | |||
8 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | ||
9 | |||
10 | def get_gcc_fpu_setting(bb, d): | ||
11 | if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ]: | ||
12 | return "--with-float=soft" | ||
13 | return "" | ||
14 | |||
15 | # We really need HOST_SYS here for some packages and TARGET_SYS for others. | ||
16 | # For now, libgcc is most important so we fix for that - RP. | ||
17 | SHLIBSDIR = "${STAGING_DIR}/${TARGET_SYS}/shlibs" | ||
18 | |||
19 | DEBIANNAME_libgcc = "libgcc1" | ||
20 | |||
21 | MIRRORS_prepend () { | ||
22 | ${GNU_MIRROR}/gcc/releases/ ftp://gcc.gnu.org/pub/gcc/releases/ | ||
23 | ${GNU_MIRROR}/gcc/ http://mirrors.rcn.net/pub/sourceware/gcc/releases/ | ||
24 | ${GNU_MIRROR}/gcc/releases/ http://gcc.get-software.com/releases/ | ||
25 | ${GNU_MIRROR}/gcc/ http://gcc.get-software.com/releases/ | ||
26 | } | ||
27 | |||
28 | # | ||
29 | # Set some default values | ||
30 | # | ||
31 | gcclibdir = "${libdir}/gcc" | ||
32 | BINV = "${PV}" | ||
33 | S = "${WORKDIR}/gcc-${PV}" | ||
34 | B = "${S}/build.${HOST_SYS}.${TARGET_SYS}" | ||
35 | |||
diff --git a/meta/packages/gcc/gcc3-build.inc b/meta/packages/gcc/gcc-configure-common.inc index 2924f0f9dd..9971c08c20 100644 --- a/meta/packages/gcc/gcc3-build.inc +++ b/meta/packages/gcc/gcc-configure-common.inc | |||
@@ -1,22 +1,15 @@ | |||
1 | MIRRORS_prepend () { | 1 | # |
2 | ${GNU_MIRROR}/gcc/releases/ ftp://gcc.gnu.org/pub/gcc/releases/ | 2 | # Build the list of lanaguages to build. |
3 | ${GNU_MIRROR}/gcc/ http://mirrors.rcn.net/pub/sourceware/gcc/releases/ | 3 | # |
4 | ${GNU_MIRROR}/gcc/releases/ http://gcc.get-software.com/releases/ | 4 | # These can be overridden by the version specific .inc file. |
5 | ${GNU_MIRROR}/gcc/ http://gcc.get-software.com/releases/ | ||
6 | } | ||
7 | |||
8 | gcclibdir ?= "${libdir}/gcc" | ||
9 | S = "${WORKDIR}/gcc-${PV}" | ||
10 | B = "${S}/build.${HOST_SYS}.${TARGET_SYS}" | ||
11 | BINV ?= "${PV}" | ||
12 | 5 | ||
13 | # gcj doesn't work on some architectures | 6 | # Java (gcj doesn't work on all architectures) |
14 | JAVA ?= ",java" | 7 | JAVA ?= ",java" |
15 | JAVA_arm ?= "" | 8 | JAVA_arm ?= "" |
16 | JAVA_armeb ?= "" | 9 | JAVA_armeb ?= "" |
17 | JAVA_mipsel ?= "" | 10 | JAVA_mipsel ?= "" |
18 | JAVA_sh3 ?= "" | 11 | JAVA_sh3 ?= "" |
19 | # gcc4-build sets this to f95 | 12 | # gcc 3.x expects 'f77', 4.0 expects 'f95', 4.1 and 4.2 expect 'fortran' |
20 | FORTRAN ?= ",f77" | 13 | FORTRAN ?= ",f77" |
21 | LANGUAGES ?= "c,c++${FORTRAN}${JAVA}" | 14 | LANGUAGES ?= "c,c++${FORTRAN}${JAVA}" |
22 | 15 | ||
@@ -32,16 +25,13 @@ EXTRA_OECONF = "${@['--enable-clocale=generic', ''][bb.data.getVar('USE_NLS', d, | |||
32 | --enable-symvers=gnu \ | 25 | --enable-symvers=gnu \ |
33 | --enable-libstdcxx-pch \ | 26 | --enable-libstdcxx-pch \ |
34 | --program-prefix=${TARGET_PREFIX} \ | 27 | --program-prefix=${TARGET_PREFIX} \ |
35 | ${EXTRA_OECONF_PATHS} \ | 28 | ${EXTRA_OECONF_PATHS}" |
36 | ${EXTRA_OECONF_DEP}" | ||
37 | 29 | ||
38 | EXTRA_OECONF_PATHS = " \ | 30 | # Build uclibc compilers without cxa_atexit support |
39 | --with-local-prefix=${prefix}/local \ | 31 | EXTRA_OECONF_append_linux = " --enable-__cxa_atexit" |
40 | --with-gxx-include-dir=${includedir}/c++/${BINV}" | 32 | EXTRA_OECONF_append_linux-gnueabi = " --enable-__cxa_atexit" |
41 | 33 | EXTRA_OECONF_append_linux-uclibc = " --disable-__cxa_atexit" | |
42 | EXTRA_OECONF_DEP = "" | 34 | EXTRA_OECONF_append_linux-uclibcgnueabi = " --disable-__cxa_atexit" |
43 | EXTRA_OECONF_uclibc = "--disable-__cxa_atexit" | ||
44 | EXTRA_OECONF_glibc = "--enable-__cxa_atexit" | ||
45 | EXTRA_OECONF += "${@get_gcc_fpu_setting(bb, d)}" | 35 | EXTRA_OECONF += "${@get_gcc_fpu_setting(bb, d)}" |
46 | CPPFLAGS = "" | 36 | CPPFLAGS = "" |
47 | 37 | ||
@@ -54,21 +44,6 @@ ARCH_FLAGS_FOR_TARGET_slugos = "${TARGET_CC_ARCH}" | |||
54 | ARCH_FLAGS_FOR_TARGET_unslung = "${TARGET_CC_ARCH}" | 44 | ARCH_FLAGS_FOR_TARGET_unslung = "${TARGET_CC_ARCH}" |
55 | EXTRA_OEMAKE += "ARCH_FLAGS_FOR_TARGET='${ARCH_FLAGS_FOR_TARGET}'" | 45 | EXTRA_OEMAKE += "ARCH_FLAGS_FOR_TARGET='${ARCH_FLAGS_FOR_TARGET}'" |
56 | 46 | ||
57 | require gcc-fpu.inc | ||
58 | |||
59 | python __anonymous () { | ||
60 | import bb, re | ||
61 | if (re.match('linux-uclibc$', bb.data.getVar('TARGET_OS', d, 1)) != None): | ||
62 | bb.data.setVar('EXTRA_OECONF_DEP', '${EXTRA_OECONF_uclibc}', d) | ||
63 | elif (re.match('linux-uclibcgnueabi$', bb.data.getVar('TARGET_OS', d, 1)) != None): | ||
64 | bb.data.setVar('EXTRA_OECONF_DEP', '${EXTRA_OECONF_uclibc}', d) | ||
65 | elif (re.match('linux-gnueabi$', bb.data.getVar('TARGET_OS', d, 1)) != None): | ||
66 | bb.data.setVar('EXTRA_OECONF_DEP', '${EXTRA_OECONF_glibc}', d) | ||
67 | elif (re.match('linux$', bb.data.getVar('TARGET_OS', d, 1)) != None): | ||
68 | bb.data.setVar('EXTRA_OECONF_DEP', '${EXTRA_OECONF_glibc}', d) | ||
69 | |||
70 | } | ||
71 | |||
72 | do_configure () { | 47 | do_configure () { |
73 | # Setup these vars for cross building only | 48 | # Setup these vars for cross building only |
74 | # ... because foo_FOR_TARGET apparently gets misinterpreted inside the | 49 | # ... because foo_FOR_TARGET apparently gets misinterpreted inside the |
@@ -96,3 +71,4 @@ do_configure () { | |||
96 | (cd ${S} && gnu-configize) || die "failure running gnu-configize" | 71 | (cd ${S} && gnu-configize) || die "failure running gnu-configize" |
97 | oe_runconf | 72 | oe_runconf |
98 | } | 73 | } |
74 | |||
diff --git a/meta/packages/gcc/gcc3-build-cross.inc b/meta/packages/gcc/gcc-configure-cross.inc index 6a0d132a7d..ca7a6b5869 100644 --- a/meta/packages/gcc/gcc3-build-cross.inc +++ b/meta/packages/gcc/gcc-configure-cross.inc | |||
@@ -1,3 +1,5 @@ | |||
1 | require gcc-configure-common.inc | ||
2 | |||
1 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibc", "no", "", d )}' | 3 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibc", "no", "", d )}' |
2 | 4 | ||
3 | EXTRA_OECONF_PATHS = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ | 5 | EXTRA_OECONF_PATHS = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ |
@@ -18,14 +20,20 @@ do_compile_prepend () { | |||
18 | export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc ${TARGET_CC_ARCH}" | 20 | export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc ${TARGET_CC_ARCH}" |
19 | } | 21 | } |
20 | 22 | ||
23 | LIBGCCS_VAR = "-lgcc_s" | ||
24 | LIBGCCS_VAR_avr32 = "" | ||
25 | |||
21 | do_stage_append () { | 26 | do_stage_append () { |
22 | for d in info man share/doc share/locale ; do | 27 | for d in info man share/doc share/locale ; do |
23 | rm -rf ${CROSS_DIR}/$d | 28 | rm -rf ${CROSS_DIR}/$d |
24 | done | 29 | done |
25 | 30 | ||
26 | # These aren't useful on the cross toolchain | 31 | # Fix a few include links so cross builds are happier |
27 | rm -f ${CROSS_DIR}/bin/*gcov | 32 | if [ ! -e ${STAGING_INCDIR}/c++ ]; then |
28 | rm -f ${CROSS_DIR}/bin/*gccbug | 33 | mkdir -p ${STAGING_INCDIR} |
34 | ln -sf ${CROSS_DIR}/${TARGET_SYS}/include/c++ \ | ||
35 | ${STAGING_INCDIR}/ | ||
36 | fi | ||
29 | 37 | ||
30 | # We use libiberty from binutils | 38 | # We use libiberty from binutils |
31 | rm -f ${CROSS_DIR}/lib/libiberty.a | 39 | rm -f ${CROSS_DIR}/lib/libiberty.a |
@@ -41,8 +49,8 @@ do_stage_append () { | |||
41 | done | 49 | done |
42 | 50 | ||
43 | #fix up libsupc++ and libstdc++ la files | 51 | #fix up libsupc++ and libstdc++ la files |
44 | sed -i "s|dependency_libs\s*=\s*.*|dependency_libs='-L${CROSS_DIR}/${TARGET_SYS}/lib -lgcc_s -lc -lm '|" ${CROSS_DIR}/${TARGET_SYS}/lib/libsupc++.la || true | 52 | sed -i "s|dependency_libs\s*=\s*.*|dependency_libs='-L${CROSS_DIR}/${TARGET_SYS}/lib ${LIBGCCS_VAR} -lc -lm '|" ${CROSS_DIR}/${TARGET_SYS}/lib/libsupc++.la || true |
45 | sed -i "s|dependency_libs\s*=\s*.*|dependency_libs='-L${CROSS_DIR}/${TARGET_SYS}/lib -lgcc_s -lc -lm '|" ${CROSS_DIR}/${TARGET_SYS}/lib/libstdc++.la || true | 53 | sed -i "s|dependency_libs\s*=\s*.*|dependency_libs='-L${CROSS_DIR}/${TARGET_SYS}/lib ${LIBGCCS_VAR} -lc -lm '|" ${CROSS_DIR}/${TARGET_SYS}/lib/libstdc++.la || true |
46 | } | 54 | } |
47 | 55 | ||
48 | do_package_write_ipk[depends] += "virtual/libc:do_package" | 56 | do_package_write_ipk[depends] += "virtual/libc:do_package |
diff --git a/meta/packages/gcc/gcc-configure-sdk.inc b/meta/packages/gcc/gcc-configure-sdk.inc new file mode 100644 index 0000000000..f8c4de8c78 --- /dev/null +++ b/meta/packages/gcc/gcc-configure-sdk.inc | |||
@@ -0,0 +1,51 @@ | |||
1 | require gcc-configure-common.inc | ||
2 | |||
3 | # The two lines below conflict, this needs fixing - RP | ||
4 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibc", "no", "", d )}' | ||
5 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibcgnueabi", "no", "", d )}' | ||
6 | |||
7 | EXTRA_OECONF_PATHS = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ | ||
8 | --with-gxx-include-dir=${STAGING_DIR_TARGET}/${layout_includedir}/c++ \ | ||
9 | --with-sysroot=${prefix}/${TARGET_SYS} \ | ||
10 | --with-build-sysroot=${STAGING_DIR_TARGET}" | ||
11 | |||
12 | # | ||
13 | # gcc-cross looks and finds these in ${exec_prefix} but we're not so lucky | ||
14 | # for the sdk. Hardcoding the paths ensures the build doesn't go canadian or worse. | ||
15 | # | ||
16 | export AR_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/ar" | ||
17 | export AS_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/as" | ||
18 | export DLLTOOL_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/dlltool" | ||
19 | export LD_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/ld" | ||
20 | export LIPO_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/lipo" | ||
21 | export NM_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/nm" | ||
22 | export OBJDUMP_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/objdump" | ||
23 | export RANLIB_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/ranlib" | ||
24 | export STRIP_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/strip" | ||
25 | export WINDRES_FOR_TARGET = "${CROSS_DIR}/${TARGET_SYS}/bin/windres" | ||
26 | |||
27 | # | ||
28 | # We need to override this and make sure the compiler can find staging | ||
29 | # | ||
30 | export ARCH_FLAGS_FOR_TARGET = "--sysroot=${STAGING_DIR_TARGET}" | ||
31 | |||
32 | do_configure () { | ||
33 | export CC_FOR_BUILD="${BUILD_CC}" | ||
34 | export CXX_FOR_BUILD="${BUILD_CXX}" | ||
35 | export CFLAGS_FOR_BUILD="${BUILD_CFLAGS}" | ||
36 | export CPPFLAGS_FOR_BUILD="${BUILD_CPPFLAGS}" | ||
37 | export CXXFLAGS_FOR_BUILD="${BUILD_CXXFLAGS}" | ||
38 | export LDFLAGS_FOR_BUILD="${BUILD_LDFLAGS}" | ||
39 | (cd ${S} && gnu-configize) || die "failure running gnu-configize" | ||
40 | oe_runconf | ||
41 | } | ||
42 | |||
43 | do_compile () { | ||
44 | export CC="${BUILD_CC}" | ||
45 | export AR_FOR_TARGET="${TARGET_SYS}-ar" | ||
46 | export RANLIB_FOR_TARGET="${TARGET_SYS}-ranlib" | ||
47 | export LD_FOR_TARGET="${TARGET_SYS}-ld" | ||
48 | export NM_FOR_TARGET="${TARGET_SYS}-nm" | ||
49 | export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc ${TARGET_CC_ARCH}" | ||
50 | base_do_compile | ||
51 | } | ||
diff --git a/meta/packages/gcc/gcc-configure-target.inc b/meta/packages/gcc/gcc-configure-target.inc new file mode 100644 index 0000000000..04045aa541 --- /dev/null +++ b/meta/packages/gcc/gcc-configure-target.inc | |||
@@ -0,0 +1,6 @@ | |||
1 | require gcc-configure-common.inc | ||
2 | |||
3 | EXTRA_OECONF_PATHS = " \ | ||
4 | --with-local-prefix=${prefix}/local \ | ||
5 | --with-gxx-include-dir=${includedir}/c++/${BINV}" | ||
6 | |||
diff --git a/meta/packages/gcc/gcc-cross-initial.inc b/meta/packages/gcc/gcc-cross-initial.inc index 2165bf22ce..e0675263ea 100644 --- a/meta/packages/gcc/gcc-cross-initial.inc +++ b/meta/packages/gcc/gcc-cross-initial.inc | |||
@@ -1,9 +1,11 @@ | |||
1 | DEPENDS = "virtual/${TARGET_PREFIX}binutils" | 1 | DEPENDS = "virtual/${TARGET_PREFIX}binutils" |
2 | DEPENDS += "${@['virtual/${TARGET_PREFIX}libc-initial',''][bb.data.getVar('TARGET_ARCH', d, 1) in ['arm', 'armeb', 'mips', 'mipsel']]}" | 2 | # @todo Please add comment on why this is (still?) needed? |
3 | DEPENDS += "${@['virtual/${TARGET_PREFIX}libc-initial',''][bb.data.getVar('TARGET_ARCH', d, 1) in ['arm', 'armeb', 'mips', 'mipsel', 'powerpc']]}" | ||
3 | PROVIDES = "virtual/${TARGET_PREFIX}gcc-initial" | 4 | PROVIDES = "virtual/${TARGET_PREFIX}gcc-initial" |
4 | PACKAGES = "" | 5 | PACKAGES = "" |
5 | 6 | ||
6 | # This is intended to be a -very- basic config | 7 | # This is intended to be a -very- basic config |
8 | # sysroot is needed in case we use libc-initial | ||
7 | EXTRA_OECONF = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ | 9 | EXTRA_OECONF = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ |
8 | --with-newlib \ | 10 | --with-newlib \ |
9 | --disable-shared \ | 11 | --disable-shared \ |
@@ -13,6 +15,8 @@ EXTRA_OECONF = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ | |||
13 | --enable-languages=c \ | 15 | --enable-languages=c \ |
14 | --enable-target-optspace \ | 16 | --enable-target-optspace \ |
15 | --program-prefix=${TARGET_PREFIX} \ | 17 | --program-prefix=${TARGET_PREFIX} \ |
18 | --with-sysroot=${STAGING_DIR_TARGET} \ | ||
19 | --with-build-sysroot=${STAGING_DIR_TARGET} \ | ||
16 | ${@get_gcc_fpu_setting(bb, d)}" | 20 | ${@get_gcc_fpu_setting(bb, d)}" |
17 | 21 | ||
18 | do_stage_prepend () { | 22 | do_stage_prepend () { |
diff --git a/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3-2.bb b/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3-2.bb deleted file mode 100644 index 1639511362..0000000000 --- a/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3-2.bb +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | require gcc-cross_${PV}.bb | ||
2 | require gcc-cross-initial.inc | ||
diff --git a/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3.bb b/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3.bb new file mode 100644 index 0000000000..aff22fb694 --- /dev/null +++ b/meta/packages/gcc/gcc-cross-initial_csl-arm-2005q3.bb | |||
@@ -0,0 +1,2 @@ | |||
1 | require gcc-cross_csl-arm-2005q3.bb | ||
2 | require gcc-cross-initial.inc | ||
diff --git a/meta/packages/gcc/gcc-cross-kernel-3.4.4+csl-arm-2005q3-2/gcc-3.4.4-makefile-fix.patch b/meta/packages/gcc/gcc-cross-kernel-3.4.4+csl-arm-2005q3-2/gcc-3.4.4-makefile-fix.patch deleted file mode 100644 index 74c1f26833..0000000000 --- a/meta/packages/gcc/gcc-cross-kernel-3.4.4+csl-arm-2005q3-2/gcc-3.4.4-makefile-fix.patch +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | --- gcc-3.4.4/gcc/Makefile.in.orig 2005-07-25 21:00:37 +0200 | ||
2 | +++ gcc-3.4.4/gcc/Makefile.in 2005-07-25 21:01:19 +0200 | ||
3 | @@ -304,7 +304,7 @@ | ||
4 | if [ "$(host)" = "$(target)" ] ; then \ | ||
5 | echo ar; \ | ||
6 | else \ | ||
7 | - t='$(program_transform_name)'; echo ar | sed -e $$t ; \ | ||
8 | + t='$(program_transform_name)'; echo ar | sed -e "$$t" ; \ | ||
9 | fi; \ | ||
10 | fi` | ||
11 | AR_FLAGS_FOR_TARGET = | ||
12 | @@ -317,7 +317,7 @@ | ||
13 | if [ "$(host)" = "$(target)" ] ; then \ | ||
14 | echo $(RANLIB); \ | ||
15 | else \ | ||
16 | - t='$(program_transform_name)'; echo ranlib | sed -e $$t ; \ | ||
17 | + t='$(program_transform_name)'; echo ranlib | sed -e "$$t" ; \ | ||
18 | fi; \ | ||
19 | fi` | ||
20 | NM_FOR_TARGET = ` \ | ||
21 | @@ -329,7 +329,7 @@ | ||
22 | if [ "$(host)" = "$(target)" ] ; then \ | ||
23 | echo nm; \ | ||
24 | else \ | ||
25 | - t='$(program_transform_name)'; echo nm | sed -e $$t ; \ | ||
26 | + t='$(program_transform_name)'; echo nm | sed -e "$$t" ; \ | ||
27 | fi; \ | ||
28 | fi` | ||
29 | |||
diff --git a/meta/packages/gcc/gcc-cross-kernel-3.4.4_csl-arm-2005q3.bb b/meta/packages/gcc/gcc-cross-kernel-3.4.4_csl-arm-2005q3.bb new file mode 100644 index 0000000000..46a56fa339 --- /dev/null +++ b/meta/packages/gcc/gcc-cross-kernel-3.4.4_csl-arm-2005q3.bb | |||
@@ -0,0 +1,10 @@ | |||
1 | # This kernel compiler is required by the Freecom FSG-3 machine | ||
2 | # Please talk to Rod Whitby before considering removing this file. | ||
3 | |||
4 | DEFAULT_PREFERENCE = "-1" | ||
5 | |||
6 | require gcc-cross-kernel.inc | ||
7 | require gcc-cross-initial_csl-arm-2005q3.bb | ||
8 | |||
9 | SRC_URI += "file://gcc-3.4.4-makefile-fix.patch;patch=1" | ||
10 | |||
diff --git a/meta/packages/gcc/gcc-cross-kernel.inc b/meta/packages/gcc/gcc-cross-kernel.inc index 42da6fef81..fe6539b808 100644 --- a/meta/packages/gcc/gcc-cross-kernel.inc +++ b/meta/packages/gcc/gcc-cross-kernel.inc | |||
@@ -1,6 +1,5 @@ | |||
1 | SECTION = "devel" | 1 | # Cut-down gcc for kernel builds |
2 | # cut-down gcc for kernel builds | 2 | # Only installs ${TARGET_PREFIX}gcc-${PV}, not ${TARGET_PREFIX}gcc. |
3 | # only installs ${TARGET_PREFIX}gcc-${PV}, not ${TARGET_PREFIX}gcc. | ||
4 | 3 | ||
5 | PROVIDES = "virtual/${TARGET_PREFIX}gcc-${PV}" | 4 | PROVIDES = "virtual/${TARGET_PREFIX}gcc-${PV}" |
6 | 5 | ||
@@ -13,4 +12,3 @@ do_stage () { | |||
13 | oe_runmake install-common install-headers install-libgcc | 12 | oe_runmake install-common install-headers install-libgcc |
14 | install -m 0755 xgcc ${CROSS_DIR}/bin/${TARGET_PREFIX}gcc-${PV} | 13 | install -m 0755 xgcc ${CROSS_DIR}/bin/${TARGET_PREFIX}gcc-${PV} |
15 | } | 14 | } |
16 | |||
diff --git a/meta/packages/gcc/gcc-cross-kernel_csl-arm-2005q3-2.bb b/meta/packages/gcc/gcc-cross-kernel_csl-arm-2005q3-2.bb deleted file mode 100644 index cf1542d1e7..0000000000 --- a/meta/packages/gcc/gcc-cross-kernel_csl-arm-2005q3-2.bb +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | require gcc-cross-initial_${PV}.bb | ||
2 | require gcc-cross-kernel.inc | ||
3 | |||
4 | SRC_URI += "file://gcc-3.4.4-makefile-fix.patch;patch=1" | ||
5 | |||
diff --git a/meta/packages/gcc/gcc-cross-sdk_3.4.4.bb b/meta/packages/gcc/gcc-cross-sdk_3.4.4.bb index 4b2c583fcb..1a7faa5b8c 100644 --- a/meta/packages/gcc/gcc-cross-sdk_3.4.4.bb +++ b/meta/packages/gcc/gcc-cross-sdk_3.4.4.bb | |||
@@ -1,16 +1,8 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | require gcc_${PV}.bb | ||
6 | PR = "r3" | 1 | PR = "r3" |
7 | 2 | ||
8 | inherit sdk | 3 | require gcc-${PV}.inc |
9 | 4 | require gcc-cross-sdk.inc | |
10 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | 5 | require gcc-configure-sdk.inc |
11 | |||
12 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc" | ||
13 | PACKAGES = "${PN}" | ||
14 | |||
15 | require gcc3-build-sdk.inc | ||
16 | require gcc-package-sdk.inc | 6 | require gcc-package-sdk.inc |
7 | |||
8 | SRC_URI += 'file://sdk-libstdc++-includes.patch;patch=1' | ||
diff --git a/meta/packages/gcc/gcc-cross-sdk_4.1.2.bb b/meta/packages/gcc/gcc-cross-sdk_4.1.2.bb index 23327c06d6..89f698477f 100644 --- a/meta/packages/gcc/gcc-cross-sdk_4.1.2.bb +++ b/meta/packages/gcc/gcc-cross-sdk_4.1.2.bb | |||
@@ -1,13 +1,10 @@ | |||
1 | PR = "r6" | 1 | PR = "r5" |
2 | 2 | ||
3 | inherit sdk | 3 | require gcc-${PV}.inc |
4 | 4 | require gcc-cross-sdk.inc | |
5 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | 5 | require gcc-configure-sdk.inc |
6 | |||
7 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc gmp-native mpfr-native" | ||
8 | |||
9 | require gcc_${PV}.bb | ||
10 | require gcc4-build-sdk.inc | ||
11 | require gcc-package-sdk.inc | 6 | require gcc-package-sdk.inc |
12 | 7 | ||
8 | DEPENDS += "gmp-native mpfr-native" | ||
9 | |||
13 | EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" | 10 | EXTRA_OECONF += "--disable-libunwind-exceptions --with-mpfr=${STAGING_DIR_NATIVE}${layout_exec_prefix}" |
diff --git a/meta/packages/gcc/gcc-cross-sdk_4.2.2.bb b/meta/packages/gcc/gcc-cross-sdk_4.2.2.bb index ba360698bd..7e3a459ea8 100644 --- a/meta/packages/gcc/gcc-cross-sdk_4.2.2.bb +++ b/meta/packages/gcc/gcc-cross-sdk_4.2.2.bb | |||
@@ -1,20 +1,13 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | PR = "r3" | 1 | PR = "r3" |
6 | 2 | ||
7 | inherit sdk | 3 | inherit sdk |
8 | 4 | ||
9 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | 5 | require gcc-${PV}.inc |
10 | 6 | require gcc-cross-sdk.inc | |
11 | PACKAGES = "${PN}" | 7 | require gcc-configure-sdk.inc |
12 | |||
13 | require gcc_${PV}.bb | ||
14 | require gcc4-build-sdk.inc | ||
15 | require gcc-package-sdk.inc | 8 | require gcc-package-sdk.inc |
16 | 9 | ||
17 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc gmp-native mpfr-native" | 10 | DEPENDS += "gmp-native mpfr-native" |
18 | 11 | ||
19 | EXTRA_OECONF += "--disable-libunwind-exceptions --disable-libssp \ | 12 | EXTRA_OECONF += "--disable-libunwind-exceptions --disable-libssp \ |
20 | --disable-libgomp --disable-libmudflap \ | 13 | --disable-libgomp --disable-libmudflap \ |
diff --git a/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3-2.bb b/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3-2.bb deleted file mode 100644 index fa5794b7b2..0000000000 --- a/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3-2.bb +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | PR = "r1" | ||
2 | |||
3 | inherit sdk | ||
4 | |||
5 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | ||
6 | |||
7 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc" | ||
8 | |||
9 | require gcc_${PV}.bb | ||
10 | require gcc4-build-sdk.inc | ||
11 | require gcc-package-sdk.inc | ||
diff --git a/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3.bb b/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3.bb new file mode 100644 index 0000000000..258931ee4b --- /dev/null +++ b/meta/packages/gcc/gcc-cross-sdk_csl-arm-2005q3.bb | |||
@@ -0,0 +1,8 @@ | |||
1 | PR = "r3" | ||
2 | |||
3 | inherit sdk | ||
4 | |||
5 | require gcc-${PV}.inc | ||
6 | require gcc-cross-sdk.inc | ||
7 | require gcc-configure-sdk.inc | ||
8 | require gcc-package-sdk.inc | ||
diff --git a/meta/packages/gcc/gcc-cross_csl-arm-2005q3-2.bb b/meta/packages/gcc/gcc-cross_csl-arm-2005q3-2.bb deleted file mode 100644 index f95e2e1177..0000000000 --- a/meta/packages/gcc/gcc-cross_csl-arm-2005q3-2.bb +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | require gcc_csl-arm-2005q3-2.bb | ||
2 | # path mangling, needed by the cross packaging | ||
3 | require gcc-paths-cross.inc | ||
4 | inherit cross | ||
5 | # NOTE: split PR. If the main .oe changes something that affects its *build* | ||
6 | # remember to increment this one too. | ||
7 | PR = "r0" | ||
8 | |||
9 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc" | ||
10 | PROVIDES = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++" | ||
11 | |||
12 | # cross build | ||
13 | require gcc3-build-cross.inc | ||
14 | # cross packaging | ||
15 | require gcc-package-cross.inc | ||
diff --git a/meta/packages/gcc/gcc-cross_csl-arm-2005q3.bb b/meta/packages/gcc/gcc-cross_csl-arm-2005q3.bb new file mode 100644 index 0000000000..09f09faacd --- /dev/null +++ b/meta/packages/gcc/gcc-cross_csl-arm-2005q3.bb | |||
@@ -0,0 +1,6 @@ | |||
1 | PR = "r2" | ||
2 | |||
3 | require gcc-csl-arm-2005q3.inc | ||
4 | require gcc-cross.inc | ||
5 | require gcc-configure-cross.inc | ||
6 | require gcc-package-cross.inc | ||
diff --git a/meta/packages/gcc/gcc-cross_csl-arm-2006q1.bb b/meta/packages/gcc/gcc-cross_csl-arm-2006q1.bb index db4872d73a..49ac900184 100644 --- a/meta/packages/gcc/gcc-cross_csl-arm-2006q1.bb +++ b/meta/packages/gcc/gcc-cross_csl-arm-2006q1.bb | |||
@@ -1,19 +1,6 @@ | |||
1 | require gcc_csl-arm-2006q1.bb | ||
2 | # path mangling, needed by the cross packaging | ||
3 | require gcc-paths-cross.inc | ||
4 | inherit cross | ||
5 | # NOTE: split PR. If the main .oe changes something that affects its *build* | ||
6 | # remember to increment this one too. | ||
7 | PR = "r1" | 1 | PR = "r1" |
8 | 2 | ||
9 | DEPENDS = "virtual/${TARGET_PREFIX}binutils virtual/${TARGET_PREFIX}libc-for-gcc" | 3 | require gcc-csl-arm-2006q1.inc |
10 | # gmp-native mpfr-native" | 4 | require gcc-cross.inc |
11 | 5 | require gcc-configure-cross.inc | |
12 | PROVIDES = "virtual/${TARGET_PREFIX}gcc virtual/${TARGET_PREFIX}g++" | ||
13 | |||
14 | # cross build | ||
15 | require gcc4-build-cross.inc | ||
16 | # cross packaging | ||
17 | require gcc-package-cross.inc | 6 | require gcc-package-cross.inc |
18 | |||
19 | S = "${WORKDIR}/gcc-2006q1" | ||
diff --git a/meta/packages/gcc/gcc-csl-arm-2005q3.inc b/meta/packages/gcc/gcc-csl-arm-2005q3.inc new file mode 100644 index 0000000000..5d77ecbd07 --- /dev/null +++ b/meta/packages/gcc/gcc-csl-arm-2005q3.inc | |||
@@ -0,0 +1,22 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | BINV = "3.4.4" | ||
4 | PV = "3.4.4+csl-arm-2005q3" | ||
5 | PV_chinook-compat = "3.4.4cs2005q3.2" | ||
6 | |||
7 | FILESDIR = "${FILE_DIRNAME}/gcc-csl-arm" | ||
8 | |||
9 | SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm-none-eabi/arm-2005q3-2-arm-none-eabi.src.tar.bz2 \ | ||
10 | file://gcc_optab_arm.patch;patch=1 \ | ||
11 | file://gcc-3.4.4-eabi-bigendian.patch;patch=1" | ||
12 | |||
13 | S = "${WORKDIR}/gcc-2005q3" | ||
14 | |||
15 | do_unpack2() { | ||
16 | cd ${WORKDIR} | ||
17 | tar -xvjf ./arm-2005q3-2-arm-none-eabi/gcc-2005q3-2.tar.bz2 | ||
18 | } | ||
19 | |||
20 | addtask unpack2 after do_unpack before do_patch | ||
21 | |||
22 | |||
diff --git a/meta/packages/gcc/gcc-csl-arm-2006q1.inc b/meta/packages/gcc/gcc-csl-arm-2006q1.inc new file mode 100644 index 0000000000..a208170b47 --- /dev/null +++ b/meta/packages/gcc/gcc-csl-arm-2006q1.inc | |||
@@ -0,0 +1,19 @@ | |||
1 | require gcc-common.inc | ||
2 | |||
3 | BINV = "4.1.0" | ||
4 | PV = "4.1.0+csl-arm-2006q1-6" | ||
5 | |||
6 | FILESDIR = "${FILE_DIRNAME}/gcc-csl-arm" | ||
7 | |||
8 | SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm-none-eabi/arm-2006q1-6-arm-none-eabi.src.tar.bz2 \ | ||
9 | file://gcc-configure-no-fortran.patch;patch=1;pnum=1 \ | ||
10 | file://gcc-new-makeinfo.patch;patch=1" | ||
11 | |||
12 | S = "${WORKDIR}/gcc-2006q1" | ||
13 | |||
14 | do_unpack2() { | ||
15 | cd ${WORKDIR} | ||
16 | tar -xvjf ./arm-2006q1-6-arm-none-eabi/gcc-2006q1-6.tar.bz2 | ||
17 | } | ||
18 | |||
19 | addtask unpack2 after do_unpack before do_patch | ||
diff --git a/meta/packages/gcc/gcc-fpu.inc b/meta/packages/gcc/gcc-fpu.inc deleted file mode 100644 index bb03d95567..0000000000 --- a/meta/packages/gcc/gcc-fpu.inc +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | |||
2 | def get_gcc_fpu_setting(bb, d): | ||
3 | if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ]: | ||
4 | return "--with-float=soft" | ||
5 | return "" | ||
6 | |||
diff --git a/meta/packages/gcc/gcc-native.inc b/meta/packages/gcc/gcc-native.inc index 3cf20a4589..6fa615ffc7 100644 --- a/meta/packages/gcc/gcc-native.inc +++ b/meta/packages/gcc/gcc-native.inc | |||
@@ -4,8 +4,6 @@ PROVIDES = "gcc-native-${PV}" | |||
4 | 4 | ||
5 | inherit native | 5 | inherit native |
6 | 6 | ||
7 | FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" | ||
8 | |||
9 | # This is intended to be a -very- basic config | 7 | # This is intended to be a -very- basic config |
10 | EXTRA_OECONF = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ | 8 | EXTRA_OECONF = "--with-local-prefix=${STAGING_DIR_TARGET}${layout_prefix} \ |
11 | --with-newlib \ | 9 | --with-newlib \ |
diff --git a/meta/packages/gcc/gcc-native_3.4.4.bb b/meta/packages/gcc/gcc-native_3.4.4.bb index d70a4f5464..6f74a1ea46 100644 --- a/meta/packages/gcc/gcc-native_3.4.4.bb +++ b/meta/packages/gcc/gcc-native_3.4.4.bb | |||
@@ -1,3 +1,6 @@ | |||
1 | require gcc_${PV}.bb | 1 | PR = "r7" |
2 | |||
3 | require gcc-${PV}.inc | ||
4 | require gcc-configure-target.inc | ||
2 | require gcc-native.inc | 5 | require gcc-native.inc |
3 | PROVIDES += "gcc3-native" | 6 | PROVIDES += "gcc3-native" |
diff --git a/meta/packages/gcc/gcc-package-cross.inc b/meta/packages/gcc/gcc-package-cross.inc index e1ffbd4e41..54294f4fa6 100644 --- a/meta/packages/gcc/gcc-package-cross.inc +++ b/meta/packages/gcc/gcc-package-cross.inc | |||
@@ -1,71 +1,65 @@ | |||
1 | # Packages emitted by our gcc-cross builds. | ||
2 | # | ||
3 | INHIBIT_PACKAGE_STRIP ?= "" | 1 | INHIBIT_PACKAGE_STRIP ?= "" |
4 | HAS_G2C ?= "yes" | ||
5 | HAS_GFORTRAN ?= "no" | ||
6 | OLD_INHIBIT_PACKAGE_STRIP := "${INHIBIT_PACKAGE_STRIP}" | 2 | OLD_INHIBIT_PACKAGE_STRIP := "${INHIBIT_PACKAGE_STRIP}" |
7 | INHIBIT_PACKAGE_STRIP = "1" | 3 | INHIBIT_PACKAGE_STRIP = "1" |
8 | 4 | ||
9 | # Do not generate *-dev packages as they are generated by 'gcc' recipe | ||
10 | PACKAGES = "libgcc libstdc++ libg2c libgfortran" | 5 | PACKAGES = "libgcc libstdc++ libg2c libgfortran" |
11 | 6 | ||
12 | # Called from within gcc-cross, so libdir is set wrong | 7 | # Called from within gcc-cross, so libdir is set wrong |
13 | FILES_libg2c = "${target_libdir}/libg2c.so.*" | 8 | FILES_libg2c = "${target_libdir}/libg2c.so.*" |
14 | FILES_libg2c-dev = "${target_libdir}/libg2c.so \ | ||
15 | ${target_libdir}/libg2c.a \ | ||
16 | ${target_libdir}/libfrtbegin.a" | ||
17 | 9 | ||
18 | FILES_libgfortran = "${target_libdir}/libgfortran.so.*" | 10 | FILES_libgfortran = "${target_libdir}/libgfortran.so.*" |
19 | FILES_libgfortran-dev = "${target_libdir}/libgfortran.a \ | ||
20 | ${target_libdir}/libgfortran.so \ | ||
21 | ${target_libdir}/libgfortranbegin.a" | ||
22 | 11 | ||
23 | FILES_libgcc = "${target_base_libdir}/libgcc_s.so.1" | 12 | FILES_libgcc = "${target_base_libdir}/libgcc_s.so.1" |
24 | FILES_libgcc-dev = "${target_base_libdir}/libgcc_s.so" | ||
25 | 13 | ||
26 | FILES_libstdc++ = "${target_libdir}/libstdc++.so.*" | 14 | FILES_libstdc++ = "${target_libdir}/libstdc++.so.*" |
27 | FILES_libstdc++-dev = "${target_includedir}/c++/${PV} \ | ||
28 | ${target_libdir}/libstdc++.so \ | ||
29 | ${target_libdir}/libstdc++.la \ | ||
30 | ${target_libdir}/libstdc++.a \ | ||
31 | ${target_libdir}/libsupc++.la \ | ||
32 | ${target_libdir}/libsupc++.a" | ||
33 | |||
34 | python do_package() { | ||
35 | if bb.data.getVar('DEBIAN_NAMES', d, 1): | ||
36 | bb.data.setVar('PKG_libgcc', 'libgcc1', d) | ||
37 | bb.build.exec_func('package_do_package', d) | ||
38 | } | ||
39 | 15 | ||
40 | do_install () { | 16 | do_install () { |
41 | oe_runmake 'DESTDIR=${D}' install | 17 | oe_runmake 'DESTDIR=${D}' install |
42 | 18 | ||
43 | # Move libgcc_s into /lib | 19 | # Move libgcc_s into /lib |
44 | mkdir -p ${D}${target_base_libdir} | 20 | mkdir -p ${D}${target_base_libdir} |
45 | if [ -f ${D}${target_base_libdir}/libgcc_s.so.? ]; then | 21 | if [ -f ${D}${target_base_libdir}/libgcc_s.so.? ]; then |
46 | # Already in the right location | 22 | # Already in the right location |
47 | : | 23 | : |
48 | elif [ -f ${D}${prefix}/lib/libgcc_s.so.? ]; then | 24 | elif [ -f ${D}${prefix}/lib/libgcc_s.so.? ]; then |
49 | mv -f ${D}${prefix}/lib/libgcc_s.so* ${D}${target_base_libdir} | 25 | mv -f ${D}${prefix}/lib/libgcc_s.so* ${D}${target_base_libdir} || true |
50 | else | 26 | |
51 | mv -f ${D}${prefix}/*/lib/libgcc_s.so* ${D}${target_base_libdir} | 27 | elif [ -f ${D}${prefix}/*/lib/nof/libgcc_s.so.? ]; then |
52 | fi | 28 | mv -f ${D}${prefix}/*/lib/nof/libgcc_s.so* ${D}${target_base_libdir} |
29 | else | ||
30 | mv -f ${D}${prefix}/*/lib/libgcc_s.so* ${D}${target_base_libdir} || true | ||
31 | fi | ||
32 | |||
33 | |||
53 | 34 | ||
54 | # Move libstdc++ and libg2c into libdir (resetting our prefix to /usr | 35 | # Move libstdc++ and libg2c into libdir (resetting our prefix to /usr |
55 | mkdir -p ${D}${target_libdir} | 36 | mkdir -p ${D}${target_libdir} |
56 | mv -f ${D}${prefix}/*/lib/libstdc++.so* ${D}${target_libdir} | 37 | |
57 | if [ "${HAS_G2C}" = "yes" ]; then | 38 | if [ -f ${D}${prefix}/*/lib/nof/libstdc++.so ]; then |
58 | mv -f ${D}${prefix}/*/lib/libg2c.so* ${D}${target_libdir} || true | 39 | |
59 | fi | 40 | mv -f ${D}${prefix}/*/lib/nof/libstdc++.so* ${D}${target_libdir} || true |
60 | if [ "${HAS_GFORTRAN}" = "yes" ]; then | 41 | mv -f ${D}${prefix}/*/lib/nof/libg2c.so* ${D}${target_libdir} || true |
61 | mv -f ${D}${prefix}/*/lib/libgfortran*.so* ${D}${target_libdir} | 42 | mv -f ${D}${prefix}/*/lib/nof/libgfortran*.so* ${D}${target_libdir} || true |
62 | fi | 43 | |
44 | else | ||
45 | mv -f ${D}${prefix}/*/lib/libstdc++.so* ${D}${target_libdir} || true | ||
46 | mv -f ${D}${prefix}/*/lib/libg2c.so* ${D}${target_libdir} || true | ||
47 | mv -f ${D}${prefix}/*/lib/libgfortran*.so* ${D}${target_libdir} || true | ||
48 | fi | ||
49 | |||
50 | |||
63 | 51 | ||
64 | # Manually run the target stripper since we won't get it run by | 52 | # Manually run the target stripper since we won't get it run by |
65 | # the packaging. | 53 | # the packaging. |
66 | if [ "x${OLD_INHIBIT_PACKAGE_STRIP}" != "x1" ]; then | 54 | if [ "x${OLD_INHIBIT_PACKAGE_STRIP}" != "x1" ]; then |
67 | ${TARGET_PREFIX}strip ${D}${target_libdir}/libstdc++.so.* | 55 | ${TARGET_PREFIX}strip ${D}${target_libdir}/libstdc++.so.* |
68 | ${TARGET_PREFIX}strip ${D}${target_libdir}/libg2c.so.* || true | 56 | ${TARGET_PREFIX}strip ${D}${target_libdir}/libg2c.so.* || true |
69 | ${TARGET_PREFIX}strip ${D}${target_base_libdir}/libgcc_s.so.* | 57 | ${TARGET_PREFIX}strip ${D}${target_base_libdir}/libgcc_s.so.* || true |
70 | fi | 58 | ${TARGET_PREFIX}strip ${D}${target_libdir}/libgfortran*.so* || true |
59 | fi | ||
60 | |||
61 | # Link gfortran to g77 to satisfy not-so-smart configure or hard coded g77 | ||
62 | # gfortran is fully backwards compatible. This is a safe and practical solution. | ||
63 | ln -sf ${CROSS_DIR}/bin/${TARGET_PREFIX}gfortran ${CROSS_DIR}/bin/${TARGET_PREFIX}g77 || true | ||
64 | ln -sf ${CROSS_DIR}/${TARGET_SYS}/bin/gfortran ${CROSS_DIR}/${TARGET_SYS}/bin/g77 || true | ||
71 | } | 65 | } |
diff --git a/meta/packages/gcc/gcc-package-sdk.inc b/meta/packages/gcc/gcc-package-sdk.inc index 635ab6d1f4..a36e632c9f 100644 --- a/meta/packages/gcc/gcc-package-sdk.inc +++ b/meta/packages/gcc/gcc-package-sdk.inc | |||
@@ -1,12 +1,4 @@ | |||
1 | # | ||
2 | # Note gcc-package.inc was already included before us. | ||
3 | # | ||
4 | # We override PACKAGES and FILES to change the packaging | ||
5 | # | ||
6 | |||
7 | INHIBIT_PACKAGE_STRIP ?= "" | 1 | INHIBIT_PACKAGE_STRIP ?= "" |
8 | HAS_G2C ?= "yes" | ||
9 | HAS_GFORTRAN ?= "no" | ||
10 | OLD_INHIBIT_PACKAGE_STRIP := "${INHIBIT_PACKAGE_STRIP}" | 2 | OLD_INHIBIT_PACKAGE_STRIP := "${INHIBIT_PACKAGE_STRIP}" |
11 | INHIBIT_PACKAGE_STRIP = "1" | 3 | INHIBIT_PACKAGE_STRIP = "1" |
12 | 4 | ||
@@ -29,6 +21,12 @@ FILES_${PN} = "\ | |||
29 | ${prefix}/${TARGET_SYS}/bin/* \ | 21 | ${prefix}/${TARGET_SYS}/bin/* \ |
30 | ${prefix}/${TARGET_SYS}/lib/* \ | 22 | ${prefix}/${TARGET_SYS}/lib/* \ |
31 | " | 23 | " |
24 | FILES_${PN}-doc = "\ | ||
25 | ${infodir} \ | ||
26 | ${mandir} \ | ||
27 | ${gcclibdir}/${TARGET_SYS}/${BINV}/include/README \ | ||
28 | " | ||
29 | |||
32 | do_install () { | 30 | do_install () { |
33 | oe_runmake 'DESTDIR=${D}' install | 31 | oe_runmake 'DESTDIR=${D}' install |
34 | 32 | ||
diff --git a/meta/packages/gcc/gcc-package-target.inc b/meta/packages/gcc/gcc-package-target.inc new file mode 100644 index 0000000000..2c19c5ecc7 --- /dev/null +++ b/meta/packages/gcc/gcc-package-target.inc | |||
@@ -0,0 +1,157 @@ | |||
1 | PACKAGES = "\ | ||
2 | ${PN} ${PN}-symlinks \ | ||
3 | g++ g++-symlinks \ | ||
4 | cpp cpp-symlinks \ | ||
5 | g77 g77-symlinks \ | ||
6 | gfortran gfortran-symlinks \ | ||
7 | gcov gcov-symlinks \ | ||
8 | libmudflap libmudflap-dev \ | ||
9 | libgcc-dev \ | ||
10 | libstdc++-dev \ | ||
11 | libg2c-dev \ | ||
12 | libgfortran-dev \ | ||
13 | ${PN}-doc \ | ||
14 | " | ||
15 | |||
16 | FILES_${PN} = "\ | ||
17 | ${bindir}/${TARGET_PREFIX}gcc \ | ||
18 | ${bindir}/${TARGET_PREFIX}gccbug \ | ||
19 | ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/collect2 \ | ||
20 | ${gcclibdir}/${TARGET_SYS}/${BINV}/*.o \ | ||
21 | ${gcclibdir}/${TARGET_SYS}/${BINV}/specs \ | ||
22 | ${gcclibdir}/${TARGET_SYS}/${BINV}/lib* \ | ||
23 | ${gcclibdir}/${TARGET_SYS}/${BINV}/include \ | ||
24 | " | ||
25 | FILES_${PN}-symlinks = "\ | ||
26 | ${bindir}/cc \ | ||
27 | ${bindir}/gcc \ | ||
28 | ${bindir}/gccbug \ | ||
29 | " | ||
30 | |||
31 | FILES_g77 = "\ | ||
32 | ${bindir}/${TARGET_PREFIX}g77 \ | ||
33 | ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f771 \ | ||
34 | " | ||
35 | FILES_g77-symlinks = "\ | ||
36 | ${bindir}/g77 \ | ||
37 | ${bindir}/f77 \ | ||
38 | " | ||
39 | FILES_gfortran = "\ | ||
40 | ${bindir}/${TARGET_PREFIX}gfortran \ | ||
41 | ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/f951 \ | ||
42 | " | ||
43 | FILES_gfortran-symlinks = "\ | ||
44 | ${bindir}/gfortran \ | ||
45 | ${bindir}/f95" | ||
46 | |||
47 | FILES_cpp = "\ | ||
48 | ${bindir}/${TARGET_PREFIX}cpp \ | ||
49 | ${base_libdir}/cpp \ | ||
50 | ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1" | ||
51 | FILES_cpp-symlinks = "${bindir}/cpp" | ||
52 | |||
53 | FILES_gcov = "${bindir}/${TARGET_PREFIX}gcov" | ||
54 | FILES_gcov-symlinks = "${bindir}/gcov" | ||
55 | |||
56 | FILES_libgcc = "${base_libdir}/libgcc*.so.*" | ||
57 | FILES_libgcc-dev = "${base_libdir}/libgcc*.so" | ||
58 | |||
59 | # Called from within gcc-cross, so libdir is set wrong | ||
60 | FILES_libg2c = "${target_libdir}/libg2c.so.*" | ||
61 | FILES_libg2c-dev = "\ | ||
62 | ${libdir}/libg2c.so \ | ||
63 | ${libdir}/libg2c.a \ | ||
64 | ${libdir}/libfrtbegin.a \ | ||
65 | " | ||
66 | |||
67 | FILES_g++ = "\ | ||
68 | ${bindir}/${TARGET_PREFIX}g++ \ | ||
69 | ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1plus \ | ||
70 | " | ||
71 | FILES_g++-symlinks = "\ | ||
72 | ${bindir}/c++ \ | ||
73 | ${bindir}/g++ \ | ||
74 | " | ||
75 | |||
76 | FILES_libstdc++ = "${libdir}/libstdc++.so.*" | ||
77 | FILES_libstdc++-dev = "\ | ||
78 | ${includedir}/c++/${BINV} \ | ||
79 | ${libdir}/libstdc++.so \ | ||
80 | ${libdir}/libstdc++.la \ | ||
81 | ${libdir}/libstdc++.a \ | ||
82 | ${libdir}/libsupc++.la \ | ||
83 | ${libdir}/libsupc++.a \ | ||
84 | " | ||
85 | |||
86 | FILES_libgfortran-dev = "${libdir}/libgfortran.a \ | ||
87 | ${libdir}/libgfortran.so \ | ||
88 | ${libdir}/libgfortranbegin.a" | ||
89 | |||
90 | FILES_libmudflap = "${libdir}/libmudflap*.so.*" | ||
91 | FILES_libmudflap-dev = "\ | ||
92 | ${libdir}/libmudflap*.so \ | ||
93 | ${libdir}/libmudflap*.a \ | ||
94 | ${libdir}/libmudflap*.a \ | ||
95 | " | ||
96 | |||
97 | FILES_${PN}-doc = "\ | ||
98 | ${infodir} \ | ||
99 | ${mandir} \ | ||
100 | ${gcclibdir}/${TARGET_SYS}/${BINV}/include/README \ | ||
101 | " | ||
102 | |||
103 | do_install () { | ||
104 | autotools_do_install | ||
105 | |||
106 | # Cleanup some of the ${libdir}{,exec}/gcc stuff ... | ||
107 | rm -r ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/install-tools | ||
108 | rm -r ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/install-tools | ||
109 | |||
110 | # Hack around specs file assumptions | ||
111 | test -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs && sed -i -e '/^*cross_compile:$/ { n; s/1/0/; }' ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs | ||
112 | |||
113 | # Move libgcc_s into /lib | ||
114 | mkdir -p ${D}${base_libdir} | ||
115 | if [ -f ${D}${libdir}/nof/libgcc_s.so ]; then | ||
116 | mv ${D}${libdir}/nof/libgcc_s.so.* ${D}${base_libdir} | ||
117 | else | ||
118 | mv ${D}${libdir}/libgcc_s.so.* ${D}${base_libdir} | ||
119 | fi | ||
120 | rm -f ${D}${libdir}/libgcc_s.so | ||
121 | ln -sf `echo ${libdir}/gcc/${TARGET_SYS}/${BINV} \ | ||
122 | | tr -s / \ | ||
123 | | sed -e 's,^/,,' -e 's,[^/]*,..,g'`/lib/libgcc_s.so.1 \ | ||
124 | ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/libgcc_s.so | ||
125 | |||
126 | # We don't need libtool libraries | ||
127 | rm -f ${D}${libdir}/libg2c.la &>/dev/null || true | ||
128 | |||
129 | # Cleanup manpages.. | ||
130 | rm -rf ${D}${mandir}/man7 | ||
131 | |||
132 | # We use libiberty from binutils | ||
133 | rm -f ${D}${libdir}/libiberty.a | ||
134 | |||
135 | cd ${D}${bindir} | ||
136 | |||
137 | # We care about g++ not c++ | ||
138 | rm -f *c++ | ||
139 | |||
140 | # We don't care about the gcc-<version> ones for this | ||
141 | rm -f *gcc-?.?* | ||
142 | |||
143 | # These sometimes show up, they are strange, we remove them | ||
144 | rm -f ${TARGET_ARCH}-*${TARGET_ARCH}-* | ||
145 | |||
146 | # Symlinks so we can use these trivially on the target | ||
147 | ln -sf ${TARGET_SYS}-g77 g77 || true | ||
148 | ln -sf ${TARGET_SYS}-gfortran gfortran || true | ||
149 | ln -sf ${TARGET_SYS}-g++ g++ | ||
150 | ln -sf ${TARGET_SYS}-gcc gcc | ||
151 | ln -sf g77 f77 || true | ||
152 | ln -sf gfortran f95 || true | ||
153 | ln -sf g++ c++ | ||
154 | ln -sf gcc cc | ||
155 | ln -sf ${bindir}/${TARGET_SYS}-cpp ${D}${base_libdir}/cpp | ||
156 | ln -sf ${bindir}/${TARGET_SYS}-cpp ${D}${bindir}/cpp | ||
157 | } | ||
diff --git a/meta/packages/gcc/gcc-paths-cross.inc b/meta/packages/gcc/gcc-paths-cross.inc deleted file mode 100644 index 3c08b1805d..0000000000 --- a/meta/packages/gcc/gcc-paths-cross.inc +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | # Note that we use := here, and require that this | ||
2 | # is included at the correct point (before inheriting | ||
3 | # cross) to ensure that libdir and includedir are | ||
4 | # target paths, not CROSS_DIR paths. | ||
5 | target_libdir := "${libdir}" | ||
6 | target_includedir := "${includedir}" | ||
7 | target_base_libdir := "${base_libdir}" | ||
diff --git a/meta/packages/gcc/gcc3-build-sdk.inc b/meta/packages/gcc/gcc3-build-sdk.inc deleted file mode 100644 index e2ec9565a7..0000000000 --- a/meta/packages/gcc/gcc3-build-sdk.inc +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibc", "no", "", d )}' | ||
2 | |||
3 | SRC_URI += 'file://sdk-libstdc++-includes.patch;patch=1' | ||
4 | |||
5 | STAGING_TARGET_INCDIR = "${STAGING_DIR}/${TARGET_SYS}/include" | ||
6 | STAGING_TARGET_LIBDIR = "${STAGING_DIR}/${TARGET_SYS}/lib" | ||
7 | |||
8 | do_configure () { | ||
9 | (cd ${S} && gnu-configize) || die "failure running gnu-configize" | ||
10 | (cd ${S}/libstdc++-v3 && autoreconf) | ||
11 | oe_runconf | ||
12 | mkdir -p gcc | ||
13 | ln -sf ${CROSS_DIR}/bin/${TARGET_PREFIX}as gcc/as | ||
14 | ln -sf ${CROSS_DIR}/bin/${TARGET_PREFIX}ld gcc/ld | ||
15 | ln -sf ${STAGING_TARGET_INCDIR}/* ${S}/include | ||
16 | ln -sf ${STAGING_TARGET_LIBDIR}/crt*.o gcc/ | ||
17 | } | ||
18 | |||
19 | do_compile () { | ||
20 | export CC="${BUILD_CC}" | ||
21 | export AR_FOR_TARGET="${TARGET_SYS}-ar" | ||
22 | export RANLIB_FOR_TARGET="${TARGET_SYS}-ranlib" | ||
23 | export LD_FOR_TARGET="${TARGET_SYS}-ld" | ||
24 | export NM_FOR_TARGET="${TARGET_SYS}-nm" | ||
25 | export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc ${TARGET_CC_ARCH}" | ||
26 | oe_runmake CFLAGS_FOR_TARGET="-I${STAGING_TARGET_INCDIR}" | ||
27 | } | ||
diff --git a/meta/packages/gcc/gcc4-build-cross.inc b/meta/packages/gcc/gcc4-build-cross.inc deleted file mode 100644 index 8da5875a79..0000000000 --- a/meta/packages/gcc/gcc4-build-cross.inc +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | FORTRAN = ",fortran" | ||
2 | HAS_GFORTRAN ?= "yes" | ||
3 | HAS_G2C = "no" | ||
4 | |||
5 | include gcc3-build-cross.inc | ||
6 | |||
diff --git a/meta/packages/gcc/gcc4-build-sdk.inc b/meta/packages/gcc/gcc4-build-sdk.inc deleted file mode 100644 index d6af5fe933..0000000000 --- a/meta/packages/gcc/gcc4-build-sdk.inc +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibc", "no", "", d )}' | ||
2 | USE_NLS = '${@base_conditional( "TARGET_OS", "linux-uclibcgnueabi", "no", "", d )}' | ||
3 | |||
4 | EXTRA_OECONF += "--with-sysroot=${prefix}/${TARGET_SYS} --with-build-sysroot=${STAGING_DIR_TARGET}" | ||
5 | |||
6 | do_configure () { | ||
7 | (cd ${S} && gnu-configize) || die "failure running gnu-configize" | ||
8 | (cd ${S}/libstdc++-v3 && autoreconf) | ||
9 | oe_runconf | ||
10 | } | ||
11 | |||
12 | do_compile () { | ||
13 | export CC="${BUILD_CC}" | ||
14 | export AR_FOR_TARGET="${TARGET_SYS}-ar" | ||
15 | export RANLIB_FOR_TARGET="${TARGET_SYS}-ranlib" | ||
16 | export LD_FOR_TARGET="${TARGET_SYS}-ld" | ||
17 | export NM_FOR_TARGET="${TARGET_SYS}-nm" | ||
18 | export CC_FOR_TARGET="${CCACHE} ${TARGET_SYS}-gcc ${TARGET_CC_ARCH}" | ||
19 | oe_runmake | ||
20 | } | ||
diff --git a/meta/packages/gcc/gcc4-build.inc b/meta/packages/gcc/gcc4-build.inc deleted file mode 100644 index b8a214a590..0000000000 --- a/meta/packages/gcc/gcc4-build.inc +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | FORTRAN = ",f95" | ||
2 | HAS_GFORTRAN ?= "yes" | ||
3 | HAS_G2C = "no" | ||
4 | |||
5 | include gcc3-build.inc | ||
6 | |||
diff --git a/meta/packages/gcc/gcc_3.4.4.bb b/meta/packages/gcc/gcc_3.4.4.bb index 69a00582a8..5e2598079b 100644 --- a/meta/packages/gcc/gcc_3.4.4.bb +++ b/meta/packages/gcc/gcc_3.4.4.bb | |||
@@ -1,30 +1,5 @@ | |||
1 | PR = "r6" | 1 | PR = "r7" |
2 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
3 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
4 | SECTION = "devel" | ||
5 | LICENSE = "GPL" | ||
6 | 2 | ||
7 | inherit autotools gettext | 3 | require gcc-${PV}.inc |
8 | 4 | require gcc-configure-target.inc | |
9 | require gcc-package.inc | 5 | require gcc-package-target.inc |
10 | |||
11 | SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | ||
12 | file://gcc34-reverse-compare.patch;patch=1 \ | ||
13 | file://gcc34-arm-ldm.patch;patch=1 \ | ||
14 | file://gcc34-arm-ldm-peephole.patch;patch=1 \ | ||
15 | file://gcc34-arm-tune.patch;patch=1 \ | ||
16 | file://gcc-3.4.1-uclibc-100-conf.patch;patch=1 \ | ||
17 | file://gcc-3.4.1-uclibc-200-locale.patch;patch=1 \ | ||
18 | file://gcc-3.4.0-arm-lib1asm.patch;patch=1 \ | ||
19 | file://gcc-3.4.0-arm-nolibfloat.patch;patch=1 \ | ||
20 | file://gcc-3.4.0-arm-bigendian.patch;patch=1 \ | ||
21 | file://gcc-3.4.0-arm-bigendian-uclibc.patch;patch=1 \ | ||
22 | file://GCC3.4.0VisibilityPatch.diff;patch=1 \ | ||
23 | file://15342.patch;patch=1 \ | ||
24 | file://jarfix.patch;patch=1 \ | ||
25 | file://always-fixincperm.patch;patch=1" | ||
26 | |||
27 | SRC_URI += "file://gcc34-configure.in.patch;patch=1" | ||
28 | SRC_URI += "file://gcc34-thumb-support.patch;patch=1" | ||
29 | |||
30 | require gcc3-build.inc | ||
diff --git a/meta/packages/gcc/gcc_4.0.2.bb b/meta/packages/gcc/gcc_4.0.2.bb index 299b6bbd8c..5e2598079b 100644 --- a/meta/packages/gcc/gcc_4.0.2.bb +++ b/meta/packages/gcc/gcc_4.0.2.bb | |||
@@ -1,27 +1,5 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | 1 | PR = "r7" |
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | DEPENDS = "mpfr gmp" | ||
6 | PR = "r1" | ||
7 | 2 | ||
8 | inherit autotools gettext | 3 | require gcc-${PV}.inc |
9 | 4 | require gcc-configure-target.inc | |
10 | require gcc-package.inc | 5 | require gcc-package-target.inc |
11 | |||
12 | SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | ||
13 | file://arm-nolibfloat.patch;patch=1 \ | ||
14 | file://arm-softfloat.patch;patch=1 \ | ||
15 | file://ldflags.patch;patch=1" | ||
16 | |||
17 | # uclibc patches below | ||
18 | SRC_URI_append = " file://100-uclibc-conf.patch;patch=1 \ | ||
19 | file://200-uclibc-locale.patch;patch=1 \ | ||
20 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
21 | file://302-c99-snprintf.patch;patch=1 \ | ||
22 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
23 | file://800-arm-bigendian.patch;patch=1 \ | ||
24 | file://zecke-host-cpp-ac-hack.patch;patch=1 " | ||
25 | |||
26 | |||
27 | require gcc4-build.inc | ||
diff --git a/meta/packages/gcc/gcc_4.1.2.bb b/meta/packages/gcc/gcc_4.1.2.bb index c4a124081f..c51eb23b05 100644 --- a/meta/packages/gcc/gcc_4.1.2.bb +++ b/meta/packages/gcc/gcc_4.1.2.bb | |||
@@ -1,54 +1,7 @@ | |||
1 | PR = "r3" | 1 | PR = "r11" |
2 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
3 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
4 | SECTION = "devel" | ||
5 | LICENSE = "GPL" | ||
6 | 2 | ||
7 | ARM_INSTRUCTION_SET = "arm" | 3 | require gcc-${PV}.inc |
8 | 4 | require gcc-configure-target.inc | |
9 | inherit autotools gettext | 5 | require gcc-package-target.inc |
10 | |||
11 | require gcc-package.inc | ||
12 | |||
13 | SRC_URI = "ftp://ftp.gnu.org/pub/gnu/gcc/gcc-4.1.2/gcc-4.1.2.tar.bz2 \ | ||
14 | file://100-uclibc-conf.patch;patch=1 \ | ||
15 | file://110-arm-eabi.patch;patch=1 \ | ||
16 | file://200-uclibc-locale.patch;patch=1 \ | ||
17 | file://300-libstdc++-pic.patch;patch=1 \ | ||
18 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
19 | file://302-c99-snprintf.patch;patch=1 \ | ||
20 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
21 | file://304-index_macro.patch;patch=1 \ | ||
22 | file://602-sdk-libstdc++-includes.patch;patch=1 \ | ||
23 | file://740-sh-pr24836.patch;patch=1 \ | ||
24 | file://800-arm-bigendian.patch;patch=1 \ | ||
25 | file://arm-nolibfloat.patch;patch=1 \ | ||
26 | file://arm-softfloat.patch;patch=1 \ | ||
27 | file://gcc41-configure.in.patch;patch=1 \ | ||
28 | file://arm-thumb.patch;patch=1 \ | ||
29 | file://arm-thumb-cache.patch;patch=1 \ | ||
30 | file://ldflags.patch;patch=1 \ | ||
31 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
32 | file://unbreak-armv4t.patch;patch=1 \ | ||
33 | file://fix-ICE-in-arm_unwind_emit_set.diff;patch=1 \ | ||
34 | file://cache-amnesia.patch;patch=1 \ | ||
35 | " | ||
36 | |||
37 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " | ||
38 | |||
39 | #Set the fortran bits | ||
40 | # 'fortran' or '', not 'f77' like gcc3 had | ||
41 | FORTRAN = "" | ||
42 | HAS_GFORTRAN = "no" | ||
43 | HAS_G2C = "no" | ||
44 | |||
45 | #Set the java bits | ||
46 | JAVA_arm = "" | ||
47 | JAVA = "" | ||
48 | |||
49 | LANGUAGES = "c,c++${FORTRAN}${JAVA}" | ||
50 | require gcc3-build.inc | ||
51 | |||
52 | |||
53 | EXTRA_OECONF += " --disable-libssp " | ||
54 | 6 | ||
7 | ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_INCDIR}" | ||
diff --git a/meta/packages/gcc/gcc_4.2.2.bb b/meta/packages/gcc/gcc_4.2.2.bb index 6c5a17e151..7238aed4d7 100644 --- a/meta/packages/gcc/gcc_4.2.2.bb +++ b/meta/packages/gcc/gcc_4.2.2.bb | |||
@@ -1,96 +1,10 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | 1 | PR = "r6" |
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | PR = "r8" | ||
6 | 2 | ||
7 | inherit autotools gettext | 3 | require gcc-${PV}.inc |
4 | require gcc-configure-target.inc | ||
5 | require gcc-package-target.inc | ||
8 | 6 | ||
9 | require gcc-package.inc | 7 | SRC_URI_append = "file://fortran-cross-compile-hack.patch;patch=1" |
10 | 8 | ||
11 | SRC_URI = "ftp://ftp.gnu.org/pub/gnu/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \ | 9 | ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_INCDIR}" |
12 | file://100-uclibc-conf.patch;patch=1 \ | ||
13 | file://103-uclibc-conf-noupstream.patch;patch=1 \ | ||
14 | file://200-uclibc-locale.patch;patch=1 \ | ||
15 | file://203-uclibc-locale-no__x.patch;patch=1 \ | ||
16 | file://204-uclibc-locale-wchar_fix.patch;patch=1 \ | ||
17 | file://205-uclibc-locale-update.patch;patch=1 \ | ||
18 | file://300-libstdc++-pic.patch;patch=1 \ | ||
19 | file://301-missing-execinfo_h.patch;patch=1 \ | ||
20 | file://302-c99-snprintf.patch;patch=1 \ | ||
21 | file://303-c99-complex-ugly-hack.patch;patch=1 \ | ||
22 | file://304-index_macro.patch;patch=1 \ | ||
23 | file://305-libmudflap-susv3-legacy.patch;patch=1 \ | ||
24 | file://306-libstdc++-namespace.patch;patch=1 \ | ||
25 | file://307-locale_facets.patch;patch=1 \ | ||
26 | file://402-libbackend_dep_gcov-iov.h.patch;patch=1 \ | ||
27 | file://602-sdk-libstdc++-includes.patch;patch=1 \ | ||
28 | file://740-sh-pr24836.patch;patch=1 \ | ||
29 | file://800-arm-bigendian.patch;patch=1 \ | ||
30 | file://801-arm-bigendian-eabi.patch;patch=1 \ | ||
31 | file://904-flatten-switch-stmt-00.patch;patch=1 \ | ||
32 | file://arm-nolibfloat.patch;patch=1 \ | ||
33 | file://arm-softfloat.patch;patch=1 \ | ||
34 | file://gcc41-configure.in.patch;patch=1 \ | ||
35 | file://arm-thumb.patch;patch=1 \ | ||
36 | file://arm-thumb-cache.patch;patch=1 \ | ||
37 | file://ldflags.patch;patch=1 \ | ||
38 | file://zecke-xgcc-cpp.patch;patch=1 \ | ||
39 | file://unbreak-armv4t.patch;patch=1 \ | ||
40 | file://fix-ICE-in-arm_unwind_emit_set.diff;patch=1 \ | ||
41 | file://cache-amnesia.patch;patch=1 \ | ||
42 | file://gfortran.patch;patch=1 \ | ||
43 | file://gcc-4.0.2-e300c2c3.patch;patch=1 \ | ||
44 | file://pr34130.patch;patch=1 \ | ||
45 | file://fortran-static-linking.patch;patch=1 \ | ||
46 | file://intermask-bigendian.patch;patch=1 \ | ||
47 | " | ||
48 | 10 | ||
49 | SRC_URI_append_ep93xx = " \ | ||
50 | file://arm-crunch-saveregs.patch;patch=1 \ | ||
51 | file://arm-crunch-20000320.patch;patch=1 \ | ||
52 | file://arm-crunch-compare.patch;patch=1 \ | ||
53 | file://arm-crunch-compare-unordered.patch;patch=1 \ | ||
54 | file://arm-crunch-compare-geu.patch;patch=1 \ | ||
55 | file://arm-crunch-eabi-ieee754.patch;patch=1 \ | ||
56 | file://arm-crunch-eabi-ieee754-div.patch;patch=1 \ | ||
57 | file://arm-crunch-64bit-disable0.patch;patch=1 \ | ||
58 | file://arm-crunch-offset.patch;patch=1 \ | ||
59 | file://arm-crunch-fp_consts.patch;patch=1 \ | ||
60 | file://arm-crunch-neg2.patch;patch=1 \ | ||
61 | file://arm-crunch-predicates3.patch;patch=1 \ | ||
62 | file://arm-crunch-cfcvtds-disable.patch;patch=1 \ | ||
63 | file://arm-crunch-floatsi-disable.patch;patch=1 \ | ||
64 | file://arm-crunch-truncsi-disable.patch;patch=1 \ | ||
65 | file://arm-crunch-cfcvt64-disable.patch;patch=1 \ | ||
66 | file://arm-crunch-cirrus-bugfixes.patch;patch=1 \ | ||
67 | " | ||
68 | |||
69 | PACKAGE_ARCH_ep93xx = "${MACHINE_ARCH}" | ||
70 | |||
71 | SRC_URI_append_sh3 = " file://sh3-installfix-fixheaders.patch;patch=1 " | ||
72 | |||
73 | #Set the fortran bits | ||
74 | # 'i,fortran' or '', not 'f77' like gcc3 had | ||
75 | FORTRAN = "" | ||
76 | FORTRAN_linux-gnueabi = ",fortran" | ||
77 | |||
78 | DEPENDS += " gmp mpfr " | ||
79 | |||
80 | #Set the java bits | ||
81 | JAVA = "" | ||
82 | JAVA_arm = "" | ||
83 | |||
84 | LANGUAGES = "c,c++${FORTRAN}${JAVA}" | ||
85 | require gcc3-build.inc | ||
86 | ARCH_FLAGS_FOR_TARGET=-isystem${STAGING_INCDIR} | ||
87 | |||
88 | |||
89 | EXTRA_OECONF += " --disable-libssp --disable-bootstrap " | ||
90 | |||
91 | # We know some one is including us, but we only want to apply this fortran hack for the real gcc | ||
92 | python __anonymous () { | ||
93 | import bb | ||
94 | if bb.data.getVar('PN', d, True) == "gcc": | ||
95 | bb.data.setVar('SRC_URI_append', ' file://fortran-cross-compile-hack.patch;patch=1', d) | ||
96 | } | ||
diff --git a/meta/packages/gcc/gcc_csl-arm-2005q3-2.bb b/meta/packages/gcc/gcc_csl-arm-2005q3-2.bb deleted file mode 100644 index 6a39587235..0000000000 --- a/meta/packages/gcc/gcc_csl-arm-2005q3-2.bb +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | BINV = "3.4.4" | ||
6 | PV = "3.4.4+csl-arm-2005q3-2" | ||
7 | PR = "r1" | ||
8 | |||
9 | FILESDIR = "${FILE_DIRNAME}/gcc-csl-arm" | ||
10 | |||
11 | inherit autotools gettext | ||
12 | |||
13 | require gcc-package.inc | ||
14 | |||
15 | SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2005q3-2-arm-none-linux-gnueabi.src.tar.bz2" | ||
16 | |||
17 | do_unpack2() { | ||
18 | cd ${WORKDIR} | ||
19 | tar -xvjf ./arm-2005q3-2-arm-none-linux-gnueabi/gcc-2005q3-2.tar.bz2 | ||
20 | rm -rf ./arm-2005q3-2-arm-none-linux-gnueabi | ||
21 | } | ||
22 | |||
23 | addtask unpack2 after do_unpack before do_patch | ||
24 | |||
25 | require gcc3-build.inc | ||
26 | |||
27 | S = "${WORKDIR}/gcc-2005q3" | ||
diff --git a/meta/packages/gcc/gcc_csl-arm-2005q3.bb b/meta/packages/gcc/gcc_csl-arm-2005q3.bb new file mode 100644 index 0000000000..cc7540af15 --- /dev/null +++ b/meta/packages/gcc/gcc_csl-arm-2005q3.bb | |||
@@ -0,0 +1,5 @@ | |||
1 | PR = "r3" | ||
2 | |||
3 | require gcc-${PV}.inc | ||
4 | require gcc-configure-target.inc | ||
5 | require gcc-package-target.inc | ||
diff --git a/meta/packages/gcc/gcc_csl-arm-2006q1.bb b/meta/packages/gcc/gcc_csl-arm-2006q1.bb index a4d7c5ba17..832167ca4e 100644 --- a/meta/packages/gcc/gcc_csl-arm-2006q1.bb +++ b/meta/packages/gcc/gcc_csl-arm-2006q1.bb | |||
@@ -1,31 +1,5 @@ | |||
1 | DESCRIPTION = "The GNU cc and gcc C compilers." | ||
2 | HOMEPAGE = "http://www.gnu.org/software/gcc/" | ||
3 | SECTION = "devel" | ||
4 | LICENSE = "GPL" | ||
5 | BINV = "4.1.0" | ||
6 | PV = "4.1.0+csl-arm-2006q1-6" | ||
7 | PR = "r1" | 1 | PR = "r1" |
8 | 2 | ||
9 | FILESDIR = "${FILE_DIRNAME}/gcc-csl-arm" | 3 | require gcc-${PV}.inc |
10 | 4 | require gcc-configure-target.inc | |
11 | inherit autotools gettext | 5 | require gcc-package-target.inc |
12 | |||
13 | require gcc-package.inc | ||
14 | |||
15 | SRC_URI = "http://www.codesourcery.com/public/gnu_toolchain/arm-none-eabi/arm-2006q1-6-arm-none-eabi.src.tar.bz2 \ | ||
16 | file://gcc-configure-no-fortran.patch;patch=1;pnum=1 \ | ||
17 | file://gcc-new-makeinfo.patch;patch=1" | ||
18 | |||
19 | #the optabi patch is already applied | ||
20 | |||
21 | do_unpack2() { | ||
22 | cd ${WORKDIR} | ||
23 | pwd | ||
24 | tar -xvjf ./arm-2006q1-6-arm-none-eabi/gcc-2006q1-6.tar.bz2 | ||
25 | } | ||
26 | |||
27 | addtask unpack2 after do_unpack before do_patch | ||
28 | |||
29 | require gcc4-build.inc | ||
30 | |||
31 | S = "${WORKDIR}/gcc-2006q1" | ||