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