blob: f149d8a6c44efcc4990d37f4e77b2b8a73d3d696 [file] [log] [blame]
Elliott Hughesa0664b92017-04-18 17:46:52 -07001/*
2 * ppc64_helpers.h
Elliott Hughesed398002017-06-21 14:41:24 -07003 * Copyright (C) 2016-2017 Will Schmidt <will_schmidt@vnet.ibm.com>
Elliott Hughesa0664b92017-04-18 17:46:52 -07004 *
5 * This file contains helper functions for the ISA 3.0 test suite.
6 */
7
8/*
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License V2
11 * as published by the Free Software Foundation
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23#include "tests/malloc.h" // memalign32
24
25typedef uint64_t HWord_t;
26
27#if defined (DEBUG_ARGS_BUILD)
28#define AB_DPRINTF(fmt, args...) do { fprintf(stderr, fmt , ##args); } while (0)
29#else
30#define AB_DPRINTF(fmt, args...) do { } while (0)
31#endif
32
33/* Exhaustive tests?
34 * Due to the excessive size of the test results, allow a #ifdef to
35 * enable/disable most of the input values.
36 * Off by default.
37 */
38// #define EXHAUSTIVE_TESTS 1
39
40
41#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
42
43#define SET_CR(_arg) \
44 __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR );
45
46#define SET_CR0_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x80,%0 " : : "b" (_arg):"cr0");
47#define SET_CR1_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x40,%0 " : : "b" (_arg):"cr1");
48#define SET_CR2_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x20,%0 " : : "b" (_arg):"cr2");
49#define SET_CR3_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x10,%0 " : : "b" (_arg):"cr3");
50#define SET_CR4_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x08,%0 " : : "r" (_arg):"cr4");
51#define SET_CR5_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x04,%0 " : : "r" (_arg):"cr5");
52#define SET_CR6_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x02,%0 " : : "r" (_arg):"cr6");
53#define SET_CR7_FIELD(_arg) __asm__ __volatile__ ("mtocrf 0x01,%0 " : : "r" (_arg):"cr7");
54
55#define SET_XER(_arg) \
56 __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
57
58#define GET_CR(_lval) \
59 __asm__ __volatile__ ("mfcr %0" : "=b"(_lval) )
60
61#define GET_XER(_lval) \
62 __asm__ __volatile__ ("mfxer %0" : "=b"(_lval) )
63
64#define SET_CR_ZERO \
65 SET_CR(0)
66
67#define SET_FPSCR_ZERO \
68 do { \
69 double _d = 0.0; \
70 __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
71 } while (0);
72
73#define GET_FPSCR(_arg) \
74 __asm__ __volatile__ ("mffs %0" : "=f"(_arg) );
75
76/* The bit definitions for the FPSCR are as follows.
77Bit(s) Description
780:31 Reserved
7932 Floating-Point Exception Summary (FX)
8033 Floating-Point Enabled Exception Summary (FEX)
8134 Floating-Point Invalid Operation Exception Summary (VX)
8235 Floating-Point Overflow Exception (OX)
8336 Floating-Point Underflow Exception (UX)
8437 Floating-Point Zero Divide Exception (ZX)
8538 Floating-Point Inexact Exception (XX)
8639 Floating-Point Invalid Operation Exception (SNaN) (VXSNAN)
8740 Floating-Point Invalid Operation Exception (∞ - ∞) (VXISI)
8841 Floating-Point Invalid Operation Exception (∞ ÷ ∞) (VXIDI)
8942 Floating-Point Invalid Operation Exception (0 ÷ 0) (VXZDZ)
9043 Floating-Point Invalid Operation Exception (∞ × 0) (VXIMZ)
9144 Floating-Point Invalid Operation Exception (Invalid Compare) (VXVC)
9245 Floating-Point Fraction Rounded (FR)
9346 Floating-Point Fraction Inexact (FI)
9447:51 Floating-Point Result Flags (FPRF)
9547 Floating-Point Result Class Descriptor (C)
9648:51 Floating-Point Condition Code (FPCC)
97 48 Floating-Point Less Than or Negative (FL or <)
98 49 Floating-Point Greater Than or Positive (FG or >)
99 50 Floating-Point Equal or Zero (FE or =)
100 51 Floating-Point Unordered or NaN (FU or ?)
10152 Reserved
10253 Floating-Point Invalid Operation Exception (Software-Defined Condition) (VXSOFT)
10354 Floating-Point Invalid Operation Exception (Invalid Square Root) (VXSQRT)
10455 Floating-Point Invalid Operation Exception (Invalid Integer Convert) (VXCVI)
10556 Floating-Point Invalid Operation Exception Enable (VE)
10657 Floating-Point Overflow Exception Enable (OE)
10758 Floating-Point Underflow Exception Enable (UE)
10859 Floating-Point Zero Divide Exception Enable (ZE)
10960 Floating-Point Inexact Exception Enable (XE)
11061 Floating-Point Non-IEEE Mode (NI)
11162:63 Floating-Point Rounding Control (RN)
112 00 Round to Nearest
113 01 Round toward Zero
114 10 Round toward +Infinity
115 11 Round toward -Infinity
116*/
117/* NOTE, currently Valgrind only tracks the rounding mode, C and FPCC fields in the
118 * FPSCR register.
119 */
120
121static char * fpscr_strings[] = {
122" 0-RSVD", " 1-RSVD", " 2-RSVD", " 3-RSVD", " 4-RSVD", " 5-RSVD", " 6-RSVD",
123" 7-RSVD", " 8-RSVD", " 9-RSVD", "10-RSVD", "11-RSVD", "12-RSVD", "13-RSVD",
124"14-RSVD", "15-RSVD", "16-RSVD", "17-RSVD", "18-RSVD", "19-RSVD", "20-RSVD",
125"21-RSVD", "22-RSVD", "23-RSVD", "24-RSVD", "25-RSVD", "26-RSVD", "27-RSVD",
Elliott Hughesed398002017-06-21 14:41:24 -0700126"28-RSVD", "29-DRN0", "30-DRN1", "31-DRN2",
Elliott Hughesa0664b92017-04-18 17:46:52 -0700127/* 32 */ "FX", "FEX", "VX",
128/* 35 */ "OX", "UX", "ZX", "XX", "VXSNAN",
129/* 40 */ "VXISI (inf-inf)", "VXIDI (inf/inf)", "VXZDZ (0/0)",
130/* 43 */ "VXIMZ (inf*0)", "VXVC",
131/* 45 */ "FR", "FI",
132/* 47 */ "FPRF-C", "FPCC-FL", "FPCC-FG",
133/* 50 */ "FPCC-FE", "FPCC-FU",
134/* 52 */ "52-RSVD", "FXSOFT", "VXSQRT",
135/* 55 */ "VXCVI", "VE", "OE", "UE", "ZE",
136/* 60 */ "XE", "NI", "RN-bit62", "RN-bit63"
137};
138
139#define FPCC_C_BIT (0x1 << (63-47))
140#define FPCC_FL_BIT (0x1 << (63-48))
141#define FPCC_FG_BIT (0x1 << (63-49))
142#define FPCC_FE_BIT (0x1 << (63-50))
143#define FPCC_FU_BIT (0x1 << (63-51))
144#define FPCC_FPRF_MASK FPCC_C_BIT|FPCC_FL_BIT|FPCC_FG_BIT|FPCC_FE_BIT|FPCC_FU_BIT
145
146#define FPSCR_RN_BIT62 (0x1 << (63-62))
147#define FPSCR_RN_BIT63 (0x1 << (63-63))
148
149#define CRFIELD_BIT0 0x8
150#define CRFIELD_BIT1 0x4
151#define CRFIELD_BIT2 0x2
152#define CRFIELD_BIT3 0x1
153
154/* dissect_cr*:
155 * display the condition register bits in a
156 * human readable format.
157 */
158
159inline int cr_overflow_set(unsigned this_cr) {
160 return (this_cr & CRFIELD_BIT3);
161}
162
163inline int cr_zero_set(unsigned this_cr) {
164 return (this_cr & CRFIELD_BIT2);
165}
166
167inline int cr_positive_set(unsigned this_cr) {
168 return (this_cr & CRFIELD_BIT1);
169}
170
171inline int cr_negative_set(unsigned this_cr) {
172 return (this_cr & CRFIELD_BIT0);
173}
174
175/* __dissect_cr takes a bitfield directly, not the full condition register.
176 * This is a helper for dissect_cr_rn.
177 */
178inline static void __dissect_cr(unsigned this_cr) {
179if (cr_negative_set(this_cr))
180 printf("%s(LT)", verbose ? " 0x1=Negative" : "");
181
182if (cr_positive_set(this_cr))
183 printf("%s(GT)", verbose ? " 0x2=Positive" : "");
184
185if (cr_zero_set(this_cr))
186 printf("%s(EQ)", verbose ? " 0x4=Zero" : "");
187
188if (cr_overflow_set(this_cr))
189 printf("%s(SO)", verbose ? " 0x8=Overflow" : "");
190}
191
192/* Extract one CR field */
193static int extract_cr_rn(unsigned long local_cr,unsigned long rn) {
194 unsigned int masked_cr;
195 unsigned long shifted_value;
196
197 shifted_value = local_cr >> ( ( (7 - rn) * 4 ) );
198 masked_cr = shifted_value & 0xf;
199 return masked_cr;
200}
201
202/* Display one CR field */
203static void dissect_cr_rn(unsigned long local_cr, unsigned long rn) {
204 unsigned int masked_cr;
205
206 masked_cr = extract_cr_rn(local_cr, rn);
207 __dissect_cr(masked_cr);
208}
209
210/* Display all of the CR fields... */
211static void dissect_cr(unsigned long local_cr) {
212 unsigned int crn;
213
214 for (crn = 0; crn < 8; crn++) {
215 dissect_cr_rn(local_cr, crn);
216 }
217}
218
219/* dissect the fpscr bits that are valid under valgrind.
Elliott Hughesed398002017-06-21 14:41:24 -0700220 * Valgrind tracks the C (FPSCR[47]), FPCC (FPSCR[48:51)
221 * DRN (FPSCR[29:31]) and RN (FPSCR[62:63]).
Elliott Hughesa0664b92017-04-18 17:46:52 -0700222 */
223static void dissect_fpscr_valgrind(unsigned long local_fpscr) {
224 int i;
Elliott Hughesed398002017-06-21 14:41:24 -0700225 long mybit;
Elliott Hughesa0664b92017-04-18 17:46:52 -0700226
Elliott Hughesed398002017-06-21 14:41:24 -0700227 /* Print DRN fields */
228 for (i = 29; i < 32; i++) {
229 mybit = 1LL << (63 - i);
230 if (mybit & local_fpscr) {
231 printf(" %s",fpscr_strings[i]);
232 }
233 }
234
235 /* Print C and FPCC fields */
Elliott Hughesa0664b92017-04-18 17:46:52 -0700236 for (i = 47; i < 52; i++) {
Elliott Hughesed398002017-06-21 14:41:24 -0700237 mybit = 1LL << (63 - i);
238 if (mybit & local_fpscr) {
239 printf(" %s",fpscr_strings[i]);
240 }
241 }
242
243 /* Print RN field */
244 for (i = 62; i < 64; i++) {
245 mybit = 1LL << (63 - i);
Elliott Hughesa0664b92017-04-18 17:46:52 -0700246 if (mybit & local_fpscr) {
247 printf(" %s",fpscr_strings[i]);
248 }
249 }
250}
251
252/* dissect the fpscr bits.
253 * This prints the entire FPSCR field. This is only called under higher
254 * verbosities, as valgrind does not track most of these bits.
255 */
256static void dissect_fpscr_raw(unsigned long local_fpscr) {
257/* Due to the additional involved logic, the rounding mode (RN) bits 61-62
258 * are handled within dissect_fpscr_rounding_mode(). */
259 int i;
Elliott Hughesed398002017-06-21 14:41:24 -0700260 long mybit;
Elliott Hughesa0664b92017-04-18 17:46:52 -0700261
262 for (i = 0; i < 61; i++) {
263 /* also note that the bit numbering is backwards. */
Elliott Hughesed398002017-06-21 14:41:24 -0700264 mybit = 1LL << (63 - i);
Elliott Hughesa0664b92017-04-18 17:46:52 -0700265 if (mybit & local_fpscr) {
266 printf(" %s", fpscr_strings[i]);
267 }
268 }
269}
270
271static void dissect_fpscr(unsigned long local_fpscr) {
272 if (verbose > 1) {
273 printf(" [[ fpscr:%lx ]] ", local_fpscr);
274 dissect_fpscr_raw(local_fpscr);
275 } else {
276 dissect_fpscr_valgrind(local_fpscr);
277 }
278}
279
280/* Display the rounding mode */
281static void dissect_fpscr_rounding_mode(unsigned long local_fpscr) {
282 /* special case handing for the rounding mode round-nearest (RN) bits. 62:63 */
283 printf("Rounding Mode: ");
284
285 if (local_fpscr & FPSCR_RN_BIT62)
286 if (local_fpscr & FPSCR_RN_BIT63)
287 /* 0b11 */ printf("RN-to--INF");
288 else
289 /* 0b10 */ printf("RN-to-+INF");
290 else
291 if (local_fpscr & FPSCR_RN_BIT63)
292 /* 0b01 */ printf("RN-to-Nearest");
293 else
294 /* 0b00 */ printf("RN-to-Zero");
295}
296
297/*
298 * Arithmetic, rounding, and Convert From Integer instructions will set
299 * bits in the FPCC field to indicate the class of the result.
300 * The table is described as follows;
301 flags / Result value class
302 C < > = ?
303 1 0 0 0 1 Quiet NaN
304 0 1 0 0 1 -Infinity
305 0 1 0 0 0 -Normalized Number
306 1 1 0 0 0 -Denormalized Number
307 1 0 0 1 0 -Zero
308 0 0 0 1 0 +Zero
309 1 0 1 0 0 +Denormalized Number
310 0 0 1 0 0 +Normalized Number
311 0 0 1 0 1 +Infinity
312*/
313
314static void dissect_fpscr_result_value_class(unsigned long local_fpscr) {
315 if (local_fpscr & FPCC_C_BIT) {
316 if (local_fpscr & FPCC_FL_BIT)
317 printf("-Denormalized");
318
319 else if (local_fpscr & FPCC_FG_BIT)
320 printf("+Denormalized");
321
322 else if (local_fpscr & FPCC_FE_BIT)
323 printf("-Zero ");
324
325 else if (local_fpscr & FPCC_FU_BIT)
326 printf("Quiet NaN ");
327
328 } else {
329 if (local_fpscr & FPCC_FL_BIT) {
330 if (local_fpscr & FPCC_FU_BIT)
331 printf("-Infinity ");
332
333 else
334 printf("-Normalized ");
335
336 } else if (local_fpscr & FPCC_FG_BIT) {
337 if (local_fpscr & FPCC_FU_BIT)
338 printf("+Infinity ");
339
340 else
341 printf("+Normalized ");
342
343 if (local_fpscr & FPCC_FE_BIT)
344 printf("+Zero ");
345 }
346 }
347}
348
349/* Interpret the fields in the FPCC as they apply to the DCMX checks.
350 * The 'Match' indicator will typically be evaluated by the caller.
351 *
352 * DMCX:
353 * DCMX bit / 0x value / Data Class
354 * 0 0x01 NaN
355 * 1 0x02 +Infinity
356 * 2 0x04 -Infinity
357 * 3 0x08 +Zero
358 * 4 0x10 -Zero
359 * 5 0x20 +Denormal
360 * 6 0x40 -Denormal
361 * 7 0x7f ALL bits set.
362*/
363
364static void dissect_fpscr_dcmx_indicator(unsigned long local_fpscr) {
365 if (verbose > 2) printf("fpscr_cc:%lx ", local_fpscr & (FPCC_FPRF_MASK) );
366
367 // See if the data class of the src value matches the set DCMX bits.
368 if (verbose > 1) printf("%s ", (local_fpscr&FPCC_FE_BIT) ? "Match":"");
369
370 // Display the sign bit of the src value.
371 if (verbose > 1) printf("SRC sign:%s ", (local_fpscr&FPCC_FL_BIT) ? "-" : "+");
372
373 // The src value can be either a SP or DP value, this indicates
374 // if it is a valid SP value.
375 if (verbose > 1) printf("%s ", (local_fpscr&FPCC_FE_BIT) ? "SP" : "");
376}
377
Elliott Hughesed398002017-06-21 14:41:24 -0700378/* dissect_xer helpers*/
379static char * xer_strings[] = {
380" 0-RSVD", " 1-RSVD", " 2-RSVD", " 3-RSVD", " 4-RSVD", " 5-RSVD", " 6-RSVD",
381" 7-RSVD", " 8-RSVD", " 9-RSVD", "10-RSVD", "11-RSVD", "12-RSVD", "13-RSVD",
382"14-RSVD", "15-RSVD", "16-RSVD", "17-RSVD", "18-RSVD", "19-RSVD",
383"20-RSVD", "21-RSVD", "22-RSVD", "23-RSVD", "24-RSVD", "25-RSVD",
384"26-RSVD", "27-RSVD", "28-RSVD", "29-RSVD", "30-RSVD", "31-RSVD",
385/* 32 */ "SO", "OV", "CA",
386/* 35 */ "35-RSVD", "36-RSVD", "37-RSVD", "38-RSVD", "39-RSVD",
387/* 40 */ "40-RSVD", "41-RSVD", "42-RSVD", "43-RSVD",
388/* 44 */ "OV32", "CA32",
389/* 46 */ "46-RSVD", "47-RSVD", "48-RSVD", "49-RSVD", "50-RSVD", "51-RSVD",
390 "52-RSVD", "53-RSVD", "54-RSVD", "55-RSVD", "56-RSVD",
391/* 57:63 # bytes transferred by a Load/Store String Indexed instruction. */
392 "LSI/SSI-0", "LSI/SSI-1", "LSI/SSI-2", "LSI/SSI-3",
393 "LSI/SSI-4", "LSI/SSI-5", "LSI/SSI-6",
394};
395
396/* Dissect the XER register contents.
397 */
398static void dissect_xer_raw(unsigned long local_xer) {
399 int i;
400 long mybit;
401
402 for (i = 0; i <= 63; i++) {
403 mybit = 1ULL << (63 - i); /* compensate for reversed bit numbering. */
404 if (mybit & local_xer)
405 printf(" %s", xer_strings[i]);
406 }
407}
408
409/* */
410static void dissect_xer(unsigned long local_xer) {
411 if (verbose > 1)
412 printf(" [[ xer:%lx ]]", local_xer);
413 dissect_xer_raw(local_xer);
414}
415
416
Elliott Hughesa0664b92017-04-18 17:46:52 -0700417/* DFP helpers for bcd-to-dpd, dpd-to-bcd, misc.
418 * pulled from vex/.../host_generic_simd64.c
419 */
420/*------------------------------------------------------------------*/
421/* Decimal Floating Point (DFP) helper functions */
422/*------------------------------------------------------------------*/
423#define NOT( x ) ( ( ( x ) == 0) ? 1 : 0)
424#define GET( x, y ) ( ( ( x ) & ( 0x1UL << ( y ) ) ) >> ( y ) )
425#define PUT( x, y ) ( ( x )<< ( y ) )
426
427static unsigned long dpb_to_bcd( unsigned long chunk )
428{
429 int a, b, c, d, e, f, g, h, i, j, k, m;
430 int p, q, r, s, t, u, v, w, x, y;
431 unsigned long value;
432
433 /* convert 10 bit densely packed BCD to BCD */
434 p = GET( chunk, 9 );
435 q = GET( chunk, 8 );
436 r = GET( chunk, 7 );
437 s = GET( chunk, 6 );
438 t = GET( chunk, 5 );
439 u = GET( chunk, 4 );
440 v = GET( chunk, 3 );
441 w = GET( chunk, 2 );
442 x = GET( chunk, 1 );
443 y = GET( chunk, 0 );
444
445 /* The BCD bit values are given by the following boolean equations.*/
446 a = ( NOT(s) & v & w ) | ( t & v & w & s ) | ( v & w & NOT(x) );
447 b = ( p & s & x & NOT(t) ) | ( p & NOT(w) ) | ( p & NOT(v) );
448 c = ( q & s & x & NOT(t) ) | ( q & NOT(w) ) | ( q & NOT(v) );
449 d = r;
450 e = ( v & NOT(w) & x ) | ( s & v & w & x ) | ( NOT(t) & v & x & w );
451 f = ( p & t & v & w & x & NOT(s) ) | ( s & NOT(x) & v ) | ( s & NOT(v) );
452 g = ( q & t & w & v & x & NOT(s) ) | ( t & NOT(x) & v ) | ( t & NOT(v) );
453 h = u;
454 i = ( t & v & w & x ) | ( s & v & w & x ) | ( v & NOT(w) & NOT(x) );
455 j = ( p & NOT(s) & NOT(t) & w & v ) | ( s & v & NOT(w) & x )
456 | ( p & w & NOT(x) & v ) | ( w & NOT(v) );
457 k = ( q & NOT(s) & NOT(t) & v & w ) | ( t & v & NOT(w) & x )
458 | ( q & v & w & NOT(x) ) | ( x & NOT(v) );
459 m = y;
460
461 value = PUT(a, 11) | PUT(b, 10) | PUT(c, 9) | PUT(d, 8) | PUT(e, 7)
462 | PUT(f, 6) | PUT(g, 5) | PUT(h, 4) | PUT(i, 3) | PUT(j, 2)
463 | PUT(k, 1) | PUT(m, 0);
464 return value;
465}
466#undef NOT
467#undef GET
468#undef PUT
469
470
471typedef union dfp_union {
472 _Decimal128 dec_val128;
473 struct {
474#if defined(VGP_ppc64le_linux)
475 unsigned long vall;
476 unsigned long valu;
477#else
478 unsigned long valu;
479 unsigned long vall;
480#endif
481 } u128;
482} dfp_val_t;
483
484/* Based on and enhanced from the dfp128_vals table in test_dfp5.c.
485 * Todo: Refine/refactor and turn into a build_table function.
486 */
487
488static unsigned long dfp128_vals[] = {
489#ifdef EXHAUSTIVE_TESTS
490 // Some finite numbers
491 0x2208000000000000ULL, 0x0000000000000001ULL, // 1 *10^0
492 0xa208800000000000ULL, 0x0000000000000001ULL, // -1 *10^1
493 0x0000000000000000ULL, 0x0000000000000001ULL, // 1 *10^-6176. (smallest exp)
494 0x43ffc00000000000ULL, 0x0000000000000001ULL, // 1 *10^6111
495 0x6fffc00000000000ULL, 0x0000000000000001ULL, // foo *10^2015.
496 0x67ffc00000000000ULL, 0x0000000000000001ULL, // foo *10^-2081.
497 0x77ffc00000000000ULL, 0x0000000000000001ULL, // 1 *10^6111 (largest exp)
498 0x77ffffffffffffffULL, 0xffffffffffffffffULL, // max possible value *10^6111 (largest exp)
499 0x0000000000000000ULL, 0x0000000000000001ULL, // min possible value 1 *10^-6176. (smallest exp)
500 0x8000000000000000ULL, 0x0000000000000001ULL, // -1 *10^-6176. (smallest exp)
501
502 /* data bits sprinkled across the significand field. */
503 0xa208800001000000ULL, 0x0000000000010000ULL, //-foo *10^1
504 0xa208800000000100ULL, 0x0000000000000100ULL, //-foo *10^1
505 0xa208800000000000ULL, 0x0000100000000000ULL, //-foo *10^1
506 0xa208800000000000ULL, 0x0000000001000000ULL, //-foo *10^1
507 0xa208800000000000ULL, 0x0000000000000001ULL, //-foo *10^1
508
509 // pre-existing dfp128 values:
510 0x2207c00000000000ULL, 0x0000000000000e50ULL, // foo * 10^-1
511 0x2207c00000000000ULL, 0x000000000014c000ULL, // foo * 10^-1
512 0xa207c00000000000ULL, 0x00000000000000e0ULL, // foo * 10^-1
513 0x2206c00000000000ULL, 0x00000000000000cfULL, // foo * 10^-5
514 0xa205c00000000000ULL, 0x000000010a395bcfULL, // foo * 10^-9
515 0x6209400000fd0000ULL, 0x00253f1f534acdd4ULL, // foo * 10^-4091
516 0x000400000089b000ULL, 0x0a6000d000000049ULL, // very small number // foo * 10^-6160
517
518 // flavors of zero
519 0x2208000000000000ULL, 0x0000000000000000ULL, // 0*10^256
520 0xa208000000000000ULL, 0x0000000000000000ULL, // -0*10^0
521 0xa248000000000000ULL, 0x0000000000000000ULL, // 0*10^256
522
523 // flavors of NAN
524 0x7c00000000000000ULL, 0x0000000000000000ULL, // quiet
525 0xfc00000000000000ULL, 0xc00100035b007700ULL, // NAN
526 0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling NAN
527
528 // flavors of Infinity
529 0x7800000000000000ULL, 0x0000000000000000ULL, // +inf
530 0xf800000000000000ULL, 0x0000000000000000ULL, // -inf
531 0xf900000000000000ULL, 0x0000000000000000ULL // -inf
532#else
533 0x2208000000000000ULL, 0x0000000000000001ULL, // 1 *10^0
534 0x77ffffffffffffffULL, 0xffffffffffffffffULL, // max possible value *10^6111 (largest exp)
535 0xa208000000000000ULL, 0x0000000000000000ULL, // -0*10^0
536 0xfc00000000000000ULL, 0xc00100035b007700ULL, // NAN
537 0x7e00000000000000ULL, 0xfe000000d0e0a0d0ULL, // signaling NAN
538 0xf800000000000000ULL, 0x0000000000000000ULL, // -inf
539#endif
540};
541
542#define NUM_DFP128_VALS (sizeof(dfp128_vals) / 8)
543unsigned long nb_dfp128_vals = NUM_DFP128_VALS;
544
545/* Todo: update dfp64_vals to match dfp128_vals content. */
546
547static unsigned long dfp64_vals[] = {
548#ifdef EXHAUSTIVE_TESTS
549 0x77fcffffffffffffULL, // max possible value 9..9 *10^369 (largest exp)
550 0x0000000000000001ULL, // min possible nonzero value 1 *10^-398. (smallest exp)
551 0x4248000000000001ULL, // 1*10^260
552 0x2234000000000e50ULL, // foo*10^-1
553 0x223400000014c000ULL, //
554 0xa2340000000000e0ULL, //
555 0x22240000000000cfULL, // foo*10^-5
556 0xa21400010a395bcfULL, // negative -foo*10^-9
557 0x6e4d3f1f534acdd4ULL, // huge number foo*10^5
558 0x000400000089b000ULL, // very small number foo*10^-397
559
560 // flavors of zero
561 0x2238000000000000ULL,
562 0xa238000000000000ULL, // 0 * 10 ^0
563 0x4248000000000000ULL, // 0 * 10 ^260
564
565 // flavors of NAN
566 0x7e34000000000111ULL, //signaling NaN
567 0xfe000000d0e0a0d0ULL, //signaling NaN
568 0xfc00000000000000ULL, //quiet NaN
569
570 // flavors of Infinity
571 0x7800000000000000ULL, //+Inf
572 0xf800000000000000ULL, //-Inf
573 0x7a34000000000000ULL, //+Inf
574#else
575 0x77fcffffffffffffULL, // max possible value 9..9 *10^369 (largest exp)
576 0x4248000000000000ULL, // 0 * 10 ^260
577 0xfe000000d0e0a0d0ULL, //signaling NaN
578 0xf800000000000000ULL, //-Inf
579#endif
580};
581
582#define NUM_DFP64_VALS (sizeof(dfp64_vals) / 8)
583unsigned long nb_dfp64_vals = NUM_DFP64_VALS;
584
585/* shift helpers */
586#define SH_0 0
587#define SH_1 1
588#define SH_2 15
589#define SH_3 63
590
591static uint64_t shift_amounts[] = {
592 SH_0,
593 SH_1,
594 SH_2,
595 SH_3,
596#define SHIFT_ARRAY_SIZE 4
597};
598
599/* vector splat helpers */
600#define SPLAT0 0
601#define SPLAT1 1
602#define SPLAT2 0xaa
603#define SPLAT3 0x55
604#define SPLAT4 0xff
605
606static uint64_t splat_values[] = {
607 SPLAT0,
608 SPLAT1,
609 SPLAT2,
610 SPLAT3,
611 SPLAT4,
612#define SPLAT_ARRAY_SIZE 5
613};
614
615/* a small memory range used to test load-from and store-to vsx */
616#define BUFFER_SIZE 4
617#define MAX_BUFFER_PATTERNS 6
618unsigned long buffer[BUFFER_SIZE];
619
620static void initialize_buffer(int t)
621{
622 int x;
623
624 for (x = 0; x < BUFFER_SIZE; x++)
625 /* Don't want each of the 32-bit chunks to be identical. Loads of a
626 * byte from the wrong 32-bit chuck are not detectable if the chunks
627 * are identical.
628 */
629 switch((t+x)%BUFFER_SIZE) {
630 case 0:
631 buffer[x] = 0xffffffffffffffff;
632 break;
633 case 1:
634 buffer[x] = 0x0001020304050607;
635 break;
636 case 2:
637 buffer[x] = 0x5555555555555555;
638 break;
639 case 3:
640 buffer[x] = 0x0000000000000000;
641 break;
642 case 4:
643 buffer[x] = 0x5a05a05a05a05a05;
644 break;
645 case 5:
646 buffer[x] = 0x0102030405060708;
647 break;
648 default:
649 buffer[x] = 0x1010101010101010;
650 break;
651 }
652}
653
654#define PATTERN_SIZE 5
655unsigned long pattern[PATTERN_SIZE] = {
656 0xffffffffffffffff,
657 0xaaaaaaaaaaaaaaaa,
658 0x5152535455565758,
659 0x0000000000000000,
660 0xffaa5599113377cc,
661};
662
663
664static void dump_small_buffer(void) {
665 int x;
666
667 printf("[ ");
668
669 for (x = 0; x < BUFFER_SIZE; x++)
670 printf("%016lx ", buffer[x] );
671
672 printf("]");
673}
674
675/* value to be shifted */
676static uint64_t values_to_shift[] = {
677 0x0,
678 0x1,
679 0x10,
680 0x100,
681 0x1000,
682 0x10000,
683 0x100000,
684 0x1000000,
685 0x10000000,
686 0x100000000,
687 0x1000000000,
688 0x10000000000,
689 0x100000000000,
690 0x1000000000000,
691 0x10000000000000,
692 0x100000000000000,
693 0x1000000000000000,
694 0xf,
695 0x1f,
696 0x10f,
697 0x100f,
698 0x1000f,
699 0x10000f,
700 0x100000f,
701 0x1000000f,
702 0x10000000f,
703 0x100000000f,
704 0x1000000000f,
705 0x10000000000f,
706 0x100000000000f,
707 0x1000000000000f,
708 0x10000000000000f,
709 0x100000000000000f,
710 0x7,
711 0x70,
712 0x700,
713 0x7000,
714 0x70000,
715 0x700000,
716 0x7000000,
717 0x70000000,
718 0x700000000,
719 0x7000000000,
720 0x70000000000,
721 0x700000000000,
722 0x7000000000000,
723 0x70000000000000,
724 0x700000000000000,
725 0x7000000000000000,
726 0x8,
727 0x80,
728 0x800,
729 0x8000,
730 0x80000,
731 0x800000,
732 0x8000000,
733 0x80000000,
734 0x800000000,
735 0x8000000000,
736 0x80000000000,
737 0x800000000000,
738 0x8000000000000,
739 0x80000000000000,
740 0x800000000000000,
741 0x8000000000000000,
742 0xffffffffffffffff,
743 0
744#define SHIFT_VALUES_SIZE 66
745};
746
747/* DFP related helper functions: */
748
749/* For DFP finite numbers, the combination field (G field) is a
750 * combination of the exponent and the LMD (Left Most Digit) of the
751 * significand. The fields are encoded/decoded as described in the
752 * table here.
753 * 00 01 10 -< Exponent bits.
754 * 0: 00000 01000 10000
755 * ...
756 * 7: 00111 01111 10111
757 * 8: 11000 11010 11100
758 * 9: 11001 11011 11101 (encoded special field).
759 * |
760 * ^ LMD value.
761*/
762#define DFP_GFIELD_MASK 0x7c00000000000000UL
763#define DFP_GFIELD_SHIFT 58
764
765static unsigned int special_field_LMD(uint64_t dword1) {
766 unsigned long g_field_specials;
767 int left_two_bits;
768 int right_three_bits;
769
770 g_field_specials = (dword1 & DFP_GFIELD_MASK) >> DFP_GFIELD_SHIFT;
771 left_two_bits = (g_field_specials & 0x18) >> 3;
772 right_three_bits = g_field_specials & 0x07;
773
774 /* The LMD result maps directly to the right_three_bits value as
775 * long as the left two bits are 0b00,0b01,0b10. So a compare
776 * against 3 is sufficient to determine if we can return the right
777 * three bits directly. (LMD values 0..7).
778 */
779 if (left_two_bits < 3) {
780 return (right_three_bits);
781 }
782
783 /* LMD values of 8 or 9 require a bit of swizzle, but a check of
784 * the right-most bit is sufficient to determine whether LMD value
785 * is 8 or 9.
786 */
787 if (right_three_bits & 0x1)
788 return 9;
789 else
790 return 8;
791}
792
793/* Returns the exponent bits, as decoded from the G field. */
794static inline int special_field_exponent_bits(unsigned long dword1) {
795 unsigned long g_field_specials;
796 int left_two_bits;
797 int right_three_bits;
798
799 g_field_specials = (dword1 & DFP_GFIELD_MASK) >> DFP_GFIELD_SHIFT;
800 left_two_bits = (g_field_specials & 0x18) >> 3;
801 right_three_bits = g_field_specials & 0x07;
802
803 /* The special field exponent bits maps directly to the left_two_bits
804 * value as long as the left two bits are 0b00,0b01,0b10. So a compare
805 * against 3 is sufficient for those values.
806 */
807 if (left_two_bits < 3) {
808 return (left_two_bits);
809 }
810
811 switch(right_three_bits) {
812 case 0:
813 case 1: return 0x0;
814 case 2:
815 case 3: return 0x1;
816 case 4:
817 case 5: return 0x2;
818 case 6: /* Infinity */ return 0x0;
819 case 7: /* NaN */ return 0x0;
820 }
821 return -1; /* should never hit this */
822}
823
824/* get_declet(). Return a 10-bit declet, beginning at the 'start'
825 * offset.
826 *
827 * | dword1 | dword0 |
828 * | 0 63|64 127|
829 */
830#define TEN_BITS 0x03ffULL
831
832static inline int get_declet(int start, uint64_t dword1, uint64_t dword0) {
833 unsigned long local_declet;
834 unsigned int dword0_shift;
835 unsigned int dword1_shift;
836
837 dword1_shift = 63 - (start + 9);
838 dword0_shift = 127 - (start + 9);
839
840 if (verbose>5) printf("\n%s (%d) %016lx %016lx",
841 __FUNCTION__, start, dword1, dword0);
842
843 if ((start + 9) < 63) { /* fully within dword1 */
844 local_declet = (dword1 >> dword1_shift) & TEN_BITS;
845
846 } else if (start >= 65) {/* fully within dword0 */
847 local_declet = (dword0 >> dword0_shift) & TEN_BITS;
848
849 } else { /* straddling the two dwords*/
850 unsigned long mask_dword0;
851 unsigned long mask_dword1;
852
853 mask_dword1 = TEN_BITS >> (64 - dword0_shift);
854 mask_dword0 = TEN_BITS << (dword0_shift);
855 local_declet =
856 ((dword1 & mask_dword1) << (64-dword0_shift)) +
857 ((dword0 & mask_dword0) >> dword0_shift);
858 }
859 return local_declet;
860}
861
862static int get_bcd_digit_from_dpd(int start, uint64_t dword1,
863 uint64_t dword0) {
864 long bcd_digit;
865 long declet;
866
867 declet = get_declet(start, dword1, dword0);
868 bcd_digit = dpb_to_bcd(declet);
869 return bcd_digit;
870}
871
872
873/* The 'exponent left' shift is for moving the leftmost two bits
874 * of the exponent down to where they can be easily merged with the
875 * rest of the exponent.
876 */
877#define DFP128_EXPONENT_RIGHT_MASK 0x03ffc00000000000
878#define DFP64_EXPONENT_RIGHT_MASK 0x03fc000000000000
879#define DFP128_EXPONENT_RIGHT_MASK_SHIFT 46
880#define DFP64_EXPONENT_RIGHT_MASK_SHIFT 50
881#define DFP128_EXPONENT_LEFT_SHIFT 12
882#define DFP64_EXPONENT_LEFT_SHIFT 8
883
884#define DFP_NAN 0x1f
885#define DFP_INF 0x1e
886#define DFP_SIGNALING_NAN_BIT 0x0200000000000000
887
888/* Start of the Trailing Significand field is at bit # .. */
889#define DFP128_T_START 18
890#define DFP64_T_START 14
891
892//The exponent bias value is 101 for DFP Short, 398
893//for DFP Long, and 6176 for DFP Extended.
894#define DFP128_EXPONENT_BIAS 6176
895#define DFP64_EXPONENT_BIAS 398
896
897/* return the dfp exponent from the leading dword. */
898static inline signed long dfp128_exponent(unsigned long dword1) {
899 unsigned long exponent_left;
900 unsigned long exponent_right;
901 unsigned long biased_exponent;
902 signed long exponent;
903
904 exponent_left = special_field_exponent_bits(dword1);
905 exponent_right = (dword1 & DFP128_EXPONENT_RIGHT_MASK);
906 biased_exponent = (exponent_left << DFP128_EXPONENT_LEFT_SHIFT) +
907 (exponent_right >> DFP128_EXPONENT_RIGHT_MASK_SHIFT);
908
909 /* Unbias the exponent. */
910 exponent = biased_exponent - DFP128_EXPONENT_BIAS;
911
912 return exponent;
913}
914
915/* Interpret the paired 64-bit values as a extended (quad) 128 bit DFP.
916 *
917 * | Significand | Combination Field/ | |
918 * | sign bit | Encoded Exponent | remainder of significand |
919 * |0 |1 17|18 127|
920 * ^ (bit0) Significand sign bit.
921 * ^ (bit 1:17) Combination field. Contains high bits of
922 * exponent (encoded), LMD of significand (encoded),
923 * and the remainder of the exponent. First five bits
924 * will indicate special cases NAN or INF.
925 * ^ (bit 18:127) Remainder of the
926 * significand.
927 */
928
929#define DFP128_COMBINATION_MASK 0x7fffc
930#define DFP64_COMBINATION_MASK 0x7ffc
931#define DFP128_COMBINATION_SHIFT 46
932#define DFP64_COMBINATION_SHIFT 50
933#define DFP_SPECIAL_SYMBOLS_MASK 0x1f
934#define DFP_SPECIAL_SYMBOLS_SHIFT 58
935
936static inline void dissect_dfp128_float(uint64_t dword1, uint64_t dword0) {
937 long signbit;
938 signed long exponent;
939 unsigned long gfield_special_symbols;
940 unsigned long lmd_digit;
941 unsigned long bcd_digits[13];
942 int i;
943 int silent=0; // suppress leading zeros from the output.
944
945 if (verbose > 5) printf("RAW128: %016lx %016lx ", dword1, dword0);
946
947 signbit = (dword1 >> 63);
948
949 if (signbit) printf("-");
950 else printf("+");
951
952 gfield_special_symbols =
953 ((dword1 >> DFP_SPECIAL_SYMBOLS_SHIFT) & DFP_SPECIAL_SYMBOLS_MASK);
954
955 switch (gfield_special_symbols) {
956 case DFP_INF:
957 printf( "inf ");
958 break;
959
960 case DFP_NAN:
961 if (dword1 & DFP_SIGNALING_NAN_BIT)
962 printf("SNaN ");
963 else
964 printf("QNaN ");
965 break;
966
967 default:
968 printf( "Finite ");
969 exponent = dfp128_exponent(dword1);
970 lmd_digit = special_field_LMD(dword1);
971
972 for (i = 0; i < 11; i++) {
973 bcd_digits[i] = get_bcd_digit_from_dpd((DFP128_T_START
974 + 10 * i), dword1, dword0);
975 }
976
977 if (lmd_digit) {
978 silent++;
979 printf("%01lx", lmd_digit);
980
981 } else {
982 printf(" ");
983 }
984
985 for (i = 0; i < 11; i++) {
986 if (bcd_digits[i] || silent ) {
987 silent++;
988 printf("%03lx", bcd_digits[i]);
989
990 } else {
991 /* always print at least the last zero */
992 if (i == 10)
993 printf(" 0");
994
995 else
996 printf(" ");
997 }
998 }
999 printf(" * 10 ^ ");
1000 printf("%ld ", exponent);
1001 }
1002}
1003
1004/* Interpret the 64-bit values as a 64 bit DFP.
1005*
1006* | Significand | Combination Field/ | |
1007* | sign bit | Encoded Exponent | remainder of significand |
1008* |0 |1 13|14 63|
1009* ^ (bit0) Significand sign bit.
1010* ^ (bit 1:13) Combination field. Contains high bits of
1011* exponent (encoded), LMD of significand (encoded),
1012* and the remainder of the exponent. First five bits
1013* will indicate special cases NAN or INF.
1014* ^ (bit 14:63) Remainder of the
1015* significand.
1016*/
1017
1018/* return the dfp exponent from the leading dword. */
1019static inline signed long dfp64_exponent(unsigned long dword1) {
1020 unsigned long exponent_left;
1021 unsigned long exponent_right;
1022 unsigned long biased_exponent;
1023 signed long exponent;
1024
1025 exponent_left = special_field_exponent_bits(dword1);
1026 exponent_right = (dword1 & DFP64_EXPONENT_RIGHT_MASK);
1027 biased_exponent = (exponent_left << DFP64_EXPONENT_LEFT_SHIFT) +
1028 (exponent_right >> DFP64_EXPONENT_RIGHT_MASK_SHIFT);
1029
1030 /* Unbias the exponent. */
1031 exponent = biased_exponent - DFP64_EXPONENT_BIAS;
1032 return exponent;
1033}
1034
1035static inline void dissect_dfp64_float(uint64_t dword1) {
1036 long signbit;
1037 signed long exponent;
1038 unsigned long gfield_special_symbols;
1039 unsigned long lmd_digit;
1040 unsigned long bcd_digits[13];
1041 int i;
1042 int silent=0; // suppress leading zeros from the output.
1043
1044 if (verbose > 5) printf("RAW64: %016lx ", dword1);
1045
1046 signbit = (dword1 >> 63);
1047
1048 if (signbit) printf("-");
1049 else printf("+");
1050
1051 gfield_special_symbols =
1052 ((dword1 >> DFP_SPECIAL_SYMBOLS_SHIFT) & DFP_SPECIAL_SYMBOLS_MASK);
1053
1054 switch (gfield_special_symbols) {
1055 case DFP_INF:
1056 printf( "inf ");
1057 break;
1058
1059 case DFP_NAN:
1060 if (dword1 & DFP_SIGNALING_NAN_BIT)
1061 printf("SNaN ");
1062 else
1063 printf("QNaN ");
1064 break;
1065
1066 default:
1067 printf( "Finite ");
1068 exponent = dfp64_exponent(dword1);
1069 lmd_digit = special_field_LMD(dword1);
1070
1071 for (i = 0; i < 5; i++)
1072 bcd_digits[i] = get_bcd_digit_from_dpd((DFP64_T_START + 10 * i),
1073 dword1, 0);
1074
1075 if (lmd_digit) {
1076 silent++;
1077 printf("%01lx", lmd_digit);
1078
1079 } else {
1080 printf(" ");
1081 }
1082
1083 for (i = 0; i < 5; i++) {
1084 if (bcd_digits[i] || silent) {
1085 silent++;
1086 printf("%03lx", bcd_digits[i]);
1087
1088 } else { // suppress leading zeros.
1089 /* always print at least the last zero */
1090 if (i == 4)
1091 printf(" 0");
1092
1093 else
1094 printf(" ");
1095 }
1096 }
1097 printf(" * 10 ^ ");
1098 printf("%ld ", exponent);
1099 }
1100}
1101
1102static void dump_dfp128_table(void) {
1103 int i;
1104
1105 printf("DFP 128 table:\n");
1106
1107 for (i = 0; i < nb_dfp128_vals; i += 2) {
1108 printf("i=:%2d ", i);
1109 dissect_dfp128_float(dfp128_vals[i], dfp128_vals[i+1]);
1110 printf("\n");
1111 }
1112}
1113
1114static void dump_dfp64_table(void) {
1115 int i;
1116
1117 printf("DFP 64 table:\n");
1118
1119 for (i = 0; i<nb_dfp64_vals; i++) {
1120 printf("i=:%2d ", i);
1121 dissect_dfp64_float(dfp64_vals[i]);
1122 printf("\n");
1123 }
1124}
1125
1126
1127/* Data Formats for floating point.
1128 * Floating point values include the following:
1129 * -INF -NOR -DEN -0 +0 +DEN +NOR +INF
1130 * INFinite: When the biased exponent is the MAX possible value, and
1131 * the fraction field is 0.
1132 * ZERo. biased exponent is zero, fraction is 0.
1133 * DENormalized. biased exponent is 0, and fraction is non-zero.
1134 * NORmalized. All other values that are neither Zero, Denormalized,
1135 * or Infinite. Biased exponent=1..MAX-1.
1136 */
1137
1138/* Quad (128bit):
1139 * | Sign | EXPonent+Bias | FRACTION/Mantissa |
1140 * 0 1 15 16 127
1141 * exponent is 15 bits. ranging from: 0x0000 .. 0x7fff
1142 * 0 = (zero if fraction==0, DeNormal if fraction !=0 )
1143 * 1...0x7ffe = normalized
1144 * 7fff = (infinite if fraction==0, NaN if fraction !=0)
1145 */
1146#define QUAD_EXP_MASK 0x7fff
1147
1148/* This assumes we are working on the top half of a quad stored in a 64-bit
1149 * register.
1150 */
1151#define QUAD_EXP_SHIFT 48
1152#define QUAD_MANTISSA_MASK 0x0000ffffffffffff
1153static inline unsigned long build_binary128_float(unsigned long signbit,
1154 unsigned long exponent,
1155 unsigned long mantissa) {
1156 unsigned long thevalue;
1157
1158 thevalue = (unsigned long) (signbit << 63) |
1159 ((exponent & QUAD_EXP_MASK) << QUAD_EXP_SHIFT) |
1160 (mantissa & QUAD_MANTISSA_MASK);
1161
1162 if (verbose > 3)
1163 printf("%s %lx \n", __FUNCTION__, (unsigned long)thevalue);
1164
1165 return thevalue;
1166}
1167
1168 /* double (64bit):
1169 * | Sign | EXPonent+Bias | FRACTION/Mantissa |
1170 * 0 1 11 12 63
1171 * exponent is 11 bits. ranging from: 0x000 .. 0x7ff
1172 * 0 = (zero if fraction==0, DeNormal if fraction !=0 )
1173 * 1...0x7fe = normalized
1174 * 7ff = (infinite if fraction==0, NaN if fraction !=0)
1175*/
1176#define DOUBLE_EXP_MASK 0x7ff
1177#define DOUBLE_EXP_SHIFT 52
1178#define DOUBLE_MANTISSA_MASK 0x000fffffffffffff
1179
1180static inline unsigned long build_binary64_float(unsigned long signbit,
1181 unsigned long exponent,
1182 unsigned long mantissa) {
1183 unsigned long thevalue;
1184
1185 thevalue = (unsigned long ) (signbit << 63) |
1186 ((exponent & DOUBLE_EXP_MASK) << DOUBLE_EXP_SHIFT) |
1187 (mantissa & DOUBLE_MANTISSA_MASK );
1188
1189 if (verbose > 3)
1190 printf("%s %lx \n", __FUNCTION__, (unsigned long)thevalue);
1191
1192 return thevalue;
1193}
1194
1195 /* floating point single (32bit):
1196 * | Sign | EXPonent+Bias | FRACTION/Mantissa |
1197 * 0 1 8 9 31
1198 * exponent is 8 bits. ranging from: 0x00 .. 0xff
1199 * 0 = (zero if fraction==0, DeNormal if fraction !=0 )
1200 * 1...0x7e = normalized
1201 * 7f = (infinite if fraction==0, NaN if fraction !=0) */
1202#define SINGLE_EXP_MASK 0xff
1203#define SINGLE_EXP_SHIFT 23
1204#define SINGLE_MANTISSA_MASK 0x007fffff
1205
1206/* This is building the 32-bit float. */
1207static inline unsigned long build_binary32_float(unsigned long signbit,
1208 unsigned long exponent,
1209 unsigned long mantissa) {
1210 unsigned long thevalue;
1211 unsigned long local_signbit;
1212 unsigned long local_exponent;
1213 unsigned long local_mantissa;
1214
1215 local_signbit = (signbit != 0) << 31;
1216 local_exponent = ((exponent & SINGLE_EXP_MASK) << SINGLE_EXP_SHIFT);
1217 local_mantissa = (mantissa & SINGLE_MANTISSA_MASK);
1218
1219 thevalue = (unsigned long) (local_signbit) |
1220 (local_exponent) |
1221 (local_mantissa);
1222
1223 if (verbose > 3)
1224 printf("%s %lx \n", __FUNCTION__, (unsigned long)thevalue);
1225
1226 return thevalue;
1227}
1228
1229/* floating point half (16bit):
1230 * | Sign | EXPonent+Bias | FRACTION/Mantissa |
1231 * 0 1 6 7 15
1232 * exponent is 6 bits. 0x00 .. 0x7e masked with EXP_MASK
1233 * 0 = (zero if fraction==0, DeNormal if fraction !=0 )
1234 * 1...0x7d = normalized
1235 * 7e = (infinite if fraction==0, NaN if fraction !=0) */
1236/* when extracting the exponent from the 16-bit half-word, use this mask. */
1237#define HALF_EXP_MASK 0x7e00
1238
1239/* when building the 16-bit half-word, mask against this,
1240 * then shift into place
1241 */
1242#define HALF_EXP_MASK_NORMALIZED 0x3f
1243#define HALF_EXP_SHIFT 9
1244#define HALF_MANTISSA_MASK 0x01ff
1245
1246/* This is building the 16-bit float. */
1247static inline unsigned long build_binary16_float(unsigned long in_signbit,
1248 unsigned long exponent,
1249 unsigned mantissa) {
1250 unsigned long thevalue;
1251 unsigned long local_signbit;
1252 unsigned long local_exponent;
1253 unsigned long local_mantissa;
1254
1255 local_signbit = (in_signbit != 0) << 15;
1256
1257 local_exponent= ((exponent & HALF_EXP_MASK_NORMALIZED) << HALF_EXP_SHIFT);
1258 local_mantissa = (mantissa & HALF_MANTISSA_MASK);
1259
1260 thevalue = (unsigned long) (local_signbit) | (local_exponent)
1261 | (local_mantissa);
1262
1263 if (verbose > 3)
1264 printf("%s %lx \n", __FUNCTION__, (unsigned long)thevalue);
1265
1266 return thevalue;
1267}
1268
1269/* dissect_binary128_float:
1270 * Interpret the (high half) 64-bit value as normal/denormal/inf/NaN.
1271 * This is as it would be interpreted as the MSB portion of
1272 * a 128-bit wide QUAD.
1273 */
1274static inline void dissect_binary128_float(uint64_t value) {
1275 unsigned long signbit;
1276 unsigned long exponent;
1277 unsigned long mantissa;
1278
1279 signbit = (value >> 63);
1280 exponent = ( QUAD_EXP_MASK & (value >> QUAD_EXP_SHIFT));
1281 mantissa = ( QUAD_MANTISSA_MASK & value);
1282
1283 if (verbose > 4) printf("128 bit:");
1284
1285 if (signbit) printf("-");
1286 else printf("+");
1287
1288 switch (exponent) {
1289 case 0x0:
1290 if (mantissa == 0) printf("zero ");
1291 else printf("denormal ");
1292 break;
1293
1294 case QUAD_EXP_MASK:
1295 if (mantissa == 0) printf("inf ");
1296 else printf("NaN ");
1297 break;
1298
1299 default: printf("Normal ");
1300 }
1301
1302 if (verbose > 4)
1303 printf("%lx %4lx %16lx %16lx \n", signbit, exponent, mantissa, value);
1304}
1305
1306/* Interpret the 64-bit value as normal/denormal/inf/NaN
1307 * this is as interpreted as the 64-bit float
1308 */
1309static inline void dissect_binary64_float(uint64_t value) {
1310 unsigned long signbit;
1311 unsigned long exponent;
1312 unsigned long mantissa;
1313
1314 signbit = (value >> 63); // bit0
1315 exponent = ( DOUBLE_EXP_MASK & (value >> DOUBLE_EXP_SHIFT));
1316 mantissa = ( DOUBLE_MANTISSA_MASK & value);
1317
1318 if (verbose > 4) printf(" 64 bit:");
1319
1320 if (signbit) printf("-");
1321 else printf("+");
1322
1323 switch (exponent) {
1324 case 0x0:
1325 if (mantissa == 0) printf("zero ");
1326 else printf("denormal ");
1327 break;
1328
1329 case DOUBLE_EXP_MASK:
1330 if (mantissa == 0) printf("inf ");
1331 else printf("NaN ");
1332 break;
1333
1334 default: printf("Normal ");
1335 }
1336
1337 if (verbose>4)
1338 printf("%lx %4lx %16lx %16lx\n", signbit, exponent, mantissa, value);
1339}
1340
1341/* interpret the 32-bit value as normal/denormal/inf/NaN.
1342 * Note that the value is stored in the upper half of a
1343 * 64-bit, which is itself in the upper half of a quad.
1344 */
1345static inline void dissect_binary32_float(uint64_t value) {
1346 unsigned long signbit;
1347 unsigned long exponent;
1348 unsigned long mantissa;
1349 unsigned long adj_value;
1350
1351 /* shift down to where the offsets make more sense.*/
1352 adj_value = value; //>>32;
1353 signbit = (adj_value >> 31);
1354 exponent = ( SINGLE_EXP_MASK & (adj_value >> SINGLE_EXP_SHIFT));
1355 mantissa = ( SINGLE_MANTISSA_MASK & adj_value);
1356
1357 if (verbose > 4) printf(" 32 bit:");
1358
1359 if (signbit) printf("-");
1360 else printf("+");
1361
1362 switch (exponent) {
1363 case 0x0:
1364 if (mantissa == 0) printf("zero ");
1365 else printf("denormal ");
1366 break;
1367
1368 case SINGLE_EXP_MASK:
1369 if (mantissa == 0) printf("inf ");
1370 else printf("NaN ");
1371 break;
1372
1373 default: printf("Normal ");
1374 }
1375
1376 if (verbose>4)
1377 printf("%lx %4lx %16lx %16lx \n", signbit, exponent, mantissa, adj_value);
1378}
1379
1380/* Interpret the 16-bit value as normal/denormal/inf/NaN. */
1381static inline void dissect_binary16_float(uint64_t value) {
1382 unsigned long signbit;
1383 unsigned long exponent;
1384 unsigned long mantissa;
1385 unsigned long adj_value;
1386
1387 adj_value = (value & 0xffff);
1388 signbit = ((adj_value & 0x8000) > 1);
1389 exponent = ((adj_value & HALF_EXP_MASK ) >> HALF_EXP_SHIFT) ;
1390 mantissa = (adj_value & HALF_MANTISSA_MASK);
1391
1392 if (verbose > 4) printf(" 16 bit:");
1393
1394 if (signbit) printf("-");
1395 else printf("+");
1396
1397 switch (exponent) {
1398 case 0x0:
1399 if (mantissa == 0) printf("zero ");
1400 else printf("denormal ");
1401 break;
1402
1403 case HALF_EXP_MASK:
1404 if (mantissa == 0) printf("inf ");
1405 else printf("NaN ");
1406 break;
1407
1408 default: printf("Normal ");
1409 }
1410
1411 if (verbose > 4)
1412 printf("%lx %4lx %16lx %16lx \n",
1413 signbit, exponent>>HALF_EXP_SHIFT, mantissa, adj_value);
1414}
1415
1416#define dissect_double_as_32s(vec_foo) \
1417 printf(" "); \
1418 dissect_binary16_float((vec_foo & 0xffffffff)); \
1419 printf(" "); \
1420 dissect_binary16_float((vec_foo >> 32) & 0xffffffff);
1421
1422#define dissect_double_as_16s(vec_foo) \
1423 printf(" "); \
1424 dissect_binary16_float((vec_foo&0xffff)); \
1425 printf(" "); \
1426 dissect_binary16_float((vec_foo>>16)&0xffff); \
1427 printf(" "); \
1428 dissect_binary16_float((vec_foo>>32)&0xffff); \
1429 printf(" "); \
1430 dissect_binary16_float((vec_foo>>48)&0xffff);
1431
1432/* a table of exponent values for use in the float precision tests. */
1433unsigned long exponent_table[] = {
1434#ifdef EXHAUSTIVE_TESTS
1435 0x0000, /* +/-0 or +/-DENormalized, depending on associated mantissa. */
1436 0x1a, /* within NORmalized for 16,32,64,128-bit. */
1437 0x1f, /* +/-INF or +/-NaN for 16bit, NORmalized for 32,64,128 */
1438 0xff, /* +/-INF or +/-NaN for 32bit, NORmalized for 64,128 */
1439 0x7ff, /* +/-INF or +/-NaN for 32 and 64bit, NORmalized for 128 */
1440 0x7fff, /* +/-INF or +/-NaN for 128bit. */
1441#else
1442 0x0000, /* +/-0 or +/-DENormalized, depending on associated mantissa. */
1443 0xff, /* +/-INF or +/-NaN for 32bit, NORmalized for 64,128 */
1444 0x7ff, /* +/-INF or +/-NaN for 32 and 64bit, NORmalized for 128 */
1445 0x7fff, /* +/-INF or +/-NaN for 128bit. */
1446#endif
1447};
1448#define MAX_EXPONENTS (sizeof(exponent_table) / sizeof(unsigned long))
1449
1450unsigned long mantissa_table[] = {
1451#ifdef EXHAUSTIVE_TESTS
1452 0xbeefbeefbeef, /* NOR or DEN or NaN */
1453 0x000000000000, /* ZERO or INF */
1454 0x7fffffffffff, /* NOR or DEN or NaN */
1455#else
1456 0x000000000000, /* ZERO or INF */
1457 0x7fffffffffff, /* NOR or DEN or NaN */
1458#endif
1459};
1460#define MAX_MANTISSAS (sizeof(mantissa_table) / sizeof(unsigned long))
1461
1462/* build in 64-bit chunks, low doubleword is zero. */
1463static unsigned long * float_vsxargs;
1464static unsigned long * binary128_float_vsxargs = NULL;
1465static unsigned long * binary64_float_vsxargs = NULL;
1466static unsigned long * binary32_float_vsxargs = NULL;
1467static unsigned long * binary16_float_vsxargs = NULL;
1468
1469unsigned long nb_float_vsxargs;
1470
1471#define MAX_FLOAT_VSX_ARRAY_SIZE (((MAX_EXPONENTS * MAX_MANTISSAS) * 2 + 1) * 2)
1472
1473void build_float_vsx_tables (void)
1474{
1475 long i = 0;
1476 unsigned long signbit;
1477 unsigned long exponent;
1478 unsigned long mantissa;/* also referred to as FRACTION in the ISA.*/
1479 unsigned long exponent_index;
1480 unsigned long mantissa_index;
1481
1482 if (verbose > 2) printf("%s\n", __FUNCTION__);
1483
1484 binary128_float_vsxargs = malloc(MAX_FLOAT_VSX_ARRAY_SIZE
1485 * sizeof(unsigned long));
1486
1487 float_vsxargs = binary128_float_vsxargs;
1488
1489 binary64_float_vsxargs = malloc(MAX_FLOAT_VSX_ARRAY_SIZE
1490 * sizeof(unsigned long));
1491
1492 binary32_float_vsxargs = malloc(MAX_FLOAT_VSX_ARRAY_SIZE
1493 * sizeof(unsigned long));
1494 binary16_float_vsxargs = malloc(MAX_FLOAT_VSX_ARRAY_SIZE
1495 * sizeof(unsigned long));
1496
1497 for (signbit = 0; signbit < 2; signbit++) {
1498 for (exponent_index = 0; exponent_index < MAX_EXPONENTS;
1499 exponent_index++) {
1500
1501 for (mantissa_index = 0; mantissa_index < MAX_MANTISSAS;
1502 mantissa_index++) {
1503
1504 exponent = exponent_table[exponent_index];
1505 mantissa = mantissa_table[mantissa_index];
1506
1507 if (verbose > 2) {
1508 printf("signbit:%lx ", signbit);
1509 printf("exponent:%4lx ", exponent);
1510 printf("mantissa:%lx ", mantissa);
1511 printf("\n");
1512 }
1513
1514 binary128_float_vsxargs[i] = build_binary128_float(signbit, exponent,
1515 mantissa);
1516
1517 binary128_float_vsxargs[i+1] = 0;
1518
1519 binary64_float_vsxargs[i] = build_binary64_float(signbit, exponent,
1520 mantissa);
1521
1522 binary64_float_vsxargs[i+1] = build_binary64_float(signbit, exponent,
1523 mantissa);
1524
1525 binary32_float_vsxargs[i] = build_binary32_float(signbit, exponent,
1526 mantissa);
1527
1528 binary32_float_vsxargs[i+1] = build_binary32_float(signbit, exponent,
1529 mantissa);
1530
1531 binary16_float_vsxargs[i] = build_binary16_float(signbit, exponent,
1532 mantissa);
1533
1534 binary16_float_vsxargs[i+1] = build_binary16_float(signbit, exponent,
1535 mantissa);
1536 i += 2;
1537 }
1538 }
1539 }
1540 nb_float_vsxargs = i;
1541}
1542
1543/* Display entries stored in the float_vsx table. These are used as
1544 * quad/double/singles, stored as quads. */
1545void dump_float_vsx_table (void) {
1546 int i;
1547
1548 printf("Float VSX Table:");
1549 printf("128-bit (quad):\n");
1550
1551 for (i = 0; i < nb_float_vsxargs; i += 2) {
1552 printf("i =: %2d ", i);
1553 dissect_binary128_float(binary128_float_vsxargs[i]);
1554 }
1555
1556 printf("64-bit (double):\n");
1557
1558 for (i = 0; i< nb_float_vsxargs; i += 2) {
1559 printf("i = %2d ", i);
1560 dissect_binary64_float(binary64_float_vsxargs[i]);
1561 }
1562
1563 printf("32-bit (single):\n");
1564
1565 for (i = 0; i < nb_float_vsxargs; i += 2) {
1566 printf("i = %2d ", i);
1567 dissect_binary32_float(binary32_float_vsxargs[i]);
1568 }
1569
1570 printf("16-bit (half):\n");
1571
1572 for (i = 0; i < nb_float_vsxargs; i += 2) {
1573 printf("i =% 2d ", i);
1574 dissect_binary16_float(binary16_float_vsxargs[i]);
1575 }
1576
1577 printf("\n");
1578}
1579
1580static void print_dcmx_field(unsigned long local_dcmx) {
1581 /* Note - this splats out the local_dxmc field from the form used to
1582 * globally pass it, with a single set bit, into the functions that use
1583 * it. The actual DCMX field is a bit-field from 0x00 to 0x3f. If
1584 * multiple bits are ever set, this function and the way it is passed
1585 * into the users will need to be updated. This does not handle
1586 * multiple bits being set.
1587 */
1588
1589 printf(" DCMX=[");
1590
1591 switch(local_dcmx) {
1592 case 0: printf("ALL"); break;
1593 case 1: printf("NaN"); break;
1594 case 2: printf("+inf"); break;
1595 case 3: printf("-inf"); break;
1596 case 4: printf("+zero"); break;
1597 case 5: printf("-zero"); break;
1598 case 6: printf("+denormal"); break;
1599 case 7: printf("-denormal"); break;
1600 default: printf("other"); break;
1601 }
1602
1603 if (verbose > 3)
1604 printf(" %lx", local_dcmx);
1605
1606 printf("] ");
1607}
1608
1609#define MAX_CHAR_ARGS_ARRAY_SIZE 128
1610
1611static unsigned char * char_args;
1612unsigned long nb_char_args;
1613
1614static void build_char_table(void) {
1615 long i = 0;
1616 char ichar;
1617
1618 char_args = memalign(32, MAX_CHAR_ARGS_ARRAY_SIZE * sizeof(char));
1619
1620#ifdef EXHAUSTIVE_TESTS
1621 for (ichar = 'a'; ichar <= 'z'; ichar++) { char_args[i++] = ichar; }
1622 for (ichar = '0'; ichar <= '9'; ichar++) { char_args[i++] = ichar; }
1623 for (ichar = 'A'; ichar <= 'Z'; ichar++) { char_args[i++] = ichar; }
1624#else
1625 for (ichar = 'a'; ichar <= 'z'; ichar+=6) { char_args[i++] = ichar; }
1626 for (ichar = '0'; ichar <= '9'; ichar+=6) { char_args[i++] = ichar; }
1627 for (ichar = 'A'; ichar <= 'Z'; ichar+=6) { char_args[i++] = ichar; }
1628#endif
1629
1630 char_args[i++] = ' ';
1631 char_args[i++] = '+';
1632 char_args[i++] = '-';
1633 char_args[i++] = '/';
1634 char_args[i++] = '[';
1635 char_args[i++] = ']';
1636 char_args[i++] = '`';
1637 char_args[i++] = '_';
1638 nb_char_args = i;
1639}
1640
1641static void dump_char_table() {
1642 int i;
1643
1644 printf("Char Table:");
1645
1646 for (i = 0; i<nb_char_args; i++)
1647 printf("%c ", char_args[i]);
1648
1649 printf("\n");
1650}
1651
1652#define MAX_CHAR_RANGES_SIZE 128
1653
1654static unsigned char * char_ranges;
1655unsigned long nb_char_ranges;
1656
1657static void build_char_range_table(void) {
1658/* ... in groups of four. */
1659
1660 long i = 0;
1661 char char_start, char_end;
1662
1663 char_ranges = memalign(32, MAX_CHAR_RANGES_SIZE * sizeof(char));
1664 char_start = 'a';
1665 char_end = 'z';
1666 char_ranges[i++] = char_start;
1667 char_ranges[i++] = char_end;
1668
1669 char_start = 'A';
1670 char_end = 'Z';
1671 char_ranges[i++] = char_start;
1672 char_ranges[i++] = char_end;
1673
1674 char_start = '0';
1675 char_end = '9';
1676 char_ranges[i++] = char_start;
1677 char_ranges[i++] = char_end;
1678
1679 char_start = 'f';
1680 char_end = 'z';
1681 char_ranges[i++] = char_start;
1682 char_ranges[i++] = char_end;
1683
1684 char_start = 'a';
1685 char_end = 'e';
1686 char_ranges[i++] = char_start;
1687 char_ranges[i++] = char_end;
1688
1689 char_start = 'A';
1690 char_end = 'E';
1691 char_ranges[i++] = char_start;
1692 char_ranges[i++] = char_end;
1693
1694 nb_char_ranges = i;
1695}
1696
1697static void dump_char_range_table()
1698{
1699 int i;
1700
1701 printf("Char Range Table:");
1702
1703 for (i = 0; i < nb_char_ranges; i += 4) {
1704 printf(" [ %c-%c %c-%c ] ",
1705 char_ranges[i], char_ranges[i+1],
1706 char_ranges[i+2], char_ranges[i+3] );
1707 }
1708
1709 printf("\n");
1710}
1711
1712static HWord_t *iargs = NULL;
1713static int nb_iargs = 0;
1714
1715static void build_iargs_table (void) {
1716 uint64_t tmp;
1717 int i = 0;
1718
1719 iargs = malloc(20 * sizeof(HWord_t));
1720
1721 for (tmp = 0; ; tmp = 123456789*tmp + 123456789999) {
1722 if ((long)tmp < 0 )
1723 tmp = 0xFFFFFFFFFFFFFFFFULL;
1724
1725 iargs[i++] = tmp;
1726 AB_DPRINTF("val %016lx\n", tmp);
1727
1728 if (tmp == 0xFFFFFFFFFFFFFFFFULL)
1729 break;
1730 }
1731
1732 AB_DPRINTF("Registered %d iargs values\n", i);
1733 nb_iargs = i;
1734}
1735
1736static unsigned long * vsxargs = NULL;
1737unsigned long nb_vargs;
1738
1739#define MAX_VSX_ARRAY_SIZE 42
1740
1741static void build_vsx_table (void)
1742{
1743 long i = 0;
1744 // A VSX register is 128-bits wide.
1745 // We build contents here using pairs of 64-bit longs.
1746 // Permutes work against two (non-paired) VSX regs, so these are
1747 // also grouped by twos.
1748 vsxargs = memalign(16, MAX_VSX_ARRAY_SIZE * sizeof(unsigned long));
1749#ifdef EXHAUSTIVE_TESTS
1750 vsxargs[i++] = 0x0000000000000000UL; vsxargs[i++] = 0x0000000000000000UL;
1751 vsxargs[i++] = 0x0102030405060708UL; vsxargs[i++] = 0x0102010201020102UL;
1752
1753 vsxargs[i++] = 0xaaaaaaaaaaaaaaaaUL; vsxargs[i++] = 0xaaaaaaaaaaaaaaaaUL;
1754 vsxargs[i++] = 0x5555555555555555UL; vsxargs[i++] = 0x5555555555555555UL;
1755
1756 vsxargs[i++] = 0x08090a0b0c0d0e0fUL; vsxargs[i++] = 0x0102010201020102UL;
1757 vsxargs[i++] = 0xf0f1f2f3f4f5f6f7UL; vsxargs[i++] = 0xf8f9fafbfcfdfeffUL;
1758
1759 vsxargs[i++] = 0x7ea1a5a7abadb0baUL; vsxargs[i++] = 0x070d111d1e555e70UL;
1760 vsxargs[i++] = 0xe5e7ecedeff0f1faUL; vsxargs[i++] = 0xbeb1c0caced0dbdeUL;
1761
1762 vsxargs[i++] = 0x00115e7eadbabec0UL; vsxargs[i++] = 0xced0deede5ecef00UL;
1763 vsxargs[i++] = 0x00111e7ea5abadb1UL; vsxargs[i++] = 0xbecad0deedeffe00UL;
1764
1765 vsxargs[i++] = 0x0011223344556677UL; vsxargs[i++] = 0x8899aabbccddeeffUL;
1766 vsxargs[i++] = 0xf0e0d0c0b0a09080UL; vsxargs[i++] = 0x7060504030201000UL;
1767#else
1768 vsxargs[i++] = 0x0000000000000000UL; vsxargs[i++] = 0x0000000000000000UL;
1769 vsxargs[i++] = 0x0102030405060708UL; vsxargs[i++] = 0x0102010201020102UL;
1770
1771 vsxargs[i++] = 0x0011223344556677UL; vsxargs[i++] = 0x8899aabbccddeeffUL;
1772 vsxargs[i++] = 0xf0e0d0c0b0a09080UL; vsxargs[i++] = 0x7060504030201000UL;
1773#endif
1774
1775 // these next three groups are specific for vector rotate tests.
1776 // bits 11:15,19:23,27:31 of each 32-bit word contain mb,me,sh values.
1777 vsxargs[i++] = 0x0000100000001002ULL; vsxargs[i++] = 0x0000100800001010ULL;
1778 vsxargs[i++] = 0x0010100000101002ULL; vsxargs[i++] = 0x0010100800101010ULL;
1779
1780 // vector rotate special...
1781 vsxargs[i++] = 0x00001c0000001c02ULL; vsxargs[i++] = 0x00001c0800001c10ULL;
1782 vsxargs[i++] = 0x00101c0000101c02ULL; vsxargs[i++] = 0x00101c0800101c10ULL;
1783
1784 // vector rotate special...
1785 vsxargs[i++] = 0x00001f0000001f02ULL; vsxargs[i++] = 0x00001f0800001f10ULL;
1786 vsxargs[i++] = 0x00101f0000101f02ULL; vsxargs[i++] = 0x00101f0800101f10ULL;
1787
1788 AB_DPRINTF("Registered %d vargs values\n", i/2);
1789 nb_vargs = i;
1790}
1791
1792/* VPCV = Vector Permute Control Vector */
1793unsigned long nb_vpcv;
1794static unsigned long * vpcv = NULL;
1795
1796#define MAX_VPCV_SIZE 20
1797
1798static void build_vector_permute_table(void)
1799{
1800 int i=0;
1801
1802 vpcv = memalign(16, MAX_VPCV_SIZE * sizeof(unsigned long));
1803
1804#ifdef EXHAUSTIVE_TESTS
1805 /* These two lines are complementary pairs of each other. */
1806 vpcv[i++]=0x12021a0817141317ULL; vpcv[i++]=0x100d1b05070f0205ULL;
1807 vpcv[i++]=0x0d1d0517080b0c08ULL; vpcv[i++]=0x0f12041a18101d1cULL;
1808 vpcv[i++]=0x100d1b070f020505ULL; vpcv[i++]=0x0e201f1400130105ULL;
1809 vpcv[i++]=0x0705030a0b01ea0cULL; vpcv[i++]=0x0e0c09010602080dULL;
1810#else
1811 vpcv[i++]=0x12021a0817141317ULL; vpcv[i++]=0x100d1b05070f0205ULL;
1812 vpcv[i++]=0x0705030a0b01ea0cULL; vpcv[i++]=0x0e0c09010602080dULL;
1813#endif
1814 nb_vpcv=i;
1815 AB_DPRINTF("Registered %d permute control vectors \n", nb_vpcv);
1816
1817 if (i >= MAX_VPCV_SIZE)
1818 printf("Warning! Exceeded size of table building the vector permute control . \n");
1819}
1820
1821/* Decimal Encodings...
1822 * Packed, National, Zoned decimal content follows.
1823 * Note: Watch the conversions in and out of the
1824 * dwords / vectors for reverses with respect to
1825 * top/bottom low/high
1826 */
1827
1828/* Packed Decimals:
1829 * A valid encoding of a packed decimal integer value requires the following
1830 * properties:
1831 * – Each of the 31 4-bit digits of the operand’s magnitude (bits 0:123)
1832 * must be in the range 0-9.
1833 * – The sign code (bits 124:127) must be in the range 10-15. (0xa-0xf).
1834 * Source operands with sign codes of 0b1010, 0b1100, 0b1110, and 0b1111 are
1835 * interpreted as positive values. Source operands with sign codes of
1836 * 0b1011 and 0b1101 are interpreted as negative values.
1837 * Positive and zero results are encoded with a either sign code of
1838 * 0b1100 or 0b1111, depending on the preferred sign (indicated as an
1839 * immediate operand). Negative results are encoded with a sign code
1840 * of 0b1101.
1841 * PS - This is the 'preferred sign' bit encoded in some BCD associated
1842 * instructions.
1843 */
1844
1845// Note: table content is limited to values encoded, not interpreted.
1846unsigned int packed_decimal_sign_codes[] = {
1847 /* positive operands */
1848 0xc, 0xf, // 0b1100, 0b1111
1849
1850 /* negative operands */
1851 0xd // 0b1101
1852};
1853
1854#define NR_PACKED_DECIMAL_SIGNS 3
1855#define MAX_PACKED_DECIMAL_TABLE_SIZE 8 * 16 * 2 + 20
1856
1857static unsigned long * packed_decimal_table;
1858
1859/* build into a pair of doubles */
1860unsigned long nb_packed_decimal_entries;
1861
1862static void dissect_packed_decimal_sign(unsigned long local_sign) {
1863 switch(local_sign) {
1864 case 0xa: /*0b1010:*/ printf("[ + ]"); break;
1865 case 0xb: /*0b1011:*/ printf("[ - ]"); break;
1866 case 0xc: /*0b1100:*/ printf("(+|0)"); break;
1867 case 0xd: /*0b1101:*/ printf("( - )"); break;
1868 case 0xe: /*0b1110:*/ printf("[ + ]"); break;
1869 case 0xf: /*0b1111:*/ printf("(+|0)"); break;
1870 default: printf("(?%02lx)", local_sign);
1871 }
1872}
1873
1874int extract_packed_decimal_sign(unsigned long dword1, unsigned long dword0) {
1875 return (dword1 & 0xf);
1876}
1877
1878static void dissect_packed_decimal(unsigned long dword1,unsigned long dword0)
1879{
1880 int i;
1881 int local_sign;
1882 int nibble;
1883
1884 local_sign = extract_packed_decimal_sign(dword1, dword0);
1885 printf("packed_decimal: [");
1886
1887 for (i = 60; i >= 0; i -= 4) {
1888 nibble=(dword1 >> (i)) & 0xf;
1889 printf(" %x", nibble);
1890 }
1891
1892 for (i = 60; i >= 0; i -= 4) {
1893 nibble=(dword0 >> (i)) & 0xf;
1894 printf(" %x", nibble);
1895 }
1896
1897 printf(" ");
1898 dissect_packed_decimal_sign(local_sign);
1899 printf(" ] ");
1900}
1901
1902static void build_packed_decimal_table(void)
1903{
1904 long sign_index;
1905 long sign_value;
1906 unsigned long i = 0;
1907 unsigned long value;
1908 #ifdef EXHAUSTIVE_TESTS
1909 int scramble;
1910#endif
1911
1912 if (verbose) printf("%s\n", __FUNCTION__);
1913
1914 packed_decimal_table = malloc((MAX_PACKED_DECIMAL_TABLE_SIZE + 2)
1915 * sizeof (unsigned long));
1916
1917 for (sign_index = 0; sign_index < NR_PACKED_DECIMAL_SIGNS; sign_index++) {
1918 sign_value = packed_decimal_sign_codes[sign_index];
1919
1920 for (value = 0; value <= 9; value++) {
1921 packed_decimal_table[i] = 0x1111111111111111 * value;
1922 packed_decimal_table[i+1] = sign_value;
1923 packed_decimal_table[i+1] += 0x1111111111111110 * value;
1924
1925 if (verbose>3) dissect_packed_decimal(packed_decimal_table[i+1],
1926 packed_decimal_table[i]);
1927 if (verbose>3) printf("\n");
1928 i+=2;
1929 }
1930
1931#ifdef EXHAUSTIVE_TESTS
1932 for (scramble = 1; scramble <= 4; scramble++) {
1933 packed_decimal_table[i] = 0x3210321032103210 * scramble;
1934 packed_decimal_table[i+1] = sign_value;
1935 packed_decimal_table[i+1] += 0x0123012301230120 * scramble;
1936
1937 if (verbose>3) dissect_packed_decimal(packed_decimal_table[i+1],
1938 packed_decimal_table[i]);
1939 if (verbose>3) printf("\n");
1940 i+=2;
1941 }
1942#endif
1943
1944 /* Add some entries that will provide interesting output from
1945 * the convert TO tests.
1946 */
1947 packed_decimal_table[i] = 0x0000000000000000;
1948 packed_decimal_table[i+1] = sign_value;
1949 packed_decimal_table[i+1] += 0x0000000012345670;
1950
1951 if (verbose > 3) dissect_packed_decimal(packed_decimal_table[i+1],
1952 packed_decimal_table[i]);
1953
1954 if (verbose>3) printf("\n");
1955
1956 i += 2;
1957
1958#ifdef EXHAUSTIVE_TESTS
1959 packed_decimal_table[i] = 0x0000000000000000;
1960 packed_decimal_table[i+1] = sign_value;
1961 packed_decimal_table[i+1] += 0x0000000098765430;
1962
1963 if (verbose > 3) dissect_packed_decimal(packed_decimal_table[i+1],
1964 packed_decimal_table[i]);
1965
1966 if (verbose > 3) printf("\n");
1967
1968 i += 2;
1969
1970 packed_decimal_table[i] = 0x000000000000000b;
1971 packed_decimal_table[i+1] = sign_value;
1972 packed_decimal_table[i+1] += 0x0000000000000000;
1973
1974 if (verbose > 3) dissect_packed_decimal(packed_decimal_table[i+1],
1975 packed_decimal_table[i]);
1976
1977 if (verbose>3) printf("\n");
1978
1979 i += 2;
1980#endif
1981
1982 packed_decimal_table[i] = 0x0030000000000000;
1983 packed_decimal_table[i+1] = sign_value;
1984 packed_decimal_table[i+1] += 0x0000000000000000;
1985
1986 if (verbose > 3) dissect_packed_decimal(packed_decimal_table[i+1],
1987 packed_decimal_table[i]);
1988
1989 if (verbose > 3) printf("\n");
1990
1991 i += 2;
1992 }
1993
1994 if (verbose>2) printf("\n");
1995
1996 nb_packed_decimal_entries = i;
1997}
1998
1999static void dump_packed_decimal_table(void) {
2000 int i;
2001
2002 printf("packed_decimal_table:\n");
2003
2004 for (i = 0; i < nb_packed_decimal_entries; i += 2) {
2005 printf("i =: %2d ", i);
2006 dissect_packed_decimal(packed_decimal_table[i+1],
2007 packed_decimal_table[i]);
2008 printf("\n");
2009 }
2010}
2011
2012/* National decimals:
2013 * A valid encoding of a national decimal value requires the following.
2014 * – The contents of halfword 7 (sign code) must be
2015 * either 0x002B or 0x002D.
2016 * – The contents of halfwords 0 to 6 must be in the
2017 * range 0x0030 to 0x0039.
2018 * National decimal values having a sign code of 0x002B
2019 * are interpreted as positive values.
2020 * National decimal values having a sign code of 0x002D
2021 * are interpreted as negative values.
2022 */
2023unsigned int national_decimal_sign_codes[] = {
2024 /* positive */ 0x002b,
2025 /* negative */ 0x002d
2026};
2027
2028#define NR_NATIONAL_DECIMAL_SIGNS 2
2029
2030unsigned int national_decimal_values[] = {
2031#ifdef EXHAUSTIVE_TESTS
2032 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,
2033 0x0035, 0x0036, 0x0037, 0x0038, 0x0039
2034#else
2035 0x0030, 0x0031,
2036 0x0035, 0x0039
2037#endif
2038};
2039
2040#define NR_NATIONAL_DECIMAL_VALUES (sizeof(national_decimal_values) / sizeof(unsigned int))
2041
2042static unsigned long * national_decimal_table;
2043
2044#define MAX_NATIONAL_DECIMAL_TABLE_SIZE 10 * NR_NATIONAL_DECIMAL_VALUES * NR_NATIONAL_DECIMAL_SIGNS
2045
2046unsigned long nb_national_decimal_entries;
2047
2048static void dissect_national_decimal_sign(unsigned long local_sign) {
2049 switch(local_sign) {
2050 case 0x002b:
2051 printf("( + )");
2052 break;
2053
2054 case 0x002d:
2055 printf("( - )");
2056 break;
2057
2058 default: printf("unhandled sign value: %lx", local_sign);
2059 }
2060}
2061
2062int extract_national_decimal_sign(unsigned long dword1, unsigned long dword0) {
2063 return (dword1 & 0x0ff);
2064}
2065
2066static void dissect_national_decimal(unsigned long dword1,
2067 unsigned long dword0)
2068{
2069 int i;
2070 int local_sign;
2071 long hword;
2072
2073 printf("national_decimal: [");
2074
2075 if (verbose>4) printf("raw: [%016lx %016lx] ", dword1, dword0);
2076
2077 for (i = 48;i >= 0; i -= 16) {
2078 hword = dword1 >> (i) & 0x00ff;
2079
2080 /* validity of national decimal value */
2081 /* the i>0 clause skips the validity check against the sign value. */
2082 if (((i > 0) && (hword < 0x30)) || (hword > 0x39)) printf("!");
2083
2084 printf("%04lx ", hword);
2085 }
2086
2087 for (i = 48; i >= 0; i -= 16) {
2088 hword = dword0 >> (i) & 0x00ff;
2089
2090 if ((hword < 0x30) || (hword > 0x39)) printf("!");
2091
2092 printf("%04lx ", hword);
2093 }
2094
2095 local_sign = extract_national_decimal_sign(dword1, dword0);
2096 dissect_national_decimal_sign(local_sign);
2097 printf(" ] ");
2098}
2099
2100static void build_national_decimal_table(void)
2101{
2102 long sign_index;
2103 long sign_value;
2104 unsigned long i = 0;
2105 int index;
2106 unsigned long value;
2107
2108 if (verbose) printf("%s\n",__FUNCTION__);
2109 national_decimal_table = malloc(MAX_NATIONAL_DECIMAL_TABLE_SIZE
2110 * sizeof (unsigned long));
2111
2112 for (sign_index = 0; sign_index < NR_NATIONAL_DECIMAL_SIGNS; sign_index++) {
2113 sign_value = national_decimal_sign_codes[sign_index];
2114
2115 for (index = 0; index < NR_NATIONAL_DECIMAL_VALUES; index++) {
2116 value = national_decimal_values[index];
2117
2118 national_decimal_table[i] = 0x0001000100010001 * value;
2119 national_decimal_table[i+1] = 0x0001000100010000 * value;
2120 national_decimal_table[i+1] += sign_value ;
2121
2122 if (verbose > 3) {
2123 dissect_national_decimal(national_decimal_table[i+1],
2124 national_decimal_table[i]);
2125 printf("\n");
2126 }
2127 i += 2;
2128 }
2129#ifdef EXHAUSTIVE_TESTS
2130 { /* a few more for fun */
2131 national_decimal_table[i] = 0x0031003200330034;
2132 national_decimal_table[i+1] = 0x0035003600370000;
2133 national_decimal_table[i+1] += sign_value ;
2134
2135 if (verbose > 3) {
2136 dissect_national_decimal(national_decimal_table[i+1],
2137 national_decimal_table[i]);
2138 printf("\n");
2139 }
2140
2141 i += 2;
2142 national_decimal_table[i] = 0x0031003200330034;
2143 national_decimal_table[i+1] = 0x0035003600370000;
2144 national_decimal_table[i+1] += sign_value ;
2145
2146 if (verbose > 3) {
2147 dissect_national_decimal(national_decimal_table[i+1],
2148 national_decimal_table[i]);
2149 printf("\n");
2150 }
2151 i += 2;
2152 }
2153#endif
2154 }
2155
2156 if (verbose > 2) printf("\n");
2157
2158 nb_national_decimal_entries = i;
2159}
2160
2161static void dump_national_decimal_table(void) {
2162 int i;
2163
2164 printf("national_decimal_table:\n");
2165
2166 for (i = 0; i < nb_national_decimal_entries; i += 2) {
2167 printf("#%2d ", i);
2168 dissect_national_decimal(national_decimal_table[i+1],
2169 national_decimal_table[i]);
2170 printf("\n");
2171 }
2172}
2173
2174
2175/* Zoned Decimals:
2176 *
2177 * When PS=0, do the following.
2178 * A valid encoding of a zoned decimal value requires the following.
2179 * – The contents of bits 0:3 of byte 15 (sign code) can be any
2180 * value in the range 0x0 to 0xF.
2181 * – The contents of bits 0:3 of bytes 0 to 14 (zone) must
2182 * be the value 0x3.
2183 * – The contents of bits 4:7 of bytes 0 to 15 must
2184 * be a value in the range 0x0 to 0x9.
2185 * Zoned decimal values having a sign code of 0x0, 0x1, 0x2, 0x3,
2186 * 0x8, 0x9, 0xA, or 0xB are interpreted as positive values.
2187 * Zoned decimal values having a sign code of 0x4, 0x5, 0x6, 0x7,
2188 * 0xC, 0xD, 0xE, or 0xF are interpreted as negative values.
2189 :: 0,1,2,3, 8,9,a,b, are interpreted as positive.
2190 :: 4,5,6,7, c,d,e,f are interpreted as negative.
2191 * When PS=1, do the following.
2192 * A valid encoding of a zoned decimal source operand requires the following.
2193 * – The contents of bits 0:3 of byte 15 (sign code) must be a value in the
2194 * range 0xA to 0xF.
2195 * – The contents of bits 0:3 of bytes 0 to 14 (zone) must be the value 0xF.
2196 * – The contents of bits 4:7 of bytes 0 to 15 must be a value in the
2197 * range 0x0 to 0x9.
2198 * Zoned decimal source operands having a sign code of 0xA, 0xC, 0xE,
2199 * or 0xF are interpreted as positive values.
2200 * Zoned decimal source operands having a sign code of 0xB or 0xD are
2201 * interpreted as negative values.
2202 :: a, c, e,f are interpreted as positive.
2203 :: b, d, are interpreted as negative.
2204 */
2205
2206/* a valid sign is anything in range 0-9,a-f,
2207 * For coverage that does not overwhelm, we have chosen to use 0,1,4,a,b,f. */
2208#define NM_ZONED_DECIMAL_SIGNS 6
2209#define NM_ZONED_VALUES 5 /* 0,2,4,6,9 */
2210#define NM_PS_VALUES 2 /* 0,1 */
2211#define NM_ZONED_ADDITIONAL_PATTERNS 4
2212#define MAX_ZONED_DECIMAL_TABLE_SIZE NM_ZONED_DECIMAL_SIGNS * NM_ZONED_VALUES * NM_ZONED_ADDITIONAL_PATTERNS * NM_PS_VALUES + 10
2213
2214static unsigned long zoned_decimal_table_[MAX_ZONED_DECIMAL_TABLE_SIZE];
2215static unsigned long * zoned_decimal_table;
2216unsigned long nb_zoned_decimal_entries;
2217
2218static void dissect_zoned_decimal_sign(unsigned long local_sign, int ps) {
2219 if (ps == 0) {
2220 switch(local_sign) {
2221 case 0x0: case 0x1: case 0x2: case 0x3:
2222 case 0x8: case 0x9: case 0xa: case 0xb:
2223 printf("( + )");
2224 break;
2225
2226 case 0x4: case 0x5: case 0x6: case 0x7:
2227 case 0xc: case 0xd: case 0xe: case 0xf:
2228 printf("( - )");
2229 break;
2230 default: printf("zoned decimal (ps=%d). Unhandled sign value: %lx",
2231 ps, local_sign);
2232 }
2233 }
2234
2235 if (ps == 1) {
2236 switch(local_sign) {
2237 case 0xa: case 0xc: case 0xe: case 0xf:
2238 printf("( + )");
2239 break;
2240
2241 case 0xb: case 0xd:
2242 printf("( - )");
2243 break;
2244
2245 default: printf("zoned decimal (ps=%d). Unhandled sign value: %lx",
2246 ps, local_sign);
2247 }
2248 }
2249}
2250
2251/* Valid byte values within a zoned decimal are in the ranges of
2252 * 0x30..0x39 when PS==0, or 0xf0..0xff when PS==1.
2253 */
2254static void check_zoned_byte_validity(int byte, int ps) {
2255 if (ps == 0) {
2256 /* check the zone */
2257 if (((byte & 0x30) != 0x30))
2258 printf("!=30");
2259
2260 } else { /* ps==1 */
2261 if (((byte & 0xf0) != 0xf0))
2262 printf("%x !=f0 ", byte );
2263 }
2264
2265 /* check the numeric value */
2266 if ((byte & 0x0f) > 0x9)
2267 printf("!(0..9)");
2268}
2269
2270int extract_zoned_decimal_sign(unsigned long dword1, unsigned long dword0) {
2271 return ((dword1 & 0xf0) >> 4);
2272}
2273
2274static void dissect_zoned_decimal(unsigned long dword1, unsigned long dword0,
2275 int ps)
2276{
2277 int i;
2278 int local_sign;
2279 int byte;
2280
2281 printf("zoned_decimal: [");
2282
2283 for (i = 56; i >= 0; i -= 8) {
2284 byte = (dword1 >> (i)) & 0xff;
2285 check_zoned_byte_validity(byte, ps);
2286 printf(" %02x", byte);
2287 }
2288
2289 for (i = 56; i >= 0; i -= 8) {
2290 byte = (dword0 >> (i)) & 0x00ff;
2291 check_zoned_byte_validity(byte, ps);
2292
2293 if ((byte & 0xf) > 0x9) printf(" !(>9)");
2294 printf(" %02x", byte);
2295 }
2296
2297 local_sign = extract_zoned_decimal_sign(dword1, dword0);
2298 dissect_zoned_decimal_sign(local_sign, ps);
2299 printf(" ]");
2300}
2301
2302#ifdef EXHAUSTIVE_TESTS
2303// Randomly chosen exhaustive coverage for k includes values: 0,2,4,7,9
2304# define SELECTIVE_INCREMENT_ZONED(k) \
2305 if (k == 7) k = 9; \
2306 else if (k == 4) k = 7; \
2307 else if (k == 2) k = 4; \
2308 else if (k == 0) k = 2; \
2309 else k++;
2310// Randomly chosen exhaustive coverage for signs includes values: 0,1,4,a,b,f
2311# define SELECTIVE_INCREMENT_SIGNS(signs) \
2312 if (signs == 0x0) signs = 0x1; \
2313 else if (signs == 0x1) signs = 0x4; \
2314 else if (signs == 0x4) signs = 0xa; \
2315 else if (signs == 0xa) signs = 0xb; \
2316 else if (signs == 0xb) signs = 0xf; \
2317 else signs++;
2318#else
2319// Randomly chosen coverage for k includes values: 0,7,9
2320# define SELECTIVE_INCREMENT_ZONED(k) \
2321 if (k == 7) k = 9; \
2322 else if (k == 0) k = 7; \
2323 else k++;
2324// Randomly chosen coverage for signs includes values: 0,4,b,f
2325# define SELECTIVE_INCREMENT_SIGNS(signs) \
2326 if (signs == 0x0) signs = 0x4; \
2327 else if (signs == 0x4) signs = 0xb; \
2328 else if (signs == 0xb) signs = 0xf; \
2329 else signs++;
2330#endif
2331
2332
2333static void build_zoned_decimal_table(void)
2334{
2335 unsigned long signs;
2336 unsigned long i;
2337 int k;
2338 int ps;
2339 int signs_start,signs_end;
2340
2341 if (verbose) printf("%s\n", __FUNCTION__);
2342
2343 zoned_decimal_table = zoned_decimal_table_;
2344 i = 0;
2345
2346 for (ps = 0; ps <= 1; ps++) {
2347 if (ps == 0) {
2348 signs_start = 0;
2349 signs_end = 0xf;
2350
2351 } else {
2352 signs_start = 0xa;
2353 signs_end = 0xf;
2354 }
2355
2356 for (signs = signs_start;
2357 signs <= signs_end; /* signs selectively updated below */) {
2358
2359 if (verbose > 2) printf("ps=%d sign:%lx\n", ps, signs);
2360
2361 for (k = 0 ; k < 9; /* k selectively updated below */) {
2362 if (ps == 0) {
2363 zoned_decimal_table[i] = 0x3030303030303030; // set bits 0:3 of bytes 0..7.
2364 zoned_decimal_table[i+1] = 0x3030303030303000; // bits 0:3 of bytes 8..14 must be 0x3
2365
2366 } else {
2367 zoned_decimal_table[i] = 0xf0f0f0f0f0f0f0f0; // set bits 0:3 of bytes 0..7.
2368 zoned_decimal_table[i+1] = 0xf0f0f0f0f0f0f000; // bits 0:3 of bytes 8..14 must be 0x3
2369 }
2370
2371 zoned_decimal_table[i] += 0x010101010101010 * k; // set bits 4..7 of bytes 0..7.
2372 zoned_decimal_table[i+1] += 0x010101010101000 * k; // bits 4:7 of bytes 8..15 must be 0..9.
2373 zoned_decimal_table[i+1] += (signs << 4); // bits 0:3 of byte 15 is the sign.
2374 if (verbose > 3) {
2375 dissect_zoned_decimal(zoned_decimal_table[i+1],
2376 zoned_decimal_table[i], ps);
2377 printf("\n");
2378 }
2379 i += 2;
2380 SELECTIVE_INCREMENT_ZONED(k)
2381 }
2382
2383 /* add a few more patterns outside of the k patterns. */
2384 if (ps == 0) {
2385 zoned_decimal_table[i] = 0x3030303030303030;
2386 zoned_decimal_table[i+1] = 0x3030303030303000;
2387
2388 } else {
2389 zoned_decimal_table[i] = 0xf0f0f0f0f0f0f0f0;
2390 zoned_decimal_table[i+1] = 0xf0f0f0f0f0f0f000;
2391 }
2392
2393 zoned_decimal_table[i] += 0x0908070605040302;
2394 zoned_decimal_table[i+1] += 0x0102030405060700;
2395 zoned_decimal_table[i+1] += (signs<<4); // bits 0:3 of byte 15.
2396
2397 if (verbose > 3) {
2398 dissect_zoned_decimal(zoned_decimal_table[i+1],
2399 zoned_decimal_table[i], ps);
2400 printf("\n");
2401 }
2402
2403 i += 2;
2404 SELECTIVE_INCREMENT_SIGNS(signs)
2405 } /* signs loop */
2406 } /* ps loop */
2407
2408 nb_zoned_decimal_entries = i;
2409}
2410
2411static void dump_zoned_decimal_table(void) {
2412 int i;
2413 int ps;
2414
2415 for (ps = 0; ps <= 1; ps++) {
2416 printf("zoned_decimal_table ps=%d:\n", ps);
2417
2418 for (i = 0; i < nb_zoned_decimal_entries; i += 2) {
2419 printf("#%2d ", i);
2420 dissect_zoned_decimal(zoned_decimal_table[i+1],
2421 zoned_decimal_table[i], ps);
2422 printf("\n");
2423 }
2424 }
2425}
2426
2427/* Build table containing shift and truncate values */
2428#define MAX_DECIMAL_SHIFT_TABLE_SIZE 64
2429
2430static unsigned long * decimal_shift_table;
2431unsigned long nb_decimal_shift_entries;
2432
2433static void build_decimal_shift_table(void) {
2434 unsigned long i = 0;
2435 unsigned long value;
2436
2437 if (verbose) printf("%s\n",__FUNCTION__);
2438
2439 decimal_shift_table = malloc(MAX_DECIMAL_SHIFT_TABLE_SIZE
2440 * sizeof (unsigned long));
2441
2442 for (value = 0; value <= 31; value++) {
2443 decimal_shift_table[i] = value;
2444 decimal_shift_table[i+1] = 0;
2445 i += 2;
2446 }
2447
2448 if (verbose>2) printf("\n");
2449
2450 nb_decimal_shift_entries = i;
2451}
2452
2453static void dump_decimal_shift_table(void) {
2454 int i;
2455
2456 printf("decimal_shift_table:\n");
2457
2458 for (i = 0; i < nb_decimal_shift_entries; i += 2) {
2459 printf("i=:%2d ", i);
2460 printf(" 0x%2lx 0x%2lx ", decimal_shift_table[i],
2461 decimal_shift_table[i+1]);
2462 printf("\n");
2463 }
2464}