hasting2 03/02/13 15:31:30 Modified: live/gcc3/gcc emit-rtl.c Log: Rewrite CONST_VECTOR hashing. CONST0_RTX() vectors are now hashed. APPLE LOCAL. Submitted by: stuart Reviewd by: dale Revision Changes Path 1.38 +40 -10 src/live/gcc3/gcc/emit-rtl.c Index: emit-rtl.c =================================================================== RCS file: /cvs/Darwin/src/live/gcc3/gcc/emit-rtl.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- emit-rtl.c 2002/12/18 00:31:54 1.37 +++ emit-rtl.c 2003/02/13 23:31:30 1.38 @@ -517,12 +517,23 @@ const_vector_htab_hash (x) const void *x; { - hashval_t h = 0; size_t i; rtx value = (rtx) x; - - for (i = 0; i < sizeof("wwww")-1; i++) - h ^= XWINT (value, i); + rtx elt; + hashval_t h = (hashval_t) GET_MODE (value); + size_t vector_size = (size_t) CONST_VECTOR_NUNITS (value); + int integral_type = (GET_CODE (CONST_VECTOR_ELT (value, 0)) == CONST_INT); + + /* Hash the constants of the vector. + This is a poor hash function, tolerated here because it is seldom used. */ + for (i = 0; i < vector_size; i++) + { + elt = CONST_VECTOR_ELT (value, i); + if (integral_type) + h = (h << 1) | INTVAL (elt); + else + h = (h << 1) | (CONST_DOUBLE_LOW (elt) ^ CONST_DOUBLE_HIGH (elt)); + } return h; } @@ -534,14 +545,32 @@ const void *y; { rtx a = (rtx)x, b = (rtx)y; - size_t i; + rtx elt_a, elt_b; + size_t i, vector_size; + int integral_type; if (GET_MODE (a) != GET_MODE (b)) return 0; - for (i = 0; i < sizeof("wwww")-1; i++) - if (XWINT (a, i) != XWINT (b, i)) - return 0; - + if (CONST_VECTOR_NUNITS (a) != CONST_VECTOR_NUNITS (b)) + return 0; + vector_size = (size_t) CONST_VECTOR_NUNITS (a); + integral_type = (GET_CODE (CONST_VECTOR_ELT (a, 0)) == CONST_INT); + for (i = 0; i < vector_size; i++) + { + elt_a = CONST_VECTOR_ELT (a, i); + elt_b = CONST_VECTOR_ELT (b, i); + if (integral_type) + { + if (INTVAL (elt_a) != INTVAL (elt_b)) + return 0; + } + else + { + if (CONST_DOUBLE_LOW (elt_a) != CONST_DOUBLE_LOW (elt_b) + || CONST_DOUBLE_HIGH (elt_a) != CONST_DOUBLE_HIGH (elt_b)) + return 0; + } + } return 1; } @@ -5397,7 +5426,8 @@ RTVEC_ELT (v, i) = CONST0_RTX (inner); tem = gen_rtx_raw_CONST_VECTOR (mode, v); - return tem; + /* APPLE LOCAL hashed constant vectors */ + return lookup_const_vector (tem); } /* Generate a vector like gen_rtx_raw_CONST_VEC, but use the zero vector when