Annotation of cci/d/dmp4/test_inst.c, revision 1.1

1.1     ! root        1: 
        !             2: #include "dmp_defs.h"
        !             3: 
        !             4: /**************************************************************************
        !             5: *
        !             6: *              Test the current instruction
        !             7: *
        !             8: *  If the current instruction accesses any operands, then test it with
        !             9: *  all major applicable addressing modes.
        !            10: *
        !            11: *  NOTE: Pipline tests 3 & 4 are not run with the "no-fpp" firmware because
        !            12: *        the ADDs would cause traps. They are not run with certain "load
        !            13: *        type instructions because of a hardware restriction (an ADDF 
        !            14: *        followed by an LDF will cause a floating overflow event).
        !            15: *
        !            16: *  30-Apr-85  added pipelined instruction tests
        !            17: *  17-May-85  don't run pre-piped stuff w/ LDF, LNF (ovfl errors)
        !            18: *  21-Jun-85  added 3rd operand for MULL3
        !            19: **************************************************************************/
        !            20: test_inst()
        !            21: {
        !            22: /*
        !            23:  * Set the values for the indirect pointers
        !            24: */
        !            25:        *adr_op1_ptr = (int) adr_op1;           /* set word offset ptr #1  */
        !            26:        *adr_op2_ptr = (int) adr_op2;           /* set word offset ptr #2  */
        !            27:        *adr_op3_ptr = (int) adr_op3;           /* set word offset ptr #3  */
        !            28:        error = FALSE;                          /* clear the error flag    */
        !            29:        set_load_flag();                        /* set/reset load Acc flag */
        !            30:        if( !no_ops )
        !            31:             test_0_ops();      /* test inst w/ no operands */
        !            32:        else {
        !            33:             tst_abs();         /* absolute addressing             */
        !            34:             if( s_to_d || 
        !            35:               ( (precision == SGL) && (op_type == LOAD) ) )
        !            36:                  tst_i_l();    /* immediate longword              */
        !            37:             tst_b();           /* byte displacement relative      */
        !            38:             tst_w();           /* word displacement relative      */
        !            39:             tst_l();           /* longword displacement relative  */
        !            40:             tst_b_d();         /* byte disp. relative deferred    */
        !            41:             tst_w_d();         /* word disp. relative deferred    */
        !            42:             tst_l_d();         /* longword disp. rel. deferred    */
        !            43:             tst_r();           /* direct register                 */
        !            44:             tst_r_d();         /* register deferred               */
        !            45:             if( user_mode ) {  /* do stack stuff in user mode only */
        !            46:                  if( (op_code == MULL2_OP_CODE) || 
        !            47:                      (op_code == MULL3_OP_CODE) ) {
        !            48:                       tst_mull_stack();        /* POP, POP, PUSH */
        !            49:                       tst_pop_d();             /* deferred POP   */
        !            50:                  }
        !            51:                  else if( d_to_s || 
        !            52:                         ( (precision == SGL) && (op_type == STORE) ) ) {
        !            53:                       tst_push();      /* PUSH ( auto-decremented SP ) */
        !            54:                       tst_pop_d();     /* deferred POP                 */
        !            55:                  }
        !            56:                  else if( s_to_d || 
        !            57:                         ( (precision == SGL) && (op_type == LOAD) ) ) {
        !            58:                       tst_pop();       /* POP ( auto-incremented SP )  */
        !            59:                       tst_pop_d();     /* deferred POP                 */
        !            60:                  }
        !            61:             }
        !            62:             tst_r_b();         /* register + byte displacement    */
        !            63:             tst_r_w();         /* register + word displacement    */
        !            64:             tst_r_l();         /* register + longword disp.       */
        !            65:             tst_r_bd();        /* reg. + byte disp. deferred      */
        !            66:             tst_r_wd();        /* reg. + word disp. deferred      */
        !            67:             tst_r_ld();        /* reg. + longword disp. deferred  */
        !            68:             tst_x_fpd();       /* FP deferred + longword index    */
        !            69:             tst_x_l();         /* longword disp. + longword index */
        !            70:             if( !no_fpp_wcs ) {
        !            71:                  tst_p1();             /* pipe 1  - load w/ register data */
        !            72:                  tst_p2();             /* pipe 2  - load w/ lw addressing */
        !            73:                  if( ( op_code != LDF_OP_CODE ) && 
        !            74:                      ( op_code != LNF_OP_CODE ) &&
        !            75:                      ( op_code != CVLF_OP_CODE ) ) {
        !            76:                        tst_p3();       /* pipe 3  - mulx w/ register data */
        !            77:                        tst_p4();       /* pipe 4  - mulx w/ lw addressing */
        !            78:                  }
        !            79:             }  /* end IF not no-fpp */
        !            80:        }  /* end IF one or more operands */
        !            81: }
        !            82: 
        !            83: 
        !            84: 
        !            85: 
        !            86: 
        !            87: /*******************************************************************
        !            88: * ABSOLUTE ADDRESSING:
        !            89: * instr =  <op-code> <9f> <&dmp_op_1> {<9f> <&dmp_op_2> <9f> <&dmp_op_3>}
        !            90: *******************************************************************/
        !            91: tst_abs()
        !            92: {
        !            93:        pipe_test = FALSE;              /* clear the pipe test flag */
        !            94:        fill_reg_buf( load_regs );      /* set data for registers */
        !            95:        fill_reg_buf( exp_regs );       /* set data for registers */
        !            96:        addr_mode = ADR_ABSOLUTE;
        !            97:        addr_code = addr_code2 = addr_code3 = 0x9f;
        !            98:        addr_size = 4;                  /* longword (4 byte) ops. */
        !            99:        addr_1    = DMP_OP_1;           /* abs. address of data   */
        !           100:        addr_2    = DMP_OP_2;
        !           101:        addr_3    = DMP_OP_3;
        !           102:        if( no_ops == 1 )
        !           103:             min_shift = 15;
        !           104:        else if( no_ops == 2 )
        !           105:             min_shift = 10;
        !           106:        else 
        !           107:             min_shift = 5;
        !           108:        shift_count = 19;
        !           109:        for( index = 0; index <= max_index; index++ ) {
        !           110:             get_current_data( adr_op1, adr_op2 );
        !           111:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault cnt */
        !           112:             pack_inst();               /* pack the instr. code     */
        !           113:             run_code();                /* execute the instruction  */
        !           114:             if( --shift_count < min_shift )
        !           115:                  shift_count = 19;
        !           116:        }
        !           117: }
        !           118: 
        !           119: 
        !           120: 
        !           121: 
        !           122: 
        !           123: /*******************************************************************
        !           124: * IMMEDIATE LONGWORD ADDRESSING:       ( sgl and sgl_to_dbl only )
        !           125: * instr =  <op-code> <8f> <data> { <8f> <data>  <8f> <data> }
        !           126: *
        !           127: * NOTE: If the instruction is MULL2, op #2 will use absolute addressing.
        !           128: *       If the instruction is MULL3, op #3 will use absolute addressing.
        !           129: *******************************************************************/
        !           130: tst_i_l()
        !           131: {
        !           132:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           133:        fill_reg_buf( load_regs );      /* set data for registers   */
        !           134:        fill_reg_buf( exp_regs );       /* set data for registers   */
        !           135:        addr_mode = ADR_IM_L;
        !           136:        addr_code = addr_code2 = 0x8f;  
        !           137:        addr_code3 = 0x9f;              /* MULL3 uses ABS for op #3 */
        !           138:        addr_3 = DMP_OP_3;              /* addr_3 points to DMP_OP3 */
        !           139:        if( op_code == MULL2_OP_CODE ) {
        !           140:             addr_code2 = 0x9f;         /* MULL2 uses ABS for op #2 */
        !           141:             addr_2 = DMP_OP_2;         /* addr_2 points to DMP_OP2 */
        !           142:        }
        !           143:        addr_size = 4;                  /* longword (4 byte) data   */
        !           144:        if( (op_code == MULL2_OP_CODE) || (op_code == MULL3_OP_CODE) )
        !           145:             exp_page_faults = 3;       /* 3 pages are used         */
        !           146:        else
        !           147:             exp_page_faults = 2;       /* 2 pages are used         */
        !           148:        shift_count = 19;
        !           149:        for( index = 0; index <= max_index; index++ ) {
        !           150:             get_current_data( adr_op1, adr_op2 );
        !           151:             addr_1 = dbl_value_1.m;    /* set the 1st operand     */
        !           152:             if( op_code != MULL2_OP_CODE )
        !           153:                  addr_2 = dbl_value_2.m;  /* set the 2nd operand  */
        !           154:             pack_inst();               /* pack the instr. code    */
        !           155:             run_code();                /* execute the instruction */
        !           156:             if( --shift_count < min_shift )
        !           157:                  shift_count = 19;
        !           158:        }
        !           159: }
        !           160: 
        !           161: 
        !           162: 
        !           163: /*******************************************************************
        !           164: * BYTE DISPLACEMENT RELATIVE ADDRESSING:
        !           165: * instr =  <op-code> <af> <offset to dmp_byte_op_1>
        !           166: *                  { <af> <offset to dmp_byte_op_2> }
        !           167: *                  { <af> <offset to dmp_byte_op_3> }
        !           168: *******************************************************************/
        !           169: tst_b()
        !           170: {
        !           171:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           172:        fill_reg_buf( load_regs );      /* set data for registers */
        !           173:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           174:        addr_mode = ADR_B_DSP;
        !           175:        addr_code = addr_code2 = addr_code3 = 0xaf;
        !           176:        addr_size = 1;                  /* 1 byte operand         */
        !           177:        exp_page_faults = 2;            /* 2 pages are used       */
        !           178:        if( no_ops == 1 )
        !           179:             min_shift = 17;
        !           180:        else if( no_ops == 2 )
        !           181:             min_shift = 15;
        !           182:        else
        !           183:             min_shift = 13;
        !           184:        shift_count = 19;
        !           185:        for( index = 0; index <= max_index; index++ ) {
        !           186:             get_current_data( adr_b_op1, adr_b_op2 );
        !           187:             addr_1 = os_b_op1 + 17 - shift_count; /* data's offset */
        !           188:             addr_2 = os_b_op2 + 15 - shift_count;
        !           189:             addr_3 = os_b_op3 + 13 - shift_count;
        !           190:             pack_inst();               /* pack the instr. code    */
        !           191:             run_code();                /* execute the instruction */
        !           192:             if( --shift_count < min_shift )
        !           193:                  shift_count = 19;
        !           194:        }
        !           195: }
        !           196: 
        !           197: 
        !           198: 
        !           199: /*******************************************************************
        !           200: * WORD DISPLACEMENT RELATIVE ADDRESSING:
        !           201: *  instruction =  <op-code> <cf> <offset to dmp_op_1>
        !           202: *                         { <cf> <offset to dmp_op_2> }
        !           203: *                         { <cf> <offset to dmp_op_3> }
        !           204: *******************************************************************/
        !           205: tst_w()
        !           206: {
        !           207:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           208:        fill_reg_buf( load_regs );      /* set data for registers */
        !           209:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           210:        addr_mode = ADR_W_DSP;
        !           211:        addr_code = addr_code2 = addr_code3 = 0xcf;
        !           212:        addr_size = 2;                  /* word (2 byte) operand  */
        !           213:        if( no_ops == 1 )
        !           214:             min_shift = 17;
        !           215:        else if( no_ops == 2 )
        !           216:             min_shift = 14;
        !           217:        else 
        !           218:             min_shift = 11;
        !           219:        shift_count = 19;
        !           220:        for( index = 0; index <= max_index; index++ ) {
        !           221:             get_current_data( adr_op1, adr_op2 );
        !           222:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault cnt */
        !           223:             addr_1 = os_op1 + 16 - shift_count; /* data's offset   */
        !           224:             addr_2 = os_op2 + 13 - shift_count;
        !           225:             addr_3 = os_op3 + 10 - shift_count;
        !           226:             pack_inst();               /* pack the instr. code    */
        !           227:             run_code();                /* execute the instruction */
        !           228:             if( --shift_count < min_shift )
        !           229:                  shift_count = 19;
        !           230:        }
        !           231: }
        !           232: 
        !           233: 
        !           234: 
        !           235: /*******************************************************************
        !           236: * LONGWORD DISPLACEMENT RELATIVE ADDRESSING:
        !           237: *  instruction =  <op-code> <ef> <offset to dmp_op_1>
        !           238: *                         { <ef> <offset to dmp_op_2> }
        !           239: *                         { <ef> <offset to dmp_op_3> }
        !           240: *******************************************************************/
        !           241: tst_l()
        !           242: {
        !           243:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           244:        fill_reg_buf( load_regs );      /* set data for registers */
        !           245:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           246:        addr_mode = ADR_L_DSP;
        !           247:        addr_code = addr_code2 = addr_code3 = 0xef;
        !           248:        addr_size = 4;                  /* longword (4 byte) ops. */
        !           249:        if( no_ops == 1 )
        !           250:             min_shift = 15;
        !           251:        else if( no_ops == 2 )
        !           252:             min_shift = 10;
        !           253:        else 
        !           254:             min_shift = 5;
        !           255:        shift_count = 19;
        !           256:        for( index = 0; index <= max_index; index++ ) {
        !           257:             get_current_data( adr_op1, adr_op2 );
        !           258:             get_exp_faults( 3, 4, 4, 6, 5 ); /* set exp fault count */
        !           259:             addr_1 = os_op1 + 14 - shift_count; /* data's offset */
        !           260:             addr_2 = os_op2 +  9 - shift_count;
        !           261:             addr_3 = os_op3 +  4 - shift_count;
        !           262:             pack_inst();               /* pack the instr. code   */
        !           263:             run_code();                /* execute the instruction */
        !           264:             if( --shift_count < min_shift )
        !           265:                  shift_count = 19;
        !           266:        }
        !           267: }
        !           268: 
        !           269: 
        !           270: 
        !           271: /*******************************************************************
        !           272: * BYTE DISPLACEMENT RELATIVE DEFERRED ADDRESSING:
        !           273: *  instruction =  <op-code> <bf> <offset to dmp_byte_op_1>
        !           274: *                         { <bf> <offset to dmp_byte_op_2> }
        !           275: *                         { <bf> <offset to dmp_byte_op_3> }
        !           276: *******************************************************************/
        !           277: tst_b_d()
        !           278: {
        !           279:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           280:        fill_reg_buf( load_regs );      /* set data for registers */
        !           281:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           282:        addr_mode = ADR_B_DSP_DEF;
        !           283:        addr_code = addr_code2 = addr_code3 = 0xbf;
        !           284:        addr_size = 1;                  /* 1 byte operand         */
        !           285:        adr_b_op1->m = (int) adr_op1;   /* set byte offset ptr #1 */
        !           286:        adr_b_op2->m = (int) adr_op2;   /* set byte offset ptr #2 */
        !           287:        adr_b_op3->m = (int) adr_op3;   /* set byte offset ptr #3 */
        !           288:        if( no_ops == 1 )
        !           289:             min_shift = 17;
        !           290:        else if( no_ops == 2 )
        !           291:             min_shift = 15;
        !           292:        else 
        !           293:             min_shift = 13;
        !           294:        shift_count = 19; 
        !           295:        for( index = 0; index <= max_index; index++ ) {
        !           296:             get_current_data( adr_op1, adr_op2 );
        !           297:             get_exp_faults( 3, 4, 4, 6, 5 ); /* set exp fault count */
        !           298:             addr_1 = os_b_op1 + 17 - shift_count; /* data's offset  */
        !           299:             addr_2 = os_b_op2 + 15 - shift_count; 
        !           300:             addr_3 = os_b_op3 + 13 - shift_count; 
        !           301:             pack_inst();               /* pack the instr. code   */
        !           302:             run_code();                /* execute the instruction */
        !           303:             if( --shift_count < min_shift )
        !           304:                  shift_count = 19;
        !           305:        }
        !           306: }
        !           307: 
        !           308: 
        !           309: 
        !           310: 
        !           311: /*******************************************************************
        !           312: * WORD DISPLACEMENT RELATIVE DEFERRED ADDRESSING:
        !           313: *  instruction =  <op-code> <df> <offset to dmp_op_1_ptr>
        !           314: *                         { <df> <offset to dmp_op_2_ptr> }
        !           315: *                         { <df> <offset to dmp_op_3_ptr> }
        !           316: *******************************************************************/
        !           317: tst_w_d()
        !           318: {
        !           319:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           320:        fill_reg_buf( load_regs );      /* set data for registers */
        !           321:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           322:        addr_mode = ADR_W_DSP_DEF;
        !           323:        addr_code = addr_code2 = addr_code3 = 0xdf;
        !           324:        addr_size = 2;                  /* word (2 byte) operand  */
        !           325:        if( no_ops == 1 )
        !           326:             min_shift = 17;
        !           327:        else if( no_ops == 2 )
        !           328:             min_shift = 14;
        !           329:        else 
        !           330:             min_shift = 11;
        !           331:        shift_count = 19; 
        !           332:        for( index = 0; index <= max_index; index++ ) {
        !           333:             get_current_data( adr_op1, adr_op2 );
        !           334:             get_exp_faults( 4, 5, 6, 8, 8 );  /* set exp fault count */
        !           335:             addr_1 = os_ad_op1 + 16 - shift_count; /* operand offset */
        !           336:             addr_2 = os_ad_op2 + 13 - shift_count; 
        !           337:             addr_3 = os_ad_op3 + 10 - shift_count; 
        !           338:             pack_inst();               /* pack the instr. code   */
        !           339:             run_code();                /* execute the instruction */
        !           340:             if( --shift_count < min_shift )
        !           341:                  shift_count = 19;
        !           342:        }
        !           343: }
        !           344: 
        !           345: 
        !           346:   
        !           347: /*******************************************************************
        !           348: * LONGWORD DISPLACEMENT RELATIVE DEFERRED ADDRESSING:
        !           349: *  instruction =  <op-code> <ff> <offset to dmp_op_1_ptr>
        !           350: *                         { <ff> <offset to dmp_op_2_ptr> }
        !           351: *                         { <ff> <offset to dmp_op_3_ptr> }
        !           352: *******************************************************************/
        !           353: tst_l_d()
        !           354: {
        !           355:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           356:        fill_reg_buf( load_regs );      /* set data for registers */
        !           357:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           358:        addr_mode = ADR_L_DSP_DEF;
        !           359:        addr_code = addr_code2 = addr_code3 = 0xff;
        !           360:        addr_size = 4;                  /* longword (4 byte) op.  */
        !           361:        if( no_ops == 1 )
        !           362:             min_shift = 15;
        !           363:        else if( no_ops == 2 )
        !           364:             min_shift = 10;
        !           365:        else 
        !           366:             min_shift = 5;
        !           367:        shift_count = 19; 
        !           368:        for( index = 0; index <= max_index; index++ ) {
        !           369:             get_current_data( adr_op1, adr_op2 );
        !           370:             get_exp_faults( 4, 5, 6, 8, 8 );  /* set exp fault count */
        !           371:             addr_1 = os_ad_op1 + 14 - shift_count; /* operand offset */
        !           372:             addr_2 = os_ad_op2 +  9 - shift_count; 
        !           373:             addr_3 = os_ad_op3 +  4 - shift_count; 
        !           374:             pack_inst();               /* pack the instr. code   */
        !           375:             run_code();                /* execute the instruction */
        !           376:             if( --shift_count < min_shift )
        !           377:                  shift_count = 19;
        !           378:        }
        !           379: }
        !           380: 
        !           381: 
        !           382: 
        !           383: /*******************************************************************
        !           384: * DIRECT REGISTER ADDRESSING:
        !           385: *  instruction =  <op-code> <50> { <54> } { <56> }
        !           386: *
        !           387: * If the instruction = MULL2 the store will be to R4,
        !           388: * If the instruction = MULL3 the store will be to R6,
        !           389: * If the instruction is any other store it will be to R0/R1.
        !           390: *******************************************************************/
        !           391: tst_r()
        !           392: {
        !           393:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           394:        fill_reg_buf( load_regs );      /* set data for registers  */
        !           395:        fill_reg_buf( exp_regs );       /* set data for registers  */
        !           396:        addr_mode = ADR_REG;
        !           397:        addr_code  = 0x50;              /* 1st op in registers 0/1 */
        !           398:        addr_code2 = 0x54;              /* 2nd op in registers 4/5 */
        !           399:        addr_code3 = 0x56;              /* 3rd op in register  6   */
        !           400:        addr_size = 0;                  /* no addressing bytes     */
        !           401:        pack_inst();                    /* pack the instr. code    */
        !           402:        exp_page_faults = 2;            /* 2 pages are used        */
        !           403:        if( no_ops == 1 )
        !           404:             min_shift = 19;
        !           405:        else if( no_ops == 2 )
        !           406:             min_shift = 18;
        !           407:        else 
        !           408:             min_shift = 17;
        !           409:        shift_count = 19; 
        !           410:        for( index = 0; index <= max_index; index++ ) {
        !           411:                  get_current_data( adr_op1, adr_op2 );
        !           412:                  load_regs[0] = dbl_value_1.m; /* set the data for the regs*/
        !           413:                  load_regs[1] = dbl_value_1.l;
        !           414:                  load_regs[4] = dbl_value_2.m;
        !           415:                  load_regs[5] = dbl_value_2.l;
        !           416:                  exp_regs[0]  = load_regs[0];  /* set exp final reg values */
        !           417:                  exp_regs[1]  = load_regs[1];
        !           418:                  exp_regs[4]  = load_regs[4];
        !           419:                  exp_regs[5]  = load_regs[5];
        !           420:                  if( op_code == MULL2_OP_CODE )
        !           421:                       exp_regs[4] = dbl_expected.m;
        !           422:                  else if( op_code == MULL3_OP_CODE )
        !           423:                       exp_regs[6] = dbl_expected.m;
        !           424:                  else if( op_type == STORE ) {
        !           425:                       exp_regs[0] = dbl_expected.m;
        !           426:                       exp_regs[1] = dbl_expected.l;
        !           427:                  }
        !           428:                  if( op_code == CVDL_OP_CODE ) /* correct for sgl store    */
        !           429:                       exp_regs[1] = dbl_value_1.l; /* r1 shouldn't change  */
        !           430:                  run_code();                   /* execute the instruction  */
        !           431:             if( --shift_count < min_shift )
        !           432:                  shift_count = 19;
        !           433:        }
        !           434: }
        !           435: 
        !           436: 
        !           437: 
        !           438: 
        !           439: /*******************************************************************
        !           440: * REGISTER DEFERRED ADDRESSING:
        !           441: *  instruction =  <op-code> <60> { <61> <62> }
        !           442: *******************************************************************/
        !           443: tst_r_d()
        !           444: {
        !           445:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           446:        fill_reg_buf( load_regs );      /* set data for registers */
        !           447:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           448:        addr_mode  = ADR_REG_DEF;
        !           449:        addr_code  = 0x60;
        !           450:        addr_code2 = 0x61;
        !           451:        addr_code3 = 0x62;
        !           452:        addr_size  = 0;                 /* no address byte(s)   */
        !           453:        load_regs[0] = (int) adr_op1;   /* get addr of op. 1    */
        !           454:        load_regs[1] = (int) adr_op2;   /* get addr of op. 2    */
        !           455:        load_regs[2] = (int) adr_op3;   /* get addr of op. 3    */
        !           456:        exp_regs[0] = load_regs[0];
        !           457:        exp_regs[1] = load_regs[1];
        !           458:        exp_regs[2] = load_regs[2];
        !           459:        pack_inst();                    /* pack the instr. code */
        !           460:        if( no_ops == 1 )
        !           461:             min_shift = 19;
        !           462:        else if( no_ops == 2 )
        !           463:             min_shift = 18;
        !           464:        else 
        !           465:             min_shift = 17;
        !           466:        shift_count = 19; 
        !           467:        for( index = 0; index <= max_index; index++ ) {
        !           468:             get_current_data( adr_op1, adr_op2 );
        !           469:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count   */
        !           470:             run_code();                     /* execute the instruction */
        !           471:             if( --shift_count < min_shift )
        !           472:                   shift_count = 19;
        !           473:        }
        !           474: }
        !           475: 
        !           476: 
        !           477: 
        !           478: 
        !           479: /*******************************************************************
        !           480: * AUTO-DECREMENTED STACK POINTER ADDRESSING  ( PUSH ):
        !           481: *  instruction =  <op-code> <7e>
        !           482: * 
        !           483: * The final result will be popped by "run_code". 
        !           484: * Push will be run with SGL instructions only.
        !           485: * "DBL_VALUE_4", the final result, will be set by RUN_CODE.
        !           486: *******************************************************************/
        !           487: tst_push()
        !           488: {
        !           489:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           490:        fill_reg_buf( load_regs );      /* set data for registers */
        !           491:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           492:        addr_mode = ADR_PUSH;
        !           493:        addr_code = 0x7e;
        !           494:        addr_size = 0;                  /* no addressing bytes    */
        !           495:        exp_page_faults = 3;            /* 3 pages are used       */
        !           496:        shift_count = 19;
        !           497:        pack_inst();                    /* pack the instr. code   */
        !           498:        for( index = 0; index <= max_index; index++ ) {
        !           499:             get_current_data( adr_op1, adr_op2 );
        !           500:             run_code();                /* execute the instruction */
        !           501:             if( force_loop )
        !           502:                  run_code();           /* start the error loop   */
        !           503:        }
        !           504: }
        !           505: 
        !           506: 
        !           507: 
        !           508: 
        !           509: /*******************************************************************
        !           510: * AUTO-INCREMENTED STACK POINTER ADDRESSING  ( POP ):  ( sgl ops only )
        !           511: *  instruction =  <op-code> <8e> 
        !           512: * 
        !           513: * The data will be pushed by "run_code"
        !           514: * Pop will be run with SGL floating point instructions only. A different
        !           515: * routine will be used for the integer multiply instructions.
        !           516: *******************************************************************/
        !           517: tst_pop()
        !           518: {
        !           519:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           520:        fill_reg_buf( load_regs );      /* set data for registers */
        !           521:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           522:        addr_mode = ADR_POP;
        !           523:        addr_code = addr_code2 = 0x8e;
        !           524:        addr_size = 0;                  /* no addressing bytes    */
        !           525:        pack_inst();                    /* pack the instr. code   */
        !           526:        if( no_ops == 1 ) {
        !           527:             min_shift = 19;
        !           528:             exp_page_faults = 3;       /* 3 pages are used       */
        !           529:         } else  {                      /* 2 operands */
        !           530:             min_shift = 18;
        !           531:             exp_page_faults = 4;       /* 4 pages are used       */
        !           532:        }
        !           533:        shift_count = 19;
        !           534:        for( index = 0; index <= max_index; index++ ) {
        !           535:             get_current_data( adr_op1, adr_op2 );
        !           536:             sgl_value_8 = dbl_value_1.m; /* data to be pushed   */
        !           537:             sgl_value_9 = dbl_value_2.m; /* data to be pushed   */
        !           538:             run_code();                /* execute the instruction */
        !           539:             if( force_loop )
        !           540:                  run_code();           /* start the error loop   */
        !           541:             if( --shift_count < min_shift )
        !           542:                  shift_count = 19;
        !           543:        }
        !           544: }
        !           545: 
        !           546: 
        !           547: 
        !           548: 
        !           549: 
        !           550: 
        !           551: /*******************************************************************
        !           552: * STACK ADDRESSING TEST FOR THE MULL2 AND MULL3 INTEGER MULTIPLY INSTRUCTIONS
        !           553: *
        !           554: *  For MULL2, operand 1 will be popped from the stack and
        !           555: *             operand 2 will be in memory
        !           556: * 
        !           557: *  For MULL3, operands 1 and 2 will be popped from the stack and
        !           558: *             operand 3 will be in pushed back onto the stack.
        !           559: * 
        !           560: * The stack data will be pushed by "run_code"
        !           561: *******************************************************************/
        !           562: tst_mull_stack()
        !           563: {
        !           564:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           565:        fill_reg_buf( load_regs );      /* set data for registers   */
        !           566:        fill_reg_buf( exp_regs );       /* set data for registers   */
        !           567:        addr_size = 0;                  /* no addressing bytes      */
        !           568:        addr_mode = ADR_POP;
        !           569:        addr_code = 0x8e;               /* auto increment SP (POP)  */
        !           570:        if( op_code == MULL2_OP_CODE )
        !           571:             addr_code2 = 0x60;         /* R0 (deferred) addressing */
        !           572:        else
        !           573:             addr_code2 = 0x8e;         /* auto increment SP (POP)  */
        !           574:        addr_code3 = 0x7e;              /* auto decrement SP (PUSH) */
        !           575:        load_regs[0] = (int) adr_op2;   /* set R0 to addr of op #2  */
        !           576:        exp_regs[0] = load_regs[0];
        !           577:        pack_inst();                    /* pack the instr. code     */
        !           578:        exp_page_faults = 4;            /* 4 pages are used         */
        !           579:        if( no_ops == 2 ) 
        !           580:             min_shift = 18;            /* MULL2 */
        !           581:         else   
        !           582:             min_shift = 17;            /* MULL3 */
        !           583:        shift_count = 19;
        !           584:        for( index = 0; index <= max_index; index++ ) {
        !           585:             get_current_data( adr_op1, adr_op2 );
        !           586:             if( op_code == MULL2_OP_CODE ) 
        !           587:                  sgl_value_8 = dbl_value_1.m; /* push operand 1 only */
        !           588:             else {
        !           589:                  sgl_value_8 = dbl_value_1.m; /* push both of        */
        !           590:                  sgl_value_9 = dbl_value_2.m; /*     the operands    */
        !           591:             }
        !           592:             run_code();                /* execute the instruction */
        !           593:             if( force_loop )
        !           594:                  run_code();           /* start the error loop   */
        !           595:             if( --shift_count < min_shift )
        !           596:                  shift_count = 19;
        !           597:        }
        !           598: }
        !           599: 
        !           600: 
        !           601: 
        !           602: 
        !           603: 
        !           604: /*******************************************************************
        !           605: * AUTO-INCREMENTED STACK POINTER DEFERRED ADDRESSING:
        !           606: *  instruction =  <op-code> <9e> { <9e> <9e> }
        !           607: *
        !           608: * The address(es) of the data will be pushed by "run_code"
        !           609: *******************************************************************/
        !           610: tst_pop_d()
        !           611: {
        !           612:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           613:        fill_reg_buf( load_regs );      /* set data for registers */
        !           614:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           615:        addr_mode = ADR_POP_DEF;
        !           616:        addr_code = addr_code2 = addr_code3 = 0x9e;
        !           617:        addr_size = 0;                  /* no addressing bytes     */
        !           618:        pack_inst();                    /* pack the instr. code    */
        !           619:        sgl_value_8  = (int) adr_op1;   /* get 1st op's address    */
        !           620:        sgl_value_9  = (int) adr_op2;   /* get 2nd op's address    */
        !           621:        sgl_value_10 = (int) adr_op3;   /* get 3rd op's address    */
        !           622:        if( no_ops == 1 )
        !           623:             min_shift = 19;
        !           624:        else if( no_ops == 2 )
        !           625:             min_shift = 18;
        !           626:        else 
        !           627:             min_shift = 17;
        !           628:        shift_count = 19; 
        !           629:        for( index = 0; index <= max_index; index++ ) {
        !           630:             get_current_data( adr_op1, adr_op2 );
        !           631:             get_exp_faults( 4, 5, 6, 7, 7 ); /* set exp fault cnt */
        !           632:             run_code();                /* execute the instruction */
        !           633:             if( --shift_count < min_shift )
        !           634:                   shift_count = 19;
        !           635:        }
        !           636: }
        !           637: 
        !           638: 
        !           639: 
        !           640: 
        !           641: /*******************************************************************
        !           642: * REGISTER + BYTE DISPLACEMENT ADDRESSING:
        !           643: *  instruction =  <op-code> <a4> <(&op_1 -r4)>
        !           644: *                         { <a5> <(&op_2- r5)> }
        !           645: *                         { <a6> <(&op_3- r6)> }
        !           646: *******************************************************************/
        !           647: tst_r_b()
        !           648: {
        !           649:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           650:        fill_reg_buf( load_regs );      /* set data for registers */
        !           651:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           652:        addr_mode  = ADR_REG_B;
        !           653:        addr_code  = 0xa4;              /* addr 1 is offset by r4 */
        !           654:        addr_code2 = 0xa5;              /* addr 2 is offset by r5 */
        !           655:        addr_code3 = 0xa6;              /* addr 3 is offset by r6 */
        !           656:        addr_size  = 1;                 /* 1 byte operand         */
        !           657:        addr_1 = 20;                    /* set the 1st byte offset */
        !           658:        addr_2 = 4;                     /* set the 2nd byte offset */
        !           659:        addr_3 = 16;                    /* set the 3rd byte offset */
        !           660:        pack_inst();                    /* pack the instr. code    */
        !           661:        load_regs[4] = (int) adr_op1 - 20;  /* get the reg value   */
        !           662:        load_regs[5] = (int) adr_op2 - 4;
        !           663:        load_regs[6] = (int) adr_op3 - 16;
        !           664:        exp_regs[4] = load_regs[4];
        !           665:        exp_regs[5] = load_regs[5];
        !           666:        exp_regs[6] = load_regs[6];
        !           667:        if( no_ops == 1 )
        !           668:             min_shift = 18;
        !           669:        else if( no_ops == 2 )
        !           670:             min_shift = 16;
        !           671:        else 
        !           672:             min_shift = 14;
        !           673:        shift_count = 19; 
        !           674:        for( index = 0; index <= max_index; index++ ) {
        !           675:             get_current_data( adr_op1, adr_op2 );
        !           676:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count */
        !           677:             run_code();                /* execute the instruction    */
        !           678:             if( --shift_count < min_shift )
        !           679:                  shift_count = 19;
        !           680:         }
        !           681: }
        !           682: 
        !           683: 
        !           684: 
        !           685: /*******************************************************************
        !           686: * REGISTER + WORD DISPLACEMENT ADDRESSING:
        !           687: *  instruction =  <op-code> <c4> <(&op_1 -r4)>
        !           688: *                         { <c5> <(&op_2 -r5)> }
        !           689: *                         { <c6> <(&op_3 -r6)> }
        !           690: *******************************************************************/
        !           691: tst_r_w()
        !           692: {
        !           693:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           694:        fill_reg_buf( load_regs );      /* set data for registers */
        !           695:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           696:        addr_mode  = ADR_REG_W;
        !           697:        addr_code  = 0xc4;              /* addr 1 is offset by r4 */
        !           698:        addr_code2 = 0xc5;              /* addr 2 is offset by r5 */
        !           699:        addr_code3 = 0xc6;              /* addr 3 is offset by r6 */
        !           700:        addr_size  = 2;                 /* word (2 byte) operand  */
        !           701:        addr_1 = 511;                   /* set the 1st word offset */
        !           702:        addr_2 = 513;                   /* set the 2nd word offset */
        !           703:        addr_3 = 600;                   /* set the 3rd word offset */
        !           704:        pack_inst();                    /* pack the instr. code    */
        !           705:        load_regs[4] = (int) adr_op1 - 511;  /* get the reg value  */
        !           706:        load_regs[5] = (int) adr_op2 - 513;
        !           707:        load_regs[6] = (int) adr_op3 - 600;
        !           708:        exp_regs[4] = load_regs[4];
        !           709:        exp_regs[5] = load_regs[5];
        !           710:        exp_regs[6] = load_regs[6];
        !           711:        if( no_ops == 1 )
        !           712:             min_shift = 17;
        !           713:        else if( no_ops == 2 )
        !           714:             min_shift = 14;
        !           715:        else 
        !           716:             min_shift = 11;
        !           717:        shift_count = 19; 
        !           718:        for( index = 0; index <= max_index; index++ ) {
        !           719:             get_current_data( adr_op1, adr_op2 );
        !           720:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count */
        !           721:             run_code();                /* execute the instruction */
        !           722:             if( --shift_count < min_shift )
        !           723:                  shift_count = 19;
        !           724:        }
        !           725: }
        !           726: 
        !           727: 
        !           728: 
        !           729: 
        !           730: /*******************************************************************
        !           731: * REGISTER + LONGWORD DISPLACEMENT ADDRESSING:
        !           732: *  instruction =  <op-code> <e4> <(&op_1 -r4)>
        !           733: *                         { <e5> <(&op_2 -r5)> }
        !           734: *                         { <e6> <(&op_3 -r6)> }
        !           735: *******************************************************************/
        !           736: tst_r_l()
        !           737: {
        !           738:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           739:        fill_reg_buf( load_regs );      /* set data for registers */
        !           740:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           741:        addr_mode  = ADR_REG_L;
        !           742:        addr_code  = 0xe4;              /* addr 1 is offset by r4 */
        !           743:        addr_code2 = 0xe5;              /* addr 2 is offset by r5 */
        !           744:        addr_code3 = 0xe6;              /* addr 3 is offset by r6 */
        !           745:        addr_size  = 4;                 /* longword (4 byte) op.  */
        !           746:        addr_1 = (int) adr_op1 - 123;   /* get the 1st addr base  */
        !           747:        addr_2 = (int) adr_op2 - 130;   /* get the 2nd addr base  */
        !           748:        addr_3 = (int) adr_op3 - 255;   /* get the 3rd addr base  */
        !           749:        load_regs[4] = 123;             /* reg 4 = 123            */
        !           750:        exp_regs[4]  = 123;
        !           751:        load_regs[5] = 130;             /* reg 5 = 130            */
        !           752:        exp_regs[5]  = 130;
        !           753:        load_regs[6] = 255;             /* reg 5 = 255            */
        !           754:        exp_regs[6]  = 255;
        !           755:        pack_inst();                    /* pack the instr. code   */
        !           756:        if( no_ops == 1 )
        !           757:             min_shift = 15;
        !           758:        else if( no_ops == 2 )
        !           759:             min_shift = 10;
        !           760:        else 
        !           761:             min_shift = 5;
        !           762:        shift_count = 19; 
        !           763:        for( index = 0; index <= max_index; index++ ) {
        !           764:             get_current_data( adr_op1, adr_op2 );
        !           765:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count */
        !           766:             run_code();                /* execute the instruction */
        !           767:             if( --shift_count < min_shift )
        !           768:                  shift_count = 19;
        !           769:        }
        !           770: }
        !           771: 
        !           772: 
        !           773: 
        !           774: 
        !           775: /*******************************************************************
        !           776: * REGISTER + BYTE DISPLACEMENT DEFERRED ADDRESSING:
        !           777: *  instruction =  <op-code> <b4> <(&ptr_to_op_3 -r4)>
        !           778: *                         { <b5> <(&ptr_to_op_3 -r5)> }
        !           779: *                         { <b6> <(&ptr_to_op_3 -r6)> }
        !           780: *******************************************************************/
        !           781: tst_r_bd()
        !           782: {
        !           783:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           784:        fill_reg_buf( load_regs );      /* set data for registers */
        !           785:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           786:        addr_mode  = ADR_REG_B_DEF;
        !           787:        addr_code  = 0xb4;              /* addr 1 is offset by r4 */
        !           788:        addr_code2 = 0xb5;              /* addr 2 is offset by r5 */
        !           789:        addr_code3 = 0xb6;              /* addr 3 is offset by r6 */
        !           790:        addr_size  = 1;                 /* 1 byte operand         */
        !           791:        addr_1 = 20;                    /* set the 1st byte offset */
        !           792:        addr_2 = 4;                     /* set the 2nd byte offset */
        !           793:        addr_3 = 16;                    /* set the 3rd byte offset */
        !           794:        pack_inst();                    /* pack the instr. code    */
        !           795:        load_regs[4] = (int) adr_op1_ptr - 20;  /* get the reg value */
        !           796:        load_regs[5] = (int) adr_op2_ptr - 4;
        !           797:        load_regs[6] = (int) adr_op3_ptr - 16;
        !           798:        exp_regs[4] = load_regs[4];
        !           799:        exp_regs[5] = load_regs[5];
        !           800:        exp_regs[6] = load_regs[6];
        !           801:        if( no_ops == 1 )
        !           802:             min_shift = 18;
        !           803:        else if( no_ops == 2 )
        !           804:             min_shift = 16;
        !           805:        else 
        !           806:             min_shift = 14;
        !           807:        shift_count = 19; 
        !           808:        for( index = 0; index <= max_index; index++ ) {
        !           809:             get_current_data( adr_op1, adr_op2 );
        !           810:             get_exp_faults( 4, 5, 6, 8, 8 );  /* set exp fault count */
        !           811:             run_code();                /* execute the instruction */
        !           812:             if( --shift_count < min_shift )
        !           813:                  shift_count = 19;
        !           814:        }
        !           815: }
        !           816: 
        !           817: 
        !           818: 
        !           819: /*******************************************************************
        !           820: * REGISTER + WORD DISPLACEMENT DEFERRED ADDRESSING:
        !           821: *  instruction =  <op-code> <d4> <(&ptr_to_op_1 -r4)>
        !           822: *                         { <d5> <(&ptr_to_op_2 -r5)> }
        !           823: *                         { <d6> <(&ptr_to_op_3 -r6)> }
        !           824: *******************************************************************/
        !           825: tst_r_wd()
        !           826: {
        !           827:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           828:        fill_reg_buf( load_regs );      /* set data for registers */
        !           829:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           830:        addr_mode  = ADR_REG_W_DEF;
        !           831:        addr_code  = 0xd4;              /* addr 1 is offset by r4 */
        !           832:        addr_code2 = 0xd5;              /* addr 2 is offset by r5 */
        !           833:        addr_code3 = 0xd6;              /* addr 3 is offset by r6 */
        !           834:        addr_size  = 2;                 /* word (2 byte) operand  */
        !           835:        addr_1 = 511;                   /* set the 1st word offset */
        !           836:        addr_2 = 601;                   /* set the 2nd word offset */
        !           837:        addr_3 = 1027;                  /* set the 3rd word offset */
        !           838:        pack_inst();                    /* pack the instr. code    */
        !           839:        load_regs[4] = (int) adr_op1_ptr - 511; /* get the reg value */
        !           840:        load_regs[5] = (int) adr_op2_ptr - 601;
        !           841:        load_regs[6] = (int) adr_op3_ptr - 1027;
        !           842:        exp_regs[4] = load_regs[4];
        !           843:        exp_regs[5] = load_regs[5];
        !           844:        exp_regs[6] = load_regs[6];
        !           845:        if( no_ops == 1 )
        !           846:             min_shift = 17;
        !           847:        else if( no_ops == 2 )
        !           848:             min_shift = 14;
        !           849:        else 
        !           850:             min_shift = 11;
        !           851:        shift_count = 19; 
        !           852:        for( index = 0; index <= max_index; index++ ) {
        !           853:             get_current_data( adr_op1, adr_op2 );
        !           854:             get_exp_faults( 4, 5, 6, 8, 8 );  /* set exp fault count */
        !           855:             run_code();                /* execute the instruction */
        !           856:             if( --shift_count < min_shift )
        !           857:                  shift_count = 19;
        !           858:        }
        !           859: }
        !           860: 
        !           861: 
        !           862: 
        !           863: 
        !           864: /*******************************************************************
        !           865: * REGISTER + LONGWORD DISPLACEMENT DEFERRED ADDRESSING:
        !           866: *  instruction =  <op-code> <f4> <(longword &ptr_to_op_1 -r4)>
        !           867: *                         { <f5> <(longword &ptr_to_op_2 -r5)> }
        !           868: *                         { <f6> <(longword &ptr_to_op_3 -r6)> }
        !           869: *******************************************************************/
        !           870: tst_r_ld()
        !           871: {
        !           872:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           873:        fill_reg_buf( load_regs );      /* set data for registers */
        !           874:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           875:        addr_mode    = ADR_REG_L_DEF;
        !           876:        addr_code    = 0xf4;            /* addr 1 is offset by r4 */
        !           877:        addr_code2   = 0xf5;            /* addr 2 is offset by r5 */
        !           878:        addr_code3   = 0xf6;            /* addr 3 is offset by r6 */
        !           879:        addr_size    = 4;               /* longword (4 byte) op.  */
        !           880:        addr_1 = (int) adr_op1_ptr - 123;       /* set the 1st offset */
        !           881:        addr_2 = (int) adr_op2_ptr - 212;       /* set the 2nd offset */
        !           882:        addr_3 = (int) adr_op3_ptr - 510;       /* set the 3rd offset */
        !           883:        pack_inst();                    /* pack the instr. code    */
        !           884:        load_regs[4] = 123;             /* reg 4 = 123             */
        !           885:        load_regs[5] = 212;             /* reg 5 = 212             */
        !           886:        load_regs[6] = 510;             /* reg 6 = 510             */
        !           887:        exp_regs[4]  = load_regs[4];
        !           888:        exp_regs[5]  = load_regs[5];
        !           889:        exp_regs[6]  = load_regs[6];
        !           890:        if( no_ops == 1 )
        !           891:             min_shift = 15;
        !           892:        else if( no_ops == 2 )
        !           893:             min_shift = 10;
        !           894:        else 
        !           895:             min_shift = 5;
        !           896:        shift_count = 19; 
        !           897:        for( index = 0; index <= max_index; index++ ) {
        !           898:             get_current_data( adr_op1, adr_op2 );
        !           899:             get_exp_faults( 4, 5, 6, 8, 8 );  /* set exp fault count */
        !           900:             run_code();                /* execute the instruction */
        !           901:             if( --shift_count < min_shift )
        !           902:                  shift_count = 19;
        !           903:        }
        !           904: }
        !           905: 
        !           906: 
        !           907: 
        !           908: /*******************************************************************
        !           909: * FRAME POINTER DEFERRED + LONGWORD INDEX ADDRESSING:
        !           910: *  instruction =  <op-code> <44> <6d> { <45> <6d> } { <46> <6d> }
        !           911: * 
        !           912: *  The indeces used will be either quadword indeces ( for DBL operands )
        !           913: *  of longword indeces ( for SGL operands ).
        !           914: *
        !           915: * NOTE: 
        !           916: *  dmp_op_2 is 4 pages away from dmp_op_1. (200 hex quadwords)
        !           917: *  dmp_op_3 is 5 pages & 4 bytes from dmp_op_1. (501 hex longwords)
        !           918: *  IF THIS RELATIVE DISPLACEMENT IS CHANGED THEN THE R5 AND/OR R6 INDICES
        !           919: *  MUST BE CHANGED IN THIS CODE!!! 
        !           920: *  ( The R5 index is used by CMPF2, CMPD2, MULL2, & MULL3. 
        !           921: *    The R6 index is used by MULL3. )
        !           922: *******************************************************************/
        !           923: tst_x_fpd()
        !           924: {
        !           925:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           926:        fill_reg_buf( load_regs );      /* set data for registers */
        !           927:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           928:        addr_mode  = ADR_I_FP_DEF;
        !           929:        addr_code  = 0x44;              /* code for reg. 4 index  */
        !           930:        addr_code2 = 0x45;              /* code for reg. 5 index  */
        !           931:        addr_code3 = 0x46;              /* code for reg. 6 index  */
        !           932:        addr_codeB = 0x6d;              /* code for FP deferred   */
        !           933:        addr_size = 0;                  /* no addr. field per se  */
        !           934:        pack_inst();                    /* pack the instr. code   */
        !           935: /*
        !           936:  * set the frame pointer to '&operand_1 - 16 bytes' (2 quad-words)
        !           937: */
        !           938:        sgl_dummy1 = (int) adr_op1;     /* get the addr of op #1  */
        !           939:        load_regs[13] = sgl_dummy1-16;  /* FP = op 1's addr - 16  */
        !           940:        exp_regs[13] = load_regs[13];
        !           941:        if( sgl_op ) {
        !           942:            load_regs[4] = 4;           /* FP to op_1 (longwords) */
        !           943:            load_regs[5] = 0x404;       /* FP to op_2 (longwords) */
        !           944:            load_regs[6] = 0x505;       /* FP to op_2 (longwords) */
        !           945:        } else {
        !           946:            load_regs[4] = 2;           /* FP to op_1 (quadwords) */
        !           947:            load_regs[5] = 0x202;       /* FP to op_2 (quadwords) */
        !           948:        }
        !           949:        exp_regs[4] = load_regs[4];
        !           950:        exp_regs[5] = load_regs[5];
        !           951:        exp_regs[6] = load_regs[6];
        !           952:        if( no_ops == 1 )
        !           953:             min_shift = 18;
        !           954:        else if( no_ops == 2 )
        !           955:             min_shift = 16;
        !           956:        else 
        !           957:             min_shift = 14;
        !           958:        shift_count = 19; 
        !           959:        for( index = 0; index <= max_index; index++ ) {
        !           960:             get_current_data( adr_op1, adr_op2 );
        !           961:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count */
        !           962:             run_code();                /* execute the instruction */
        !           963:             if( --shift_count < min_shift )
        !           964:                  shift_count = 19;
        !           965:        }
        !           966: }
        !           967: 
        !           968: 
        !           969: 
        !           970: /*******************************************************************
        !           971: *         INDEXED LONGWORD DISPLACEMENT ADDRESSING:
        !           972: *  instruction =  <op-code> <44> <ef> <longword offset>
        !           973: *                         { <45> <ef> <longword offset> }
        !           974: *                         { <46> <ef> <longword offset> }
        !           975: *
        !           976: * NOTE: The index to operand 3 (R6) is only used with MULL3.
        !           977: *******************************************************************/
        !           978: tst_x_l()
        !           979: {
        !           980:        pipe_test = FALSE;              /* clear the pipe test flag */
        !           981:        fill_reg_buf( load_regs );      /* set data for registers */
        !           982:        fill_reg_buf( exp_regs );       /* set data for registers */
        !           983:        addr_mode  = ADR_I_L;
        !           984:        addr_code  = 0x44;              /* code for reg. 4 index  */
        !           985:        addr_code2 = 0x45;              /* code for reg. 5 index  */
        !           986:        addr_code3 = 0x46;              /* code for reg. 6 index  */
        !           987:        addr_codeB = 0xef;              /* code for longword disp */
        !           988:        addr_size  = 4;                 /* longword (4 byte) op.  */
        !           989:        if( sgl_op ) {
        !           990:             load_regs[4] = 4;          /* reg 4 = 4 (longwords)  */
        !           991:             load_regs[5] = 6;          /* reg 5 = 6 (longwords)  */
        !           992:             load_regs[6] = 5;          /* reg 6 = 5 (longwords)  */
        !           993:        } else {
        !           994:             load_regs[4] = 2;          /* reg 4 = 2 (quadwords)  */
        !           995:             load_regs[5] = 3;          /* reg 5 = 3 (quadwords)  */
        !           996:        }
        !           997:        exp_regs[4] = load_regs[4];
        !           998:        exp_regs[5] = load_regs[5];
        !           999:        exp_regs[6] = load_regs[6];
        !          1000:        if( no_ops == 1 )
        !          1001:             min_shift = 14;
        !          1002:        else if( no_ops == 2 )
        !          1003:             min_shift = 8;
        !          1004:        else 
        !          1005:             min_shift = 2;
        !          1006:        shift_count = 19; 
        !          1007:        for( index = 0; index <= max_index; index++ ) {
        !          1008:             get_current_data( adr_op1, adr_op2 );
        !          1009:             get_exp_faults( 3, 4, 4, 6, 5 );  /* set exp fault count */
        !          1010:             addr_1 = os_op1 + 13 - shift_count; /* data's offset   */
        !          1011:             addr_1 -=16;               /*   -16 bytes (2 Q-words)  */
        !          1012:             addr_2 = os_op2 +  7 - shift_count; /* data's offset   */
        !          1013:             addr_2 -=24;               /*   -24 bytes (3 Q-words)  */
        !          1014:             addr_3 = os_op3 +  1 - shift_count; /* data's offset   */
        !          1015:             addr_3 -=20;               /*   -20 bytes (5 L-words)  */
        !          1016:             pack_inst();               /* pack the instr. code     */
        !          1017:             run_code();                /* execute the instruction  */
        !          1018:             if( --shift_count < min_shift )
        !          1019:                  shift_count = 19;
        !          1020:        }
        !          1021: }
        !          1022: 
        !          1023: 
        !          1024: 
        !          1025: 
        !          1026: 
        !          1027: /*******************************************************************
        !          1028: * PIPELINE TEST #1 -DIRECT REGISTER ADDRESSING WITH AN INITIAL LOAD
        !          1029: *
        !          1030: *  This test will put a LOAD instruction immediately in front of the
        !          1031: *  test instruction and a MULTIPLY instruction immediately behind it.
        !          1032: *  The instruction buffer will look like:
        !          1033: *
        !          1034: *  <ldf/ldd> <instruction> <mulf/muld> where:
        !          1035: *  instruction =  <op-code> <50> { <54> } { <58> }
        !          1036: *
        !          1037: *  The load will be done through register R6 deferred.
        !          1038: *  The multiply addressing mode will be through register R2 deferred.
        !          1039: *******************************************************************/
        !          1040: tst_p1()
        !          1041: {
        !          1042:        pipe_test = 1;          /* set pipelined test flag to test #3 */
        !          1043:        if( acc_ld_size == DBL )
        !          1044:             pipe_inst1 = LDD_OP_CODE;
        !          1045:        else
        !          1046:             pipe_inst1 = LDF_OP_CODE;
        !          1047:        if( acc_st_size == DBL )
        !          1048:             pipe_inst2 = MULD_OP_CODE;
        !          1049:        else
        !          1050:             pipe_inst2 = MULF_OP_CODE;
        !          1051:        addr_code_p1 = 0x66;            /* set the 1st piped addr mode */
        !          1052:        addr_code_p2 = 0x62;            /* set the 2nd piped addr mode */
        !          1053:        fill_reg_buf( load_regs );      /* set data for registers */
        !          1054:        fill_reg_buf( exp_regs );       /* set data for registers */
        !          1055:        load_regs[2] = (int) adr_op4;   /* the MULx is w/ op. #4  */
        !          1056:        exp_regs[2] = load_regs[2];
        !          1057:        load_regs[6] = (int) adr_op5;   /* the LDx is w/ op. #5   */
        !          1058:        exp_regs[6] = load_regs[6];
        !          1059:        adr_op4->m = 0x40800000;        /* set the MULx instr's   */
        !          1060:        adr_op4->l = 0;                 /*    operand = '1.0'     */
        !          1061:        addr_mode = ADR_REG;
        !          1062:        addr_code  = 0x50;              /* 1st op in registers 0/1 */
        !          1063:        addr_code2 = 0x54;              /* 2nd op in registers 4/5 */
        !          1064:        addr_code3 = 0x58;              /* 3rd op goes to reg. 8   */
        !          1065:        addr_size = 0;                  /* no addressing bytes     */
        !          1066:        pack_inst();                    /* pack the instr. code    */
        !          1067:        exp_page_faults = 4;            /* 4 pages are used        */
        !          1068:        if( no_ops == 1 )
        !          1069:             min_shift = 16;
        !          1070:        else if( no_ops == 2 )
        !          1071:             min_shift = 15;
        !          1072:        else
        !          1073:             min_shift = 14;
        !          1074:        shift_count = 18; 
        !          1075:        for( index = 0; index <= max_index; index++ ) {
        !          1076:             get_current_data( adr_op1, adr_op2 );
        !          1077:             adr_op5->m = dbl_ld_acc.m;         /* get the data for the */
        !          1078:             adr_op5->l = dbl_ld_acc.l;         /*     load instruction */
        !          1079:             load_regs[0] = dbl_value_1.m;      /* set the test data    */
        !          1080:             load_regs[1] = dbl_value_1.l;
        !          1081:             load_regs[4] = dbl_value_2.m;
        !          1082:             load_regs[5] = dbl_value_2.l;
        !          1083:             exp_regs[4]  = load_regs[4];       /* set exp final reg value */
        !          1084:             exp_regs[5]  = load_regs[5];
        !          1085:             if( op_type == STORE ) {
        !          1086:                  exp_regs[0] = dbl_expected.m;
        !          1087:                  exp_regs[1] = dbl_expected.l;
        !          1088:             } else {
        !          1089:                  exp_regs[0] = dbl_value_1.m;
        !          1090:                  exp_regs[1] = dbl_value_1.l;
        !          1091:                  if( op_code == MULL3_OP_CODE )
        !          1092:                       exp_regs[8] = dbl_expected.m;
        !          1093:                  if( op_code == MULL2_OP_CODE )
        !          1094:                       exp_regs[4] = dbl_expected.m;
        !          1095:             }
        !          1096:             if( op_code == CVDL_OP_CODE )      /* correct for sgl store    */
        !          1097:                  exp_regs[1] = dbl_value_1.l;  /* r1 shouldn't change  */
        !          1098:             run_code();                        /* execute the instruction  */
        !          1099:             if( --shift_count < min_shift )
        !          1100:                  shift_count = 18;
        !          1101:        }
        !          1102:        pipe_test = FALSE;                      /* clear the pipe test flag */
        !          1103: }
        !          1104: 
        !          1105: 
        !          1106: 
        !          1107: /*******************************************************************
        !          1108: * PIPELINE TEST #2 -LONGWORD DISP REL ADDRESSING WITH AN INITIAL LOAD
        !          1109: *
        !          1110: *  This test will put a LOAD instruction immediately in front of the
        !          1111: *  test instruction and a MULTIPLY instruction immediately behind it.
        !          1112: *  The instruction buffer will look like:
        !          1113: *
        !          1114: *  <ldf/ldd> <instruction> <mulf/muld> where:
        !          1115: *  instruction =  <op-code> <ef> <offset to dmp_op_1>
        !          1116: *                         { <ef> <offset to dmp_op_2> }
        !          1117: *                         { <ef> <offset to dmp_op_3> }
        !          1118: *
        !          1119: *  The load's addressing mode will be through register R6 deferred.
        !          1120: *  The multiply's addressing mode will be through register R2 deferred.
        !          1121: *******************************************************************/
        !          1122: tst_p2()
        !          1123: {
        !          1124:        pipe_test = 2;          /* set the piplined test flag to test #4 */
        !          1125:        if( acc_ld_size == DBL )
        !          1126:             pipe_inst1 = LDD_OP_CODE;
        !          1127:        else
        !          1128:             pipe_inst1 = LDF_OP_CODE;
        !          1129:        if( acc_st_size == DBL )
        !          1130:             pipe_inst2 = MULD_OP_CODE;
        !          1131:        else
        !          1132:             pipe_inst2 = MULF_OP_CODE;
        !          1133:        addr_code_p1 = 0x66;            /* set the 1st piped addr mode */
        !          1134:        addr_code_p2 = 0x62;            /* set the 2nd piped addr mode */
        !          1135:        fill_reg_buf( load_regs );      /* set data for registers */
        !          1136:        fill_reg_buf( exp_regs );       /* set data for registers */
        !          1137:        load_regs[2] = (int) adr_op4;   /* MULx is via op. #4     */
        !          1138:        exp_regs[2] = load_regs[2];
        !          1139:        load_regs[6] = (int) adr_op5;   /* LDx is via op. #5      */
        !          1140:        exp_regs[6] = load_regs[6];
        !          1141:        adr_op4->m = 0x40800000;        /* set the piped mult's   */
        !          1142:        adr_op4->l = 0;                 /*    operand = '1.0'     */
        !          1143:        addr_mode = ADR_L_DSP;
        !          1144:        addr_code = addr_code2 = addr_code3 = 0xef;
        !          1145:        addr_size = 4;                  /* longword (4 byte) ops. */
        !          1146:        if( no_ops == 1 )
        !          1147:             min_shift = 12;
        !          1148:        else if( no_ops == 2 )
        !          1149:             min_shift = 7;
        !          1150:        else 
        !          1151:             min_shift = 2;
        !          1152:        shift_count = 18; 
        !          1153:        for( index = 0; index <= max_index; index++ ) {
        !          1154:             get_current_data( adr_op1, adr_op2 );
        !          1155:             get_exp_faults( 5, 6, 6, 8, 7 );   /* set exp fault count   */
        !          1156:             adr_op5->m = dbl_ld_acc.m;         /* get the data for the  */
        !          1157:             adr_op5->l = dbl_ld_acc.l;         /*      load instruction */
        !          1158:             addr_1 = os_op1 + 12 - shift_count;
        !          1159:             addr_2 = os_op2 +  7 - shift_count;
        !          1160:             addr_3 = os_op3 +  2 - shift_count;
        !          1161:             pack_inst();               /* pack the instr. code   */
        !          1162:             run_code();                /* execute the instruction */
        !          1163:             if( --shift_count < min_shift )
        !          1164:                  shift_count = 18;
        !          1165:        }
        !          1166:        pipe_test = FALSE;              /* clear the pipe test flag */
        !          1167: }
        !          1168: 
        !          1169: 
        !          1170: 
        !          1171: 
        !          1172: 
        !          1173: /*******************************************************************
        !          1174: * PIPELINE TEST #3 -DIRECT REGISTER ADDRESSING WITH AN INITIAL MULTIPLY
        !          1175: *
        !          1176: *  This test will put a MULTIPLY instruction immediately in front of the
        !          1177: *  test instruction and a MULTIPLY instruction immediately behind it.
        !          1178: *  Both multiplys will be times "1.0".
        !          1179: *
        !          1180: *  The instruction buffer will look like:
        !          1181: *      <mulf/muld> <instruction> <mulf/muld> where:
        !          1182: *      instruction =  <op-code> <50> { <54> } { <58> }
        !          1183: *
        !          1184: *  The 1st multiply will be done through register R6 deferred.
        !          1185: *  The 2nd multiply will be done through register R2 deferred.
        !          1186: *******************************************************************/
        !          1187: tst_p3()
        !          1188: {
        !          1189:        pipe_test = 3;          /* set pipelined test flag to pipe test #1 */
        !          1190:        if( acc_ld_size == DBL )
        !          1191:             pipe_inst1 = MULD_OP_CODE;
        !          1192:        else
        !          1193:             pipe_inst1 = MULF_OP_CODE;
        !          1194:        if( acc_st_size == DBL )
        !          1195:             pipe_inst2 = MULD_OP_CODE;
        !          1196:        else
        !          1197:             pipe_inst2 = MULF_OP_CODE;
        !          1198:        addr_code_p1 = 0x66;            /* set the 1st piped addr mode */
        !          1199:        addr_code_p2 = 0x62;            /* set the 2nd piped addr mode */
        !          1200:        fill_reg_buf( load_regs );      /* set data for registers */
        !          1201:        fill_reg_buf( exp_regs );       /* set data for registers */
        !          1202:        load_regs[2] = (int) adr_op4;   /* 2nd MULx is via op. #4 */
        !          1203:        exp_regs[2] = load_regs[2];
        !          1204:        load_regs[6] = (int) adr_op5;   /* 1st MULx is via op. #5 */
        !          1205:        exp_regs[6] = load_regs[6];
        !          1206:        adr_op4->m = 0x40800000;        /* set the MULx instr's   */
        !          1207:        adr_op4->l = 0;                 /*    operand = '1.0'     */
        !          1208:        adr_op5->m = 0x40800000;
        !          1209:        adr_op5->l = 0; 
        !          1210:        addr_mode = ADR_REG;
        !          1211:        addr_code  = 0x50;              /* 1st op in registers 0/1 */
        !          1212:        addr_code2 = 0x54;              /* 2nd op in registers 4/5 */
        !          1213:        addr_code3 = 0x58;              /* 3rd op goes to reg. 8   */
        !          1214:        addr_size = 0;                  /* no addressing bytes     */
        !          1215:        pack_inst();                    /* pack the instr. code    */
        !          1216:        exp_page_faults = 4;            /* 4 pages are used        */
        !          1217:        if( no_ops == 1 )
        !          1218:             min_shift = 16;
        !          1219:        else if( no_ops == 2 )
        !          1220:             min_shift = 15;
        !          1221:        else
        !          1222:             min_shift = 14;
        !          1223:        shift_count = 18; 
        !          1224:        for( index = 0; index <= max_index; index++ ) {
        !          1225:                  get_current_data( adr_op1, adr_op2 );
        !          1226:                  load_regs[0] = dbl_value_1.m; /* set the test data    */
        !          1227:                  load_regs[1] = dbl_value_1.l;
        !          1228:                  load_regs[4] = dbl_value_2.m;
        !          1229:                  load_regs[5] = dbl_value_2.l;
        !          1230:                  if( op_code == MULL2_OP_CODE )
        !          1231:                       exp_regs[4] = dbl_expected.m;    /* store to reg #4 */
        !          1232:                  else
        !          1233:                       exp_regs[4] = load_regs[4];      /* reg 4 s/n change */
        !          1234:                  exp_regs[5]  = load_regs[5];
        !          1235:                  if( op_code == MULL3_OP_CODE )
        !          1236:                       exp_regs[8] = dbl_expected.m;    /* store to reg #8 */
        !          1237:                  if( op_type == LOAD ) {
        !          1238:                       exp_regs[0] = dbl_value_1.m;
        !          1239:                       exp_regs[1] = dbl_value_1.l;
        !          1240:                  } else {
        !          1241:                       exp_regs[0] = dbl_expected.m;
        !          1242:                       exp_regs[1] = dbl_expected.l;
        !          1243:                  }
        !          1244:                  if( op_code == CVDL_OP_CODE ) /* correct for sgl store    */
        !          1245:                       exp_regs[1] = dbl_value_1.l; /* r1 shouldn't change  */
        !          1246:                  run_code();                   /* execute the instruction  */
        !          1247:             if( --shift_count < min_shift )
        !          1248:                  shift_count = 18;
        !          1249:        }
        !          1250:        pipe_test = FALSE;                      /* clear the pipe test flag */
        !          1251: }
        !          1252: 
        !          1253: 
        !          1254: 
        !          1255: 
        !          1256: /*******************************************************************
        !          1257: * PIPELINE TEST #4 -LONGWORD DISP REL ADDR. WITH AN INITIAL MULTIPLY
        !          1258: *
        !          1259: *  This test will put MULTIPLY instructions immediately in front of and
        !          1260: *  behind the test instruction.
        !          1261: *  The instruction buffer will look like:
        !          1262: *
        !          1263: *  <mulf/muld> <instruction> <mulf/muld> where:
        !          1264: *  instruction =  <op-code> <ef> <offset to dmp_op_1>
        !          1265: *                         { <ef> <offset to dmp_op_2> }
        !          1266: *                         { <ef> <offset to dmp_op_3> }
        !          1267: *
        !          1268: *  The 1st multiply's addressing will be through register R6 deferred.
        !          1269: *  The 2nd multiply's addressing will be through register R2 deferred.
        !          1270: *******************************************************************/
        !          1271: tst_p4()
        !          1272: {
        !          1273:        pipe_test = 4;          /* set the piplined flag to test # 2 */
        !          1274:        if( acc_ld_size == DBL )
        !          1275:             pipe_inst1 = MULD_OP_CODE;
        !          1276:        else
        !          1277:             pipe_inst1 = MULF_OP_CODE;
        !          1278:        if( acc_st_size == DBL )
        !          1279:             pipe_inst2 = MULD_OP_CODE;
        !          1280:        else
        !          1281:             pipe_inst2 = MULF_OP_CODE;
        !          1282:        addr_code_p1 = 0x66;            /* set the 1st piped addr mode */
        !          1283:        addr_code_p2 = 0x62;            /* set the 2nd piped addr mode */
        !          1284:        fill_reg_buf( load_regs );      /* set data for registers */
        !          1285:        fill_reg_buf( exp_regs );       /* set data for registers */
        !          1286:        load_regs[2] = (int) adr_op4;   /* 2nd MULx is w/ op. #4 */
        !          1287:        exp_regs[2] = load_regs[2];
        !          1288:        load_regs[6] = (int) adr_op5;   /* 1st MULx is w/ op. #5  */
        !          1289:        exp_regs[6] = load_regs[6];
        !          1290:        adr_op4->m = 0x40800000;        /* set the piped mult's   */
        !          1291:        adr_op4->l = 0;                 /*    operand = '1.0'     */
        !          1292:        adr_op5->m = 0x40800000;
        !          1293:        adr_op5->l = 0; 
        !          1294:        addr_mode = ADR_L_DSP;
        !          1295:        addr_code = addr_code2 = addr_code3 = 0xef;
        !          1296:        addr_size = 4;                  /* longword (4 byte) ops. */
        !          1297:        if( no_ops == 1 )
        !          1298:             min_shift = 12;
        !          1299:        else if( no_ops == 2 )
        !          1300:             min_shift = 7;
        !          1301:        else
        !          1302:             min_shift = 2;
        !          1303:        shift_count = 18; 
        !          1304:        for( index = 0; index <= max_index; index++ ) {
        !          1305:             get_current_data( adr_op1, adr_op2 );
        !          1306:             get_exp_faults( 5, 6, 6, 8, 7 );  /* set exp fault count */
        !          1307:             addr_1 = os_op1 + 12 - shift_count; /* data's offset */
        !          1308:             addr_2 = os_op2 +  7 - shift_count;
        !          1309:             addr_3 = os_op3 +  2 - shift_count;
        !          1310:             pack_inst();               /* pack the instr. code   */
        !          1311:             run_code();                /* execute the instruction */
        !          1312:             if( --shift_count < min_shift )
        !          1313:                  shift_count = 18;
        !          1314:        }
        !          1315:        pipe_test = FALSE;              /* clear the pipe test flag */
        !          1316: }
        !          1317: 
        !          1318: 
        !          1319: 
        !          1320: 
        !          1321: 
        !          1322: /*
        !          1323:  ***************************************************************************
        !          1324:  *
        !          1325:  *     GET DATA FOR DOUBLE PRECISION INSTRUCTIONS
        !          1326:  *
        !          1327:  ***************************************************************************
        !          1328: */
        !          1329: get_current_data( dptr_1, dptr_2 )
        !          1330: struct u64 *dptr_1;                            /* pointer to 1st operand */
        !          1331: struct u64 *dptr_2;                            /* pointer to 2nd operand */
        !          1332: {
        !          1333:        if( no_ops == 1 ) {
        !          1334:             dbl_ld_acc   = data_ptr[index].op_1;
        !          1335:             dbl_value_1  = data_ptr[index].op_2;
        !          1336:             dbl_expected = data_ptr[index].exp;
        !          1337:             *dptr_1 = dbl_value_1;             /* set the operand */
        !          1338:        } else if( no_ops == 2 ) {
        !          1339:             if( index < (ldf_cnt -1) )
        !          1340:                  dbl_ld_acc   = ldd_data[index+1].op_1;
        !          1341:             else
        !          1342:                  dbl_ld_acc   = ldd_data[index & 0xf].op_1;
        !          1343:             dbl_value_1  = data_ptr[index].op_1;
        !          1344:             dbl_value_2  = data_ptr[index].op_2;
        !          1345:             dbl_expected = data_ptr[index].exp;
        !          1346:             *dptr_1 = dbl_value_1;             /* set 1st operand */
        !          1347:             *dptr_2 = dbl_value_2;             /* set 2nd operand */
        !          1348:        } else {   /* 3 operands */
        !          1349:             if( index < (ldf_cnt -1) )
        !          1350:                  dbl_ld_acc   = ldd_data[index +1].op_1;
        !          1351:             else
        !          1352:                  dbl_ld_acc   = ldd_data[index & 0xf].op_1;
        !          1353:             dbl_value_1  = data_ptr[index].op_1;
        !          1354:             dbl_value_2  = data_ptr[index].op_2;
        !          1355:             dbl_expected = data_ptr[index].exp;
        !          1356:             *dptr_1 = dbl_value_1;             /* set 1st operand */
        !          1357:             *dptr_2 = dbl_value_2;             /* set 2nd operand */
        !          1358:        }
        !          1359: }
        !          1360: 
        !          1361: 
        !          1362: 
        !          1363: /*
        !          1364:  ***************************************************************************
        !          1365:  *     Set the number of translation faults expected
        !          1366:  *
        !          1367:  *  The entry parameters are the number of faults expected with an instruction
        !          1368:  *  cache miss and with varying data types. The correct fault count is
        !          1369:  *  selected and put into "exp_page_faults". 
        !          1370:  *  In double precision compare (CMPD, CMPD2) operations, the system won't 
        !          1371:  *  fetch the least significant half of the operand(s) if the most significant 
        !          1372:  *  halves are different. The # of faults expected will be adjusted for this. 
        !          1373:  *  When using the "no-fpp" version of firmware the least significant longword
        !          1374:  *  will always be fetched for CMPD. CMPD2 acts the same with either WCS.
        !          1375:  * 
        !          1376:  ***************************************************************************
        !          1377: */
        !          1378: get_exp_faults( sgl_1, dbl_1, sgl_2, dbl_2, sgl_3 )
        !          1379: int sgl_1;                             /* exp # faults for 1 sgl operand  */
        !          1380: int dbl_1;                             /* exp # faults for 1 dbl operand  */
        !          1381: int sgl_2;                             /* exp # faults for 2 sgl operands */
        !          1382: int dbl_2;                             /* exp # faults for 2 dbl operands */
        !          1383: int sgl_3;                             /* exp # faults for 3 sgl operands */
        !          1384: {
        !          1385:        if( no_ops == 1 ) {
        !          1386:             if( sgl_op )
        !          1387:                  exp_page_faults = sgl_1;      /* 1 sgl operand  */
        !          1388:              else
        !          1389:                  exp_page_faults = dbl_1;      /* 1 dbl operand  */
        !          1390:        } else if( no_ops == 2 ) {
        !          1391:             if( sgl_op )
        !          1392:                  exp_page_faults = sgl_2;      /* 2 sgl operands */
        !          1393:              else
        !          1394:                  exp_page_faults = dbl_2;      /* 2 dbl operands */
        !          1395:        } else  /* 3 sgl operands */
        !          1396:                  exp_page_faults = sgl_3;      /* 3 sgl operands */
        !          1397:        if( (op_code == CMPD2_OP_CODE) && (dbl_value_1.m != dbl_value_2.m) ) 
        !          1398:             exp_page_faults--;
        !          1399:        if( (op_code == CMPD_OP_CODE) && (dbl_value_1.m != dbl_ld_acc.m) &&
        !          1400:            (!no_fpp_wcs) )
        !          1401:             exp_page_faults--;
        !          1402: }
        !          1403: 
        !          1404: 
        !          1405: /*
        !          1406:  ***************************************************************************
        !          1407:  *
        !          1408:  *     Set or reset the LOAD_ACCUMULATOR flag
        !          1409:  *
        !          1410:  *  If the current instruction loads the accumulator then set the flag.
        !          1411:  *  This flag is used by the page fault handler.
        !          1412:  ***************************************************************************
        !          1413: */
        !          1414: set_load_flag()
        !          1415: {
        !          1416:        if( (op_code == LDF_OP_CODE)  ||        /* load SGL Acc. */
        !          1417:            (op_code == LNF_OP_CODE)  ||        /* load / negate SGL Acc. */
        !          1418:            (op_code == LDD_OP_CODE)  ||        /* load SGL Acc. */
        !          1419:            (op_code == LND_OP_CODE)  ||        /* load / negate SGL Acc. */
        !          1420:            (op_code == LDFD_OP_CODE) )         /* load SGL to DBL Acc. */
        !          1421:             load_type_inst = TRUE;
        !          1422:        else
        !          1423:             load_type_inst = FALSE;
        !          1424: }
        !          1425: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.