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