00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GCC_HARD_REG_SET_H
00022 #define GCC_HARD_REG_SET_H
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 typedef unsigned HOST_WIDE_INT HARD_REG_ELT_TYPE;
00042
00043 #if FIRST_PSEUDO_REGISTER <= HOST_BITS_PER_WIDE_INT
00044
00045 #define HARD_REG_SET HARD_REG_ELT_TYPE
00046
00047 #else
00048
00049 #define HARD_REG_SET_LONGS \
00050 ((FIRST_PSEUDO_REGISTER + HOST_BITS_PER_WIDE_INT - 1) \
00051 / HOST_BITS_PER_WIDE_INT)
00052 typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS];
00053
00054 #endif
00055
00056
00057
00058
00059 #define HARD_CONST(X) ((HARD_REG_ELT_TYPE) (X))
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 #ifdef HARD_REG_SET
00089
00090 #define SET_HARD_REG_BIT(SET, BIT) \
00091 ((SET) |= HARD_CONST (1) << (BIT))
00092 #define CLEAR_HARD_REG_BIT(SET, BIT) \
00093 ((SET) &= ~(HARD_CONST (1) << (BIT)))
00094 #define TEST_HARD_REG_BIT(SET, BIT) \
00095 (!!((SET) & (HARD_CONST (1) << (BIT))))
00096
00097 #define CLEAR_HARD_REG_SET(TO) ((TO) = HARD_CONST (0))
00098 #define SET_HARD_REG_SET(TO) ((TO) = ~ HARD_CONST (0))
00099
00100 #define COPY_HARD_REG_SET(TO, FROM) ((TO) = (FROM))
00101 #define COMPL_HARD_REG_SET(TO, FROM) ((TO) = ~(FROM))
00102
00103 #define IOR_HARD_REG_SET(TO, FROM) ((TO) |= (FROM))
00104 #define IOR_COMPL_HARD_REG_SET(TO, FROM) ((TO) |= ~ (FROM))
00105 #define AND_HARD_REG_SET(TO, FROM) ((TO) &= (FROM))
00106 #define AND_COMPL_HARD_REG_SET(TO, FROM) ((TO) &= ~ (FROM))
00107
00108 #define GO_IF_HARD_REG_SUBSET(X,Y,TO) if (HARD_CONST (0) == ((X) & ~(Y))) goto TO
00109
00110 #define GO_IF_HARD_REG_EQUAL(X,Y,TO) if ((X) == (Y)) goto TO
00111
00112 #else
00113
00114 #define UHOST_BITS_PER_WIDE_INT ((unsigned) HOST_BITS_PER_WIDE_INT)
00115
00116 #define SET_HARD_REG_BIT(SET, BIT) \
00117 ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT] \
00118 |= HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))
00119
00120 #define CLEAR_HARD_REG_BIT(SET, BIT) \
00121 ((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT] \
00122 &= ~(HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT)))
00123
00124 #define TEST_HARD_REG_BIT(SET, BIT) \
00125 (!!((SET)[(BIT) / UHOST_BITS_PER_WIDE_INT] \
00126 & (HARD_CONST (1) << ((BIT) % UHOST_BITS_PER_WIDE_INT))))
00127
00128 #if FIRST_PSEUDO_REGISTER <= 2*HOST_BITS_PER_WIDE_INT
00129 #define CLEAR_HARD_REG_SET(TO) \
00130 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00131 scan_tp_[0] = 0; \
00132 scan_tp_[1] = 0; } while (0)
00133
00134 #define SET_HARD_REG_SET(TO) \
00135 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00136 scan_tp_[0] = -1; \
00137 scan_tp_[1] = -1; } while (0)
00138
00139 #define COPY_HARD_REG_SET(TO, FROM) \
00140 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00141 scan_tp_[0] = scan_fp_[0]; \
00142 scan_tp_[1] = scan_fp_[1]; } while (0)
00143
00144 #define COMPL_HARD_REG_SET(TO, FROM) \
00145 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00146 scan_tp_[0] = ~ scan_fp_[0]; \
00147 scan_tp_[1] = ~ scan_fp_[1]; } while (0)
00148
00149 #define AND_HARD_REG_SET(TO, FROM) \
00150 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00151 scan_tp_[0] &= scan_fp_[0]; \
00152 scan_tp_[1] &= scan_fp_[1]; } while (0)
00153
00154 #define AND_COMPL_HARD_REG_SET(TO, FROM) \
00155 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00156 scan_tp_[0] &= ~ scan_fp_[0]; \
00157 scan_tp_[1] &= ~ scan_fp_[1]; } while (0)
00158
00159 #define IOR_HARD_REG_SET(TO, FROM) \
00160 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00161 scan_tp_[0] |= scan_fp_[0]; \
00162 scan_tp_[1] |= scan_fp_[1]; } while (0)
00163
00164 #define IOR_COMPL_HARD_REG_SET(TO, FROM) \
00165 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00166 scan_tp_[0] |= ~ scan_fp_[0]; \
00167 scan_tp_[1] |= ~ scan_fp_[1]; } while (0)
00168
00169 #define GO_IF_HARD_REG_SUBSET(X,Y,TO) \
00170 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00171 if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \
00172 && (0 == (scan_xp_[1] & ~ scan_yp_[1]))) \
00173 goto TO; } while (0)
00174
00175 #define GO_IF_HARD_REG_EQUAL(X,Y,TO) \
00176 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00177 if ((scan_xp_[0] == scan_yp_[0]) \
00178 && (scan_xp_[1] == scan_yp_[1])) \
00179 goto TO; } while (0)
00180
00181 #else
00182 #if FIRST_PSEUDO_REGISTER <= 3*HOST_BITS_PER_WIDE_INT
00183 #define CLEAR_HARD_REG_SET(TO) \
00184 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00185 scan_tp_[0] = 0; \
00186 scan_tp_[1] = 0; \
00187 scan_tp_[2] = 0; } while (0)
00188
00189 #define SET_HARD_REG_SET(TO) \
00190 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00191 scan_tp_[0] = -1; \
00192 scan_tp_[1] = -1; \
00193 scan_tp_[2] = -1; } while (0)
00194
00195 #define COPY_HARD_REG_SET(TO, FROM) \
00196 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00197 scan_tp_[0] = scan_fp_[0]; \
00198 scan_tp_[1] = scan_fp_[1]; \
00199 scan_tp_[2] = scan_fp_[2]; } while (0)
00200
00201 #define COMPL_HARD_REG_SET(TO, FROM) \
00202 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00203 scan_tp_[0] = ~ scan_fp_[0]; \
00204 scan_tp_[1] = ~ scan_fp_[1]; \
00205 scan_tp_[2] = ~ scan_fp_[2]; } while (0)
00206
00207 #define AND_HARD_REG_SET(TO, FROM) \
00208 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00209 scan_tp_[0] &= scan_fp_[0]; \
00210 scan_tp_[1] &= scan_fp_[1]; \
00211 scan_tp_[2] &= scan_fp_[2]; } while (0)
00212
00213 #define AND_COMPL_HARD_REG_SET(TO, FROM) \
00214 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00215 scan_tp_[0] &= ~ scan_fp_[0]; \
00216 scan_tp_[1] &= ~ scan_fp_[1]; \
00217 scan_tp_[2] &= ~ scan_fp_[2]; } while (0)
00218
00219 #define IOR_HARD_REG_SET(TO, FROM) \
00220 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00221 scan_tp_[0] |= scan_fp_[0]; \
00222 scan_tp_[1] |= scan_fp_[1]; \
00223 scan_tp_[2] |= scan_fp_[2]; } while (0)
00224
00225 #define IOR_COMPL_HARD_REG_SET(TO, FROM) \
00226 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00227 scan_tp_[0] |= ~ scan_fp_[0]; \
00228 scan_tp_[1] |= ~ scan_fp_[1]; \
00229 scan_tp_[2] |= ~ scan_fp_[2]; } while (0)
00230
00231 #define GO_IF_HARD_REG_SUBSET(X,Y,TO) \
00232 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00233 if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \
00234 && (0 == (scan_xp_[1] & ~ scan_yp_[1])) \
00235 && (0 == (scan_xp_[2] & ~ scan_yp_[2]))) \
00236 goto TO; } while (0)
00237
00238 #define GO_IF_HARD_REG_EQUAL(X,Y,TO) \
00239 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00240 if ((scan_xp_[0] == scan_yp_[0]) \
00241 && (scan_xp_[1] == scan_yp_[1]) \
00242 && (scan_xp_[2] == scan_yp_[2])) \
00243 goto TO; } while (0)
00244
00245 #else
00246 #if FIRST_PSEUDO_REGISTER <= 4*HOST_BITS_PER_WIDE_INT
00247 #define CLEAR_HARD_REG_SET(TO) \
00248 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00249 scan_tp_[0] = 0; \
00250 scan_tp_[1] = 0; \
00251 scan_tp_[2] = 0; \
00252 scan_tp_[3] = 0; } while (0)
00253
00254 #define SET_HARD_REG_SET(TO) \
00255 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00256 scan_tp_[0] = -1; \
00257 scan_tp_[1] = -1; \
00258 scan_tp_[2] = -1; \
00259 scan_tp_[3] = -1; } while (0)
00260
00261 #define COPY_HARD_REG_SET(TO, FROM) \
00262 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00263 scan_tp_[0] = scan_fp_[0]; \
00264 scan_tp_[1] = scan_fp_[1]; \
00265 scan_tp_[2] = scan_fp_[2]; \
00266 scan_tp_[3] = scan_fp_[3]; } while (0)
00267
00268 #define COMPL_HARD_REG_SET(TO, FROM) \
00269 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00270 scan_tp_[0] = ~ scan_fp_[0]; \
00271 scan_tp_[1] = ~ scan_fp_[1]; \
00272 scan_tp_[2] = ~ scan_fp_[2]; \
00273 scan_tp_[3] = ~ scan_fp_[3]; } while (0)
00274
00275 #define AND_HARD_REG_SET(TO, FROM) \
00276 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00277 scan_tp_[0] &= scan_fp_[0]; \
00278 scan_tp_[1] &= scan_fp_[1]; \
00279 scan_tp_[2] &= scan_fp_[2]; \
00280 scan_tp_[3] &= scan_fp_[3]; } while (0)
00281
00282 #define AND_COMPL_HARD_REG_SET(TO, FROM) \
00283 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00284 scan_tp_[0] &= ~ scan_fp_[0]; \
00285 scan_tp_[1] &= ~ scan_fp_[1]; \
00286 scan_tp_[2] &= ~ scan_fp_[2]; \
00287 scan_tp_[3] &= ~ scan_fp_[3]; } while (0)
00288
00289 #define IOR_HARD_REG_SET(TO, FROM) \
00290 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00291 scan_tp_[0] |= scan_fp_[0]; \
00292 scan_tp_[1] |= scan_fp_[1]; \
00293 scan_tp_[2] |= scan_fp_[2]; \
00294 scan_tp_[3] |= scan_fp_[3]; } while (0)
00295
00296 #define IOR_COMPL_HARD_REG_SET(TO, FROM) \
00297 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00298 scan_tp_[0] |= ~ scan_fp_[0]; \
00299 scan_tp_[1] |= ~ scan_fp_[1]; \
00300 scan_tp_[2] |= ~ scan_fp_[2]; \
00301 scan_tp_[3] |= ~ scan_fp_[3]; } while (0)
00302
00303 #define GO_IF_HARD_REG_SUBSET(X,Y,TO) \
00304 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00305 if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \
00306 && (0 == (scan_xp_[1] & ~ scan_yp_[1])) \
00307 && (0 == (scan_xp_[2] & ~ scan_yp_[2])) \
00308 && (0 == (scan_xp_[3] & ~ scan_yp_[3]))) \
00309 goto TO; } while (0)
00310
00311 #define GO_IF_HARD_REG_EQUAL(X,Y,TO) \
00312 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00313 if ((scan_xp_[0] == scan_yp_[0]) \
00314 && (scan_xp_[1] == scan_yp_[1]) \
00315 && (scan_xp_[2] == scan_yp_[2]) \
00316 && (scan_xp_[3] == scan_yp_[3])) \
00317 goto TO; } while (0)
00318
00319 #else
00320
00321 #define CLEAR_HARD_REG_SET(TO) \
00322 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00323 int i; \
00324 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00325 *scan_tp_++ = 0; } while (0)
00326
00327 #define SET_HARD_REG_SET(TO) \
00328 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \
00329 int i; \
00330 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00331 *scan_tp_++ = -1; } while (0)
00332
00333 #define COPY_HARD_REG_SET(TO, FROM) \
00334 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00335 int i; \
00336 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00337 *scan_tp_++ = *scan_fp_++; } while (0)
00338
00339 #define COMPL_HARD_REG_SET(TO, FROM) \
00340 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00341 int i; \
00342 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00343 *scan_tp_++ = ~ *scan_fp_++; } while (0)
00344
00345 #define AND_HARD_REG_SET(TO, FROM) \
00346 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00347 int i; \
00348 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00349 *scan_tp_++ &= *scan_fp_++; } while (0)
00350
00351 #define AND_COMPL_HARD_REG_SET(TO, FROM) \
00352 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00353 int i; \
00354 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00355 *scan_tp_++ &= ~ *scan_fp_++; } while (0)
00356
00357 #define IOR_HARD_REG_SET(TO, FROM) \
00358 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00359 int i; \
00360 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00361 *scan_tp_++ |= *scan_fp_++; } while (0)
00362
00363 #define IOR_COMPL_HARD_REG_SET(TO, FROM) \
00364 do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \
00365 int i; \
00366 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00367 *scan_tp_++ |= ~ *scan_fp_++; } while (0)
00368
00369 #define GO_IF_HARD_REG_SUBSET(X,Y,TO) \
00370 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00371 int i; \
00372 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00373 if (0 != (*scan_xp_++ & ~ *scan_yp_++)) break; \
00374 if (i == HARD_REG_SET_LONGS) goto TO; } while (0)
00375
00376 #define GO_IF_HARD_REG_EQUAL(X,Y,TO) \
00377 do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \
00378 int i; \
00379 for (i = 0; i < HARD_REG_SET_LONGS; i++) \
00380 if (*scan_xp_++ != *scan_yp_++) break; \
00381 if (i == HARD_REG_SET_LONGS) goto TO; } while (0)
00382
00383 #endif
00384 #endif
00385 #endif
00386 #endif
00387
00388
00389
00390
00391
00392
00393
00394
00395 extern char fixed_regs[FIRST_PSEUDO_REGISTER];
00396
00397
00398
00399 extern HARD_REG_SET fixed_reg_set;
00400
00401
00402
00403
00404
00405
00406 extern char call_used_regs[FIRST_PSEUDO_REGISTER];
00407
00408 #ifdef CALL_REALLY_USED_REGISTERS
00409 extern char call_really_used_regs[];
00410 #endif
00411
00412
00413
00414 extern HARD_REG_SET call_used_reg_set;
00415
00416
00417 extern HARD_REG_SET losing_caller_save_reg_set;
00418
00419
00420
00421
00422
00423
00424
00425 extern char call_fixed_regs[FIRST_PSEUDO_REGISTER];
00426
00427
00428
00429 extern HARD_REG_SET call_fixed_reg_set;
00430
00431
00432
00433
00434
00435
00436 extern char global_regs[FIRST_PSEUDO_REGISTER];
00437
00438
00439
00440
00441
00442
00443
00444
00445 extern HARD_REG_SET regs_invalidated_by_call;
00446
00447 #ifdef REG_ALLOC_ORDER
00448
00449
00450 extern int reg_alloc_order[FIRST_PSEUDO_REGISTER];
00451
00452
00453
00454 extern int inv_reg_alloc_order[FIRST_PSEUDO_REGISTER];
00455 #endif
00456
00457
00458
00459 extern HARD_REG_SET reg_class_contents[N_REG_CLASSES];
00460
00461
00462
00463 extern unsigned int reg_class_size[N_REG_CLASSES];
00464
00465
00466
00467 extern enum reg_class reg_class_superclasses[N_REG_CLASSES][N_REG_CLASSES];
00468
00469
00470
00471 extern enum reg_class reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
00472
00473
00474
00475
00476 extern enum reg_class reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
00477
00478
00479
00480
00481 extern enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
00482
00483
00484
00485 extern int n_non_fixed_regs;
00486
00487
00488
00489 extern const char * reg_names[FIRST_PSEUDO_REGISTER];
00490
00491
00492
00493 #define REG_CANNOT_CHANGE_MODE_P(REGN, FROM, TO) \
00494 CANNOT_CHANGE_MODE_CLASS (FROM, TO, REGNO_REG_CLASS (REGN))
00495
00496 #endif