timesoftfloat.c revision 1.1 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