|
|
1.1 ! root 1: #include "fpp_defs.h" ! 2: ! 3: ! 4: /***************************************************************************** ! 5: * ! 6: * LDF_STF - SINGLE PRECISION FLOATING POINT LOAD_STORE TEST ! 7: * ! 8: *****************************************************************************/ ! 9: ldf() ! 10: { ! 11: asm(".globl _ldf_t"); ! 12: asm("_ldf_t:"); /* entry address */ ! 13: if( ( cycle == 1 ) && ( prt_hdrs ) ) /* print headers on 1st cycle */ ! 14: writes(" LDF_STF"); ! 15: ldf_1(); /* load through a register */ ! 16: ldf_2(); /* load through the cache */ ! 17: ldf_3(); /* register stability ldf */ ! 18: ldf_4(); /* register stability stf */ ! 19: ldf_5(); /* PSL stability test -LDF */ ! 20: ldf_6(); /* PSL stability test -STF */ ! 21: ldf_7(); /* pipelined entry test */ ! 22: asm("jmp *return"); /* return to the test monitor */ ! 23: } ! 24: ! 25: ! 26: /************************************************************************ ! 27: * ! 28: * SUBTEST 1 - load through a register ! 29: * ! 30: ************************************************************************/ ! 31: ldf_1() ! 32: { ! 33: force_loop = FALSE; ! 34: subtest = 1; ! 35: for( index = 0; index < max_ldf_1_index; index++ ) { ! 36: sgl_ld_acc = ldf_1_data[index].ld; /* get value to load */ ! 37: sgl_expected = ldf_1_data[index].exp; /* get expected result */ ! 38: /* ! 39: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 40: * The force loop flag is set after the first error. ! 41: */ ! 42: asm("_ldf_1_lp1:"); ! 43: asm("movl _sgl_ld_acc,r4"); /* get the value to load */ ! 44: asm("ldf r4"); /* load the value */ ! 45: asm("nop"); ! 46: asm("stf r5"); /* store the result in R5 */ ! 47: if( force_loop ) ! 48: asm("brb _ldf_1_lp1");; /* loop on the error */ ! 49: /* ! 50: * end error loop - test the results ! 51: */ ! 52: asm("movl r5,_sgl_st_acc"); /* move R5 data to cache */ ! 53: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 54: errcnt++; /* bump the error count */ ! 55: if( prt_error ) { ! 56: print_ldf_er_hdr(); ! 57: writes(" (Reg. Data) - BAD FINAL ACC\n"); ! 58: print_ldf_data(); ! 59: writes(", data index = "); ! 60: writed( index ); ! 61: writec('\n'); ! 62: writes(" Acc expected = "); ! 63: write32h( sgl_expected ); ! 64: writec('\n'); ! 65: } ! 66: if( halt_flg ) ! 67: ldf_er_halt( BAD_ACC_HLT ); /* halt on the error */ ! 68: if( loop_on_err ) { ! 69: force_loop = TRUE; /* set the force loop flag */ ! 70: asm("brw _ldf_1_lp1");; /* and loop on the error */ ! 71: } /* end of loop on error */ ! 72: } /* end of compare error */ ! 73: } /* end of WHILE loop */ ! 74: } /* end of subtest 1 */ ! 75: ! 76: ! 77: ! 78: /************************************************************************ ! 79: * ! 80: * SUBTEST 2 - load through memory ! 81: * ! 82: ************************************************************************/ ! 83: ldf_2() ! 84: { ! 85: force_loop = FALSE; ! 86: subtest = 2; ! 87: for( index = 0; index < max_ldf_1_index; index++ ) { ! 88: sgl_ld_acc = ldf_1_data[index].ld; /* get value to load */ ! 89: sgl_expected = ldf_1_data[index].exp; /* get expected result */ ! 90: /* ! 91: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 92: * The force loop flag is set after the first error. ! 93: */ ! 94: asm("_ldf_2_lp1:"); ! 95: asm("ldf _sgl_ld_acc"); /* load the value */ ! 96: asm("nop"); ! 97: asm("stf _sgl_st_acc"); /* store the result */ ! 98: if( force_loop ) ! 99: asm("brb _ldf_2_lp1");; /* loop on the error */ ! 100: /* ! 101: * end error loop - test the results ! 102: */ ! 103: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 104: errcnt++; /* bump the error count */ ! 105: if( prt_error ) { ! 106: print_ldf_er_hdr(); ! 107: writes(" (Cache Data) - BAD FINAL ACC\n"); ! 108: print_ldf_data(); ! 109: writes(", data index = "); ! 110: writed( index ); ! 111: writec('\n'); ! 112: writes(" Acc expected = "); ! 113: write32h( sgl_expected ); ! 114: writec('\n'); ! 115: } ! 116: if( halt_flg ) ! 117: ldf_er_halt( BAD_ACC_HLT ); /* halt on the error */ ! 118: if( loop_on_err ) { ! 119: force_loop = TRUE; /* set the force loop flag */ ! 120: asm("brw _ldf_2_lp1");; /* and loop on the error */ ! 121: } /* end of loop on error */ ! 122: } /* end of compare error */ ! 123: } /* end of WHILE loop */ ! 124: } /* end of subtest 2 */ ! 125: ! 126: ! 127: ! 128: /************************************************************************ ! 129: * ! 130: * SUBTEST 3 - Check for register corruption (ldf) ! 131: * ! 132: ************************************************************************/ ! 133: ldf_3() ! 134: { ! 135: force_loop = FALSE; /* clear force_loop flg */ ! 136: subtest = 3; ! 137: fill_reg_buf( load_regs ); /* get patterns for regs */ ! 138: index = 0; ! 139: sgl_ld_acc = ldf_1_data[0].ld; /* get value to load */ ! 140: sgl_expected = ldf_1_data[0].exp; /* get expected result */ ! 141: /* ! 142: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 143: * The force loop flag is set after the first error. ! 144: */ ! 145: asm("_ldf_3_lp1:"); ! 146: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */ ! 147: asm("nop"); ! 148: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 149: asm("nop"); ! 150: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */ ! 151: asm("nop"); ! 152: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 153: if( force_loop ) ! 154: asm("brb _ldf_3_lp1");; /* loop on the error */ ! 155: /* ! 156: * Now compare the stored register values to those that were loaded ! 157: */ ! 158: index2 = 0; ! 159: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) ) ! 160: index2++; /* check reg values */ ! 161: if( index2 < 13 ) { /* error if index2 < 13 */ ! 162: errcnt++; /* bump the error count */ ! 163: if( prt_error ) { ! 164: print_ldf_er_hdr(); ! 165: writes(" - A REGISTER WAS MODIFIED\n"); ! 166: print_ldf_data(); ! 167: writes("register "); /* print the information */ ! 168: writed( index2 ); /* about the corrupted */ ! 169: writes(" = "); /* register */ ! 170: write32h( store_regs[index2] ); ! 171: writes(", should be = "); ! 172: write32h( load_regs[index2] ); ! 173: writes("\n"); ! 174: } ! 175: if( halt_flg ) ! 176: ldf_er_halt( BAD_REG_HLT ); /* halt on the error */ ! 177: if( loop_on_err ) { ! 178: force_loop = TRUE; /* set the force loop flag */ ! 179: asm("brw _ldf_3_lp1"); /* and loop on the error */ ! 180: } /* end of loop on error */ ! 181: } /* end of register corruption error */ ! 182: } /* end of subtest 3 */ ! 183: ! 184: ! 185: ! 186: /************************************************************************ ! 187: * ! 188: * SUBTEST 4 - Check for register corruption (stf) ! 189: * ! 190: ************************************************************************/ ! 191: ldf_4() ! 192: { ! 193: force_loop = FALSE; /* clear force_loop flg */ ! 194: subtest = 4; ! 195: fill_reg_buf( load_regs ); /* get patterns for regs */ ! 196: index = 0; ! 197: sgl_ld_acc = ldf_1_data[0].ld; /* get value to store */ ! 198: sgl_expected = ldf_1_data[0].exp; /* get expected result */ ! 199: /* ! 200: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 201: * The force loop flag is set after the first error. ! 202: */ ! 203: asm("_ldf_4_lp1:"); ! 204: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 205: asm("nop"); ! 206: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */ ! 207: asm("nop"); ! 208: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 209: asm("nop"); ! 210: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */ ! 211: if( force_loop ) ! 212: asm("brb _ldf_4_lp1");; /* loop on the error */ ! 213: /* ! 214: * Now compare the stored register values to those that were loaded ! 215: */ ! 216: index2 = 0; ! 217: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) ) ! 218: index2++; /* check reg values */ ! 219: if( index2 < 13 ) { /* error if index2 < 13 */ ! 220: errcnt++; /* bump the error count */ ! 221: if( prt_error ) { ! 222: print_ldf_er_hdr(); ! 223: writes(" - A REGISTER WAS MODIFIED\n"); ! 224: print_ldf_data(); ! 225: writes("register "); /* print the information */ ! 226: writed( index2 ); /* about the corrupted */ ! 227: writes(" = "); /* register */ ! 228: write32h( store_regs[index2] ); ! 229: writes(", should be = "); ! 230: write32h( load_regs[index2] ); ! 231: writes("\n"); ! 232: } ! 233: if( halt_flg ) ! 234: ldf_er_halt( BAD_REG_HLT ); /* halt on the error */ ! 235: if( loop_on_err ) { ! 236: force_loop = TRUE; /* set the force loop flag */ ! 237: asm("brw _ldf_4_lp1"); /* and loop on the error */ ! 238: } /* end of loop on error */ ! 239: } /* end of register corruption error */ ! 240: } /* end of subtest 4 */ ! 241: ! 242: ! 243: ! 244: /************************************************************************ ! 245: * ! 246: * SUBTEST 5 - Check for PSL corruption (ldf) ! 247: * ! 248: ************************************************************************/ ! 249: ldf_5() ! 250: { ! 251: force_loop = FALSE; /* clear force_loop flg */ ! 252: subtest = 5; ! 253: for( index = 0; index < 3; index++ ) { ! 254: sgl_ld_acc = ldf_1_data[index].ld; /* get value to load */ ! 255: sgl_expected = ldf_1_data[index].exp; /* get expected */ ! 256: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */ ! 257: /* ! 258: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 259: * The force loop flag is set after the first error. ! 260: */ ! 261: asm("_ldf_5_lp1:"); ! 262: asm("tstl _sgl_dummy1"); /* set the PSL status */ ! 263: asm("movpsl _init_psl"); /* save the initial PSL */ ! 264: asm("nop"); ! 265: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 266: asm("nop"); ! 267: asm("movpsl _psl_val"); /* save the final PSL */ ! 268: asm("nop"); ! 269: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 270: if( force_loop ) ! 271: asm("brb _ldf_5_lp1");; /* loop on the error */ ! 272: /* ! 273: * Now compare the final PSL to the initial PSL -they should be the same ! 274: */ ! 275: if( psl_val != init_psl ) { ! 276: errcnt++; /* bump the error count */ ! 277: if( prt_error ) { ! 278: print_ldf_er_hdr(); ! 279: writes(" - INCORRECT FINAL PSL\n"); ! 280: print_ldf_data(); ! 281: writes("initial PSL = "); ! 282: write32h( init_psl ); ! 283: writes(", final PSL = "); ! 284: write32h( psl_val ); ! 285: writes(", expected PSL = "); ! 286: write32h( exp_psl ); ! 287: writes("\n"); ! 288: } ! 289: if( halt_flg ) ! 290: ldf_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 291: if( loop_on_err ) { ! 292: force_loop = TRUE; /* set the force loop flag */ ! 293: asm("brw _ldf_5_lp1");; /* and loop on the error */ ! 294: } /* end of loop on error */ ! 295: } /* end of PSL corruption error */ ! 296: } /* end of WHILE loop */ ! 297: } /* end of subtest 5 */ ! 298: ! 299: ! 300: ! 301: /************************************************************************ ! 302: * ! 303: * SUBTEST 6 - Check for PSL corruption (stf) ! 304: * ! 305: ************************************************************************/ ! 306: ldf_6() ! 307: { ! 308: force_loop = FALSE; ! 309: index = 0; /* clear the data index */ ! 310: status_index = 0; /* clear the status index */ ! 311: do { ! 312: sgl_ld_acc = ldf_1_data[index].ld; /* get the dbl operand */ ! 313: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 314: /* ! 315: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 316: * The force loop flag is set after the first error. ! 317: */ ! 318: asm("_ldf_6_lp1:"); ! 319: asm("ldf _sgl_ld_acc"); /* load the operand */ ! 320: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 321: asm("movpsl _init_psl"); /* save the initial status */ ! 322: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 323: asm("movpsl _psl_val"); /* save the final status */ ! 324: if( force_loop ) /* loop? */ ! 325: asm("jmp _ldf_6_lp1");; /* run the loop again */ ! 326: exp_psl = init_psl; /* get the initial PSL */ ! 327: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 328: sgl_dummy2 = sgl_ld_acc; /* get the operand */ ! 329: sgl_dummy2 &= 0xff800000; /* clear the fraction part */ ! 330: if( !sgl_dummy2 ) ! 331: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 332: if( sgl_dummy2 < 0 ) ! 333: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 334: if( psl_val != exp_psl ) { /* COMPARE the values */ ! 335: errcnt++; /* bump the error count */ ! 336: if( prt_error ) { ! 337: print_ldf_er_hdr(); ! 338: writes(" - INCORRECT FINAL PSL\n"); ! 339: print_ldf_data(); ! 340: writes("initial PSL = "); ! 341: write32h( init_psl ); ! 342: writes(", final PSL = "); ! 343: write32h( psl_val ); ! 344: writes(", expected PSL = "); ! 345: write32h( exp_psl ); ! 346: writes("\n"); ! 347: } ! 348: if( halt_flg ) ! 349: ldf_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 350: if( loop_on_err ) { ! 351: force_loop = TRUE; /* set the force loop flag */ ! 352: asm("brw _ldf_6_lp1");; /* and loop */ ! 353: }; /* end of loop-on-error */ ! 354: } /* end of compare error */ ! 355: if( ++status_index >= 3 ) ! 356: status_index = 0; /* reset the status index */ ! 357: } while( index++ < max_ldf_1_index ); ! 358: } /* end of subtest 6 */ ! 359: ! 360: ! 361: ! 362: /************************************************************************ ! 363: * ! 364: * SUBTEST 7 - pipelined entry test (ldf) ! 365: * ! 366: ************************************************************************/ ! 367: ldf_7() ! 368: { ! 369: force_loop = FALSE; ! 370: subtest = 7; ! 371: for( index = 0; index < max_ldf_1_index; index++ ) { ! 372: sgl_ld_acc = ldf_1_data[index].ld; /* get value to load */ ! 373: sgl_expected = ldf_1_data[index].exp; /* get expected result */ ! 374: /* ! 375: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 376: * The force loop flag is set after the first error. ! 377: */ ! 378: asm("_ldf_7_lp1:"); ! 379: asm("movl $0,r0"); /* clear r0 */ ! 380: asm("ldf r0"); /* load the Acc. with 0.0 */ ! 381: asm("ldf _sgl_ld_acc"); /* load the value */ ! 382: asm("nop"); ! 383: asm("stf _sgl_st_acc"); /* store the result */ ! 384: if( force_loop ) ! 385: asm("brb _ldf_7_lp1");; /* loop on the error */ ! 386: /* ! 387: * end error loop - test the results ! 388: */ ! 389: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 390: errcnt++; /* bump the error count */ ! 391: if( prt_error ) { ! 392: print_ldf_er_hdr(); ! 393: writes(" (Piped Entry) - BAD FINAL ACC\n"); ! 394: print_ldf_data(); ! 395: writes(", data index = "); ! 396: writed( index ); ! 397: writec('\n'); ! 398: writes(" Acc expected = "); ! 399: write32h( sgl_expected ); ! 400: writec('\n'); ! 401: } ! 402: if( halt_flg ) ! 403: ldf_er_halt( BAD_ACC_HLT ); /* halt on the error */ ! 404: if( loop_on_err ) { ! 405: force_loop = TRUE; /* set the force loop flag */ ! 406: asm("brw _ldf_7_lp1");; /* and loop on the error */ ! 407: } /* end of loop on error */ ! 408: } /* end of compare error */ ! 409: } /* end of WHILE loop */ ! 410: } /* end of subtest 7 */ ! 411: ! 412: ! 413: ! 414: /************************************************************************ ! 415: * ! 416: * SUBTEST 8 - pipelined entry test (stf) ! 417: * ! 418: ************************************************************************/ ! 419: ldf_8() ! 420: { ! 421: force_loop = FALSE; ! 422: subtest = 8; ! 423: for( index = 0; index < max_ldf_1_index; index++ ) { ! 424: sgl_ld_acc = ldf_1_data[index].ld; /* get value to load */ ! 425: sgl_expected = ldf_1_data[index].exp; /* get expected result */ ! 426: /* ! 427: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 428: * The force loop flag is set after the first error. ! 429: */ ! 430: asm("_ldf_8_lp1:"); ! 431: asm("ldf _sgl_ld_acc"); /* load the value */ ! 432: asm("stf _sgl_st_acc"); /* store the result */ ! 433: if( force_loop ) ! 434: asm("brb _ldf_8_lp1");; /* loop on the error */ ! 435: /* ! 436: * end error loop - test the results ! 437: */ ! 438: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 439: errcnt++; /* bump the error count */ ! 440: if( prt_error ) { ! 441: print_ldf_er_hdr(); ! 442: writes(" (Piped Exit) - BAD FINAL ACC\n"); ! 443: print_ldf_data(); ! 444: writes(", data index = "); ! 445: writed( index ); ! 446: writec('\n'); ! 447: writes(" Acc expected = "); ! 448: write32h( sgl_expected ); ! 449: writec('\n'); ! 450: } ! 451: if( halt_flg ) ! 452: ldf_er_halt( BAD_ACC_HLT ); /* halt on the error */ ! 453: if( loop_on_err ) { ! 454: force_loop = TRUE; /* set the force loop flag */ ! 455: asm("brw _ldf_8_lp1");; /* and loop on the error */ ! 456: } /* end of loop on error */ ! 457: } /* end of compare error */ ! 458: } /* end of WHILE loop */ ! 459: } /* end of subtest 8 */ ! 460: ! 461: ! 462: ! 463: /************************************************************************** ! 464: * ! 465: * PRINT THE ERROR MESSAGE HEADER ! 466: * ! 467: **************************************************************************/ ! 468: print_ldf_er_hdr() ! 469: { ! 470: writes(" \n"); /* start a new print line */ ! 471: writes("cycle: "); /* print the cycle count */ ! 472: writed( cycle ); ! 473: writes(" LDF_STF "); /* print test name header */ ! 474: writes("test "); /* print the test number */ ! 475: writed( test_no ); ! 476: writes(", subtest "); /* print subtest number */ ! 477: writed( subtest ); ! 478: } ! 479: ! 480: ! 481: ! 482: /************************************************************************** ! 483: * ! 484: * PRINT THE DATA AND STORE RESULTS ! 485: * ! 486: * Acc loaded = xxxxxxxx, Acc stored = xxxxxxxx, data index = xx ! 487: * Acc expected = xxxxxxxx ! 488: **************************************************************************/ ! 489: print_ldf_data() ! 490: { ! 491: writes(" Acc loaded = "); ! 492: write32h( sgl_ld_acc ); ! 493: writes(", Acc stored = "); ! 494: write32h( sgl_st_acc ); ! 495: } ! 496: ! 497: ! 498: ! 499: /************************************************************************** ! 500: * ! 501: * HALT ON ERROR ROUTINE ! 502: * ! 503: **************************************************************************/ ! 504: ldf_er_halt( halt_code ) ! 505: int halt_code; ! 506: { ! 507: sgl_dummy1 = halt_code; /* get the error type */ ! 508: asm("movl _test_no,r0"); /* r0 = test number */ ! 509: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 510: asm("movl _sgl_dummy1,r2"); /* r2 = error code */ ! 511: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 512: asm("movl _sgl_ld_acc,r4"); /* r4 = data loaded */ ! 513: asm("movl _sgl_st_acc,r5"); /* r5 = data stored */ ! 514: if( halt_code == BAD_ACC_HLT ) { ! 515: asm("movl _sgl_expected,r6"); /* r6 = data expected */ ! 516: asm("movl _index,r7"); /* r7 = data index */ ! 517: } else ! 518: if( halt_code == BAD_REG_HLT ) { ! 519: sgl_dummy1 = load_regs[index2]; ! 520: sgl_dummy2 = store_regs[index2]; ! 521: asm("movl _index2,r6"); /* r6 = bad register # */ ! 522: asm("movl _sgl_dummy2,r7"); /* r7 = final reg value */ ! 523: asm("movl _sgl_dummy1,r8"); /* r8 = expected value */ ! 524: } else ! 525: if( halt_code == BAD_PSL_HLT ) { ! 526: asm("movl _init_psl,r6"); /* r6 = initial PSL */ ! 527: asm("movl _psl_val,r7"); /* r7 = final PSL */ ! 528: asm("movl _exp_psl,r8"); /* r8 = expected PSL */ ! 529: }; ! 530: asm("halt"); /* HALT ... */ ! 531: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.