00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "rtl.h"
00025 #include "real.h"
00026 #include "ggc.h"
00027 #include "errors.h"
00028
00029
00030
00031
00032
00033 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) sizeof FORMAT - 1 ,
00034
00035 const unsigned char rtx_length[NUM_RTX_CODE] = {
00036 #include "rtl.def"
00037 };
00038
00039 #undef DEF_RTL_EXPR
00040
00041
00042
00043 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) NAME ,
00044
00045 const char * const rtx_name[NUM_RTX_CODE] = {
00046 #include "rtl.def"
00047 };
00048
00049 #undef DEF_RTL_EXPR
00050
00051
00052
00053
00054 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) NAME,
00055
00056 const char * const mode_name[NUM_MACHINE_MODES] = {
00057 #include "machmode.def"
00058 };
00059
00060 #undef DEF_MACHMODE
00061
00062
00063
00064 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) CLASS,
00065
00066 const enum mode_class mode_class[NUM_MACHINE_MODES] = {
00067 #include "machmode.def"
00068 };
00069
00070 #undef DEF_MACHMODE
00071
00072
00073
00074
00075 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) BITSIZE,
00076
00077 const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
00078 #include "machmode.def"
00079 };
00080
00081 #undef DEF_MACHMODE
00082
00083
00084
00085
00086 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) SIZE,
00087
00088 const unsigned char mode_size[NUM_MACHINE_MODES] = {
00089 #include "machmode.def"
00090 };
00091
00092 #undef DEF_MACHMODE
00093
00094
00095
00096
00097 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) UNIT,
00098
00099 const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
00100 #include "machmode.def"
00101 };
00102
00103 #undef DEF_MACHMODE
00104
00105
00106
00107
00108
00109 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) \
00110 (unsigned char) WIDER,
00111
00112 const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
00113 #include "machmode.def"
00114 };
00115
00116 #undef DEF_MACHMODE
00117
00118 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) \
00119 ((BITSIZE) >= HOST_BITS_PER_WIDE_INT) ? ~(unsigned HOST_WIDE_INT) 0 : ((unsigned HOST_WIDE_INT) 1 << (BITSIZE)) - 1,
00120
00121
00122
00123 const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
00124 #include "machmode.def"
00125 };
00126
00127 #undef DEF_MACHMODE
00128
00129 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER, INNER) INNER,
00130
00131
00132
00133
00134 const enum machine_mode inner_mode_array[NUM_MACHINE_MODES] = {
00135 #include "machmode.def"
00136 };
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 const enum machine_mode class_narrowest_mode[(int) MAX_MODE_CLASS] = {
00148 VOIDmode,
00149 QImode,
00150 QFmode,
00151 PQImode,
00152 CCmode,
00153 CQImode,
00154 QCmode,
00155 V1DImode,
00156 V2SFmode
00157 };
00158
00159
00160
00161
00162
00163
00164 const char * const rtx_format[NUM_RTX_CODE] = {
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) FORMAT ,
00193 #include "rtl.def"
00194 #undef DEF_RTL_EXPR
00195 };
00196
00197
00198
00199
00200 const char rtx_class[NUM_RTX_CODE] = {
00201 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) CLASS,
00202 #include "rtl.def"
00203 #undef DEF_RTL_EXPR
00204 };
00205
00206
00207
00208 const char * const note_insn_name[NOTE_INSN_MAX - NOTE_INSN_BIAS] =
00209 {
00210 "", "NOTE_INSN_DELETED",
00211 "NOTE_INSN_BLOCK_BEG", "NOTE_INSN_BLOCK_END",
00212 "NOTE_INSN_LOOP_BEG", "NOTE_INSN_LOOP_END",
00213 "NOTE_INSN_LOOP_CONT", "NOTE_INSN_LOOP_VTOP",
00214 "NOTE_INSN_LOOP_END_TOP_COND", "NOTE_INSN_FUNCTION_END",
00215 "NOTE_INSN_PROLOGUE_END", "NOTE_INSN_EPILOGUE_BEG",
00216 "NOTE_INSN_DELETED_LABEL", "NOTE_INSN_FUNCTION_BEG",
00217 "NOTE_INSN_EH_REGION_BEG", "NOTE_INSN_EH_REGION_END",
00218 "NOTE_INSN_REPEATED_LINE_NUMBER",
00219 "NOTE_INSN_BASIC_BLOCK", "NOTE_INSN_EXPECTED_VALUE",
00220 "NOTE_INSN_PREDICTION"
00221 };
00222
00223 const char * const reg_note_name[] =
00224 {
00225 "", "REG_DEAD", "REG_INC", "REG_EQUIV", "REG_EQUAL",
00226 "REG_WAS_0", "REG_RETVAL", "REG_LIBCALL", "REG_NONNEG",
00227 "REG_NO_CONFLICT", "REG_UNUSED", "REG_CC_SETTER", "REG_CC_USER",
00228 "REG_LABEL", "REG_DEP_ANTI", "REG_DEP_OUTPUT", "REG_BR_PROB",
00229 "REG_NOALIAS", "REG_SAVE_AREA", "REG_BR_PRED",
00230 "REG_FRAME_RELATED_EXPR", "REG_EH_CONTEXT", "REG_EH_REGION",
00231 "REG_SAVE_NOTE", "REG_MAYBE_DEAD", "REG_NORETURN",
00232 "REG_NON_LOCAL_GOTO", "REG_SETJMP", "REG_ALWAYS_RETURN",
00233 "REG_VTABLE_REF"
00234 };
00235
00236
00237
00238
00239
00240 rtvec
00241 rtvec_alloc (n)
00242 int n;
00243 {
00244 rtvec rt;
00245
00246 rt = ggc_alloc_rtvec (n);
00247
00248 memset (&rt->elem[0], 0, n * sizeof (rtx));
00249
00250 PUT_NUM_ELEM (rt, n);
00251 return rt;
00252 }
00253
00254
00255
00256
00257 rtx
00258 rtx_alloc (code)
00259 RTX_CODE code;
00260 {
00261 rtx rt;
00262 int n = GET_RTX_LENGTH (code);
00263
00264 rt = ggc_alloc_rtx (n);
00265
00266
00267
00268
00269
00270 memset (rt, 0, sizeof (struct rtx_def) - sizeof (rtunion));
00271 PUT_CODE (rt, code);
00272 return rt;
00273 }
00274
00275
00276
00277
00278
00279
00280 rtx
00281 copy_rtx (orig)
00282 rtx orig;
00283 {
00284 rtx copy;
00285 int i, j;
00286 RTX_CODE code;
00287 const char *format_ptr;
00288
00289 code = GET_CODE (orig);
00290
00291 switch (code)
00292 {
00293 case REG:
00294 case QUEUED:
00295 case CONST_INT:
00296 case CONST_DOUBLE:
00297 case CONST_VECTOR:
00298 case SYMBOL_REF:
00299 case CODE_LABEL:
00300 case PC:
00301 case CC0:
00302 case SCRATCH:
00303
00304 case ADDRESSOF:
00305 return orig;
00306
00307 case CONST:
00308
00309
00310 if (GET_CODE (XEXP (orig, 0)) == PLUS
00311 && GET_CODE (XEXP (XEXP (orig, 0), 0)) == SYMBOL_REF
00312 && GET_CODE (XEXP (XEXP (orig, 0), 1)) == CONST_INT)
00313 return orig;
00314 break;
00315
00316
00317
00318
00319
00320
00321 default:
00322 break;
00323 }
00324
00325 copy = rtx_alloc (code);
00326
00327
00328
00329
00330
00331 memcpy (copy, orig, sizeof (struct rtx_def) - sizeof (rtunion));
00332
00333
00334
00335 RTX_FLAG (copy, used) = 0;
00336
00337
00338 if (GET_RTX_CLASS (code) == 'i')
00339 RTX_FLAG (copy, frame_related) = 0;
00340 RTX_FLAG (copy, jump) = RTX_FLAG (orig, jump);
00341 RTX_FLAG (copy, call) = RTX_FLAG (orig, call);
00342
00343 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
00344
00345 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
00346 {
00347 copy->fld[i] = orig->fld[i];
00348 switch (*format_ptr++)
00349 {
00350 case 'e':
00351 if (XEXP (orig, i) != NULL)
00352 XEXP (copy, i) = copy_rtx (XEXP (orig, i));
00353 break;
00354
00355 case 'E':
00356 case 'V':
00357 if (XVEC (orig, i) != NULL)
00358 {
00359 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
00360 for (j = 0; j < XVECLEN (copy, i); j++)
00361 XVECEXP (copy, i, j) = copy_rtx (XVECEXP (orig, i, j));
00362 }
00363 break;
00364
00365 case 't':
00366 case 'w':
00367 case 'i':
00368 case 's':
00369 case 'S':
00370 case 'T':
00371 case 'u':
00372 case 'B':
00373 case '0':
00374
00375 break;
00376
00377 default:
00378 abort ();
00379 }
00380 }
00381 return copy;
00382 }
00383
00384
00385
00386 rtx
00387 shallow_copy_rtx (orig)
00388 rtx orig;
00389 {
00390 RTX_CODE code = GET_CODE (orig);
00391 size_t n = GET_RTX_LENGTH (code);
00392 rtx copy = ggc_alloc_rtx (n);
00393
00394 memcpy (copy, orig,
00395 sizeof (struct rtx_def) + sizeof (rtunion) * (n - 1));
00396
00397 return copy;
00398 }
00399
00400
00401 int rtx_equal_function_value_matters;
00402
00403
00404 int generating_concat_p;
00405
00406
00407
00408
00409 int
00410 rtx_equal_p (x, y)
00411 rtx x, y;
00412 {
00413 int i;
00414 int j;
00415 enum rtx_code code;
00416 const char *fmt;
00417
00418 if (x == y)
00419 return 1;
00420 if (x == 0 || y == 0)
00421 return 0;
00422
00423 code = GET_CODE (x);
00424
00425 if (code != GET_CODE (y))
00426 return 0;
00427
00428
00429
00430
00431 if (GET_MODE (x) != GET_MODE (y))
00432 return 0;
00433
00434
00435 switch (code)
00436 {
00437 case REG:
00438
00439
00440
00441
00442
00443 return (REGNO (x) == REGNO (y)
00444 && (! rtx_equal_function_value_matters
00445 || REG_FUNCTION_VALUE_P (x) == REG_FUNCTION_VALUE_P (y)));
00446
00447 case LABEL_REF:
00448 return XEXP (x, 0) == XEXP (y, 0);
00449
00450 case SYMBOL_REF:
00451 return XSTR (x, 0) == XSTR (y, 0);
00452
00453 case SCRATCH:
00454 case CONST_DOUBLE:
00455 case CONST_INT:
00456 case CONST_VECTOR:
00457 return 0;
00458
00459 default:
00460 break;
00461 }
00462
00463
00464
00465
00466 fmt = GET_RTX_FORMAT (code);
00467 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
00468 {
00469 switch (fmt[i])
00470 {
00471 case 'w':
00472 if (XWINT (x, i) != XWINT (y, i))
00473 return 0;
00474 break;
00475
00476 case 'n':
00477 case 'i':
00478 if (XINT (x, i) != XINT (y, i))
00479 return 0;
00480 break;
00481
00482 case 'V':
00483 case 'E':
00484
00485 if (XVECLEN (x, i) != XVECLEN (y, i))
00486 return 0;
00487
00488
00489 for (j = 0; j < XVECLEN (x, i); j++)
00490 if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0)
00491 return 0;
00492 break;
00493
00494 case 'e':
00495 if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0)
00496 return 0;
00497 break;
00498
00499 case 'S':
00500 case 's':
00501 if ((XSTR (x, i) || XSTR (y, i))
00502 && (! XSTR (x, i) || ! XSTR (y, i)
00503 || strcmp (XSTR (x, i), XSTR (y, i))))
00504 return 0;
00505 break;
00506
00507 case 'u':
00508
00509 break;
00510
00511 case '0':
00512 case 't':
00513 break;
00514
00515
00516
00517
00518 default:
00519 abort ();
00520 }
00521 }
00522 return 1;
00523 }
00524
00525 #if defined ENABLE_RTL_CHECKING && (GCC_VERSION >= 2007)
00526 void
00527 rtl_check_failed_bounds (r, n, file, line, func)
00528 rtx r;
00529 int n;
00530 const char *file;
00531 int line;
00532 const char *func;
00533 {
00534 internal_error
00535 ("RTL check: access of elt %d of `%s' with last elt %d in %s, at %s:%d",
00536 n, GET_RTX_NAME (GET_CODE (r)), GET_RTX_LENGTH (GET_CODE (r)) - 1,
00537 func, trim_filename (file), line);
00538 }
00539
00540 void
00541 rtl_check_failed_type1 (r, n, c1, file, line, func)
00542 rtx r;
00543 int n;
00544 int c1;
00545 const char *file;
00546 int line;
00547 const char *func;
00548 {
00549 internal_error
00550 ("RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d",
00551 n, c1, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
00552 func, trim_filename (file), line);
00553 }
00554
00555 void
00556 rtl_check_failed_type2 (r, n, c1, c2, file, line, func)
00557 rtx r;
00558 int n;
00559 int c1;
00560 int c2;
00561 const char *file;
00562 int line;
00563 const char *func;
00564 {
00565 internal_error
00566 ("RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d",
00567 n, c1, c2, GET_RTX_FORMAT (GET_CODE (r))[n], GET_RTX_NAME (GET_CODE (r)),
00568 func, trim_filename (file), line);
00569 }
00570
00571 void
00572 rtl_check_failed_code1 (r, code, file, line, func)
00573 rtx r;
00574 enum rtx_code code;
00575 const char *file;
00576 int line;
00577 const char *func;
00578 {
00579 internal_error ("RTL check: expected code `%s', have `%s' in %s, at %s:%d",
00580 GET_RTX_NAME (code), GET_RTX_NAME (GET_CODE (r)), func,
00581 trim_filename (file), line);
00582 }
00583
00584 void
00585 rtl_check_failed_code2 (r, code1, code2, file, line, func)
00586 rtx r;
00587 enum rtx_code code1, code2;
00588 const char *file;
00589 int line;
00590 const char *func;
00591 {
00592 internal_error
00593 ("RTL check: expected code `%s' or `%s', have `%s' in %s, at %s:%d",
00594 GET_RTX_NAME (code1), GET_RTX_NAME (code2), GET_RTX_NAME (GET_CODE (r)),
00595 func, trim_filename (file), line);
00596 }
00597
00598
00599 void
00600 rtvec_check_failed_bounds (r, n, file, line, func)
00601 rtvec r;
00602 int n;
00603 const char *file;
00604 int line;
00605 const char *func;
00606 {
00607 internal_error
00608 ("RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d",
00609 n, GET_NUM_ELEM (r) - 1, func, trim_filename (file), line);
00610 }
00611 #endif
00612
00613 #if defined ENABLE_RTL_FLAG_CHECKING
00614 void
00615 rtl_check_failed_flag (name, r, file, line, func)
00616 const char *name;
00617 rtx r;
00618 const char *file;
00619 int line;
00620 const char *func;
00621 {
00622 internal_error
00623 ("RTL flag check: %s used with unexpected rtx code `%s' in %s, at %s:%d",
00624 name, GET_RTX_NAME (GET_CODE (r)), func, trim_filename (file), line);
00625 }
00626 #endif