Annotation of cci/d/macro4/pipe18.c, revision 1.1

1.1     ! root        1: #include "fpp_defs.h"
        !             2: 
        !             3: 
        !             4: /*****************************************************************************
        !             5: *
        !             6: *              PIPELINE TEST #18 
        !             7: *
        !             8: *      LDD(op1), MULD(op2), CVDL r0, SUBD operand[r0], STD
        !             9: *
        !            10: *  -where the operands are the fmacro1 MULD data patterns. The SUBD operand's
        !            11: *   address is based on the result of the CVDL.
        !            12: *  -The load, multiply, and convert will be done twice. The first time will
        !            13: *   be to get the index and the data to subtract. The data to subtract will 
        !            14: *   be the same as the accumulator so we'll expect a reasult of zero. The 
        !            15: *   data will be stored based on the 1st CVDL result.
        !            16: *  -If the 2nd CVDL doesn't get done before the SUBD operand is fetched then
        !            17: *   we won't get a final accumulator of zero.
        !            18: *  -For size reasons, only the MULD data with a result between -100 and +100
        !            19: *   will be used for this test.
        !            20: *****************************************************************************/
        !            21: pipe_18()
        !            22: {
        !            23:        asm(".globl _pipeline_18_t");
        !            24:        asm("_pipeline_18_t:");
        !            25:        if( (cycle == 1) && (prt_hdrs) )        /* print headers on 1st cycle */
        !            26:           writes(" PIPE_18");
        !            27:        force_loop = FALSE;                     /* clear force_loop flag */
        !            28:        for( index = 0; index <= max_muld_1_index; index++ ) {
        !            29:              dbl_value_1  = muld_1_data[index].op_1;   /* get the data  */
        !            30:              dbl_value_2  = muld_1_data[index].op_2;   /*   operands    */
        !            31:              dbl_expected.m = dbl_expected.l = 0;      /* result s/b 0  */
        !            32:              asm("ldd _dbl_value_1");
        !            33:              asm("muld _dbl_value_2");
        !            34:              asm("cvdl _index2");
        !            35:              asm("nop");
        !            36:              if( (index2 >= -99) && (index2 <= 99) ) { 
        !            37:                   if( index2 ) {
        !            38:                        sgl_value_5 = 0;        /* set a dummy index */
        !            39:                        adr_dpipe_ops[sgl_value_5].m = 0;
        !            40:                        adr_dpipe_ops[sgl_value_5].l = 0xabadface;
        !            41:                   } else {
        !            42:                        sgl_value_5 = 6;        /* set a dummy index */
        !            43:                        adr_dpipe_ops[sgl_value_5].m = 0xabadbabe;
        !            44:                        adr_dpipe_ops[sgl_value_5].l = 0xabadface;
        !            45:                   }
        !            46:                   asm("movl _index2,r0");      /* save the index */
        !            47:                   asm("std _dpipe_ops[r0]");   /* save the Acc's value */
        !            48:                   asm("std _dbl_value_3");     /* save this value */
        !            49: /*
        !            50:  *  This is the start of the LOOP ON ERROR section
        !            51: */
        !            52:                   asm("_pipe18_1_lp:");
        !            53:                   asm("movl _sgl_value_5,r0"); /* save the bum index */
        !            54:                   asm("ldd _dbl_value_1");     
        !            55:                   asm("muld _dbl_value_2");
        !            56:                   asm("cvdl r0");              /* set up the index to use */
        !            57:                   asm("subd _dpipe_ops[r0]");  /* subtract saved value */
        !            58:                   asm("std _dbl_st_acc");
        !            59:                   asm("movl r0,_sgl_value_6"); /* save the index used */
        !            60:                   if( force_loop ) 
        !            61:                        asm("brb _pipe18_1_lp");;       /* loop on the error */
        !            62: /*
        !            63:  *   Verify the results (the accumulator should be = 0) 
        !            64: */
        !            65:                   if( (dbl_st_acc.m) || (dbl_st_acc.l) ) {
        !            66:                         errcnt++;              /* bump the error count    */
        !            67:                         if ( prt_error ) 
        !            68:                             pipe18_print();    /* print the error mesage  */
        !            69:                         if ( halt_flg )
        !            70:                             pipe18_halt( 1 );  /* halt on the error       */
        !            71:                         if ( loop_on_err )  {
        !            72:                             force_loop = TRUE;
        !            73:                             asm("jmp _pipe18_1_lp");;   
        !            74:                         }
        !            75:                   }
        !            76:              }
        !            77:        } 
        !            78:        asm("jmp *return");             /* return to the test monitor       */
        !            79: }
        !            80: 
        !            81: 
        !            82: 
        !            83: 
        !            84: /*
        !            85:  **************************************************************************
        !            86:  *
        !            87:  *             print an error message of the form
        !            88:  *
        !            89:  * cycle: xx  Test xx, Error with subtract data based on CVDL value, index = xx
        !            90:  * test sequence = LDD(op1), MULD(op2), CVDL r0, SUBD operand[r0], STD
        !            91:  *operand 1 = xxxxxxx xxxxxxx,    final Acc = xxxxxxx xxxxxxx,  index = xxxxxxx
        !            92:  *operand 2 = xxxxxxx xxxxxxx, expected Acc = xxxxxxx xxxxxxx
        !            93:  *operand 3 = xxxxxxx xxxxxxx,  CVDL result = xxxxxxx
        !            94:  *                             int expected = xxxxxxx
        !            95:  **************************************************************************
        !            96: */
        !            97: pipe18_print()
        !            98: {
        !            99:         writes(" \n");         /* start a new print line   */
        !           100:         writes("cycle: ");
        !           101:         writed( cycle );
        !           102:         writes("  Test ");
        !           103:         writed( test_no );
        !           104:         writes("  (Pipe 18),  error\n");
        !           105:         writes(" LDD(op1), MULD(op2), CVDL(r0), SUBD(op3), STD\n");
        !           106:         writes("operand 1 = ");
        !           107:         write32h( dbl_value_1.m );
        !           108:         writec(' ');
        !           109:         write32h( dbl_value_1.l );
        !           110:         writes(",    final Acc = ");
        !           111:         write32h( dbl_st_acc.m );
        !           112:         writec(' ');
        !           113:         write32h( dbl_st_acc.l );
        !           114:         writes(",  index = ");
        !           115:         writed( index );
        !           116:         writes("\noperand 2 = ");
        !           117:         write32h( dbl_value_2.m );
        !           118:         writec(' ');
        !           119:         write32h( dbl_value_2.l );
        !           120:         writes(", expected Acc = ");
        !           121:         write32h( dbl_expected.m );
        !           122:         writec(' ');
        !           123:         write32h( dbl_expected.l );
        !           124:         writes("\noperand 3 = ");
        !           125:         write32h( dbl_value_3.m );
        !           126:         writec(' ');
        !           127:         write32h( dbl_value_3.l );
        !           128:         writes(",  CVDL result = ");
        !           129:         write32h( sgl_value_6 );
        !           130:         writec('\n');
        !           131:         writes("                               int expected = ");
        !           132:         write32h( index2 );
        !           133:         writec('\n');
        !           134: }
        !           135: 
        !           136: 
        !           137: 
        !           138: /*
        !           139:  **************************************************************************
        !           140:  *
        !           141:  *             HALT ON AN ERROR
        !           142:  *
        !           143:  **************************************************************************
        !           144: */
        !           145: pipe18_halt()
        !           146: {
        !           147:         sgl_value_1 = dbl_value_1.m;
        !           148:         sgl_value_2 = dbl_value_1.l;
        !           149:         sgl_value_3 = dbl_value_2.m;
        !           150:         sgl_value_4 = dbl_value_2.l;
        !           151:         asm("movl _test_no,r0");       /* r0  = test number           */
        !           152:         asm("movl $1,r1");             /* r1  = subtest number        */
        !           153:         asm("movl $1,r2");             /* r2  = error code            */
        !           154:         asm("movl _cycle,r3");         /* r3  = cycle count           */
        !           155:         asm("movl _sgl_value_1,r4");   /* r4  = MS of dbl operand #1  */
        !           156:         asm("movl _sgl_value_2,r5");   /* r5  = LS of dbl operand #1  */
        !           157:         asm("movl _sgl_value_3,r6");   /* r6  = MS of dbl operand #2  */
        !           158:         asm("movl _sgl_value_4,r7");   /* r7  = LS of dbl operand #2  */
        !           159:         sgl_value_1 = dbl_st_acc.m;
        !           160:         sgl_value_2 = dbl_st_acc.l;
        !           161:         sgl_value_3 = dbl_expected.m;
        !           162:         sgl_value_4 = dbl_expected.l;
        !           163:         sgl_value_5 = dbl_value_3.m;
        !           164:         sgl_value_6 = dbl_value_3.l;
        !           165:         asm("movl _sgl_value_5,r8");   /* r8  = MS of dbl operand #3  */
        !           166:         asm("movl _sgl_value_6,r9");   /* r9  = LS of dbl operand #3  */
        !           167:         asm("movl _sgl_value_1,r10");  /* r10 = MS of final result    */
        !           168:         asm("movl _sgl_value_2,r11");  /* r11 = LS of final result    */
        !           169:         asm("movl _sgl_value_3,r12");  /* r12 = MS of expected result */
        !           170:         asm("movl _sgl_value_4,r13");  /* r13 = LS of expected result */
        !           171:         asm("movl _index,r14");        /* r14 = data index            */
        !           172:         asm("halt");                   /* HALT ...                    */
        !           173: }  
        !           174: 

unix.superglobalmegacorp.com

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