1 /* 2 * ppc64_helpers.h 3 * Copyright (C) 2016-2017 Will Schmidt <will_schmidt (at) vnet.ibm.com> 4 * 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 25 typedef 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. 77 Bit(s) Description 78 0:31 Reserved 79 32 Floating-Point Exception Summary (FX) 80 33 Floating-Point Enabled Exception Summary (FEX) 81 34 Floating-Point Invalid Operation Exception Summary (VX) 82 35 Floating-Point Overflow Exception (OX) 83 36 Floating-Point Underflow Exception (UX) 84 37 Floating-Point Zero Divide Exception (ZX) 85 38 Floating-Point Inexact Exception (XX) 86 39 Floating-Point Invalid Operation Exception (SNaN) (VXSNAN) 87 40 Floating-Point Invalid Operation Exception ( - ) (VXISI) 88 41 Floating-Point Invalid Operation Exception ( ) (VXIDI) 89 42 Floating-Point Invalid Operation Exception (0 0) (VXZDZ) 90 43 Floating-Point Invalid Operation Exception ( 0) (VXIMZ) 91 44 Floating-Point Invalid Operation Exception (Invalid Compare) (VXVC) 92 45 Floating-Point Fraction Rounded (FR) 93 46 Floating-Point Fraction Inexact (FI) 94 47:51 Floating-Point Result Flags (FPRF) 95 47 Floating-Point Result Class Descriptor (C) 96 48: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 ?) 101 52 Reserved 102 53 Floating-Point Invalid Operation Exception (Software-Defined Condition) (VXSOFT) 103 54 Floating-Point Invalid Operation Exception (Invalid Square Root) (VXSQRT) 104 55 Floating-Point Invalid Operation Exception (Invalid Integer Convert) (VXCVI) 105 56 Floating-Point Invalid Operation Exception Enable (VE) 106 57 Floating-Point Overflow Exception Enable (OE) 107 58 Floating-Point Underflow Exception Enable (UE) 108 59 Floating-Point Zero Divide Exception Enable (ZE) 109 60 Floating-Point Inexact Exception Enable (XE) 110 61 Floating-Point Non-IEEE Mode (NI) 111 62: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 121 static 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", 126 "28-RSVD", "29-DRN0", "30-DRN1", "31-DRN2", 127 /* 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 159 inline int cr_overflow_set(unsigned this_cr) { 160 return (this_cr & CRFIELD_BIT3); 161 } 162 163 inline int cr_zero_set(unsigned this_cr) { 164 return (this_cr & CRFIELD_BIT2); 165 } 166 167 inline int cr_positive_set(unsigned this_cr) { 168 return (this_cr & CRFIELD_BIT1); 169 } 170 171 inline 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 */ 178 inline static void __dissect_cr(unsigned this_cr) { 179 if (cr_negative_set(this_cr)) 180 printf("%s(LT)", verbose ? " 0x1=Negative" : ""); 181 182 if (cr_positive_set(this_cr)) 183 printf("%s(GT)", verbose ? " 0x2=Positive" : ""); 184 185 if (cr_zero_set(this_cr)) 186 printf("%s(EQ)", verbose ? " 0x4=Zero" : ""); 187 188 if (cr_overflow_set(this_cr)) 189 printf("%s(SO)", verbose ? " 0x8=Overflow" : ""); 190 } 191 192 /* Extract one CR field */ 193 static 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 */ 203 static 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... */ 211 static 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. 220 * Valgrind tracks the C (FPSCR[47]), FPCC (FPSCR[48:51) 221 * DRN (FPSCR[29:31]) and RN (FPSCR[62:63]). 222 */ 223 static void dissect_fpscr_valgrind(unsigned long local_fpscr) { 224 int i; 225 long mybit; 226 227 /* 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 */ 236 for (i = 47; i < 52; i++) { 237 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); 246 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 */ 256 static 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; 260 long mybit; 261 262 for (i = 0; i < 61; i++) { 263 /* also note that the bit numbering is backwards. */ 264 mybit = 1LL << (63 - i); 265 if (mybit & local_fpscr) { 266 printf(" %s", fpscr_strings[i]); 267 } 268 } 269 } 270 271 static 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 */ 281 static 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 314 static 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 364 static 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 378 /* dissect_xer helpers*/ 379 static 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 */ 398 static 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 /* */ 410 static 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 417 /* 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 427 static 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 471 typedef 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 488 static 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) 543 unsigned long nb_dfp128_vals = NUM_DFP128_VALS; 544 545 /* Todo: update dfp64_vals to match dfp128_vals content. */ 546 547 static 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) 583 unsigned 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 591 static 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 606 static 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 618 unsigned long buffer[BUFFER_SIZE]; 619 620 static 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 655 unsigned long pattern[PATTERN_SIZE] = { 656 0xffffffffffffffff, 657 0xaaaaaaaaaaaaaaaa, 658 0x5152535455565758, 659 0x0000000000000000, 660 0xffaa5599113377cc, 661 }; 662 663 664 static 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 */ 676 static 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 765 static 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. */ 794 static 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 832 static 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 862 static 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. */ 898 static 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 936 static 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. */ 1019 static 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 1035 static 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 1102 static 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 1114 static 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 1153 static 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 1180 static 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. */ 1207 static 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. */ 1247 static 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 */ 1274 static 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 */ 1309 static 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 */ 1345 static 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. */ 1381 static 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. */ 1433 unsigned 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 1450 unsigned 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. */ 1463 static unsigned long * float_vsxargs; 1464 static unsigned long * binary128_float_vsxargs = NULL; 1465 static unsigned long * binary64_float_vsxargs = NULL; 1466 static unsigned long * binary32_float_vsxargs = NULL; 1467 static unsigned long * binary16_float_vsxargs = NULL; 1468 1469 unsigned long nb_float_vsxargs; 1470 1471 #define MAX_FLOAT_VSX_ARRAY_SIZE (((MAX_EXPONENTS * MAX_MANTISSAS) * 2 + 1) * 2) 1472 1473 void 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. */ 1545 void 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 1580 static 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 1611 static unsigned char * char_args; 1612 unsigned long nb_char_args; 1613 1614 static 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 1641 static 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 1654 static unsigned char * char_ranges; 1655 unsigned long nb_char_ranges; 1656 1657 static 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 1697 static 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 1712 static HWord_t *iargs = NULL; 1713 static int nb_iargs = 0; 1714 1715 static 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 1736 static unsigned long * vsxargs = NULL; 1737 unsigned long nb_vargs; 1738 1739 #define MAX_VSX_ARRAY_SIZE 42 1740 1741 static 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 */ 1793 unsigned long nb_vpcv; 1794 static unsigned long * vpcv = NULL; 1795 1796 #define MAX_VPCV_SIZE 20 1797 1798 static 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 operands 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. 1846 unsigned 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 1857 static unsigned long * packed_decimal_table; 1858 1859 /* build into a pair of doubles */ 1860 unsigned long nb_packed_decimal_entries; 1861 1862 static 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 1874 int extract_packed_decimal_sign(unsigned long dword1, unsigned long dword0) { 1875 return (dword1 & 0xf); 1876 } 1877 1878 static 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 1902 static 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 1999 static 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 */ 2023 unsigned int national_decimal_sign_codes[] = { 2024 /* positive */ 0x002b, 2025 /* negative */ 0x002d 2026 }; 2027 2028 #define NR_NATIONAL_DECIMAL_SIGNS 2 2029 2030 unsigned 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 2042 static unsigned long * national_decimal_table; 2043 2044 #define MAX_NATIONAL_DECIMAL_TABLE_SIZE 10 * NR_NATIONAL_DECIMAL_VALUES * NR_NATIONAL_DECIMAL_SIGNS 2045 2046 unsigned long nb_national_decimal_entries; 2047 2048 static 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 2062 int extract_national_decimal_sign(unsigned long dword1, unsigned long dword0) { 2063 return (dword1 & 0x0ff); 2064 } 2065 2066 static 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 2100 static 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 2161 static 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 2214 static unsigned long zoned_decimal_table_[MAX_ZONED_DECIMAL_TABLE_SIZE]; 2215 static unsigned long * zoned_decimal_table; 2216 unsigned long nb_zoned_decimal_entries; 2217 2218 static 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 */ 2254 static 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 2270 int extract_zoned_decimal_sign(unsigned long dword1, unsigned long dword0) { 2271 return ((dword1 & 0xf0) >> 4); 2272 } 2273 2274 static 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 2333 static 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 2411 static 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 2430 static unsigned long * decimal_shift_table; 2431 unsigned long nb_decimal_shift_entries; 2432 2433 static 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 2453 static 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 } 2465