1 1.1 bjh21 /* $NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $ */ 2 1.1 bjh21 3 1.1 bjh21 /* 4 1.1 bjh21 =============================================================================== 5 1.1 bjh21 6 1.1 bjh21 This C source file is part of the SoftFloat IEC/IEEE Floating-point 7 1.1 bjh21 Arithmetic Package, Release 2a. 8 1.1 bjh21 9 1.1 bjh21 Written by John R. Hauser. This work was made possible in part by the 10 1.1 bjh21 International Computer Science Institute, located at Suite 600, 1947 Center 11 1.1 bjh21 Street, Berkeley, California 94704. Funding was partially provided by the 12 1.1 bjh21 National Science Foundation under grant MIP-9311980. The original version 13 1.1 bjh21 of this code was written as part of a project to build a fixed-point vector 14 1.1 bjh21 processor in collaboration with the University of California at Berkeley, 15 1.1 bjh21 overseen by Profs. Nelson Morgan and John Wawrzynek. More information 16 1.1 bjh21 is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ 17 1.1 bjh21 arithmetic/SoftFloat.html'. 18 1.1 bjh21 19 1.1 bjh21 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 20 1.1 bjh21 has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 21 1.1 bjh21 TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 22 1.1 bjh21 PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 23 1.1 bjh21 AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 24 1.1 bjh21 25 1.1 bjh21 Derivative works are acceptable, even for commercial purposes, so long as 26 1.1 bjh21 (1) they include prominent notice that the work is derivative, and (2) they 27 1.1 bjh21 include prominent notice akin to these four paragraphs for those parts of 28 1.1 bjh21 this code that are retained. 29 1.1 bjh21 30 1.1 bjh21 =============================================================================== 31 1.1 bjh21 */ 32 1.1 bjh21 33 1.1 bjh21 #include <sys/cdefs.h> 34 1.1 bjh21 #if defined(LIBC_SCCS) && !defined(lint) 35 1.1 bjh21 __RCSID("$NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $"); 36 1.1 bjh21 #endif /* LIBC_SCCS and not lint */ 37 1.1 bjh21 38 1.1 bjh21 #include <stdlib.h> 39 1.1 bjh21 #include <stdarg.h> 40 1.1 bjh21 #include <string.h> 41 1.1 bjh21 #include <stdio.h> 42 1.1 bjh21 #include <time.h> 43 1.1 bjh21 #include "milieu.h" 44 1.1 bjh21 #include "softfloat.h" 45 1.1 bjh21 46 1.1 bjh21 enum { 47 1.1 bjh21 minIterations = 1000 48 1.1 bjh21 }; 49 1.1 bjh21 50 1.1 bjh21 static void fail( const char *message, ... ) 51 1.1 bjh21 { 52 1.1 bjh21 va_list varArgs; 53 1.1 bjh21 54 1.1 bjh21 fputs( "timesoftfloat: ", stderr ); 55 1.1 bjh21 va_start( varArgs, message ); 56 1.1 bjh21 vfprintf( stderr, message, varArgs ); 57 1.1 bjh21 va_end( varArgs ); 58 1.1 bjh21 fputs( ".\n", stderr ); 59 1.1 bjh21 exit( EXIT_FAILURE ); 60 1.1 bjh21 61 1.1 bjh21 } 62 1.1 bjh21 63 1.1 bjh21 static char *functionName; 64 1.1 bjh21 static char *roundingPrecisionName, *roundingModeName, *tininessModeName; 65 1.1 bjh21 66 1.1 bjh21 static void reportTime( int32 count, long clocks ) 67 1.1 bjh21 { 68 1.1 bjh21 69 1.1 bjh21 printf( 70 1.1 bjh21 "%8.1f kops/s: %s", 71 1.1 bjh21 ( count / ( ( (float) clocks ) / CLOCKS_PER_SEC ) ) / 1000, 72 1.1 bjh21 functionName 73 1.1 bjh21 ); 74 1.1 bjh21 if ( roundingModeName ) { 75 1.1 bjh21 if ( roundingPrecisionName ) { 76 1.1 bjh21 fputs( ", precision ", stdout ); 77 1.1 bjh21 fputs( roundingPrecisionName, stdout ); 78 1.1 bjh21 } 79 1.1 bjh21 fputs( ", rounding ", stdout ); 80 1.1 bjh21 fputs( roundingModeName, stdout ); 81 1.1 bjh21 if ( tininessModeName ) { 82 1.1 bjh21 fputs( ", tininess ", stdout ); 83 1.1 bjh21 fputs( tininessModeName, stdout ); 84 1.1 bjh21 fputs( " rounding", stdout ); 85 1.1 bjh21 } 86 1.1 bjh21 } 87 1.1 bjh21 fputc( '\n', stdout ); 88 1.1 bjh21 89 1.1 bjh21 } 90 1.1 bjh21 91 1.1 bjh21 enum { 92 1.1 bjh21 numInputs_int32 = 32 93 1.1 bjh21 }; 94 1.1 bjh21 95 1.1 bjh21 static const int32 inputs_int32[ numInputs_int32 ] = { 96 1.1 bjh21 0xFFFFBB79, 0x405CF80F, 0x00000000, 0xFFFFFD04, 97 1.1 bjh21 0xFFF20002, 0x0C8EF795, 0xF00011FF, 0x000006CA, 98 1.1 bjh21 0x00009BFE, 0xFF4862E3, 0x9FFFEFFE, 0xFFFFFFB7, 99 1.1 bjh21 0x0BFF7FFF, 0x0000F37A, 0x0011DFFE, 0x00000006, 100 1.1 bjh21 0xFFF02006, 0xFFFFF7D1, 0x10200003, 0xDE8DF765, 101 1.1 bjh21 0x00003E02, 0x000019E8, 0x0008FFFE, 0xFFFFFB5C, 102 1.1 bjh21 0xFFDF7FFE, 0x07C42FBF, 0x0FFFE3FF, 0x040B9F13, 103 1.1 bjh21 0xBFFFFFF8, 0x0001BF56, 0x000017F6, 0x000A908A 104 1.1 bjh21 }; 105 1.1 bjh21 106 1.1 bjh21 static void time_a_int32_z_float32( float32 function( int32 ) ) 107 1.1 bjh21 { 108 1.1 bjh21 clock_t startClock, endClock; 109 1.1 bjh21 int32 count, i; 110 1.1 bjh21 int8 inputNum; 111 1.1 bjh21 112 1.1 bjh21 count = 0; 113 1.1 bjh21 inputNum = 0; 114 1.1 bjh21 startClock = clock(); 115 1.1 bjh21 do { 116 1.1 bjh21 for ( i = minIterations; i; --i ) { 117 1.1 bjh21 function( inputs_int32[ inputNum ] ); 118 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 119 1.1 bjh21 } 120 1.1 bjh21 count += minIterations; 121 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 122 1.1 bjh21 inputNum = 0; 123 1.1 bjh21 startClock = clock(); 124 1.1 bjh21 for ( i = count; i; --i ) { 125 1.1 bjh21 function( inputs_int32[ inputNum ] ); 126 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 127 1.1 bjh21 } 128 1.1 bjh21 endClock = clock(); 129 1.1 bjh21 reportTime( count, endClock - startClock ); 130 1.1 bjh21 131 1.1 bjh21 } 132 1.1 bjh21 133 1.1 bjh21 static void time_a_int32_z_float64( float64 function( int32 ) ) 134 1.1 bjh21 { 135 1.1 bjh21 clock_t startClock, endClock; 136 1.1 bjh21 int32 count, i; 137 1.1 bjh21 int8 inputNum; 138 1.1 bjh21 139 1.1 bjh21 count = 0; 140 1.1 bjh21 inputNum = 0; 141 1.1 bjh21 startClock = clock(); 142 1.1 bjh21 do { 143 1.1 bjh21 for ( i = minIterations; i; --i ) { 144 1.1 bjh21 function( inputs_int32[ inputNum ] ); 145 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 146 1.1 bjh21 } 147 1.1 bjh21 count += minIterations; 148 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 149 1.1 bjh21 inputNum = 0; 150 1.1 bjh21 startClock = clock(); 151 1.1 bjh21 for ( i = count; i; --i ) { 152 1.1 bjh21 function( inputs_int32[ inputNum ] ); 153 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 154 1.1 bjh21 } 155 1.1 bjh21 endClock = clock(); 156 1.1 bjh21 reportTime( count, endClock - startClock ); 157 1.1 bjh21 158 1.1 bjh21 } 159 1.1 bjh21 160 1.1 bjh21 #ifdef FLOATX80 161 1.1 bjh21 162 1.1 bjh21 static void time_a_int32_z_floatx80( floatx80 function( int32 ) ) 163 1.1 bjh21 { 164 1.1 bjh21 clock_t startClock, endClock; 165 1.1 bjh21 int32 count, i; 166 1.1 bjh21 int8 inputNum; 167 1.1 bjh21 168 1.1 bjh21 count = 0; 169 1.1 bjh21 inputNum = 0; 170 1.1 bjh21 startClock = clock(); 171 1.1 bjh21 do { 172 1.1 bjh21 for ( i = minIterations; i; --i ) { 173 1.1 bjh21 function( inputs_int32[ inputNum ] ); 174 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 175 1.1 bjh21 } 176 1.1 bjh21 count += minIterations; 177 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 178 1.1 bjh21 inputNum = 0; 179 1.1 bjh21 startClock = clock(); 180 1.1 bjh21 for ( i = count; i; --i ) { 181 1.1 bjh21 function( inputs_int32[ inputNum ] ); 182 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 183 1.1 bjh21 } 184 1.1 bjh21 endClock = clock(); 185 1.1 bjh21 reportTime( count, endClock - startClock ); 186 1.1 bjh21 187 1.1 bjh21 } 188 1.1 bjh21 189 1.1 bjh21 #endif 190 1.1 bjh21 191 1.1 bjh21 #ifdef FLOAT128 192 1.1 bjh21 193 1.1 bjh21 static void time_a_int32_z_float128( float128 function( int32 ) ) 194 1.1 bjh21 { 195 1.1 bjh21 clock_t startClock, endClock; 196 1.1 bjh21 int32 count, i; 197 1.1 bjh21 int8 inputNum; 198 1.1 bjh21 199 1.1 bjh21 count = 0; 200 1.1 bjh21 inputNum = 0; 201 1.1 bjh21 startClock = clock(); 202 1.1 bjh21 do { 203 1.1 bjh21 for ( i = minIterations; i; --i ) { 204 1.1 bjh21 function( inputs_int32[ inputNum ] ); 205 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 206 1.1 bjh21 } 207 1.1 bjh21 count += minIterations; 208 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 209 1.1 bjh21 inputNum = 0; 210 1.1 bjh21 startClock = clock(); 211 1.1 bjh21 for ( i = count; i; --i ) { 212 1.1 bjh21 function( inputs_int32[ inputNum ] ); 213 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 ); 214 1.1 bjh21 } 215 1.1 bjh21 endClock = clock(); 216 1.1 bjh21 reportTime( count, endClock - startClock ); 217 1.1 bjh21 218 1.1 bjh21 } 219 1.1 bjh21 220 1.1 bjh21 #endif 221 1.1 bjh21 222 1.1 bjh21 enum { 223 1.1 bjh21 numInputs_int64 = 32 224 1.1 bjh21 }; 225 1.1 bjh21 226 1.1 bjh21 static const int64 inputs_int64[ numInputs_int64 ] = { 227 1.1 bjh21 LIT64( 0xFBFFC3FFFFFFFFFF ), 228 1.1 bjh21 LIT64( 0x0000000003C589BC ), 229 1.1 bjh21 LIT64( 0x00000000400013FE ), 230 1.1 bjh21 LIT64( 0x0000000000186171 ), 231 1.1 bjh21 LIT64( 0xFFFFFFFFFFFEFBFA ), 232 1.1 bjh21 LIT64( 0xFFFFFD79E6DFFC73 ), 233 1.1 bjh21 LIT64( 0x0000000010001DFF ), 234 1.1 bjh21 LIT64( 0xDD1A0F0C78513710 ), 235 1.1 bjh21 LIT64( 0xFFFF83FFFFFEFFFE ), 236 1.1 bjh21 LIT64( 0x00756EBD1AD0C1C7 ), 237 1.1 bjh21 LIT64( 0x0003FDFFFFFFFFBE ), 238 1.1 bjh21 LIT64( 0x0007D0FB2C2CA951 ), 239 1.1 bjh21 LIT64( 0x0007FC0007FFFFFE ), 240 1.1 bjh21 LIT64( 0x0000001F942B18BB ), 241 1.1 bjh21 LIT64( 0x0000080101FFFFFE ), 242 1.1 bjh21 LIT64( 0xFFFFFFFFFFFF0978 ), 243 1.1 bjh21 LIT64( 0x000000000008BFFF ), 244 1.1 bjh21 LIT64( 0x0000000006F5AF08 ), 245 1.1 bjh21 LIT64( 0xFFDEFF7FFFFFFFFE ), 246 1.1 bjh21 LIT64( 0x0000000000000003 ), 247 1.1 bjh21 LIT64( 0x3FFFFFFFFF80007D ), 248 1.1 bjh21 LIT64( 0x0000000000000078 ), 249 1.1 bjh21 LIT64( 0xFFF80000007FDFFD ), 250 1.1 bjh21 LIT64( 0x1BBC775B78016AB0 ), 251 1.1 bjh21 LIT64( 0xFFF9001FFFFFFFFE ), 252 1.1 bjh21 LIT64( 0xFFFD4767AB98E43F ), 253 1.1 bjh21 LIT64( 0xFFFFFEFFFE00001E ), 254 1.1 bjh21 LIT64( 0xFFFFFFFFFFF04EFD ), 255 1.1 bjh21 LIT64( 0x07FFFFFFFFFFF7FF ), 256 1.1 bjh21 LIT64( 0xFFFC9EAA38F89050 ), 257 1.1 bjh21 LIT64( 0x00000020FBFFFFFE ), 258 1.1 bjh21 LIT64( 0x0000099AE6455357 ) 259 1.1 bjh21 }; 260 1.1 bjh21 261 1.1 bjh21 static void time_a_int64_z_float32( float32 function( int64 ) ) 262 1.1 bjh21 { 263 1.1 bjh21 clock_t startClock, endClock; 264 1.1 bjh21 int32 count, i; 265 1.1 bjh21 int8 inputNum; 266 1.1 bjh21 267 1.1 bjh21 count = 0; 268 1.1 bjh21 inputNum = 0; 269 1.1 bjh21 startClock = clock(); 270 1.1 bjh21 do { 271 1.1 bjh21 for ( i = minIterations; i; --i ) { 272 1.1 bjh21 function( inputs_int64[ inputNum ] ); 273 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 274 1.1 bjh21 } 275 1.1 bjh21 count += minIterations; 276 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 277 1.1 bjh21 inputNum = 0; 278 1.1 bjh21 startClock = clock(); 279 1.1 bjh21 for ( i = count; i; --i ) { 280 1.1 bjh21 function( inputs_int64[ inputNum ] ); 281 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 282 1.1 bjh21 } 283 1.1 bjh21 endClock = clock(); 284 1.1 bjh21 reportTime( count, endClock - startClock ); 285 1.1 bjh21 286 1.1 bjh21 } 287 1.1 bjh21 288 1.1 bjh21 static void time_a_int64_z_float64( float64 function( int64 ) ) 289 1.1 bjh21 { 290 1.1 bjh21 clock_t startClock, endClock; 291 1.1 bjh21 int32 count, i; 292 1.1 bjh21 int8 inputNum; 293 1.1 bjh21 294 1.1 bjh21 count = 0; 295 1.1 bjh21 inputNum = 0; 296 1.1 bjh21 startClock = clock(); 297 1.1 bjh21 do { 298 1.1 bjh21 for ( i = minIterations; i; --i ) { 299 1.1 bjh21 function( inputs_int64[ inputNum ] ); 300 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 301 1.1 bjh21 } 302 1.1 bjh21 count += minIterations; 303 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 304 1.1 bjh21 inputNum = 0; 305 1.1 bjh21 startClock = clock(); 306 1.1 bjh21 for ( i = count; i; --i ) { 307 1.1 bjh21 function( inputs_int64[ inputNum ] ); 308 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 309 1.1 bjh21 } 310 1.1 bjh21 endClock = clock(); 311 1.1 bjh21 reportTime( count, endClock - startClock ); 312 1.1 bjh21 313 1.1 bjh21 } 314 1.1 bjh21 315 1.1 bjh21 #ifdef FLOATX80 316 1.1 bjh21 317 1.1 bjh21 static void time_a_int64_z_floatx80( floatx80 function( int64 ) ) 318 1.1 bjh21 { 319 1.1 bjh21 clock_t startClock, endClock; 320 1.1 bjh21 int32 count, i; 321 1.1 bjh21 int8 inputNum; 322 1.1 bjh21 323 1.1 bjh21 count = 0; 324 1.1 bjh21 inputNum = 0; 325 1.1 bjh21 startClock = clock(); 326 1.1 bjh21 do { 327 1.1 bjh21 for ( i = minIterations; i; --i ) { 328 1.1 bjh21 function( inputs_int64[ inputNum ] ); 329 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 330 1.1 bjh21 } 331 1.1 bjh21 count += minIterations; 332 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 333 1.1 bjh21 inputNum = 0; 334 1.1 bjh21 startClock = clock(); 335 1.1 bjh21 for ( i = count; i; --i ) { 336 1.1 bjh21 function( inputs_int64[ inputNum ] ); 337 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 338 1.1 bjh21 } 339 1.1 bjh21 endClock = clock(); 340 1.1 bjh21 reportTime( count, endClock - startClock ); 341 1.1 bjh21 342 1.1 bjh21 } 343 1.1 bjh21 344 1.1 bjh21 #endif 345 1.1 bjh21 346 1.1 bjh21 #ifdef FLOAT128 347 1.1 bjh21 348 1.1 bjh21 static void time_a_int64_z_float128( float128 function( int64 ) ) 349 1.1 bjh21 { 350 1.1 bjh21 clock_t startClock, endClock; 351 1.1 bjh21 int32 count, i; 352 1.1 bjh21 int8 inputNum; 353 1.1 bjh21 354 1.1 bjh21 count = 0; 355 1.1 bjh21 inputNum = 0; 356 1.1 bjh21 startClock = clock(); 357 1.1 bjh21 do { 358 1.1 bjh21 for ( i = minIterations; i; --i ) { 359 1.1 bjh21 function( inputs_int64[ inputNum ] ); 360 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 361 1.1 bjh21 } 362 1.1 bjh21 count += minIterations; 363 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 364 1.1 bjh21 inputNum = 0; 365 1.1 bjh21 startClock = clock(); 366 1.1 bjh21 for ( i = count; i; --i ) { 367 1.1 bjh21 function( inputs_int64[ inputNum ] ); 368 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 ); 369 1.1 bjh21 } 370 1.1 bjh21 endClock = clock(); 371 1.1 bjh21 reportTime( count, endClock - startClock ); 372 1.1 bjh21 373 1.1 bjh21 } 374 1.1 bjh21 375 1.1 bjh21 #endif 376 1.1 bjh21 377 1.1 bjh21 enum { 378 1.1 bjh21 numInputs_float32 = 32 379 1.1 bjh21 }; 380 1.1 bjh21 381 1.1 bjh21 static const float32 inputs_float32[ numInputs_float32 ] = { 382 1.1 bjh21 0x4EFA0000, 0xC1D0B328, 0x80000000, 0x3E69A31E, 383 1.1 bjh21 0xAF803EFF, 0x3F800000, 0x17BF8000, 0xE74A301A, 384 1.1 bjh21 0x4E010003, 0x7EE3C75D, 0xBD803FE0, 0xBFFEFF00, 385 1.1 bjh21 0x7981F800, 0x431FFFFC, 0xC100C000, 0x3D87EFFF, 386 1.1 bjh21 0x4103FEFE, 0xBC000007, 0xBF01F7FF, 0x4E6C6B5C, 387 1.1 bjh21 0xC187FFFE, 0xC58B9F13, 0x4F88007F, 0xDF004007, 388 1.1 bjh21 0xB7FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000, 389 1.1 bjh21 0xDB428661, 0x33F89B1F, 0xA3BFEFFF, 0x537BFFBE 390 1.1 bjh21 }; 391 1.1 bjh21 392 1.1 bjh21 static void time_a_float32_z_int32( int32 function( float32 ) ) 393 1.1 bjh21 { 394 1.1 bjh21 clock_t startClock, endClock; 395 1.1 bjh21 int32 count, i; 396 1.1 bjh21 int8 inputNum; 397 1.1 bjh21 398 1.1 bjh21 count = 0; 399 1.1 bjh21 inputNum = 0; 400 1.1 bjh21 startClock = clock(); 401 1.1 bjh21 do { 402 1.1 bjh21 for ( i = minIterations; i; --i ) { 403 1.1 bjh21 function( inputs_float32[ inputNum ] ); 404 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 405 1.1 bjh21 } 406 1.1 bjh21 count += minIterations; 407 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 408 1.1 bjh21 inputNum = 0; 409 1.1 bjh21 startClock = clock(); 410 1.1 bjh21 for ( i = count; i; --i ) { 411 1.1 bjh21 function( inputs_float32[ inputNum ] ); 412 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 413 1.1 bjh21 } 414 1.1 bjh21 endClock = clock(); 415 1.1 bjh21 reportTime( count, endClock - startClock ); 416 1.1 bjh21 417 1.1 bjh21 } 418 1.1 bjh21 419 1.1 bjh21 static void time_a_float32_z_int64( int64 function( float32 ) ) 420 1.1 bjh21 { 421 1.1 bjh21 clock_t startClock, endClock; 422 1.1 bjh21 int32 count, i; 423 1.1 bjh21 int8 inputNum; 424 1.1 bjh21 425 1.1 bjh21 count = 0; 426 1.1 bjh21 inputNum = 0; 427 1.1 bjh21 startClock = clock(); 428 1.1 bjh21 do { 429 1.1 bjh21 for ( i = minIterations; i; --i ) { 430 1.1 bjh21 function( inputs_float32[ inputNum ] ); 431 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 432 1.1 bjh21 } 433 1.1 bjh21 count += minIterations; 434 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 435 1.1 bjh21 inputNum = 0; 436 1.1 bjh21 startClock = clock(); 437 1.1 bjh21 for ( i = count; i; --i ) { 438 1.1 bjh21 function( inputs_float32[ inputNum ] ); 439 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 440 1.1 bjh21 } 441 1.1 bjh21 endClock = clock(); 442 1.1 bjh21 reportTime( count, endClock - startClock ); 443 1.1 bjh21 444 1.1 bjh21 } 445 1.1 bjh21 446 1.1 bjh21 static void time_a_float32_z_float64( float64 function( float32 ) ) 447 1.1 bjh21 { 448 1.1 bjh21 clock_t startClock, endClock; 449 1.1 bjh21 int32 count, i; 450 1.1 bjh21 int8 inputNum; 451 1.1 bjh21 452 1.1 bjh21 count = 0; 453 1.1 bjh21 inputNum = 0; 454 1.1 bjh21 startClock = clock(); 455 1.1 bjh21 do { 456 1.1 bjh21 for ( i = minIterations; i; --i ) { 457 1.1 bjh21 function( inputs_float32[ inputNum ] ); 458 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 459 1.1 bjh21 } 460 1.1 bjh21 count += minIterations; 461 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 462 1.1 bjh21 inputNum = 0; 463 1.1 bjh21 startClock = clock(); 464 1.1 bjh21 for ( i = count; i; --i ) { 465 1.1 bjh21 function( inputs_float32[ inputNum ] ); 466 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 467 1.1 bjh21 } 468 1.1 bjh21 endClock = clock(); 469 1.1 bjh21 reportTime( count, endClock - startClock ); 470 1.1 bjh21 471 1.1 bjh21 } 472 1.1 bjh21 473 1.1 bjh21 #ifdef FLOATX80 474 1.1 bjh21 475 1.1 bjh21 static void time_a_float32_z_floatx80( floatx80 function( float32 ) ) 476 1.1 bjh21 { 477 1.1 bjh21 clock_t startClock, endClock; 478 1.1 bjh21 int32 count, i; 479 1.1 bjh21 int8 inputNum; 480 1.1 bjh21 481 1.1 bjh21 count = 0; 482 1.1 bjh21 inputNum = 0; 483 1.1 bjh21 startClock = clock(); 484 1.1 bjh21 do { 485 1.1 bjh21 for ( i = minIterations; i; --i ) { 486 1.1 bjh21 function( inputs_float32[ inputNum ] ); 487 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 488 1.1 bjh21 } 489 1.1 bjh21 count += minIterations; 490 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 491 1.1 bjh21 inputNum = 0; 492 1.1 bjh21 startClock = clock(); 493 1.1 bjh21 for ( i = count; i; --i ) { 494 1.1 bjh21 function( inputs_float32[ inputNum ] ); 495 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 496 1.1 bjh21 } 497 1.1 bjh21 endClock = clock(); 498 1.1 bjh21 reportTime( count, endClock - startClock ); 499 1.1 bjh21 500 1.1 bjh21 } 501 1.1 bjh21 502 1.1 bjh21 #endif 503 1.1 bjh21 504 1.1 bjh21 #ifdef FLOAT128 505 1.1 bjh21 506 1.1 bjh21 static void time_a_float32_z_float128( float128 function( float32 ) ) 507 1.1 bjh21 { 508 1.1 bjh21 clock_t startClock, endClock; 509 1.1 bjh21 int32 count, i; 510 1.1 bjh21 int8 inputNum; 511 1.1 bjh21 512 1.1 bjh21 count = 0; 513 1.1 bjh21 inputNum = 0; 514 1.1 bjh21 startClock = clock(); 515 1.1 bjh21 do { 516 1.1 bjh21 for ( i = minIterations; i; --i ) { 517 1.1 bjh21 function( inputs_float32[ inputNum ] ); 518 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 519 1.1 bjh21 } 520 1.1 bjh21 count += minIterations; 521 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 522 1.1 bjh21 inputNum = 0; 523 1.1 bjh21 startClock = clock(); 524 1.1 bjh21 for ( i = count; i; --i ) { 525 1.1 bjh21 function( inputs_float32[ inputNum ] ); 526 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 527 1.1 bjh21 } 528 1.1 bjh21 endClock = clock(); 529 1.1 bjh21 reportTime( count, endClock - startClock ); 530 1.1 bjh21 531 1.1 bjh21 } 532 1.1 bjh21 533 1.1 bjh21 #endif 534 1.1 bjh21 535 1.1 bjh21 static void time_az_float32( float32 function( float32 ) ) 536 1.1 bjh21 { 537 1.1 bjh21 clock_t startClock, endClock; 538 1.1 bjh21 int32 count, i; 539 1.1 bjh21 int8 inputNum; 540 1.1 bjh21 541 1.1 bjh21 count = 0; 542 1.1 bjh21 inputNum = 0; 543 1.1 bjh21 startClock = clock(); 544 1.1 bjh21 do { 545 1.1 bjh21 for ( i = minIterations; i; --i ) { 546 1.1 bjh21 function( inputs_float32[ inputNum ] ); 547 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 548 1.1 bjh21 } 549 1.1 bjh21 count += minIterations; 550 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 551 1.1 bjh21 inputNum = 0; 552 1.1 bjh21 startClock = clock(); 553 1.1 bjh21 for ( i = count; i; --i ) { 554 1.1 bjh21 function( inputs_float32[ inputNum ] ); 555 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 556 1.1 bjh21 } 557 1.1 bjh21 endClock = clock(); 558 1.1 bjh21 reportTime( count, endClock - startClock ); 559 1.1 bjh21 560 1.1 bjh21 } 561 1.1 bjh21 562 1.1 bjh21 static void time_ab_float32_z_flag( flag function( float32, float32 ) ) 563 1.1 bjh21 { 564 1.1 bjh21 clock_t startClock, endClock; 565 1.1 bjh21 int32 count, i; 566 1.1 bjh21 int8 inputNumA, inputNumB; 567 1.1 bjh21 568 1.1 bjh21 count = 0; 569 1.1 bjh21 inputNumA = 0; 570 1.1 bjh21 inputNumB = 0; 571 1.1 bjh21 startClock = clock(); 572 1.1 bjh21 do { 573 1.1 bjh21 for ( i = minIterations; i; --i ) { 574 1.1 bjh21 function( 575 1.1 bjh21 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] ); 576 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 ); 577 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 578 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 ); 579 1.1 bjh21 } 580 1.1 bjh21 count += minIterations; 581 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 582 1.1 bjh21 inputNumA = 0; 583 1.1 bjh21 inputNumB = 0; 584 1.1 bjh21 startClock = clock(); 585 1.1 bjh21 for ( i = count; i; --i ) { 586 1.1 bjh21 function( 587 1.1 bjh21 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] ); 588 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 ); 589 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 590 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 ); 591 1.1 bjh21 } 592 1.1 bjh21 endClock = clock(); 593 1.1 bjh21 reportTime( count, endClock - startClock ); 594 1.1 bjh21 595 1.1 bjh21 } 596 1.1 bjh21 597 1.1 bjh21 static void time_abz_float32( float32 function( float32, float32 ) ) 598 1.1 bjh21 { 599 1.1 bjh21 clock_t startClock, endClock; 600 1.1 bjh21 int32 count, i; 601 1.1 bjh21 int8 inputNumA, inputNumB; 602 1.1 bjh21 603 1.1 bjh21 count = 0; 604 1.1 bjh21 inputNumA = 0; 605 1.1 bjh21 inputNumB = 0; 606 1.1 bjh21 startClock = clock(); 607 1.1 bjh21 do { 608 1.1 bjh21 for ( i = minIterations; i; --i ) { 609 1.1 bjh21 function( 610 1.1 bjh21 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] ); 611 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 ); 612 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 613 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 ); 614 1.1 bjh21 } 615 1.1 bjh21 count += minIterations; 616 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 617 1.1 bjh21 inputNumA = 0; 618 1.1 bjh21 inputNumB = 0; 619 1.1 bjh21 startClock = clock(); 620 1.1 bjh21 for ( i = count; i; --i ) { 621 1.1 bjh21 function( 622 1.1 bjh21 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] ); 623 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 ); 624 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 625 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 ); 626 1.1 bjh21 } 627 1.1 bjh21 endClock = clock(); 628 1.1 bjh21 reportTime( count, endClock - startClock ); 629 1.1 bjh21 630 1.1 bjh21 } 631 1.1 bjh21 632 1.1 bjh21 static const float32 inputs_float32_pos[ numInputs_float32 ] = { 633 1.1 bjh21 0x4EFA0000, 0x41D0B328, 0x00000000, 0x3E69A31E, 634 1.1 bjh21 0x2F803EFF, 0x3F800000, 0x17BF8000, 0x674A301A, 635 1.1 bjh21 0x4E010003, 0x7EE3C75D, 0x3D803FE0, 0x3FFEFF00, 636 1.1 bjh21 0x7981F800, 0x431FFFFC, 0x4100C000, 0x3D87EFFF, 637 1.1 bjh21 0x4103FEFE, 0x3C000007, 0x3F01F7FF, 0x4E6C6B5C, 638 1.1 bjh21 0x4187FFFE, 0x458B9F13, 0x4F88007F, 0x5F004007, 639 1.1 bjh21 0x37FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000, 640 1.1 bjh21 0x5B428661, 0x33F89B1F, 0x23BFEFFF, 0x537BFFBE 641 1.1 bjh21 }; 642 1.1 bjh21 643 1.1 bjh21 static void time_az_float32_pos( float32 function( float32 ) ) 644 1.1 bjh21 { 645 1.1 bjh21 clock_t startClock, endClock; 646 1.1 bjh21 int32 count, i; 647 1.1 bjh21 int8 inputNum; 648 1.1 bjh21 649 1.1 bjh21 count = 0; 650 1.1 bjh21 inputNum = 0; 651 1.1 bjh21 startClock = clock(); 652 1.1 bjh21 do { 653 1.1 bjh21 for ( i = minIterations; i; --i ) { 654 1.1 bjh21 function( inputs_float32_pos[ inputNum ] ); 655 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 656 1.1 bjh21 } 657 1.1 bjh21 count += minIterations; 658 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 659 1.1 bjh21 inputNum = 0; 660 1.1 bjh21 startClock = clock(); 661 1.1 bjh21 for ( i = count; i; --i ) { 662 1.1 bjh21 function( inputs_float32_pos[ inputNum ] ); 663 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 ); 664 1.1 bjh21 } 665 1.1 bjh21 endClock = clock(); 666 1.1 bjh21 reportTime( count, endClock - startClock ); 667 1.1 bjh21 668 1.1 bjh21 } 669 1.1 bjh21 670 1.1 bjh21 enum { 671 1.1 bjh21 numInputs_float64 = 32 672 1.1 bjh21 }; 673 1.1 bjh21 674 1.1 bjh21 static const float64 inputs_float64[ numInputs_float64 ] = { 675 1.1 bjh21 LIT64( 0x422FFFC008000000 ), 676 1.1 bjh21 LIT64( 0xB7E0000480000000 ), 677 1.1 bjh21 LIT64( 0xF3FD2546120B7935 ), 678 1.1 bjh21 LIT64( 0x3FF0000000000000 ), 679 1.1 bjh21 LIT64( 0xCE07F766F09588D6 ), 680 1.1 bjh21 LIT64( 0x8000000000000000 ), 681 1.1 bjh21 LIT64( 0x3FCE000400000000 ), 682 1.1 bjh21 LIT64( 0x8313B60F0032BED8 ), 683 1.1 bjh21 LIT64( 0xC1EFFFFFC0002000 ), 684 1.1 bjh21 LIT64( 0x3FB3C75D224F2B0F ), 685 1.1 bjh21 LIT64( 0x7FD00000004000FF ), 686 1.1 bjh21 LIT64( 0xA12FFF8000001FFF ), 687 1.1 bjh21 LIT64( 0x3EE0000000FE0000 ), 688 1.1 bjh21 LIT64( 0x0010000080000004 ), 689 1.1 bjh21 LIT64( 0x41CFFFFE00000020 ), 690 1.1 bjh21 LIT64( 0x40303FFFFFFFFFFD ), 691 1.1 bjh21 LIT64( 0x3FD000003FEFFFFF ), 692 1.1 bjh21 LIT64( 0xBFD0000010000000 ), 693 1.1 bjh21 LIT64( 0xB7FC6B5C16CA55CF ), 694 1.1 bjh21 LIT64( 0x413EEB940B9D1301 ), 695 1.1 bjh21 LIT64( 0xC7E00200001FFFFF ), 696 1.1 bjh21 LIT64( 0x47F00021FFFFFFFE ), 697 1.1 bjh21 LIT64( 0xBFFFFFFFF80000FF ), 698 1.1 bjh21 LIT64( 0xC07FFFFFE00FFFFF ), 699 1.1 bjh21 LIT64( 0x001497A63740C5E8 ), 700 1.1 bjh21 LIT64( 0xC4BFFFE0001FFFFF ), 701 1.1 bjh21 LIT64( 0x96FFDFFEFFFFFFFF ), 702 1.1 bjh21 LIT64( 0x403FC000000001FE ), 703 1.1 bjh21 LIT64( 0xFFD00000000001F6 ), 704 1.1 bjh21 LIT64( 0x0640400002000000 ), 705 1.1 bjh21 LIT64( 0x479CEE1E4F789FE0 ), 706 1.1 bjh21 LIT64( 0xC237FFFFFFFFFDFE ) 707 1.1 bjh21 }; 708 1.1 bjh21 709 1.1 bjh21 static void time_a_float64_z_int32( int32 function( float64 ) ) 710 1.1 bjh21 { 711 1.1 bjh21 clock_t startClock, endClock; 712 1.1 bjh21 int32 count, i; 713 1.1 bjh21 int8 inputNum; 714 1.1 bjh21 715 1.1 bjh21 count = 0; 716 1.1 bjh21 inputNum = 0; 717 1.1 bjh21 startClock = clock(); 718 1.1 bjh21 do { 719 1.1 bjh21 for ( i = minIterations; i; --i ) { 720 1.1 bjh21 function( inputs_float64[ inputNum ] ); 721 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 722 1.1 bjh21 } 723 1.1 bjh21 count += minIterations; 724 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 725 1.1 bjh21 inputNum = 0; 726 1.1 bjh21 startClock = clock(); 727 1.1 bjh21 for ( i = count; i; --i ) { 728 1.1 bjh21 function( inputs_float64[ inputNum ] ); 729 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 730 1.1 bjh21 } 731 1.1 bjh21 endClock = clock(); 732 1.1 bjh21 reportTime( count, endClock - startClock ); 733 1.1 bjh21 734 1.1 bjh21 } 735 1.1 bjh21 736 1.1 bjh21 static void time_a_float64_z_int64( int64 function( float64 ) ) 737 1.1 bjh21 { 738 1.1 bjh21 clock_t startClock, endClock; 739 1.1 bjh21 int32 count, i; 740 1.1 bjh21 int8 inputNum; 741 1.1 bjh21 742 1.1 bjh21 count = 0; 743 1.1 bjh21 inputNum = 0; 744 1.1 bjh21 startClock = clock(); 745 1.1 bjh21 do { 746 1.1 bjh21 for ( i = minIterations; i; --i ) { 747 1.1 bjh21 function( inputs_float64[ inputNum ] ); 748 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 749 1.1 bjh21 } 750 1.1 bjh21 count += minIterations; 751 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 752 1.1 bjh21 inputNum = 0; 753 1.1 bjh21 startClock = clock(); 754 1.1 bjh21 for ( i = count; i; --i ) { 755 1.1 bjh21 function( inputs_float64[ inputNum ] ); 756 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 757 1.1 bjh21 } 758 1.1 bjh21 endClock = clock(); 759 1.1 bjh21 reportTime( count, endClock - startClock ); 760 1.1 bjh21 761 1.1 bjh21 } 762 1.1 bjh21 763 1.1 bjh21 static void time_a_float64_z_float32( float32 function( float64 ) ) 764 1.1 bjh21 { 765 1.1 bjh21 clock_t startClock, endClock; 766 1.1 bjh21 int32 count, i; 767 1.1 bjh21 int8 inputNum; 768 1.1 bjh21 769 1.1 bjh21 count = 0; 770 1.1 bjh21 inputNum = 0; 771 1.1 bjh21 startClock = clock(); 772 1.1 bjh21 do { 773 1.1 bjh21 for ( i = minIterations; i; --i ) { 774 1.1 bjh21 function( inputs_float64[ inputNum ] ); 775 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 776 1.1 bjh21 } 777 1.1 bjh21 count += minIterations; 778 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 779 1.1 bjh21 inputNum = 0; 780 1.1 bjh21 startClock = clock(); 781 1.1 bjh21 for ( i = count; i; --i ) { 782 1.1 bjh21 function( inputs_float64[ inputNum ] ); 783 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 784 1.1 bjh21 } 785 1.1 bjh21 endClock = clock(); 786 1.1 bjh21 reportTime( count, endClock - startClock ); 787 1.1 bjh21 788 1.1 bjh21 } 789 1.1 bjh21 790 1.1 bjh21 #ifdef FLOATX80 791 1.1 bjh21 792 1.1 bjh21 static void time_a_float64_z_floatx80( floatx80 function( float64 ) ) 793 1.1 bjh21 { 794 1.1 bjh21 clock_t startClock, endClock; 795 1.1 bjh21 int32 count, i; 796 1.1 bjh21 int8 inputNum; 797 1.1 bjh21 798 1.1 bjh21 count = 0; 799 1.1 bjh21 inputNum = 0; 800 1.1 bjh21 startClock = clock(); 801 1.1 bjh21 do { 802 1.1 bjh21 for ( i = minIterations; i; --i ) { 803 1.1 bjh21 function( inputs_float64[ inputNum ] ); 804 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 805 1.1 bjh21 } 806 1.1 bjh21 count += minIterations; 807 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 808 1.1 bjh21 inputNum = 0; 809 1.1 bjh21 startClock = clock(); 810 1.1 bjh21 for ( i = count; i; --i ) { 811 1.1 bjh21 function( inputs_float64[ inputNum ] ); 812 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 813 1.1 bjh21 } 814 1.1 bjh21 endClock = clock(); 815 1.1 bjh21 reportTime( count, endClock - startClock ); 816 1.1 bjh21 817 1.1 bjh21 } 818 1.1 bjh21 819 1.1 bjh21 #endif 820 1.1 bjh21 821 1.1 bjh21 #ifdef FLOAT128 822 1.1 bjh21 823 1.1 bjh21 static void time_a_float64_z_float128( float128 function( float64 ) ) 824 1.1 bjh21 { 825 1.1 bjh21 clock_t startClock, endClock; 826 1.1 bjh21 int32 count, i; 827 1.1 bjh21 int8 inputNum; 828 1.1 bjh21 829 1.1 bjh21 count = 0; 830 1.1 bjh21 inputNum = 0; 831 1.1 bjh21 startClock = clock(); 832 1.1 bjh21 do { 833 1.1 bjh21 for ( i = minIterations; i; --i ) { 834 1.1 bjh21 function( inputs_float64[ inputNum ] ); 835 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 836 1.1 bjh21 } 837 1.1 bjh21 count += minIterations; 838 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 839 1.1 bjh21 inputNum = 0; 840 1.1 bjh21 startClock = clock(); 841 1.1 bjh21 for ( i = count; i; --i ) { 842 1.1 bjh21 function( inputs_float64[ inputNum ] ); 843 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 844 1.1 bjh21 } 845 1.1 bjh21 endClock = clock(); 846 1.1 bjh21 reportTime( count, endClock - startClock ); 847 1.1 bjh21 848 1.1 bjh21 } 849 1.1 bjh21 850 1.1 bjh21 #endif 851 1.1 bjh21 852 1.1 bjh21 static void time_az_float64( float64 function( float64 ) ) 853 1.1 bjh21 { 854 1.1 bjh21 clock_t startClock, endClock; 855 1.1 bjh21 int32 count, i; 856 1.1 bjh21 int8 inputNum; 857 1.1 bjh21 858 1.1 bjh21 count = 0; 859 1.1 bjh21 inputNum = 0; 860 1.1 bjh21 startClock = clock(); 861 1.1 bjh21 do { 862 1.1 bjh21 for ( i = minIterations; i; --i ) { 863 1.1 bjh21 function( inputs_float64[ inputNum ] ); 864 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 865 1.1 bjh21 } 866 1.1 bjh21 count += minIterations; 867 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 868 1.1 bjh21 inputNum = 0; 869 1.1 bjh21 startClock = clock(); 870 1.1 bjh21 for ( i = count; i; --i ) { 871 1.1 bjh21 function( inputs_float64[ inputNum ] ); 872 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 873 1.1 bjh21 } 874 1.1 bjh21 endClock = clock(); 875 1.1 bjh21 reportTime( count, endClock - startClock ); 876 1.1 bjh21 877 1.1 bjh21 } 878 1.1 bjh21 879 1.1 bjh21 static void time_ab_float64_z_flag( flag function( float64, float64 ) ) 880 1.1 bjh21 { 881 1.1 bjh21 clock_t startClock, endClock; 882 1.1 bjh21 int32 count, i; 883 1.1 bjh21 int8 inputNumA, inputNumB; 884 1.1 bjh21 885 1.1 bjh21 count = 0; 886 1.1 bjh21 inputNumA = 0; 887 1.1 bjh21 inputNumB = 0; 888 1.1 bjh21 startClock = clock(); 889 1.1 bjh21 do { 890 1.1 bjh21 for ( i = minIterations; i; --i ) { 891 1.1 bjh21 function( 892 1.1 bjh21 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] ); 893 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 ); 894 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 895 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 ); 896 1.1 bjh21 } 897 1.1 bjh21 count += minIterations; 898 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 899 1.1 bjh21 inputNumA = 0; 900 1.1 bjh21 inputNumB = 0; 901 1.1 bjh21 startClock = clock(); 902 1.1 bjh21 for ( i = count; i; --i ) { 903 1.1 bjh21 function( 904 1.1 bjh21 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] ); 905 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 ); 906 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 907 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 ); 908 1.1 bjh21 } 909 1.1 bjh21 endClock = clock(); 910 1.1 bjh21 reportTime( count, endClock - startClock ); 911 1.1 bjh21 912 1.1 bjh21 } 913 1.1 bjh21 914 1.1 bjh21 static void time_abz_float64( float64 function( float64, float64 ) ) 915 1.1 bjh21 { 916 1.1 bjh21 clock_t startClock, endClock; 917 1.1 bjh21 int32 count, i; 918 1.1 bjh21 int8 inputNumA, inputNumB; 919 1.1 bjh21 920 1.1 bjh21 count = 0; 921 1.1 bjh21 inputNumA = 0; 922 1.1 bjh21 inputNumB = 0; 923 1.1 bjh21 startClock = clock(); 924 1.1 bjh21 do { 925 1.1 bjh21 for ( i = minIterations; i; --i ) { 926 1.1 bjh21 function( 927 1.1 bjh21 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] ); 928 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 ); 929 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 930 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 ); 931 1.1 bjh21 } 932 1.1 bjh21 count += minIterations; 933 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 934 1.1 bjh21 inputNumA = 0; 935 1.1 bjh21 inputNumB = 0; 936 1.1 bjh21 startClock = clock(); 937 1.1 bjh21 for ( i = count; i; --i ) { 938 1.1 bjh21 function( 939 1.1 bjh21 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] ); 940 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 ); 941 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 942 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 ); 943 1.1 bjh21 } 944 1.1 bjh21 endClock = clock(); 945 1.1 bjh21 reportTime( count, endClock - startClock ); 946 1.1 bjh21 947 1.1 bjh21 } 948 1.1 bjh21 949 1.1 bjh21 static const float64 inputs_float64_pos[ numInputs_float64 ] = { 950 1.1 bjh21 LIT64( 0x422FFFC008000000 ), 951 1.1 bjh21 LIT64( 0x37E0000480000000 ), 952 1.1 bjh21 LIT64( 0x73FD2546120B7935 ), 953 1.1 bjh21 LIT64( 0x3FF0000000000000 ), 954 1.1 bjh21 LIT64( 0x4E07F766F09588D6 ), 955 1.1 bjh21 LIT64( 0x0000000000000000 ), 956 1.1 bjh21 LIT64( 0x3FCE000400000000 ), 957 1.1 bjh21 LIT64( 0x0313B60F0032BED8 ), 958 1.1 bjh21 LIT64( 0x41EFFFFFC0002000 ), 959 1.1 bjh21 LIT64( 0x3FB3C75D224F2B0F ), 960 1.1 bjh21 LIT64( 0x7FD00000004000FF ), 961 1.1 bjh21 LIT64( 0x212FFF8000001FFF ), 962 1.1 bjh21 LIT64( 0x3EE0000000FE0000 ), 963 1.1 bjh21 LIT64( 0x0010000080000004 ), 964 1.1 bjh21 LIT64( 0x41CFFFFE00000020 ), 965 1.1 bjh21 LIT64( 0x40303FFFFFFFFFFD ), 966 1.1 bjh21 LIT64( 0x3FD000003FEFFFFF ), 967 1.1 bjh21 LIT64( 0x3FD0000010000000 ), 968 1.1 bjh21 LIT64( 0x37FC6B5C16CA55CF ), 969 1.1 bjh21 LIT64( 0x413EEB940B9D1301 ), 970 1.1 bjh21 LIT64( 0x47E00200001FFFFF ), 971 1.1 bjh21 LIT64( 0x47F00021FFFFFFFE ), 972 1.1 bjh21 LIT64( 0x3FFFFFFFF80000FF ), 973 1.1 bjh21 LIT64( 0x407FFFFFE00FFFFF ), 974 1.1 bjh21 LIT64( 0x001497A63740C5E8 ), 975 1.1 bjh21 LIT64( 0x44BFFFE0001FFFFF ), 976 1.1 bjh21 LIT64( 0x16FFDFFEFFFFFFFF ), 977 1.1 bjh21 LIT64( 0x403FC000000001FE ), 978 1.1 bjh21 LIT64( 0x7FD00000000001F6 ), 979 1.1 bjh21 LIT64( 0x0640400002000000 ), 980 1.1 bjh21 LIT64( 0x479CEE1E4F789FE0 ), 981 1.1 bjh21 LIT64( 0x4237FFFFFFFFFDFE ) 982 1.1 bjh21 }; 983 1.1 bjh21 984 1.1 bjh21 static void time_az_float64_pos( float64 function( float64 ) ) 985 1.1 bjh21 { 986 1.1 bjh21 clock_t startClock, endClock; 987 1.1 bjh21 int32 count, i; 988 1.1 bjh21 int8 inputNum; 989 1.1 bjh21 990 1.1 bjh21 count = 0; 991 1.1 bjh21 inputNum = 0; 992 1.1 bjh21 startClock = clock(); 993 1.1 bjh21 do { 994 1.1 bjh21 for ( i = minIterations; i; --i ) { 995 1.1 bjh21 function( inputs_float64_pos[ inputNum ] ); 996 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 997 1.1 bjh21 } 998 1.1 bjh21 count += minIterations; 999 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1000 1.1 bjh21 inputNum = 0; 1001 1.1 bjh21 startClock = clock(); 1002 1.1 bjh21 for ( i = count; i; --i ) { 1003 1.1 bjh21 function( inputs_float64_pos[ inputNum ] ); 1004 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 ); 1005 1.1 bjh21 } 1006 1.1 bjh21 endClock = clock(); 1007 1.1 bjh21 reportTime( count, endClock - startClock ); 1008 1.1 bjh21 1009 1.1 bjh21 } 1010 1.1 bjh21 1011 1.1 bjh21 #ifdef FLOATX80 1012 1.1 bjh21 1013 1.1 bjh21 enum { 1014 1.1 bjh21 numInputs_floatx80 = 32 1015 1.1 bjh21 }; 1016 1.1 bjh21 1017 1.1 bjh21 static const struct { 1018 1.1 bjh21 bits16 high; 1019 1.1 bjh21 bits64 low; 1020 1.1 bjh21 } inputs_floatx80[ numInputs_floatx80 ] = { 1021 1.1 bjh21 { 0xC03F, LIT64( 0xA9BE15A19C1E8B62 ) }, 1022 1.1 bjh21 { 0x8000, LIT64( 0x0000000000000000 ) }, 1023 1.1 bjh21 { 0x75A8, LIT64( 0xE59591E4788957A5 ) }, 1024 1.1 bjh21 { 0xBFFF, LIT64( 0xFFF0000000000040 ) }, 1025 1.1 bjh21 { 0x0CD8, LIT64( 0xFC000000000007FE ) }, 1026 1.1 bjh21 { 0x43BA, LIT64( 0x99A4000000000000 ) }, 1027 1.1 bjh21 { 0x3FFF, LIT64( 0x8000000000000000 ) }, 1028 1.1 bjh21 { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) }, 1029 1.1 bjh21 { 0x403E, LIT64( 0xFFF0000000002000 ) }, 1030 1.1 bjh21 { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) }, 1031 1.1 bjh21 { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) }, 1032 1.1 bjh21 { 0x737A, LIT64( 0x800000007FFDFFFE ) }, 1033 1.1 bjh21 { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) }, 1034 1.1 bjh21 { 0xBBFE, LIT64( 0x8000040000001FFE ) }, 1035 1.1 bjh21 { 0xC002, LIT64( 0xFF80000000000020 ) }, 1036 1.1 bjh21 { 0xDE8D, LIT64( 0xFFFFFFFFFFE00004 ) }, 1037 1.1 bjh21 { 0xC004, LIT64( 0x8000000000003FFB ) }, 1038 1.1 bjh21 { 0x407F, LIT64( 0x800000000003FFFE ) }, 1039 1.1 bjh21 { 0xC000, LIT64( 0xA459EE6A5C16CA55 ) }, 1040 1.1 bjh21 { 0x8003, LIT64( 0xC42CBF7399AEEB94 ) }, 1041 1.1 bjh21 { 0xBF7F, LIT64( 0xF800000000000006 ) }, 1042 1.1 bjh21 { 0xC07F, LIT64( 0xBF56BE8871F28FEA ) }, 1043 1.1 bjh21 { 0xC07E, LIT64( 0xFFFF77FFFFFFFFFE ) }, 1044 1.1 bjh21 { 0xADC9, LIT64( 0x8000000FFFFFFFDE ) }, 1045 1.1 bjh21 { 0xC001, LIT64( 0xEFF7FFFFFFFFFFFF ) }, 1046 1.1 bjh21 { 0x4001, LIT64( 0xBE84F30125C497A6 ) }, 1047 1.1 bjh21 { 0xC06B, LIT64( 0xEFFFFFFFFFFFFFFF ) }, 1048 1.1 bjh21 { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) }, 1049 1.1 bjh21 { 0x87E9, LIT64( 0x81FFFFFFFFFFFBFF ) }, 1050 1.1 bjh21 { 0xA63F, LIT64( 0x801FFFFFFEFFFFFE ) }, 1051 1.1 bjh21 { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) }, 1052 1.1 bjh21 { 0x4018, LIT64( 0x8000000000080003 ) } 1053 1.1 bjh21 }; 1054 1.1 bjh21 1055 1.1 bjh21 static void time_a_floatx80_z_int32( int32 function( floatx80 ) ) 1056 1.1 bjh21 { 1057 1.1 bjh21 clock_t startClock, endClock; 1058 1.1 bjh21 int32 count, i; 1059 1.1 bjh21 int8 inputNum; 1060 1.1 bjh21 floatx80 a; 1061 1.1 bjh21 1062 1.1 bjh21 count = 0; 1063 1.1 bjh21 inputNum = 0; 1064 1.1 bjh21 startClock = clock(); 1065 1.1 bjh21 do { 1066 1.1 bjh21 for ( i = minIterations; i; --i ) { 1067 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1068 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1069 1.1 bjh21 function( a ); 1070 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1071 1.1 bjh21 } 1072 1.1 bjh21 count += minIterations; 1073 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1074 1.1 bjh21 inputNum = 0; 1075 1.1 bjh21 startClock = clock(); 1076 1.1 bjh21 for ( i = count; i; --i ) { 1077 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1078 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1079 1.1 bjh21 function( a ); 1080 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1081 1.1 bjh21 } 1082 1.1 bjh21 endClock = clock(); 1083 1.1 bjh21 reportTime( count, endClock - startClock ); 1084 1.1 bjh21 1085 1.1 bjh21 } 1086 1.1 bjh21 1087 1.1 bjh21 static void time_a_floatx80_z_int64( int64 function( floatx80 ) ) 1088 1.1 bjh21 { 1089 1.1 bjh21 clock_t startClock, endClock; 1090 1.1 bjh21 int32 count, i; 1091 1.1 bjh21 int8 inputNum; 1092 1.1 bjh21 floatx80 a; 1093 1.1 bjh21 1094 1.1 bjh21 count = 0; 1095 1.1 bjh21 inputNum = 0; 1096 1.1 bjh21 startClock = clock(); 1097 1.1 bjh21 do { 1098 1.1 bjh21 for ( i = minIterations; i; --i ) { 1099 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1100 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1101 1.1 bjh21 function( a ); 1102 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1103 1.1 bjh21 } 1104 1.1 bjh21 count += minIterations; 1105 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1106 1.1 bjh21 inputNum = 0; 1107 1.1 bjh21 startClock = clock(); 1108 1.1 bjh21 for ( i = count; i; --i ) { 1109 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1110 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1111 1.1 bjh21 function( a ); 1112 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1113 1.1 bjh21 } 1114 1.1 bjh21 endClock = clock(); 1115 1.1 bjh21 reportTime( count, endClock - startClock ); 1116 1.1 bjh21 1117 1.1 bjh21 } 1118 1.1 bjh21 1119 1.1 bjh21 static void time_a_floatx80_z_float32( float32 function( floatx80 ) ) 1120 1.1 bjh21 { 1121 1.1 bjh21 clock_t startClock, endClock; 1122 1.1 bjh21 int32 count, i; 1123 1.1 bjh21 int8 inputNum; 1124 1.1 bjh21 floatx80 a; 1125 1.1 bjh21 1126 1.1 bjh21 count = 0; 1127 1.1 bjh21 inputNum = 0; 1128 1.1 bjh21 startClock = clock(); 1129 1.1 bjh21 do { 1130 1.1 bjh21 for ( i = minIterations; i; --i ) { 1131 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1132 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1133 1.1 bjh21 function( a ); 1134 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1135 1.1 bjh21 } 1136 1.1 bjh21 count += minIterations; 1137 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1138 1.1 bjh21 inputNum = 0; 1139 1.1 bjh21 startClock = clock(); 1140 1.1 bjh21 for ( i = count; i; --i ) { 1141 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1142 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1143 1.1 bjh21 function( a ); 1144 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1145 1.1 bjh21 } 1146 1.1 bjh21 endClock = clock(); 1147 1.1 bjh21 reportTime( count, endClock - startClock ); 1148 1.1 bjh21 1149 1.1 bjh21 } 1150 1.1 bjh21 1151 1.1 bjh21 static void time_a_floatx80_z_float64( float64 function( floatx80 ) ) 1152 1.1 bjh21 { 1153 1.1 bjh21 clock_t startClock, endClock; 1154 1.1 bjh21 int32 count, i; 1155 1.1 bjh21 int8 inputNum; 1156 1.1 bjh21 floatx80 a; 1157 1.1 bjh21 1158 1.1 bjh21 count = 0; 1159 1.1 bjh21 inputNum = 0; 1160 1.1 bjh21 startClock = clock(); 1161 1.1 bjh21 do { 1162 1.1 bjh21 for ( i = minIterations; i; --i ) { 1163 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1164 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1165 1.1 bjh21 function( a ); 1166 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1167 1.1 bjh21 } 1168 1.1 bjh21 count += minIterations; 1169 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1170 1.1 bjh21 inputNum = 0; 1171 1.1 bjh21 startClock = clock(); 1172 1.1 bjh21 for ( i = count; i; --i ) { 1173 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1174 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1175 1.1 bjh21 function( a ); 1176 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1177 1.1 bjh21 } 1178 1.1 bjh21 endClock = clock(); 1179 1.1 bjh21 reportTime( count, endClock - startClock ); 1180 1.1 bjh21 1181 1.1 bjh21 } 1182 1.1 bjh21 1183 1.1 bjh21 #ifdef FLOAT128 1184 1.1 bjh21 1185 1.1 bjh21 static void time_a_floatx80_z_float128( float128 function( floatx80 ) ) 1186 1.1 bjh21 { 1187 1.1 bjh21 clock_t startClock, endClock; 1188 1.1 bjh21 int32 count, i; 1189 1.1 bjh21 int8 inputNum; 1190 1.1 bjh21 floatx80 a; 1191 1.1 bjh21 1192 1.1 bjh21 count = 0; 1193 1.1 bjh21 inputNum = 0; 1194 1.1 bjh21 startClock = clock(); 1195 1.1 bjh21 do { 1196 1.1 bjh21 for ( i = minIterations; i; --i ) { 1197 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1198 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1199 1.1 bjh21 function( a ); 1200 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1201 1.1 bjh21 } 1202 1.1 bjh21 count += minIterations; 1203 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1204 1.1 bjh21 inputNum = 0; 1205 1.1 bjh21 startClock = clock(); 1206 1.1 bjh21 for ( i = count; i; --i ) { 1207 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1208 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1209 1.1 bjh21 function( a ); 1210 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1211 1.1 bjh21 } 1212 1.1 bjh21 endClock = clock(); 1213 1.1 bjh21 reportTime( count, endClock - startClock ); 1214 1.1 bjh21 1215 1.1 bjh21 } 1216 1.1 bjh21 1217 1.1 bjh21 #endif 1218 1.1 bjh21 1219 1.1 bjh21 static void time_az_floatx80( floatx80 function( floatx80 ) ) 1220 1.1 bjh21 { 1221 1.1 bjh21 clock_t startClock, endClock; 1222 1.1 bjh21 int32 count, i; 1223 1.1 bjh21 int8 inputNum; 1224 1.1 bjh21 floatx80 a; 1225 1.1 bjh21 1226 1.1 bjh21 count = 0; 1227 1.1 bjh21 inputNum = 0; 1228 1.1 bjh21 startClock = clock(); 1229 1.1 bjh21 do { 1230 1.1 bjh21 for ( i = minIterations; i; --i ) { 1231 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1232 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1233 1.1 bjh21 function( a ); 1234 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1235 1.1 bjh21 } 1236 1.1 bjh21 count += minIterations; 1237 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1238 1.1 bjh21 inputNum = 0; 1239 1.1 bjh21 startClock = clock(); 1240 1.1 bjh21 for ( i = count; i; --i ) { 1241 1.1 bjh21 a.low = inputs_floatx80[ inputNum ].low; 1242 1.1 bjh21 a.high = inputs_floatx80[ inputNum ].high; 1243 1.1 bjh21 function( a ); 1244 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1245 1.1 bjh21 } 1246 1.1 bjh21 endClock = clock(); 1247 1.1 bjh21 reportTime( count, endClock - startClock ); 1248 1.1 bjh21 1249 1.1 bjh21 } 1250 1.1 bjh21 1251 1.1 bjh21 static void time_ab_floatx80_z_flag( flag function( floatx80, floatx80 ) ) 1252 1.1 bjh21 { 1253 1.1 bjh21 clock_t startClock, endClock; 1254 1.1 bjh21 int32 count, i; 1255 1.1 bjh21 int8 inputNumA, inputNumB; 1256 1.1 bjh21 floatx80 a, b; 1257 1.1 bjh21 1258 1.1 bjh21 count = 0; 1259 1.1 bjh21 inputNumA = 0; 1260 1.1 bjh21 inputNumB = 0; 1261 1.1 bjh21 startClock = clock(); 1262 1.1 bjh21 do { 1263 1.1 bjh21 for ( i = minIterations; i; --i ) { 1264 1.1 bjh21 a.low = inputs_floatx80[ inputNumA ].low; 1265 1.1 bjh21 a.high = inputs_floatx80[ inputNumA ].high; 1266 1.1 bjh21 b.low = inputs_floatx80[ inputNumB ].low; 1267 1.1 bjh21 b.high = inputs_floatx80[ inputNumB ].high; 1268 1.1 bjh21 function( a, b ); 1269 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 ); 1270 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1271 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 ); 1272 1.1 bjh21 } 1273 1.1 bjh21 count += minIterations; 1274 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1275 1.1 bjh21 inputNumA = 0; 1276 1.1 bjh21 inputNumB = 0; 1277 1.1 bjh21 startClock = clock(); 1278 1.1 bjh21 for ( i = count; i; --i ) { 1279 1.1 bjh21 a.low = inputs_floatx80[ inputNumA ].low; 1280 1.1 bjh21 a.high = inputs_floatx80[ inputNumA ].high; 1281 1.1 bjh21 b.low = inputs_floatx80[ inputNumB ].low; 1282 1.1 bjh21 b.high = inputs_floatx80[ inputNumB ].high; 1283 1.1 bjh21 function( a, b ); 1284 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 ); 1285 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1286 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 ); 1287 1.1 bjh21 } 1288 1.1 bjh21 endClock = clock(); 1289 1.1 bjh21 reportTime( count, endClock - startClock ); 1290 1.1 bjh21 1291 1.1 bjh21 } 1292 1.1 bjh21 1293 1.1 bjh21 static void time_abz_floatx80( floatx80 function( floatx80, floatx80 ) ) 1294 1.1 bjh21 { 1295 1.1 bjh21 clock_t startClock, endClock; 1296 1.1 bjh21 int32 count, i; 1297 1.1 bjh21 int8 inputNumA, inputNumB; 1298 1.1 bjh21 floatx80 a, b; 1299 1.1 bjh21 1300 1.1 bjh21 count = 0; 1301 1.1 bjh21 inputNumA = 0; 1302 1.1 bjh21 inputNumB = 0; 1303 1.1 bjh21 startClock = clock(); 1304 1.1 bjh21 do { 1305 1.1 bjh21 for ( i = minIterations; i; --i ) { 1306 1.1 bjh21 a.low = inputs_floatx80[ inputNumA ].low; 1307 1.1 bjh21 a.high = inputs_floatx80[ inputNumA ].high; 1308 1.1 bjh21 b.low = inputs_floatx80[ inputNumB ].low; 1309 1.1 bjh21 b.high = inputs_floatx80[ inputNumB ].high; 1310 1.1 bjh21 function( a, b ); 1311 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 ); 1312 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1313 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 ); 1314 1.1 bjh21 } 1315 1.1 bjh21 count += minIterations; 1316 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1317 1.1 bjh21 inputNumA = 0; 1318 1.1 bjh21 inputNumB = 0; 1319 1.1 bjh21 startClock = clock(); 1320 1.1 bjh21 for ( i = count; i; --i ) { 1321 1.1 bjh21 a.low = inputs_floatx80[ inputNumA ].low; 1322 1.1 bjh21 a.high = inputs_floatx80[ inputNumA ].high; 1323 1.1 bjh21 b.low = inputs_floatx80[ inputNumB ].low; 1324 1.1 bjh21 b.high = inputs_floatx80[ inputNumB ].high; 1325 1.1 bjh21 function( a, b ); 1326 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 ); 1327 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1328 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 ); 1329 1.1 bjh21 } 1330 1.1 bjh21 endClock = clock(); 1331 1.1 bjh21 reportTime( count, endClock - startClock ); 1332 1.1 bjh21 1333 1.1 bjh21 } 1334 1.1 bjh21 1335 1.1 bjh21 static const struct { 1336 1.1 bjh21 bits16 high; 1337 1.1 bjh21 bits64 low; 1338 1.1 bjh21 } inputs_floatx80_pos[ numInputs_floatx80 ] = { 1339 1.1 bjh21 { 0x403F, LIT64( 0xA9BE15A19C1E8B62 ) }, 1340 1.1 bjh21 { 0x0000, LIT64( 0x0000000000000000 ) }, 1341 1.1 bjh21 { 0x75A8, LIT64( 0xE59591E4788957A5 ) }, 1342 1.1 bjh21 { 0x3FFF, LIT64( 0xFFF0000000000040 ) }, 1343 1.1 bjh21 { 0x0CD8, LIT64( 0xFC000000000007FE ) }, 1344 1.1 bjh21 { 0x43BA, LIT64( 0x99A4000000000000 ) }, 1345 1.1 bjh21 { 0x3FFF, LIT64( 0x8000000000000000 ) }, 1346 1.1 bjh21 { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) }, 1347 1.1 bjh21 { 0x403E, LIT64( 0xFFF0000000002000 ) }, 1348 1.1 bjh21 { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) }, 1349 1.1 bjh21 { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) }, 1350 1.1 bjh21 { 0x737A, LIT64( 0x800000007FFDFFFE ) }, 1351 1.1 bjh21 { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) }, 1352 1.1 bjh21 { 0x3BFE, LIT64( 0x8000040000001FFE ) }, 1353 1.1 bjh21 { 0x4002, LIT64( 0xFF80000000000020 ) }, 1354 1.1 bjh21 { 0x5E8D, LIT64( 0xFFFFFFFFFFE00004 ) }, 1355 1.1 bjh21 { 0x4004, LIT64( 0x8000000000003FFB ) }, 1356 1.1 bjh21 { 0x407F, LIT64( 0x800000000003FFFE ) }, 1357 1.1 bjh21 { 0x4000, LIT64( 0xA459EE6A5C16CA55 ) }, 1358 1.1 bjh21 { 0x0003, LIT64( 0xC42CBF7399AEEB94 ) }, 1359 1.1 bjh21 { 0x3F7F, LIT64( 0xF800000000000006 ) }, 1360 1.1 bjh21 { 0x407F, LIT64( 0xBF56BE8871F28FEA ) }, 1361 1.1 bjh21 { 0x407E, LIT64( 0xFFFF77FFFFFFFFFE ) }, 1362 1.1 bjh21 { 0x2DC9, LIT64( 0x8000000FFFFFFFDE ) }, 1363 1.1 bjh21 { 0x4001, LIT64( 0xEFF7FFFFFFFFFFFF ) }, 1364 1.1 bjh21 { 0x4001, LIT64( 0xBE84F30125C497A6 ) }, 1365 1.1 bjh21 { 0x406B, LIT64( 0xEFFFFFFFFFFFFFFF ) }, 1366 1.1 bjh21 { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) }, 1367 1.1 bjh21 { 0x07E9, LIT64( 0x81FFFFFFFFFFFBFF ) }, 1368 1.1 bjh21 { 0x263F, LIT64( 0x801FFFFFFEFFFFFE ) }, 1369 1.1 bjh21 { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) }, 1370 1.1 bjh21 { 0x4018, LIT64( 0x8000000000080003 ) } 1371 1.1 bjh21 }; 1372 1.1 bjh21 1373 1.1 bjh21 static void time_az_floatx80_pos( floatx80 function( floatx80 ) ) 1374 1.1 bjh21 { 1375 1.1 bjh21 clock_t startClock, endClock; 1376 1.1 bjh21 int32 count, i; 1377 1.1 bjh21 int8 inputNum; 1378 1.1 bjh21 floatx80 a; 1379 1.1 bjh21 1380 1.1 bjh21 count = 0; 1381 1.1 bjh21 inputNum = 0; 1382 1.1 bjh21 startClock = clock(); 1383 1.1 bjh21 do { 1384 1.1 bjh21 for ( i = minIterations; i; --i ) { 1385 1.1 bjh21 a.low = inputs_floatx80_pos[ inputNum ].low; 1386 1.1 bjh21 a.high = inputs_floatx80_pos[ inputNum ].high; 1387 1.1 bjh21 function( a ); 1388 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1389 1.1 bjh21 } 1390 1.1 bjh21 count += minIterations; 1391 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1392 1.1 bjh21 inputNum = 0; 1393 1.1 bjh21 startClock = clock(); 1394 1.1 bjh21 for ( i = count; i; --i ) { 1395 1.1 bjh21 a.low = inputs_floatx80_pos[ inputNum ].low; 1396 1.1 bjh21 a.high = inputs_floatx80_pos[ inputNum ].high; 1397 1.1 bjh21 function( a ); 1398 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 ); 1399 1.1 bjh21 } 1400 1.1 bjh21 endClock = clock(); 1401 1.1 bjh21 reportTime( count, endClock - startClock ); 1402 1.1 bjh21 1403 1.1 bjh21 } 1404 1.1 bjh21 1405 1.1 bjh21 #endif 1406 1.1 bjh21 1407 1.1 bjh21 #ifdef FLOAT128 1408 1.1 bjh21 1409 1.1 bjh21 enum { 1410 1.1 bjh21 numInputs_float128 = 32 1411 1.1 bjh21 }; 1412 1.1 bjh21 1413 1.1 bjh21 static const struct { 1414 1.1 bjh21 bits64 high, low; 1415 1.1 bjh21 } inputs_float128[ numInputs_float128 ] = { 1416 1.1 bjh21 { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) }, 1417 1.1 bjh21 { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) }, 1418 1.1 bjh21 { LIT64( 0x85F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) }, 1419 1.1 bjh21 { LIT64( 0xF2B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) }, 1420 1.1 bjh21 { LIT64( 0x8000000000000000 ), LIT64( 0x0000000000000000 ) }, 1421 1.1 bjh21 { LIT64( 0xBFFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) }, 1422 1.1 bjh21 { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) }, 1423 1.1 bjh21 { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) }, 1424 1.1 bjh21 { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) }, 1425 1.1 bjh21 { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) }, 1426 1.1 bjh21 { LIT64( 0xBF7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) }, 1427 1.1 bjh21 { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) }, 1428 1.1 bjh21 { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) }, 1429 1.1 bjh21 { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) }, 1430 1.1 bjh21 { LIT64( 0xBFFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) }, 1431 1.1 bjh21 { LIT64( 0xBDB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) }, 1432 1.1 bjh21 { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) }, 1433 1.1 bjh21 { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) }, 1434 1.1 bjh21 { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) }, 1435 1.1 bjh21 { LIT64( 0x8001000000000000 ), LIT64( 0x0000001000000001 ) }, 1436 1.1 bjh21 { LIT64( 0xC036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) }, 1437 1.1 bjh21 { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) }, 1438 1.1 bjh21 { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) }, 1439 1.1 bjh21 { LIT64( 0xBFFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) }, 1440 1.1 bjh21 { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) }, 1441 1.1 bjh21 { LIT64( 0xB5CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) }, 1442 1.1 bjh21 { LIT64( 0xE228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) }, 1443 1.1 bjh21 { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) }, 1444 1.1 bjh21 { LIT64( 0xC1AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) }, 1445 1.1 bjh21 { LIT64( 0xC96F000000000000 ), LIT64( 0x00000001FFFBFFFF ) }, 1446 1.1 bjh21 { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) }, 1447 1.1 bjh21 { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) } 1448 1.1 bjh21 }; 1449 1.1 bjh21 1450 1.1 bjh21 static void time_a_float128_z_int32( int32 function( float128 ) ) 1451 1.1 bjh21 { 1452 1.1 bjh21 clock_t startClock, endClock; 1453 1.1 bjh21 int32 count, i; 1454 1.1 bjh21 int8 inputNum; 1455 1.1 bjh21 float128 a; 1456 1.1 bjh21 1457 1.1 bjh21 count = 0; 1458 1.1 bjh21 inputNum = 0; 1459 1.1 bjh21 startClock = clock(); 1460 1.1 bjh21 do { 1461 1.1 bjh21 for ( i = minIterations; i; --i ) { 1462 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1463 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1464 1.1 bjh21 function( a ); 1465 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1466 1.1 bjh21 } 1467 1.1 bjh21 count += minIterations; 1468 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1469 1.1 bjh21 inputNum = 0; 1470 1.1 bjh21 startClock = clock(); 1471 1.1 bjh21 for ( i = count; i; --i ) { 1472 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1473 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1474 1.1 bjh21 function( a ); 1475 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1476 1.1 bjh21 } 1477 1.1 bjh21 endClock = clock(); 1478 1.1 bjh21 reportTime( count, endClock - startClock ); 1479 1.1 bjh21 1480 1.1 bjh21 } 1481 1.1 bjh21 1482 1.1 bjh21 static void time_a_float128_z_int64( int64 function( float128 ) ) 1483 1.1 bjh21 { 1484 1.1 bjh21 clock_t startClock, endClock; 1485 1.1 bjh21 int32 count, i; 1486 1.1 bjh21 int8 inputNum; 1487 1.1 bjh21 float128 a; 1488 1.1 bjh21 1489 1.1 bjh21 count = 0; 1490 1.1 bjh21 inputNum = 0; 1491 1.1 bjh21 startClock = clock(); 1492 1.1 bjh21 do { 1493 1.1 bjh21 for ( i = minIterations; i; --i ) { 1494 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1495 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1496 1.1 bjh21 function( a ); 1497 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1498 1.1 bjh21 } 1499 1.1 bjh21 count += minIterations; 1500 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1501 1.1 bjh21 inputNum = 0; 1502 1.1 bjh21 startClock = clock(); 1503 1.1 bjh21 for ( i = count; i; --i ) { 1504 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1505 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1506 1.1 bjh21 function( a ); 1507 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1508 1.1 bjh21 } 1509 1.1 bjh21 endClock = clock(); 1510 1.1 bjh21 reportTime( count, endClock - startClock ); 1511 1.1 bjh21 1512 1.1 bjh21 } 1513 1.1 bjh21 1514 1.1 bjh21 static void time_a_float128_z_float32( float32 function( float128 ) ) 1515 1.1 bjh21 { 1516 1.1 bjh21 clock_t startClock, endClock; 1517 1.1 bjh21 int32 count, i; 1518 1.1 bjh21 int8 inputNum; 1519 1.1 bjh21 float128 a; 1520 1.1 bjh21 1521 1.1 bjh21 count = 0; 1522 1.1 bjh21 inputNum = 0; 1523 1.1 bjh21 startClock = clock(); 1524 1.1 bjh21 do { 1525 1.1 bjh21 for ( i = minIterations; i; --i ) { 1526 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1527 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1528 1.1 bjh21 function( a ); 1529 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1530 1.1 bjh21 } 1531 1.1 bjh21 count += minIterations; 1532 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1533 1.1 bjh21 inputNum = 0; 1534 1.1 bjh21 startClock = clock(); 1535 1.1 bjh21 for ( i = count; i; --i ) { 1536 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1537 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1538 1.1 bjh21 function( a ); 1539 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1540 1.1 bjh21 } 1541 1.1 bjh21 endClock = clock(); 1542 1.1 bjh21 reportTime( count, endClock - startClock ); 1543 1.1 bjh21 1544 1.1 bjh21 } 1545 1.1 bjh21 1546 1.1 bjh21 static void time_a_float128_z_float64( float64 function( float128 ) ) 1547 1.1 bjh21 { 1548 1.1 bjh21 clock_t startClock, endClock; 1549 1.1 bjh21 int32 count, i; 1550 1.1 bjh21 int8 inputNum; 1551 1.1 bjh21 float128 a; 1552 1.1 bjh21 1553 1.1 bjh21 count = 0; 1554 1.1 bjh21 inputNum = 0; 1555 1.1 bjh21 startClock = clock(); 1556 1.1 bjh21 do { 1557 1.1 bjh21 for ( i = minIterations; i; --i ) { 1558 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1559 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1560 1.1 bjh21 function( a ); 1561 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1562 1.1 bjh21 } 1563 1.1 bjh21 count += minIterations; 1564 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1565 1.1 bjh21 inputNum = 0; 1566 1.1 bjh21 startClock = clock(); 1567 1.1 bjh21 for ( i = count; i; --i ) { 1568 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1569 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1570 1.1 bjh21 function( a ); 1571 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1572 1.1 bjh21 } 1573 1.1 bjh21 endClock = clock(); 1574 1.1 bjh21 reportTime( count, endClock - startClock ); 1575 1.1 bjh21 1576 1.1 bjh21 } 1577 1.1 bjh21 1578 1.1 bjh21 #ifdef FLOATX80 1579 1.1 bjh21 1580 1.1 bjh21 static void time_a_float128_z_floatx80( floatx80 function( float128 ) ) 1581 1.1 bjh21 { 1582 1.1 bjh21 clock_t startClock, endClock; 1583 1.1 bjh21 int32 count, i; 1584 1.1 bjh21 int8 inputNum; 1585 1.1 bjh21 float128 a; 1586 1.1 bjh21 1587 1.1 bjh21 count = 0; 1588 1.1 bjh21 inputNum = 0; 1589 1.1 bjh21 startClock = clock(); 1590 1.1 bjh21 do { 1591 1.1 bjh21 for ( i = minIterations; i; --i ) { 1592 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1593 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1594 1.1 bjh21 function( a ); 1595 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1596 1.1 bjh21 } 1597 1.1 bjh21 count += minIterations; 1598 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1599 1.1 bjh21 inputNum = 0; 1600 1.1 bjh21 startClock = clock(); 1601 1.1 bjh21 for ( i = count; i; --i ) { 1602 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1603 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1604 1.1 bjh21 function( a ); 1605 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1606 1.1 bjh21 } 1607 1.1 bjh21 endClock = clock(); 1608 1.1 bjh21 reportTime( count, endClock - startClock ); 1609 1.1 bjh21 1610 1.1 bjh21 } 1611 1.1 bjh21 1612 1.1 bjh21 #endif 1613 1.1 bjh21 1614 1.1 bjh21 static void time_az_float128( float128 function( float128 ) ) 1615 1.1 bjh21 { 1616 1.1 bjh21 clock_t startClock, endClock; 1617 1.1 bjh21 int32 count, i; 1618 1.1 bjh21 int8 inputNum; 1619 1.1 bjh21 float128 a; 1620 1.1 bjh21 1621 1.1 bjh21 count = 0; 1622 1.1 bjh21 inputNum = 0; 1623 1.1 bjh21 startClock = clock(); 1624 1.1 bjh21 do { 1625 1.1 bjh21 for ( i = minIterations; i; --i ) { 1626 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1627 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1628 1.1 bjh21 function( a ); 1629 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1630 1.1 bjh21 } 1631 1.1 bjh21 count += minIterations; 1632 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1633 1.1 bjh21 inputNum = 0; 1634 1.1 bjh21 startClock = clock(); 1635 1.1 bjh21 for ( i = count; i; --i ) { 1636 1.1 bjh21 a.low = inputs_float128[ inputNum ].low; 1637 1.1 bjh21 a.high = inputs_float128[ inputNum ].high; 1638 1.1 bjh21 function( a ); 1639 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1640 1.1 bjh21 } 1641 1.1 bjh21 endClock = clock(); 1642 1.1 bjh21 reportTime( count, endClock - startClock ); 1643 1.1 bjh21 1644 1.1 bjh21 } 1645 1.1 bjh21 1646 1.1 bjh21 static void time_ab_float128_z_flag( flag function( float128, float128 ) ) 1647 1.1 bjh21 { 1648 1.1 bjh21 clock_t startClock, endClock; 1649 1.1 bjh21 int32 count, i; 1650 1.1 bjh21 int8 inputNumA, inputNumB; 1651 1.1 bjh21 float128 a, b; 1652 1.1 bjh21 1653 1.1 bjh21 count = 0; 1654 1.1 bjh21 inputNumA = 0; 1655 1.1 bjh21 inputNumB = 0; 1656 1.1 bjh21 startClock = clock(); 1657 1.1 bjh21 do { 1658 1.1 bjh21 for ( i = minIterations; i; --i ) { 1659 1.1 bjh21 a.low = inputs_float128[ inputNumA ].low; 1660 1.1 bjh21 a.high = inputs_float128[ inputNumA ].high; 1661 1.1 bjh21 b.low = inputs_float128[ inputNumB ].low; 1662 1.1 bjh21 b.high = inputs_float128[ inputNumB ].high; 1663 1.1 bjh21 function( a, b ); 1664 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 ); 1665 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1666 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 ); 1667 1.1 bjh21 } 1668 1.1 bjh21 count += minIterations; 1669 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1670 1.1 bjh21 inputNumA = 0; 1671 1.1 bjh21 inputNumB = 0; 1672 1.1 bjh21 startClock = clock(); 1673 1.1 bjh21 for ( i = count; i; --i ) { 1674 1.1 bjh21 a.low = inputs_float128[ inputNumA ].low; 1675 1.1 bjh21 a.high = inputs_float128[ inputNumA ].high; 1676 1.1 bjh21 b.low = inputs_float128[ inputNumB ].low; 1677 1.1 bjh21 b.high = inputs_float128[ inputNumB ].high; 1678 1.1 bjh21 function( a, b ); 1679 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 ); 1680 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1681 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 ); 1682 1.1 bjh21 } 1683 1.1 bjh21 endClock = clock(); 1684 1.1 bjh21 reportTime( count, endClock - startClock ); 1685 1.1 bjh21 1686 1.1 bjh21 } 1687 1.1 bjh21 1688 1.1 bjh21 static void time_abz_float128( float128 function( float128, float128 ) ) 1689 1.1 bjh21 { 1690 1.1 bjh21 clock_t startClock, endClock; 1691 1.1 bjh21 int32 count, i; 1692 1.1 bjh21 int8 inputNumA, inputNumB; 1693 1.1 bjh21 float128 a, b; 1694 1.1 bjh21 1695 1.1 bjh21 count = 0; 1696 1.1 bjh21 inputNumA = 0; 1697 1.1 bjh21 inputNumB = 0; 1698 1.1 bjh21 startClock = clock(); 1699 1.1 bjh21 do { 1700 1.1 bjh21 for ( i = minIterations; i; --i ) { 1701 1.1 bjh21 a.low = inputs_float128[ inputNumA ].low; 1702 1.1 bjh21 a.high = inputs_float128[ inputNumA ].high; 1703 1.1 bjh21 b.low = inputs_float128[ inputNumB ].low; 1704 1.1 bjh21 b.high = inputs_float128[ inputNumB ].high; 1705 1.1 bjh21 function( a, b ); 1706 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 ); 1707 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1708 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 ); 1709 1.1 bjh21 } 1710 1.1 bjh21 count += minIterations; 1711 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1712 1.1 bjh21 inputNumA = 0; 1713 1.1 bjh21 inputNumB = 0; 1714 1.1 bjh21 startClock = clock(); 1715 1.1 bjh21 for ( i = count; i; --i ) { 1716 1.1 bjh21 a.low = inputs_float128[ inputNumA ].low; 1717 1.1 bjh21 a.high = inputs_float128[ inputNumA ].high; 1718 1.1 bjh21 b.low = inputs_float128[ inputNumB ].low; 1719 1.1 bjh21 b.high = inputs_float128[ inputNumB ].high; 1720 1.1 bjh21 function( a, b ); 1721 1.1 bjh21 inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 ); 1722 1.1 bjh21 if ( inputNumA == 0 ) ++inputNumB; 1723 1.1 bjh21 inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 ); 1724 1.1 bjh21 } 1725 1.1 bjh21 endClock = clock(); 1726 1.1 bjh21 reportTime( count, endClock - startClock ); 1727 1.1 bjh21 1728 1.1 bjh21 } 1729 1.1 bjh21 1730 1.1 bjh21 static const struct { 1731 1.1 bjh21 bits64 high, low; 1732 1.1 bjh21 } inputs_float128_pos[ numInputs_float128 ] = { 1733 1.1 bjh21 { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) }, 1734 1.1 bjh21 { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) }, 1735 1.1 bjh21 { LIT64( 0x05F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) }, 1736 1.1 bjh21 { LIT64( 0x72B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) }, 1737 1.1 bjh21 { LIT64( 0x0000000000000000 ), LIT64( 0x0000000000000000 ) }, 1738 1.1 bjh21 { LIT64( 0x3FFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) }, 1739 1.1 bjh21 { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) }, 1740 1.1 bjh21 { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) }, 1741 1.1 bjh21 { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) }, 1742 1.1 bjh21 { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) }, 1743 1.1 bjh21 { LIT64( 0x3F7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) }, 1744 1.1 bjh21 { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) }, 1745 1.1 bjh21 { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) }, 1746 1.1 bjh21 { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) }, 1747 1.1 bjh21 { LIT64( 0x3FFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) }, 1748 1.1 bjh21 { LIT64( 0x3DB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) }, 1749 1.1 bjh21 { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) }, 1750 1.1 bjh21 { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) }, 1751 1.1 bjh21 { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) }, 1752 1.1 bjh21 { LIT64( 0x0001000000000000 ), LIT64( 0x0000001000000001 ) }, 1753 1.1 bjh21 { LIT64( 0x4036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) }, 1754 1.1 bjh21 { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) }, 1755 1.1 bjh21 { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) }, 1756 1.1 bjh21 { LIT64( 0x3FFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) }, 1757 1.1 bjh21 { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) }, 1758 1.1 bjh21 { LIT64( 0x35CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) }, 1759 1.1 bjh21 { LIT64( 0x6228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) }, 1760 1.1 bjh21 { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) }, 1761 1.1 bjh21 { LIT64( 0x41AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) }, 1762 1.1 bjh21 { LIT64( 0x496F000000000000 ), LIT64( 0x00000001FFFBFFFF ) }, 1763 1.1 bjh21 { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) }, 1764 1.1 bjh21 { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) } 1765 1.1 bjh21 }; 1766 1.1 bjh21 1767 1.1 bjh21 static void time_az_float128_pos( float128 function( float128 ) ) 1768 1.1 bjh21 { 1769 1.1 bjh21 clock_t startClock, endClock; 1770 1.1 bjh21 int32 count, i; 1771 1.1 bjh21 int8 inputNum; 1772 1.1 bjh21 float128 a; 1773 1.1 bjh21 1774 1.1 bjh21 count = 0; 1775 1.1 bjh21 inputNum = 0; 1776 1.1 bjh21 startClock = clock(); 1777 1.1 bjh21 do { 1778 1.1 bjh21 for ( i = minIterations; i; --i ) { 1779 1.1 bjh21 a.low = inputs_float128_pos[ inputNum ].low; 1780 1.1 bjh21 a.high = inputs_float128_pos[ inputNum ].high; 1781 1.1 bjh21 function( a ); 1782 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1783 1.1 bjh21 } 1784 1.1 bjh21 count += minIterations; 1785 1.1 bjh21 } while ( clock() - startClock < CLOCKS_PER_SEC ); 1786 1.1 bjh21 inputNum = 0; 1787 1.1 bjh21 startClock = clock(); 1788 1.1 bjh21 for ( i = count; i; --i ) { 1789 1.1 bjh21 a.low = inputs_float128_pos[ inputNum ].low; 1790 1.1 bjh21 a.high = inputs_float128_pos[ inputNum ].high; 1791 1.1 bjh21 function( a ); 1792 1.1 bjh21 inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 ); 1793 1.1 bjh21 } 1794 1.1 bjh21 endClock = clock(); 1795 1.1 bjh21 reportTime( count, endClock - startClock ); 1796 1.1 bjh21 1797 1.1 bjh21 } 1798 1.1 bjh21 1799 1.1 bjh21 #endif 1800 1.1 bjh21 1801 1.1 bjh21 enum { 1802 1.1 bjh21 INT32_TO_FLOAT32 = 1, 1803 1.1 bjh21 INT32_TO_FLOAT64, 1804 1.1 bjh21 #ifdef FLOATX80 1805 1.1 bjh21 INT32_TO_FLOATX80, 1806 1.1 bjh21 #endif 1807 1.1 bjh21 #ifdef FLOAT128 1808 1.1 bjh21 INT32_TO_FLOAT128, 1809 1.1 bjh21 #endif 1810 1.1 bjh21 INT64_TO_FLOAT32, 1811 1.1 bjh21 INT64_TO_FLOAT64, 1812 1.1 bjh21 #ifdef FLOATX80 1813 1.1 bjh21 INT64_TO_FLOATX80, 1814 1.1 bjh21 #endif 1815 1.1 bjh21 #ifdef FLOAT128 1816 1.1 bjh21 INT64_TO_FLOAT128, 1817 1.1 bjh21 #endif 1818 1.1 bjh21 FLOAT32_TO_INT32, 1819 1.1 bjh21 FLOAT32_TO_INT32_ROUND_TO_ZERO, 1820 1.1 bjh21 FLOAT32_TO_INT64, 1821 1.1 bjh21 FLOAT32_TO_INT64_ROUND_TO_ZERO, 1822 1.1 bjh21 FLOAT32_TO_FLOAT64, 1823 1.1 bjh21 #ifdef FLOATX80 1824 1.1 bjh21 FLOAT32_TO_FLOATX80, 1825 1.1 bjh21 #endif 1826 1.1 bjh21 #ifdef FLOAT128 1827 1.1 bjh21 FLOAT32_TO_FLOAT128, 1828 1.1 bjh21 #endif 1829 1.1 bjh21 FLOAT32_ROUND_TO_INT, 1830 1.1 bjh21 FLOAT32_ADD, 1831 1.1 bjh21 FLOAT32_SUB, 1832 1.1 bjh21 FLOAT32_MUL, 1833 1.1 bjh21 FLOAT32_DIV, 1834 1.1 bjh21 FLOAT32_REM, 1835 1.1 bjh21 FLOAT32_SQRT, 1836 1.1 bjh21 FLOAT32_EQ, 1837 1.1 bjh21 FLOAT32_LE, 1838 1.1 bjh21 FLOAT32_LT, 1839 1.1 bjh21 FLOAT32_EQ_SIGNALING, 1840 1.1 bjh21 FLOAT32_LE_QUIET, 1841 1.1 bjh21 FLOAT32_LT_QUIET, 1842 1.1 bjh21 FLOAT64_TO_INT32, 1843 1.1 bjh21 FLOAT64_TO_INT32_ROUND_TO_ZERO, 1844 1.1 bjh21 FLOAT64_TO_INT64, 1845 1.1 bjh21 FLOAT64_TO_INT64_ROUND_TO_ZERO, 1846 1.1 bjh21 FLOAT64_TO_FLOAT32, 1847 1.1 bjh21 #ifdef FLOATX80 1848 1.1 bjh21 FLOAT64_TO_FLOATX80, 1849 1.1 bjh21 #endif 1850 1.1 bjh21 #ifdef FLOAT128 1851 1.1 bjh21 FLOAT64_TO_FLOAT128, 1852 1.1 bjh21 #endif 1853 1.1 bjh21 FLOAT64_ROUND_TO_INT, 1854 1.1 bjh21 FLOAT64_ADD, 1855 1.1 bjh21 FLOAT64_SUB, 1856 1.1 bjh21 FLOAT64_MUL, 1857 1.1 bjh21 FLOAT64_DIV, 1858 1.1 bjh21 FLOAT64_REM, 1859 1.1 bjh21 FLOAT64_SQRT, 1860 1.1 bjh21 FLOAT64_EQ, 1861 1.1 bjh21 FLOAT64_LE, 1862 1.1 bjh21 FLOAT64_LT, 1863 1.1 bjh21 FLOAT64_EQ_SIGNALING, 1864 1.1 bjh21 FLOAT64_LE_QUIET, 1865 1.1 bjh21 FLOAT64_LT_QUIET, 1866 1.1 bjh21 #ifdef FLOATX80 1867 1.1 bjh21 FLOATX80_TO_INT32, 1868 1.1 bjh21 FLOATX80_TO_INT32_ROUND_TO_ZERO, 1869 1.1 bjh21 FLOATX80_TO_INT64, 1870 1.1 bjh21 FLOATX80_TO_INT64_ROUND_TO_ZERO, 1871 1.1 bjh21 FLOATX80_TO_FLOAT32, 1872 1.1 bjh21 FLOATX80_TO_FLOAT64, 1873 1.1 bjh21 #ifdef FLOAT128 1874 1.1 bjh21 FLOATX80_TO_FLOAT128, 1875 1.1 bjh21 #endif 1876 1.1 bjh21 FLOATX80_ROUND_TO_INT, 1877 1.1 bjh21 FLOATX80_ADD, 1878 1.1 bjh21 FLOATX80_SUB, 1879 1.1 bjh21 FLOATX80_MUL, 1880 1.1 bjh21 FLOATX80_DIV, 1881 1.1 bjh21 FLOATX80_REM, 1882 1.1 bjh21 FLOATX80_SQRT, 1883 1.1 bjh21 FLOATX80_EQ, 1884 1.1 bjh21 FLOATX80_LE, 1885 1.1 bjh21 FLOATX80_LT, 1886 1.1 bjh21 FLOATX80_EQ_SIGNALING, 1887 1.1 bjh21 FLOATX80_LE_QUIET, 1888 1.1 bjh21 FLOATX80_LT_QUIET, 1889 1.1 bjh21 #endif 1890 1.1 bjh21 #ifdef FLOAT128 1891 1.1 bjh21 FLOAT128_TO_INT32, 1892 1.1 bjh21 FLOAT128_TO_INT32_ROUND_TO_ZERO, 1893 1.1 bjh21 FLOAT128_TO_INT64, 1894 1.1 bjh21 FLOAT128_TO_INT64_ROUND_TO_ZERO, 1895 1.1 bjh21 FLOAT128_TO_FLOAT32, 1896 1.1 bjh21 FLOAT128_TO_FLOAT64, 1897 1.1 bjh21 #ifdef FLOATX80 1898 1.1 bjh21 FLOAT128_TO_FLOATX80, 1899 1.1 bjh21 #endif 1900 1.1 bjh21 FLOAT128_ROUND_TO_INT, 1901 1.1 bjh21 FLOAT128_ADD, 1902 1.1 bjh21 FLOAT128_SUB, 1903 1.1 bjh21 FLOAT128_MUL, 1904 1.1 bjh21 FLOAT128_DIV, 1905 1.1 bjh21 FLOAT128_REM, 1906 1.1 bjh21 FLOAT128_SQRT, 1907 1.1 bjh21 FLOAT128_EQ, 1908 1.1 bjh21 FLOAT128_LE, 1909 1.1 bjh21 FLOAT128_LT, 1910 1.1 bjh21 FLOAT128_EQ_SIGNALING, 1911 1.1 bjh21 FLOAT128_LE_QUIET, 1912 1.1 bjh21 FLOAT128_LT_QUIET, 1913 1.1 bjh21 #endif 1914 1.1 bjh21 NUM_FUNCTIONS 1915 1.1 bjh21 }; 1916 1.1 bjh21 1917 1.1 bjh21 static struct { 1918 1.1 bjh21 char *name; 1919 1.1 bjh21 int8 numInputs; 1920 1.1 bjh21 flag roundingPrecision, roundingMode; 1921 1.1 bjh21 flag tininessMode, tininessModeAtReducedPrecision; 1922 1.1 bjh21 } functions[ NUM_FUNCTIONS ] = { 1923 1.1 bjh21 { 0, 0, 0, 0, 0, 0 }, 1924 1.1 bjh21 { "int32_to_float32", 1, FALSE, TRUE, FALSE, FALSE }, 1925 1.1 bjh21 { "int32_to_float64", 1, FALSE, FALSE, FALSE, FALSE }, 1926 1.1 bjh21 #ifdef FLOATX80 1927 1.1 bjh21 { "int32_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE }, 1928 1.1 bjh21 #endif 1929 1.1 bjh21 #ifdef FLOAT128 1930 1.1 bjh21 { "int32_to_float128", 1, FALSE, FALSE, FALSE, FALSE }, 1931 1.1 bjh21 #endif 1932 1.1 bjh21 { "int64_to_float32", 1, FALSE, TRUE, FALSE, FALSE }, 1933 1.1 bjh21 { "int64_to_float64", 1, FALSE, TRUE, FALSE, FALSE }, 1934 1.1 bjh21 #ifdef FLOATX80 1935 1.1 bjh21 { "int64_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE }, 1936 1.1 bjh21 #endif 1937 1.1 bjh21 #ifdef FLOAT128 1938 1.1 bjh21 { "int64_to_float128", 1, FALSE, FALSE, FALSE, FALSE }, 1939 1.1 bjh21 #endif 1940 1.1 bjh21 { "float32_to_int32", 1, FALSE, TRUE, FALSE, FALSE }, 1941 1.1 bjh21 { "float32_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1942 1.1 bjh21 { "float32_to_int64", 1, FALSE, TRUE, FALSE, FALSE }, 1943 1.1 bjh21 { "float32_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1944 1.1 bjh21 { "float32_to_float64", 1, FALSE, FALSE, FALSE, FALSE }, 1945 1.1 bjh21 #ifdef FLOATX80 1946 1.1 bjh21 { "float32_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE }, 1947 1.1 bjh21 #endif 1948 1.1 bjh21 #ifdef FLOAT128 1949 1.1 bjh21 { "float32_to_float128", 1, FALSE, FALSE, FALSE, FALSE }, 1950 1.1 bjh21 #endif 1951 1.1 bjh21 { "float32_round_to_int", 1, FALSE, TRUE, FALSE, FALSE }, 1952 1.1 bjh21 { "float32_add", 2, FALSE, TRUE, FALSE, FALSE }, 1953 1.1 bjh21 { "float32_sub", 2, FALSE, TRUE, FALSE, FALSE }, 1954 1.1 bjh21 { "float32_mul", 2, FALSE, TRUE, TRUE, FALSE }, 1955 1.1 bjh21 { "float32_div", 2, FALSE, TRUE, FALSE, FALSE }, 1956 1.1 bjh21 { "float32_rem", 2, FALSE, FALSE, FALSE, FALSE }, 1957 1.1 bjh21 { "float32_sqrt", 1, FALSE, TRUE, FALSE, FALSE }, 1958 1.1 bjh21 { "float32_eq", 2, FALSE, FALSE, FALSE, FALSE }, 1959 1.1 bjh21 { "float32_le", 2, FALSE, FALSE, FALSE, FALSE }, 1960 1.1 bjh21 { "float32_lt", 2, FALSE, FALSE, FALSE, FALSE }, 1961 1.1 bjh21 { "float32_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE }, 1962 1.1 bjh21 { "float32_le_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 1963 1.1 bjh21 { "float32_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 1964 1.1 bjh21 { "float64_to_int32", 1, FALSE, TRUE, FALSE, FALSE }, 1965 1.1 bjh21 { "float64_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1966 1.1 bjh21 { "float64_to_int64", 1, FALSE, TRUE, FALSE, FALSE }, 1967 1.1 bjh21 { "float64_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1968 1.1 bjh21 { "float64_to_float32", 1, FALSE, TRUE, TRUE, FALSE }, 1969 1.1 bjh21 #ifdef FLOATX80 1970 1.1 bjh21 { "float64_to_floatx80", 1, FALSE, FALSE, FALSE, FALSE }, 1971 1.1 bjh21 #endif 1972 1.1 bjh21 #ifdef FLOAT128 1973 1.1 bjh21 { "float64_to_float128", 1, FALSE, FALSE, FALSE, FALSE }, 1974 1.1 bjh21 #endif 1975 1.1 bjh21 { "float64_round_to_int", 1, FALSE, TRUE, FALSE, FALSE }, 1976 1.1 bjh21 { "float64_add", 2, FALSE, TRUE, FALSE, FALSE }, 1977 1.1 bjh21 { "float64_sub", 2, FALSE, TRUE, FALSE, FALSE }, 1978 1.1 bjh21 { "float64_mul", 2, FALSE, TRUE, TRUE, FALSE }, 1979 1.1 bjh21 { "float64_div", 2, FALSE, TRUE, FALSE, FALSE }, 1980 1.1 bjh21 { "float64_rem", 2, FALSE, FALSE, FALSE, FALSE }, 1981 1.1 bjh21 { "float64_sqrt", 1, FALSE, TRUE, FALSE, FALSE }, 1982 1.1 bjh21 { "float64_eq", 2, FALSE, FALSE, FALSE, FALSE }, 1983 1.1 bjh21 { "float64_le", 2, FALSE, FALSE, FALSE, FALSE }, 1984 1.1 bjh21 { "float64_lt", 2, FALSE, FALSE, FALSE, FALSE }, 1985 1.1 bjh21 { "float64_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE }, 1986 1.1 bjh21 { "float64_le_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 1987 1.1 bjh21 { "float64_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 1988 1.1 bjh21 #ifdef FLOATX80 1989 1.1 bjh21 { "floatx80_to_int32", 1, FALSE, TRUE, FALSE, FALSE }, 1990 1.1 bjh21 { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1991 1.1 bjh21 { "floatx80_to_int64", 1, FALSE, TRUE, FALSE, FALSE }, 1992 1.1 bjh21 { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 1993 1.1 bjh21 { "floatx80_to_float32", 1, FALSE, TRUE, TRUE, FALSE }, 1994 1.1 bjh21 { "floatx80_to_float64", 1, FALSE, TRUE, TRUE, FALSE }, 1995 1.1 bjh21 #ifdef FLOAT128 1996 1.1 bjh21 { "floatx80_to_float128", 1, FALSE, FALSE, FALSE, FALSE }, 1997 1.1 bjh21 #endif 1998 1.1 bjh21 { "floatx80_round_to_int", 1, FALSE, TRUE, FALSE, FALSE }, 1999 1.1 bjh21 { "floatx80_add", 2, TRUE, TRUE, FALSE, TRUE }, 2000 1.1 bjh21 { "floatx80_sub", 2, TRUE, TRUE, FALSE, TRUE }, 2001 1.1 bjh21 { "floatx80_mul", 2, TRUE, TRUE, TRUE, TRUE }, 2002 1.1 bjh21 { "floatx80_div", 2, TRUE, TRUE, FALSE, TRUE }, 2003 1.1 bjh21 { "floatx80_rem", 2, FALSE, FALSE, FALSE, FALSE }, 2004 1.1 bjh21 { "floatx80_sqrt", 1, TRUE, TRUE, FALSE, FALSE }, 2005 1.1 bjh21 { "floatx80_eq", 2, FALSE, FALSE, FALSE, FALSE }, 2006 1.1 bjh21 { "floatx80_le", 2, FALSE, FALSE, FALSE, FALSE }, 2007 1.1 bjh21 { "floatx80_lt", 2, FALSE, FALSE, FALSE, FALSE }, 2008 1.1 bjh21 { "floatx80_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE }, 2009 1.1 bjh21 { "floatx80_le_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 2010 1.1 bjh21 { "floatx80_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 2011 1.1 bjh21 #endif 2012 1.1 bjh21 #ifdef FLOAT128 2013 1.1 bjh21 { "float128_to_int32", 1, FALSE, TRUE, FALSE, FALSE }, 2014 1.1 bjh21 { "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 2015 1.1 bjh21 { "float128_to_int64", 1, FALSE, TRUE, FALSE, FALSE }, 2016 1.1 bjh21 { "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE }, 2017 1.1 bjh21 { "float128_to_float32", 1, FALSE, TRUE, TRUE, FALSE }, 2018 1.1 bjh21 { "float128_to_float64", 1, FALSE, TRUE, TRUE, FALSE }, 2019 1.1 bjh21 #ifdef FLOATX80 2020 1.1 bjh21 { "float128_to_floatx80", 1, FALSE, TRUE, TRUE, FALSE }, 2021 1.1 bjh21 #endif 2022 1.1 bjh21 { "float128_round_to_int", 1, FALSE, TRUE, FALSE, FALSE }, 2023 1.1 bjh21 { "float128_add", 2, FALSE, TRUE, FALSE, FALSE }, 2024 1.1 bjh21 { "float128_sub", 2, FALSE, TRUE, FALSE, FALSE }, 2025 1.1 bjh21 { "float128_mul", 2, FALSE, TRUE, TRUE, FALSE }, 2026 1.1 bjh21 { "float128_div", 2, FALSE, TRUE, FALSE, FALSE }, 2027 1.1 bjh21 { "float128_rem", 2, FALSE, FALSE, FALSE, FALSE }, 2028 1.1 bjh21 { "float128_sqrt", 1, FALSE, TRUE, FALSE, FALSE }, 2029 1.1 bjh21 { "float128_eq", 2, FALSE, FALSE, FALSE, FALSE }, 2030 1.1 bjh21 { "float128_le", 2, FALSE, FALSE, FALSE, FALSE }, 2031 1.1 bjh21 { "float128_lt", 2, FALSE, FALSE, FALSE, FALSE }, 2032 1.1 bjh21 { "float128_eq_signaling", 2, FALSE, FALSE, FALSE, FALSE }, 2033 1.1 bjh21 { "float128_le_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 2034 1.1 bjh21 { "float128_lt_quiet", 2, FALSE, FALSE, FALSE, FALSE }, 2035 1.1 bjh21 #endif 2036 1.1 bjh21 }; 2037 1.1 bjh21 2038 1.1 bjh21 enum { 2039 1.1 bjh21 ROUND_NEAREST_EVEN = 1, 2040 1.1 bjh21 ROUND_TO_ZERO, 2041 1.1 bjh21 ROUND_DOWN, 2042 1.1 bjh21 ROUND_UP, 2043 1.1 bjh21 NUM_ROUNDINGMODES 2044 1.1 bjh21 }; 2045 1.1 bjh21 enum { 2046 1.1 bjh21 TININESS_BEFORE_ROUNDING = 1, 2047 1.1 bjh21 TININESS_AFTER_ROUNDING, 2048 1.1 bjh21 NUM_TININESSMODES 2049 1.1 bjh21 }; 2050 1.1 bjh21 2051 1.1 bjh21 static void 2052 1.1 bjh21 timeFunctionVariety( 2053 1.1 bjh21 uint8 functionCode, 2054 1.1 bjh21 int8 roundingPrecision, 2055 1.1 bjh21 int8 roundingMode, 2056 1.1 bjh21 int8 tininessMode 2057 1.1 bjh21 ) 2058 1.1 bjh21 { 2059 1.1 bjh21 uint8 roundingCode; 2060 1.1 bjh21 int8 tininessCode; 2061 1.1 bjh21 2062 1.1 bjh21 functionName = functions[ functionCode ].name; 2063 1.1 bjh21 if ( roundingPrecision == 32 ) { 2064 1.1 bjh21 roundingPrecisionName = "32"; 2065 1.1 bjh21 } 2066 1.1 bjh21 else if ( roundingPrecision == 64 ) { 2067 1.1 bjh21 roundingPrecisionName = "64"; 2068 1.1 bjh21 } 2069 1.1 bjh21 else if ( roundingPrecision == 80 ) { 2070 1.1 bjh21 roundingPrecisionName = "80"; 2071 1.1 bjh21 } 2072 1.1 bjh21 else { 2073 1.1 bjh21 roundingPrecisionName = 0; 2074 1.1 bjh21 } 2075 1.1 bjh21 #ifdef FLOATX80 2076 1.1 bjh21 floatx80_rounding_precision = roundingPrecision; 2077 1.1 bjh21 #endif 2078 1.1 bjh21 switch ( roundingMode ) { 2079 1.1 bjh21 case 0: 2080 1.1 bjh21 roundingModeName = 0; 2081 1.1 bjh21 roundingCode = float_round_nearest_even; 2082 1.1 bjh21 break; 2083 1.1 bjh21 case ROUND_NEAREST_EVEN: 2084 1.1 bjh21 roundingModeName = "nearest_even"; 2085 1.1 bjh21 roundingCode = float_round_nearest_even; 2086 1.1 bjh21 break; 2087 1.1 bjh21 case ROUND_TO_ZERO: 2088 1.1 bjh21 roundingModeName = "to_zero"; 2089 1.1 bjh21 roundingCode = float_round_to_zero; 2090 1.1 bjh21 break; 2091 1.1 bjh21 case ROUND_DOWN: 2092 1.1 bjh21 roundingModeName = "down"; 2093 1.1 bjh21 roundingCode = float_round_down; 2094 1.1 bjh21 break; 2095 1.1 bjh21 case ROUND_UP: 2096 1.1 bjh21 roundingModeName = "up"; 2097 1.1 bjh21 roundingCode = float_round_up; 2098 1.1 bjh21 break; 2099 1.1 bjh21 } 2100 1.1 bjh21 float_rounding_mode = roundingCode; 2101 1.1 bjh21 switch ( tininessMode ) { 2102 1.1 bjh21 case 0: 2103 1.1 bjh21 tininessModeName = 0; 2104 1.1 bjh21 tininessCode = float_tininess_after_rounding; 2105 1.1 bjh21 break; 2106 1.1 bjh21 case TININESS_BEFORE_ROUNDING: 2107 1.1 bjh21 tininessModeName = "before"; 2108 1.1 bjh21 tininessCode = float_tininess_before_rounding; 2109 1.1 bjh21 break; 2110 1.1 bjh21 case TININESS_AFTER_ROUNDING: 2111 1.1 bjh21 tininessModeName = "after"; 2112 1.1 bjh21 tininessCode = float_tininess_after_rounding; 2113 1.1 bjh21 break; 2114 1.1 bjh21 } 2115 1.1 bjh21 float_detect_tininess = tininessCode; 2116 1.1 bjh21 switch ( functionCode ) { 2117 1.1 bjh21 case INT32_TO_FLOAT32: 2118 1.1 bjh21 time_a_int32_z_float32( int32_to_float32 ); 2119 1.1 bjh21 break; 2120 1.1 bjh21 case INT32_TO_FLOAT64: 2121 1.1 bjh21 time_a_int32_z_float64( int32_to_float64 ); 2122 1.1 bjh21 break; 2123 1.1 bjh21 #ifdef FLOATX80 2124 1.1 bjh21 case INT32_TO_FLOATX80: 2125 1.1 bjh21 time_a_int32_z_floatx80( int32_to_floatx80 ); 2126 1.1 bjh21 break; 2127 1.1 bjh21 #endif 2128 1.1 bjh21 #ifdef FLOAT128 2129 1.1 bjh21 case INT32_TO_FLOAT128: 2130 1.1 bjh21 time_a_int32_z_float128( int32_to_float128 ); 2131 1.1 bjh21 break; 2132 1.1 bjh21 #endif 2133 1.1 bjh21 case INT64_TO_FLOAT32: 2134 1.1 bjh21 time_a_int64_z_float32( int64_to_float32 ); 2135 1.1 bjh21 break; 2136 1.1 bjh21 case INT64_TO_FLOAT64: 2137 1.1 bjh21 time_a_int64_z_float64( int64_to_float64 ); 2138 1.1 bjh21 break; 2139 1.1 bjh21 #ifdef FLOATX80 2140 1.1 bjh21 case INT64_TO_FLOATX80: 2141 1.1 bjh21 time_a_int64_z_floatx80( int64_to_floatx80 ); 2142 1.1 bjh21 break; 2143 1.1 bjh21 #endif 2144 1.1 bjh21 #ifdef FLOAT128 2145 1.1 bjh21 case INT64_TO_FLOAT128: 2146 1.1 bjh21 time_a_int64_z_float128( int64_to_float128 ); 2147 1.1 bjh21 break; 2148 1.1 bjh21 #endif 2149 1.1 bjh21 case FLOAT32_TO_INT32: 2150 1.1 bjh21 time_a_float32_z_int32( float32_to_int32 ); 2151 1.1 bjh21 break; 2152 1.1 bjh21 case FLOAT32_TO_INT32_ROUND_TO_ZERO: 2153 1.1 bjh21 time_a_float32_z_int32( float32_to_int32_round_to_zero ); 2154 1.1 bjh21 break; 2155 1.1 bjh21 case FLOAT32_TO_INT64: 2156 1.1 bjh21 time_a_float32_z_int64( float32_to_int64 ); 2157 1.1 bjh21 break; 2158 1.1 bjh21 case FLOAT32_TO_INT64_ROUND_TO_ZERO: 2159 1.1 bjh21 time_a_float32_z_int64( float32_to_int64_round_to_zero ); 2160 1.1 bjh21 break; 2161 1.1 bjh21 case FLOAT32_TO_FLOAT64: 2162 1.1 bjh21 time_a_float32_z_float64( float32_to_float64 ); 2163 1.1 bjh21 break; 2164 1.1 bjh21 #ifdef FLOATX80 2165 1.1 bjh21 case FLOAT32_TO_FLOATX80: 2166 1.1 bjh21 time_a_float32_z_floatx80( float32_to_floatx80 ); 2167 1.1 bjh21 break; 2168 1.1 bjh21 #endif 2169 1.1 bjh21 #ifdef FLOAT128 2170 1.1 bjh21 case FLOAT32_TO_FLOAT128: 2171 1.1 bjh21 time_a_float32_z_float128( float32_to_float128 ); 2172 1.1 bjh21 break; 2173 1.1 bjh21 #endif 2174 1.1 bjh21 case FLOAT32_ROUND_TO_INT: 2175 1.1 bjh21 time_az_float32( float32_round_to_int ); 2176 1.1 bjh21 break; 2177 1.1 bjh21 case FLOAT32_ADD: 2178 1.1 bjh21 time_abz_float32( float32_add ); 2179 1.1 bjh21 break; 2180 1.1 bjh21 case FLOAT32_SUB: 2181 1.1 bjh21 time_abz_float32( float32_sub ); 2182 1.1 bjh21 break; 2183 1.1 bjh21 case FLOAT32_MUL: 2184 1.1 bjh21 time_abz_float32( float32_mul ); 2185 1.1 bjh21 break; 2186 1.1 bjh21 case FLOAT32_DIV: 2187 1.1 bjh21 time_abz_float32( float32_div ); 2188 1.1 bjh21 break; 2189 1.1 bjh21 case FLOAT32_REM: 2190 1.1 bjh21 time_abz_float32( float32_rem ); 2191 1.1 bjh21 break; 2192 1.1 bjh21 case FLOAT32_SQRT: 2193 1.1 bjh21 time_az_float32_pos( float32_sqrt ); 2194 1.1 bjh21 break; 2195 1.1 bjh21 case FLOAT32_EQ: 2196 1.1 bjh21 time_ab_float32_z_flag( float32_eq ); 2197 1.1 bjh21 break; 2198 1.1 bjh21 case FLOAT32_LE: 2199 1.1 bjh21 time_ab_float32_z_flag( float32_le ); 2200 1.1 bjh21 break; 2201 1.1 bjh21 case FLOAT32_LT: 2202 1.1 bjh21 time_ab_float32_z_flag( float32_lt ); 2203 1.1 bjh21 break; 2204 1.1 bjh21 case FLOAT32_EQ_SIGNALING: 2205 1.1 bjh21 time_ab_float32_z_flag( float32_eq_signaling ); 2206 1.1 bjh21 break; 2207 1.1 bjh21 case FLOAT32_LE_QUIET: 2208 1.1 bjh21 time_ab_float32_z_flag( float32_le_quiet ); 2209 1.1 bjh21 break; 2210 1.1 bjh21 case FLOAT32_LT_QUIET: 2211 1.1 bjh21 time_ab_float32_z_flag( float32_lt_quiet ); 2212 1.1 bjh21 break; 2213 1.1 bjh21 case FLOAT64_TO_INT32: 2214 1.1 bjh21 time_a_float64_z_int32( float64_to_int32 ); 2215 1.1 bjh21 break; 2216 1.1 bjh21 case FLOAT64_TO_INT32_ROUND_TO_ZERO: 2217 1.1 bjh21 time_a_float64_z_int32( float64_to_int32_round_to_zero ); 2218 1.1 bjh21 break; 2219 1.1 bjh21 case FLOAT64_TO_INT64: 2220 1.1 bjh21 time_a_float64_z_int64( float64_to_int64 ); 2221 1.1 bjh21 break; 2222 1.1 bjh21 case FLOAT64_TO_INT64_ROUND_TO_ZERO: 2223 1.1 bjh21 time_a_float64_z_int64( float64_to_int64_round_to_zero ); 2224 1.1 bjh21 break; 2225 1.1 bjh21 case FLOAT64_TO_FLOAT32: 2226 1.1 bjh21 time_a_float64_z_float32( float64_to_float32 ); 2227 1.1 bjh21 break; 2228 1.1 bjh21 #ifdef FLOATX80 2229 1.1 bjh21 case FLOAT64_TO_FLOATX80: 2230 1.1 bjh21 time_a_float64_z_floatx80( float64_to_floatx80 ); 2231 1.1 bjh21 break; 2232 1.1 bjh21 #endif 2233 1.1 bjh21 #ifdef FLOAT128 2234 1.1 bjh21 case FLOAT64_TO_FLOAT128: 2235 1.1 bjh21 time_a_float64_z_float128( float64_to_float128 ); 2236 1.1 bjh21 break; 2237 1.1 bjh21 #endif 2238 1.1 bjh21 case FLOAT64_ROUND_TO_INT: 2239 1.1 bjh21 time_az_float64( float64_round_to_int ); 2240 1.1 bjh21 break; 2241 1.1 bjh21 case FLOAT64_ADD: 2242 1.1 bjh21 time_abz_float64( float64_add ); 2243 1.1 bjh21 break; 2244 1.1 bjh21 case FLOAT64_SUB: 2245 1.1 bjh21 time_abz_float64( float64_sub ); 2246 1.1 bjh21 break; 2247 1.1 bjh21 case FLOAT64_MUL: 2248 1.1 bjh21 time_abz_float64( float64_mul ); 2249 1.1 bjh21 break; 2250 1.1 bjh21 case FLOAT64_DIV: 2251 1.1 bjh21 time_abz_float64( float64_div ); 2252 1.1 bjh21 break; 2253 1.1 bjh21 case FLOAT64_REM: 2254 1.1 bjh21 time_abz_float64( float64_rem ); 2255 1.1 bjh21 break; 2256 1.1 bjh21 case FLOAT64_SQRT: 2257 1.1 bjh21 time_az_float64_pos( float64_sqrt ); 2258 1.1 bjh21 break; 2259 1.1 bjh21 case FLOAT64_EQ: 2260 1.1 bjh21 time_ab_float64_z_flag( float64_eq ); 2261 1.1 bjh21 break; 2262 1.1 bjh21 case FLOAT64_LE: 2263 1.1 bjh21 time_ab_float64_z_flag( float64_le ); 2264 1.1 bjh21 break; 2265 1.1 bjh21 case FLOAT64_LT: 2266 1.1 bjh21 time_ab_float64_z_flag( float64_lt ); 2267 1.1 bjh21 break; 2268 1.1 bjh21 case FLOAT64_EQ_SIGNALING: 2269 1.1 bjh21 time_ab_float64_z_flag( float64_eq_signaling ); 2270 1.1 bjh21 break; 2271 1.1 bjh21 case FLOAT64_LE_QUIET: 2272 1.1 bjh21 time_ab_float64_z_flag( float64_le_quiet ); 2273 1.1 bjh21 break; 2274 1.1 bjh21 case FLOAT64_LT_QUIET: 2275 1.1 bjh21 time_ab_float64_z_flag( float64_lt_quiet ); 2276 1.1 bjh21 break; 2277 1.1 bjh21 #ifdef FLOATX80 2278 1.1 bjh21 case FLOATX80_TO_INT32: 2279 1.1 bjh21 time_a_floatx80_z_int32( floatx80_to_int32 ); 2280 1.1 bjh21 break; 2281 1.1 bjh21 case FLOATX80_TO_INT32_ROUND_TO_ZERO: 2282 1.1 bjh21 time_a_floatx80_z_int32( floatx80_to_int32_round_to_zero ); 2283 1.1 bjh21 break; 2284 1.1 bjh21 case FLOATX80_TO_INT64: 2285 1.1 bjh21 time_a_floatx80_z_int64( floatx80_to_int64 ); 2286 1.1 bjh21 break; 2287 1.1 bjh21 case FLOATX80_TO_INT64_ROUND_TO_ZERO: 2288 1.1 bjh21 time_a_floatx80_z_int64( floatx80_to_int64_round_to_zero ); 2289 1.1 bjh21 break; 2290 1.1 bjh21 case FLOATX80_TO_FLOAT32: 2291 1.1 bjh21 time_a_floatx80_z_float32( floatx80_to_float32 ); 2292 1.1 bjh21 break; 2293 1.1 bjh21 case FLOATX80_TO_FLOAT64: 2294 1.1 bjh21 time_a_floatx80_z_float64( floatx80_to_float64 ); 2295 1.1 bjh21 break; 2296 1.1 bjh21 #ifdef FLOAT128 2297 1.1 bjh21 case FLOATX80_TO_FLOAT128: 2298 1.1 bjh21 time_a_floatx80_z_float128( floatx80_to_float128 ); 2299 1.1 bjh21 break; 2300 1.1 bjh21 #endif 2301 1.1 bjh21 case FLOATX80_ROUND_TO_INT: 2302 1.1 bjh21 time_az_floatx80( floatx80_round_to_int ); 2303 1.1 bjh21 break; 2304 1.1 bjh21 case FLOATX80_ADD: 2305 1.1 bjh21 time_abz_floatx80( floatx80_add ); 2306 1.1 bjh21 break; 2307 1.1 bjh21 case FLOATX80_SUB: 2308 1.1 bjh21 time_abz_floatx80( floatx80_sub ); 2309 1.1 bjh21 break; 2310 1.1 bjh21 case FLOATX80_MUL: 2311 1.1 bjh21 time_abz_floatx80( floatx80_mul ); 2312 1.1 bjh21 break; 2313 1.1 bjh21 case FLOATX80_DIV: 2314 1.1 bjh21 time_abz_floatx80( floatx80_div ); 2315 1.1 bjh21 break; 2316 1.1 bjh21 case FLOATX80_REM: 2317 1.1 bjh21 time_abz_floatx80( floatx80_rem ); 2318 1.1 bjh21 break; 2319 1.1 bjh21 case FLOATX80_SQRT: 2320 1.1 bjh21 time_az_floatx80_pos( floatx80_sqrt ); 2321 1.1 bjh21 break; 2322 1.1 bjh21 case FLOATX80_EQ: 2323 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_eq ); 2324 1.1 bjh21 break; 2325 1.1 bjh21 case FLOATX80_LE: 2326 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_le ); 2327 1.1 bjh21 break; 2328 1.1 bjh21 case FLOATX80_LT: 2329 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_lt ); 2330 1.1 bjh21 break; 2331 1.1 bjh21 case FLOATX80_EQ_SIGNALING: 2332 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_eq_signaling ); 2333 1.1 bjh21 break; 2334 1.1 bjh21 case FLOATX80_LE_QUIET: 2335 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_le_quiet ); 2336 1.1 bjh21 break; 2337 1.1 bjh21 case FLOATX80_LT_QUIET: 2338 1.1 bjh21 time_ab_floatx80_z_flag( floatx80_lt_quiet ); 2339 1.1 bjh21 break; 2340 1.1 bjh21 #endif 2341 1.1 bjh21 #ifdef FLOAT128 2342 1.1 bjh21 case FLOAT128_TO_INT32: 2343 1.1 bjh21 time_a_float128_z_int32( float128_to_int32 ); 2344 1.1 bjh21 break; 2345 1.1 bjh21 case FLOAT128_TO_INT32_ROUND_TO_ZERO: 2346 1.1 bjh21 time_a_float128_z_int32( float128_to_int32_round_to_zero ); 2347 1.1 bjh21 break; 2348 1.1 bjh21 case FLOAT128_TO_INT64: 2349 1.1 bjh21 time_a_float128_z_int64( float128_to_int64 ); 2350 1.1 bjh21 break; 2351 1.1 bjh21 case FLOAT128_TO_INT64_ROUND_TO_ZERO: 2352 1.1 bjh21 time_a_float128_z_int64( float128_to_int64_round_to_zero ); 2353 1.1 bjh21 break; 2354 1.1 bjh21 case FLOAT128_TO_FLOAT32: 2355 1.1 bjh21 time_a_float128_z_float32( float128_to_float32 ); 2356 1.1 bjh21 break; 2357 1.1 bjh21 case FLOAT128_TO_FLOAT64: 2358 1.1 bjh21 time_a_float128_z_float64( float128_to_float64 ); 2359 1.1 bjh21 break; 2360 1.1 bjh21 #ifdef FLOATX80 2361 1.1 bjh21 case FLOAT128_TO_FLOATX80: 2362 1.1 bjh21 time_a_float128_z_floatx80( float128_to_floatx80 ); 2363 1.1 bjh21 break; 2364 1.1 bjh21 #endif 2365 1.1 bjh21 case FLOAT128_ROUND_TO_INT: 2366 1.1 bjh21 time_az_float128( float128_round_to_int ); 2367 1.1 bjh21 break; 2368 1.1 bjh21 case FLOAT128_ADD: 2369 1.1 bjh21 time_abz_float128( float128_add ); 2370 1.1 bjh21 break; 2371 1.1 bjh21 case FLOAT128_SUB: 2372 1.1 bjh21 time_abz_float128( float128_sub ); 2373 1.1 bjh21 break; 2374 1.1 bjh21 case FLOAT128_MUL: 2375 1.1 bjh21 time_abz_float128( float128_mul ); 2376 1.1 bjh21 break; 2377 1.1 bjh21 case FLOAT128_DIV: 2378 1.1 bjh21 time_abz_float128( float128_div ); 2379 1.1 bjh21 break; 2380 1.1 bjh21 case FLOAT128_REM: 2381 1.1 bjh21 time_abz_float128( float128_rem ); 2382 1.1 bjh21 break; 2383 1.1 bjh21 case FLOAT128_SQRT: 2384 1.1 bjh21 time_az_float128_pos( float128_sqrt ); 2385 1.1 bjh21 break; 2386 1.1 bjh21 case FLOAT128_EQ: 2387 1.1 bjh21 time_ab_float128_z_flag( float128_eq ); 2388 1.1 bjh21 break; 2389 1.1 bjh21 case FLOAT128_LE: 2390 1.1 bjh21 time_ab_float128_z_flag( float128_le ); 2391 1.1 bjh21 break; 2392 1.1 bjh21 case FLOAT128_LT: 2393 1.1 bjh21 time_ab_float128_z_flag( float128_lt ); 2394 1.1 bjh21 break; 2395 1.1 bjh21 case FLOAT128_EQ_SIGNALING: 2396 1.1 bjh21 time_ab_float128_z_flag( float128_eq_signaling ); 2397 1.1 bjh21 break; 2398 1.1 bjh21 case FLOAT128_LE_QUIET: 2399 1.1 bjh21 time_ab_float128_z_flag( float128_le_quiet ); 2400 1.1 bjh21 break; 2401 1.1 bjh21 case FLOAT128_LT_QUIET: 2402 1.1 bjh21 time_ab_float128_z_flag( float128_lt_quiet ); 2403 1.1 bjh21 break; 2404 1.1 bjh21 #endif 2405 1.1 bjh21 } 2406 1.1 bjh21 2407 1.1 bjh21 } 2408 1.1 bjh21 2409 1.1 bjh21 static void 2410 1.1 bjh21 timeFunction( 2411 1.1 bjh21 uint8 functionCode, 2412 1.1 bjh21 int8 roundingPrecisionIn, 2413 1.1 bjh21 int8 roundingModeIn, 2414 1.1 bjh21 int8 tininessModeIn 2415 1.1 bjh21 ) 2416 1.1 bjh21 { 2417 1.1 bjh21 int8 roundingPrecision, roundingMode, tininessMode; 2418 1.1 bjh21 2419 1.1 bjh21 roundingPrecision = 32; 2420 1.1 bjh21 for (;;) { 2421 1.1 bjh21 if ( ! functions[ functionCode ].roundingPrecision ) { 2422 1.1 bjh21 roundingPrecision = 0; 2423 1.1 bjh21 } 2424 1.1 bjh21 else if ( roundingPrecisionIn ) { 2425 1.1 bjh21 roundingPrecision = roundingPrecisionIn; 2426 1.1 bjh21 } 2427 1.1 bjh21 for ( roundingMode = 1; 2428 1.1 bjh21 roundingMode < NUM_ROUNDINGMODES; 2429 1.1 bjh21 ++roundingMode 2430 1.1 bjh21 ) { 2431 1.1 bjh21 if ( ! functions[ functionCode ].roundingMode ) { 2432 1.1 bjh21 roundingMode = 0; 2433 1.1 bjh21 } 2434 1.1 bjh21 else if ( roundingModeIn ) { 2435 1.1 bjh21 roundingMode = roundingModeIn; 2436 1.1 bjh21 } 2437 1.1 bjh21 for ( tininessMode = 1; 2438 1.1 bjh21 tininessMode < NUM_TININESSMODES; 2439 1.1 bjh21 ++tininessMode 2440 1.1 bjh21 ) { 2441 1.1 bjh21 if ( ( roundingPrecision == 32 ) 2442 1.1 bjh21 || ( roundingPrecision == 64 ) ) { 2443 1.1 bjh21 if ( ! functions[ functionCode ] 2444 1.1 bjh21 .tininessModeAtReducedPrecision 2445 1.1 bjh21 ) { 2446 1.1 bjh21 tininessMode = 0; 2447 1.1 bjh21 } 2448 1.1 bjh21 else if ( tininessModeIn ) { 2449 1.1 bjh21 tininessMode = tininessModeIn; 2450 1.1 bjh21 } 2451 1.1 bjh21 } 2452 1.1 bjh21 else { 2453 1.1 bjh21 if ( ! functions[ functionCode ].tininessMode ) { 2454 1.1 bjh21 tininessMode = 0; 2455 1.1 bjh21 } 2456 1.1 bjh21 else if ( tininessModeIn ) { 2457 1.1 bjh21 tininessMode = tininessModeIn; 2458 1.1 bjh21 } 2459 1.1 bjh21 } 2460 1.1 bjh21 timeFunctionVariety( 2461 1.1 bjh21 functionCode, roundingPrecision, roundingMode, tininessMode 2462 1.1 bjh21 ); 2463 1.1 bjh21 if ( tininessModeIn || ! tininessMode ) break; 2464 1.1 bjh21 } 2465 1.1 bjh21 if ( roundingModeIn || ! roundingMode ) break; 2466 1.1 bjh21 } 2467 1.1 bjh21 if ( roundingPrecisionIn || ! roundingPrecision ) break; 2468 1.1 bjh21 if ( roundingPrecision == 80 ) { 2469 1.1 bjh21 break; 2470 1.1 bjh21 } 2471 1.1 bjh21 else if ( roundingPrecision == 64 ) { 2472 1.1 bjh21 roundingPrecision = 80; 2473 1.1 bjh21 } 2474 1.1 bjh21 else if ( roundingPrecision == 32 ) { 2475 1.1 bjh21 roundingPrecision = 64; 2476 1.1 bjh21 } 2477 1.1 bjh21 } 2478 1.1 bjh21 2479 1.1 bjh21 } 2480 1.1 bjh21 2481 1.1 bjh21 main( int argc, char **argv ) 2482 1.1 bjh21 { 2483 1.1 bjh21 char *argPtr; 2484 1.1 bjh21 flag functionArgument; 2485 1.1 bjh21 uint8 functionCode; 2486 1.1 bjh21 int8 operands, roundingPrecision, roundingMode, tininessMode; 2487 1.1 bjh21 2488 1.1 bjh21 if ( argc <= 1 ) goto writeHelpMessage; 2489 1.1 bjh21 functionArgument = FALSE; 2490 1.1 bjh21 functionCode = 0; 2491 1.1 bjh21 operands = 0; 2492 1.1 bjh21 roundingPrecision = 0; 2493 1.1 bjh21 roundingMode = 0; 2494 1.1 bjh21 tininessMode = 0; 2495 1.1 bjh21 --argc; 2496 1.1 bjh21 ++argv; 2497 1.1 bjh21 while ( argc && ( argPtr = argv[ 0 ] ) ) { 2498 1.1 bjh21 if ( argPtr[ 0 ] == '-' ) ++argPtr; 2499 1.1 bjh21 if ( strcmp( argPtr, "help" ) == 0 ) { 2500 1.1 bjh21 writeHelpMessage: 2501 1.1 bjh21 fputs( 2502 1.1 bjh21 "timesoftfloat [<option>...] <function>\n" 2503 1.1 bjh21 " <option>: (* is default)\n" 2504 1.1 bjh21 " -help --Write this message and exit.\n" 2505 1.1 bjh21 #ifdef FLOATX80 2506 1.1 bjh21 " -precision32 --Only time rounding precision equivalent to float32.\n" 2507 1.1 bjh21 " -precision64 --Only time rounding precision equivalent to float64.\n" 2508 1.1 bjh21 " -precision80 --Only time maximum rounding precision.\n" 2509 1.1 bjh21 #endif 2510 1.1 bjh21 " -nearesteven --Only time rounding to nearest/even.\n" 2511 1.1 bjh21 " -tozero --Only time rounding to zero.\n" 2512 1.1 bjh21 " -down --Only time rounding down.\n" 2513 1.1 bjh21 " -up --Only time rounding up.\n" 2514 1.1 bjh21 " -tininessbefore --Only time underflow tininess before rounding.\n" 2515 1.1 bjh21 " -tininessafter --Only time underflow tininess after rounding.\n" 2516 1.1 bjh21 " <function>:\n" 2517 1.1 bjh21 " int32_to_<float> <float>_add <float>_eq\n" 2518 1.1 bjh21 " <float>_to_int32 <float>_sub <float>_le\n" 2519 1.1 bjh21 " <float>_to_int32_round_to_zero <float>_mul <float>_lt\n" 2520 1.1 bjh21 " int64_to_<float> <float>_div <float>_eq_signaling\n" 2521 1.1 bjh21 " <float>_to_int64 <float>_rem <float>_le_quiet\n" 2522 1.1 bjh21 " <float>_to_int64_round_to_zero <float>_lt_quiet\n" 2523 1.1 bjh21 " <float>_to_<float>\n" 2524 1.1 bjh21 " <float>_round_to_int\n" 2525 1.1 bjh21 " <float>_sqrt\n" 2526 1.1 bjh21 " -all1 --All 1-operand functions.\n" 2527 1.1 bjh21 " -all2 --All 2-operand functions.\n" 2528 1.1 bjh21 " -all --All functions.\n" 2529 1.1 bjh21 " <float>:\n" 2530 1.1 bjh21 " float32 --Single precision.\n" 2531 1.1 bjh21 " float64 --Double precision.\n" 2532 1.1 bjh21 #ifdef FLOATX80 2533 1.1 bjh21 " floatx80 --Extended double precision.\n" 2534 1.1 bjh21 #endif 2535 1.1 bjh21 #ifdef FLOAT128 2536 1.1 bjh21 " float128 --Quadruple precision.\n" 2537 1.1 bjh21 #endif 2538 1.1 bjh21 , 2539 1.1 bjh21 stdout 2540 1.1 bjh21 ); 2541 1.1 bjh21 return EXIT_SUCCESS; 2542 1.1 bjh21 } 2543 1.1 bjh21 #ifdef FLOATX80 2544 1.1 bjh21 else if ( strcmp( argPtr, "precision32" ) == 0 ) { 2545 1.1 bjh21 roundingPrecision = 32; 2546 1.1 bjh21 } 2547 1.1 bjh21 else if ( strcmp( argPtr, "precision64" ) == 0 ) { 2548 1.1 bjh21 roundingPrecision = 64; 2549 1.1 bjh21 } 2550 1.1 bjh21 else if ( strcmp( argPtr, "precision80" ) == 0 ) { 2551 1.1 bjh21 roundingPrecision = 80; 2552 1.1 bjh21 } 2553 1.1 bjh21 #endif 2554 1.1 bjh21 else if ( ( strcmp( argPtr, "nearesteven" ) == 0 ) 2555 1.1 bjh21 || ( strcmp( argPtr, "nearest_even" ) == 0 ) ) { 2556 1.1 bjh21 roundingMode = ROUND_NEAREST_EVEN; 2557 1.1 bjh21 } 2558 1.1 bjh21 else if ( ( strcmp( argPtr, "tozero" ) == 0 ) 2559 1.1 bjh21 || ( strcmp( argPtr, "to_zero" ) == 0 ) ) { 2560 1.1 bjh21 roundingMode = ROUND_TO_ZERO; 2561 1.1 bjh21 } 2562 1.1 bjh21 else if ( strcmp( argPtr, "down" ) == 0 ) { 2563 1.1 bjh21 roundingMode = ROUND_DOWN; 2564 1.1 bjh21 } 2565 1.1 bjh21 else if ( strcmp( argPtr, "up" ) == 0 ) { 2566 1.1 bjh21 roundingMode = ROUND_UP; 2567 1.1 bjh21 } 2568 1.1 bjh21 else if ( strcmp( argPtr, "tininessbefore" ) == 0 ) { 2569 1.1 bjh21 tininessMode = TININESS_BEFORE_ROUNDING; 2570 1.1 bjh21 } 2571 1.1 bjh21 else if ( strcmp( argPtr, "tininessafter" ) == 0 ) { 2572 1.1 bjh21 tininessMode = TININESS_AFTER_ROUNDING; 2573 1.1 bjh21 } 2574 1.1 bjh21 else if ( strcmp( argPtr, "all1" ) == 0 ) { 2575 1.1 bjh21 functionArgument = TRUE; 2576 1.1 bjh21 functionCode = 0; 2577 1.1 bjh21 operands = 1; 2578 1.1 bjh21 } 2579 1.1 bjh21 else if ( strcmp( argPtr, "all2" ) == 0 ) { 2580 1.1 bjh21 functionArgument = TRUE; 2581 1.1 bjh21 functionCode = 0; 2582 1.1 bjh21 operands = 2; 2583 1.1 bjh21 } 2584 1.1 bjh21 else if ( strcmp( argPtr, "all" ) == 0 ) { 2585 1.1 bjh21 functionArgument = TRUE; 2586 1.1 bjh21 functionCode = 0; 2587 1.1 bjh21 operands = 0; 2588 1.1 bjh21 } 2589 1.1 bjh21 else { 2590 1.1 bjh21 for ( functionCode = 1; 2591 1.1 bjh21 functionCode < NUM_FUNCTIONS; 2592 1.1 bjh21 ++functionCode 2593 1.1 bjh21 ) { 2594 1.1 bjh21 if ( strcmp( argPtr, functions[ functionCode ].name ) == 0 ) { 2595 1.1 bjh21 break; 2596 1.1 bjh21 } 2597 1.1 bjh21 } 2598 1.1 bjh21 if ( functionCode == NUM_FUNCTIONS ) { 2599 1.1 bjh21 fail( "Invalid option or function `%s'", argv[ 0 ] ); 2600 1.1 bjh21 } 2601 1.1 bjh21 functionArgument = TRUE; 2602 1.1 bjh21 } 2603 1.1 bjh21 --argc; 2604 1.1 bjh21 ++argv; 2605 1.1 bjh21 } 2606 1.1 bjh21 if ( ! functionArgument ) fail( "Function argument required" ); 2607 1.1 bjh21 if ( functionCode ) { 2608 1.1 bjh21 timeFunction( 2609 1.1 bjh21 functionCode, roundingPrecision, roundingMode, tininessMode ); 2610 1.1 bjh21 } 2611 1.1 bjh21 else if ( operands == 1 ) { 2612 1.1 bjh21 for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode 2613 1.1 bjh21 ) { 2614 1.1 bjh21 if ( functions[ functionCode ].numInputs == 1 ) { 2615 1.1 bjh21 timeFunction( 2616 1.1 bjh21 functionCode, roundingPrecision, roundingMode, tininessMode 2617 1.1 bjh21 ); 2618 1.1 bjh21 } 2619 1.1 bjh21 } 2620 1.1 bjh21 } 2621 1.1 bjh21 else if ( operands == 2 ) { 2622 1.1 bjh21 for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode 2623 1.1 bjh21 ) { 2624 1.1 bjh21 if ( functions[ functionCode ].numInputs == 2 ) { 2625 1.1 bjh21 timeFunction( 2626 1.1 bjh21 functionCode, roundingPrecision, roundingMode, tininessMode 2627 1.1 bjh21 ); 2628 1.1 bjh21 } 2629 1.1 bjh21 } 2630 1.1 bjh21 } 2631 1.1 bjh21 else { 2632 1.1 bjh21 for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode 2633 1.1 bjh21 ) { 2634 1.1 bjh21 timeFunction( 2635 1.1 bjh21 functionCode, roundingPrecision, roundingMode, tininessMode ); 2636 1.1 bjh21 } 2637 1.1 bjh21 } 2638 1.1 bjh21 return EXIT_SUCCESS; 2639 1.1 bjh21 2640 1.1 bjh21 } 2641 1.1 bjh21 2642