|
|
1.1 ! root 1: #include "fpp_defs.h" ! 2: ! 3: ! 4: ! 5: /*************************************************************************** ! 6: * ! 7: * CMPF2 -COMPARE 2 SGL OPERANDS TO EACH OTHER -IGNORE THE ACCUMULATOR ! 8: * ! 9: *****************************************************************************/ ! 10: cmpf2() ! 11: { ! 12: asm(".globl _cmpf2_t"); ! 13: asm("_cmpf2_t:"); /* entry address */ ! 14: if( ( cycle == 1 ) && ( prt_hdrs ) ) /* print headers on 1st pass */ ! 15: writes(" CMPF2"); ! 16: cmpf2_1(); /* register / register data */ ! 17: cmpf2_2(); /* cache / cache data */ ! 18: cmpf2_3(); /* cache / register data */ ! 19: cmpf2_4(); /* register / cache data */ ! 20: cmpf2_5(); /* acc. corruption test */ ! 21: cmpf2_6(); /* register corruption test */ ! 22: if( !no_fpp_wcs ) { ! 23: cmpf2_7(); /* pipelined entry test */ ! 24: cmpf2_8(); /* pipelined exit test */ ! 25: }; ! 26: asm("jmp *return"); /* return to the test monitor */ ! 27: } ! 28: ! 29: ! 30: ! 31: /**************************************************************************** ! 32: * ! 33: * SUBTEST 1 - CMPF2 test -register / register data ! 34: * ! 35: ****************************************************************************/ ! 36: cmpf2_1() ! 37: { ! 38: force_loop = FALSE; ! 39: subtest = 1; ! 40: index = 0; ! 41: do ! 42: { ! 43: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 44: sgl_value_2 = cmpf_1_data[index].two; ! 45: sgl_expected = cmpf_1_data[index].flag; /* get expected results */ ! 46: index2 = 0; /* clear Acc. data index */ ! 47: do ! 48: { ! 49: sgl_ld_acc = ldf_1_data[index2++].ld; /* get the Accumulator data */ ! 50: status_index = 0; /* clear the status index */ ! 51: do ! 52: { ! 53: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 54: /* ! 55: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 56: * The force loop flag is set after the first error. ! 57: */ ! 58: asm("_cmpf2_1_lp1:"); ! 59: asm("movl _sgl_ld_acc,r3"); /* get the accmulator data */ ! 60: asm("movl _sgl_value_1,r4"); /* move operand #1 to r4 */ ! 61: asm("movl _sgl_value_2,r5"); /* move operand #2 to r5 */ ! 62: asm("ldf r3"); /* load the accumulator */ ! 63: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 64: asm("movpsl _init_psl"); /* save the initial status */ ! 65: asm("cmpf2 r4,r5"); /* compare the operands */ ! 66: asm("movpsl _psl_val"); /* save the final status */ ! 67: asm("stf r6"); /* save the accumulator */ ! 68: if( force_loop ) /* loop? */ ! 69: asm("brb _cmpf2_1_lp1");; /* run the loop again */ ! 70: asm("movl r6,_sgl_st_acc"); /* put the acc into cache */ ! 71: exp_psl = init_psl; /* get the initial PSL */ ! 72: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 73: if( sgl_expected == ZERO ) ! 74: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 75: if( sgl_expected == NEGATIVE ) ! 76: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 77: if( psl_val != exp_psl ) /* COMPARE the values */ ! 78: { ! 79: errcnt++; /* bump the error count */ ! 80: if ( prt_error ) { ! 81: writes(" \n"); /* start a new print line */ ! 82: writes("cycle: "); ! 83: writed( cycle ); ! 84: writes(" CMPF2 test "); ! 85: writed( test_no ); ! 86: writes(", subtest 1 (Reg./Reg. Data) - BAD FINAL PSL\n"); ! 87: print_cmpf2_data(); ! 88: writes(", data index = "); ! 89: writed( index ); ! 90: writec('\n'); ! 91: writes(" final Acc = "); ! 92: write32h( sgl_st_acc ); ! 93: writes(", operand 2 = "); ! 94: write32h( sgl_value_2 ); ! 95: writec('\n'); ! 96: writes(" initial PSL = "); ! 97: write32h( init_psl ); ! 98: writes(", final PSL = "); ! 99: write32h( psl_val ); ! 100: writes(", expected PSL = "); ! 101: write32h( exp_psl ); ! 102: writes(" \n"); ! 103: } ! 104: if ( halt_flg ) ! 105: cmpf2_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 106: if ( loop_on_err ) { ! 107: force_loop = TRUE; /* set the force loop flag */ ! 108: asm("brw _cmpf2_1_lp1"); /* and loop */ ! 109: }; /* end of loop-on-error */ ! 110: } /* end of compare error */ ! 111: } while( ++status_index < 3 ); ! 112: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 113: } while( index++ < max_cmpf_1_index ); ! 114: } /* end of subtest 1 */ ! 115: ! 116: ! 117: ! 118: /**************************************************************************** ! 119: * ! 120: * SUBTEST 2 - CMPF2 test - cache / cache data ! 121: * ! 122: ****************************************************************************/ ! 123: cmpf2_2() ! 124: { ! 125: force_loop = FALSE; ! 126: subtest = 2; ! 127: index = 0; ! 128: do ! 129: { ! 130: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 131: sgl_value_2 = cmpf_1_data[index].two; ! 132: sgl_expected = cmpf_1_data[index].flag; /* get expected results */ ! 133: index2 = 0; /* clear Acc. data index */ ! 134: do ! 135: { ! 136: sgl_ld_acc = ldf_1_data[index2++].ld; /* get the Accumulator data */ ! 137: status_index = 0; /* clear the status index */ ! 138: do ! 139: { ! 140: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 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("_cmpf2_2_lp1:"); ! 146: asm("movl _sgl_ld_acc,r3"); /* get the accmulator data */ ! 147: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 148: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 149: asm("movpsl _init_psl"); /* save the initial status */ ! 150: asm("cmpf2 _sgl_value_1,_sgl_value_2"); /* compare the data */ ! 151: asm("movpsl _psl_val"); /* save the final status */ ! 152: asm("stf _sgl_st_acc"); /* save the acc */ ! 153: if( force_loop ) /* loop? */ ! 154: asm("brb _cmpf2_2_lp1");; /* run the loop again */ ! 155: exp_psl = init_psl; /* get the initial PSL */ ! 156: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 157: if( sgl_expected == ZERO ) ! 158: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 159: if( sgl_expected == NEGATIVE ) ! 160: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 161: if( psl_val != exp_psl ) /* COMPARE the values */ ! 162: { ! 163: errcnt++; /* bump the error count */ ! 164: if ( prt_error ) { ! 165: writes(" \n"); /* start a new print line */ ! 166: writes("cycle: "); ! 167: writed( cycle ); ! 168: writes(" CMPF2 test "); ! 169: writed( test_no ); ! 170: writes(", subtest 2 (Cache/Cache Data) - BAD FINAL PSL\n"); ! 171: print_cmpf2_data(); ! 172: writes(", data index = "); ! 173: writed( index ); ! 174: writec('\n'); ! 175: writes(" final Acc = "); ! 176: write32h( sgl_st_acc ); ! 177: writes(", operand 2 = "); ! 178: write32h( sgl_value_2 ); ! 179: writec('\n'); ! 180: writes(" initial PSL = "); ! 181: write32h( init_psl ); ! 182: writes(", final PSL = "); ! 183: write32h( psl_val ); ! 184: writes(", expected PSL = "); ! 185: write32h( exp_psl ); ! 186: writes(" \n"); ! 187: } ! 188: if ( halt_flg ) ! 189: cmpf2_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 190: if ( loop_on_err ) ! 191: { ! 192: force_loop = TRUE; /* set the force loop flag */ ! 193: asm("brw _cmpf2_2_lp1"); /* and loop */ ! 194: }; /* end of loop-on-error */ ! 195: } /* end of compare error */ ! 196: } while( ++status_index < 3 ); ! 197: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 198: } while( index++ < max_cmpf_1_index ); ! 199: } /* end of subtest 2 */ ! 200: ! 201: ! 202: ! 203: /**************************************************************************** ! 204: * ! 205: * SUBTEST 3 - CMPF2 test - cache / register data ! 206: * ! 207: ****************************************************************************/ ! 208: cmpf2_3() ! 209: { ! 210: force_loop = FALSE; ! 211: subtest = 3; ! 212: index = 0; ! 213: do ! 214: { ! 215: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 216: sgl_value_2 = cmpf_1_data[index].two; ! 217: sgl_expected = cmpf_1_data[index].flag; /* get expected results */ ! 218: index2 = 0; /* clear Acc. data index */ ! 219: do ! 220: { ! 221: sgl_ld_acc = ldf_1_data[index2++].ld; /* get the Accumulator data */ ! 222: status_index = 0; /* clear the status index */ ! 223: do ! 224: { ! 225: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 226: /* ! 227: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 228: * The force loop flag is set after the first error. ! 229: */ ! 230: asm("_cmpf2_3_lp1:"); ! 231: asm("ldf _sgl_ld_acc"); /* load the accmulator */ ! 232: asm("movl _sgl_value_2,r5"); /* move operand #2 to r5 */ ! 233: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 234: asm("movpsl _init_psl"); /* save the initial status */ ! 235: asm("cmpf2 _sgl_value_1,r5"); /* compare the data */ ! 236: asm("movpsl _psl_val"); /* save the final status */ ! 237: asm("stf _sgl_st_acc"); /* save the acc */ ! 238: if( force_loop ) /* loop? */ ! 239: asm("brb _cmpf2_3_lp1");; /* run the loop again */ ! 240: exp_psl = init_psl; /* get the initial PSL */ ! 241: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 242: if( sgl_expected == ZERO ) ! 243: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 244: if( sgl_expected == NEGATIVE ) ! 245: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 246: if( psl_val != exp_psl ) /* COMPARE the values */ ! 247: { ! 248: errcnt++; /* bump the error count */ ! 249: if ( prt_error ) { ! 250: writes(" \n"); /* start a new print line */ ! 251: writes("cycle: "); ! 252: writed( cycle ); ! 253: writes(" CMPF2 test "); ! 254: writed( test_no ); ! 255: writes(", subtest 3 (Cache/Reg. Data) - BAD FINAL PSL\n"); ! 256: print_cmpf2_data(); ! 257: writes(", data index = "); ! 258: writed( index ); ! 259: writec('\n'); ! 260: writes(" final Acc = "); ! 261: write32h( sgl_st_acc ); ! 262: writes(", operand 2 = "); ! 263: write32h( sgl_value_2 ); ! 264: writec('\n'); ! 265: writes(" initial PSL = "); ! 266: write32h( init_psl ); ! 267: writes(", final PSL = "); ! 268: write32h( psl_val ); ! 269: writes(", expected PSL = "); ! 270: write32h( exp_psl ); ! 271: writes(" \n"); ! 272: } ! 273: if ( halt_flg ) ! 274: cmpf2_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 275: if ( loop_on_err ) ! 276: { ! 277: force_loop = TRUE; /* set the force loop flag */ ! 278: asm("brw _cmpf2_3_lp1"); /* and loop */ ! 279: }; /* end of loop-on-error */ ! 280: } /* end of compare error */ ! 281: } while( ++status_index < 3 ); ! 282: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 283: } while( index++ < max_cmpf_1_index ); ! 284: } /* end of subtest 3 */ ! 285: ! 286: ! 287: ! 288: /**************************************************************************** ! 289: * ! 290: * SUBTEST 4 - CMPF2 test - register / cache data ! 291: * ! 292: ****************************************************************************/ ! 293: cmpf2_4() ! 294: { ! 295: force_loop = FALSE; ! 296: subtest = 4; ! 297: index = 0; ! 298: do ! 299: { ! 300: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 301: sgl_value_2 = cmpf_1_data[index].two; ! 302: sgl_expected = cmpf_1_data[index].flag; /* get expected results */ ! 303: index2 = 0; /* clear Acc. data index */ ! 304: do ! 305: { ! 306: sgl_ld_acc = ldf_1_data[index2++].ld; /* get the Accumulator data */ ! 307: status_index = 0; /* clear the status index */ ! 308: do ! 309: { ! 310: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 311: /* ! 312: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 313: * The force loop flag is set after the first error. ! 314: */ ! 315: asm("_cmpf2_4_lp1:"); ! 316: asm("movl _sgl_ld_acc,r3"); /* get the accmulator data */ ! 317: asm("movl _sgl_value_1,r4"); /* move operand #1 to r4 */ ! 318: asm("ldf r3"); /* load the accumulator */ ! 319: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 320: asm("movpsl _init_psl"); /* save the initial status */ ! 321: asm("cmpf2 r4,_sgl_value_2"); /* compare the data */ ! 322: asm("movpsl _psl_val"); /* save the final status */ ! 323: asm("stf _sgl_st_acc"); /* save the acc */ ! 324: if( force_loop ) /* loop? */ ! 325: asm("brb _cmpf2_4_lp1");; /* run the loop again */ ! 326: exp_psl = init_psl; /* get the initial PSL */ ! 327: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 328: if( sgl_expected == ZERO ) ! 329: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 330: if( sgl_expected == NEGATIVE ) ! 331: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 332: if( psl_val != exp_psl ) /* COMPARE the values */ ! 333: { ! 334: errcnt++; /* bump the error count */ ! 335: if ( prt_error ) { ! 336: writes(" \n"); /* start a new print line */ ! 337: writes("cycle: "); ! 338: writed( cycle ); ! 339: writes(" CMPF2 test "); ! 340: writed( test_no ); ! 341: writes(", subtest 4 (Reg./Cache Data) - BAD FINAL PSL\n"); ! 342: print_cmpf2_data(); ! 343: writes(", data index = "); ! 344: writed( index ); ! 345: writec('\n'); ! 346: writes(" final Acc = "); ! 347: write32h( sgl_st_acc ); ! 348: writes(", operand 2 = "); ! 349: write32h( sgl_value_2 ); ! 350: writec('\n'); ! 351: writes(" initial PSL = "); ! 352: write32h( init_psl ); ! 353: writes(", final PSL = "); ! 354: write32h( psl_val ); ! 355: writes(", expected PSL = "); ! 356: write32h( exp_psl ); ! 357: writes(" \n"); ! 358: } ! 359: if ( halt_flg ) ! 360: cmpf2_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 361: if ( loop_on_err ) ! 362: { ! 363: force_loop = TRUE; /* set the force loop flag */ ! 364: asm("jmp _cmpf2_4_lp1"); /* and loop */ ! 365: } /* end of loop-on-error */ ! 366: } /* end of compare error */ ! 367: } while( ++status_index < 3 ); ! 368: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 369: } while( index++ < max_cmpf_1_index ); ! 370: } /* end of subtest 4 */ ! 371: ! 372: ! 373: ! 374: /************************************************************************ ! 375: * ! 376: * SUBTEST 5 - Check for register corruption ! 377: * ! 378: ************************************************************************/ ! 379: cmpf2_5() ! 380: { ! 381: force_loop = FALSE; /* clear force_loop flg */ ! 382: subtest = 5; ! 383: fill_reg_buf( load_regs ); /* get pattern for regs */ ! 384: index = 0; ! 385: do ! 386: { ! 387: sgl_value_1 = cmpf_1_data[index].one; /* data to load */ ! 388: sgl_value_2 = cmpf_1_data[index].two; /* data to compare */ ! 389: /* ! 390: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 391: * The force loop flag is set after the first error. ! 392: */ ! 393: asm("_cmpf2_5_lp1:"); ! 394: asm("ldf $0x40800000"); /* LOAD the accumulator */ ! 395: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */ ! 396: asm("cmpf2 _sgl_value_1,_sgl_value_2"); /* compare the data */ ! 397: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */ ! 398: asm("stf _sgl_st_acc"); /* save the acc */ ! 399: if( force_loop ) /* loop? */ ! 400: asm("brb _cmpf2_5_lp1");; /* run the loop again */ ! 401: /* ! 402: * Now compare the stored register values to those that were loaded ! 403: */ ! 404: index2 = 0; ! 405: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) ) ! 406: index2++; /* check reg values */ ! 407: ! 408: if( index2 < 13 ) { /* error if index2 < 13 */ ! 409: errcnt++; /* bump the error count */ ! 410: if ( prt_error ) { ! 411: writes(" \n"); /* start a new print line */ ! 412: writes("cycle: "); ! 413: writed( cycle ); ! 414: writes(", CMPF2 test "); ! 415: writed( test_no ); ! 416: writes(", subtest 5 - A REGISTER WAS MODIFIED\n"); ! 417: print_cmpf2_data(); ! 418: writec('\n'); ! 419: writes(" final Acc = "); ! 420: write32h( sgl_st_acc ); ! 421: writes(", operand 2 = "); ! 422: write32h( sgl_value_2 ); ! 423: writec('\n'); ! 424: writes("register "); ! 425: writed( index2 ); ! 426: writes(" = "); ! 427: write32h( store_regs[ index2 ] ); ! 428: writes(", should be = "); ! 429: write32h( load_regs[ index2 ] ); ! 430: writes("\n"); ! 431: } ! 432: if ( halt_flg ) ! 433: cmpf2_er_halt( BAD_REG_HLT ); /* halt on the error */ ! 434: if ( loop_on_err ) ! 435: { ! 436: force_loop = TRUE; /* set the force loop flag */ ! 437: asm("jmp _cmpf2_5_lp1"); /* and loop */ ! 438: }; /* end of loop-on-error */ ! 439: } /* end of compare error */ ! 440: } while( index++ < max_cmpf_1_index ); ! 441: } /* end of subtest 5 */ ! 442: ! 443: ! 444: ! 445: /**************************************************************************** ! 446: * ! 447: * SUBTEST 6 - CMPF2 test Accumulator stability test ! 448: * ! 449: ****************************************************************************/ ! 450: cmpf2_6() ! 451: { ! 452: force_loop = FALSE; ! 453: subtest = 6; ! 454: index = 0; ! 455: do ! 456: { ! 457: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 458: sgl_value_2 = cmpf_1_data[index].two; ! 459: index2 = 0; /* clear Acc. data index */ ! 460: do ! 461: { ! 462: sgl_ld_acc = ldf_1_data[index2].ld; /* get the Accumulator data */ ! 463: sgl_expected = ldf_1_data[index2++].exp; /* get expected Acc. */ ! 464: /* ! 465: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 466: * The force loop flag is set after the first error. ! 467: */ ! 468: asm("_cmpf2_6_lp1:"); ! 469: asm("movl _sgl_ld_acc,r3"); /* get the accmulator data */ ! 470: asm("ldf r3"); /* load the accumulator */ ! 471: asm("cmpf2 _sgl_value_1,_sgl_value_2");/* compare the operands */ ! 472: asm("stf _sgl_st_acc"); /* store the accumulator */ ! 473: if( force_loop ) /* loop? */ ! 474: asm("brb _cmpf2_6_lp1");; /* run the loop again */ ! 475: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 476: errcnt++; /* bump the error count */ ! 477: if ( prt_error ) { ! 478: writes(" \n"); /* start a new print line */ ! 479: writes("cycle: "); ! 480: writed( cycle ); ! 481: writes(" CMPF2 test "); ! 482: writed( test_no ); ! 483: writes(", subtest 6 (Acc. Corr.) - THE ACC WAS MODIFIED\n"); ! 484: print_cmpf2_data(); ! 485: writes(", index = "); ! 486: writed( index ); ! 487: writec('\n'); ! 488: writes(" final Acc = "); ! 489: write32h( sgl_st_acc ); ! 490: writes(", operand 2 = "); ! 491: write32h( sgl_value_2 ); ! 492: writec('\n'); ! 493: writes("expected Acc = "); ! 494: write32h( sgl_expected ); ! 495: writec('\n'); ! 496: } ! 497: if ( halt_flg ) /* halt on error? */ ! 498: cmpf2_er_halt( BAD_ACC_HLT ); ! 499: if ( loop_on_err ) ! 500: { ! 501: force_loop = TRUE; /* set the force loop flag */ ! 502: asm("jmp _cmpf2_6_lp1"); /* and loop */ ! 503: }; /* end of loop-on-error */ ! 504: } /* end of compare error */ ! 505: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 506: } while( index++ < max_cmpf_1_index ); ! 507: } /* end of subtest 6 */ ! 508: ! 509: ! 510: ! 511: /**************************************************************************** ! 512: * ! 513: * SUBTEST 7 - CMPF2 test - piped entry ! 514: * ! 515: ****************************************************************************/ ! 516: cmpf2_7() ! 517: { ! 518: force_loop = FALSE; ! 519: subtest = 7; ! 520: index = 0; ! 521: do ! 522: { ! 523: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 524: sgl_value_2 = cmpf_1_data[index].two; ! 525: sgl_expected = cmpf_1_data[index].flag; /* get expected results */ ! 526: index2 = 0; /* clear Acc. data index */ ! 527: do ! 528: { ! 529: sgl_ld_acc = ldf_1_data[index2++].ld; /* get the Accumulator data */ ! 530: status_index = 0; /* clear the status index */ ! 531: do ! 532: { ! 533: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */ ! 534: /* ! 535: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 536: * The force loop flag is set after the first error. ! 537: */ ! 538: asm("_cmpf2_7_lp1:"); ! 539: asm("movl $0,r0"); /* zero the reg */ ! 540: asm("ldf r0"); /* load a zero in the acc */ ! 541: asm("addf _sgl_ld_acc"); /* add initial data to acc */ ! 542: asm("tstl _sgl_dummy1"); /* generate initial status */ ! 543: asm("movpsl _init_psl"); /* save the initial status */ ! 544: asm("cmpf2 _sgl_value_1,_sgl_value_2"); /* compare the data */ ! 545: asm("movpsl _psl_val"); /* save the final status */ ! 546: asm("stf _sgl_st_acc"); /* save the acc */ ! 547: if( force_loop ) /* loop? */ ! 548: asm("brb _cmpf2_7_lp1");; /* run the loop again */ ! 549: exp_psl = init_psl; /* get the initial PSL */ ! 550: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */ ! 551: if( sgl_expected == ZERO ) ! 552: exp_psl |= PSL_Z; /* expect the ZERO bit set */ ! 553: if( sgl_expected == NEGATIVE ) ! 554: exp_psl |= PSL_N; /* expect the NEG bit set */ ! 555: if( psl_val != exp_psl ) /* COMPARE the values */ ! 556: { ! 557: errcnt++; /* bump the error count */ ! 558: if ( prt_error ) { ! 559: writes(" \n"); /* start a new print line */ ! 560: writes("cycle: "); ! 561: writed( cycle ); ! 562: writes(" CMPF2 test "); ! 563: writed( test_no ); ! 564: writes(", subtest 7 (Piped Entry) - BAD FINAL PSL\n"); ! 565: print_cmpf2_data(); ! 566: writes(", data index = "); ! 567: writed( index ); ! 568: writec('\n'); ! 569: writes(" final Acc = "); ! 570: write32h( sgl_st_acc ); ! 571: writes(", operand 2 = "); ! 572: write32h( sgl_value_2 ); ! 573: writec('\n'); ! 574: writes(" initial PSL = "); ! 575: write32h( init_psl ); ! 576: writes(", final PSL = "); ! 577: write32h( psl_val ); ! 578: writes(", expected PSL = "); ! 579: write32h( exp_psl ); ! 580: writes(" \n"); ! 581: } ! 582: if ( halt_flg ) ! 583: cmpf2_er_halt( BAD_PSL_HLT ); /* halt on the error */ ! 584: if ( loop_on_err ) ! 585: { ! 586: force_loop = TRUE; /* set the force loop flag */ ! 587: asm("brw _cmpf2_7_lp1"); /* and loop */ ! 588: }; /* end of loop-on-error */ ! 589: } /* end of compare error */ ! 590: } while( ++status_index < 3 ); ! 591: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 592: } while( index++ < max_cmpf_1_index ); ! 593: } /* end of subtest 7 */ ! 594: ! 595: ! 596: ! 597: /**************************************************************************** ! 598: * ! 599: * SUBTEST 8 - CMPF2 piped exit test ! 600: * ! 601: ****************************************************************************/ ! 602: cmpf2_8() ! 603: { ! 604: force_loop = FALSE; ! 605: subtest = 6; ! 606: index = 0; ! 607: do ! 608: { ! 609: sgl_value_1 = cmpf_1_data[index].one; /* get the data operands */ ! 610: sgl_value_2 = cmpf_1_data[index].two; ! 611: index2 = 0; /* clear Acc. data index */ ! 612: do ! 613: { ! 614: sgl_ld_acc = ldf_1_data[index2].ld; /* get the Accumulator data */ ! 615: sgl_expected = ldf_1_data[index2++].exp; /* get expected Acc. */ ! 616: /* ! 617: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 618: * The force loop flag is set after the first error. ! 619: */ ! 620: asm("_cmpf2_8_lp1:"); ! 621: asm("movl $0,r0"); /* move a zero to r0 */ ! 622: asm("movl _sgl_ld_acc,r3"); /* get the accmulator data */ ! 623: asm("ldf r3"); /* load the accumulator */ ! 624: asm("cmpf2 _sgl_value_1,_sgl_value_2");/* compare the operands */ ! 625: asm("addf r0"); /* add a zero to the acc */ ! 626: asm("stf _sgl_st_acc"); /* store the accumulator */ ! 627: if( force_loop ) /* loop? */ ! 628: asm("brb _cmpf2_8_lp1");; /* run the loop again */ ! 629: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */ ! 630: errcnt++; /* bump the error count */ ! 631: if ( prt_error ) { ! 632: writes(" \n"); /* start a new print line */ ! 633: writes("cycle: "); ! 634: writed( cycle ); ! 635: writes(" CMPF2 test "); ! 636: writed( test_no ); ! 637: writes(", subtest 8 (Piped Exit) - THE ACC WAS MODIFIED\n"); ! 638: print_cmpf2_data(); ! 639: writes(", data index = "); ! 640: writed( index ); ! 641: writec('\n'); ! 642: writes(" final Acc = "); ! 643: write32h( sgl_st_acc ); ! 644: writes(", operand 2 = "); ! 645: write32h( sgl_value_2 ); ! 646: writec('\n'); ! 647: writes("expected Acc = "); ! 648: write32h( sgl_expected ); ! 649: writec('\n'); ! 650: } ! 651: if ( halt_flg ) /* halt on error? */ ! 652: cmpf2_er_halt( BAD_ACC_HLT ); ! 653: if ( loop_on_err ) ! 654: { ! 655: force_loop = TRUE; /* set the force loop flag */ ! 656: asm("jmp _cmpf2_8_lp1"); /* and loop */ ! 657: }; /* end of loop-on-error */ ! 658: } /* end of compare error */ ! 659: } while( (index2 < 10) && (index2 < max_ldf_1_index) ); ! 660: } while( index++ < max_cmpf_1_index ); ! 661: } /* end of subtest 8 */ ! 662: ! 663: ! 664: ! 665: /************************************************************************** ! 666: * ! 667: * PRINT THE DATA AND STORE RESULTS ! 668: * ! 669: * initial Acc = xxxxxxxx, stored = xxxxxxxx, data index = xx ! 670: * operand = xxxxxxxx, expected = xxxxxxxx ! 671: **************************************************************************/ ! 672: print_cmpf2_data() ! 673: { ! 674: writes(" initial Acc = "); ! 675: write32h( sgl_ld_acc ); ! 676: writes(", operand 1 = "); ! 677: write32h( sgl_value_1 ); ! 678: } ! 679: ! 680: ! 681: ! 682: /************************************************************************** ! 683: * ! 684: * HALT ON ERROR ROUTINE ! 685: * ! 686: **************************************************************************/ ! 687: cmpf2_er_halt( halt_code ) ! 688: int halt_code; ! 689: { ! 690: sgl_dummy1 = halt_code; /* get the error type */ ! 691: asm("movl _test_no,r0"); /* r0 = test number */ ! 692: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 693: asm("movl _sgl_dummy1,r2"); /* r2 = error code */ ! 694: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 695: asm("movl _sgl_ld_acc,r4"); /* r4 = initial data */ ! 696: asm("movl _sgl_value_1,r5"); /* r5 = operand 1 */ ! 697: asm("movl _sgl_value_2,r6"); /* r6 = operand 2 */ ! 698: asm("movl _psl_val,r7"); /* r7 = actual PSL */ ! 699: if( halt_code == BAD_ACC_HLT ) { ! 700: asm("movl _sgl_st_acc,r8"); /* r8 = actual value */ ! 701: asm("movl _sgl_expected,r9"); /* r9 = expected value */ ! 702: } else ! 703: if( halt_code == BAD_REG_HLT ) { ! 704: sgl_dummy1 = load_regs[index2]; ! 705: sgl_dummy2 = store_regs[index2]; ! 706: asm("movl _index2,r8"); /* r8 = bad register # */ ! 707: asm("movl _sgl_dummy2,r9"); /* r9 = actual value */ ! 708: asm("movl _sgl_dummy1,r10"); /* r10 = expected value */ ! 709: } else ! 710: if( halt_code == BAD_PSL_HLT ) { ! 711: asm("movl _exp_psl,r7"); /* r8 = expected PSL */ ! 712: asm("movl _index,r9"); /* r9 = data index */ ! 713: }; ! 714: asm("halt"); /* HALT ... */ ! 715: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.