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