|
|
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*/
}
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.