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

#define error_hdl2 error

#define C	0x1
#define V	0x2
#define Z	0x4
#define N	0x8

static long error_count, SS1, SS2, SS3;

/* Some global variables 	*/
static long flag_msk, psl, divr, rem, remainder;
int ix;

/*	MOD intructions 	*/

mod()
{
	SS1 = 0;		/* Print error message */
	SS2 = 0;		/* Do not loop on error */
	modl2();
	modl3();
	modl2u();
	modl3u();
	asm("jmp *return");
}

static modl2()
{
	long exp_psw;
	int unsign, no_op;

	unsign = 0;
	no_op = 2;
	ix = 1;

	/* MOD OF 2 LONG_OPERANDS	*/
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw = N | C;
	divr = 98765;
	rem = -345678;
	modl(unsign,no_op,-49383,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 2;
	rem = -345678;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = C | N;
	asm("movl $-2,_divr");
	rem = -345679;
	modl(unsign,no_op,-1,exp_psw);

	/* check overflow bit	*/

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw = V | C | N;
	/* divide largest neg. no by -1 */
	asm("movl $-1,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);  

}

static modl2u()
{
	long  exp_psw;
	int unsign, no_op;

	unsign = 1;
	no_op = 2;
	ix = 1;

	/* MOD OF 2 UNSIGNED LONG_OPERANDS	*/
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|V|C;
	exp_psw =  C;
	divr = 0xaaaaaaaa;
	rem = 0xaaaaaaad;
	modl(unsign,no_op,3,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw =  C ;
	divr = 0xaaaaaaad;
	rem = 0xaaaaaaaa;
	modl(unsign,no_op,0xaaaaaaaa,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 2;
	rem = 0xffffff00;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw = C ;
	asm("movl $0xffffffff,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);
}

static modl3()
{
	long  exp_psw;
	int unsign, no_op;

	unsign = 0;
	no_op = 3;
	ix = 1;

	/* MOD OF 3 LONG_OPERANDS		*/
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw = N | C;
	divr = 98765;
	rem = -345678;
	modl(unsign,no_op,-49383,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 3;
	rem = -345678;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = C | N;
	asm("movl $-3,_divr");
	rem = -345679;
	modl(unsign,no_op,-1,exp_psw);

	++ix;
	/* check overflow bit	*/
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw =  V | C | N;
	/* divide largest neg. no by -1 */
	asm("movl $-1,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);  

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw = N | C;
	divr = 98765;
	rem = -345678;
	modl(unsign,no_op,-49383,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 3;
	rem = -345678;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = C | N;
	asm("movl $-3,_divr");
	rem = -345679;
	modl(unsign,no_op,-1,exp_psw);

	++ix;
	/* check overflow bit	*/
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw =  V | C | N;
	/* divide largest neg. no by -1 */
	asm("movl $-1,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);  
}

static modl3u()
{
	long  exp_psw;
	int unsign, no_op;

	unsign = 1;
	no_op = 3;
	ix = 1;

	/* MOD OF 3 UNSIGNED LONG_OPERANDS	*/
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|V|C;
	exp_psw = C;
	divr = 0xaaaaaaaa;
	rem = 0xaaaaaaad;
	modl(unsign,no_op,3,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw =  C;
	divr = 0xbbbbbbbc;
	rem =  0xbbbbbbbb;
	modl(unsign,no_op,0xbbbbbbbb,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 2;
	rem = 0xffffff00;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw = C;
	asm("movl $-1,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|V|C;
	exp_psw = C;
	divr = 0xaaaaaaaa;
	rem = 0xaaaaaaad;
	modl(unsign,no_op,3,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = Z|V|C;
	exp_psw =  C;
	divr = 0xbbbbbbbc;
	rem =  0xbbbbbbbb;
	modl(unsign,no_op,0xbbbbbbbb,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|V|C;
	exp_psw = Z | C;
	divr = 2;
	rem = 0xffffff00;
	modl(unsign,no_op,0,exp_psw);

	++ix;
	flag_msk = exp_psw = 0;
	flag_msk = N|Z|C;
	exp_psw = C;
	asm("movl $-1,_divr");
	rem = 0x80000000;
	modl(unsign,no_op,0x80000000,exp_psw);
}

static modl(unsign,no_op,exp_reslt,exp_psw)
long exp_reslt,  exp_psw;
int unsign, no_op;
{
	char *msg1, *msg2;
	long op1, op2, op3, psw;

   flag_msk = flag_msk << 16;
   op1 = divr;
   op3 = op2 = rem;
   for(;;)
        {
	if (unsign)
		{
		if (no_op==2) msg1 = "** Test MODL2U **\n";
			else msg1 = "** Test MODL3U **\n";
		}
	    else
		{
		if (no_op==2) msg1 = "** Test MODL2 **\n";
			else msg1 = "** Test MODL3 **\n";
		}

	divr = op1;
	rem = op2;

	if (unsign)
		{	/* unsigned division */
		if (no_op==2)
	  	     {
		if (ix==1){
							/* unsigned division */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2u  _divr,_rem");	/* mem to mem      */
			asm("movpsl _psl");	/* save PSL */
			remainder = rem;
			  }
		if (ix==2){
				/* unsigned division */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2u  _divr,r7");	/* mem to reg	   */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r7,_rem");		/* reload rem adres */
			remainder = rem;
			  }
		if (ix==3){
				/* unsigned division */
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2u  r6,_rem");		/* reg to mem	   */
			asm("movpsl _psl");	/* save PSL */
			remainder = rem;
			  }
		if (ix==4){
				/* unsigned division */
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2u  r6,r7");		/* reg to reg	   */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r7,_rem");		/* reload rem adres */
			remainder = rem;
			 }
		}
	     	   else
	  	{
		if (ix==1){
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  _divr,_rem,_remainder");/* mem mem mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==2){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  r6,r7,_remainder");/* reg to reg to mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==3){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  r6,r7,r8");	/* reg reg reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==4){
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  _divr,r7,r8");	/* mem reg reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==5){
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  _divr,r7,_remainder"); /* mem reg mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==6){
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  _divr,_rem,r8");	/* mem mem reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==7){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  r6,_rem,_remainder");/* reg mem mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==8){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3u  r6,_rem,r8");	/* reg mem reg	*/
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		     }
		}
	     else
		{	/* signed division */
		if (no_op==2)
	  	{
		if (ix==1){
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2  _divr,_rem");	/* mem to mem	*/
			asm("movpsl _psl");	/* save PSL */
			remainder = rem;
			 }
		if (ix==2){
			asm("movl   _rem,r7");
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2  _divr,r7");		/* mem to reg	   */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r7,_rem");		/* reload dest	   */
			remainder = rem;
			 }
		if (ix==3){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2  r6,_rem");		/* reg to mem      */
			asm("movpsl _psl");	/* save PSL */
			remainder = rem;
			 }
		if (ix==4){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg    */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl2  r6,r7");		/* reg to reg	   */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r7,_rem");		/* rload dest adres */
			remainder = rem;
			 }
		}
	     	   else
		if (ix==1){
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  _divr,_rem,_remainder"); /* mem mem mem */
			asm("movpsl _psl");		/* save PSL */
			  }
		if (ix==2){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  r6,r7,_remainder");/* reg to reg to mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==3){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  r6,r7,r8");	/* reg reg reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==4){
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  _divr,r7,r8");	/* mem reg reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==5){
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  _divr,r7,_remainder"); /* mem reg mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==6){
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  _divr,_rem,r8");	/* mem mem reg */
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		if (ix==7){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _rem,r7");		/* load rem reg	   */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  r6,_rem,_remainder");/* reg mem mem */
			asm("movpsl _psl");	/* save PSL */
			  }
		if (ix==8){
			asm("movl   _divr,r6");		/* load divr reg   */
			asm("movl   _remainder,r8"); /* load remainder reg */
			asm("bicpsw $0xf");		/* clear all flags */
			asm("bispsw _flag_msk");	/* set flags	   */
			asm("modl3  r6,_rem,r8");	/* reg mem reg	*/
			asm("movpsl _psl");	/* save PSL */
			asm("movl   r8,_remainder"); /* reload remainder */
			  }
		}
	psw =  psl & 0xf;

	/*  check flags */
	if (psw != exp_psw)  
		{
		msg2 = "** error in psw flags ... \n";
		if (!SS1) error_hdl2(msg1,msg2,op1,op2,psw,exp_psw);
			else error_count++;
		if (!SS2) break;
			else continue;
		}

	if (divr != op1)
		{
		msg2 = "** divisor get changed in modulus operation \n";
		if (!SS1) error_hdl2(msg1,msg2,op1,op2,divr,op1);
			else error_count++;
		if (!SS2) break;
			else continue;
		}
	if (no_op == 3)
		{
		if (rem != op3)
			{
			msg2="** dividend get changed in modulus operation \n";
			if (!SS1) error_hdl2(msg1,msg2,op1,op2,rem,op3);
				 else error_count++;
			if (!SS2) break;
				else continue;
			}
		}
	if (remainder != exp_reslt)
		{
		msg2 = "** incorrect result in modulus operation \n";
		if (!SS1) error_hdl2(msg1,msg2,op1,op2,remainder,exp_reslt);
			else error_count++;
		if (!SS2) break;
			else continue;
		}
	break;
	}


}

unix.superglobalmegacorp.com

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