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