|
|
1.1 ! root 1: #include "fpp_defs.h" ! 2: ! 3: ! 4: /***************************************************************************** ! 5: * ! 6: * PIPELINE TEST #4 MONITOR ! 7: * ! 8: * This test will do: ! 9: * ! 10: * LDF(x) STF LDF(1) MULF(1) MULF(x) STF ! 11: * ! 12: * where x is the fmacro1 LDF data. This test verifies the store after the ! 13: * LDF and the LDF after the store. It will also verify all of the MULF's ! 14: * B entry points. ! 15: *****************************************************************************/ ! 16: pipe_4() ! 17: { ! 18: asm(".globl _pipeline_4_t"); ! 19: asm("_pipeline_4_t:"); /* entry address */ ! 20: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */ ! 21: { ! 22: writes(" PIPE_4 "); ! 23: } ! 24: subtest = 1; ! 25: pipe4_1(); /* data in REGs, no NOPs */ ! 26: subtest++; /* increment subtest num */ ! 27: pipe4_2(); /* data in REGs, 1 NOP */ ! 28: subtest++; /* increment subtest num */ ! 29: pipe4_3(); /* data in REGs, 2 NOPs */ ! 30: subtest++; /* increment subtest num */ ! 31: pipe4_4(); /* data in REGs, 3 NOPs */ ! 32: subtest++; /* increment subtest num */ ! 33: pipe4_5(); /* data in CACHE, no NOPs */ ! 34: subtest++; /* increment subtest num */ ! 35: pipe4_6(); /* data in CACHE, 1 NOP */ ! 36: subtest++; /* increment subtest num */ ! 37: pipe4_7(); /* data in CACHE, 2 NOPs */ ! 38: subtest++; /* increment subtest num */ ! 39: pipe4_8(); /* data in CACHE, 3 NOPs */ ! 40: subtest++; /* increment subtest num */ ! 41: pipe4_9(); /* data on STACK, no NOPs */ ! 42: subtest++; /* increment subtest num */ ! 43: pipe4_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: pipe4_1() ! 59: { ! 60: force_loop = FALSE; /* clear force_loop flag */ ! 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 = 0x40800000; /* floating '1' */ ! 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("_pipe4_1_lp1:"); ! 72: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 73: asm("movl _sgl_value_2,r5"); /* move data to r5 */ ! 74: asm("ldf r4"); /* load the operand */ ! 75: asm("stf r7"); /* store the result */ ! 76: asm("ldf r5"); /* load a floating '1' */ ! 77: asm("mulf r5"); /* multipy by a '1' */ ! 78: asm("mulf r4"); /* multipy by the operand */ ! 79: asm("stf r8"); /* store the result */ ! 80: if( force_loop ); ! 81: asm("brb _pipe4_1_lp1");; /* loop on the error */ ! 82: /* ! 83: * verify the results ! 84: */ ! 85: asm("movl r7,_sgl_st_acc"); /* get the 1st store value */ ! 86: asm("movl r8,_sgl_value_6"); /* get the 2nd store value */ ! 87: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 88: (sgl_value_6 != sgl_expected) ) ! 89: { ! 90: errcnt++; /* bump the error count */ ! 91: if ( prt_error ) ! 92: print_pipe4_er("Reg. Data, no NO-OPs"); ! 93: if ( halt_flg ) ! 94: pipe4_er_hlt( subtest ); ! 95: if ( loop_on_err ) { ! 96: force_loop = TRUE; /* set the force loop flag */ ! 97: asm("brw _pipe4_1_lp1"); /* and loop */ ! 98: } ! 99: } /* end of compare error */ ! 100: } while( index++ < max_ldf_1_index ); ! 101: } /* end of subtest 1 */ ! 102: ! 103: ! 104: ! 105: ! 106: ! 107: ! 108: /************************************************************************ ! 109: * ! 110: * SUBTEST 2 ! 111: * data in registers, 1 NO-OP ! 112: * ! 113: ************************************************************************/ ! 114: pipe4_2() ! 115: { ! 116: force_loop = FALSE; /* clear force_loop flag */ ! 117: index = 0; ! 118: do ! 119: { ! 120: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 121: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 122: sgl_value_2 = 0x40800000; /* floating '1' */ ! 123: /* ! 124: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 125: * The force loop flag is set after the first error. ! 126: */ ! 127: asm("_pipe4_2_lp1:"); ! 128: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 129: asm("movl _sgl_value_2,r5"); /* move data to r5 */ ! 130: asm("ldf r4"); /* load the operand */ ! 131: asm("nop"); ! 132: asm("stf r7"); /* store the result */ ! 133: asm("nop"); ! 134: asm("ldf r5"); /* load a floating '1' */ ! 135: asm("nop"); ! 136: asm("mulf r5"); /* multipy by a '1' */ ! 137: asm("nop"); ! 138: asm("mulf r4"); /* multipy by the operand */ ! 139: asm("nop"); ! 140: asm("stf r8"); /* store the result */ ! 141: if( force_loop ); ! 142: asm("brb _pipe4_2_lp1");; /* loop on the error */ ! 143: /* ! 144: * verify the results ! 145: */ ! 146: asm("movl r7,_sgl_st_acc"); /* get the 1st store value */ ! 147: asm("movl r8,_sgl_value_6"); /* get the 2nd store value */ ! 148: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 149: (sgl_value_6 != sgl_expected) ) ! 150: { ! 151: errcnt++; /* bump the error count */ ! 152: if ( prt_error ) ! 153: print_pipe4_er("Reg. Data, 1 NO-OP"); ! 154: if ( halt_flg ) ! 155: pipe4_er_hlt( subtest ); ! 156: if ( loop_on_err ) { ! 157: force_loop = TRUE; /* set the force loop flag */ ! 158: asm("brw _pipe4_2_lp1"); /* and loop */ ! 159: } ! 160: } /* end of compare error */ ! 161: } while( index++ < max_ldf_1_index ); ! 162: } /* end of subtest 2 */ ! 163: ! 164: ! 165: ! 166: ! 167: ! 168: ! 169: /************************************************************************ ! 170: * ! 171: * SUBTEST 3 ! 172: * data in registers, 2 NO-OPs ! 173: * ! 174: ************************************************************************/ ! 175: pipe4_3() ! 176: { ! 177: force_loop = FALSE; /* clear force_loop flag */ ! 178: index = 0; ! 179: do ! 180: { ! 181: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 182: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 183: sgl_value_2 = 0x40800000; /* floating '1' */ ! 184: /* ! 185: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 186: * The force loop flag is set after the first error. ! 187: */ ! 188: asm("_pipe4_3_lp1:"); ! 189: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 190: asm("movl _sgl_value_2,r5"); /* move data to r5 */ ! 191: asm("ldf r4"); /* load the operand */ ! 192: asm("nop"); ! 193: asm("nop"); ! 194: asm("stf r7"); /* store the result */ ! 195: asm("nop"); ! 196: asm("nop"); ! 197: asm("ldf r5"); /* load a floating '1' */ ! 198: asm("nop"); ! 199: asm("nop"); ! 200: asm("mulf r5"); /* multipy by a '1' */ ! 201: asm("nop"); ! 202: asm("nop"); ! 203: asm("mulf r4"); /* multipy by the operand */ ! 204: asm("nop"); ! 205: asm("nop"); ! 206: asm("stf r8"); /* store the result */ ! 207: if( force_loop ); ! 208: asm("brb _pipe4_3_lp1");; /* loop on the error */ ! 209: /* ! 210: * verify the results ! 211: */ ! 212: asm("movl r7,_sgl_st_acc"); /* get the 1st store value */ ! 213: asm("movl r8,_sgl_value_6"); /* get the 2nd store value */ ! 214: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 215: (sgl_value_6 != sgl_expected) ) ! 216: { ! 217: errcnt++; /* bump the error count */ ! 218: if ( prt_error ) ! 219: print_pipe4_er("Reg. Data, 2 NO-OPs"); ! 220: if ( halt_flg ) ! 221: pipe4_er_hlt( subtest ); ! 222: if ( loop_on_err ) { ! 223: force_loop = TRUE; /* set the force loop flag */ ! 224: asm("brw _pipe4_3_lp1"); /* and loop */ ! 225: } ! 226: } /* end of compare error */ ! 227: } while( index++ < max_ldf_1_index ); ! 228: } /* end of subtest 3 */ ! 229: ! 230: ! 231: ! 232: ! 233: ! 234: ! 235: /************************************************************************ ! 236: * ! 237: * SUBTEST 4 ! 238: * data in registers, 3 NO-OPs ! 239: * ! 240: ************************************************************************/ ! 241: pipe4_4() ! 242: { ! 243: force_loop = FALSE; /* clear force_loop flag */ ! 244: index = 0; ! 245: do ! 246: { ! 247: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 248: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 249: sgl_value_2 = 0x40800000; /* floating '1' */ ! 250: /* ! 251: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 252: * The force loop flag is set after the first error. ! 253: */ ! 254: asm("_pipe4_4_lp1:"); ! 255: asm("movl _sgl_value_1,r4"); /* move the data to r4 */ ! 256: asm("movl _sgl_value_2,r5"); /* move data to r5 */ ! 257: asm("ldf r4"); /* load the operand */ ! 258: asm("nop"); ! 259: asm("nop"); ! 260: asm("nop"); ! 261: asm("stf r7"); /* store the result */ ! 262: asm("nop"); ! 263: asm("nop"); ! 264: asm("nop"); ! 265: asm("ldf r5"); /* load a floating '1' */ ! 266: asm("nop"); ! 267: asm("nop"); ! 268: asm("nop"); ! 269: asm("mulf r5"); /* multipy by a '1' */ ! 270: asm("nop"); ! 271: asm("nop"); ! 272: asm("nop"); ! 273: asm("mulf r4"); /* multipy by the operand */ ! 274: asm("nop"); ! 275: asm("nop"); ! 276: asm("nop"); ! 277: asm("stf r8"); /* store the result */ ! 278: if( force_loop ); ! 279: asm("brb _pipe4_4_lp1");; /* loop on the error */ ! 280: /* ! 281: * verify the results ! 282: */ ! 283: asm("movl r7,_sgl_st_acc"); /* get the 1st store value */ ! 284: asm("movl r8,_sgl_value_6"); /* get the 2nd store value */ ! 285: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 286: (sgl_value_6 != sgl_expected) ) ! 287: { ! 288: errcnt++; /* bump the error count */ ! 289: if ( prt_error ) ! 290: print_pipe4_er("Reg. Data, 3 NO-OPs"); ! 291: if ( halt_flg ) ! 292: pipe4_er_hlt( subtest ); ! 293: if ( loop_on_err ) { ! 294: force_loop = TRUE; /* set the force loop flag */ ! 295: asm("brw _pipe4_4_lp1"); /* and loop */ ! 296: } ! 297: } /* end of compare error */ ! 298: } while( index++ < max_ldf_1_index ); ! 299: } /* end of subtest 4 */ ! 300: ! 301: ! 302: ! 303: ! 304: ! 305: ! 306: ! 307: /************************************************************************ ! 308: * ! 309: * SUBTEST 5 ! 310: * data in Cache, no NO-OPs ! 311: * ! 312: ************************************************************************/ ! 313: pipe4_5() ! 314: { ! 315: force_loop = FALSE; /* clear force_loop flag */ ! 316: index = 0; ! 317: do ! 318: { ! 319: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 320: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 321: sgl_value_2 = 0x40800000; /* floating '1' */ ! 322: /* ! 323: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 324: * The force loop flag is set after the first error. ! 325: */ ! 326: asm("_pipe4_5_lp1:"); ! 327: asm("ldf _sgl_value_1"); /* load the operand */ ! 328: asm("stf _sgl_st_acc"); /* store the result */ ! 329: asm("ldf _sgl_value_2"); /* load a floating '1' */ ! 330: asm("mulf _sgl_value_2"); /* multipy by a '1' */ ! 331: asm("mulf _sgl_value_1"); /* multipy by the operand */ ! 332: asm("stf _sgl_value_6"); /* store the result */ ! 333: if( force_loop ); ! 334: asm("brb _pipe4_5_lp1");; /* loop on the error */ ! 335: /* ! 336: * verify the results ! 337: */ ! 338: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 339: (sgl_value_6 != sgl_expected) ) ! 340: { ! 341: errcnt++; /* bump the error count */ ! 342: if ( prt_error ) ! 343: print_pipe4_er("Cache Data, no NO-OPs"); ! 344: if ( halt_flg ) ! 345: pipe4_er_hlt( subtest ); ! 346: if ( loop_on_err ) { ! 347: force_loop = TRUE; /* set the force loop flag */ ! 348: asm("brw _pipe4_5_lp1"); /* and loop */ ! 349: } ! 350: } /* end of compare error */ ! 351: } while( index++ < max_ldf_1_index ); ! 352: } /* end of subtest 5 */ ! 353: ! 354: ! 355: ! 356: ! 357: ! 358: ! 359: /************************************************************************ ! 360: * ! 361: * SUBTEST 6 ! 362: * data in Cache, 1 NO-OP ! 363: * ! 364: ************************************************************************/ ! 365: pipe4_6() ! 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 = 0x40800000; /* floating '1' */ ! 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("_pipe4_6_lp1:"); ! 379: asm("ldf _sgl_value_1"); /* load the operand */ ! 380: asm("nop"); ! 381: asm("stf _sgl_st_acc"); /* store the result */ ! 382: asm("nop"); ! 383: asm("ldf _sgl_value_2"); /* load a floating '1' */ ! 384: asm("nop"); ! 385: asm("mulf _sgl_value_2"); /* multipy by a '1' */ ! 386: asm("nop"); ! 387: asm("mulf _sgl_value_1"); /* multipy by the operand */ ! 388: asm("nop"); ! 389: asm("stf _sgl_value_6"); /* store the result */ ! 390: if( force_loop ); ! 391: asm("brb _pipe4_6_lp1");; /* loop on the error */ ! 392: /* ! 393: * verify the results ! 394: */ ! 395: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 396: (sgl_value_6 != sgl_expected) ) ! 397: { ! 398: errcnt++; /* bump the error count */ ! 399: if ( prt_error ) ! 400: print_pipe4_er("Cache Data, 1 NO-OP"); ! 401: if ( halt_flg ) ! 402: pipe4_er_hlt( subtest ); ! 403: if ( loop_on_err ) { ! 404: force_loop = TRUE; /* set the force loop flag */ ! 405: asm("brw _pipe4_6_lp1"); /* and loop */ ! 406: } ! 407: } /* end of compare error */ ! 408: } while( index++ < max_ldf_1_index ); ! 409: } /* end of subtest 6 */ ! 410: ! 411: ! 412: ! 413: ! 414: ! 415: ! 416: /************************************************************************ ! 417: * ! 418: * SUBTEST 7 ! 419: * data in Cache, 2 NO-OPs ! 420: * ! 421: ************************************************************************/ ! 422: pipe4_7() ! 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: sgl_value_2 = 0x40800000; /* floating '1' */ ! 431: /* ! 432: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 433: * The force loop flag is set after the first error. ! 434: */ ! 435: asm("_pipe4_7_lp1:"); ! 436: asm("ldf _sgl_value_1"); /* load the operand */ ! 437: asm("nop"); ! 438: asm("nop"); ! 439: asm("stf _sgl_st_acc"); /* store the result */ ! 440: asm("nop"); ! 441: asm("nop"); ! 442: asm("ldf _sgl_value_2"); /* load a floating '1' */ ! 443: asm("nop"); ! 444: asm("nop"); ! 445: asm("mulf _sgl_value_2"); /* multipy by '1' */ ! 446: asm("nop"); ! 447: asm("nop"); ! 448: asm("mulf _sgl_value_1"); /* multipy by the operand */ ! 449: asm("nop"); ! 450: asm("nop"); ! 451: asm("stf _sgl_value_6"); /* store the result */ ! 452: if( force_loop ); ! 453: asm("brb _pipe4_7_lp1");; /* loop on the error */ ! 454: /* ! 455: * verify the results ! 456: */ ! 457: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 458: (sgl_value_6 != sgl_expected) ) ! 459: { ! 460: errcnt++; /* bump the error count */ ! 461: if ( prt_error ) ! 462: print_pipe4_er("Cache Data, 2 NO-OPs"); ! 463: if ( halt_flg ) ! 464: pipe4_er_hlt( subtest ); ! 465: if ( loop_on_err ) { ! 466: force_loop = TRUE; /* set the force loop flag */ ! 467: asm("brw _pipe4_7_lp1"); /* and loop */ ! 468: } ! 469: } /* end of compare error */ ! 470: } while( index++ < max_ldf_1_index ); ! 471: } /* end of subtest 7 */ ! 472: ! 473: ! 474: ! 475: ! 476: ! 477: ! 478: /************************************************************************ ! 479: * ! 480: * SUBTEST 8 ! 481: * data in Cache, 3 NO-OPs ! 482: * ! 483: ************************************************************************/ ! 484: pipe4_8() ! 485: { ! 486: force_loop = FALSE; /* clear force_loop flag */ ! 487: index = 0; ! 488: do ! 489: { ! 490: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 491: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 492: sgl_value_2 = 0x40800000; /* floating '1' */ ! 493: /* ! 494: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 495: * The force loop flag is set after the first error. ! 496: */ ! 497: asm("_pipe4_8_lp1:"); ! 498: asm("ldf _sgl_value_1"); /* load the operand */ ! 499: asm("nop"); ! 500: asm("nop"); ! 501: asm("nop"); ! 502: asm("stf _sgl_st_acc"); /* store the result */ ! 503: asm("nop"); ! 504: asm("nop"); ! 505: asm("nop"); ! 506: asm("ldf _sgl_value_2"); /* load a floating '1' */ ! 507: asm("nop"); ! 508: asm("nop"); ! 509: asm("nop"); ! 510: asm("mulf _sgl_value_2"); /* multipy by a '1' */ ! 511: asm("nop"); ! 512: asm("nop"); ! 513: asm("nop"); ! 514: asm("mulf _sgl_value_1"); /* multipy by the operand */ ! 515: asm("nop"); ! 516: asm("nop"); ! 517: asm("nop"); ! 518: asm("stf _sgl_value_6"); /* store the result */ ! 519: if( force_loop ); ! 520: asm("brb _pipe4_8_lp1");; /* loop on the error */ ! 521: /* ! 522: * verify the results ! 523: */ ! 524: if( (sgl_st_acc != sgl_expected) || /* COMPARE the values */ ! 525: (sgl_value_6 != sgl_expected) ) ! 526: { ! 527: errcnt++; /* bump the error count */ ! 528: if ( prt_error ) ! 529: print_pipe4_er("Cache Data, 3 NO-OPs"); ! 530: if ( halt_flg ) ! 531: pipe4_er_hlt( subtest ); ! 532: if ( loop_on_err ) { ! 533: force_loop = TRUE; /* set the force loop flag */ ! 534: asm("brw _pipe4_8_lp1"); /* and loop */ ! 535: } ! 536: } /* end of compare error */ ! 537: } while( index++ < max_ldf_1_index ); ! 538: } /* end of subtest 8 */ ! 539: ! 540: ! 541: ! 542: ! 543: ! 544: ! 545: /***************************************************************************** ! 546: * ! 547: * SUBTEST 9 ! 548: * data on the stack, no NO-OPs ! 549: * ! 550: *****************************************************************************/ ! 551: pipe4_9() ! 552: { ! 553: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */ ! 554: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */ ! 555: force_loop = FALSE; /* clear force_loop flag */ ! 556: index = 0; ! 557: do ! 558: { ! 559: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 560: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 561: sgl_value_2 = 0x40800000; /* floating '1' */ ! 562: asm("moval _pointer_data,_sgl_value_4");/* init / final SP value */ ! 563: /* ! 564: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 565: * The force loop flag is set after the first error. ! 566: */ ! 567: asm("_pipe4_9_lp1:"); ! 568: asm("moval _pointer_data,r14"); /* set the stack pointer */ ! 569: asm("movl _sgl_value_1,-(r14)"); /* push the operand */ ! 570: asm("movl _sgl_value_2,-(r14)"); /* push a floating '1' */ ! 571: asm("movl _sgl_value_2,-(r14)"); /* push a '1' again */ ! 572: asm("movl _sgl_value_1,-(r14)"); /* push the operand again */ ! 573: /* ! 574: * now pop the data off the stack ! 575: */ ! 576: ! 577: asm("ldf (r14)+"); /* load the operand */ ! 578: asm("stf r5"); /* store the result */ ! 579: asm("ldf (r14)+"); /* load a floating '1' */ ! 580: asm("mulf (r14)+"); /* multipy by a '1' */ ! 581: asm("mulf (r14)+"); /* multipy by the operand */ ! 582: asm("stf r6"); /* store the result */ ! 583: if( force_loop ); ! 584: asm("brb _pipe4_9_lp1");; /* loop on the error */ ! 585: /* ! 586: * verify the results ! 587: */ ! 588: asm("movl r5,_sgl_st_acc"); /* get the 1st store value */ ! 589: asm("movl r6,_sgl_value_6"); /* get the 2nd store value */ ! 590: asm("moval (r14),_sgl_value_5"); /* save the stack pointer */ ! 591: if( (sgl_st_acc != sgl_expected) || /* verify the results... */ ! 592: (sgl_value_6 != sgl_expected) || ! 593: (sgl_value_5 != sgl_value_4) ) /* ... and the final SP */ ! 594: { ! 595: asm("movl _pre_event_fp,r13"); /* restore frame pointer */ ! 596: asm("movl _pre_event_sp,r14"); /* restore stack pointer */ ! 597: errcnt++; /* bump the error count */ ! 598: if ( prt_error ) { ! 599: print_pipe4_er("POP data from the STACK"); ! 600: writes("final Stack Pointer = "); ! 601: write32h( sgl_value_5 ); ! 602: writes(", expected SP = "); ! 603: write32h( sgl_value_4 ); ! 604: writes("\n"); ! 605: } ! 606: if ( halt_flg ) ! 607: pipe4_er_hlt( subtest ); ! 608: if ( loop_on_err ) { ! 609: force_loop = TRUE; /* set the force loop flag */ ! 610: asm("brw _pipe4_9_lp1"); /* and loop */ ! 611: } ! 612: } /* end of compare error */ ! 613: } while( index++ < max_ldf_1_index ); ! 614: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */ ! 615: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */ ! 616: } /* end of subtest 9 */ ! 617: ! 618: ! 619: ! 620: ! 621: ! 622: ! 623: /****************************************************************************** ! 624: * ! 625: * SUBTEST 10 ! 626: * get data via indexed FRAME pointer ! 627: * ! 628: * ADDR INDEX DATA ! 629: * pointer_data 4 <the 1st STF result goes here> ! 630: * pointer_data-4 3 <the 2nd STF result goes here> ! 631: * pointer_data-8 2 <operand data> ! 632: * pointer_data-12 1 <floating '1'> ! 633: * pointer_data-16 0 point the frame pointer here ! 634: * ! 635: ******************************************************************************/ ! 636: pipe4_10() ! 637: { ! 638: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */ ! 639: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */ ! 640: force_loop = FALSE; /* clear force_loop flag */ ! 641: index = 0; ! 642: do ! 643: { ! 644: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */ ! 645: sgl_expected = ldf_1_data[index].exp; /* get expected results */ ! 646: sgl_value_2 = 0x40800000; /* floating '1' */ ! 647: asm("moval _pointer_data,_sgl_value_4");/* get store data's addr */ ! 648: sgl_value_4 -= 8; /* decrement it by 8 (bytes)*/ ! 649: asm("movl _sgl_value_1,*_sgl_value_4"); /* set the operand data */ ! 650: sgl_value_4 -= 4; /* decrement it by 4 (bytes)*/ ! 651: asm("movl _sgl_value_2,*_sgl_value_4"); /* set the floating '1' */ ! 652: sgl_value_4 -= 4; /* get FRAME PTR address */ ! 653: /* ! 654: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 655: * The force loop flag is set after the first error. ! 656: */ ! 657: asm("_pipe4_10_lp1:"); ! 658: asm("movl _sgl_value_4,r13"); /* set the FRAME POINTER */ ! 659: asm("movl $1,r1"); /* r1 index = 1 longwords */ ! 660: asm("movl $2,r2"); /* r2 index = 2 longwords */ ! 661: asm("movl $3,r3"); /* r3 index = 3 longwords */ ! 662: asm("movl $4,r4"); /* r4 index = 4 longwords */ ! 663: asm("ldf (r13)[r2]"); /* load the op (indx = 2) */ ! 664: asm("stf (r13)[r4]"); /* store -index = 4 */ ! 665: asm("ldf (r13)[r1]"); /* load '1' (indx = 1) */ ! 666: asm("mulf (r13)[r1]"); /* multiply by a '1' */ ! 667: asm("mulf (r13)[r2]"); /* multiply by the operand */ ! 668: asm("stf (r13)[r3]"); /* store -index = 3 */ ! 669: if( force_loop ); ! 670: asm("brb _pipe4_10_lp1");; /* loop on the error */ ! 671: /* ! 672: * verify the results ! 673: */ ! 674: sgl_st_acc = pointer_data; /* save 1st stored value */ ! 675: asm("moval _pointer_data,_sgl_value_5"); /* get addr of 1st stf */ ! 676: sgl_value_5 -= 4; /* decrement by 4 (bytes) */ ! 677: asm("movl *_sgl_value_5,_sgl_value_6"); /* save 2nd store value */ ! 678: asm("moval (r13),_sgl_value_5"); /* save the frame pointer */ ! 679: if( (sgl_st_acc != sgl_expected) || /* verify the results... */ ! 680: (sgl_value_6 != sgl_expected) || ! 681: (sgl_value_5 != sgl_value_4) ) /* ... and the final FP */ ! 682: { ! 683: asm("movl _pre_event_fp,r13"); /* restore frame pointer */ ! 684: asm("movl _pre_event_sp,r14"); /* restore stack pointer */ ! 685: errcnt++; /* bump the error count */ ! 686: if ( prt_error ) { ! 687: print_pipe4_er("indexed FP addressing"); ! 688: writes("final Frame Pointer = "); ! 689: writeh( sgl_value_5 ); ! 690: writes(", expected FP = "); ! 691: writeh( sgl_value_4 ); ! 692: writes("\n"); ! 693: } ! 694: if ( halt_flg ) ! 695: pipe4_er_hlt( subtest ); ! 696: if ( loop_on_err ) { ! 697: force_loop = TRUE; /* set the force loop flag */ ! 698: asm("brw _pipe4_10_lp1"); /* and loop */ ! 699: } ! 700: } /* end of compare error */ ! 701: } while( index++ < max_ldf_1_index ); ! 702: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */ ! 703: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */ ! 704: } /* end of subtest 10 */ ! 705: ! 706: ! 707: /****************************************************************************** ! 708: * ! 709: * ! 710: * print an error in the following form ! 711: * ! 712: * operand = xxxxxxxx, 1st store = xxxxxxxx, data index = dd ! 713: * 2nd store = xxxxxxxx, expected Acc = xxxxxxxx ! 714: * ! 715: ******************************************************************************/ ! 716: print_pipe4_er(msg) ! 717: char *msg; ! 718: { ! 719: writes("\n"); /* start a new print line */ ! 720: writes("cycle: "); ! 721: writed( cycle ); ! 722: writes(" test "); ! 723: writed( test_no ); ! 724: writes(" (Pipe 4), subtest "); ! 725: writed( subtest ); ! 726: writes(" error - "); ! 727: writes( msg ); ! 728: writec('\n'); ! 729: writes(" LDF(op), STF, LDF(1.0), MULF(op), STF\n"); ! 730: writes(" operand = "); ! 731: write32h( sgl_value_1 ); ! 732: writes(", 1st store = "); ! 733: write32h( sgl_st_acc ); ! 734: writes(", data index = "); ! 735: writed( index ); ! 736: writec('\n'); ! 737: writes("2nd store = "); ! 738: write32h( sgl_value_6 ); ! 739: writes(", expected Acc = "); ! 740: write32h( sgl_expected ); ! 741: writec('\n'); ! 742: } ! 743: ! 744: ! 745: ! 746: ! 747: ! 748: /****************************************************************************** ! 749: * ! 750: * HALT ON ERROR ROUTINE ! 751: * ! 752: * halt with the necessary information saved in the registers ! 753: * ! 754: ******************************************************************************/ ! 755: pipe4_er_hlt( subtest ) ! 756: int subtest; ! 757: { ! 758: asm("movl _test_no,r0"); /* r0 = test number */ ! 759: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 760: asm("movl $1,r2"); /* r2 = error code */ ! 761: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 762: asm("movl _sgl_value_1,r4"); /* r4 = sgl operand */ ! 763: asm("movl _sgl_st_acc,r5"); /* r5 = 1st word stored */ ! 764: asm("movl _sgl_value_6,r6"); /* r6 = 2nd word stored */ ! 765: asm("movl _sgl_expected,r7"); /* r7 = sgl expected */ ! 766: asm("movl _index,r8"); /* r8 = data index */ ! 767: asm("movl _sgl_value_2,r9"); /* r9 = floating one */ ! 768: if( subtest == 9 ) { ! 769: asm("movl _sgl_value_5,r10"); /* r10= final SP value */ ! 770: asm("movl _sgl_value_4,r11"); /* r11= expected SP value */ ! 771: } else ! 772: if( subtest == 10 ) { ! 773: asm("movl _sgl_value_5,r10"); /* r10= final FP value */ ! 774: asm("movl _sgl_value_4,r11"); /* r11= expected FP value */ ! 775: }; ! 776: asm(".globl _pipe4_1_hlt"); ! 777: asm("_pipe4_1_hlt:"); /* PC after the halt */ ! 778: asm("halt"); /* HALT ... */ ! 779: } /* end of halt on error */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.