|
|
1.1 ! root 1: /* Front-end tree definitions for GNU compiler. ! 2: Copyright (C) 1989, 1991 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: #ifndef REAL_H_INCLUDED ! 21: #define REAL_H_INCLUDED ! 22: ! 23: /* Define codes for all the float formats that we know of. */ ! 24: #define UNKNOWN_FLOAT_FORMAT 0 ! 25: #define IEEE_FLOAT_FORMAT 1 ! 26: #define VAX_FLOAT_FORMAT 2 ! 27: ! 28: /* Default to IEEE float if not specified. Nearly all machines use it. */ ! 29: ! 30: #ifndef TARGET_FLOAT_FORMAT ! 31: #define TARGET_FLOAT_FORMAT IEEE_FLOAT_FORMAT ! 32: #endif ! 33: ! 34: #ifndef HOST_FLOAT_FORMAT ! 35: #define HOST_FLOAT_FORMAT IEEE_FLOAT_FORMAT ! 36: #endif ! 37: ! 38: #if TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT ! 39: #define REAL_INFINITY ! 40: #endif ! 41: ! 42: #ifdef REAL_ARITHMETIC ! 43: /* Defining REAL_IS_NOT_DOUBLE breaks certain initializations ! 44: when REAL_ARITHMETIC etc. are not defined. */ ! 45: ! 46: /* Now see if the host and target machines use the same format. ! 47: If not, define REAL_IS_NOT_DOUBLE (even if we end up representing ! 48: reals as doubles because we have no better way in this cross compiler.) ! 49: This turns off various optimizations that can happen when we know the ! 50: compiler's float format matches the target's float format. ! 51: */ ! 52: #if HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT ! 53: #define REAL_IS_NOT_DOUBLE ! 54: #ifndef REAL_VALUE_TYPE ! 55: #define REAL_VALUE_TYPE \ ! 56: struct real_value { long i[sizeof (double) / sizeof (long)]; } ! 57: #endif /* no REAL_VALUE_TYPE */ ! 58: #endif /* formats differ */ ! 59: #endif /* 0 */ ! 60: ! 61: /* If we are not cross-compiling, use a `double' to represent the ! 62: floating-point value. Otherwise, use some other type ! 63: (probably a struct containing an array of longs). */ ! 64: #ifndef REAL_VALUE_TYPE ! 65: #define REAL_VALUE_TYPE double ! 66: #else ! 67: #define REAL_IS_NOT_DOUBLE ! 68: #endif ! 69: ! 70: /* Compare two floating-point values for equality. */ ! 71: #ifndef REAL_VALUES_EQUAL ! 72: #define REAL_VALUES_EQUAL(x,y) ((x) == (y)) ! 73: #endif ! 74: ! 75: /* Compare two floating-point values for less than. */ ! 76: #ifndef REAL_VALUES_LESS ! 77: #define REAL_VALUES_LESS(x,y) ((x) < (y)) ! 78: #endif ! 79: ! 80: /* Convert a floating-point value to integer by truncating. */ ! 81: #ifndef REAL_VALUE_FIX_TRUNCATE ! 82: #define REAL_VALUE_FIX_TRUNCATE(x) ((int) (x)) ! 83: #endif ! 84: ! 85: /* Convert a floating-point value to unsigned integer by truncating. */ ! 86: #ifndef REAL_VALUE_UNSIGNED_FIX_TRUNCATE ! 87: #define REAL_VALUE_UNSIGNED_FIX_TRUNCATE(x) ((unsigned int) (x)) ! 88: #endif ! 89: ! 90: /* Convert a floating-point value to integer, using any rounding mode. */ ! 91: #ifndef REAL_VALUE_FIX ! 92: #define REAL_VALUE_FIX(x) ((int) (x)) ! 93: #endif ! 94: ! 95: /* Convert a floating-point value to unsigned integer, using any rounding ! 96: mode. */ ! 97: #ifndef REAL_VALUE_UNSIGNED_FIX ! 98: #define REAL_VALUE_UNSIGNED_FIX(x) ((unsigned int) (x)) ! 99: #endif ! 100: ! 101: /* Scale X by Y powers of 2. */ ! 102: #ifndef REAL_VALUE_LDEXP ! 103: #define REAL_VALUE_LDEXP(x,y) ldexp (x, y) ! 104: extern double ldexp (); ! 105: #endif ! 106: ! 107: /* Convert the string X to a floating-point value. */ ! 108: #ifndef REAL_VALUE_ATOF ! 109: #define REAL_VALUE_ATOF(x) atof (x) ! 110: #if defined (MIPSEL) || defined (MIPSEB) ! 111: /* MIPS compiler can't handle parens around the function name. ! 112: This problem *does not* appear to be connected with any ! 113: macro definition for atof. It does not seem there is one. */ ! 114: extern double atof (); ! 115: #else ! 116: extern double (atof) (); ! 117: #endif ! 118: #endif ! 119: ! 120: /* Negate the floating-point value X. */ ! 121: #ifndef REAL_VALUE_NEGATE ! 122: #define REAL_VALUE_NEGATE(x) (- (x)) ! 123: #endif ! 124: ! 125: /* Truncate the floating-point value X to mode MODE. This is correct only ! 126: for the most common case where the host and target have objects of the same ! 127: size and where `float' is SFmode. */ ! 128: ! 129: #ifndef REAL_VALUE_TRUNCATE ! 130: #define REAL_VALUE_TRUNCATE(mode, x) \ ! 131: (GET_MODE_BITSIZE (mode) == sizeof (float) * HOST_BITS_PER_CHAR \ ! 132: ? (float) (x) : (x)) ! 133: #endif ! 134: ! 135: /* Determine whether a floating-point value X is infinite. */ ! 136: #ifndef REAL_VALUE_ISINF ! 137: #define REAL_VALUE_ISINF(x) (target_isinf (x)) ! 138: #endif ! 139: ! 140: /* Determine whether a floating-point value X is minus 0. */ ! 141: #ifndef REAL_VALUE_MINUS_ZERO ! 142: #define REAL_VALUE_MINUS_ZERO(x) (target_minus_zero (x)) ! 143: #endif ! 144: ! 145: /* Constant real values 0, 1, 2, and -1. */ ! 146: ! 147: extern REAL_VALUE_TYPE dconst0; ! 148: extern REAL_VALUE_TYPE dconst1; ! 149: extern REAL_VALUE_TYPE dconst2; ! 150: extern REAL_VALUE_TYPE dconstm1; ! 151: ! 152: /* Union type used for extracting real values from CONST_DOUBLEs ! 153: or putting them in. */ ! 154: ! 155: union real_extract ! 156: { ! 157: REAL_VALUE_TYPE d; ! 158: int i[sizeof (REAL_VALUE_TYPE) / sizeof (int)]; ! 159: }; ! 160: ! 161: /* For a CONST_DOUBLE: ! 162: The usual two ints that hold the value. ! 163: For a DImode, that is all there are; ! 164: and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order. ! 165: For a float, the number of ints varies, ! 166: and CONST_DOUBLE_LOW is the one that should come first *in memory*. ! 167: So use &CONST_DOUBLE_LOW(r) as the address of an array of ints. */ ! 168: #define CONST_DOUBLE_LOW(r) XINT (r, 2) ! 169: #define CONST_DOUBLE_HIGH(r) XINT (r, 3) ! 170: ! 171: /* Link for chain of all CONST_DOUBLEs in use in current function. */ ! 172: #define CONST_DOUBLE_CHAIN(r) XEXP (r, 1) ! 173: /* The MEM which represents this CONST_DOUBLE's value in memory, ! 174: or const0_rtx if no MEM has been made for it yet, ! 175: or cc0_rtx if it is not on the chain. */ ! 176: #define CONST_DOUBLE_MEM(r) XEXP (r, 0) ! 177: ! 178: /* Function to return a real value (not a tree node) ! 179: from a given integer constant. */ ! 180: REAL_VALUE_TYPE real_value_from_int_cst (); ! 181: ! 182: /* Given a CONST_DOUBLE in FROM, store into TO the value it represents. */ ! 183: ! 184: #define REAL_VALUE_FROM_CONST_DOUBLE(to, from) \ ! 185: do { union real_extract u; \ ! 186: bcopy (&CONST_DOUBLE_LOW ((from)), &u, sizeof u); \ ! 187: to = u.d; } while (0) ! 188: ! 189: /* Return a CONST_DOUBLE with value R and mode M. */ ! 190: ! 191: #define CONST_DOUBLE_FROM_REAL_VALUE(r,m) immed_real_const_1 (r, m) ! 192: ! 193: #endif /* Not REAL_H_INCLUDED */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.