Mercurial > hg > CbC > CbC_gcc
annotate gcc/rtl.c @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
rev | line source |
---|---|
0 | 1 /* RTL utility routines. |
2 Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
4 Free Software Foundation, Inc. |
0 | 5 |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 /* This file is compiled twice: once for the generator programs | |
23 once for the compiler. */ | |
24 #ifdef GENERATOR_FILE | |
25 #include "bconfig.h" | |
26 #else | |
27 #include "config.h" | |
28 #endif | |
29 | |
30 #include "system.h" | |
31 #include "coretypes.h" | |
32 #include "tm.h" | |
33 #include "rtl.h" | |
34 #include "ggc.h" | |
35 #ifdef GENERATOR_FILE | |
36 # include "errors.h" | |
37 #else | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
38 # include "diagnostic-core.h" |
0 | 39 #endif |
40 | |
41 | |
42 /* Indexed by rtx code, gives number of operands for an rtx with that code. | |
43 Does NOT include rtx header data (code and links). */ | |
44 | |
45 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) sizeof FORMAT - 1 , | |
46 | |
47 const unsigned char rtx_length[NUM_RTX_CODE] = { | |
48 #include "rtl.def" | |
49 }; | |
50 | |
51 #undef DEF_RTL_EXPR | |
52 | |
53 /* Indexed by rtx code, gives the name of that kind of rtx, as a C string. */ | |
54 | |
55 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME , | |
56 | |
57 const char * const rtx_name[NUM_RTX_CODE] = { | |
58 #include "rtl.def" /* rtl expressions are documented here */ | |
59 }; | |
60 | |
61 #undef DEF_RTL_EXPR | |
62 | |
63 /* Indexed by rtx code, gives a sequence of operand-types for | |
64 rtx's of that code. The sequence is a C string in which | |
65 each character describes one operand. */ | |
66 | |
67 const char * const rtx_format[NUM_RTX_CODE] = { | |
68 /* "*" undefined. | |
69 can cause a warning message | |
70 "0" field is unused (or used in a phase-dependent manner) | |
71 prints nothing | |
72 "i" an integer | |
73 prints the integer | |
74 "n" like "i", but prints entries from `note_insn_name' | |
75 "w" an integer of width HOST_BITS_PER_WIDE_INT | |
76 prints the integer | |
77 "s" a pointer to a string | |
78 prints the string | |
79 "S" like "s", but optional: | |
80 the containing rtx may end before this operand | |
81 "T" like "s", but treated specially by the RTL reader; | |
82 only found in machine description patterns. | |
83 "e" a pointer to an rtl expression | |
84 prints the expression | |
85 "E" a pointer to a vector that points to a number of rtl expressions | |
86 prints a list of the rtl expressions | |
87 "V" like "E", but optional: | |
88 the containing rtx may end before this operand | |
89 "u" a pointer to another insn | |
90 prints the uid of the insn. | |
91 "b" is a pointer to a bitmap header. | |
92 "B" is a basic block pointer. | |
93 "t" is a tree pointer. */ | |
94 | |
95 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT , | |
96 #include "rtl.def" /* rtl expressions are defined here */ | |
97 #undef DEF_RTL_EXPR | |
98 }; | |
99 | |
100 /* Indexed by rtx code, gives a character representing the "class" of | |
101 that rtx code. See rtl.def for documentation on the defined classes. */ | |
102 | |
103 const enum rtx_class rtx_class[NUM_RTX_CODE] = { | |
104 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS, | |
105 #include "rtl.def" /* rtl expressions are defined here */ | |
106 #undef DEF_RTL_EXPR | |
107 }; | |
108 | |
109 /* Indexed by rtx code, gives the size of the rtx in bytes. */ | |
110 | |
111 const unsigned char rtx_code_size[NUM_RTX_CODE] = { | |
112 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) \ | |
113 ((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE || (ENUM) == CONST_FIXED\ | |
114 ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT) \ | |
115 : RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (rtunion)), | |
116 | |
117 #include "rtl.def" | |
118 #undef DEF_RTL_EXPR | |
119 }; | |
120 | |
121 /* Names for kinds of NOTEs and REG_NOTEs. */ | |
122 | |
123 const char * const note_insn_name[NOTE_INSN_MAX] = | |
124 { | |
125 #define DEF_INSN_NOTE(NAME) #NAME, | |
126 #include "insn-notes.def" | |
127 #undef DEF_INSN_NOTE | |
128 }; | |
129 | |
130 const char * const reg_note_name[REG_NOTE_MAX] = | |
131 { | |
132 #define DEF_REG_NOTE(NAME) #NAME, | |
133 #include "reg-notes.def" | |
134 #undef DEF_REG_NOTE | |
135 }; | |
136 | |
137 #ifdef GATHER_STATISTICS | |
138 static int rtx_alloc_counts[(int) LAST_AND_UNUSED_RTX_CODE]; | |
139 static int rtx_alloc_sizes[(int) LAST_AND_UNUSED_RTX_CODE]; | |
140 static int rtvec_alloc_counts; | |
141 static int rtvec_alloc_sizes; | |
142 #endif | |
143 | |
144 | |
145 /* Allocate an rtx vector of N elements. | |
146 Store the length, and initialize all elements to zero. */ | |
147 | |
148 rtvec | |
149 rtvec_alloc (int n) | |
150 { | |
151 rtvec rt; | |
152 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
153 rt = ggc_alloc_rtvec_sized (n); |
0 | 154 /* Clear out the vector. */ |
155 memset (&rt->elem[0], 0, n * sizeof (rtx)); | |
156 | |
157 PUT_NUM_ELEM (rt, n); | |
158 | |
159 #ifdef GATHER_STATISTICS | |
160 rtvec_alloc_counts++; | |
161 rtvec_alloc_sizes += n * sizeof (rtx); | |
162 #endif | |
163 | |
164 return rt; | |
165 } | |
166 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
167 /* Create a bitwise copy of VEC. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
168 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
169 rtvec |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
170 shallow_copy_rtvec (rtvec vec) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
171 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
172 rtvec newvec; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
173 int n; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
174 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
175 n = GET_NUM_ELEM (vec); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
176 newvec = rtvec_alloc (n); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
177 memcpy (&newvec->elem[0], &vec->elem[0], sizeof (rtx) * n); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
178 return newvec; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
179 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
180 |
0 | 181 /* Return the number of bytes occupied by rtx value X. */ |
182 | |
183 unsigned int | |
184 rtx_size (const_rtx x) | |
185 { | |
186 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_HAS_BLOCK_INFO_P (x)) | |
187 return RTX_HDR_SIZE + sizeof (struct block_symbol); | |
188 return RTX_CODE_SIZE (GET_CODE (x)); | |
189 } | |
190 | |
191 /* Allocate an rtx of code CODE. The CODE is stored in the rtx; | |
192 all the rest is initialized to zero. */ | |
193 | |
194 rtx | |
195 rtx_alloc_stat (RTX_CODE code MEM_STAT_DECL) | |
196 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
197 rtx rt = ggc_alloc_zone_rtx_def_stat (&rtl_zone, RTX_CODE_SIZE (code) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
198 PASS_MEM_STAT); |
0 | 199 |
200 /* We want to clear everything up to the FLD array. Normally, this | |
201 is one int, but we don't want to assume that and it isn't very | |
202 portable anyway; this is. */ | |
203 | |
204 memset (rt, 0, RTX_HDR_SIZE); | |
205 PUT_CODE (rt, code); | |
206 | |
207 #ifdef GATHER_STATISTICS | |
208 rtx_alloc_counts[code]++; | |
209 rtx_alloc_sizes[code] += RTX_CODE_SIZE (code); | |
210 #endif | |
211 | |
212 return rt; | |
213 } | |
214 | |
215 | |
216 /* Return true if ORIG is a sharable CONST. */ | |
217 | |
218 bool | |
219 shared_const_p (const_rtx orig) | |
220 { | |
221 gcc_assert (GET_CODE (orig) == CONST); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
222 |
0 | 223 /* CONST can be shared if it contains a SYMBOL_REF. If it contains |
224 a LABEL_REF, it isn't sharable. */ | |
225 return (GET_CODE (XEXP (orig, 0)) == PLUS | |
226 && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
227 && CONST_INT_P(XEXP (XEXP (orig, 0), 1))); |
0 | 228 } |
229 | |
230 | |
231 /* Create a new copy of an rtx. | |
232 Recursively copies the operands of the rtx, | |
233 except for those few rtx codes that are sharable. */ | |
234 | |
235 rtx | |
236 copy_rtx (rtx orig) | |
237 { | |
238 rtx copy; | |
239 int i, j; | |
240 RTX_CODE code; | |
241 const char *format_ptr; | |
242 | |
243 code = GET_CODE (orig); | |
244 | |
245 switch (code) | |
246 { | |
247 case REG: | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
248 case DEBUG_EXPR: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
249 case VALUE: |
0 | 250 case CONST_INT: |
251 case CONST_DOUBLE: | |
252 case CONST_FIXED: | |
253 case CONST_VECTOR: | |
254 case SYMBOL_REF: | |
255 case CODE_LABEL: | |
256 case PC: | |
257 case CC0: | |
258 case SCRATCH: | |
259 /* SCRATCH must be shared because they represent distinct values. */ | |
260 return orig; | |
261 case CLOBBER: | |
262 if (REG_P (XEXP (orig, 0)) && REGNO (XEXP (orig, 0)) < FIRST_PSEUDO_REGISTER) | |
263 return orig; | |
264 break; | |
265 | |
266 case CONST: | |
267 if (shared_const_p (orig)) | |
268 return orig; | |
269 break; | |
270 | |
271 /* A MEM with a constant address is not sharable. The problem is that | |
272 the constant address may need to be reloaded. If the mem is shared, | |
273 then reloading one copy of this mem will cause all copies to appear | |
274 to have been reloaded. */ | |
275 | |
276 default: | |
277 break; | |
278 } | |
279 | |
280 /* Copy the various flags, fields, and other information. We assume | |
281 that all fields need copying, and then clear the fields that should | |
282 not be copied. That is the sensible default behavior, and forces | |
283 us to explicitly document why we are *not* copying a flag. */ | |
284 copy = shallow_copy_rtx (orig); | |
285 | |
286 /* We do not copy the USED flag, which is used as a mark bit during | |
287 walks over the RTL. */ | |
288 RTX_FLAG (copy, used) = 0; | |
289 | |
290 /* We do not copy FRAME_RELATED for INSNs. */ | |
291 if (INSN_P (orig)) | |
292 RTX_FLAG (copy, frame_related) = 0; | |
293 RTX_FLAG (copy, jump) = RTX_FLAG (orig, jump); | |
294 RTX_FLAG (copy, call) = RTX_FLAG (orig, call); | |
295 | |
296 format_ptr = GET_RTX_FORMAT (GET_CODE (copy)); | |
297 | |
298 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++) | |
299 switch (*format_ptr++) | |
300 { | |
301 case 'e': | |
302 if (XEXP (orig, i) != NULL) | |
303 XEXP (copy, i) = copy_rtx (XEXP (orig, i)); | |
304 break; | |
305 | |
306 case 'E': | |
307 case 'V': | |
308 if (XVEC (orig, i) != NULL) | |
309 { | |
310 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i)); | |
311 for (j = 0; j < XVECLEN (copy, i); j++) | |
312 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j)); | |
313 } | |
314 break; | |
315 | |
316 case 't': | |
317 case 'w': | |
318 case 'i': | |
319 case 's': | |
320 case 'S': | |
321 case 'T': | |
322 case 'u': | |
323 case 'B': | |
324 case '0': | |
325 /* These are left unchanged. */ | |
326 break; | |
327 | |
328 default: | |
329 gcc_unreachable (); | |
330 } | |
331 return copy; | |
332 } | |
333 | |
334 /* Create a new copy of an rtx. Only copy just one level. */ | |
335 | |
336 rtx | |
337 shallow_copy_rtx_stat (const_rtx orig MEM_STAT_DECL) | |
338 { | |
339 const unsigned int size = rtx_size (orig); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
340 rtx const copy = ggc_alloc_zone_rtx_def_stat (&rtl_zone, size PASS_MEM_STAT); |
0 | 341 return (rtx) memcpy (copy, orig, size); |
342 } | |
343 | |
344 /* Nonzero when we are generating CONCATs. */ | |
345 int generating_concat_p; | |
346 | |
347 /* Nonzero when we are expanding trees to RTL. */ | |
348 int currently_expanding_to_rtl; | |
349 | |
350 | |
351 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
352 /* Same as rtx_equal_p, but call CB on each pair of rtx if CB is not NULL. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
353 When the callback returns true, we continue with the new pair. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
354 Whenever changing this function check if rtx_equal_p below doesn't need |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
355 changing as well. */ |
0 | 356 |
357 int | |
358 rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb) | |
359 { | |
360 int i; | |
361 int j; | |
362 enum rtx_code code; | |
363 const char *fmt; | |
364 rtx nx, ny; | |
365 | |
366 if (x == y) | |
367 return 1; | |
368 if (x == 0 || y == 0) | |
369 return 0; | |
370 | |
371 /* Invoke the callback first. */ | |
372 if (cb != NULL | |
373 && ((*cb) (&x, &y, &nx, &ny))) | |
374 return rtx_equal_p_cb (nx, ny, cb); | |
375 | |
376 code = GET_CODE (x); | |
377 /* Rtx's of different codes cannot be equal. */ | |
378 if (code != GET_CODE (y)) | |
379 return 0; | |
380 | |
381 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. | |
382 (REG:SI x) and (REG:HI x) are NOT equivalent. */ | |
383 | |
384 if (GET_MODE (x) != GET_MODE (y)) | |
385 return 0; | |
386 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
387 /* MEMs refering to different address space are not equivalent. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
388 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
389 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
390 |
0 | 391 /* Some RTL can be compared nonrecursively. */ |
392 switch (code) | |
393 { | |
394 case REG: | |
395 return (REGNO (x) == REGNO (y)); | |
396 | |
397 case LABEL_REF: | |
398 return XEXP (x, 0) == XEXP (y, 0); | |
399 | |
400 case SYMBOL_REF: | |
401 return XSTR (x, 0) == XSTR (y, 0); | |
402 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
403 case DEBUG_EXPR: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
404 case VALUE: |
0 | 405 case SCRATCH: |
406 case CONST_DOUBLE: | |
407 case CONST_INT: | |
408 case CONST_FIXED: | |
409 return 0; | |
410 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
411 case DEBUG_IMPLICIT_PTR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
412 return DEBUG_IMPLICIT_PTR_DECL (x) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
413 == DEBUG_IMPLICIT_PTR_DECL (y); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
414 |
0 | 415 default: |
416 break; | |
417 } | |
418 | |
419 /* Compare the elements. If any pair of corresponding elements | |
420 fail to match, return 0 for the whole thing. */ | |
421 | |
422 fmt = GET_RTX_FORMAT (code); | |
423 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) | |
424 { | |
425 switch (fmt[i]) | |
426 { | |
427 case 'w': | |
428 if (XWINT (x, i) != XWINT (y, i)) | |
429 return 0; | |
430 break; | |
431 | |
432 case 'n': | |
433 case 'i': | |
434 if (XINT (x, i) != XINT (y, i)) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
435 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
436 #ifndef GENERATOR_FILE |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
437 if (((code == ASM_OPERANDS && i == 6) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
438 || (code == ASM_INPUT && i == 1)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
439 && locator_eq (XINT (x, i), XINT (y, i))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
440 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
441 #endif |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
442 return 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
443 } |
0 | 444 break; |
445 | |
446 case 'V': | |
447 case 'E': | |
448 /* Two vectors must have the same length. */ | |
449 if (XVECLEN (x, i) != XVECLEN (y, i)) | |
450 return 0; | |
451 | |
452 /* And the corresponding elements must match. */ | |
453 for (j = 0; j < XVECLEN (x, i); j++) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
454 if (rtx_equal_p_cb (XVECEXP (x, i, j), |
0 | 455 XVECEXP (y, i, j), cb) == 0) |
456 return 0; | |
457 break; | |
458 | |
459 case 'e': | |
460 if (rtx_equal_p_cb (XEXP (x, i), XEXP (y, i), cb) == 0) | |
461 return 0; | |
462 break; | |
463 | |
464 case 'S': | |
465 case 's': | |
466 if ((XSTR (x, i) || XSTR (y, i)) | |
467 && (! XSTR (x, i) || ! XSTR (y, i) | |
468 || strcmp (XSTR (x, i), XSTR (y, i)))) | |
469 return 0; | |
470 break; | |
471 | |
472 case 'u': | |
473 /* These are just backpointers, so they don't matter. */ | |
474 break; | |
475 | |
476 case '0': | |
477 case 't': | |
478 break; | |
479 | |
480 /* It is believed that rtx's at this level will never | |
481 contain anything but integers and other rtx's, | |
482 except for within LABEL_REFs and SYMBOL_REFs. */ | |
483 default: | |
484 gcc_unreachable (); | |
485 } | |
486 } | |
487 return 1; | |
488 } | |
489 | |
490 /* Return 1 if X and Y are identical-looking rtx's. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
491 This is the Lisp function EQUAL for rtx arguments. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
492 Whenever changing this function check if rtx_equal_p_cb above doesn't need |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
493 changing as well. */ |
0 | 494 |
495 int | |
496 rtx_equal_p (const_rtx x, const_rtx y) | |
497 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
498 int i; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
499 int j; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
500 enum rtx_code code; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
501 const char *fmt; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
502 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
503 if (x == y) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
504 return 1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
505 if (x == 0 || y == 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
506 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
507 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
508 code = GET_CODE (x); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
509 /* Rtx's of different codes cannot be equal. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
510 if (code != GET_CODE (y)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
511 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
512 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
513 /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
514 (REG:SI x) and (REG:HI x) are NOT equivalent. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
515 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
516 if (GET_MODE (x) != GET_MODE (y)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
517 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
518 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
519 /* MEMs refering to different address space are not equivalent. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
520 if (code == MEM && MEM_ADDR_SPACE (x) != MEM_ADDR_SPACE (y)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
521 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
522 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
523 /* Some RTL can be compared nonrecursively. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
524 switch (code) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
525 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
526 case REG: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
527 return (REGNO (x) == REGNO (y)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
528 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
529 case LABEL_REF: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
530 return XEXP (x, 0) == XEXP (y, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
531 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
532 case SYMBOL_REF: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
533 return XSTR (x, 0) == XSTR (y, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
534 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
535 case DEBUG_EXPR: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
536 case VALUE: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
537 case SCRATCH: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
538 case CONST_DOUBLE: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
539 case CONST_INT: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
540 case CONST_FIXED: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
541 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
542 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
543 case DEBUG_IMPLICIT_PTR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
544 return DEBUG_IMPLICIT_PTR_DECL (x) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
545 == DEBUG_IMPLICIT_PTR_DECL (y); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
546 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
547 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
548 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
549 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
550 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
551 /* Compare the elements. If any pair of corresponding elements |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
552 fail to match, return 0 for the whole thing. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
553 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
554 fmt = GET_RTX_FORMAT (code); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
555 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
556 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
557 switch (fmt[i]) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
558 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
559 case 'w': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
560 if (XWINT (x, i) != XWINT (y, i)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
561 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
562 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
563 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
564 case 'n': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
565 case 'i': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
566 if (XINT (x, i) != XINT (y, i)) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
567 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
568 #ifndef GENERATOR_FILE |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
569 if (((code == ASM_OPERANDS && i == 6) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
570 || (code == ASM_INPUT && i == 1)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
571 && locator_eq (XINT (x, i), XINT (y, i))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
572 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
573 #endif |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
574 return 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
575 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
576 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
577 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
578 case 'V': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
579 case 'E': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
580 /* Two vectors must have the same length. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
581 if (XVECLEN (x, i) != XVECLEN (y, i)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
582 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
583 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
584 /* And the corresponding elements must match. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
585 for (j = 0; j < XVECLEN (x, i); j++) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
586 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
587 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
588 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
589 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
590 case 'e': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
591 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
592 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
593 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
594 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
595 case 'S': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
596 case 's': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
597 if ((XSTR (x, i) || XSTR (y, i)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
598 && (! XSTR (x, i) || ! XSTR (y, i) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
599 || strcmp (XSTR (x, i), XSTR (y, i)))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
600 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
601 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
602 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
603 case 'u': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
604 /* These are just backpointers, so they don't matter. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
605 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
606 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
607 case '0': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
608 case 't': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
609 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
610 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
611 /* It is believed that rtx's at this level will never |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
612 contain anything but integers and other rtx's, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
613 except for within LABEL_REFs and SYMBOL_REFs. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
614 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
615 gcc_unreachable (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
616 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
617 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
618 return 1; |
0 | 619 } |
620 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
621 /* Iteratively hash rtx X. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
622 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
623 hashval_t |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
624 iterative_hash_rtx (const_rtx x, hashval_t hash) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
625 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
626 enum rtx_code code; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
627 enum machine_mode mode; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
628 int i, j; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
629 const char *fmt; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
630 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
631 if (x == NULL_RTX) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
632 return hash; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
633 code = GET_CODE (x); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
634 hash = iterative_hash_object (code, hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
635 mode = GET_MODE (x); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
636 hash = iterative_hash_object (mode, hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
637 switch (code) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
638 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
639 case REG: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
640 i = REGNO (x); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
641 return iterative_hash_object (i, hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
642 case CONST_INT: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
643 return iterative_hash_object (INTVAL (x), hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
644 case SYMBOL_REF: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
645 if (XSTR (x, 0)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
646 return iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
647 hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
648 return hash; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
649 case LABEL_REF: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
650 case DEBUG_EXPR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
651 case VALUE: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
652 case SCRATCH: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
653 case CONST_DOUBLE: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
654 case CONST_FIXED: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
655 case DEBUG_IMPLICIT_PTR: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
656 return hash; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
657 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
658 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
659 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
660 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
661 fmt = GET_RTX_FORMAT (code); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
662 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
663 switch (fmt[i]) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
664 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
665 case 'w': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
666 hash = iterative_hash_object (XWINT (x, i), hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
667 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
668 case 'n': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
669 case 'i': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
670 hash = iterative_hash_object (XINT (x, i), hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
671 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
672 case 'V': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
673 case 'E': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
674 j = XVECLEN (x, i); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
675 hash = iterative_hash_object (j, hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
676 for (j = 0; j < XVECLEN (x, i); j++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
677 hash = iterative_hash_rtx (XVECEXP (x, i, j), hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
678 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
679 case 'e': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
680 hash = iterative_hash_rtx (XEXP (x, i), hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
681 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
682 case 'S': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
683 case 's': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
684 if (XSTR (x, i)) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
685 hash = iterative_hash (XSTR (x, 0), strlen (XSTR (x, 0)) + 1, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
686 hash); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
687 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
688 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
689 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
690 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
691 return hash; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
692 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
693 |
0 | 694 void |
695 dump_rtx_statistics (void) | |
696 { | |
697 #ifdef GATHER_STATISTICS | |
698 int i; | |
699 int total_counts = 0; | |
700 int total_sizes = 0; | |
701 fprintf (stderr, "\nRTX Kind Count Bytes\n"); | |
702 fprintf (stderr, "---------------------------------------\n"); | |
703 for (i = 0; i < LAST_AND_UNUSED_RTX_CODE; i++) | |
704 if (rtx_alloc_counts[i]) | |
705 { | |
706 fprintf (stderr, "%-20s %7d %10d\n", GET_RTX_NAME (i), | |
707 rtx_alloc_counts[i], rtx_alloc_sizes[i]); | |
708 total_counts += rtx_alloc_counts[i]; | |
709 total_sizes += rtx_alloc_sizes[i]; | |
710 } | |
711 if (rtvec_alloc_counts) | |
712 { | |
713 fprintf (stderr, "%-20s %7d %10d\n", "rtvec", | |
714 rtvec_alloc_counts, rtvec_alloc_sizes); | |
715 total_counts += rtvec_alloc_counts; | |
716 total_sizes += rtvec_alloc_sizes; | |
717 } | |
718 fprintf (stderr, "---------------------------------------\n"); | |
719 fprintf (stderr, "%-20s %7d %10d\n", | |
720 "Total", total_counts, total_sizes); | |
721 fprintf (stderr, "---------------------------------------\n"); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
722 #endif |
0 | 723 } |
724 | |
725 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007) | |
726 void | |
727 rtl_check_failed_bounds (const_rtx r, int n, const char *file, int line, | |
728 const char *func) | |
729 { | |
730 internal_error | |
731 ("RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d", | |
732 n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1, | |
733 func, trim_filename (file), line); | |
734 } | |
735 | |
736 void | |
737 rtl_check_failed_type1 (const_rtx r, int n, int c1, const char *file, int line, | |
738 const char *func) | |
739 { | |
740 internal_error | |
741 ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d", | |
742 n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)), | |
743 func, trim_filename (file), line); | |
744 } | |
745 | |
746 void | |
747 rtl_check_failed_type2 (const_rtx r, int n, int c1, int c2, const char *file, | |
748 int line, const char *func) | |
749 { | |
750 internal_error | |
751 ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d", | |
752 n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)), | |
753 func, trim_filename (file), line); | |
754 } | |
755 | |
756 void | |
757 rtl_check_failed_code1 (const_rtx r, enum rtx_code code, const char *file, | |
758 int line, const char *func) | |
759 { | |
760 internal_error ("RTL check: expected code '%s', have '%s' in %s, at %s:%d", | |
761 GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func, | |
762 trim_filename (file), line); | |
763 } | |
764 | |
765 void | |
766 rtl_check_failed_code2 (const_rtx r, enum rtx_code code1, enum rtx_code code2, | |
767 const char *file, int line, const char *func) | |
768 { | |
769 internal_error | |
770 ("RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d", | |
771 GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)), | |
772 func, trim_filename (file), line); | |
773 } | |
774 | |
775 void | |
776 rtl_check_failed_code_mode (const_rtx r, enum rtx_code code, enum machine_mode mode, | |
777 bool not_mode, const char *file, int line, | |
778 const char *func) | |
779 { | |
780 internal_error ((not_mode | |
781 ? ("RTL check: expected code '%s' and not mode '%s', " | |
782 "have code '%s' and mode '%s' in %s, at %s:%d") | |
783 : ("RTL check: expected code '%s' and mode '%s', " | |
784 "have code '%s' and mode '%s' in %s, at %s:%d")), | |
785 GET_RTX_NAME (code), GET_MODE_NAME (mode), | |
786 GET_RTX_NAME (GET_CODE (r)), GET_MODE_NAME (GET_MODE (r)), | |
787 func, trim_filename (file), line); | |
788 } | |
789 | |
790 /* Report that line LINE of FILE tried to access the block symbol fields | |
791 of a non-block symbol. FUNC is the function that contains the line. */ | |
792 | |
793 void | |
794 rtl_check_failed_block_symbol (const char *file, int line, const char *func) | |
795 { | |
796 internal_error | |
797 ("RTL check: attempt to treat non-block symbol as a block symbol " | |
798 "in %s, at %s:%d", func, trim_filename (file), line); | |
799 } | |
800 | |
801 /* XXX Maybe print the vector? */ | |
802 void | |
803 rtvec_check_failed_bounds (const_rtvec r, int n, const char *file, int line, | |
804 const char *func) | |
805 { | |
806 internal_error | |
807 ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d", | |
808 n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line); | |
809 } | |
810 #endif /* ENABLE_RTL_CHECKING */ | |
811 | |
812 #if defined ENABLE_RTL_FLAG_CHECKING | |
813 void | |
814 rtl_check_failed_flag (const char *name, const_rtx r, const char *file, | |
815 int line, const char *func) | |
816 { | |
817 internal_error | |
818 ("RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d", | |
819 name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line); | |
820 } | |
821 #endif /* ENABLE_RTL_FLAG_CHECKING */ |