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