X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fhard-reg-set.h;h=21030fdd2dfeca37b4e02564c729df8642923467;hb=b35a8f4864f6fdabc2a47ad3c650248bbc6a4be7;hp=b101c5eb6e6eb426afdd7e6eeac4e71f8ac5bb74;hpb=a792c50014aeb5c4cb79f539e07574bfd72ab65e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/hard-reg-set.h b/gcc/hard-reg-set.h index b101c5eb6e6..21030fdd2df 100644 --- a/gcc/hard-reg-set.h +++ b/gcc/hard-reg-set.h @@ -1,12 +1,12 @@ /* Sets (bit vectors) of hard registers, and operations on them. - Copyright (C) 1987, 1992, 1994, 2000, 2003, 2004, 2005 + Copyright (C) 1987, 1992, 1994, 2000, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GCC GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +along with GCC; see the file COPYING3. If not see +. */ #ifndef GCC_HARD_REG_SET_H #define GCC_HARD_REG_SET_H @@ -83,9 +82,12 @@ typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS]; IOR_COMPL_HARD_REG_SET and AND_COMPL_HARD_REG_SET which use the complement of the set FROM. - Also define GO_IF_HARD_REG_SUBSET (X, Y, TO): - if X is a subset of Y, go to TO. -*/ + Also define: + + hard_reg_set_subset_p (X, Y), which returns true if X is a subset of Y. + hard_reg_set_equal_p (X, Y), which returns true if X and Y are equal. + hard_reg_set_intersect_p (X, Y), which returns true if X and Y intersect. + hard_reg_set_empty_p (X), which returns true if X is empty. */ #ifdef HARD_REG_SET @@ -107,9 +109,29 @@ typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS]; #define AND_HARD_REG_SET(TO, FROM) ((TO) &= (FROM)) #define AND_COMPL_HARD_REG_SET(TO, FROM) ((TO) &= ~ (FROM)) -#define GO_IF_HARD_REG_SUBSET(X,Y,TO) if (HARD_CONST (0) == ((X) & ~(Y))) goto TO - -#define GO_IF_HARD_REG_EQUAL(X,Y,TO) if ((X) == (Y)) goto TO +static inline bool +hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return (x & ~y) == HARD_CONST (0); +} + +static inline bool +hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return x == y; +} + +static inline bool +hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return (x & y) != HARD_CONST (0); +} + +static inline bool +hard_reg_set_empty_p (const HARD_REG_SET x) +{ + return x == HARD_CONST (0); +} #else @@ -168,17 +190,29 @@ do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \ scan_tp_[0] |= ~ scan_fp_[0]; \ scan_tp_[1] |= ~ scan_fp_[1]; } while (0) -#define GO_IF_HARD_REG_SUBSET(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \ - && (0 == (scan_xp_[1] & ~ scan_yp_[1]))) \ - goto TO; } while (0) - -#define GO_IF_HARD_REG_EQUAL(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((scan_xp_[0] == scan_yp_[0]) \ - && (scan_xp_[1] == scan_yp_[1])) \ - goto TO; } while (0) +static inline bool +hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return (x[0] & ~y[0]) == 0 && (x[1] & ~y[1]) == 0; +} + +static inline bool +hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return x[0] == y[0] && x[1] == y[1]; +} + +static inline bool +hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return (x[0] & y[0]) != 0 || (x[1] & y[1]) != 0; +} + +static inline bool +hard_reg_set_empty_p (const HARD_REG_SET x) +{ + return x[0] == 0 && x[1] == 0; +} #else #if FIRST_PSEUDO_REGISTER <= 3*HOST_BITS_PER_WIDEST_FAST_INT @@ -230,19 +264,33 @@ do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \ scan_tp_[1] |= ~ scan_fp_[1]; \ scan_tp_[2] |= ~ scan_fp_[2]; } while (0) -#define GO_IF_HARD_REG_SUBSET(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \ - && (0 == (scan_xp_[1] & ~ scan_yp_[1])) \ - && (0 == (scan_xp_[2] & ~ scan_yp_[2]))) \ - goto TO; } while (0) - -#define GO_IF_HARD_REG_EQUAL(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((scan_xp_[0] == scan_yp_[0]) \ - && (scan_xp_[1] == scan_yp_[1]) \ - && (scan_xp_[2] == scan_yp_[2])) \ - goto TO; } while (0) +static inline bool +hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return ((x[0] & ~y[0]) == 0 + && (x[1] & ~y[1]) == 0 + && (x[2] & ~y[2]) == 0); +} + +static inline bool +hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return x[0] == y[0] && x[1] == y[1] && x[2] == y[2]; +} + +static inline bool +hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return ((x[0] & y[0]) != 0 + || (x[1] & y[1]) != 0 + || (x[2] & y[2]) != 0); +} + +static inline bool +hard_reg_set_empty_p (const HARD_REG_SET x) +{ + return x[0] == 0 && x[1] == 0 && x[2] == 0; +} #else #if FIRST_PSEUDO_REGISTER <= 4*HOST_BITS_PER_WIDEST_FAST_INT @@ -302,23 +350,37 @@ do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \ scan_tp_[2] |= ~ scan_fp_[2]; \ scan_tp_[3] |= ~ scan_fp_[3]; } while (0) -#define GO_IF_HARD_REG_SUBSET(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((0 == (scan_xp_[0] & ~ scan_yp_[0])) \ - && (0 == (scan_xp_[1] & ~ scan_yp_[1])) \ - && (0 == (scan_xp_[2] & ~ scan_yp_[2])) \ - && (0 == (scan_xp_[3] & ~ scan_yp_[3]))) \ - goto TO; } while (0) - -#define GO_IF_HARD_REG_EQUAL(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - if ((scan_xp_[0] == scan_yp_[0]) \ - && (scan_xp_[1] == scan_yp_[1]) \ - && (scan_xp_[2] == scan_yp_[2]) \ - && (scan_xp_[3] == scan_yp_[3])) \ - goto TO; } while (0) - -#else /* FIRST_PSEUDO_REGISTER > 3*HOST_BITS_PER_WIDEST_FAST_INT */ +static inline bool +hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return ((x[0] & ~y[0]) == 0 + && (x[1] & ~y[1]) == 0 + && (x[2] & ~y[2]) == 0 + && (x[3] & ~y[3]) == 0); +} + +static inline bool +hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return x[0] == y[0] && x[1] == y[1] && x[2] == y[2] && x[3] == y[3]; +} + +static inline bool +hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + return ((x[0] & y[0]) != 0 + || (x[1] & y[1]) != 0 + || (x[2] & y[2]) != 0 + || (x[3] & y[3]) != 0); +} + +static inline bool +hard_reg_set_empty_p (const HARD_REG_SET x) +{ + return x[0] == 0 && x[1] == 0 && x[2] == 0 && x[3] == 0; +} + +#else /* FIRST_PSEUDO_REGISTER > 4*HOST_BITS_PER_WIDEST_FAST_INT */ #define CLEAR_HARD_REG_SET(TO) \ do { HARD_REG_ELT_TYPE *scan_tp_ = (TO); \ @@ -368,19 +430,49 @@ do { HARD_REG_ELT_TYPE *scan_tp_ = (TO), *scan_fp_ = (FROM); \ for (i = 0; i < HARD_REG_SET_LONGS; i++) \ *scan_tp_++ |= ~ *scan_fp_++; } while (0) -#define GO_IF_HARD_REG_SUBSET(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - int i; \ - for (i = 0; i < HARD_REG_SET_LONGS; i++) \ - if (0 != (*scan_xp_++ & ~ *scan_yp_++)) break; \ - if (i == HARD_REG_SET_LONGS) goto TO; } while (0) - -#define GO_IF_HARD_REG_EQUAL(X,Y,TO) \ -do { HARD_REG_ELT_TYPE *scan_xp_ = (X), *scan_yp_ = (Y); \ - int i; \ - for (i = 0; i < HARD_REG_SET_LONGS; i++) \ - if (*scan_xp_++ != *scan_yp_++) break; \ - if (i == HARD_REG_SET_LONGS) goto TO; } while (0) +static inline bool +hard_reg_set_subset_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + int i; + + for (i = 0; i < HARD_REG_SET_LONGS; i++) + if ((x[i] & ~y[i]) != 0) + return false; + return true; +} + +static inline bool +hard_reg_set_equal_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + int i; + + for (i = 0; i < HARD_REG_SET_LONGS; i++) + if (x[i] != y[i]) + return false; + return true; +} + +static inline bool +hard_reg_set_intersect_p (const HARD_REG_SET x, const HARD_REG_SET y) +{ + int i; + + for (i = 0; i < HARD_REG_SET_LONGS; i++) + if ((x[i] & y[i]) != 0) + return true; + return false; +} + +static inline bool +hard_reg_set_empty_p (const HARD_REG_SET x) +{ + int i; + + for (i = 0; i < HARD_REG_SET_LONGS; i++) + if (x[i] != 0) + return false; + return true; +} #endif #endif @@ -474,10 +566,6 @@ extern enum reg_class reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES]; extern enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES]; -/* Number of non-fixed registers. */ - -extern int n_non_fixed_regs; - /* Vector indexed by hardware reg giving its name. */ extern const char * reg_names[FIRST_PSEUDO_REGISTER];