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