|
|
1.1 ! root 1: #include "fpp_defs.h" ! 2: ! 3: ! 4: /***************************************************************************** ! 5: * ! 6: * MONITOR FOR PIPELINE TEST #7 (The Trans-Siberian Pipeline test) ! 7: * ! 8: * This test will do: ! 9: * ! 10: * LDF(x), SUBF(x), ADDF(0), SUBF(x), ADDF(x), SUBF(0), ! 11: * ADDF(x), SUBF(x), ADDF(0), SUBF(0), ADDF(x), STF ! 12: * ! 13: * where the x's are the fmacro1 LDF data patterns. This test is an attempt ! 14: * to fill the instruction Queue. ! 15: *****************************************************************************/ ! 16: pipe_7() ! 17: { ! 18: asm(".globl _pipeline_7_t"); ! 19: asm("_pipeline_7_t:"); /* entry address */ ! 20: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */ ! 21: { ! 22: writes(" PIPE_7 "); ! 23: } ! 24: subtest = 1; ! 25: pipe7_1(); /* data in REGs, no NOPs */ ! 26: subtest ++; /* increment subtest num */ ! 27: pipe7_2(); /* data in REGs, 1 NOP */ ! 28: subtest ++; /* increment subtest num */ ! 29: pipe7_3(); /* data in REGs, 2 NOPs */ ! 30: subtest ++; /* increment subtest num */ ! 31: pipe7_4(); /* data in REGs, 3 NOPs */ ! 32: subtest ++; /* increment subtest num */ ! 33: pipe7_5(); /* data in CACHE, no NOPs */ ! 34: subtest ++; /* increment subtest num */ ! 35: pipe7_6(); /* data in CACHE, 1 NOP */ ! 36: subtest ++; /* increment subtest num */ ! 37: pipe7_7(); /* data in CACHE, 2 NOPs */ ! 38: subtest ++; /* increment subtest num */ ! 39: pipe7_8(); /* data in CACHE, 3 NOPs */ ! 40: subtest ++; /* increment subtest num */ ! 41: pipe7_9(); /* data on STACK, no NOPs */ ! 42: subtest ++; /* increment subtest num */ ! 43: pipe7_10(); /* data via FP no NOPs */ ! 44: asm("jmp *return"); /* return to the test monitor */ ! 45: } ! 46: ! 47: ! 48: ! 49: ! 50: ! 51: ! 52: /************************************************************************ ! 53: * ! 54: * SUBTEST 1 ! 55: * data in registers, no NO-OPs ! 56: * ! 57: ************************************************************************/ ! 58: pipe7_1() ! 59: { ! 60: force_loop = FALSE; /* clear the force_loop flg */ ! 61: index = 0; ! 62: do ! 63: { ! 64: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 65: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 66: sgl_value_2 = 0; /* set one operand to 0 */ ! 67: /* ! 68: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 69: * The force loop flag is set after the first error. ! 70: */ ! 71: asm("_pipe7_1_lp1:"); ! 72: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 73: asm("movl _sgl_value_2,r3"); /* move the '0' to r3 */ ! 74: asm("ldf r4"); /* load the ACC (ACC = op) */ ! 75: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 76: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 77: asm("subf r4"); /* sub. the op. (ACC =-op) */ ! 78: asm("addf r4"); /* add the op. (ACC = 0 ) */ ! 79: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 80: asm("addf r4"); /* add the op. (ACC = op) */ ! 81: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 82: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 83: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 84: asm("addf r4"); /* add the op. (ACC = op) */ ! 85: asm("stf r5"); /* store the ACC (s/b= op) */ ! 86: if( force_loop ) ! 87: asm("brb _pipe7_1_lp1");; /* loop on the error */ ! 88: /* ! 89: * verify the results ! 90: */ ! 91: asm("movl r5,_sgl_st_acc"); /* get the result */ ! 92: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 93: { ! 94: errcnt++; /* bump the error count */ ! 95: if ( prt_error ) ! 96: print_pipe7_er("Reg. Data, no NO-OPs"); ! 97: if ( halt_flg ) ! 98: pipe7_er_hlt( subtest ); ! 99: if ( loop_on_err ) { ! 100: force_loop = TRUE; /* set the force loop flag */ ! 101: asm("jmp _pipe7_1_lp1"); /* and loop */ ! 102: } ! 103: } /* end of compare error */ ! 104: } while( index++ < max_ldf_1_index ); ! 105: } /* end of subtest 1 */ ! 106: ! 107: ! 108: ! 109: ! 110: ! 111: ! 112: /************************************************************************ ! 113: * ! 114: * SUBTEST 2 ! 115: * data in registers, 1 NO-OP ! 116: * ! 117: ************************************************************************/ ! 118: pipe7_2() ! 119: { ! 120: force_loop = FALSE; /* clear force_loop flag */ ! 121: index = 0; ! 122: do ! 123: { ! 124: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 125: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 126: sgl_value_2 = 0; /* get the '0' operand */ ! 127: /* ! 128: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 129: * The force loop flag is set after the first error. ! 130: */ ! 131: asm("_pipe7_2_lp1:"); ! 132: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 133: asm("movl _sgl_value_2,r3"); /* move the '0' to r3 */ ! 134: asm("ldf r4"); /* load the ACC (ACC = op) */ ! 135: asm("nop"); ! 136: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 137: asm("nop"); ! 138: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 139: asm("nop"); ! 140: asm("subf r4"); /* sub. the op. (ACC =-op) */ ! 141: asm("nop"); ! 142: asm("addf r4"); /* add the op. (ACC = 0 ) */ ! 143: asm("nop"); ! 144: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 145: asm("nop"); ! 146: asm("addf r4"); /* add the op. (ACC = op) */ ! 147: asm("nop"); ! 148: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 149: asm("nop"); ! 150: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 151: asm("nop"); ! 152: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 153: asm("nop"); ! 154: asm("addf r4"); /* add the op. (ACC = op) */ ! 155: asm("nop"); ! 156: asm("stf r5"); /* store the ACC (s/b= op) */ ! 157: if( force_loop ) ! 158: asm("brb _pipe7_2_lp1");; /* loop on the error */ ! 159: /* ! 160: * verify the results ! 161: */ ! 162: asm("movl r5,_sgl_st_acc"); /* get the result */ ! 163: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 164: { ! 165: errcnt++; /* bump the error count */ ! 166: if ( prt_error ) ! 167: print_pipe7_er("Reg. Data, 1 NO-OP"); ! 168: if ( halt_flg ) ! 169: pipe7_er_hlt( subtest ); ! 170: if ( loop_on_err ) { ! 171: force_loop = TRUE; /* set the force loop flag */ ! 172: asm("jmp _pipe7_2_lp1"); /* and loop */ ! 173: } ! 174: } /* end of compare error */ ! 175: } while( index++ < max_ldf_1_index ); ! 176: } /* end of subtest 2 */ ! 177: ! 178: ! 179: ! 180: ! 181: ! 182: ! 183: /************************************************************************ ! 184: * ! 185: * SUBTEST 3 ! 186: * data in registers, 2 NO-OPs ! 187: * ! 188: ************************************************************************/ ! 189: pipe7_3() ! 190: { ! 191: force_loop = FALSE; /* clear force_loop flag */ ! 192: index = 0; ! 193: do ! 194: { ! 195: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 196: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 197: sgl_value_2 = 0; /* set the '0' operand */ ! 198: /* ! 199: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 200: * The force loop flag is set after the first error. ! 201: */ ! 202: asm("_pipe7_3_lp1:"); ! 203: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 204: asm("movl _sgl_value_2,r3"); /* move the '0' to r3 */ ! 205: asm("ldf r4"); /* load the ACC (ACC = op) */ ! 206: asm("nop"); ! 207: asm("nop"); ! 208: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 209: asm("nop"); ! 210: asm("nop"); ! 211: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 212: asm("nop"); ! 213: asm("nop"); ! 214: asm("subf r4"); /* sub. the op. (ACC =-op) */ ! 215: asm("nop"); ! 216: asm("nop"); ! 217: asm("addf r4"); /* add the op. (ACC = 0 ) */ ! 218: asm("nop"); ! 219: asm("nop"); ! 220: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 221: asm("nop"); ! 222: asm("nop"); ! 223: asm("addf r4"); /* add the op. (ACC = op) */ ! 224: asm("nop"); ! 225: asm("nop"); ! 226: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 227: asm("nop"); ! 228: asm("nop"); ! 229: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 230: asm("nop"); ! 231: asm("nop"); ! 232: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 233: asm("nop"); ! 234: asm("nop"); ! 235: asm("addf r4"); /* add the op. (ACC = op) */ ! 236: asm("nop"); ! 237: asm("nop"); ! 238: asm("stf r5"); /* store the ACC (s/b= op) */ ! 239: if( force_loop ) ! 240: asm("brb _pipe7_3_lp1");; /* loop on the error */ ! 241: /* ! 242: * verify the results ! 243: */ ! 244: asm("movl r5,_sgl_st_acc"); /* get the result */ ! 245: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 246: { ! 247: errcnt++; /* bump the error count */ ! 248: if ( prt_error ) ! 249: print_pipe7_er("Reg. Data, 2 NO-OPs"); ! 250: if ( halt_flg ) ! 251: pipe7_er_hlt( subtest ); ! 252: if ( loop_on_err ) { ! 253: force_loop = TRUE; /* set the force loop flag */ ! 254: asm("jmp _pipe7_3_lp1"); /* and loop */ ! 255: } ! 256: } /* end of compare error */ ! 257: } while( index++ < max_ldf_1_index ); ! 258: } /* end of subtest 3 */ ! 259: ! 260: ! 261: ! 262: ! 263: ! 264: ! 265: /************************************************************************ ! 266: * ! 267: * SUBTEST 4 ! 268: * data in registers, 3 NO-OPs ! 269: * ! 270: ************************************************************************/ ! 271: pipe7_4() ! 272: { ! 273: force_loop = FALSE; /* clear force_loop flag */ ! 274: index = 0; ! 275: do ! 276: { ! 277: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 278: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 279: sgl_value_2 = 0; /* set the '0' operand */ ! 280: /* ! 281: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 282: * The force loop flag is set after the first error. ! 283: */ ! 284: asm("_pipe7_4_lp1:"); ! 285: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 286: asm("movl _sgl_value_2,r3"); /* move the '0' to r3 */ ! 287: asm("ldf r4"); /* load the ACC (ACC = op) */ ! 288: asm("nop"); ! 289: asm("nop"); ! 290: asm("nop"); ! 291: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 292: asm("nop"); ! 293: asm("nop"); ! 294: asm("nop"); ! 295: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 296: asm("nop"); ! 297: asm("nop"); ! 298: asm("nop"); ! 299: asm("subf r4"); /* sub. the op. (ACC =-op) */ ! 300: asm("nop"); ! 301: asm("nop"); ! 302: asm("nop"); ! 303: asm("addf r4"); /* add the op. (ACC = 0 ) */ ! 304: asm("nop"); ! 305: asm("nop"); ! 306: asm("nop"); ! 307: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 308: asm("nop"); ! 309: asm("nop"); ! 310: asm("nop"); ! 311: asm("addf r4"); /* add the op. (ACC = op) */ ! 312: asm("nop"); ! 313: asm("nop"); ! 314: asm("nop"); ! 315: asm("subf r4"); /* sub. the op. (ACC = 0 ) */ ! 316: asm("nop"); ! 317: asm("nop"); ! 318: asm("nop"); ! 319: asm("addf r3"); /* add a '0' (ACC = 0 ) */ ! 320: asm("nop"); ! 321: asm("nop"); ! 322: asm("nop"); ! 323: asm("subf r3"); /* sub. a '0' (ACC = 0 ) */ ! 324: asm("nop"); ! 325: asm("nop"); ! 326: asm("nop"); ! 327: asm("addf r4"); /* add the op. (ACC = op) */ ! 328: asm("nop"); ! 329: asm("nop"); ! 330: asm("nop"); ! 331: asm("stf r5"); /* store the ACC (s/b= op) */ ! 332: if( force_loop ) ! 333: asm("brb _pipe7_4_lp1");; /* loop on the error */ ! 334: /* ! 335: * verify the results ! 336: */ ! 337: asm("movl r5,_sgl_st_acc"); /* get the result */ ! 338: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 339: { ! 340: errcnt++; /* bump the error count */ ! 341: if ( prt_error ) ! 342: print_pipe7_er("Reg. Data, 3 NO-OPs"); ! 343: if ( halt_flg ) ! 344: pipe7_er_hlt( subtest ); ! 345: if ( loop_on_err ) { ! 346: force_loop = TRUE; /* set the force loop flag */ ! 347: asm("jmp _pipe7_4_lp1"); /* and loop */ ! 348: } ! 349: } /* end of compare error */ ! 350: } while( index++ < max_ldf_1_index ); ! 351: } /* end of subtest 4 */ ! 352: ! 353: ! 354: ! 355: ! 356: ! 357: ! 358: ! 359: /************************************************************************ ! 360: * ! 361: * SUBTEST 5 ! 362: * data in Cache, no NO-OPs ! 363: * ! 364: ************************************************************************/ ! 365: pipe7_5() ! 366: { ! 367: force_loop = FALSE; /* clear force_loop flag */ ! 368: index = 0; ! 369: do ! 370: { ! 371: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 372: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 373: sgl_value_2 = 0; /* set the '0' operand */ ! 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("_pipe7_5_lp1:"); ! 379: asm("ldf _sgl_value_1"); /* load the ACC (ACC = op) */ ! 380: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 381: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 382: asm("subf _sgl_value_1"); /* sub. the op. (ACC =-op) */ ! 383: asm("addf _sgl_value_1"); /* add the op. (ACC = 0 ) */ ! 384: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 385: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 386: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 387: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 388: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 389: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 390: asm("stf _sgl_st_acc"); /* store the ACC (s/b= op) */ ! 391: if( force_loop ) ! 392: asm("brb _pipe7_5_lp1");; /* loop on the error */ ! 393: /* ! 394: * verify the results ! 395: */ ! 396: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 397: { ! 398: errcnt++; /* bump the error count */ ! 399: if ( prt_error ) ! 400: print_pipe7_er("Cache Data, no NO-OPs"); ! 401: if ( halt_flg ) ! 402: pipe7_er_hlt( subtest ); ! 403: if ( loop_on_err ) { ! 404: force_loop = TRUE; /* set the force loop flag */ ! 405: asm("jmp _pipe7_5_lp1"); /* and loop */ ! 406: } ! 407: } /* end of compare error */ ! 408: } while( index++ < max_ldf_1_index ); ! 409: } /* end of subtest 5 */ ! 410: ! 411: ! 412: ! 413: ! 414: ! 415: ! 416: /************************************************************************ ! 417: * ! 418: * SUBTEST 6 ! 419: * data in Cache, 1 NO-OP ! 420: * ! 421: ************************************************************************/ ! 422: pipe7_6() ! 423: { ! 424: force_loop = FALSE; /* clear force_loop flag */ ! 425: index = 0; ! 426: do ! 427: { ! 428: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 429: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 430: /* ! 431: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 432: * The force loop flag is set after the first error. ! 433: */ ! 434: asm("_pipe7_6_lp1:"); ! 435: asm("ldf _sgl_value_1"); /* load the ACC (ACC = op) */ ! 436: asm("nop"); ! 437: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 438: asm("nop"); ! 439: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 440: asm("nop"); ! 441: asm("subf _sgl_value_1"); /* sub. the op. (ACC =-op) */ ! 442: asm("nop"); ! 443: asm("addf _sgl_value_1"); /* add the op. (ACC = 0 ) */ ! 444: asm("nop"); ! 445: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 446: asm("nop"); ! 447: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 448: asm("nop"); ! 449: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 450: asm("nop"); ! 451: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 452: asm("nop"); ! 453: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 454: asm("nop"); ! 455: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 456: asm("nop"); ! 457: asm("stf _sgl_st_acc"); /* store the ACC (s/b= op) */ ! 458: if( force_loop ) ! 459: asm("brb _pipe7_6_lp1");; /* loop on the error */ ! 460: /* ! 461: * verify the results ! 462: */ ! 463: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 464: { ! 465: errcnt++; /* bump the error count */ ! 466: if ( prt_error ) ! 467: print_pipe7_er("Cache Data, 1 NO-OP"); ! 468: if ( halt_flg ) ! 469: pipe7_er_hlt( subtest ); ! 470: if ( loop_on_err ) { ! 471: force_loop = TRUE; /* set the force loop flag */ ! 472: asm("jmp _pipe7_6_lp1"); /* and loop */ ! 473: } ! 474: } /* end of compare error */ ! 475: } while( index++ < max_ldf_1_index ); ! 476: } /* end of subtest 6 */ ! 477: ! 478: ! 479: ! 480: ! 481: ! 482: ! 483: /************************************************************************ ! 484: * ! 485: * SUBTEST 7 ! 486: * data in Cache, 2 NO-OPs ! 487: * ! 488: ************************************************************************/ ! 489: pipe7_7() ! 490: { ! 491: force_loop = FALSE; /* clear force_loop flag */ ! 492: index = 0; ! 493: do ! 494: { ! 495: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 496: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 497: sgl_value_2 = 0; /* set the '0' operand */ ! 498: /* ! 499: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 500: * The force loop flag is set after the first error. ! 501: */ ! 502: asm("_pipe7_7_lp1:"); ! 503: asm("ldf _sgl_value_1"); /* load the ACC (ACC = op) */ ! 504: asm("nop"); ! 505: asm("nop"); ! 506: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 507: asm("nop"); ! 508: asm("nop"); ! 509: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 510: asm("nop"); ! 511: asm("nop"); ! 512: asm("subf _sgl_value_1"); /* sub. the op. (ACC =-op) */ ! 513: asm("nop"); ! 514: asm("nop"); ! 515: asm("addf _sgl_value_1"); /* add the op. (ACC = 0 ) */ ! 516: asm("nop"); ! 517: asm("nop"); ! 518: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 519: asm("nop"); ! 520: asm("nop"); ! 521: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 522: asm("nop"); ! 523: asm("nop"); ! 524: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 525: asm("nop"); ! 526: asm("nop"); ! 527: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 528: asm("nop"); ! 529: asm("nop"); ! 530: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 531: asm("nop"); ! 532: asm("nop"); ! 533: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 534: asm("nop"); ! 535: asm("nop"); ! 536: asm("stf _sgl_st_acc"); /* store the ACC (s/b= op) */ ! 537: if( force_loop ) ! 538: asm("brb _pipe7_7_lp1");; /* loop on the error */ ! 539: /* ! 540: * verify the results ! 541: */ ! 542: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 543: { ! 544: errcnt++; /* bump the error count */ ! 545: if ( prt_error ) ! 546: print_pipe7_er("Cache Data, 2 NO-OPs"); ! 547: if ( halt_flg ) ! 548: pipe7_er_hlt( subtest ); ! 549: if ( loop_on_err ) { ! 550: force_loop = TRUE; /* set the force loop flag */ ! 551: asm("jmp _pipe7_7_lp1"); /* and loop */ ! 552: } ! 553: } /* end of compare error */ ! 554: } while( index++ < max_ldf_1_index ); ! 555: } /* end of subtest 7 */ ! 556: ! 557: ! 558: ! 559: ! 560: ! 561: ! 562: /************************************************************************ ! 563: * ! 564: * SUBTEST 8 ! 565: * data in Cache, 3 NO-OPs ! 566: * ! 567: ************************************************************************/ ! 568: pipe7_8() ! 569: { ! 570: force_loop = FALSE; /* clear force_loop flag */ ! 571: index = 0; ! 572: do ! 573: { ! 574: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 575: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 576: sgl_value_2 = 0; /* set the '0' operand */ ! 577: /* ! 578: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 579: * The force loop flag is set after the first error. ! 580: */ ! 581: asm("_pipe7_8_lp1:"); ! 582: asm("ldf _sgl_value_1"); /* load the ACC (ACC = op) */ ! 583: asm("nop"); ! 584: asm("nop"); ! 585: asm("nop"); ! 586: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 587: asm("nop"); ! 588: asm("nop"); ! 589: asm("nop"); ! 590: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 591: asm("nop"); ! 592: asm("nop"); ! 593: asm("nop"); ! 594: asm("subf _sgl_value_1"); /* sub. the op. (ACC =-op) */ ! 595: asm("nop"); ! 596: asm("nop"); ! 597: asm("nop"); ! 598: asm("addf _sgl_value_1"); /* add the op. (ACC = 0 ) */ ! 599: asm("nop"); ! 600: asm("nop"); ! 601: asm("nop"); ! 602: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 603: asm("nop"); ! 604: asm("nop"); ! 605: asm("nop"); ! 606: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 607: asm("nop"); ! 608: asm("nop"); ! 609: asm("nop"); ! 610: asm("subf _sgl_value_1"); /* sub. the op. (ACC = 0 ) */ ! 611: asm("nop"); ! 612: asm("nop"); ! 613: asm("nop"); ! 614: asm("addf _sgl_value_2"); /* add a '0' (ACC = 0 ) */ ! 615: asm("nop"); ! 616: asm("nop"); ! 617: asm("nop"); ! 618: asm("subf _sgl_value_2"); /* sub. a '0' (ACC = 0 ) */ ! 619: asm("nop"); ! 620: asm("nop"); ! 621: asm("nop"); ! 622: asm("addf _sgl_value_1"); /* add the op. (ACC = op) */ ! 623: asm("nop"); ! 624: asm("nop"); ! 625: asm("nop"); ! 626: asm("stf _sgl_st_acc"); /* store the ACC (s/b= op) */ ! 627: if( force_loop ) ! 628: asm("brb _pipe7_8_lp1");; /* loop on the error */ ! 629: /* ! 630: * verify the results ! 631: */ ! 632: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */ ! 633: { ! 634: errcnt++; /* bump the error count */ ! 635: if ( prt_error ) ! 636: print_pipe7_er("Cache Data, 3 NO-OPs"); ! 637: if ( halt_flg ) ! 638: pipe7_er_hlt( subtest ); ! 639: if ( loop_on_err ) { ! 640: force_loop = TRUE; /* set the force loop flag */ ! 641: asm("jmp _pipe7_8_lp1"); /* and loop */ ! 642: } ! 643: } /* end of compare error */ ! 644: } while( index++ < max_ldf_1_index ); ! 645: } /* end of subtest 8 */ ! 646: ! 647: ! 648: ! 649: ! 650: ! 651: ! 652: /***************************************************************************** ! 653: * ! 654: * SUBTEST 9 ! 655: * data on the stack, no NO-OPs ! 656: * ! 657: *****************************************************************************/ ! 658: pipe7_9() ! 659: { ! 660: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */ ! 661: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */ ! 662: force_loop = FALSE; /* clear force_loop flag */ ! 663: index = 0; ! 664: do ! 665: { ! 666: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 667: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 668: sgl_value_4 = 0; /* set the '0' operand */ ! 669: asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */ ! 670: /* ! 671: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 672: * The force loop flag is set after the first error. ! 673: */ ! 674: asm("_pipe7_9_lp1:"); ! 675: asm("moval _pointer_data,r14"); /* set the stack pointer */ ! 676: asm("movl _sgl_value_1,-(r14)"); /* push operand to add */ ! 677: asm("movl _sgl_value_4,-(r14)"); /* '0' to subtract */ ! 678: asm("movl _sgl_value_4,-(r14)"); /* '0' to add */ ! 679: asm("movl _sgl_value_1,-(r14)"); /* op. to subtract */ ! 680: asm("movl _sgl_value_1,-(r14)"); /* op. to add */ ! 681: asm("movl _sgl_value_4,-(r14)"); /* '0' to subtract */ ! 682: asm("movl _sgl_value_1,-(r14)"); /* op. to add */ ! 683: asm("movl _sgl_value_1,-(r14)"); /* op. to subtract */ ! 684: asm("movl _sgl_value_4,-(r14)"); /* '0' to add */ ! 685: asm("movl _sgl_value_1,-(r14)"); /* op. to subtract */ ! 686: asm("movl _sgl_value_1,-(r14)"); /* op. to load */ ! 687: /* ! 688: * now pop the data off the stack ! 689: */ ! 690: asm("ldf (r14)+"); /* pop the data & load it */ ! 691: asm("subf (r14)+"); /* sub. the op. (ACC = 0 ) */ ! 692: asm("addf (r14)+"); /* add a '0' (ACC = 0 ) */ ! 693: asm("subf (r14)+"); /* sub. the op. (ACC =-op) */ ! 694: asm("addf (r14)+"); /* add the op. (ACC = 0 ) */ ! 695: asm("subf (r14)+"); /* sub. a '0' (ACC = 0 ) */ ! 696: asm("addf (r14)+"); /* add the op. (ACC = op) */ ! 697: asm("subf (r14)+"); /* sub. the op. (ACC = 0 ) */ ! 698: asm("addf (r14)+"); /* add a '0' (ACC = 0 ) */ ! 699: asm("subf (r14)+"); /* sub. a '0' (ACC = 0 ) */ ! 700: asm("addf (r14)+"); /* add the op. (ACC = op) */ ! 701: asm("stf r5"); /* store the ACC (s/b= op) */ ! 702: if( force_loop ) ! 703: asm("brb _pipe7_9_lp1");; /* loop on the error */ ! 704: /* ! 705: * verify the results ! 706: */ ! 707: asm("movl r5,_sgl_st_acc"); /* get the result */ ! 708: asm("moval (r14),_sgl_value_3"); /* save the stack pointer */ ! 709: if( (sgl_st_acc != sgl_expected) || /* verify the result... */ ! 710: (sgl_value_3 != sgl_value_2) ) /* ... and the final SP */ ! 711: { ! 712: asm("movl _pre_event_fp,r13"); /* restore frame pointer */ ! 713: asm("movl _pre_event_sp,r14"); /* restore stack pointer */ ! 714: errcnt++; /* bump the error count */ ! 715: if ( prt_error ) { ! 716: print_pipe7_er("POP data from the STACK"); ! 717: writes("final Stack Pointer = "); ! 718: write32h( sgl_value_5 ); ! 719: writes(", expected SP = "); ! 720: write32h( sgl_value_4 ); ! 721: writes("\n"); ! 722: } ! 723: if ( halt_flg ) /* halt on error? */ ! 724: pipe7_er_hlt( subtest ); ! 725: if ( loop_on_err ) { ! 726: force_loop = TRUE; /* set the force loop flag */ ! 727: asm("jmp _pipe7_9_lp1"); /* and loop */ ! 728: } ! 729: } /* end of compare error */ ! 730: } while( index++ < max_ldf_1_index ); ! 731: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */ ! 732: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */ ! 733: } /* end of subtest 9 */ ! 734: ! 735: ! 736: ! 737: ! 738: ! 739: ! 740: /****************************************************************************** ! 741: * ! 742: * SUBTEST 10 ! 743: * load 0, add operand 4 times -get data via indexed FRAME pointer ! 744: * ! 745: * ADDR INDEX DATA ! 746: * pointer_data 4 <the STF result goes here> ! 747: * pointer_data-4 3 <operand data> ! 748: * pointer_data-8 2 <'0' data> ! 749: * pointer_data-16 0 point the frame pointer here ! 750: * ! 751: ******************************************************************************/ ! 752: pipe7_10() ! 753: { ! 754: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */ ! 755: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */ ! 756: force_loop = FALSE; /* clear force_loop flag */ ! 757: index = 0; ! 758: do ! 759: { ! 760: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 761: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 762: sgl_value_4 = 0; /* set the '0' operand */ ! 763: asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */ ! 764: /* ! 765: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 766: * The force loop flag is set after the first error. ! 767: */ ! 768: asm("_pipe7_10_lp1:"); ! 769: asm("moval _pointer_data,_sgl_value_2");/* get store data's addr */ ! 770: sgl_value_2 -= 4; /* decrement it by 4 (bytes)*/ ! 771: asm("movl _sgl_value_1,*_sgl_value_2");/* set the operand data */ ! 772: sgl_value_2 -= 4; /* decrement it by 4 (bytes)*/ ! 773: asm("movl _sgl_value_4,*_sgl_value_2");/* set the '0' data */ ! 774: sgl_value_2 -= 8; /* get the FP addr to use */ ! 775: asm("movl _sgl_value_2,r13"); /* set the FRAME POINTER */ ! 776: asm("movl $2,r2"); /* r2 index = 2 longwords */ ! 777: asm("movl $3,r5"); /* r5 index = 3 longwords */ ! 778: asm("movl $4,r6"); /* r6 index = 4 longwords */ ! 779: asm("ldf (r13)[r5]"); /* load the operand via SP */ ! 780: asm("subf (r13)[r5]"); /* sub. the op. (ACC = 0 ) */ ! 781: asm("addf (r13)[r2]"); /* add a '0' (ACC = 0 ) */ ! 782: asm("subf (r13)[r5]"); /* sub. the op. (ACC =-op) */ ! 783: asm("addf (r13)[r5]"); /* add the op. (ACC = 0 ) */ ! 784: asm("subf (r13)[r2]"); /* sub. a '0' (ACC = 0 ) */ ! 785: asm("addf (r13)[r5]"); /* add the op. (ACC = op) */ ! 786: asm("subf (r13)[r5]"); /* sub. the op. (ACC = 0 ) */ ! 787: asm("addf (r13)[r2]"); /* add a '0' (ACC = 0 ) */ ! 788: asm("subf (r13)[r2]"); /* sub. a '0' (ACC = 0 ) */ ! 789: asm("addf (r13)[r5]"); /* add the op. (ACC = op) */ ! 790: asm("stf (r13)[r6]"); /* store -indexed by r6 */ ! 791: if( force_loop ) ! 792: asm("brb _pipe7_10_lp1");; /* loop on the error */ ! 793: /* ! 794: * verify the results ! 795: */ ! 796: sgl_st_acc = pointer_data; /* move the stored result */ ! 797: asm("moval (r13),_sgl_value_3"); /* save the frame pointer */ ! 798: if( (sgl_st_acc != sgl_expected) || /* verify the result... */ ! 799: (sgl_value_3 != sgl_value_2) ) /* ... and the final FP */ ! 800: { ! 801: asm("movl _pre_event_fp,r13"); /* restore frame pointer */ ! 802: asm("movl _pre_event_sp,r14"); /* restore stack pointer */ ! 803: errcnt++; /* bump the error count */ ! 804: if ( prt_error ) { ! 805: print_pipe7_er("indexed FP addressing"); ! 806: writes("final Frame Pointer = "); ! 807: writeh( sgl_value_5 ); ! 808: writes(", expected FP = "); ! 809: writeh( sgl_value_4 ); ! 810: writes("\n"); ! 811: } ! 812: if ( halt_flg ) /* halt on error? */ ! 813: pipe7_er_hlt( subtest ); ! 814: if ( loop_on_err ) { ! 815: force_loop = TRUE; /* set the force loop flag */ ! 816: asm("jmp _pipe7_10_lp1"); /* and loop */ ! 817: } ! 818: } /* end of compare error */ ! 819: } while( index++ < max_ldf_1_index ); ! 820: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */ ! 821: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */ ! 822: } /* end of subtest 10 */ ! 823: ! 824: ! 825: /****************************************************************************** ! 826: * ! 827: * ERROR ROUTINE ! 828: * ! 829: * print an error in the following form ! 830: * ! 831: * operand = xxxxxxxx, final Acc = xxxxxxxx, data index = dd ! 832: * expected Acc = xxxxxxxx ! 833: * ! 834: ******************************************************************************/ ! 835: print_pipe7_er(msg) ! 836: char *msg; ! 837: { ! 838: writes("\n"); /* start a new print line */ ! 839: writes("cycle: "); ! 840: writed( cycle ); ! 841: writes(" test "); ! 842: writed( test_no ); ! 843: writes(" (Pipe 7), subtest "); ! 844: writed( subtest ); ! 845: writes(" error - "); ! 846: writes( msg ); ! 847: writec('\n'); ! 848: writes( ! 849: "LDF(op), SUBF(op), ADDF(0.0), SUBF(op), ADDF(op), SUBF(0.0),\n"); ! 850: writes( ! 851: " ADDF(op), SUBF(op), ADDF(0.0), SUBF(0.0), ADDF(op), STF\n"); ! 852: writes("operand = "); ! 853: write32h( sgl_value_1 ); ! 854: writes(", final Acc = "); ! 855: write32h( sgl_st_acc ); ! 856: writes(", data index = "); ! 857: writed( index ); ! 858: writec('\n'); ! 859: writes(" expected Acc = "); ! 860: write32h( sgl_expected ); ! 861: writec('\n'); ! 862: } ! 863: ! 864: ! 865: ! 866: ! 867: ! 868: /****************************************************************************** ! 869: * ! 870: * HALT ON ERROR ROUTINE ! 871: * ! 872: * halt with the necessary information saved in the registers ! 873: * ! 874: ******************************************************************************/ ! 875: pipe7_er_hlt( subtest ) ! 876: int subtest; ! 877: { ! 878: asm("movl _test_no,r0"); /* r0 = test number */ ! 879: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 880: asm("movl $1,r2"); /* r2 = error code */ ! 881: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 882: asm("movl _sgl_value_1,r4"); /* r4 = sgl operand */ ! 883: asm("movl _sgl_st_acc,r5"); /* r5 = sgl stored */ ! 884: asm("movl _sgl_expected,r6"); /* r6 = sgl expected */ ! 885: asm("movl _index,r7"); /* r7 = data index */ ! 886: asm("movl _sgl_value_2,r8"); /* r8 = floating zero */ ! 887: if( subtest == 9 ) { ! 888: asm("movl _sgl_value_3,r9"); /* r9 = final SP value */ ! 889: asm("movl _sgl_value_2,r10"); /* r10 = expected SP value */ ! 890: } else ! 891: if( subtest == 10 ) { ! 892: asm("movl _sgl_value_3,r9"); /* r9 = final FP value */ ! 893: asm("movl _sgl_value_2,r10"); /* r10 = expected FP value */ ! 894: }; ! 895: asm(".globl _pipe7_1_hlt"); ! 896: asm("_pipe7_1_hlt:"); /* PC after the halt */ ! 897: asm("halt"); /* HALT ... */ ! 898: } /* end of halt on error */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.