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