00001
00002
00004 #include "cddefines.h"
00005
00006 #if defined(__HP_aCC)
00007
00008 extern "C" unsigned long fegettrapenable();
00009 extern "C" void fesettrapenable(unsigned long);
00010 #endif
00011
00012 #if defined(__ia64) && defined(__INTEL_COMPILER)
00013 extern "C" unsigned long fpgetmask();
00014 extern "C" void fpsetmask(unsigned long);
00015 #endif
00016
00017 #if defined(__sun) || defined(__sgi)
00018 #include <ieeefp.h>
00019 #if defined(HAVE_SUNMATH) || defined(FLUSH_DENORM_TO_ZERO)
00020 #include <sunmath.h>
00021 #endif
00022 #endif
00023
00024 #if defined(__alpha) && defined(__linux) && defined(__GNUC__)
00025 #define __USE_GNU
00026 #include <fenv.h>
00027 #endif
00028
00029 #ifdef __unix
00030 #include <unistd.h>
00031 #endif
00032
00033
00034 t_cpu::t_cpu()
00035 {
00036
00037 endian.c[0] = 0x12;
00038 endian.c[1] = 0x34;
00039 endian.c[2] = 0x56;
00040 endian.c[3] = 0x78;
00041
00042
00043
00044 if( sizeof(float) == 4 )
00045 {
00046 # ifdef __mips
00047
00048 Float_SNaN_Value = 0xffffffff;
00049 # else
00050 if( big_endian() || little_endian() )
00051 {
00052
00053 Float_SNaN_Value = 0xffbfffff;
00054 }
00055 else
00056 {
00057
00058 Float_SNaN_Value = -1;
00059 }
00060 # endif
00061 }
00062 else
00063 {
00064
00065 Float_SNaN_Value = -1;
00066 }
00067
00068 # ifdef HAVE_INT64
00069
00070 if( sizeof(double) == 8 )
00071 {
00072 # ifdef __mips
00073
00074 Double_SNaN_Value = 0xffffffffffffffff;
00075 # else
00076
00077 Double_SNaN_Value = 0xfff7ffffffbfffff;
00078 # endif
00079 }
00080 else
00081 {
00082
00083 Double_SNaN_Value = -1;
00084 }
00085
00086 # else
00087
00088 if( sizeof(double) == 8 )
00089 {
00090 # ifdef __mips
00091
00092 Double_SNaN_Value[0] = 0xffffffff;
00093 Double_SNaN_Value[1] = 0xffffffff;
00094 # else
00095 if( big_endian() )
00096 {
00097
00098 Double_SNaN_Value[0] = 0xfff7ffff;
00099 Double_SNaN_Value[1] = 0xffbfffff;
00100 }
00101 else if( little_endian() )
00102 {
00103
00104 Double_SNaN_Value[0] = 0xffbfffff;
00105 Double_SNaN_Value[1] = 0xfff7ffff;
00106 }
00107 else
00108 {
00109
00110 Double_SNaN_Value[0] = -1;
00111 Double_SNaN_Value[1] = -1;
00112 }
00113 # endif
00114 }
00115 else
00116 {
00117
00118 Double_SNaN_Value[0] = -1;
00119 Double_SNaN_Value[1] = -1;
00120 }
00121
00122 # endif
00123
00124
00125 enable_traps();
00126
00127 const char *str;
00128
00129
00130 # if defined(_SC_NPROCESSORS_ONLN)
00131 n_avail_CPU = sysconf(_SC_NPROCESSORS_ONLN);
00132 # elif defined(_SC_NPROC_ONLN)
00133 n_avail_CPU = sysconf(_SC_NPROC_ONLN);
00134 # elif defined(_SC_CRAY_NCPU)
00135 n_avail_CPU = sysconf(_SC_CRAY_NCPU);
00136 # elif defined(_WIN32)
00137 str = getenv( "NUMBER_OF_PROCESSORS" );
00138 if( str != NULL )
00139 {
00140 int found = sscanf( str, "%ld", &n_avail_CPU );
00141 if( found != 1 )
00142 n_avail_CPU = 1;
00143 }
00144 else
00145 {
00146 n_avail_CPU = 1;
00147 }
00148 # else
00149
00150 n_avail_CPU = 1;
00151 # endif
00152
00153 # ifdef _WIN32
00154 str = getenv( "COMPUTERNAME" );
00155 # else
00156 str = getenv( "HOSTNAME" );
00157 # endif
00158
00159 if( str != NULL )
00160 strncpy( HostName, str, STDLEN );
00161 else
00162 strncpy( HostName, "unknown", STDLEN );
00163 HostName[STDLEN-1] = '\0';
00164 }
00165
00166 void t_cpu::enable_traps() const
00167 {
00168
00169
00170
00171
00172
00173
00174
00175 # if defined(_MSC_VER)
00176 volatile unsigned int NewMask;
00177
00178
00179
00180
00181 NewMask = _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_INVALID;
00182
00183 NewMask = ~NewMask;
00184
00185 _controlfp( NewMask , _MCW_EM );
00186
00187
00188
00189
00190
00191 # elif defined(__GNUC__) && ( defined(__i386) || defined(__amd64) )
00192 volatile unsigned int Old_Mask, New_Mask;
00193 # if defined(__SSE__) || defined(__SSE2__)
00194 volatile unsigned int SSE_Mask;
00195 # endif
00196
00197 # define _FPU_MASK_IM 0x01
00198 # define _FPU_MASK_DM 0x02
00199 # define _FPU_MASK_ZM 0x04
00200 # define _FPU_MASK_OM 0x08
00201 # define _FPU_MASK_UM 0x10
00202 # define _FPU_MASK_PM 0x20
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 volatile unsigned int UnMask = ~((unsigned int)( _FPU_MASK_ZM | _FPU_MASK_IM | _FPU_MASK_OM ));
00213
00214 __asm__ volatile("fnstcw %0" : "=m" (*&Old_Mask));
00215
00216 New_Mask = Old_Mask & UnMask;
00217
00218 __asm__ volatile("fldcw %0" : : "m" (*&New_Mask));
00219
00220 # if defined(__SSE__) || defined(__SSE2__)
00221
00222 # if defined(FLUSH_DENORM_TO_ZERO)
00223
00224
00225 SSE_Mask = 0x9900;
00226 # else
00227
00228 SSE_Mask = 0x1900;
00229 # endif
00230
00231
00232
00233 __asm__ volatile( "ldmxcsr %0" : : "m" (*&SSE_Mask) );
00234
00235 # endif
00236
00237
00238 # elif defined(__ia64)
00239
00240 # define FPSR_TRAP_VD (1 << 0)
00241 # define FPSR_TRAP_DD (1 << 1)
00242 # define FPSR_TRAP_ZD (1 << 2)
00243 # define FPSR_TRAP_OD (1 << 3)
00244 # define FPSR_TRAP_UD (1 << 4)
00245 # define FPSR_TRAP_ID (1 << 5)
00246
00247 # define FPSR_SF0_FTZ (1 << 6)
00248
00249 # if defined(__GNUC_EXCL__)
00250
00251 # define _IA64_REG_AR_FPSR 40
00252
00253 # define ia64_getreg( regnum ) __asm__ volatile( "mov %0=ar%1" : "=r" (fpsr) : "i"(regnum) )
00254 # define ia64_setreg( regnum, val ) __asm__ volatile( "mov ar%0=%1" :: "i" (regnum), "r"(val): "memory" )
00255 # define ia64_serialize __asm__ volatile( "srlz.i" );
00256
00257 volatile unsigned long fpsr, flags = FPSR_TRAP_VD | FPSR_TRAP_ZD | FPSR_TRAP_OD;
00258
00259 ia64_getreg( _IA64_REG_AR_FPSR );
00260 fpsr &= ~flags;
00261 # if defined(FLUSH_DENORM_TO_ZERO)
00262 fpsr |= FPSR_SF0_FTZ;
00263 # endif
00264 ia64_setreg( _IA64_REG_AR_FPSR, fpsr );
00265
00266 ia64_serialize;
00267
00268 # elif defined(__INTEL_COMPILER)
00269
00270 unsigned long fpsr = fpgetmask();
00271 fpsr |= FPSR_TRAP_VD | FPSR_TRAP_ZD | FPSR_TRAP_OD;
00272 fpsetmask( fpsr );
00273 # elif defined(__HP_aCC)
00274
00275 unsigned long fpsr = fegettrapenable();
00276 fpsr |= FPSR_TRAP_VD | FPSR_TRAP_ZD | FPSR_TRAP_OD;
00277 fesettrapenable( fpsr );
00278 # endif
00279
00280
00281 # elif defined(__sun) || defined(__sgi)
00282
00283 fp_except mask;
00284
00285
00286 # if defined(HAVE_SUNMATH) || defined(FLUSH_DENORM_TO_ZERO)
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 nonstandard_arithmetic();
00320 # endif
00321
00322
00323 mask = fpgetmask();
00324 mask = mask | FP_X_INV | FP_X_OFL | FP_X_DZ;
00325 fpsetmask(mask);
00326
00327 # elif defined(__alpha) && defined(__linux) && defined(__GNUC__)
00328
00329
00330
00331
00332 # ifdef FE_NONIEEE_ENV
00333
00334
00335
00336 fesetenv(FE_NONIEEE_ENV);
00337 # endif
00338
00339 # endif
00340 return;
00341 }