📄 real.h
字号:
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 + -