|
|
1.1 ! root 1: #include "dmp_defs.h" ! 2: ! 3: /************************************************************************** ! 4: * ! 5: * Test the current instruction ! 6: * ! 7: * If the current instruction accesses any operands, then test it with ! 8: * all major applicable addressing modes. ! 9: **************************************************************************/ ! 10: test_inst() ! 11: { ! 12: /* ! 13: * Set the values for the indirect pointers ! 14: */ ! 15: asm("movl _adr_op1,*_adr_op1_ptr"); /* word offset ptr #1 */ ! 16: asm("movl _adr_op2,*_adr_op2_ptr"); /* word offset ptr #2 */ ! 17: if( !no_ops ) ! 18: test_0_ops(); /* test inst w/ no operands */ ! 19: else ! 20: { ! 21: tst_abs(); /* absolute addressing */ ! 22: if( s_to_d || ! 23: ( (precision == SGL) && (op_type == LOAD) ) ) ! 24: tst_i_l(); /* immediate longword */ ! 25: tst_b(); /* byte displacement relative */ ! 26: tst_w(); /* word displacement relative */ ! 27: tst_l(); /* longword displacement relative */ ! 28: tst_b_d(); /* byte disp. relative deferred */ ! 29: tst_w_d(); /* word disp. relative deferred */ ! 30: tst_l_d(); /* longword disp. rel. deferred */ ! 31: tst_r(); /* direct register */ ! 32: tst_r_d(); /* register deferred */ ! 33: /* if( d_to_s || ( (precision == SGL) && (op_type == STORE) ) ) ! 34: /* tst_push(); /* PUSH ( auto-decremented SP ) */ ! 35: /* if( s_to_d || ( (precision == SGL) && (op_type == LOAD) ) ) ! 36: /* tst_pop(); /* POP ( auto-incremented SP ) */ ! 37: /* tst_pop_d(); /* auto-incremented SP deferred */ ! 38: tst_r_b(); /* register + byte displacement */ ! 39: tst_r_w(); /* register + word displacement */ ! 40: tst_r_l(); /* register _ longword disp. */ ! 41: tst_r_bd(); /* reg. + byte disp. deferred */ ! 42: tst_r_wd(); /* reg. + word disp. deferred */ ! 43: tst_r_ld(); /* reg. _ longword disp. deferred */ ! 44: tst_x_fpd(); /* FP deferred + longword index */ ! 45: tst_x_l(); /* longword disp. + longword index */ ! 46: } ! 47: } ! 48: ! 49: ! 50: ! 51: ! 52: ! 53: /******************************************************************* ! 54: * ABSOLUTE ADDRESSING: ! 55: * instruction = <op-code> <9f> <&dmp_op_1> {<9f> <&dmp_op_2>} ! 56: *******************************************************************/ ! 57: tst_abs() ! 58: { ! 59: fill_reg_buf( load_regs ); /* set data for registers */ ! 60: fill_reg_buf( exp_regs ); /* set data for registers */ ! 61: addr_mode = ADR_ABSOLUTE; ! 62: addr_code = 0x9f; ! 63: addr_code2 = 0x9f; ! 64: addr_size = 4; /* longword (4 byte) ops. */ ! 65: addr_1 = DMP_OP_1; /* abs. address of data */ ! 66: addr_2 = DMP_OP_2; ! 67: if( no_ops == 2 ) ! 68: min_shift = 6; ! 69: else ! 70: min_shift = 11; ! 71: index = 0; ! 72: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 73: { ! 74: get_current_data(); ! 75: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 76: *adr_op1_lsw = dbl_value_1.l; ! 77: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 78: *adr_op2_lsw = dbl_value_2.l; ! 79: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 80: pack_inst(); /* pack the instr. code */ ! 81: run_code(); /* execute the instruction */ ! 82: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 83: dbl_value_3.l = *adr_op1_lsw; ! 84: (*test_ptr)(); /* verify the results */ ! 85: if( force_loop ) ! 86: run_code(); /* start the error loop */ ! 87: index++; /* bump the data index */ ! 88: } ! 89: } ! 90: ! 91: ! 92: ! 93: ! 94: ! 95: /******************************************************************* ! 96: * IMMEDIATE LONGWORD ADDRESSING: ( sgl and sgl_to_dbl only ) ! 97: * instruction = <op-code> <8f> <data> ! 98: *******************************************************************/ ! 99: tst_i_l() ! 100: { ! 101: fill_reg_buf( load_regs ); /* set data for registers */ ! 102: fill_reg_buf( exp_regs ); /* set data for registers */ ! 103: addr_mode = ADR_IM_L; ! 104: addr_code = addr_code2 = 0x8f; /* immediate lword = 0x8f */ ! 105: addr_size = 4; /* longword (4 byte) data */ ! 106: exp_page_faults = 2; /* 2 pages used */ ! 107: index = 0; ! 108: for( shift_count = 15; shift_count >= 11; shift_count-- ) ! 109: { ! 110: get_current_data(); ! 111: addr_1 = dbl_value_1.m; /* set the 1st operand */ ! 112: addr_2 = dbl_value_2.m; /* set the 2nd operand */ ! 113: pack_inst(); /* pack the instr. code */ ! 114: run_code(); /* execute the instruction */ ! 115: (*test_ptr)(); /* verify the results */ ! 116: if( force_loop ) ! 117: run_code(); /* start the error loop */ ! 118: index++; /* bump the data index */ ! 119: } ! 120: } ! 121: ! 122: ! 123: ! 124: /******************************************************************* ! 125: * BYTE DISPLACEMENT RELATIVE ADDRESSING: ! 126: * instruction = <op-code> <af> <offset to dmp_byte_op_1> ! 127: * { <af> <offset to dmp_byte_op_2> } ! 128: *******************************************************************/ ! 129: tst_b() ! 130: { ! 131: fill_reg_buf( load_regs ); /* set data for registers */ ! 132: fill_reg_buf( exp_regs ); /* set data for registers */ ! 133: addr_mode = ADR_B_DSP; ! 134: addr_code = addr_code2 = 0xaf; ! 135: addr_size = 1; /* 1 byte operand */ ! 136: exp_page_faults = 2; /* 2 pages used */ ! 137: if( no_ops == 2 ) ! 138: min_shift = 11; ! 139: else ! 140: min_shift = 13; ! 141: index = 0; ! 142: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 143: { ! 144: get_current_data(); ! 145: *adr_b_op1 = dbl_value_1.m; /* set the operand */ ! 146: *adr_bop1_lsw = dbl_value_1.l; ! 147: *adr_b_op2 = dbl_value_2.m; /* set the operand */ ! 148: *adr_bop2_lsw = dbl_value_2.l; ! 149: addr_1 = os_b_op1 + 13 - shift_count; /* data's offset */ ! 150: addr_2 = os_b_op2 + 11 - shift_count; ! 151: pack_inst(); /* pack the instr. code */ ! 152: run_code(); /* execute the instruction */ ! 153: dbl_value_3.m = *adr_b_op1; /* get the final operand */ ! 154: dbl_value_3.l = *adr_bop1_lsw; ! 155: (*test_ptr)(); /* verify the results */ ! 156: if( force_loop ) ! 157: run_code(); /* start the error loop */ ! 158: index++; /* bump the data index */ ! 159: } ! 160: } ! 161: ! 162: ! 163: ! 164: /******************************************************************* ! 165: * WORD DISPLACEMENT RELATIVE ADDRESSING: ! 166: * instruction = <op-code> <cf> <offset to dmp_op_1> ! 167: * { <cf> <offset to dmp_op_2> } ! 168: *******************************************************************/ ! 169: tst_w() ! 170: { ! 171: fill_reg_buf( load_regs ); /* set data for registers */ ! 172: fill_reg_buf( exp_regs ); /* set data for registers */ ! 173: addr_mode = ADR_W_DSP; ! 174: addr_code = addr_code2 = 0xcf; ! 175: addr_size = 2; /* word (2 byte) operand */ ! 176: if( no_ops == 2 ) ! 177: min_shift = 10; ! 178: else ! 179: min_shift = 13; ! 180: index = 0; ! 181: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 182: { ! 183: get_current_data(); ! 184: *adr_op1 = dbl_value_1.m; /* set the operand */ ! 185: *adr_op1_lsw = dbl_value_1.l; ! 186: *adr_op2 = dbl_value_2.m; ! 187: *adr_op2_lsw = dbl_value_2.l; ! 188: addr_1 = os_op1 + 12 - shift_count; /* data's offset */ ! 189: addr_2 = os_op2 + 9 - shift_count; ! 190: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 191: pack_inst(); /* pack the instr. code */ ! 192: run_code(); /* execute the instruction */ ! 193: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 194: dbl_value_3.l = *adr_op1_lsw; ! 195: (*test_ptr)(); /* verify the results */ ! 196: if( force_loop ) ! 197: run_code(); /* start the error loop */ ! 198: index++; /* bump the data index */ ! 199: } ! 200: } ! 201: ! 202: ! 203: ! 204: /******************************************************************* ! 205: * LONGWORD DISPLACEMENT RELATIVE ADDRESSING: ! 206: * instruction = <op-code> <ef> <offset to dmp_op_1> ! 207: * { <ef> <offset to dmp_op_2> } ! 208: *******************************************************************/ ! 209: tst_l() ! 210: { ! 211: fill_reg_buf( load_regs ); /* set data for registers */ ! 212: fill_reg_buf( exp_regs ); /* set data for registers */ ! 213: addr_mode = ADR_L_DSP; ! 214: addr_code = addr_code2 = 0xef; ! 215: addr_size = 4; /* longword (4 byte) ops. */ ! 216: if( no_ops == 2 ) ! 217: min_shift = 6; ! 218: else ! 219: min_shift = 11; ! 220: index = 0; ! 221: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 222: { ! 223: get_current_data(); ! 224: *adr_op1 = dbl_value_1.m; /* set the operand */ ! 225: *adr_op1_lsw = dbl_value_1.l; ! 226: *adr_op2 = dbl_value_2.m; ! 227: *adr_op2_lsw = dbl_value_2.l; ! 228: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 229: addr_1 = os_op1 + 10 - shift_count; /* data's offset */ ! 230: addr_2 = os_op2 + 5 - shift_count; ! 231: pack_inst(); /* pack the instr. code */ ! 232: run_code(); /* execute the instruction */ ! 233: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 234: dbl_value_3.l = *adr_op1_lsw; ! 235: (*test_ptr)(); /* verify the results */ ! 236: if( force_loop ) ! 237: run_code(); /* start the error loop */ ! 238: index++; /* bump the data index */ ! 239: } ! 240: } ! 241: ! 242: ! 243: ! 244: /******************************************************************* ! 245: * BYTE DISPLACEMENT RELATIVE DEFERRED ADDRESSING: ! 246: * instruction = <op-code> <bf> <offset to dmp_byte_op_1> ! 247: * { <bf> <offset to dmp_byte_op_2> } ! 248: *******************************************************************/ ! 249: tst_b_d() ! 250: { ! 251: fill_reg_buf( load_regs ); /* set data for registers */ ! 252: fill_reg_buf( exp_regs ); /* set data for registers */ ! 253: addr_mode = ADR_B_DSP_DEF; ! 254: addr_code = addr_code2 = 0xbf; ! 255: addr_size = 1; /* 1 byte operand */ ! 256: *adr_b_op1 = (int) adr_op1; /* set byte offset ptr #1 */ ! 257: *adr_b_op2 = (int) adr_op2; /* set byte offset ptr #2 */ ! 258: if( no_ops == 2 ) ! 259: min_shift = 11; ! 260: else ! 261: min_shift = 13; ! 262: index = 0; ! 263: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 264: { ! 265: get_current_data(); ! 266: *adr_op1 = dbl_value_1.m; /* set the operand */ ! 267: *adr_op1_lsw = dbl_value_1.l; ! 268: *adr_op2 = dbl_value_2.m; ! 269: *adr_op2_lsw = dbl_value_2.l; ! 270: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 271: addr_1 = os_b_op1 + 13 - shift_count; /* data's offset */ ! 272: addr_2 = os_b_op2 + 11 - shift_count; ! 273: pack_inst(); /* pack the instr. code */ ! 274: run_code(); /* execute the instruction */ ! 275: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 276: dbl_value_3.l = *adr_op1_lsw; ! 277: (*test_ptr)(); /* verify the results */ ! 278: if( force_loop ) ! 279: run_code(); /* start the error loop */ ! 280: index++; /* bump the data index */ ! 281: } ! 282: } ! 283: ! 284: ! 285: ! 286: ! 287: /******************************************************************* ! 288: * WORD DISPLACEMENT RELATIVE DEFERRED ADDRESSING: ! 289: * instruction = <op-code> <df> <offset to dmp_op_1> ! 290: * { <df> <offset to dmp_op_2> } ! 291: *******************************************************************/ ! 292: tst_w_d() ! 293: { ! 294: fill_reg_buf( load_regs ); /* set data for registers */ ! 295: fill_reg_buf( exp_regs ); /* set data for registers */ ! 296: addr_mode = ADR_W_DSP_DEF; ! 297: addr_code = addr_code2 = 0xdf; ! 298: addr_size = 2; /* word (2 byte) operand */ ! 299: if( no_ops == 2 ) ! 300: min_shift = 10; ! 301: else ! 302: min_shift = 13; ! 303: index = 0; ! 304: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 305: { ! 306: get_current_data(); ! 307: *adr_op1 = dbl_value_1.m; /* set the operand */ ! 308: *adr_op1_lsw = dbl_value_1.l; ! 309: *adr_op2 = dbl_value_2.m; ! 310: *adr_op2_lsw = dbl_value_2.l; ! 311: get_exp_faults( 4, 5, 6, 8 ); /* set exp fault cnt */ ! 312: addr_1 = os_ad_op1 + 12 - shift_count; /* operand offset */ ! 313: addr_2 = os_ad_op2 + 9 - shift_count; ! 314: pack_inst(); /* pack the instr. code */ ! 315: run_code(); /* execute the instruction */ ! 316: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 317: dbl_value_3.l = *adr_op1_lsw; ! 318: (*test_ptr)(); /* verify the results */ ! 319: if( force_loop ) ! 320: run_code(); /* start the error loop */ ! 321: index++; /* bump the data index */ ! 322: } ! 323: } ! 324: ! 325: ! 326: ! 327: /******************************************************************* ! 328: * LONGWORD DISPLACEMENT RELATIVE DEFERRED ADDRESSING: ! 329: * instruction = <op-code> <ff> <offset to dmp_op_1> ! 330: * { <ff> <offset to dmp_op_1> } ! 331: *******************************************************************/ ! 332: tst_l_d() ! 333: { ! 334: fill_reg_buf( load_regs ); /* set data for registers */ ! 335: fill_reg_buf( exp_regs ); /* set data for registers */ ! 336: addr_mode = ADR_L_DSP_DEF; ! 337: addr_code = addr_code2 = 0xff; ! 338: addr_size = 4; /* longword (4 byte) op. */ ! 339: if( no_ops == 2 ) ! 340: min_shift = 6; ! 341: else ! 342: min_shift = 11; ! 343: index = 0; ! 344: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 345: { ! 346: get_current_data(); ! 347: *adr_op1 = dbl_value_1.m; /* set the operand */ ! 348: *adr_op1_lsw = dbl_value_1.l; ! 349: *adr_op2 = dbl_value_2.m; /* set the operand */ ! 350: *adr_op2_lsw = dbl_value_2.l; ! 351: get_exp_faults( 4, 5, 6, 8 ); /* set exp fault cnt */ ! 352: addr_1 = os_ad_op1 + 10 - shift_count; /* operand offset */ ! 353: addr_2 = os_ad_op2 + 5 - shift_count; ! 354: pack_inst(); /* pack the instr. code */ ! 355: run_code(); /* execute the instruction */ ! 356: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 357: dbl_value_3.l = *adr_op1_lsw; ! 358: (*test_ptr)(); /* verify the results */ ! 359: if( force_loop ) ! 360: run_code(); /* start the error loop */ ! 361: index++; /* bump the data index */ ! 362: } ! 363: } ! 364: ! 365: ! 366: ! 367: /******************************************************************* ! 368: * DIRECT REGISTER ADDRESSING: ! 369: * instruction = <op-code> <50> { <54> } ! 370: *******************************************************************/ ! 371: tst_r() ! 372: { ! 373: fill_reg_buf( load_regs ); /* set data for registers */ ! 374: fill_reg_buf( exp_regs ); /* set data for registers */ ! 375: addr_mode = ADR_REG; ! 376: addr_code = 0x50; /* 1st op in registers 0/1 */ ! 377: addr_code2 = 0x54; /* 2nd op in registers 4/5 */ ! 378: addr_size = 0; /* no addressing bytes */ ! 379: pack_inst(); /* pack the instr. code */ ! 380: exp_page_faults = 2; /* 2 pages used */ ! 381: if( no_ops == 2 ) ! 382: min_shift = 14; ! 383: else ! 384: min_shift = 15; ! 385: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 386: { ! 387: for( index = 0; index < 3; index++ ) ! 388: { ! 389: get_current_data(); ! 390: load_regs[0] = dbl_value_1.m; /* get the data */ ! 391: load_regs[1] = dbl_value_1.l; ! 392: load_regs[4] = dbl_value_2.m; ! 393: load_regs[5] = dbl_value_2.l; ! 394: exp_regs[4] = load_regs[4]; /* set exp final reg value */ ! 395: exp_regs[5] = load_regs[5]; ! 396: if( op_type == LOAD ) ! 397: { ! 398: exp_regs[0] = dbl_value_1.m; ! 399: exp_regs[1] = dbl_value_1.l; ! 400: } else { ! 401: exp_regs[0] = dbl_expected.m; ! 402: exp_regs[1] = dbl_expected.l; ! 403: } ! 404: if( op_code == CVDL_OP_CODE ) /* correct for sgl store */ ! 405: exp_regs[1] = dbl_value_1.l; /* r1 shouldn't change */ ! 406: run_code(); /* execute the instruction */ ! 407: dbl_value_3.m = store_regs[0]; /* get final r0, r1 values */ ! 408: dbl_value_3.l = store_regs[1]; ! 409: (*test_ptr)(); /* verify the results */ ! 410: if( force_loop ) ! 411: run_code(); /* start the error loop */ ! 412: } ! 413: } ! 414: } ! 415: ! 416: ! 417: ! 418: /******************************************************************* ! 419: * REGISTER DEFERRED ADDRESSING: ! 420: * instruction = <op-code> <60> {<61>} ! 421: *******************************************************************/ ! 422: tst_r_d() ! 423: { ! 424: fill_reg_buf( load_regs ); /* set data for registers */ ! 425: fill_reg_buf( exp_regs ); /* set data for registers */ ! 426: addr_mode = ADR_REG_DEF; ! 427: addr_code = 0x60; ! 428: addr_code2 = 0x61; ! 429: addr_size = 0; /* no address byte(s) */ ! 430: load_regs[0] = (int) adr_op1; /* get addr of op. 1 */ ! 431: load_regs[1] = (int) adr_op2; /* get addr of op. 2 */ ! 432: exp_regs[0] = load_regs[0]; ! 433: exp_regs[1] = load_regs[1]; ! 434: pack_inst(); /* pack the instr. code */ ! 435: if( no_ops == 2 ) ! 436: min_shift = 14; ! 437: else ! 438: min_shift = 15; ! 439: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 440: { ! 441: for( index = 0; index < 3; index++ ) ! 442: { ! 443: get_current_data(); ! 444: *adr_op1 = dbl_value_1.m; /* set the 1st data */ ! 445: *adr_op1_lsw = dbl_value_1.l; ! 446: *adr_op2 = dbl_value_2.m; /* set the 2nd data */ ! 447: *adr_op2_lsw = dbl_value_2.l; ! 448: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 449: run_code(); /* execute the instruction */ ! 450: dbl_value_3.m = *adr_op1; /* get op's final value */ ! 451: dbl_value_3.l = *adr_op1_lsw; ! 452: (*test_ptr)(); /* verify the results */ ! 453: if( force_loop ) ! 454: run_code(); /* start the error loop */ ! 455: } ! 456: } ! 457: } ! 458: ! 459: ! 460: ! 461: ! 462: /******************************************************************* ! 463: * AUTO-DECREMENTED STACK POINTER ADDRESSING ( PUSH ): ! 464: * instruction = <op-code> <7e> ! 465: * ! 466: * The final result will be popped by "run_code" ! 467: *******************************************************************/ ! 468: tst_push() ! 469: { ! 470: fill_reg_buf( load_regs ); /* set data for registers */ ! 471: fill_reg_buf( exp_regs ); /* set data for registers */ ! 472: addr_mode = ADR_PUSH; ! 473: addr_code = 0x7e; ! 474: addr_size = 0; /* no addressing bytes */ ! 475: exp_page_faults = 3; /* 3 pages used */ ! 476: shift_count = 15; ! 477: pack_inst(); /* pack the instr. code */ ! 478: for( index = 0; index < 3; index++ ) ! 479: { ! 480: get_current_data(); ! 481: run_code(); /* execute the instruction */ ! 482: dbl_value_3.m = *adr_op1; /* get op's final value */ ! 483: (*test_ptr)(); /* verify the results */ ! 484: if( force_loop ) ! 485: run_code(); /* start the error loop */ ! 486: } ! 487: } ! 488: ! 489: ! 490: ! 491: ! 492: /******************************************************************* ! 493: * AUTO-INCREMENTED STACK POINTER ADDRESSING ( POP ): ( sgl ops only ) ! 494: * instruction = <op-code> <8e> ! 495: * ! 496: * The data will be pushed by "run_code" ! 497: *******************************************************************/ ! 498: tst_pop() ! 499: { ! 500: fill_reg_buf( load_regs ); /* set data for registers */ ! 501: fill_reg_buf( exp_regs ); /* set data for registers */ ! 502: addr_mode = ADR_POP; ! 503: addr_code = 0x8e; ! 504: addr_size = 0; /* no addressing bytes */ ! 505: pack_inst(); /* pack the instr. code */ ! 506: exp_page_faults = 3; /* 3 pages used */ ! 507: shift_count = 15; ! 508: for( index = 0; index < 3; index++ ) ! 509: { ! 510: get_current_data(); ! 511: sgl_value_9 = dbl_value_1.m; /* data to be pushed */ ! 512: if( no_ops == 2 ) ! 513: sgl_value_10 = dbl_value_2.m; ! 514: run_code(); /* execute the instruction */ ! 515: (*test_ptr)(); /* verify the results */ ! 516: if( force_loop ) ! 517: run_code(); /* start the error loop */ ! 518: } ! 519: } ! 520: ! 521: ! 522: ! 523: ! 524: ! 525: /******************************************************************* ! 526: * AUTO-INCREMENTED STACK POINTER DEFERRED ADDRESSING: ! 527: * instruction = <op-code> <9e> { <9e> } ! 528: * ! 529: * The address of the data will be pushed by "run_code" ! 530: *******************************************************************/ ! 531: tst_pop_d() ! 532: { ! 533: fill_reg_buf( load_regs ); /* set data for registers */ ! 534: fill_reg_buf( exp_regs ); /* set data for registers */ ! 535: addr_mode = ADR_POP_DEF; ! 536: addr_code = addr_code2 = 0x9e; ! 537: addr_size = 0; /* no addressing bytes */ ! 538: pack_inst(); /* pack the instr. code */ ! 539: sgl_value_9 = (int) adr_op1; /* get 1st op to be popped */ ! 540: sgl_value_10 = (int) adr_op2; /* get 2nd op to be popped */ ! 541: if( no_ops == 2 ) ! 542: min_shift = 14; ! 543: else ! 544: min_shift = 15; ! 545: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 546: { ! 547: for( index = 0; index < 3; index++ ) ! 548: { ! 549: get_current_data(); ! 550: *adr_op1 = dbl_value_1.m; /* set the 1st op's data */ ! 551: *adr_op1_lsw = dbl_value_1.l; ! 552: *adr_op2 = dbl_value_2.m; /* set the 2nd op's data */ ! 553: *adr_op2_lsw = dbl_value_2.l; ! 554: get_exp_faults( 4, 5, 5, 7 ); /* set exp fault cnt */ ! 555: run_code(); /* execute the instruction */ ! 556: dbl_value_3.m = *adr_op1; /* get op's final value */ ! 557: dbl_value_3.l = *adr_op1_lsw; ! 558: (*test_ptr)(); /* verify the results */ ! 559: if( force_loop ) ! 560: run_code(); /* start the error loop */ ! 561: } ! 562: } ! 563: } ! 564: ! 565: ! 566: ! 567: ! 568: ! 569: ! 570: /******************************************************************* ! 571: * REGISTER + BYTE DISPLACEMENT ADDRESSING: ! 572: * instruction = <op-code> <a4> <(&op_1 -r4)> ! 573: * { <a5> <(&op_2- r5)> } ! 574: *******************************************************************/ ! 575: tst_r_b() ! 576: { ! 577: fill_reg_buf( load_regs ); /* set data for registers */ ! 578: fill_reg_buf( exp_regs ); /* set data for registers */ ! 579: addr_mode = ADR_REG_B; ! 580: addr_code = 0xa4; /* addr 1 is offset by r4 */ ! 581: addr_code2 = 0xa5; /* addr 2 is offset by r5 */ ! 582: addr_size = 1; /* 1 byte operand */ ! 583: addr_1 = 20; /* set the 1st byte offset */ ! 584: addr_2 = 4; /* set the 2nd byte offset */ ! 585: pack_inst(); /* pack the instr. code */ ! 586: load_regs[4] = (int) adr_op1 - 20; /* get the reg value */ ! 587: load_regs[5] = (int) adr_op2 - 4; ! 588: exp_regs[4] = load_regs[4]; ! 589: exp_regs[5] = load_regs[5]; ! 590: if( no_ops == 2 ) ! 591: min_shift = 12; ! 592: else ! 593: min_shift = 14; ! 594: index = 0; ! 595: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 596: { ! 597: get_current_data(); ! 598: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 599: *adr_op1_lsw = dbl_value_1.l; ! 600: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 601: *adr_op2_lsw = dbl_value_2.l; ! 602: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 603: run_code(); /* execute the instruction */ ! 604: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 605: dbl_value_3.l = *adr_op1_lsw; ! 606: (*test_ptr)(); /* verify the results */ ! 607: if( force_loop ) ! 608: run_code(); /* start the error loop */ ! 609: index++; /* bump the data index */ ! 610: } ! 611: } ! 612: ! 613: ! 614: ! 615: /******************************************************************* ! 616: * REGISTER + WORD DISPLACEMENT ADDRESSING: ! 617: * instruction = <op-code> <c4> <(&op_1 -r4)> ! 618: * { <c5> <(&op_2 -r5)> } ! 619: *******************************************************************/ ! 620: tst_r_w() ! 621: { ! 622: fill_reg_buf( load_regs ); /* set data for registers */ ! 623: fill_reg_buf( exp_regs ); /* set data for registers */ ! 624: addr_mode = ADR_REG_W; ! 625: addr_code = 0xc4; /* addr 1 is offset by r4 */ ! 626: addr_code2 = 0xc5; /* addr 2 is offset by r5 */ ! 627: addr_size = 2; /* word (2 byte) operand */ ! 628: addr_1 = 511; /* set the 1st word offset */ ! 629: addr_2 = 513; /* set the 2nd word offset */ ! 630: pack_inst(); /* pack the instr. code */ ! 631: load_regs[4] = (int) adr_op1 - 511; /* get the reg value */ ! 632: load_regs[5] = (int) adr_op2 - 513; ! 633: exp_regs[4] = load_regs[4]; ! 634: exp_regs[5] = load_regs[5]; ! 635: if( no_ops == 2 ) ! 636: min_shift = 10; ! 637: else ! 638: min_shift = 13; ! 639: index = 0; ! 640: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 641: { ! 642: get_current_data(); ! 643: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 644: *adr_op1_lsw = dbl_value_1.l; ! 645: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 646: *adr_op2_lsw = dbl_value_2.l; ! 647: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 648: run_code(); /* execute the instruction */ ! 649: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 650: dbl_value_3.l = *adr_op1_lsw; ! 651: (*test_ptr)(); /* verify the results */ ! 652: if( force_loop ) ! 653: run_code(); /* start the error loop */ ! 654: index++; /* bump the data index */ ! 655: } ! 656: } ! 657: ! 658: ! 659: ! 660: ! 661: /******************************************************************* ! 662: * REGISTER + LONGWORD DISPLACEMENT ADDRESSING: ! 663: * instruction = <op-code> <e4> <(op_1 -r4)> ! 664: * { <e5> <(op_2 -r5)> } ! 665: *******************************************************************/ ! 666: tst_r_l() ! 667: { ! 668: fill_reg_buf( load_regs ); /* set data for registers */ ! 669: fill_reg_buf( exp_regs ); /* set data for registers */ ! 670: addr_mode = ADR_REG_B; ! 671: addr_code = 0xe4; /* addr 1 is offset by r4 */ ! 672: addr_code2 = 0xe5; /* addr 2 is offset by r5 */ ! 673: addr_size = 4; /* longword (4 byte) op. */ ! 674: addr_1 = (int) adr_op1 - 123; /* get the 1st addr base */ ! 675: addr_2 = (int) adr_op2 - 130; /* get the 2nd addr base */ ! 676: load_regs[4] = 123; /* reg 4 = 123 */ ! 677: exp_regs[4] = 123; ! 678: load_regs[5] = 130; /* reg 5 = 130 */ ! 679: exp_regs[5] = 130; ! 680: pack_inst(); /* pack the instr. code */ ! 681: if( no_ops == 2 ) ! 682: min_shift = 6; ! 683: else ! 684: min_shift = 11; ! 685: index = 0; ! 686: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 687: { ! 688: get_current_data(); ! 689: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 690: *adr_op1_lsw = dbl_value_1.l; ! 691: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 692: *adr_op2_lsw = dbl_value_2.l; ! 693: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 694: run_code(); /* execute the instruction */ ! 695: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 696: dbl_value_3.l = *adr_op1_lsw; ! 697: (*test_ptr)(); /* verify the results */ ! 698: if( force_loop ) ! 699: run_code(); /* start the error loop */ ! 700: index++; /* bump the data index */ ! 701: } ! 702: } ! 703: ! 704: ! 705: ! 706: ! 707: /******************************************************************* ! 708: * REGISTER + BYTE DISPLACEMENT DEFERRED ADDRESSING: ! 709: * instruction = <op-code> <b4> <(&ptr_to_op_1 -r4)> ! 710: * { <b5> <(&ptr_to_op_1 -r5)>} ! 711: *******************************************************************/ ! 712: tst_r_bd() ! 713: { ! 714: fill_reg_buf( load_regs ); /* set data for registers */ ! 715: fill_reg_buf( exp_regs ); /* set data for registers */ ! 716: addr_mode = ADR_REG_B_DEF; ! 717: addr_code = 0xb4; /* addr 1 is offset by r4 */ ! 718: addr_code2 = 0xb5; /* addr 2 is offset by r5 */ ! 719: addr_size = 1; /* 1 byte operand */ ! 720: addr_1 = 20; /* set the 1st byte offset */ ! 721: addr_2 = 4; /* set the 2nd byte offset */ ! 722: pack_inst(); /* pack the instr. code */ ! 723: load_regs[4] = (int) adr_op1_ptr - 20; /* get the reg value */ ! 724: load_regs[5] = (int) adr_op2_ptr - 4; ! 725: exp_regs[4] = load_regs[4]; ! 726: exp_regs[5] = load_regs[5]; ! 727: if( no_ops == 2 ) ! 728: min_shift = 12; ! 729: else ! 730: min_shift = 14; ! 731: index = 0; ! 732: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 733: { ! 734: get_current_data(); ! 735: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 736: *adr_op1_lsw = dbl_value_1.l; ! 737: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 738: *adr_op2_lsw = dbl_value_2.l; ! 739: get_exp_faults( 4, 5, 6, 8 ); /* set exp fault cnt */ ! 740: run_code(); /* execute the instruction */ ! 741: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 742: dbl_value_3.l = *adr_op1_lsw; ! 743: (*test_ptr)(); /* verify the results */ ! 744: if( force_loop ) ! 745: run_code(); /* start the error loop */ ! 746: index++; /* bump the data index */ ! 747: } ! 748: } ! 749: ! 750: ! 751: ! 752: /******************************************************************* ! 753: * REGISTER + WORD DISPLACEMENT DEFERRED ADDRESSING: ! 754: * instruction = <op-code> <d4> <(word &ptr_to_op_1 -r4)> ! 755: * { <d5> <(word &ptr_to_op_1 -r5)> } ! 756: *******************************************************************/ ! 757: tst_r_wd() ! 758: { ! 759: fill_reg_buf( load_regs ); /* set data for registers */ ! 760: fill_reg_buf( exp_regs ); /* set data for registers */ ! 761: addr_mode = ADR_REG_W_DEF; ! 762: addr_code = 0xd4; /* addr 1 is offset by r4 */ ! 763: addr_code2 = 0xd5; /* addr 2 is offset by r5 */ ! 764: addr_size = 2; /* word (2 byte) operand */ ! 765: addr_1 = 511; /* set the 1st word offset */ ! 766: addr_2 = 601; /* set the 2nd word offset */ ! 767: pack_inst(); /* pack the instr. code */ ! 768: load_regs[4] = (int) adr_op1_ptr - 511; /* get the reg value */ ! 769: load_regs[5] = (int) adr_op2_ptr - 601; ! 770: exp_regs[4] = load_regs[4]; ! 771: exp_regs[5] = load_regs[5]; ! 772: if( no_ops == 2 ) ! 773: min_shift = 10; ! 774: else ! 775: min_shift = 13; ! 776: index = 0; ! 777: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 778: { ! 779: get_current_data(); ! 780: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 781: *adr_op1_lsw = dbl_value_1.l; ! 782: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 783: *adr_op2_lsw = dbl_value_2.l; ! 784: get_exp_faults( 4, 5, 6, 8 ); /* set exp fault cnt */ ! 785: run_code(); /* execute the instruction */ ! 786: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 787: dbl_value_3.l = *adr_op1_lsw; ! 788: (*test_ptr)(); /* verify the results */ ! 789: if( force_loop ) ! 790: run_code(); /* start the error loop */ ! 791: index++; /* bump the data index */ ! 792: } ! 793: } ! 794: ! 795: ! 796: ! 797: ! 798: /******************************************************************* ! 799: * REGISTER + LONGWORD DISPLACEMENT DEFERRED ADDRESSING: ! 800: * instruction = <op-code> <f4> <(longword &ptr_to_op_1 -r4)> ! 801: * { <f5> <(longword &ptr_to_op_1 -r5)> } ! 802: *******************************************************************/ ! 803: tst_r_ld() ! 804: { ! 805: fill_reg_buf( load_regs ); /* set data for registers */ ! 806: fill_reg_buf( exp_regs ); /* set data for registers */ ! 807: addr_mode = ADR_REG_L_DEF; ! 808: addr_code = 0xf4; /* addr 1 is offset by r4 */ ! 809: addr_code2 = 0xf5; /* addr 2 is offset by r5 */ ! 810: addr_size = 4; /* longword (4 byte) op. */ ! 811: addr_1 = (int) adr_op1_ptr - 123; /* set the 1st byte offset */ ! 812: addr_2 = (int) adr_op2_ptr - 212; /* set the 2nd byte offset */ ! 813: pack_inst(); /* pack the instr. code */ ! 814: load_regs[4] = 123; /* reg 4 = 123 */ ! 815: load_regs[5] = 212; /* reg 5 = 212 */ ! 816: exp_regs[4] = load_regs[4]; ! 817: exp_regs[5] = load_regs[5]; ! 818: if( no_ops == 2 ) ! 819: min_shift = 6; ! 820: else ! 821: min_shift = 11; ! 822: index = 0; ! 823: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 824: { ! 825: get_current_data(); ! 826: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 827: *adr_op1_lsw = dbl_value_1.l; ! 828: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 829: *adr_op2_lsw = dbl_value_2.l; ! 830: get_exp_faults( 4, 5, 6, 8 ); /* set exp fault cnt */ ! 831: run_code(); /* execute the instruction */ ! 832: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 833: dbl_value_3.l = *adr_op1_lsw; ! 834: (*test_ptr)(); /* verify the results */ ! 835: if( force_loop ) ! 836: run_code(); /* start the error loop */ ! 837: index++; /* bump the data index */ ! 838: } ! 839: } ! 840: ! 841: ! 842: ! 843: /******************************************************************* ! 844: * FRAME POINTER DEFERRED + LONGWORD INDEX ADDRESSING: ! 845: * instruction = <op-code> <44> <6d> { <45> <6d> } ! 846: * ! 847: * The indeces used will be either quadword indeces ( for DBL operands ) ! 848: * of longword indeces ( for SGL operands ). ! 849: * ! 850: * NOTE: ! 851: * dmp_op_2 is exactly 4 pages away from dmp_op_1. (200 hex quadwords) ! 852: * IF THIS RELATIVE DISPLACEMENT IS CHANGED THEN THE R5 INDEX MUST ! 853: * BE CHANGED IN THIS CODE!!! ( used by CMPF2 & CMPD2 ) ! 854: *******************************************************************/ ! 855: tst_x_fpd() ! 856: { ! 857: fill_reg_buf( load_regs ); /* set data for registers */ ! 858: fill_reg_buf( exp_regs ); /* set data for registers */ ! 859: addr_mode = ADR_I_FP_DEF; ! 860: addr_code = 0x44; /* code for reg. 4 index */ ! 861: addr_code2 = 0x45; /* code for reg. 5 index */ ! 862: addr_codeB = 0x6d; /* code for FP deferred */ ! 863: addr_size = 0; /* no addr. field per se */ ! 864: pack_inst(); /* pack the instr. code */ ! 865: /* ! 866: * set the frame pointer to 'operand 1 - 16 bytes' (2 quad-words) ! 867: */ ! 868: asm("movl _adr_op1,_sgl_dummy1"); /* get the addr of op 1 */ ! 869: load_regs[13] = sgl_dummy1-16; /* SP = op 1's addr - 16 */ ! 870: exp_regs[13] = load_regs[13]; ! 871: if( sgl_op ) ! 872: { ! 873: load_regs[4] = 4; /* SP to op_1 (longwords) */ ! 874: load_regs[5] = 0x404; /* SP to op_2 (longwords) */ ! 875: } else { ! 876: load_regs[4] = 2; /* SP to op_1 (quadwords) */ ! 877: load_regs[5] = 0x202; /* SP to op_2 (quadwords) */ ! 878: } ! 879: exp_regs[4] = load_regs[4]; ! 880: exp_regs[5] = load_regs[5]; ! 881: if( no_ops == 2 ) ! 882: min_shift = 12; ! 883: else ! 884: min_shift = 14; ! 885: index = 0; ! 886: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 887: { ! 888: get_current_data(); ! 889: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 890: *adr_op1_lsw = dbl_value_1.l; ! 891: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 892: *adr_op2_lsw = dbl_value_2.l; ! 893: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 894: run_code(); /* execute the instruction */ ! 895: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 896: dbl_value_3.l = *adr_op1_lsw; ! 897: (*test_ptr)(); /* verify the results */ ! 898: if( force_loop ) ! 899: run_code(); /* start the error loop */ ! 900: index++; /* bump the data index */ ! 901: } ! 902: } ! 903: ! 904: ! 905: ! 906: /******************************************************************* ! 907: * INDEXED LONGWORD DISPLACEMENT ADDRESSING: ! 908: * instruction = <op-code> <44> <ef> <longword offset> ! 909: * { <45> <ef> <longword offset> } ! 910: *******************************************************************/ ! 911: tst_x_l() ! 912: { ! 913: fill_reg_buf( load_regs ); /* set data for registers */ ! 914: fill_reg_buf( exp_regs ); /* set data for registers */ ! 915: addr_mode = ADR_I_L; ! 916: addr_code = 0x44; /* code for reg. 4 index */ ! 917: addr_code2 = 0x45; /* code for reg. 5 index */ ! 918: addr_codeB = 0xef; /* code for longword disp */ ! 919: addr_size = 4; /* longword (4 byte) op. */ ! 920: if( sgl_op ) ! 921: { ! 922: load_regs[4] = 4; /* reg 4 = 4 (longwords) */ ! 923: load_regs[5] = 6; /* reg 5 = 6 (longwords) */ ! 924: } else { ! 925: load_regs[4] = 2; /* reg 4 = 2 (quadwords) */ ! 926: load_regs[5] = 3; /* reg 5 = 3 (quadwords) */ ! 927: } ! 928: exp_regs[4] = load_regs[4]; ! 929: exp_regs[5] = load_regs[5]; ! 930: if( no_ops == 2 ) ! 931: min_shift = 4; ! 932: else ! 933: min_shift = 10; ! 934: index = 0; ! 935: for( shift_count = 15; shift_count >= min_shift; shift_count-- ) ! 936: { ! 937: get_current_data(); ! 938: *adr_op1 = dbl_value_1.m; /* set the 1st operand */ ! 939: *adr_op1_lsw = dbl_value_1.l; ! 940: *adr_op2 = dbl_value_2.m; /* set the 2nd operand */ ! 941: *adr_op2_lsw = dbl_value_2.l; ! 942: get_exp_faults( 3, 4, 4, 6 ); /* set exp fault cnt */ ! 943: addr_1 = os_op1 + 9 - shift_count; /* data's offset */ ! 944: addr_1 -=16; /* -16 bytes (2 Q-words) */ ! 945: addr_2 = os_op2 + 3 - shift_count; /* data's offset */ ! 946: addr_2 -=24; /* -24 bytes (3 Q-words) */ ! 947: pack_inst(); /* pack the instr. code */ ! 948: run_code(); /* execute the instruction */ ! 949: dbl_value_3.m = *adr_op1; /* get the final operand */ ! 950: dbl_value_3.l = *adr_op1_lsw; ! 951: (*test_ptr)(); /* verify the results */ ! 952: if( force_loop ) ! 953: run_code(); /* start the error loop */ ! 954: index++; /* bump the data index */ ! 955: } ! 956: } ! 957: ! 958: ! 959: ! 960: /************************************************************************** ! 961: * Get data for double precision instructions ! 962: **************************************************************************/ ! 963: get_current_data() ! 964: { ! 965: if( no_ops == 2 ) ! 966: { ! 967: dbl_ld_acc = ldd_data[ index +1 ].op_1; ! 968: dbl_value_1 = data_ptr[ index ].op_1; ! 969: dbl_value_2 = data_ptr[ index ].op_2; ! 970: dbl_expected = data_ptr[ index ].exp; ! 971: } ! 972: else ! 973: { ! 974: dbl_ld_acc = data_ptr[ index ].op_1; ! 975: dbl_value_1 = data_ptr[ index ].op_2; ! 976: dbl_expected = data_ptr[ index ].exp; ! 977: } ! 978: } ! 979: ! 980: ! 981: /**************************************************************************** ! 982: * Get the expected number of translation faults ! 983: ****************************************************************************/ ! 984: get_exp_faults( sgl_1, dbl_1, sgl_2, dbl_2 ) ! 985: int sgl_1; /* exp # faults for 1 sgl operand */ ! 986: int dbl_1; /* exp # faults for 1 dbl operand */ ! 987: int sgl_2; /* exp # faults for 2 sgl operands */ ! 988: int dbl_2; /* exp # faults for 2 dbl operands */ ! 989: { ! 990: if( no_ops == 1 ) ! 991: { ! 992: if( sgl_op ) ! 993: exp_page_faults = sgl_1; /* 1 sgl operand */ ! 994: else ! 995: exp_page_faults = dbl_1; /* 1 dbl operand */ ! 996: } else { ! 997: if( sgl_op ) ! 998: exp_page_faults = sgl_2; /* 2 sgl operands */ ! 999: else ! 1000: exp_page_faults = dbl_2; /* 2 dbl operands */ ! 1001: } ! 1002: /* ! 1003: * In DBL compare instructions, the system won't fetch the least significant ! 1004: * half of the operand(s) if the most significant halves are different. ! 1005: */ ! 1006: if( (op_code == CMPD_OP_CODE) && (dbl_value_1.m != dbl_ld_acc.m) || ! 1007: (op_code == CMPD2_OP_CODE) && (dbl_value_1.m != dbl_value_2.m) ) ! 1008: exp_page_faults--; ! 1009: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.