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

📄 real.h

📁 GCC编译器源代码
💻 H
📖 第 1 页 / 共 2 页
字号:
typedef struct {    HOST_WIDE_INT r[sizeof (double)/sizeof (HOST_WIDE_INT)];  } realvaluetype;#define REAL_VALUE_TYPE realvaluetype#endif /* no REAL_VALUE_TYPE */#endif /* formats differ */#endif /* 0 */#endif /* emulator not used *//* If we are not cross-compiling, use a `double' to represent the   floating-point value.  Otherwise, use some other type   (probably a struct containing an array of longs).  */#ifndef REAL_VALUE_TYPE#define REAL_VALUE_TYPE double#else#define REAL_IS_NOT_DOUBLE#endif#if HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT/* Convert a type `double' value in host format first to a type `float'   value in host format and then to a single type `long' value which   is the bitwise equivalent of the `float' value.  */#ifndef REAL_VALUE_TO_TARGET_SINGLE#define REAL_VALUE_TO_TARGET_SINGLE(IN, OUT)				\do { float f = (float) (IN);						\     (OUT) = *(long *) &f;						\   } while (0)#endif/* Convert a type `double' value in host format to a pair of type `long'   values which is its bitwise equivalent, but put the two words into   proper word order for the target.  */#ifndef REAL_VALUE_TO_TARGET_DOUBLE#define REAL_VALUE_TO_TARGET_DOUBLE(IN, OUT)				\do { REAL_VALUE_TYPE in = (IN);  /* Make sure it's not in a register.  */\     if (HOST_FLOAT_WORDS_BIG_ENDIAN == FLOAT_WORDS_BIG_ENDIAN)		\       {								\	 (OUT)[0] = ((long *) &in)[0];					\	 (OUT)[1] = ((long *) &in)[1];					\       }								\     else								\       {								\	 (OUT)[1] = ((long *) &in)[0];					\	 (OUT)[0] = ((long *) &in)[1];					\       }								\   } while (0)#endif#endif /* HOST_FLOAT_FORMAT == TARGET_FLOAT_FORMAT *//* In this configuration, double and long double are the same. */#ifndef REAL_VALUE_TO_TARGET_LONG_DOUBLE#define REAL_VALUE_TO_TARGET_LONG_DOUBLE(a, b) REAL_VALUE_TO_TARGET_DOUBLE (a, b)#endif/* Compare two floating-point objects for bitwise identity.   This is not the same as comparing for equality on IEEE hosts:   -0.0 equals 0.0 but they are not identical, and conversely   two NaNs might be identical but they cannot be equal.  */#define REAL_VALUES_IDENTICAL(x, y) \  (!bcmp ((char *) &(x), (char *) &(y), sizeof (REAL_VALUE_TYPE)))/* Compare two floating-point values for equality.  */#ifndef REAL_VALUES_EQUAL#define REAL_VALUES_EQUAL(x, y) ((x) == (y))#endif/* Compare two floating-point values for less than.  */#ifndef REAL_VALUES_LESS#define REAL_VALUES_LESS(x, y) ((x) < (y))#endif/* Truncate toward zero to an integer floating-point value.  */#ifndef REAL_VALUE_RNDZINT#define REAL_VALUE_RNDZINT(x) ((double) ((int) (x)))#endif/* Truncate toward zero to an unsigned integer floating-point value.  */#ifndef REAL_VALUE_UNSIGNED_RNDZINT#define REAL_VALUE_UNSIGNED_RNDZINT(x) ((double) ((unsigned int) (x)))#endif/* Convert a floating-point value to integer, rounding toward zero.  */#ifndef REAL_VALUE_FIX#define REAL_VALUE_FIX(x) ((int) (x))#endif/* Convert a floating-point value to unsigned integer, rounding   toward zero. */#ifndef REAL_VALUE_UNSIGNED_FIX#define REAL_VALUE_UNSIGNED_FIX(x) ((unsigned int) (x))#endif/* Scale X by Y powers of 2.  */#ifndef REAL_VALUE_LDEXP#define REAL_VALUE_LDEXP(x, y) ldexp (x, y)extern double ldexp ();#endif/* Convert the string X to a floating-point value.  */#ifndef REAL_VALUE_ATOF#if 1/* Use real.c to convert decimal numbers to binary, ... */REAL_VALUE_TYPE ereal_atof ();#define REAL_VALUE_ATOF(x, s) ereal_atof (x, s)#else/* ... or, if you like the host computer's atof, go ahead and use it: */#define REAL_VALUE_ATOF(x, s) atof (x)#if defined (MIPSEL) || defined (MIPSEB)/* MIPS compiler can't handle parens around the function name.   This problem *does not* appear to be connected with any   macro definition for atof.  It does not seem there is one.  */extern double atof ();#elseextern double (atof) ();#endif#endif#endif/* Negate the floating-point value X.  */#ifndef REAL_VALUE_NEGATE#define REAL_VALUE_NEGATE(x) (- (x))#endif/* Truncate the floating-point value X to mode MODE.  This is correct only   for the most common case where the host and target have objects of the same   size and where `float' is SFmode.  *//* Don't use REAL_VALUE_TRUNCATE directly--always call real_value_truncate.  */extern REAL_VALUE_TYPE real_value_truncate PROTO((enum machine_mode, REAL_VALUE_TYPE));#ifndef REAL_VALUE_TRUNCATE#define REAL_VALUE_TRUNCATE(mode, x) \ (GET_MODE_BITSIZE (mode) == sizeof (float) * HOST_BITS_PER_CHAR	\  ? (float) (x) : (x))#endif/* Determine whether a floating-point value X is infinite. */#ifndef REAL_VALUE_ISINF#define REAL_VALUE_ISINF(x) (target_isinf (x))#endif/* Determine whether a floating-point value X is a NaN. */#ifndef REAL_VALUE_ISNAN#define REAL_VALUE_ISNAN(x) (target_isnan (x))#endif/* Determine whether a floating-point value X is negative. */#ifndef REAL_VALUE_NEGATIVE#define REAL_VALUE_NEGATIVE(x) (target_negative (x))#endifextern int target_isnan			PROTO ((REAL_VALUE_TYPE));extern int target_isinf			PROTO ((REAL_VALUE_TYPE));extern int target_negative		PROTO ((REAL_VALUE_TYPE));/* Determine whether a floating-point value X is minus 0. */#ifndef REAL_VALUE_MINUS_ZERO#define REAL_VALUE_MINUS_ZERO(x) ((x) == 0 && REAL_VALUE_NEGATIVE (x))#endif/* Constant real values 0, 1, 2, and -1.  */extern REAL_VALUE_TYPE dconst0;extern REAL_VALUE_TYPE dconst1;extern REAL_VALUE_TYPE dconst2;extern REAL_VALUE_TYPE dconstm1;/* Union type used for extracting real values from CONST_DOUBLEs   or putting them in.  */union real_extract {  REAL_VALUE_TYPE d;  HOST_WIDE_INT i[sizeof (REAL_VALUE_TYPE) / sizeof (HOST_WIDE_INT)];};/* For a CONST_DOUBLE:   The usual two ints that hold the value.   For a DImode, that is all there are;    and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order.   For a float, the number of ints varies,    and CONST_DOUBLE_LOW is the one that should come first *in memory*.    So use &CONST_DOUBLE_LOW(r) as the address of an array of ints.  */#define CONST_DOUBLE_LOW(r) XWINT (r, 2)#define CONST_DOUBLE_HIGH(r) XWINT (r, 3)/* Link for chain of all CONST_DOUBLEs in use in current function.  */#define CONST_DOUBLE_CHAIN(r) XEXP (r, 1)/* The MEM which represents this CONST_DOUBLE's value in memory,   or const0_rtx if no MEM has been made for it yet,   or cc0_rtx if it is not on the chain.  */#define CONST_DOUBLE_MEM(r) XEXP (r, 0)/* Function to return a real value (not a tree node)   from a given integer constant.  */REAL_VALUE_TYPE real_value_from_int_cst ();/* Given a CONST_DOUBLE in FROM, store into TO the value it represents.  */#define REAL_VALUE_FROM_CONST_DOUBLE(to, from)		\do { union real_extract u;				\     bcopy ((char *) &CONST_DOUBLE_LOW ((from)), (char *) &u, sizeof u); \     to = u.d; } while (0)/* Return a CONST_DOUBLE with value R and mode M.  */#define CONST_DOUBLE_FROM_REAL_VALUE(r, m) immed_real_const_1 (r,  m)extern struct rtx_def *immed_real_const_1	PROTO((REAL_VALUE_TYPE,						       enum machine_mode));/* Convert a floating point value `r', that can be interpreted   as a host machine float or double, to a decimal ASCII string `s'   using printf format string `fmt'.  */#ifndef REAL_VALUE_TO_DECIMAL#define REAL_VALUE_TO_DECIMAL(r, fmt, s) (sprintf (s, fmt, r))#endif/* Replace R by 1/R in the given machine mode, if the result is exact.  */extern int exact_real_inverse PROTO((enum machine_mode, REAL_VALUE_TYPE *));extern void debug_real			PROTO ((REAL_VALUE_TYPE));/* In varasm.c */extern void assemble_real		PROTO ((REAL_VALUE_TYPE,						enum machine_mode));#endif /* Not REAL_H_INCLUDED */

⌨️ 快捷键说明

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