File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / entry / movz.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b


/*		constants definition for mzeroextended instruction	*/
/*									*/
/*									*/

#define		MOVZBW		0xb9		/*opcodes		*/
#define		MOVZBL		0xa9
#define		MOVZWL		0xc3

extern long scoplp;
extern long force_lp;

asm(".set PSWMASK,0xf");

#define		MAX_PATTERNS	2

#define		IDESTB1		0xaaaaaa00	/*destination		*/
						/*initial values	*/
#define		IDESTB2		0xaaaaaaaa
#define		IDESTW1		0xffff0000
#define		IDESTW2		-1

#define		SB1		0xaaaaaaff	/*source values		*/
#define		SB2		0xaaaaaa00
#define		SW1		-1
#define		SW2		0xffff0000

#define		EDESTBW1	0xaaaa00ff	/*expected destination	*/
#define		EDESTBW2	0xaaaa0000

#define		EDESTBL1	0x000000ff
#define		EDESTBL2	0

#define		EDESTWL1	0x0000ffff
#define		EDESTWL2	0

#define		FLG1		14		/*initial flags		*/
#define		FLG2		1

#define		EFLG1		1		/*expected flags	*/
#define		EFLG2		5

#define		ERROR1			1	  /*error definitions	*/
#define		ERROR2			2
#define		ERROR3			3
#define		ERROR4			4
#define		ERROR5			5
						  /*error messages	*/

/*		standard definition file				*/
/*		for 'C' diagnostic porgrams.				*/
/*									*/
/*									*/
#define		HIGH		31
#define		IPL		18
#define		PSWMASK		255
#define		FLAGS		0x0000000f





/*	Global variables for movz test					*/
/*									*/
/*									*/

static long	index = 0;
static long	dest = 0;	/*destination location			*/
static long	source = 0;	/*source location			*/
static long	psw;		/*processor status word			*/

static long	flag_value[MAX_PATTERNS] = {FLG1,FLG2};
				/*flag values for initialization	*/

static long	error_count = 0;


static long	expbw[MAX_PATTERNS] = {EDESTBW1,EDESTBW2};
				/*expected values			*/

static long	expbl[MAX_PATTERNS] = {EDESTBL1,EDESTBL2};
static long	expwl[MAX_PATTERNS] = {EDESTWL1,EDESTWL2};


static long	exp_psw[MAX_PATTERNS] = {EFLG1,EFLG2};
				/*expected psw				*/

static long	sourceb[MAX_PATTERNS] = {SB1,SB2};
				/*source values				*/

static long	sourcew[MAX_PATTERNS] = {SW1,SW2};

static	long	destb[MAX_PATTERNS] = {IDESTB1,IDESTB2};
static	long	destw[MAX_PATTERNS] = {IDESTW1,IDESTW2};


static char *title;
movz()
{
	asm("movl	$2,_no_opr");
	title = "** MOVZ_WL **\n";
	movzwl();
	title = "** MOVZ_BW **\n";
	movzbw();
	title = "** MOVZ_BL **\n";
	movzbl();
	asm("jmp *return");
}


static movzwl()	/* move zero extended word to long test */
{
   asm("bicpsw	$PSWMASK");		/*psw = 0*/
      for(index=0; index<MAX_PATTERNS; index++)
	  {
          t_movzwl();
      	  t_movzwl1();		/* Special case : dest. addr = src addr  */
          }
}

static	t_movzwl()		/*single test called by main test*/
{
	long *lptr, exp_dest, op1, op2, exp_flg;

	for (;;)
	  {
	   setjmp();
	   asm("m1:	movab	m1,_stpc");
	   asm("movl	$1,_subtst");
	   lptr = destw+index; 
	   op2 = dest = *lptr;		/* Use pointer instead of index */
	/*   dest = destw[index];  */
	   lptr = sourcew+index;
	   op1 = source = *lptr;
	/*  source = sourcew[index];  */
	   asm("movw	_index,r10"); 
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzwl	_source+2,_dest"); /* memory to memory */
	   asm("movpsl	_psw");		/* save psw	*/
	   psw &= FLAGS;		/* Get flag bits  */
	   lptr = expwl+index;
	   exp_dest = *lptr;
	   if (dest != exp_dest)
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(dest,exp_dest,op1,op2); 
	       }
	   if (source != op1)
	       {
	       asm("movl	$3,_ercode");
	       if (scoplp) longjmp();
	       error(source,op1,op1,op2);
	       }
	   lptr = exp_psw+index;
	   exp_flg = *lptr; 
	   if (psw != exp_flg)
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_flg,op1,op2,exp_flg,psw); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	/*no error exit*/ 
          }
}

static	t_movzwl1()
{
	long *lptr, op1, op2, exp_dest, exp_flg;

	for (;;)
	  {
	   setjmp();
	   asm("m2:	movab	m2,_stpc");
	   asm("movl	$2,_subtst");
	   lptr = sourcew+index;
	   op1 = source = *lptr; 
	/*   source = sourcew[index];  */
	   asm("movw	_index,r10"); 
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzwl	_source+2,_source");  /* register to memory */
	   asm("movpsl	_psw");			/* Save psw	*/
	   psw &= FLAGS;			/* Get flags	*/
	   lptr = expwl+index;
	   exp_dest = *lptr;
	   if (source != exp_dest)
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(source,exp_dest,op1,op1);
	       }
	   lptr = exp_psw+index;
	   exp_flg = *lptr; 
	   if (psw != exp_flg)
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_flg,op1,op1); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	/*no error exit*/ 
          }
}



static movzbw()	/* move zero extended byte to word test */
{
   asm("bicpsw	$PSWMASK");		/*psw = 0*/
      for (index = 0; index < MAX_PATTERNS; index++)
	  {
           t_movzbw ();
      	   t_movzbw1();		/*one more test where			*/
				/* dest address = source address	*/
      	   t_movzbw2();		/*one more test where			*/
				/*  register to register */
          }
}


static t_movzbw()
{

	for (;;)
	  { 
	   setjmp();
	   asm("m3:	movab	m3,_stpc");
	   asm("movl	$3,_subtst");
	   dest = destb[index];	/*initialize destination, source, & psw	*/
	   source = sourceb[index];
	   asm("movw	_index,r10"); 
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzbw	_source+3,_dest+2"); /* memory to memory */
	   asm("movpsl	_psw");	/*save psw				*/
	   psw &= FLAGS;	/*mask out all bits except flag bits	*/
	   if (dest != expbw[index])
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(dest,expbw[index],source,destb[index],expbw[index],dest); 
	       }
	   if (source != sourceb[index])
	       {
	       asm("movl	$3,_ercode");
	       if (scoplp) longjmp();
	       error(source,sourceb[index],source,destb[index]); 
	       }
	   if (psw != exp_psw[index])
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_psw[index],source,destb[index]); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);
          }
}



static t_movzbw1()
{

	for (;;)
	  { 
           			/*initialize  source, & psw	*/
	   setjmp();
	   asm("m4:	movab	m4,_stpc");
	   asm("movl	$4,_subtst");
	   source = sourceb[index];
	   asm("movw	_index,r10"); 
	   asm("movl	_source,r5"); /* load source register */
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzbw	_source+3,_source+2");
	   asm("movpsl	_psw");	/*save psw				*/
	   psw &= FLAGS;	/*mask out all bits except flag bits	*/
	   if (source != expbw[index])
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(source,expbw[index],sourceb[index],sourceb[index]); 
	       }
	   if (psw != exp_psw[index])
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_psw[index],sourceb[index],sourceb[index]); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	 
          }
}

static t_movzbw2()
{

	for (;;)
	  { 
           			/*initialize  source, & psw	*/
	   setjmp();
	   asm("m5:	movab	m5,_stpc");
	   asm("movl	$5,_subtst");
	   source = sourceb[index];
	   asm("movw	_index,r10"); 
	   asm("movl	_source,r5"); /* load source register */
	   asm("movl	_source,r6"); /* load dest register */
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzbw	_source+3,_source+2");
	   asm("movpsl	_psw");	/*save psw				*/
	   psw &= FLAGS;	/*mask out all bits except flag bits	*/
	   if (source != expbw[index])
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(source,expbw[index],sourceb[index],sourceb[index]); 
	       }
	   if (psw != exp_psw[index])
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_psw[index],sourceb[index],sourceb[index]); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	 
          }
}

static movzbl()
{
   asm("bicpsw	$PSWMASK");		/*psw = 0*/
      for (index = 0; index < MAX_PATTERNS; index++)
	  {
           t_movzbl ();
      	   t_movzbl1();		/*one more test where			*/
				/* dest address = source address	*/
          }
}

static t_movzbl()
{

	for (;;)
	  { 
	   setjmp();
	   asm("m6:	movab	m6,_stpc");
	   asm("movl	$6,_subtst");
	   dest = destb[index];	/*initialize destination, source, & psw	*/
	   source = sourceb[index];
	   asm("movw	_index,r10"); 
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
	   asm("movzbl	_source+3,_dest"); /* memory to memory */
	   asm("movpsl	_psw");	/*save psw				*/
	   psw &= FLAGS;	/*mask out all bits except flag bits	*/
	   if (dest != expbl[index])
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(dest,expbl[index],source,destb[index]); 
	       }
	   if (source != sourceb[index])
	       {
	       asm("movl	$3,_ercode");
	       if (scoplp) longjmp();
	       error(source,sourceb[index],source,destb[index]); 
	       }
	   if (psw != exp_psw[index])
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_psw[index],source,destb[index]); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	/*no error exit*/ 
          }
}



static t_movzbl1()
{
	for (;;)
	  { 
           			/*initialize  source, & psw	*/
	   setjmp();
	   asm("m7:	movab	m7,_stpc");
	   asm("movl	$7,_subtst");
	   source = sourceb[index];
	   asm("movw	_index,r10"); 
	   asm("movl	_source,r5"); /* load source register */
	   asm("bicpsw	$PSWMASK");
	   asm("bispsw	_flag_value[r10]");
				/*execute movz instruction		*/
	   asm("movzbl	_source+3,_source"); /* register to memory */
	   asm("movpsl	_psw");	/*save psw				*/
	   psw &= FLAGS;	/*mask out all bits except flag bits	*/
	   if (source != expbl[index])
	       {
	       asm("movl	$1,_ercode");
	       if (scoplp) longjmp();
	       error(source,expbl[index],sourceb[index],sourceb[index]); 
	       }
	   if (psw != exp_psw[index])
	       {
	       asm("movl	$2,_ercode");
	       if (scoplp) longjmp();
	       error(psw,exp_psw[index],sourceb[index],sourceb[index]); 
	       }
	       if (force_lp) longjmp();
    	   else
		return(0);	/*no error exit*/ 
          }
}



unix.superglobalmegacorp.com

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