File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / macro4 / cmpf.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:30:56 2019 UTC (7 years ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

#include "fpp_defs.h"



/***************************************************************************
*
*       CMPF  -COMPARE SGL ACCUMULATOR TO SGL OPERAND
*
*****************************************************************************/
cmpf()
{
        asm(".globl _cmpf_t");
        asm("_cmpf_t:");                        /* entry address            */
        if( ( cycle == 1 ) && ( prt_hdrs ) )    /* print headers on 1st pass */
        {
           writes(" CMPF");
        }
        cmpf_1();                               /* test via registers         */
        cmpf_2();                               /* test via cache             */
        cmpf_3();                               /* register corruption test   */
        cmpf_4();                               /* acc. corruption test       */
	if( !no_fpp_wcs ) {
             cmpf_5();                          /* pipelined entry test       */
             cmpf_6();                          /* pipelined exit test        */
        };
	asm("jmp *return");                     /* return to the test monitor */
}
  


/****************************************************************************
*
*               SUBTEST 1 - CMPF status test  -register data
*
****************************************************************************/
cmpf_1() 
{
        force_loop = FALSE;
        subtest = 1;
	index = 0;
        do 
        {
           sgl_value_1  = cmpf_1_data[index].one; /* get the data operands  */
           sgl_value_2  = cmpf_1_data[index].two;
           sgl_expected = cmpf_1_data[index].flag; /* get expected results */
           status_index = 0;	                   /* clear the status index */
           do
           {
               sgl_dummy1 = status_array[status_index]; /* array = +, -, 0  */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
               asm("_cmpf_1_lp1:");
               asm("movl _sgl_value_1,r4");     /* move operand #1 to r4    */
               asm("movl _sgl_value_2,r5");     /* move operand #2 to r5    */
               asm("ldf r4");                   /* load the 1st operand     */
               asm("tstl _sgl_dummy1");         /* generate initial status  */
               asm("movpsl _init_psl");         /* save the initial status  */
               asm("cmpf r5");                  /* compare the operands     */
               asm("movpsl _psl_val");          /* save the final status    */
               asm("stf _sgl_st_acc");          /* save the final acc       */
               if( force_loop )                 /* loop?                    */
                   asm("brb _cmpf_1_lp1");;     /* run the loop again       */
               exp_psl = init_psl;              /* get the initial PSL      */
               exp_psl &= 0xfffffff3;           /* clear ZERO, NEGATIVE     */
               if( sgl_expected == ZERO )
                   exp_psl |= PSL_Z;            /* expect the ZERO bit set  */
               if( sgl_expected == NEGATIVE )
                   exp_psl |= PSL_N;            /* expect the NEG bit set   */
               if( psl_val != exp_psl )   {     /* COMPARE the values       */
                  errcnt++;                     /* bump the error count     */
                  if ( prt_error ) {
                     writes(" \n");      /* start a new print line   */
                     writes("cycle: ");
                     writed( cycle );
                     writes("  CMPF test ");
		     writed( test_no );
		     writes(", subtest 1 (Reg. Data) - BAD FINAL PSL\n");
                     print_cmpf_data();
                     writes(",  data index = ");
                     writed( index );
                     writec('\n');
                     writes("initial PSL = ");
                     write32h( init_psl );
                     writes(", final PSL = ");
                     write32h( psl_val );
                     writes(", expected PSL = ");
                     write32h( exp_psl );
                     writes("\n");
                  }
                  if ( halt_flg )
                     cmpf_er_halt( BAD_PSL_HLT ); /* halt on the error      */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_1_lp1");    /* and loop on the error   */
                  }   /* end of loop on error    */
               }   /* end of compare error    */
            }  while ( ++status_index < 3 ); /* end of PSL WHILE loop */
        } while( index++ < max_cmpf_1_index);/* end of data loop      */
}  /* end of subtest 1 */
  


/****************************************************************************
*
*               SUBTEST 2 - CMPF status test  -cache data
*
****************************************************************************/
cmpf_2() 
{
        force_loop = FALSE; 
	subtest = 2;
	index = 0;
        do 
        {
           sgl_value_1  = cmpf_1_data[index].one; /* get the data operands  */
           sgl_value_2  = cmpf_1_data[index].two;
           sgl_expected = cmpf_1_data[index].flag;/* get expected results */
           status_index = 0;                      /* clear the status index */
           do
           {
               sgl_dummy1 = status_array[status_index]; /* array = +, -, 0  */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
               asm("_cmpf_2_lp1:");
               asm("ldf _sgl_value_1");         /* load the 1st operand     */
               asm("tstl _sgl_dummy1");         /* generate initial status  */
               asm("movpsl _init_psl");         /* save the initial status  */
               asm("cmpf _sgl_value_2");        /* compare the operands     */
               asm("movpsl _psl_val");          /* save the final status    */
               asm("stf _sgl_st_acc");          /* save the final acc       */
               if( force_loop )                 /* loop?                    */
                   asm("brb _cmpf_2_lp1");;     /* run the loop again       */
               exp_psl = init_psl;              /* get the initial PSL      */
               exp_psl &= 0xfffffff3;           /* clear ZERO, NEGATIVE     */
               if( sgl_expected == ZERO )
                   exp_psl |= PSL_Z;            /* expect the ZERO bit set  */
               if( sgl_expected == NEGATIVE )
                   exp_psl |= PSL_N;            /* expect the NEG bit set   */
               if( psl_val != exp_psl ) {       /* COMPARE the values       */
                  errcnt++;                     /* bump the error count     */
                  if ( prt_error ) {
                     writes(" \n");      /* start a new print line   */
                     writes("cycle: ");
                     writed( cycle );
                     writes("  CMPF test ");
		     writed( test_no );
		     writes(", subtest 2 (Cache Data) - BAD FINAL PSL\n");
                     print_cmpf_data();
                     writes(",  data index = ");
                     writed( index );
                     writec('\n');
                     writes("initial PSL = ");
                     write32h( init_psl );
                     writes(", final PSL = ");
                     write32h( psl_val );
                     writes(", expected PSL = ");
                     write32h( exp_psl );
                     writes("\n");
                  }
                  if ( halt_flg ) 
                     cmpf_er_halt( BAD_PSL_HLT );   /* halt on the error   */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_2_lp1");    /* and loop on the error   */
                  }   /* end of loop on error    */
               }  /* end of compare error */
            }  while ( ++status_index < 3 ); /* end of PSL WHILE loop */
        } while( index++ < max_cmpf_1_index);/* end of data loop      */
}  /* end of subtest 2 */
  


/************************************************************************
*
*       SUBTEST 3 - Check for register corruption
*
************************************************************************/
cmpf_3() 
{
        force_loop = FALSE;                     /* clear force_loop flg   */
        subtest = 3;
	fill_reg_buf( load_regs );              /* get pattern for regs   */
	index = 0;
        do 
        {
             sgl_value_1  = cmpf_1_data[index].one;   /* data to load    */
             sgl_value_2  = cmpf_1_data[index].two;   /* data to compare */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
             asm("_cmpf_3_lp1:");
             asm("ldf _sgl_value_1");           /* LOAD the accumulator  */
             asm("nop");
	     asm("loadr $0x1fff,_load_regs");   /* load regs 0 - 12       */
             asm("nop");
             asm("cmpf _sgl_value_2");          /* test the values        */
             asm("nop");
             asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
             asm("stf _sgl_st_acc");            /* save the final acc       */
             if( force_loop )                   /* loop?                    */
                   asm("brb _cmpf_3_lp1");;     /* run the loop again       */
/*
 * Now compare the stored register values to those that were loaded
*/
             index2 = 0;
             while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) )
                  index2++;                     /* check reg values */
             if( index2 < 13 )  {               /* error if index2 < 13 */
                  errcnt++;                     /* bump the error count */
                  if ( prt_error ) {
                       writes(" \n");      /* start a new print line   */
                       writes("cycle: ");
                       writed( cycle );
                       writes(", CMPF test ");
		       writed( test_no );
	writes(", subtest 3 - A REGISTER WAS MODIFIED\n");
                       print_cmpf_data();       /* print the operands      */
                       writes("\n");
                       writes("register ");     /* print the information   */
                       writed( index2 );        /*    about the corrupted  */
                       writes(" = ");           /*        register         */
                       write32h( store_regs[index2] );
                       writes(",  should be = ");
                       write32h( load_regs[index2] );
                       writes("\n");
		       }
                  if ( halt_flg )               /* halt on error? */
                       cmpf_er_halt( BAD_REG_HLT );    /* PC after the halt */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_3_lp1");    /* and loop on the error   */
                  }   /* end of loop on error    */
             }    /* end of register corruption error */
        } while( index++ < max_cmpf_1_index);/* end of data loop      */
}  /* end of subtest 3 */
  


/************************************************************************
*
*       SUBTEST 4 - Check for accumulator corruption
*
************************************************************************/
cmpf_4() 
{
        force_loop = FALSE;                         /* clear force_loop flg */
        index = 0;
        do 
        {
             sgl_value_1   = cmpf_1_data[index].one; /* data to load */
             sgl_value_2   = cmpf_1_data[index].two;
              if( sgl_value_1 & 0x7f800000 )
                  sgl_expected = sgl_value_1;  	/* expected = loaded */
             else 
                  sgl_expected = 0;		/* expect a '0' stored */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
             asm("_cmpf_4_lp1:");
             asm("ldf _sgl_value_1");           /* LOAD the accumulator  */
             asm("cmpf _sgl_value_2");          /* test the values       */
             asm("stf _sgl_st_acc");            /* store the accumulator */
             if( force_loop )                   /* loop?                    */
                   asm("brb _cmpf_4_lp1");;     /* run the loop again       */
             if( sgl_st_acc != sgl_expected )   /* COMPARE the values */
             {
                  errcnt++;                     /* bump the error count */
                  if ( prt_error ) {
                       writes(" \n");      /* start a new print line   */
                       writes("cycle: ");
                       writed( cycle );
                       writes("  CMPF test ");
		       writed( test_no );
	       writes(", subtest 4 (Cache Data) - THE ACC WAS MODIFIED\n");
                       print_cmpf_data();
                       writes(",  data index = ");
                       writed( index );
                       writec('\n');
                       writes("  final Acc = ");
                       write32h( sgl_st_acc );
                       writes(",  Acc expected = ");
                       write32h( sgl_expected );
                       writec('\n');
                  }
                  if ( halt_flg )               /* halt on error? */
                       cmpf_er_halt( BAD_ACC_HLT ); /* halt on the error */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_4_lp1");    /* and loop on the error   */
                  }   /* end of loop on error    */
             }   /* end of compare error    */
        } while( index++ < max_cmpf_1_index);/* end of data loop      */
}  /* end of subtest 4 */
  


/****************************************************************************
*
*               SUBTEST 5 - CMPF status test  - piped entry
*
****************************************************************************/
cmpf_5() 
{
        force_loop = FALSE; 
	subtest = 5;
	index = 0;
        do 
        {
           sgl_value_1  = cmpf_1_data[index].one; /* get the data operands  */
           sgl_value_2  = cmpf_1_data[index].two;
           sgl_expected = cmpf_1_data[index].flag;/* get expected results */
           status_index = 0;                      /* clear the status index */
           do
           {
               sgl_dummy1 = status_array[status_index]; /* array = +, -, 0  */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
               asm("_cmpf_5_lp1:");
               asm("movl $0,r0");               /* clear r0                 */
               asm("ldf r0");                   /* load the accumulator     */
               asm("addf _sgl_value_1");        /* add the 1st operand      */
               asm("tstl _sgl_dummy1");         /* generate initial status  */
               asm("movpsl _init_psl");         /* save the initial status  */
               asm("cmpf _sgl_value_2");        /* compare the operands     */
               asm("movpsl _psl_val");          /* save the final status    */
               asm("stf _sgl_st_acc");          /* save the final acc       */
               if( force_loop )                 /* loop?                    */
                   asm("brb _cmpf_5_lp1");;     /* run the loop again       */
               exp_psl = init_psl;              /* get the initial PSL      */
               exp_psl &= 0xfffffff3;           /* clear ZERO, NEGATIVE     */
               if( sgl_expected == ZERO )
                   exp_psl |= PSL_Z;            /* expect the ZERO bit set  */
               if( sgl_expected == NEGATIVE )
                   exp_psl |= PSL_N;            /* expect the NEG bit set   */
               if( psl_val != exp_psl ) {       /* COMPARE the values       */
                  errcnt++;                     /* bump the error count     */
                  if ( prt_error ) {
                     writes(" \n");         /* start a new print line   */
                     writes("cycle: ");
                     writed( cycle );
                     writes("  CMPF test ");
		     writed( test_no );
		     writes(", subtest 5 (Piped Entry) - BAD FINAL PSL\n");
                     print_cmpf_data();
                     writes(",  data index = ");
                     writed( index );
                     writec('\n');
                     writes("initial PSL = ");
                     write32h( init_psl );
                     writes(",  final PSL = ");
                     write32h( psl_val );
                     writes(",  expected PSL = ");
                     write32h( exp_psl );
                     writes("\n");
                  }
                  if ( halt_flg ) 
                     cmpf_er_halt( BAD_PSL_HLT );   /* halt on the error   */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_5_lp1");    /* and loop on the error   */
                  }   /* end of loop on error    */
               }  /* end of compare error */
            }  while ( ++status_index < 3 ); /* end of PSL WHILE loop */
        } while( index++ < max_cmpf_1_index);/* end of data loop      */
}  /* end of subtest 5 */
  


/****************************************************************************
*
*               SUBTEST 6 - CMPF status test  -piped exit 
*
****************************************************************************/
cmpf_6() 
{
        force_loop = FALSE; 
	subtest = 2;
	index = 0;
        do 
        {
             sgl_value_1   = cmpf_1_data[index].one; /* data to load */
             sgl_value_2   = cmpf_1_data[index].two;
              if( sgl_value_1 & 0x7f800000 )
                  sgl_expected = sgl_value_1;  	/* expected = loaded */
             else 
                  sgl_expected = 0;		/* expect a '0' stored */
/*
 * If LOOP ON ERROR is set, this is the loop for this subtest.
 * The force loop flag is set after the first error.
*/
               asm("_cmpf_6_lp1:");
               asm("movl $0,r0");               /* clear r0                 */
               asm("ldf _sgl_value_1");         /* load the 1st operand     */
               asm("cmpf _sgl_value_2");        /* compare the value        */
               asm("addf r0");                  /* add a zero to the acc    */
               asm("stf _sgl_st_acc");          /* save the accumulator     */
               if( force_loop )                 /* loop?                    */
                   asm("brb _cmpf_6_lp1");;     /* run the loop again       */
               if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
                  errcnt++;                     /* bump the error count     */
                  if ( prt_error ) {
                     writes(" \n");         /* start a new print line   */
                     writes("cycle: ");
                     writed( cycle );
                     writes("  CMPF test ");
		     writed( test_no );
	     writes(", subtest 6 (Piped Exit) - THE ACC WAS MODIFIED\n");
                     print_cmpf_data();
                     writes(",  data index = ");
                     writed( index );
                     writec('\n');
                     writes("  final Acc = ");
                     write32h( sgl_st_acc );
                     writes(",  Acc expected = ");
                     write32h( sgl_expected );
                     writec('\n');
                  }
                  if ( halt_flg ) 
                     cmpf_er_halt( BAD_ACC_HLT );   /* halt on the error   */
                  if ( loop_on_err ) {
                     force_loop = TRUE;         /* set the force loop flag */
                     asm("brw _cmpf_6_lp1");    /* and loop on the error   */
                  }   /* end of loop on error */
               }  /* end of compare error */
        } while( index++ < max_cmpf_1_index);  /* end of data loop      */
}  /* end of subtest 6 */
  


/**************************************************************************
*
*       PRINT THE DATA AND STORE RESULTS
*
*  initial Acc = xxxxxxxx,     stored = xxxxxxxx,   data index = xx
*      operand = xxxxxxxx,   expected = xxxxxxxx
**************************************************************************/
print_cmpf_data()
{
        writes("initial Acc = ");
        write32h( sgl_value_1 );
        writes(",   operand = ");
        write32h( sgl_value_2 );
}
   


/**************************************************************************
*
*               HALT ON ERROR ROUTINE 
*
**************************************************************************/
cmpf_er_halt( halt_code )
int halt_code;
{
        sgl_dummy1 = halt_code;                 /* get the error type    */
        asm("movl _test_no,r0");                /* r0  = test number     */
        asm("movl _subtest,r1");                /* r1  = subtest number  */
        asm("movl _sgl_dummy1,r2");             /* r2  = error code      */
        asm("movl _cycle,r3");                  /* r3  = cycle count     */
        asm("movl _sgl_value_1,r4");            /* r4  = initial acc     */
        asm("movl _sgl_value_2,r5");            /* r5  = data compared   */
        asm("movl _psl_val,r6");                /* r6  = final PSL       */
        if( halt_code == BAD_ACC_HLT ) {
             asm("movl _sgl_st_acc,r7");        /* r7  = actual value    */
             asm("movl _sgl_expected,r8");      /* r8  = expected value  */
        } else
        if( halt_code == BAD_REG_HLT ) {
             sgl_dummy1 = load_regs[index2];
             sgl_dummy2 = store_regs[index2];
             asm("movl _index2,r7");            /* r7  = bad register #  */
             asm("movl _sgl_dummy2,r8");        /* r8  = actual value    */
             asm("movl _sgl_dummy1,r9");        /* r9  = expected value  */
        } else
          if( halt_code == BAD_PSL_HLT ) {
             asm("movl _exp_psl,r7");           /* r7  = expected PSL    */
             asm("movl _index,r7");             /* r8  = data index      */
        };
        asm("halt");                            /* HALT ...              */
}  

unix.superglobalmegacorp.com

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