Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2 of the GNU General Public License as 00007 published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU General Public License along 00021 with this program; if not, write the Free Software Foundation, Inc., 59 00022 Temple Place - Suite 330, Boston MA 02111-1307, USA. 00023 00024 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00025 Mountain View, CA 94043, or: 00026 00027 http://www.sgi.com 00028 00029 For further information regarding this notice, see: 00030 00031 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00032 00033 */ 00034 00035 /* USMID @(#) clibinc/fmath.h 92.3 06/25/99 14:36:12 */ 00036 00037 /* The following values are used by the F90 compiler for a set of environment 00038 * intrinsics. Some of the values are also used by the libf/intrin library 00039 * to return a value for some of the array intrinsics: DIGITS, EPSILON, HUGE, 00040 * MAXEXPONENT, MINEXPONENT, PRECISION, RADIX, RANGE, TINY. 00041 * 00042 * The F90 compiler needs a complete set of each IEEE and non-IEEE values. 00043 * Please keep the complete set of values for YMP and for IEEE. 00044 * 00045 * YMP/C90/etc: 00046 * Integer*1 = 2147483647 signed 00047 * Integer*2 = 2147483647 signed 00048 * Integer*4 = 2147483647 signed 00049 * Integer*6 = 70368744177663 46-bit value 00050 * Integer*8 = 9223372036854775807 signed 00051 * IEEE MPP and SPARC: 00052 * Integer*1 = 2147483647 signed 00053 * Integer*2 = 2147483647 signed 00054 * Integer*4 = 2147483647 signed 00055 * Integer*6 = 9223372036854775807 signed 00056 * Integer*8 = 9223372036854775807 signed 00057 * IEEE TRITON: 00058 * Integer*1 = 2147483647 signed 00059 * Integer*2 = 2147483647 signed 00060 * Integer*4 = 2147483647 signed 00061 * Integer*6 = 1125899906842623 50-bit limit - for fastmode only 00062 * Integer*8 = 9223372036854775807 signed 00063 */ 00064 /* BIT_SIZE returns the number of bits s for an integer of kind n. 00065 * An integer object consists of s bits in sequence numbered from right to 00066 * left from zero to (s-1). Fastmode bitsize is 64 bits on TRITON,ieee. 00067 */ 00068 /* YMP: */ 00069 #define BITSIZE_INT1_F90_Y 8 /* Integer (KIND=1) */ 00070 #define BITSIZE_INT2_F90_Y 16 /* Integer (KIND=2) */ 00071 #define BITSIZE_INT4_F90_Y 32 /* Integer (KIND=4) */ 00072 #define BITSIZE_INT6_F90_Y 46 /* Integer (KIND=6), 46-bit value */ 00073 #define BITSIZE_INT8_F90_Y 64 /* Integer (KIND=8) */ 00074 /* IEEE: */ 00075 #define BITSIZE_INT1_F90_IEEE 8 /* Integer (KIND=1) */ 00076 #define BITSIZE_INT2_F90_IEEE 16 /* Integer (KIND=2) */ 00077 #define BITSIZE_INT4_F90_IEEE 32 /* Integer (KIND=4) */ 00078 #define BITSIZE_INT6_F90_IEEE 64 /* Integer (KIND=6) */ 00079 #define BITSIZE_INT8_F90_IEEE 64 /* Integer (KIND=8) */ 00080 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00081 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00082 #define BITSIZE_INT1_F90 BITSIZE_INT1_F90_IEEE 00083 #define BITSIZE_INT2_F90 BITSIZE_INT2_F90_IEEE 00084 #define BITSIZE_INT4_F90 BITSIZE_INT4_F90_IEEE 00085 #define BITSIZE_INT6_F90 BITSIZE_INT6_F90_IEEE 00086 #define BITSIZE_INT8_F90 BITSIZE_INT8_F90_IEEE 00087 #else 00088 #define BITSIZE_INT1_F90 BITSIZE_INT1_F90_Y 00089 #define BITSIZE_INT2_F90 BITSIZE_INT2_F90_Y 00090 #define BITSIZE_INT4_F90 BITSIZE_INT4_F90_Y 00091 #define BITSIZE_INT6_F90 BITSIZE_INT6_F90_Y 00092 #define BITSIZE_INT8_F90 BITSIZE_INT8_F90_Y 00093 #endif 00094 00095 /* DIGITS for integer, real, and double precision is number of significant 00096 * digits in bits in the model. 00097 * DIGITS on IEEE is the number of mantissa bits and the implicit bit. 00098 */ 00099 /* YMP: */ 00100 #define DIGITS_INT1_F90_Y 7 /* Integer (KIND=1) */ 00101 #define DIGITS_INT2_F90_Y 15 /* Integer (KIND=2) */ 00102 #define DIGITS_INT4_F90_Y 31 /* Integer (KIND=4) */ 00103 #define DIGITS_INT6_F90_Y 46 /* Integer (KIND=6), 46-bit value */ 00104 #define DIGITS_INT8_F90_Y 63 /* Integer (KIND=8) */ 00105 #define DIGITS_REAL4_F90_Y 24 /* Real (KIND=4) */ 00106 #define DIGITS_REAL8_F90_Y 47 /* Real (KIND=8) */ 00107 #define DIGITS_REAL16_F90_Y 95 /* Real (KIND=16) */ 00108 /* IEEE: */ 00109 #define DIGITS_INT1_F90_IEEE 7 /* Integer (KIND=1) */ 00110 #define DIGITS_INT2_F90_IEEE 15 /* Integer (KIND=2) */ 00111 #define DIGITS_INT4_F90_IEEE 31 /* Integer (KIND=4) */ 00112 #if defined (_CRAY1) && defined(_CRAYIEEE) 00113 /* change DIGITS_INT6_F90_IEEE 50 for Integer (KIND=6) to allow 00114 * values to match as 46 bits across PVP systems 00115 */ 00116 #define DIGITS_INT6_F90_IEEE 46 /* Integer (KIND=6) */ 00117 #else 00118 #define DIGITS_INT6_F90_IEEE 63 /* Integer (KIND=6) */ 00119 #endif 00120 #define DIGITS_INT8_F90_IEEE 63 /* Integer (KIND=8) */ 00121 #define DIGITS_REAL4_F90_IEEE 24 /* Real (KIND=4) */ 00122 #define DIGITS_REAL8_F90_IEEE 53 /* Real (KIND=8) */ 00123 #if defined(_CRAYMPP) 00124 #define DIGITS_REAL16_F90_IEEE 53 /* Real (KIND=16) */ 00125 #elif defined(__mips) 00126 #define DIGITS_REAL16_F90_IEEE 107 /* Real (KIND=16) */ 00127 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2) 00128 #define DIGITS_REAL16_F90_IEEE 64 /* Real (KIND=16) */ 00129 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00130 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00131 #define DIGITS_REAL16_F90_IEEE 113 /* Real (KIND=16) */ 00132 #endif 00133 00134 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00135 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00136 #define DIGITS_INT1_F90 DIGITS_INT1_F90_IEEE 00137 #define DIGITS_INT2_F90 DIGITS_INT2_F90_IEEE 00138 #define DIGITS_INT4_F90 DIGITS_INT4_F90_IEEE 00139 #define DIGITS_INT6_F90 DIGITS_INT6_F90_IEEE 00140 #define DIGITS_INT8_F90 DIGITS_INT8_F90_IEEE 00141 #define DIGITS_REAL4_F90 DIGITS_REAL4_F90_IEEE 00142 #define DIGITS_REAL8_F90 DIGITS_REAL8_F90_IEEE 00143 #define DIGITS_REAL16_F90 DIGITS_REAL16_F90_IEEE 00144 #else 00145 #define DIGITS_INT1_F90 DIGITS_INT1_F90_Y 00146 #define DIGITS_INT2_F90 DIGITS_INT2_F90_Y 00147 #define DIGITS_INT4_F90 DIGITS_INT4_F90_Y 00148 #define DIGITS_INT6_F90 DIGITS_INT6_F90_Y 00149 #define DIGITS_INT8_F90 DIGITS_INT8_F90_Y 00150 #define DIGITS_REAL4_F90 DIGITS_REAL4_F90_Y 00151 #define DIGITS_REAL8_F90 DIGITS_REAL8_F90_Y 00152 #define DIGITS_REAL16_F90 DIGITS_REAL16_F90_Y 00153 #endif 00154 00155 /* EPSILON for real and double precision 00156 * number that is almost negligible compared to one in the model 00157 * Real result = (b)**(1-p) = 2**(-46) where p = 47 00158 * real (KIND=4) = 377534000000000000000 00159 * real (KIND=8) = 377234000000000000000 00160 * real (KIND=16) is 2**(p-1) = 2**(-94) where p = 95 00161 * or 376434000000000000000 0000000000000000000000 00162 * 00163 * HEX values for EPSILON are: 00164 * 00165 * YMP: EPSILON (in hex) IEEE: EPSILON (in hex) 00166 * R*4 3FEA800000000000 | 34000000 00167 * R*8 3FD3800000000000 | 3CB0000000000000 00168 * R*16 3FA3800000000000,0 | 3F8F000000000000,0 00169 * 00170 * SGI HEX for R*16 00171 * R*16 | 3950000000000000 00172 * | 0000000000000000 00173 * 00174 * LE non-sv2 HEX for R*16 00175 * R*16 | 3C00000000000000 00176 * | 0000000000000000 00177 */ 00178 00179 /* YMP: */ 00180 #define EPSILON_REAL4_F90_Y 0.1192092895507812e-06 00181 #define EPSILON_REAL8_F90_Y 0.1421085471520200e-13 00182 #define EPSILON_REAL16_F90_Y 0.50487097934144755546350628178090e-28L 00183 /* IEEE: */ 00184 #define EPSILON_REAL4_F90_IEEE 1.192092895507812500E-07 /* Real(KIND=4)= */ 00185 /* 2**-23 */ 00186 #define EPSILON_REAL8_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */ 00187 /* 2**-52 */ 00188 #if defined(_CRAYMPP) 00189 #define EPSILON_REAL16_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */ 00190 #elif defined(__mips) 00191 #define EPSILON_REAL16_F90_IEEE 1.2325951644078309459558258832543534800E-32L 00192 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2) 00193 #define EPSILON_REAL16_F90_IEEE 1.08420217248550443400745E-19L 00194 /* 2**-63 */ 00195 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00196 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00197 /* 2**-52 */ 00198 #define EPSILON_REAL16_F90_IEEE 1.925929944387235853055977942584927319E-34L 00199 /* Real(KIND=16)=2**-112 */ 00200 #endif 00201 00202 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00203 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00204 #define EPSILON_REAL4_F90 EPSILON_REAL4_F90_IEEE 00205 #define EPSILON_REAL8_F90 EPSILON_REAL8_F90_IEEE 00206 #define EPSILON_REAL16_F90 EPSILON_REAL16_F90_IEEE 00207 #else 00208 #define EPSILON_REAL4_F90 EPSILON_REAL4_F90_Y 00209 #define EPSILON_REAL8_F90 EPSILON_REAL8_F90_Y 00210 #define EPSILON_REAL16_F90 EPSILON_REAL16_F90_Y 00211 #endif 00212 00213 /* HUGE for integer, real and double precision in the model. 00214 * Integer result = (r**q)-1 00215 * Real result = b**emax*(1-b**(-p)) 00216 * 00217 * HEX values for HUGE: 00218 * 00219 * YMP: HUGE (in hex) IEEE: HUGE (in hex) 00220 * I*1 7F | 7F 00221 * I*2 7FFF | 7FFF 00222 * I*4 7FFFFFFF | 7FFFFFFF 00223 * ---------------------------------------- FOR MPP and SPARC, ieee 00224 * I*6 3FFFFFFFFFFF | 7FFFFFFF 00225 * ---------------------------------------- FOR CRAY-TS,IEEE 00226 * OLD: 00227 * I*6 3FFFFFFFFFFF | 3FFFFFFFFFFFF 00228 * NEW: 00229 * I*6 3FFFFFFFFFFF | 3FFFFFFFFFFF 00230 * ------------------------------------------------------------------- 00231 * I*8 7FFFFFFFFFFFFFFF | 7FFFFFFFFFFFFFFF 00232 * R*4 5FFDFFFFFF000000 | 7F7FFFFF 00233 * R*8 5FFDFFFFFFFFFFFE | 7FEFFFFFFFFFFFFF 00234 * R*16 5FFDFFFFFFFFFFFE | 7FFEFFFFFFFFFFFF 00235 * FFFFFFFFFFFF | FFFFFFFFFFFFFFFF 00236 * 00237 * SGI HEX for R*16 00238 * R*16 | 7FE0000000000000 00239 * | F930000000000000 00240 * LARGEST: 00241 * R*16 | 7FEFFFFFFFFFFFFF 00242 * | 7C8FFFFFFFFFFFFF 00243 */ 00244 00245 /* YMP: */ 00246 #define HUGE_INT1_F90_Y 127 /* integer (KIND=1) */ 00247 #define HUGE_INT2_F90_Y 32767 /* integer (KIND=2) */ 00248 #define HUGE_INT4_F90_Y 2147483647 /* integer (KIND=4) */ 00249 #define HUGE_INT6_F90_Y 70368744177663 /* integer (KIND=6) */ 00250 /* 46-bit */ 00251 #define HUGE_INT8_F90_Y 9223372036854775807 /* integer (KIND=8) */ 00252 #define HUGE_REAL4_F90_Y 0.13634350882572e+2466 /* 0577757777777600000000 */ 00253 #define HUGE_REAL8_F90_Y 0.136343516952426e+2466 /* 0577757777777777777776 */ 00254 #define HUGE_REAL16_F90_Y 0.1363435169524269911828730305882e+2466L 00255 /* 0577757777777777777777 */ 00256 /* 7777777777777776 */ 00257 /* IEEE: */ 00258 #define HUGE_INT1_F90_IEEE 127 /* Integer (KIND=1) */ 00259 #define HUGE_INT2_F90_IEEE 32767 /* Integer (KIND=2) */ 00260 #define HUGE_INT4_F90_IEEE 2147483647 /* Integer (KIND=4) */ 00261 #ifdef _WORD32 00262 #define HUGE_INT6_F90_IEEE 9223372036854775807LL /* Integer (KIND=6) */ 00263 #define HUGE_INT8_F90_IEEE 9223372036854775807LL /* Integer (KIND=8) */ 00264 #elif defined (_CRAY1) && defined(_CRAYIEEE) 00265 /* Change HUGE_INT6_F90_IEEE 1125899906842623L for Integer (KIND=6) 00266 * to allow values to match as 46 bits across PVP architectures. 00267 */ 00268 #define HUGE_INT6_F90_IEEE 70368744177663L /* integer (KIND=6) */ 00269 #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */ 00270 #else 00271 #define HUGE_INT6_F90_IEEE 9223372036854775807L /* Integer (KIND=6) */ 00272 #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */ 00273 #endif 00274 #define HUGE_REAL4_F90_IEEE 3.4028234663852886e+38 /* Real (KIND=4) */ 00275 #define HUGE_REAL8_F90_IEEE 1.7976931348623158e+308 /* Real (KIND=8) */ 00276 #if defined(_CRAYMPP) || (defined(_LITTLE_ENDIAN) && !defined(__sv2)) 00277 #define HUGE_REAL16_F90_IEEE 1.7976931348623158e+308 /* Real (KIND=8) */ 00278 #elif defined(__mips) 00279 /* define HUGE_REAL16_F90_IEEE 1.7976931348623158079372897140530230000E308L */ 00280 #define HUGE_REAL16_F90_IEEE 8.98846567431157953864652595394506827E307L 00281 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00282 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00283 #define HUGE_REAL16_F90_IEEE 1.189731495357231765085759326628007016E+4932L 00284 /* Real (KIND=16) */ 00285 #endif 00286 00287 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00288 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00289 #define HUGE_INT1_F90 HUGE_INT1_F90_IEEE 00290 #define HUGE_INT2_F90 HUGE_INT2_F90_IEEE 00291 #define HUGE_INT4_F90 HUGE_INT4_F90_IEEE 00292 #define HUGE_INT6_F90 HUGE_INT6_F90_IEEE 00293 #define HUGE_INT8_F90 HUGE_INT8_F90_IEEE 00294 #define HUGE_REAL4_F90 HUGE_REAL4_F90_IEEE 00295 #define HUGE_REAL8_F90 HUGE_REAL8_F90_IEEE 00296 #define HUGE_REAL16_F90 HUGE_REAL16_F90_IEEE 00297 #else 00298 #define HUGE_INT1_F90 HUGE_INT1_F90_Y 00299 #define HUGE_INT2_F90 HUGE_INT2_F90_Y 00300 #define HUGE_INT4_F90 HUGE_INT4_F90_Y 00301 #define HUGE_INT6_F90 HUGE_INT6_F90_Y 00302 #define HUGE_INT8_F90 HUGE_INT8_F90_Y 00303 #define HUGE_REAL4_F90 HUGE_REAL4_F90_Y 00304 #define HUGE_REAL8_F90 HUGE_REAL8_F90_Y 00305 #define HUGE_REAL16_F90 HUGE_REAL16_F90_Y 00306 #endif 00307 00308 /* MAXEXPONENT = emax of real and double precision in the model */ 00309 /* YMP: */ 00310 #define MAXEXPONENT_F90_Y 8189 00311 #define MAXEXPONENT_REAL4_F90_Y 8189 00312 #define MAXEXPONENT_REAL8_F90_Y 8189 00313 #define MAXEXPONENT_REAL16_F90_Y 8189 00314 /* IEEE: */ 00315 #define MAXEXPONENT_REAL4_F90_IEEE 128 00316 #define MAXEXPONENT_REAL8_F90_IEEE 1024 00317 #if defined(_CRAYMPP) || defined(__mips) 00318 #define MAXEXPONENT_REAL16_F90_IEEE 1023 00319 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00320 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00321 #define MAXEXPONENT_REAL16_F90_IEEE 16384 00322 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2) 00323 #define MAXEXPONENT_REAL16_F90_IEEE 16383 00324 #endif 00325 00326 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00327 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00328 #define MAXEXPONENT_REAL4_F90 MAXEXPONENT_REAL4_F90_IEEE 00329 #define MAXEXPONENT_REAL8_F90 MAXEXPONENT_REAL8_F90_IEEE 00330 #define MAXEXPONENT_REAL16_F90 MAXEXPONENT_REAL16_F90_IEEE 00331 #else 00332 #define MAXEXPONENT_F90 MAXEXPONENT_F90_Y 00333 #define MAXEXPONENT_REAL4_F90 MAXEXPONENT_REAL4_F90_Y 00334 #define MAXEXPONENT_REAL8_F90 MAXEXPONENT_REAL8_F90_Y 00335 #define MAXEXPONENT_REAL16_F90 MAXEXPONENT_REAL16_F90_Y 00336 #endif 00337 00338 /* MINEXPONENT = emin of real and double precision in the model. 00339 * For mips do not use the following unless the denormal in the 00340 * second word is handled consistently across all hardware. The 00341 * option to speed up the real(16) will not cause the second word 00342 * to become zero. 00343 * MINEXPONENT_REAL16_F90_IEEE -967 00344 * For now, use 1022 - 107 = 915. 00345 */ 00346 /* YMP: */ 00347 #define MINEXPONENT_F90_Y -8188 00348 #define MINEXPONENT_REAL4_F90_Y -8188 00349 #define MINEXPONENT_REAL8_F90_Y -8188 00350 #define MINEXPONENT_REAL16_F90_Y -8188 00351 /* IEEE: */ 00352 #define MINEXPONENT_REAL4_F90_IEEE -125 00353 #define MINEXPONENT_REAL8_F90_IEEE -1021 00354 #if defined(_CRAYMPP) 00355 #define MINEXPONENT_REAL16_F90_IEEE -1021 00356 #elif defined(__mips) 00357 #define MINEXPONENT_REAL16_F90_IEEE -915 00358 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00359 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00360 #define MINEXPONENT_REAL16_F90_IEEE -16381 00361 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2) 00362 #define MINEXPONENT_REAL16_F90_IEEE -16382 00363 #endif 00364 00365 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00366 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00367 #define MINEXPONENT_REAL4_F90 MINEXPONENT_REAL4_F90_IEEE 00368 #define MINEXPONENT_REAL8_F90 MINEXPONENT_REAL8_F90_IEEE 00369 #define MINEXPONENT_REAL16_F90 MINEXPONENT_REAL16_F90_IEEE 00370 #else 00371 #define MINEXPONENT_F90 MINEXPONENT_F90_Y 00372 #define MINEXPONENT_REAL4_F90 MINEXPONENT_REAL4_F90_Y 00373 #define MINEXPONENT_REAL8_F90 MINEXPONENT_REAL8_F90_Y 00374 #define MINEXPONENT_REAL16_F90 MINEXPONENT_REAL16_F90_Y 00375 #endif 00376 00377 /* PRECISION for decimal precision of real and double precision in the model. 00378 * Result=INT((p-1)*LOG10(b))+k. K is one if b is an integral power of 10, 00379 * otherwise, k=0. 00380 */ 00381 /* YMP: */ 00382 #define PRECISION_REAL4_F90_Y 6 /* real (KIND=4) */ 00383 #define PRECISION_REAL8_F90_Y 13 /* real (KIND=8) */ 00384 #define PRECISION_REAL16_F90_Y 28 /* real (KIND=16) */ 00385 /* IEEE: */ 00386 #define PRECISION_REAL4_F90_IEEE 6 /* real (KIND=4) */ 00387 #define PRECISION_REAL8_F90_IEEE 15 /* real (KIND=8) */ 00388 #if defined(_CRAYMPP) 00389 #define PRECISION_REAL16_F90_IEEE 15 /* real (KIND=16) */ 00390 #elif defined(__mips) 00391 #define PRECISION_REAL16_F90_IEEE 31 /* real (KIND=16) */ 00392 #elif defined(_LITTLE_ENDIAN) && !defined(__sv2) 00393 #define PRECISION_REAL16_F90_IEEE 18 /* real (KIND=16) */ 00394 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00395 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00396 #define PRECISION_REAL16_F90_IEEE 33 /* real (KIND=16) */ 00397 #endif 00398 00399 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00400 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00401 #define PRECISION_REAL4_F90 PRECISION_REAL4_F90_IEEE 00402 #define PRECISION_REAL8_F90 PRECISION_REAL8_F90_IEEE 00403 #define PRECISION_REAL16_F90 PRECISION_REAL16_F90_IEEE 00404 #else 00405 #define PRECISION_REAL4_F90 PRECISION_REAL4_F90_Y 00406 #define PRECISION_REAL8_F90 PRECISION_REAL8_F90_Y 00407 #define PRECISION_REAL16_F90 PRECISION_REAL16_F90_Y 00408 #endif 00409 00410 /* RADIX for integer, real and double precision in the model. */ 00411 /* YMP: */ 00412 #define RADIX_F90_Y 2 00413 /* IEEE: */ 00414 #define RADIX_F90_IEEE 2 00415 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00416 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00417 #define RADIX_F90 RADIX_F90_IEEE 00418 #else 00419 #define RADIX_F90 RADIX_F90_Y 00420 #endif 00421 00422 /* RANGE for integer, real and double precision, complex and double complex 00423 * in the model 00424 * Integer result = INT(LOG10 (huge)) where huge is the largest positive 00425 * integer in the model of the same kind. 00426 * Real result = INT(MIN(LOG10 (huge),-LOG10(tiny))) where huge and tiny are 00427 * the largest and smallest positive numbers in the model of the 00428 * same kind. 00429 * For mips, do not use 291 until the option to turn off the slower 00430 * handling of denormals is not used. Until that time the second word 00431 * of a small number could change and thus not indicative of the correct 00432 * significance of the small number. Save the following for the future: 00433 * RANGE_REAL16_F90_IEEE 291 00434 */ 00435 /* YMP: */ 00436 #define RANGE_INT1_F90_Y 2 00437 #define RANGE_INT2_F90_Y 4 00438 #define RANGE_INT4_F90_Y 9 00439 #define RANGE_INT6_F90_Y 13 00440 #define RANGE_INT8_F90_Y 18 00441 #define RANGE_REAL_F90_Y 2465 00442 #define RANGE_REAL4_F90_Y 2465 00443 #define RANGE_REAL8_F90_Y 2465 00444 #define RANGE_REAL16_F90_Y 2465 00445 /* IEEE: */ 00446 #define RANGE_INT1_F90_IEEE 2 00447 #define RANGE_INT2_F90_IEEE 4 00448 #define RANGE_INT4_F90_IEEE 9 00449 #if defined (_CRAY1) && defined(_CRAYIEEE) 00450 /* change RANGE_INT6_F90_IEEE 15 for Integer (KIND=6) to allow 00451 * values to match as 46 bits across PVP systems 00452 */ 00453 #define RANGE_INT6_F90_IEEE 13 00454 #else 00455 #define RANGE_INT6_F90_IEEE 18 00456 #endif 00457 #define RANGE_INT8_F90_IEEE 18 00458 #define RANGE_REAL4_F90_IEEE 37 00459 #define RANGE_REAL8_F90_IEEE 307 00460 #if defined(_CRAYMPP) || defined(_LITTLE_ENDIAN) 00461 #define RANGE_REAL16_F90_IEEE 307 00462 #elif defined(__mips) 00463 #define RANGE_REAL16_F90_IEEE 275 00464 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \ 00465 (defined(_LITTLE_ENDIAN) && defined(__sv2)) 00466 #define RANGE_REAL16_F90_IEEE 4931 00467 #endif 00468 00469 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00470 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00471 #define RANGE_INT1_F90 RANGE_INT1_F90_IEEE /* Integer (KIND=1) */ 00472 #define RANGE_INT2_F90 RANGE_INT2_F90_IEEE /* Integer (KIND=2) */ 00473 #define RANGE_INT4_F90 RANGE_INT4_F90_IEEE /* Integer (KIND=4) */ 00474 #define RANGE_INT6_F90 RANGE_INT6_F90_IEEE /* Integer (KIND=6) */ 00475 #define RANGE_INT8_F90 RANGE_INT8_F90_IEEE /* Integer (KIND=8) */ 00476 #define RANGE_REAL4_F90 RANGE_REAL4_F90_IEEE /* real (KIND=4) */ 00477 #define RANGE_REAL8_F90 RANGE_REAL8_F90_IEEE /* real (KIND=8) */ 00478 #define RANGE_REAL16_F90 RANGE_REAL16_F90_IEEE /* real (KIND=16) */ 00479 #else 00480 #define RANGE_INT1_F90 RANGE_INT1_F90_Y /* Integer (KIND=1) */ 00481 #define RANGE_INT2_F90 RANGE_INT2_F90_Y /* Integer (KIND=2) */ 00482 #define RANGE_INT4_F90 RANGE_INT4_F90_Y /* Integer (KIND=4) */ 00483 #define RANGE_INT6_F90 RANGE_INT6_F90_Y /* Integer (KIND=6) */ 00484 #define RANGE_INT8_F90 RANGE_INT8_F90_Y /* Integer (KIND=8) */ 00485 #define RANGE_REAL_F90 RANGE_REAL_F90_Y /* real (KIND=4) */ 00486 #define RANGE_REAL4_F90 RANGE_REAL4_F90_Y /* real (KIND=4) */ 00487 #define RANGE_REAL8_F90 RANGE_REAL8_F90_Y /* real (KIND=8) */ 00488 #define RANGE_REAL16_F90 RANGE_REAL16_F90_Y /* real (KIND=16) */ 00489 #endif 00490 00491 /* TINY for real and double precision is the smallest number in the model. 00492 * Result is b**(emin-1) 00493 * 00494 * HEX values for TINY: 00495 * 00496 * YMP: TINY (in hex) IEEE: TINY (in hex) 00497 * R*4 2004800000000000 | 800000 00498 * R*8 2004800000000000 | 10000000000000 00499 * R*16 2004800000000000 | 1000000000000 00500 * 0 | 0 00501 * 00502 * SGI HEX for R*16 00503 * R*16 | 6B0000000000000 00504 * | 0000000000000000 00505 * Tiny for double-double (real(kind=16) for mips must be less than 00506 * TINY_REAL16_F90_IEEE 4.008336720017945555992216102700324100E-292L 00507 * since the use of an exponent in the range of -967 could cause the 00508 * second word to change and thus the entire value would be incorrect. 00509 * If the denormals in the second word get handled correctly across 00510 * all sgi platforms, then change TINY to the larger value and: 00511 * 00512 * SGI HEX for R*16 00513 * R*16 | 370000000000000 00514 * | 0000000000000000 00515 * 00516 * For now, use 1022 - 107 = 915 as the minexponent. 00517 * 00518 */ 00519 00520 /* YMP: */ 00521 #define TINY_REAL4_F90_Y 0.73344154702194e-2465 /* 0200044000000000000000 */ 00522 #define TINY_REAL8_F90_Y 0.73344154702194e-2465 /* 0200044000000000000000 */ 00523 #define TINY_REAL16_F90_Y 0.733441547021938866248564956819e-2465L 00524 /* 0200044000000000000000 */ 00525 /* 0000000000000000000000 */ 00526 /* IEEE: */ 00527 #define TINY_REAL4_F90_IEEE 1.175494350822287508E-38 /* 2**(-125-1) */ 00528 #define TINY_REAL8_F90_IEEE 2.225073858507201383E-308 /* 2**(-1021-1) */ 00529 #if defined(_CRAYMPP) || defined(_LITTLE_ENDIAN) 00530 #define TINY_REAL16_F90_IEEE 2.225073858507201383E-308 /* 2***(-1021-1) */ 00531 #elif defined(__mips) 00532 #define TINY_REAL16_F90_IEEE 1.8051943758648295760692620811737470000E-276L 00533 #elif defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) 00534 #define TINY_REAL16_F90_IEEE 3.362103143112093506262677817321752603E-4932L 00535 /* 2**-16382 */ 00536 #endif 00537 00538 #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \ 00539 (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN) 00540 #define TINY_REAL4_F90 TINY_REAL4_F90_IEEE /* real (KIND=4) */ 00541 #define TINY_REAL8_F90 TINY_REAL8_F90_IEEE /* real (KIND=8) */ 00542 #define TINY_REAL16_F90 TINY_REAL16_F90_IEEE /* real (KIND=16) */ 00543 #else 00544 #define TINY_REAL4_F90 TINY_REAL4_F90_Y /* real (KIND=4) */ 00545 #define TINY_REAL8_F90 TINY_REAL8_F90_Y /* real (KIND=8) */ 00546 #define TINY_REAL16_F90 TINY_REAL16_F90_Y /* real (KIND=16) */ 00547 #endif