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


#include "dmp_defs.h"

/***********************************************************************
*
*   Verify results after a single precision TSTF or CMPF(2) instruction
*
*  The final PSL value is compared to the expected value. Also, the
*  final accumulator and the registers are checked to make sure that 
*  they weren't modified.
***********************************************************************/
chk_sgl_psl()
{
	sgl_ld_acc   = dbl_ld_acc.m;		/* move the data to */
	sgl_st_acc   = dbl_st_acc.m;		/*   the sgl data   */
	sgl_expected = dbl_expected.m;		/*      operands  */
	sgl_value_1 = dbl_value_1.m;
	sgl_value_2 = dbl_value_2.m;
	if( sgl_ld_acc & 0x7f800000 )		/* get final ACC expected */
	     sgl_value_5 = sgl_ld_acc;
	 else
	     sgl_value_5 = 0;
	exp_psl = init_psl;			/* get the initial PSL      */
	exp_psl &= 0xffffff71;			/* clear DBL & flag bits    */
	exp_psl |= PSL_C;			/* set the CARRY bit        */
	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 )
	{
	    errcnt++;
	    if( prt_error )
		 prt_s_psl_e( bad_psl_msg );
	    if( halt_flg )
		 hlt_s_psl_e( 1 );		/* error code 1 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else if( no_page_faults != exp_page_faults ) {
	    errcnt++;
	    if( prt_error )
		 prt_s_psl_e( trans_flt_cnt_msg );
	    if( halt_flg )
		 hlt_s_psl_e( 2 );		/* error code 2 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else if( sgl_st_acc != sgl_value_5 ) {
	    errcnt++;
	    if( prt_error )
		 prt_s_psl_e( acc_modified_msg );
	    if( halt_flg )
		 hlt_s_psl_e( 3 );		/* error code 3 */
	    if( loop_on_err )
		 force_loop = TRUE;		/* set loop flag */
	}
	 else {
	    reg_no = 0;
	    regs_ok = TRUE;
	    while( (reg_no <= 13) && (regs_ok) )  /* check 1st 13 regs */
		if( store_regs[ reg_no ] == exp_regs[ reg_no ] )
		    reg_no++;
		else
		    regs_ok = FALSE;
	    if( !regs_ok )
	    {
	        errcnt++;
	        if( prt_error )
		     prt_s_psl_e( reg_modified_msg );
	        if( halt_flg )
		     hlt_s_psl_e( 4 );		/* error code 4 */
	        if( loop_on_err )
		     force_loop = TRUE;		/* set loop flag */
	    }
	} 
}




/************************************************************************
*		CHK_SGL_PSL
*
* cycle: xx. DMP test xx. <inst>. <error message>, index = xx
* addressing mode: <addressing mode description>
* inst buf= xx xx xx xx xx xx xx xx xx xx xx -page faults on byte(s) 0, x 
* initial Acc = xxxxxxxx,  operand 1 = xxxxxxxx,   xx page faults occurred
*   final Acc = xxxxxxxx,  operand 2 = xxxxxxxx,   xx page faults expected
* initial PSL = xxxxxxxx,   final PSL = xxxxxxxx,  expected PSL = xxxxxxxx
************************************************************************/
prt_s_psl_e( message )
char *message;
{
	prt_dmp_er_msg( message );		/* print the error header */
	writes("initial Acc = ");
	write32h( sgl_ld_acc );			/* print Acc loaded */
	if( no_ops ) {
	    writes(",  operand 1 = ");
	    write32h( sgl_value_1 );		/* write op 1 data */
	}
	writes(",   ");
	writed( no_page_faults );		/* print # page faults */
	writes(" page faults occurred\n");
	writes("  final Acc = ");		/* print final Acc data */
	write32h( sgl_st_acc );
	if( no_ops == 2 ) {
	    writes(",  operand 2 = ");
	    write32h( sgl_value_2 );		/* write op 2 data */
	    writec(',');
	} else if( no_ops == 1 )
	    writes(",                       ");	/* (only 1 operand)  */
	else
	    writec(',');			/* (there were no operands) */
	writes("   ");
	writed( exp_page_faults );		/* print # page faults */
	writes(" page faults expected\n");
	writes("initial PSL = ");			/* print PSL data */
	write32h( init_psl );
	writes(",   final PSL = ");
	write32h( psl_val );
	writes(",  expected PSL = ");
	write32h( exp_psl );
	writec('\n');
	if( message == reg_modified_msg )	/* print modified register */
	    prt_reg_data();			/* print bad register      */
}



/**************************************************************************
*	Set up the registers and halt
**************************************************************************/
hlt_s_psl_e( code )
int code;
{
	sgl_dummy1 = code;
	asm("movl _test_no,r0");		/* r0  = test number       */
	asm("movl _addr_code,r1");		/* r1  = addressing mode   */
	asm("movl _sgl_dummy1,r2");		/* r2  = error code        */
	asm("movl _cycle,r3");			/* r3  = cycle count       */
	asm("movl _sgl_ld_acc,r4");		/* r4  = initial Acc.      */
	if( no_ops )
	    asm("movl _sgl_value_1,r5");	/* r5  = operand 1         */
	else
	    asm("clrl r5");;
	if( no_ops == 2 )
	    asm("movl _sgl_value_2,r6");	/* r6  = operand 2         */
	else
	    asm("clrl r6");;
	asm("movl _init_psl,r7");		/* r7  = initial psl       */
	asm("movl _psl_val,r8");		/* r8  = final psl         */
	asm("movl _exp_psl,r9");		/* r9  = expected psl      */
	if( code == 2 ) {
	    asm("movl _no_page_faults,r10");	/* r10 = # page faults     */
	    asm("movl _exp_page_faults,r11");	/* r11 = # faults expected */
	}
	 else if( code == 3 )			/*  or  */
	    asm("movl _sgl_st_acc,r10");	/* r10 = final Acc.        */
	 else					/*  or  */
	{
	    asm("movl _reg_no,r10");		/* r10 = bad register #    */
	    asm("movl _store_regs[r10],r11");	/* r11 = final (bad) value */
	    asm("movl _exp_regs[r10],r12");	/* r12 = expected value    */
	}
	asm(".globl _hlt_sgl_psl");
	asm("_hlt_sgl_psl:");
	asm("halt");
}


unix.superglobalmegacorp.com

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