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
  
  
  


Reply via email to