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