|
|
1.1 ! root 1: #include "fpp_defs.h" ! 2: ! 3: ! 4: /*************************************************************************** ! 5: * ! 6: * MULL3 -MULTIPLY INTEGER 3 INSTRUCTION TEST ! 7: * ! 8: *****************************************************************************/ ! 9: mull3() ! 10: { ! 11: asm(".globl _mull3_t"); ! 12: asm("_mull3_t:"); /* entry address */ ! 13: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */ ! 14: { ! 15: writes(" MULL3"); ! 16: } ! 17: mull3_1(); /* register data / SGL acc. */ ! 18: mull3_2(); /* memory data / DBL acc. */ ! 19: mull3_3(); /* register corruption test */ ! 20: mull3_4(); /* PSL corruption test */ ! 21: mull3_5(); /* pipelined entry test */ ! 22: mull3_6(); /* pipelined exit test */ ! 23: asm("jmp *return"); /* return to the test monitor */ ! 24: } ! 25: ! 26: ! 27: ! 28: /************************************************************************ ! 29: * ! 30: * SUBTEST 1 - register addressing / single precsion accumulator ! 31: * ! 32: ************************************************************************/ ! 33: mull3_1() ! 34: { ! 35: force_loop = FALSE; ! 36: subtest = 1; ! 37: for( index = 0; index < max_mull_1_index; index++ ) { ! 38: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 39: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 40: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 41: sgl_ld_acc = 0x12345678; /* set acc data pattern */ ! 42: sgl_expected = sgl_ld_acc; /* final Acc expected */ ! 43: /* ! 44: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 45: */ ! 46: asm("_mull3_1_lp1:"); ! 47: asm("movl _sgl_value_1,r3"); /* move the 1st data to r3 */ ! 48: asm("movl _sgl_value_2,r4"); /* move the 2nd data to r4 */ ! 49: asm("ldf _sgl_ld_acc"); /* load the acc */ ! 50: asm("mull3 r3,r4,r5"); /* do the multiply */ ! 51: asm("nop"); ! 52: asm("stf _sgl_st_acc"); /* save the acc */ ! 53: if( force_loop ) ! 54: asm("brb _mull3_1_lp1");; ! 55: asm("movl r5,_sgl_value_3"); ! 56: if( sgl_expected != sgl_st_acc ) { /* COMPARE the values */ ! 57: errcnt++; /* bump the error count */ ! 58: if ( prt_error ) { ! 59: print_mull3_error("(Reg. Data) -THE ACC WAS MODIFIED"); ! 60: writes("initial Acc = "); ! 61: write32h( sgl_ld_acc ); ! 62: writes(", final Acc = "); ! 63: write32h( sgl_st_acc ); ! 64: writes("\n expected Acc = "); ! 65: write32h( sgl_expected ); ! 66: writec('\n'); ! 67: } ! 68: if ( halt_flg ) /* halt on error? */ ! 69: mull3_halt( 4 ); ! 70: if ( loop_on_err ) { ! 71: force_loop = TRUE; /* set the force loop flag */ ! 72: asm("jmp _mull3_1_lp1"); /* and loop */ ! 73: } /* end of loop-on-error */ ! 74: } /* end of acc corr error */ ! 75: if( sgl_value_4 != sgl_value_3 ) /* COMPARE the values */ ! 76: { ! 77: errcnt++; /* bump the error count */ ! 78: if ( prt_error ) { ! 79: print_mull3_error("(Reg. Data) -BAD MULTIPLY RESULT"); ! 80: } ! 81: if ( halt_flg ) /* halt on error? */ ! 82: mull3_halt( 1 ); ! 83: if ( loop_on_err ) { ! 84: force_loop = TRUE; /* set the force loop flag */ ! 85: asm("jmp _mull3_1_lp1"); /* and loop */ ! 86: } /* end of loop-on-error */ ! 87: } /* end of multiply error */ ! 88: } ! 89: } /* end of subtest 1 */ ! 90: ! 91: ! 92: ! 93: /************************************************************************ ! 94: * ! 95: * SUBTEST 2 - cache addressing / double precsion accumulator ! 96: * ! 97: ************************************************************************/ ! 98: mull3_2() ! 99: { ! 100: force_loop = FALSE; ! 101: subtest = 2; ! 102: for( index = 0; index < max_mull_1_index; index++ ) { ! 103: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 104: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 105: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 106: dbl_ld_acc.m = 0x12345678; /* set acc data pattern */ ! 107: dbl_ld_acc.l = 0x9abcdef0; ! 108: dbl_expected.m = dbl_ld_acc.m; /* final Acc expected */ ! 109: dbl_expected.l = dbl_ld_acc.l; ! 110: /* ! 111: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 112: */ ! 113: asm("_mull3_2_lp1:"); ! 114: asm("ldd _dbl_ld_acc"); /* load the acc */ ! 115: asm("mull3 _sgl_value_1,_sgl_value_2,_sgl_value_3"); ! 116: asm("nop"); ! 117: asm("std _dbl_st_acc"); /* save the acc */ ! 118: if( force_loop ) ! 119: asm("brb _mull3_2_lp1");; ! 120: if( (dbl_expected.m != dbl_st_acc.m) || /* COMPARE the Acc */ ! 121: (dbl_expected.l != dbl_st_acc.l) ) { ! 122: errcnt++; /* bump the error count */ ! 123: if ( prt_error ) { ! 124: print_mull3_error("(Memory data) -THE ACC WAS MODIFIED"); ! 125: writes("initial Acc = "); ! 126: write32h( dbl_ld_acc.m ); ! 127: writec(' '); ! 128: write32h( dbl_ld_acc.l ); ! 129: writes(", final Acc = "); ! 130: write32h( dbl_st_acc.m ); ! 131: writec(' '); ! 132: write32h( dbl_st_acc.l ); ! 133: writes("\n expected Acc = "); ! 134: write32h( dbl_expected.m ); ! 135: writec(' '); ! 136: write32h( dbl_expected.l ); ! 137: writec('\n'); ! 138: } ! 139: if ( halt_flg ) /* halt on error? */ ! 140: mull3_halt( 4 ); ! 141: if ( loop_on_err ) { ! 142: force_loop = TRUE; /* set the force loop flag */ ! 143: asm("jmp _mull3_2_lp1"); /* and loop */ ! 144: } /* end of loop-on-error */ ! 145: } /* end of acc corr error */ ! 146: if( sgl_value_4 != sgl_value_3 ) /* COMPARE the values */ ! 147: { ! 148: errcnt++; /* bump the error count */ ! 149: if ( prt_error ) { ! 150: print_mull3_error("(Memory data) -BAD MULTIPLY RESULT"); ! 151: } ! 152: if ( halt_flg ) /* halt on error? */ ! 153: mull3_halt( 1 ); ! 154: if ( loop_on_err ) { ! 155: force_loop = TRUE; /* set the force loop flag */ ! 156: asm("jmp _mull3_2_lp1"); /* and loop */ ! 157: } /* end of loop-on-error */ ! 158: } /* end of multiply error */ ! 159: } ! 160: } /* end of subtest 2 */ ! 161: ! 162: ! 163: ! 164: /************************************************************************ ! 165: * ! 166: * SUBTEST 3 - register corruption test ! 167: * ! 168: ************************************************************************/ ! 169: mull3_3() ! 170: { ! 171: force_loop = FALSE; ! 172: subtest = 2; ! 173: fill_reg_buf( load_regs ); /* get pattern for registers */ ! 174: for( index = 0; index < max_mull_1_index; index++ ) { ! 175: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 176: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 177: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 178: /* ! 179: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 180: */ ! 181: asm("_mull3_3_lp1:"); ! 182: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */ ! 183: asm("mull3 _sgl_value_1,_sgl_value_2,_sgl_value_3"); ! 184: asm("nop"); ! 185: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */ ! 186: if( force_loop ) ! 187: asm("brb _mull3_3_lp1"); ! 188: /* ! 189: * Now check the result ! 190: */ ! 191: index2 = 0; ! 192: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) ) ! 193: index2++; /* check reg values */ ! 194: if( index2 < 13 ) { /* error if index2 < 13 */ ! 195: errcnt++; /* bump the error count */ ! 196: if ( prt_error ) { ! 197: print_mull3_error(" -A REGISTER WAS MODIFIED"); ! 198: writes("register "); ! 199: writeh( index2 ); ! 200: writes(" = "); ! 201: write32h( store_regs[index2] ); ! 202: writes(", should be = "); ! 203: write32h( load_regs[index2] ); ! 204: writec('\n'); ! 205: } ! 206: if ( halt_flg ) /* halt on error? */ ! 207: mull3_halt( 2 ); ! 208: if ( loop_on_err ) { ! 209: force_loop = TRUE; /* set the force loop flag */ ! 210: asm("jmp _mull3_3_lp1"); /* and loop */ ! 211: }; /* end of loop-on-error */ ! 212: } /* end of multiply error */ ! 213: } ! 214: } /* end of subtest 3 */ ! 215: ! 216: ! 217: ! 218: /************************************************************************ ! 219: * ! 220: * SUBTEST 4 - PSL corruption test ! 221: * ! 222: ************************************************************************/ ! 223: mull3_4() ! 224: { ! 225: force_loop = FALSE; ! 226: subtest = 4; ! 227: status_index = 0; ! 228: for( index = 0; index < max_mull_1_index; index++ ) { ! 229: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 230: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 231: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 232: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */ ! 233: /* ! 234: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 235: */ ! 236: asm("_mull3_4_lp1:"); ! 237: asm("tstl _sgl_dummy1"); ! 238: asm("movpsl _init_psl"); /* save the initial PSL */ ! 239: asm("mull3 _sgl_value_1,_sgl_value_2,_sgl_value_3"); ! 240: asm("movpsl _psl_val"); /* save the final PSL */ ! 241: if( force_loop ) ! 242: asm("brb _mull3_4_lp1"); ! 243: /* ! 244: * Now check the result ! 245: */ ! 246: exp_psl = init_psl & 0xffffff3; /* strip off the PSL status */ ! 247: if( sgl_value_4 < 0 ) /* check the MULL result */ ! 248: exp_psl |= PSL_N; /* set the NEGATIVE bit */ ! 249: if( !sgl_value_4 ) ! 250: exp_psl |= PSL_Z; /* set the ZERO bit */ ! 251: if( psl_val != exp_psl ) { /* was the final PSL correct */ ! 252: errcnt++; /* bump the error count */ ! 253: if ( prt_error ) { ! 254: print_mull3_error(" -INCORRECT FINAL PSL"); ! 255: writes("initial PSL = "); ! 256: write32h( init_psl ); ! 257: writes(", final PSL = "); ! 258: write32h( psl_val ); ! 259: writes(", expected PSL = "); ! 260: write32h( exp_psl ); ! 261: writec('\n'); ! 262: } ! 263: if ( halt_flg ) /* halt on error? */ ! 264: mull3_halt( 3 ); ! 265: if ( loop_on_err ) { ! 266: force_loop = TRUE; /* set the force loop flag */ ! 267: asm("jmp _mull3_4_lp1"); /* and loop */ ! 268: }; /* end of loop-on-error */ ! 269: }; /* end of error */ ! 270: if( ++status_index >= 3 ) ! 271: status_index = 0; ! 272: } ! 273: } /* end of subtest 4 */ ! 274: ! 275: ! 276: ! 277: /************************************************************************ ! 278: * ! 279: * SUBTEST 5 - Pipelined Entry test ! 280: * ! 281: ************************************************************************/ ! 282: mull3_5() ! 283: { ! 284: force_loop = FALSE; ! 285: subtest = 5; ! 286: for( index = 0; index < max_mull_1_index; index++ ) { ! 287: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 288: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 289: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 290: sgl_ld_acc = 0x12345678; /* set acc data pattern */ ! 291: sgl_expected = sgl_ld_acc; /* final Acc expected */ ! 292: sgl_value_10 = 0x40800000; /* floating "1.0" */ ! 293: /* ! 294: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 295: */ ! 296: asm("_mull3_5_lp1:"); ! 297: asm("ldf _sgl_ld_acc"); /* load the acc */ ! 298: asm("mulf _sgl_value_10"); /* do a floating multiply */ ! 299: asm("mull3 _sgl_value_1,_sgl_value_2,_sgl_value_3"); ! 300: asm("stf _sgl_st_acc"); /* save the acc */ ! 301: if( force_loop ) ! 302: asm("brb _mull3_5_lp1");; ! 303: if( sgl_expected != sgl_st_acc ) { /* COMPARE the values */ ! 304: errcnt++; /* bump the error count */ ! 305: if ( prt_error ) { ! 306: print_mull3_error("(Piped Entry) -BAD FINAL ACC"); ! 307: writes("initial Acc = "); ! 308: write32h( sgl_ld_acc ); ! 309: writes(", final Acc = "); ! 310: write32h( sgl_st_acc ); ! 311: writes("\nFPP operand = "); ! 312: write32h( sgl_value_10 ); ! 313: writes(", expected Acc = "); ! 314: write32h( sgl_expected ); ! 315: writec('\n'); ! 316: } ! 317: if ( halt_flg ) /* halt on error? */ ! 318: mull3_halt( 5 ); ! 319: if ( loop_on_err ) { ! 320: force_loop = TRUE; /* set the force loop flag */ ! 321: asm("jmp _mull3_5_lp1"); /* and loop */ ! 322: } /* end of loop-on-error */ ! 323: } /* end of acc corr error */ ! 324: if( sgl_value_4 != sgl_value_3 ) /* COMPARE the values */ ! 325: { ! 326: errcnt++; /* bump the error count */ ! 327: if ( prt_error ) { ! 328: print_mull3_error("(Piped Entry) -BAD MULTIPLY RESULT"); ! 329: } ! 330: if ( halt_flg ) /* halt on error? */ ! 331: mull3_halt( 1 ); ! 332: if ( loop_on_err ) { ! 333: force_loop = TRUE; /* set the force loop flag */ ! 334: asm("jmp _mull3_5_lp1"); /* and loop */ ! 335: } /* end of loop-on-error */ ! 336: } /* end of multiply error */ ! 337: } ! 338: } /* end of subtest 5 */ ! 339: ! 340: ! 341: ! 342: /************************************************************************ ! 343: * ! 344: * SUBTEST 6 - Pipelined Exit test ! 345: * ! 346: ************************************************************************/ ! 347: mull3_6() ! 348: { ! 349: force_loop = FALSE; ! 350: subtest = 6; ! 351: for( index = 0; index < max_mull_1_index; index++ ) { ! 352: sgl_value_1 = mull_1_data[index].op_1; /* get operand 1 */ ! 353: sgl_value_2 = mull_1_data[index].op_2; /* get operand 2 */ ! 354: sgl_value_4 = mull_1_data[index].exp; /* get expected results */ ! 355: sgl_ld_acc = 0x40800000; /* floating "1.0" */ ! 356: sgl_value_10 = 0x12345678; /* set acc data pattern */ ! 357: sgl_expected = sgl_value_10; /* final Acc expected */ ! 358: /* ! 359: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 360: */ ! 361: asm("_mull3_6_lp1:"); ! 362: asm("ldf _sgl_ld_acc"); /* load the acc */ ! 363: asm("mull3 _sgl_value_1,_sgl_value_2,_sgl_value_3"); ! 364: asm("mulf _sgl_value_10"); /* do a floating multiply */ ! 365: asm("stf _sgl_st_acc"); /* save the acc */ ! 366: if( force_loop ) ! 367: asm("brb _mull3_6_lp1");; ! 368: if( sgl_expected != sgl_st_acc ) { /* COMPARE the values */ ! 369: errcnt++; /* bump the error count */ ! 370: if ( prt_error ) { ! 371: print_mull3_error("(Piped Exit) -BAD FINAL ACC"); ! 372: writes("initial Acc = "); ! 373: write32h( sgl_ld_acc ); ! 374: writes(", final Acc = "); ! 375: write32h( sgl_st_acc ); ! 376: writes("\nFPP operand = "); ! 377: write32h( sgl_value_10 ); ! 378: writes(", expected Acc = "); ! 379: write32h( sgl_expected ); ! 380: writec('\n'); ! 381: } ! 382: if ( halt_flg ) /* halt on error? */ ! 383: mull3_halt( 5 ); ! 384: if ( loop_on_err ) { ! 385: force_loop = TRUE; /* set the force loop flag */ ! 386: asm("jmp _mull3_6_lp1"); /* and loop */ ! 387: } /* end of loop-on-error */ ! 388: } /* end of acc corr error */ ! 389: if( sgl_value_4 != sgl_value_3 ) /* COMPARE the values */ ! 390: { ! 391: errcnt++; /* bump the error count */ ! 392: if ( prt_error ) { ! 393: print_mull3_error("(Piped Exit) -BAD MULTIPLY RESULT"); ! 394: } ! 395: if ( halt_flg ) /* halt on error? */ ! 396: mull3_halt( 1 ); ! 397: if ( loop_on_err ) { ! 398: force_loop = TRUE; /* set the force loop flag */ ! 399: asm("jmp _mull3_6_lp1"); /* and loop */ ! 400: } /* end of loop-on-error */ ! 401: } /* end of multiply error */ ! 402: } ! 403: } /* end of subtest 6 */ ! 404: ! 405: ! 406: ! 407: /***************************************************************************** ! 408: * ! 409: * Print an error message of the form: ! 410: * ! 411: * cycle: xx MULL3 test xx, subtest xx <"your message here"> ! 412: * operand 1 = xxxxxxxx, result = xxxxxxxx, data index = xx ! 413: * operand 2 = xxxxxxxx, expected = xxxxxxxx ! 414: * ! 415: *****************************************************************************/ ! 416: print_mull3_error(msg) ! 417: char *msg; /* addressing mode msg */ ! 418: { ! 419: writes(" \n"); /* start a new print line */ ! 420: writes("cycle: "); ! 421: writed( cycle ); ! 422: writes(" MULL3 test "); ! 423: writed( test_no ); ! 424: writes(", subtest "); ! 425: writed( subtest ); ! 426: writes(" "); ! 427: writes( msg ); ! 428: writes("\n operand 1 = "); ! 429: write32h( sgl_value_1 ); ! 430: writes(", result = "); ! 431: write32h( sgl_value_3 ); ! 432: writes(", data index = "); ! 433: writed( index ); ! 434: writes("\n operand 2 = "); ! 435: write32h( sgl_value_2 ); ! 436: writes(", expected = "); ! 437: write32h( sgl_value_4 ); ! 438: writec('\n'); ! 439: } ! 440: ! 441: ! 442: ! 443: /*************************************************************************** ! 444: * ! 445: * HALT ON AN ERROR ! 446: * ! 447: ***************************************************************************/ ! 448: mull3_halt( code ) ! 449: int code; /* error code to use */ ! 450: { ! 451: sgl_dummy1 = code; /* save the error code */ ! 452: asm("movl _test_no,r0"); /* r0 = test number */ ! 453: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 454: asm("movl _sgl_dummy1,r2"); /* r2 = error code */ ! 455: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 456: asm("movl _sgl_value_1,r4"); /* r4 = operand 1 */ ! 457: asm("movl _sgl_value_2,r5"); /* r5 = operand 2 */ ! 458: asm("movl _sgl_value_3,r6"); /* r6 = MULL3's result */ ! 459: if( code == 1 ) { ! 460: asm("movl _sgl_value_4,r7"); /* r7 = expected result */ ! 461: asm("movl _index,r8");; /* r8 = data index */ ! 462: } ! 463: else if( code == 2 ) { /* corrupted register */ ! 464: sgl_dummy1 = store_regs[index2]; /* get the actual reg data */ ! 465: sgl_dummy2 = load_regs[index2]; /* get the data expected */ ! 466: asm("movl _index2,r7"); /* r7 = register number */ ! 467: asm("movl _sgl_dummy1,r8"); /* r8 = final reg value */ ! 468: asm("movl _sgl_dummy2,r9"); /* r9 = expected value */ ! 469: } ! 470: else if( code == 3 ) { /* corrupted PSL */ ! 471: asm("movl _init_psl,r7"); /* r7 = initial PSL */ ! 472: asm("movl _psl_val,r8"); /* r8 = final PSL */ ! 473: asm("movl _exp_psl,r9"); /* r9 = expected PSL */ ! 474: } ! 475: else if( code == 4 ) { /* corrupted Acc */ ! 476: if( subtest == 1 ) { /* single precision */ ! 477: dbl_ld_acc.m = sgl_ld_acc; ! 478: dbl_ld_acc.l = 0; ! 479: dbl_st_acc.m = sgl_st_acc; ! 480: dbl_st_acc.l = 0; ! 481: dbl_expected.m = sgl_expected; ! 482: dbl_expected.l = 0; ! 483: }; ! 484: asm("movl _index,r7"); /* r7 = data index */ ! 485: asm("movl _dbl_ld_acc,r8"); /* r8 = MS initial Acc. */ ! 486: asm("movl _dbl_ld_acc+4,r9"); /* r9 = LS initial Acc. */ ! 487: asm("movl _dbl_st_acc,r10"); /* r10 = MS final Acc. */ ! 488: asm("movl _dbl_st_acc+4,r11"); /* r11 = LS final Acc. */ ! 489: asm("movl _dbl_expected,r12"); /* r12 = MS expected Acc. */ ! 490: asm("movl _dbl_expected+4,r13"); /* r13 = LS expected Acc. */ ! 491: } ! 492: else if( code == 5 ) { /* bad final Acc */ ! 493: asm("movl _index,r7"); /* r7 = data index */ ! 494: asm("movl _sgl_ld_acc,r8"); /* r8 = initial Acc. */ ! 495: asm("movl _sgl_value_10,r9"); /* r9 = fpp operand */ ! 496: asm("movl _sgl_st_acc,r10"); /* r10 = final Acc. */ ! 497: asm("movl _sgl_expected,r11"); /* r11 = expected Acc. */ ! 498: }; ! 499: asm("halt"); /* HALT ... */ ! 500: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.