Annotation of cci/d/dmp4/test_mulf.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*******************************************************************
                      3: * ABSOLUTE ADDRESSING:
                      4: *  instruction =  <op-code> <9f> <&dmp_op_1> {<9f> <&dmp_op_2>}
                      5: *******************************************************************/
                      6: tst_abs()
                      7: {
                      8:        pipe_test = FALSE;              /* clear the pipe test flag */
                      9:        fill_reg_buf( load_regs );      /* set data for registers */
                     10:        fill_reg_buf( exp_regs );       /* set data for registers */
                     11:        addr_mode = ADR_ABSOLUTE;
                     12:        addr_code = addr_code2 = 0x9f;
                     13:        addr_size = 4;                  /* longword (4 byte) ops. */
                     14:        addr_1    = DMP_OP_1;           /* abs. address of data   */
                     15:        addr_2    = DMP_OP_2;
                     16:        if( no_ops == 2 )
                     17:             min_shift = 6;
                     18:         else 
                     19:             min_shift = 11;
                     20:        shift_count = 15;
                     21:        for( index = 0; index <= max_index; index++ ) {
                     22:             get_current_data( adr_op1, adr_op2 );
                     23:             get_exp_faults( 3, 4, 4, 6 );  /* set exp fault cnt  */
                     24:             pack_inst();               /* pack the instr. code   */
                     25:             run_code();                /* execute the instruction */
                     26:             if( --shift_count < min_shift )
                     27:                  shift_count = 15;
                     28:        }
                     29: }
                     30: 
                     31: 
                     32: 
                     33: 
                     34:   
                     35: /*******************************************************************
                     36: * LONGWORD DISPLACEMENT RELATIVE DEFERRED ADDRESSING:
                     37: *  instruction =  <op-code> <ff> <offset to dmp_op_1>
                     38: *                         { <ff> <offset to dmp_op_1> }
                     39: *******************************************************************/
                     40: tst_l_d()
                     41: {
                     42:        pipe_test = FALSE;              /* clear the pipe test flag */
                     43:        fill_reg_buf( load_regs );      /* set data for registers */
                     44:        fill_reg_buf( exp_regs );       /* set data for registers */
                     45:        addr_mode = ADR_L_DSP_DEF;
                     46:        addr_code = addr_code2 = 0xff;
                     47:        addr_size = 4;                  /* longword (4 byte) op.  */
                     48:        if( no_ops == 2 )
                     49:             min_shift = 6;
                     50:         else 
                     51:             min_shift = 11;
                     52:        shift_count = 15; 
                     53:        for( index = 0; index <= max_index; index++ )
                     54:        {
                     55:             get_current_data( adr_op1, adr_op2 );
                     56:             get_exp_faults( 4, 5, 6, 8 );  /* set exp fault cnt  */
                     57:             addr_1 = os_ad_op1 + 10 - shift_count; /* operand offset */
                     58:             addr_2 = os_ad_op2 +  5 - shift_count; 
                     59:             pack_inst();               /* pack the instr. code   */
                     60:             run_code();                /* execute the instruction */
                     61:             if( --shift_count < min_shift )
                     62:                  shift_count = 15;
                     63:        }
                     64: }
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: /*******************************************************************
                     71: * AUTO-INCREMENTED STACK POINTER ADDRESSING  ( POP ):  ( sgl ops only )
                     72: *  instruction =  <op-code> <8e> 
                     73: * 
                     74: * The data will be pushed by "run_code"
                     75: * Pop will be run with SGL instructions only.
                     76: *******************************************************************/
                     77: tst_pop()
                     78: {
                     79:        pipe_test = FALSE;              /* clear the pipe test flag */
                     80:        fill_reg_buf( load_regs );      /* set data for registers */
                     81:        fill_reg_buf( exp_regs );       /* set data for registers */
                     82:        addr_mode = ADR_POP;
                     83:        addr_code = addr_code2 = 0x8e;
                     84:        addr_size = 0;                  /* no addressing bytes    */
                     85:        pack_inst();                    /* pack the instr. code   */
                     86:        if( no_ops == 2 ) {
                     87:             min_shift = 14;
                     88:             exp_page_faults = 4;       /* 4 pages are used       */
                     89:         } else  {
                     90:             min_shift = 15;
                     91:             exp_page_faults = 3;       /* 3 pages are used       */
                     92:        }
                     93:        shift_count = 15;
                     94:        for( index = 0; index <= max_index; index++ )
                     95:        {
                     96:             get_current_data( adr_op1, adr_op2 );
                     97:             sgl_value_9 = dbl_value_1.m; /* data to be pushed   */
                     98:             sgl_value_10 = dbl_value_2.m;
                     99:             run_code();                /* execute the instruction */
                    100:             (*test_ptr)();             /* verify the results     */
                    101:             if( force_loop )
                    102:                  run_code();           /* start the error loop   */
                    103:             if( --shift_count < min_shift )
                    104:                  shift_count = 15;
                    105:        }
                    106: }
                    107: 
                    108: 
                    109: 
                    110: 
                    111: 
                    112: 
                    113: /*******************************************************************
                    114: * REGISTER + BYTE DISPLACEMENT ADDRESSING:
                    115: *  instruction =  <op-code> <a4> <(&op_1 -r4)>
                    116: *                         { <a5> <(&op_2- r5)> }
                    117: *******************************************************************/
                    118: tst_r_b()
                    119: {
                    120:        pipe_test = FALSE;              /* clear the pipe test flag */
                    121:        fill_reg_buf( load_regs );      /* set data for registers */
                    122:        fill_reg_buf( exp_regs );       /* set data for registers */
                    123:        addr_mode  = ADR_REG_B;
                    124:        addr_code  = 0xa4;              /* addr 1 is offset by r4 */
                    125:        addr_code2 = 0xa5;              /* addr 2 is offset by r5 */
                    126:        addr_size  = 1;                 /* 1 byte operand         */
                    127:        addr_1 = 20;                    /* set the 1st byte offset */
                    128:        addr_2 = 4;                     /* set the 2nd byte offset */
                    129:        pack_inst();                    /* pack the instr. code    */
                    130:        load_regs[4] = (int) adr_op1 - 20;  /* get the reg value   */
                    131:        load_regs[5] = (int) adr_op2 - 4;
                    132:        exp_regs[4] = load_regs[4];
                    133:        exp_regs[5] = load_regs[5];
                    134:        if( no_ops == 2 )
                    135:             min_shift = 12;
                    136:         else 
                    137:             min_shift = 14;
                    138:         shift_count = 15; 
                    139:         for( index = 0; index <= max_index; index++ )
                    140:         {
                    141:             get_current_data( adr_op1, adr_op2 );
                    142:             get_exp_faults( 3, 4, 4, 6 );  /* set exp fault cnt  */
                    143:             run_code();                /* execute the instruction */
                    144:             if( --shift_count < min_shift )
                    145:                  shift_count = 15;
                    146:         }
                    147: }
                    148: 
                    149: 
                    150: 
                    151: 
                    152: /*******************************************************************
                    153: *         INDEXED LONGWORD DISPLACEMENT ADDRESSING:
                    154: *  instruction =  <op-code> <44> <ef> <longword offset>
                    155: *                         { <45> <ef> <longword offset> }
                    156: *******************************************************************/
                    157: tst_x_l()
                    158: {
                    159:        pipe_test = FALSE;              /* clear the pipe test flag */
                    160:        fill_reg_buf( load_regs );      /* set data for registers */
                    161:        fill_reg_buf( exp_regs );       /* set data for registers */
                    162:        addr_mode  = ADR_I_L;
                    163:        addr_code  = 0x44;              /* code for reg. 4 index  */
                    164:        addr_code2 = 0x45;              /* code for reg. 5 index  */
                    165:        addr_codeB = 0xef;              /* code for longword disp */
                    166:        addr_size  = 4;                 /* longword (4 byte) op.  */
                    167:        if( sgl_op )
                    168:        {
                    169:             load_regs[4] = 4;          /* reg 4 = 4 (longwords)  */
                    170:             load_regs[5] = 6;          /* reg 5 = 6 (longwords)  */
                    171:        } else {
                    172:             load_regs[4] = 2;          /* reg 4 = 2 (quadwords)  */
                    173:             load_regs[5] = 3;          /* reg 5 = 3 (quadwords)  */
                    174:        }
                    175:        exp_regs[4] = load_regs[4];
                    176:        exp_regs[5] = load_regs[5];
                    177:        if( no_ops == 2 )
                    178:             min_shift = 4;
                    179:         else 
                    180:             min_shift = 10;
                    181:        shift_count = 15; 
                    182:        for( index = 0; index <= max_index; index++ )
                    183:        {
                    184:             get_current_data( adr_op1, adr_op2 );
                    185:             get_exp_faults( 3, 4, 4, 6 );  /* set exp fault cnt    */
                    186:             addr_1 = os_op1 + 9 - shift_count; /* data's offset    */
                    187:             addr_1 -=16;               /*    -16 bytes (2 Q-words) */
                    188:             addr_2 = os_op2 + 3 - shift_count; /* data's offset    */
                    189:             addr_2 -=24;               /*    -24 bytes (3 Q-words) */
                    190:             pack_inst();               /* pack the instr. code     */
                    191:             run_code();                /* execute the instruction  */
                    192:             if( --shift_count < min_shift )
                    193:                  shift_count = 15;
                    194:        }
                    195: }
                    196: 
                    197: 
                    198: 
                    199: 
                    200: 
                    201: 
                    202: 
                    203: /*******************************************************************
                    204: * PIPELINED TEST #2 -LONGWORD DISPLACEMENT RELATIVE ADDR. WITH A PRE MULTIPLY
                    205: *
                    206: *  This test will put MULTIPLY instructions immediately in front of and
                    207: *  behind the test instruction.
                    208: *  The instruction buffer will look like:
                    209: *
                    210: *  <mulf/muld> <instruction> <mulf/muld> where:
                    211: *  instruction =  <op-code> <ef> <offset to dmp_op_1>
                    212: *                         { <ef> <offset to dmp_op_2> }
                    213: *
                    214: *  The 1st multiply's addressing will be indirect through register R6.
                    215: *  The 2nd multiply's addressing will be indirect through register R2.
                    216: *******************************************************************/
                    217: tst_p2()
                    218: {
                    219:        pipe_test = 2;          /* set the piplined flag to test # 2 */
                    220:        if( acc_ld_size == DBL )
                    221:             pipe_inst1 = MULD_OP_CODE;
                    222:        else
                    223:             pipe_inst1 = MULF_OP_CODE;
                    224:        if( acc_st_size == DBL )
                    225:             pipe_inst2 = MULD_OP_CODE;
                    226:        else
                    227:             pipe_inst2 = MULF_OP_CODE;
                    228:        fill_reg_buf( load_regs );      /* set data for registers */
                    229:        fill_reg_buf( exp_regs );       /* set data for registers */
                    230:        load_regs[2] = (int) adr_op3;   /* 2nd MULx is w/ op. #3 */
                    231:        exp_regs[2] = load_regs[2];
                    232:        load_regs[6] = (int) adr_op4;   /* 1st MULx is w/ op. #4  */
                    233:        exp_regs[6] = load_regs[6];
                    234:        adr_op3->m = 0x40800000;        /* set the piped mult's   */
                    235:        adr_op3->l = 0;                 /*    operand = '1.0'     */
                    236:        adr_op4->m = 0x40800000;
                    237:        adr_op4->l = 0; 
                    238:        addr_mode = ADR_L_DSP;
                    239:        addr_code = addr_code2 = 0xef;
                    240:        addr_size = 4;                  /* longword (4 byte) ops. */
                    241:        if( no_ops == 2 )
                    242:             min_shift = 2;
                    243:         else
                    244:             min_shift = 7;
                    245:        shift_count = 15; 
                    246:        for( index = 0; index <= max_index; index++ )
                    247:        {
                    248:             get_current_data( adr_op1, adr_op2 );
                    249:             get_exp_faults( 5, 6, 6, 8 );  /* set exp fault cnt  */
                    250:             addr_1 = os_op1 +  8 - shift_count; /* data's offset */
                    251:             addr_2 = os_op2 +  3 - shift_count;
                    252:             pack_inst();               /* pack the instr. code   */
                    253:             run_code();                /* execute the instruction */
                    254:             if( --shift_count < min_shift )
                    255:                  shift_count = 15;
                    256:        }
                    257:        pipe_test = FALSE;              /* clear the pipe test flag */
                    258: }
                    259: 
                    260: 
                    261: 
                    262: 
                    263: 
                    264: /*
                    265:  ***************************************************************************
                    266:  *
                    267:  *     GET DATA FOR DOUBLE PRECISION INSTRUCTIONS
                    268:  *
                    269:  ***************************************************************************
                    270: */
                    271: get_current_data( dptr_1, dptr_2 )
                    272: struct u64 *dptr_1;                            /* pointer to 1st operand */
                    273: struct u64 *dptr_2;                            /* pointer to 2nd operand */
                    274: {
                    275:        if( no_ops == 2 )
                    276:        {
                    277:             dbl_ld_acc   = ldd_data[ index +1 ].op_1;
                    278:             dbl_value_1  = data_ptr[ index ].op_1;
                    279:             dbl_value_2  = data_ptr[ index ].op_2;
                    280:             dbl_expected = data_ptr[ index ].exp;
                    281:             *dptr_1 = dbl_value_1;             /* set 1st operand */
                    282:             *dptr_2 = dbl_value_2;             /* set 2nd operand */
                    283:        } else {   /* only 1 operand */
                    284:             dbl_ld_acc   = data_ptr[ index ].op_1;
                    285:             dbl_value_1  = data_ptr[ index ].op_2;
                    286:             dbl_expected = data_ptr[ index ].exp;
                    287:             *dptr_1 = dbl_value_1;             /* set the operand */
                    288:        }
                    289: }
                    290: 
                    291: 
                    292: 
                    293: /*
                    294:  ***************************************************************************
                    295:  *     Set the number of translation faults expected
                    296:  *
                    297:  *  The entry parameters are the number of faults expected with an instruction
                    298:  *  cache miss and with varying data types. The correct fault count is
                    299:  *  selected and put into "exp_page_faults". 
                    300:  *  In double precision compare operations, the system won't fetch the 
                    301:  *  least significant half of the operand(s) if the most significant halves 
                    302:  *  are different. The # of faults expected will be adjusted for this.
                    303:  * 
                    304:  ***************************************************************************
                    305: */
                    306: get_exp_faults( sgl_1, dbl_1, sgl_2, dbl_2 )
                    307: int sgl_1;                             /* exp # faults for 1 sgl operand  */
                    308: int dbl_1;                             /* exp # faults for 1 dbl operand  */
                    309: int sgl_2;                             /* exp # faults for 2 sgl operands */
                    310: int dbl_2;                             /* exp # faults for 2 dbl operands */
                    311: {
                    312:        if( no_ops == 1 ) {
                    313:             if( sgl_op )
                    314:                  exp_page_faults = sgl_1;      /* 1 sgl operand  */
                    315:              else
                    316:                  exp_page_faults = dbl_1;      /* 1 dbl operand  */
                    317:        } else {
                    318:             if( sgl_op )
                    319:                  exp_page_faults = sgl_2;      /* 2 sgl operands */
                    320:              else
                    321:                  exp_page_faults = dbl_2;      /* 2 dbl operands */
                    322:        }
                    323:        if( (op_code == CMPD_OP_CODE)  && (dbl_value_1.m != dbl_ld_acc.m) ||
                    324:            (op_code == CMPD2_OP_CODE) && (dbl_value_1.m != dbl_value_2.m) )
                    325:             exp_page_faults--;
                    326: }
                    327: 
                    328: 
                    329: 

unix.superglobalmegacorp.com

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