⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.c

📁 GCC编译器源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
     tree type, i;{  REAL_VALUE_TYPE d;  REAL_VALUE_TYPE e;  /* Some 386 compilers mishandle unsigned int to float conversions,     so introduce a temporary variable E to avoid those bugs.  */#ifdef REAL_ARITHMETIC  if (! TREE_UNSIGNED (TREE_TYPE (i)))    REAL_VALUE_FROM_INT (d, TREE_INT_CST_LOW (i), TREE_INT_CST_HIGH (i),			 TYPE_MODE (type));  else    REAL_VALUE_FROM_UNSIGNED_INT (d, TREE_INT_CST_LOW (i),				  TREE_INT_CST_HIGH (i), TYPE_MODE (type));#else /* not REAL_ARITHMETIC */  if (TREE_INT_CST_HIGH (i) < 0 && ! TREE_UNSIGNED (TREE_TYPE (i)))    {      d = (double) (~ TREE_INT_CST_HIGH (i));      e = ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))	    * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));      d *= e;      e = (double) (unsigned HOST_WIDE_INT) (~ TREE_INT_CST_LOW (i));      d += e;      d = (- d - 1.0);    }  else    {      d = (double) (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (i);      e = ((double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2))	    * (double) ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT / 2)));      d *= e;      e = (double) (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (i);      d += e;    }#endif /* not REAL_ARITHMETIC */  return d;}/* This function can't be implemented if we can't do arithmetic   on the float representation.  */treebuild_real_from_int_cst (type, i)     tree type;     tree i;{  tree v;  int overflow = TREE_OVERFLOW (i);  REAL_VALUE_TYPE d;  jmp_buf float_error;  v = make_node (REAL_CST);  TREE_TYPE (v) = type;  if (setjmp (float_error))    {      d = dconst0;      overflow = 1;      goto got_it;    }  set_float_handler (float_error);#ifdef REAL_ARITHMETIC  d = real_value_from_int_cst (type, i);#else  d = REAL_VALUE_TRUNCATE (TYPE_MODE (type),			   real_value_from_int_cst (type, i));#endif  /* Check for valid float value for this type on this target machine.  */ got_it:  set_float_handler (NULL_PTR);#ifdef CHECK_FLOAT_VALUE  CHECK_FLOAT_VALUE (TYPE_MODE (type), d, overflow);#endif  TREE_REAL_CST (v) = d;  TREE_OVERFLOW (v) = TREE_CONSTANT_OVERFLOW (v) = overflow;  return v;}#endif /* not REAL_IS_NOT_DOUBLE, or REAL_ARITHMETIC *//* Return a newly constructed STRING_CST node whose value is   the LEN characters at STR.   The TREE_TYPE is not initialized.  */treebuild_string (len, str)     int len;     char *str;{  /* Put the string in saveable_obstack since it will be placed in the RTL     for an "asm" statement and will also be kept around a while if     deferring constant output in varasm.c.  */  register tree s = make_node (STRING_CST);  TREE_STRING_LENGTH (s) = len;  TREE_STRING_POINTER (s) = obstack_copy0 (saveable_obstack, str, len);  return s;}/* Return a newly constructed COMPLEX_CST node whose value is   specified by the real and imaginary parts REAL and IMAG.   Both REAL and IMAG should be constant nodes.  TYPE, if specified,   will be the type of the COMPLEX_CST; otherwise a new type will be made.  */treebuild_complex (type, real, imag)     tree type;     tree real, imag;{  register tree t = make_node (COMPLEX_CST);  TREE_REALPART (t) = real;  TREE_IMAGPART (t) = imag;  TREE_TYPE (t) = type ? type : build_complex_type (TREE_TYPE (real));  TREE_OVERFLOW (t) = TREE_OVERFLOW (real) | TREE_OVERFLOW (imag);  TREE_CONSTANT_OVERFLOW (t)    = TREE_CONSTANT_OVERFLOW (real) | TREE_CONSTANT_OVERFLOW (imag);  return t;}/* Build a newly constructed TREE_VEC node of length LEN.  */treemake_tree_vec (len)     int len;{  register tree t;  register int length = (len-1) * sizeof (tree) + sizeof (struct tree_vec);  register struct obstack *obstack = current_obstack;  register int i;#ifdef GATHER_STATISTICS  tree_node_counts[(int)vec_kind]++;  tree_node_sizes[(int)vec_kind] += length;#endif  t = (tree) obstack_alloc (obstack, length);  for (i = (length / sizeof (int)) - 1; i >= 0; i--)    ((int *) t)[i] = 0;  TREE_SET_CODE (t, TREE_VEC);  TREE_VEC_LENGTH (t) = len;  if (obstack == &permanent_obstack)    TREE_PERMANENT (t) = 1;  return t;}/* Return 1 if EXPR is the integer constant zero or a complex constant   of zero.  */intinteger_zerop (expr)     tree expr;{  STRIP_NOPS (expr);  return ((TREE_CODE (expr) == INTEGER_CST	   && ! TREE_CONSTANT_OVERFLOW (expr)	   && TREE_INT_CST_LOW (expr) == 0	   && TREE_INT_CST_HIGH (expr) == 0)	  || (TREE_CODE (expr) == COMPLEX_CST	      && integer_zerop (TREE_REALPART (expr))	      && integer_zerop (TREE_IMAGPART (expr))));}/* Return 1 if EXPR is the integer constant one or the corresponding   complex constant.  */intinteger_onep (expr)     tree expr;{  STRIP_NOPS (expr);  return ((TREE_CODE (expr) == INTEGER_CST	   && ! TREE_CONSTANT_OVERFLOW (expr)	   && TREE_INT_CST_LOW (expr) == 1	   && TREE_INT_CST_HIGH (expr) == 0)	  || (TREE_CODE (expr) == COMPLEX_CST	      && integer_onep (TREE_REALPART (expr))	      && integer_zerop (TREE_IMAGPART (expr))));}/* Return 1 if EXPR is an integer containing all 1's in as much precision as   it contains.  Likewise for the corresponding complex constant.  */intinteger_all_onesp (expr)     tree expr;{  register int prec;  register int uns;  STRIP_NOPS (expr);  if (TREE_CODE (expr) == COMPLEX_CST      && integer_all_onesp (TREE_REALPART (expr))      && integer_zerop (TREE_IMAGPART (expr)))    return 1;  else if (TREE_CODE (expr) != INTEGER_CST	   || TREE_CONSTANT_OVERFLOW (expr))    return 0;  uns = TREE_UNSIGNED (TREE_TYPE (expr));  if (!uns)    return TREE_INT_CST_LOW (expr) == -1 && TREE_INT_CST_HIGH (expr) == -1;  /* Note that using TYPE_PRECISION here is wrong.  We care about the     actual bits, not the (arbitrary) range of the type.  */  prec = GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (expr)));  if (prec >= HOST_BITS_PER_WIDE_INT)    {      int high_value, shift_amount;      shift_amount = prec - HOST_BITS_PER_WIDE_INT;      if (shift_amount > HOST_BITS_PER_WIDE_INT)	/* Can not handle precisions greater than twice the host int size.  */	abort ();      else if (shift_amount == HOST_BITS_PER_WIDE_INT)	/* Shifting by the host word size is undefined according to the ANSI	   standard, so we must handle this as a special case.  */	high_value = -1;      else	high_value = ((HOST_WIDE_INT) 1 << shift_amount) - 1;      return TREE_INT_CST_LOW (expr) == -1	&& TREE_INT_CST_HIGH (expr) == high_value;    }  else    return TREE_INT_CST_LOW (expr) == ((HOST_WIDE_INT) 1 << prec) - 1;}/* Return 1 if EXPR is an integer constant that is a power of 2 (i.e., has only   one bit on).  */intinteger_pow2p (expr)     tree expr;{  int prec;  HOST_WIDE_INT high, low;  STRIP_NOPS (expr);  if (TREE_CODE (expr) == COMPLEX_CST      && integer_pow2p (TREE_REALPART (expr))      && integer_zerop (TREE_IMAGPART (expr)))    return 1;  if (TREE_CODE (expr) != INTEGER_CST || TREE_CONSTANT_OVERFLOW (expr))    return 0;  prec = (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE	  ? POINTER_SIZE : TYPE_PRECISION (TREE_TYPE (expr)));  high = TREE_INT_CST_HIGH (expr);  low = TREE_INT_CST_LOW (expr);  /* First clear all bits that are beyond the type's precision in case     we've been sign extended.  */  if (prec == 2 * HOST_BITS_PER_WIDE_INT)    ;  else if (prec > HOST_BITS_PER_WIDE_INT)    high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));  else    {      high = 0;      if (prec < HOST_BITS_PER_WIDE_INT)	low &= ~((HOST_WIDE_INT) (-1) << prec);    }  if (high == 0 && low == 0)    return 0;  return ((high == 0 && (low & (low - 1)) == 0)	  || (low == 0 && (high & (high - 1)) == 0));}/* Return the power of two represented by a tree node known to be a   power of two.  */inttree_log2 (expr)     tree expr;{  int prec;  HOST_WIDE_INT high, low;  STRIP_NOPS (expr);  if (TREE_CODE (expr) == COMPLEX_CST)    return tree_log2 (TREE_REALPART (expr));  prec = (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE	  ? POINTER_SIZE : TYPE_PRECISION (TREE_TYPE (expr)));  high = TREE_INT_CST_HIGH (expr);  low = TREE_INT_CST_LOW (expr);  /* First clear all bits that are beyond the type's precision in case     we've been sign extended.  */  if (prec == 2 * HOST_BITS_PER_WIDE_INT)    ;  else if (prec > HOST_BITS_PER_WIDE_INT)    high &= ~((HOST_WIDE_INT) (-1) << (prec - HOST_BITS_PER_WIDE_INT));  else    {      high = 0;      if (prec < HOST_BITS_PER_WIDE_INT)	low &= ~((HOST_WIDE_INT) (-1) << prec);    }  return (high != 0 ? HOST_BITS_PER_WIDE_INT + exact_log2 (high)	  :  exact_log2 (low));}/* Return 1 if EXPR is the real constant zero.  */intreal_zerop (expr)     tree expr;{  STRIP_NOPS (expr);  return ((TREE_CODE (expr) == REAL_CST	   && ! TREE_CONSTANT_OVERFLOW (expr)	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0))	  || (TREE_CODE (expr) == COMPLEX_CST	      && real_zerop (TREE_REALPART (expr))	      && real_zerop (TREE_IMAGPART (expr))));}/* Return 1 if EXPR is the real constant one in real or complex form.  */intreal_onep (expr)     tree expr;{  STRIP_NOPS (expr);  return ((TREE_CODE (expr) == REAL_CST	   && ! TREE_CONSTANT_OVERFLOW (expr)	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1))	  || (TREE_CODE (expr) == COMPLEX_CST	      && real_onep (TREE_REALPART (expr))	      && real_zerop (TREE_IMAGPART (expr))));}/* Return 1 if EXPR is the real constant two.  */intreal_twop (expr)     tree expr;{  STRIP_NOPS (expr);  return ((TREE_CODE (expr) == REAL_CST	   && ! TREE_CONSTANT_OVERFLOW (expr)	   && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2))	  || (TREE_CODE (expr) == COMPLEX_CST	      && real_twop (TREE_REALPART (expr))	      && real_zerop (TREE_IMAGPART (expr))));}/* Nonzero if EXP is a constant or a cast of a constant.  */ intreally_constant_p (exp)     tree exp;{  /* This is not quite the same as STRIP_NOPS.  It does more.  */  while (TREE_CODE (exp) == NOP_EXPR	 || TREE_CODE (exp) == CONVERT_EXPR	 || TREE_CODE (exp) == NON_LVALUE_EXPR)    exp = TREE_OPERAND (exp, 0);  return TREE_CONSTANT (exp);}/* Return first list element whose TREE_VALUE is ELEM.   Return 0 if ELEM is not in LIST.  */treevalue_member (elem, list)     tree elem, list;{  while (list)    {      if (elem == TREE_VALUE (list))	return list;      list = TREE_CHAIN (list);    }  return NULL_TREE;}/* Return first list element whose TREE_PURPOSE is ELEM.   Return 0 if ELEM is not in LIST.  */treepurpose_member (elem, list)     tree elem, list;{  while (list)    {      if (elem == TREE_PURPOSE (list))	return list;      list = TREE_CHAIN (list);    }  return NULL_TREE;}/* Return first list element whose BINFO_TYPE is ELEM.   Return 0 if ELEM is not in LIST.  */treebinfo_member (elem, list)     tree elem, list;{  while (list)    {      if (elem == BINFO_TYPE (list))	return list;      list = TREE_CHAIN (list);    }  return NULL_TREE;}/* Return nonzero if ELEM is part of the chain CHAIN.  */intchain_member (elem, chain)     tree elem, chain;{  while (chain)    {      if (elem == chain)	return 1;      chain = TREE_CHAIN (chain);    }  return 0;}/* Return nonzero if ELEM is equal to TREE_VALUE (CHAIN) for any piece of   chain CHAIN.  *//* ??? This function was added for machine specific attributes but is no   longer used.  It could be deleted if we could confirm all front ends   don't use it.  */intchain_member_value (elem, chain)     tree elem, chain;{  while (chain)    {      if (elem == TREE_VALUE (chain))	return 1;      chain = TREE_CHAIN (chain);    }  return 0;}/* Return nonzero if ELEM is equal to TREE_PURPOSE (CHAIN)   for any piece of chain CHAIN.  *//* ??? This function was added for machine specific attributes but is no   longer used.  It could be deleted if we could confirm all front ends

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -