Fri Aug 2 17:44:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>

* d10v_sim.h, simops.c: Snapshot
This commit is contained in:
Martin Hunt 1996-08-03 00:45:58 +00:00
parent e95a45af92
commit 4c38885c86
3 changed files with 365 additions and 72 deletions

View File

@ -1,3 +1,7 @@
Fri Aug 2 17:44:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* d10v_sim.h, simops.c: Snapshot.
Thu Aug 1 17:05:24 1996 Martin M. Hunt <hunt@pizza.cygnus.com>
* ChangeLog, Makefile.in, configure, configure.in, d10v_sim.h,

View File

@ -74,16 +74,16 @@ extern struct simops Simops[];
/* sign-extend a 16-bit number */
#define SEXT16(x) ((((x)&0xffff)^(~0x7fff))+0x8000)
#define BIT40 0x8000000000LL
#define BIT44 0x80000000000LL
/* sign extend a 40 bit number */
#define SEXT40(x) ((((x)&0xffffffffffLL)^(~0x7fffffffffLL))+0x8000000000LL)
#define MAX32 0x7fffffffLL
#define MIN32 0xff80000000LL
#define MASK32 0xffffffffLL
#define MASK40 0xffffffffffLL
#define MASK44 0xfffffffffffLL
#define RB(x) (*((uint8 *)((x)+State.imem)))
#define SB(addr,data) ( RB(addr) = (data & 0xff))
#ifdef WORDS_BIGENDIAN

View File

@ -30,14 +30,14 @@ OP_5607 ()
printf(" abs\ta%d\n",OP[0]);
#endif
State.F1 = State.F0;
if (State.a[OP[0]] & BIT40 )
if (State.a[OP[0]] < 0 )
{
tmp = -State.a[OP[0]] & MASK40;
tmp = -State.a[OP[0]];
if (State.ST)
{
if ( !(tmp & BIT40) && (tmp > MAX32))
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if ( (tmp & BIT40) && (tmp < MIN32))
else if (tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
@ -69,18 +69,44 @@ OP_200 ()
void
OP_1201 ()
{
int64 tmp;
#ifdef DEBUG
printf(" add\ta%d,r%d\n",OP[0],OP[1]);
#endif
tmp = State.a[OP[0]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
if (State.ST)
{
if ( tmp > MAX32)
State.a[OP[0]] = MAX32;
else if ( tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
}
else
State.a[OP[0]] = tmp;
}
/* add */
void
OP_1203 ()
{
int64 tmp;
#ifdef DEBUG
printf(" add\t%x,%x\n",OP[0],OP[1]);
printf(" add\ta%d,a%d\n",OP[0],OP[1]);
#endif
tmp = State.a[OP[0]] + State.a[OP[1]];
if (State.ST)
{
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if ( tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
}
else
State.a[OP[0]] = tmp;
}
/* add2w */
@ -121,36 +147,86 @@ OP_1000000 ()
void
OP_17000200 ()
{
int64 tmp;
#ifdef DEBUG
printf(" addac3\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" addac3\tr%d,r%d,a%d\n",OP[0],OP[1],OP[2]);
#endif
tmp = State.a[OP[2]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.regs[OP[0]+1] = tmp & 0xffff;
}
/* addac3 */
void
OP_17000202 ()
{
int64 tmp;
#ifdef DEBUG
printf(" addac3\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" addac3\tr%d,a%d,a%d\n",OP[0],OP[1],OP[2]);
#endif
tmp = State.a[OP[1]] + State.a[OP[2]];
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.regs[OP[0]+1] = tmp & 0xffff;
}
/* addac3s */
void
OP_17001200 ()
{
int64 tmp;
#ifdef DEBUG
printf(" addac3s\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" addac3s\tr%d,r%d,a%d\n",OP[0],OP[1],OP[2]);
#endif
State.F1 = State.F0;
tmp = State.a[OP[2]] + (SEXT16 (State.regs[OP[1]]) << 16 | State.regs[OP[1]+1]);
if ( tmp > MAX32)
{
State.regs[OP[0]] = 0x7fff;
State.regs[OP[0]+1] = 0xffff;
State.F0 = 1;
}
else if (tmp < MIN32)
{
State.regs[OP[0]] = 0x8000;
State.regs[OP[0]+1] = 0;
State.F0 = 1;
}
else
{
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.regs[OP[0]+1] = tmp & 0xffff;
State.F0 = 0;
}
}
/* addac3s */
void
OP_17001202 ()
{
int64 tmp;
#ifdef DEBUG
printf(" addac3s\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" addac3s\tr%d,a%d,a%d\n",OP[0],OP[1],OP[2]);
#endif
State.F1 = State.F0;
tmp = State.a[OP[1]] + State.a[OP[2]];
if ( tmp > MAX32)
{
State.regs[OP[0]] = 0x7fff;
State.regs[OP[0]+1] = 0xffff;
State.F0 = 1;
}
else if (tmp < MIN32)
{
State.regs[OP[0]] = 0x8000;
State.regs[OP[0]+1] = 0;
State.F0 = 1;
}
else
{
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.regs[OP[0]+1] = tmp & 0xffff;
State.F0 = 0;
}
}
/* addi */
@ -336,8 +412,10 @@ void
OP_1603 ()
{
#ifdef DEBUG
printf(" cmp\t%x,%x\n",OP[0],OP[1]);
printf(" cmp\ta%d,a%d\n",OP[0],OP[1]);
#endif
State.F1 = State.F0;
State.F0 = (State.a[OP[0]] < State.a[OP[1]]) ? 1 : 0;
}
/* cmpeq */
@ -356,8 +434,10 @@ void
OP_1403 ()
{
#ifdef DEBUG
printf(" cmpeq\t%x,%x\n",OP[0],OP[1]);
printf(" cmpeq\ta%d,a%d\n",OP[0],OP[1]);
#endif
State.F1 = State.F0;
State.F0 = (State.a[OP[0]] == State.a[OP[1]]) ? 1 : 0;
}
/* cmpeqi.s */
@ -454,9 +534,7 @@ OP_4E09 ()
void
OP_5F20 ()
{
#ifdef DEBUG
printf(" dbt\n");
#endif
printf(" dbt - NOT IMPLEMENTED\n");
}
/* divs */
@ -564,19 +642,20 @@ OP_15002A00 ()
#ifdef DEBUG
printf(" exp\tr%d,r%d\n",OP[0],OP[1]);
#endif
if (((int16)State.regs[OP[0]]) >= 0)
tmp = (State.regs[OP[0]] << 16) | State.regs[OP[0]+1];
if (((int16)State.regs[OP[1]]) >= 0)
tmp = (State.regs[OP[1]] << 16) | State.regs[OP[1]+1];
else
tmp = ~((State.regs[OP[0]] << 16) | State.regs[OP[0]+1]);
tmp = ~((State.regs[OP[1]] << 16) | State.regs[OP[1]+1]);
foo = 0x40000000;
for (i=1;i<16;i++)
for (i=1;i<17;i++)
{
if (tmp & foo)
{
State.regs[OP[0]] = i-1;
return;
}
foo >>= 1;
}
State.regs[OP[0]] = 16;
}
@ -585,9 +664,27 @@ OP_15002A00 ()
void
OP_15002A02 ()
{
int64 tmp, foo;
int i;
#ifdef DEBUG
printf(" exp\t%x,%x\n",OP[0],OP[1]);
printf(" exp\tr%d,a%d\n",OP[0],OP[1]);
#endif
if (State.a[OP[1]] >= 0)
tmp = State.a[OP[1]];
else
tmp = ~(State.a[OP[1]]);
foo = 0x4000000000LL;
for (i=1;i<25;i++)
{
if (tmp & foo)
{
State.regs[OP[0]] = i-9;
return;
}
foo >>= 1;
}
State.regs[OP[0]] = 16;
}
/* jl */
@ -628,7 +725,7 @@ OP_6401 ()
#ifdef DEBUG
printf(" ld\tr%d,@r%d-\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] = RW (State.regs[OP[2]]);
State.regs[OP[0]] = RW (State.regs[OP[1]]);
State.regs[OP[1]] -= 2;
}
@ -639,7 +736,7 @@ OP_6001 ()
#ifdef DEBUG
printf(" ld\tr%d,@r%d+\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] = RW (State.regs[OP[2]]);
State.regs[OP[0]] = RW (State.regs[OP[1]]);
State.regs[OP[1]] += 2;
}
@ -671,8 +768,8 @@ OP_6601 ()
#ifdef DEBUG
printf(" ld2w\tr%d,@r%d-\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] = RW (State.regs[OP[2]]);
State.regs[OP[0]+1] = RW (State.regs[OP[2]]+2);
State.regs[OP[0]] = RW (State.regs[OP[1]]);
State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
State.regs[OP[1]] -= 4;
}
@ -683,8 +780,8 @@ OP_6201 ()
#ifdef DEBUG
printf(" ld2w\tr%d,@r%d+\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] = RW (State.regs[OP[2]]);
State.regs[OP[0]+1] = RW (State.regs[OP[2]]+2);
State.regs[OP[0]] = RW (State.regs[OP[1]]);
State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
State.regs[OP[1]] += 4;
}
@ -695,8 +792,8 @@ OP_6200 ()
#ifdef DEBUG
printf(" ld2w\tr%d,@r%d\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] = RW (State.regs[OP[2]]);
State.regs[OP[0]+1] = RW (State.regs[OP[2]]+2);
State.regs[OP[0]] = RW (State.regs[OP[1]]);
State.regs[OP[0]+1] = RW (State.regs[OP[1]]+2);
}
/* ldb */
@ -765,9 +862,30 @@ OP_7200 ()
void
OP_2A00 ()
{
int64 tmp;
#ifdef DEBUG
printf(" mac\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" mac\ta%d,r%d,r%d\n",OP[0],OP[1],OP[2]);
#endif
tmp = (int16)(State.regs[OP[1]]) * (int16)(State.regs[OP[2]]);
if (State.FX)
tmp <<= 1;
if (State.ST && tmp > MAX32)
tmp = MAX32;
tmp += State.a[OP[0]];
if (State.ST)
{
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if (tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
}
else
State.a[OP[0]] = tmp;
}
/* macsu */
@ -1154,12 +1272,12 @@ OP_5605 ()
#ifdef DEBUG
printf(" neg\ta%d\n",OP[0]);
#endif
tmp = -State.a[OP[0]] & MASK40;
tmp = -State.a[OP[0]];
if (State.ST)
{
if ( !(tmp & BIT40) && (tmp > MAX32))
if ( tmp > MAX32)
State.a[OP[0]] = MAX32;
else if ( (tmp & BIT40) && (tmp < MIN32))
else if (tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
@ -1219,14 +1337,15 @@ OP_5201 ()
tmp = ((State.a[0] << 16) | (State.a[1] & 0xffff)) << shift;
else
tmp = ((State.a[0] << 16) | (State.a[1] & 0xffff)) >> -shift;
tmp = (tmp + 0x8000) & MASK44;
if ( !(tmp & BIT44) && (tmp > MAX32))
tmp = (tmp + 0x8000) >> 16;
if (tmp > MAX32)
{
State.regs[OP[0]] = 0x7fff;
State.regs[OP[0]+1] = 0xffff;
State.F0 = 1;
}
else if ((tmp & BIT44) && (tmp < 0xfff80000000LL))
else if (tmp < MIN32)
{
State.regs[OP[0]] = 0x8000;
State.regs[OP[0]+1] = 0;
@ -1244,9 +1363,32 @@ OP_5201 ()
void
OP_4201 ()
{
int64 tmp;
int shift = SEXT3 (OP[2]);
#ifdef DEBUG
printf(" rachi\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" rachi\tr%d,a%d,%d\n",OP[0],OP[1],shift);
#endif
State.F1 = State.F0;
if (shift >=0)
tmp = SEXT40 (State.a[1]) << shift;
else
tmp = SEXT40 (State.a[1]) >> -shift;
tmp += 0x8000;
if (tmp > MAX32)
{
State.regs[OP[0]] = 0x7fff;
State.F0 = 1;
}
else if (tmp < 0xfff80000000LL)
{
State.regs[OP[0]] = 0x8000;
State.F0 = 1;
}
else
{
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.F0 = 0;
}
}
/* rep */
@ -1265,6 +1407,11 @@ OP_27000000 ()
fprintf (stderr, "ERROR: rep with count=0 is illegal.\n");
exit(1);
}
if (OP[1] < 4)
{
fprintf (stderr, "ERROR: rep must include at least 4 instructions.\n");
exit(1);
}
}
/* repi */
@ -1280,7 +1427,12 @@ OP_2F000000 ()
State.RP = 1;
if (RPT_C == 0)
{
fprintf (stderr, "ERROR: rep with count=0 is illegal.\n");
fprintf (stderr, "ERROR: repi with count=0 is illegal.\n");
exit(1);
}
if (OP[1] < 4)
{
fprintf (stderr, "ERROR: repi must include at least 4 instructions.\n");
exit(1);
}
}
@ -1289,9 +1441,7 @@ OP_2F000000 ()
void
OP_5F60 ()
{
#ifdef DEBUG
printf(" rtd\n");
#endif
printf(" rtd - NOT IMPLEMENTED\n");
}
/* rte */
@ -1299,17 +1449,32 @@ void
OP_5F40 ()
{
#ifdef DEBUG
printf(" rte\n");
printf(" rte\n");
#endif
PC = BPC;
PSW = BPSW;
}
/* sadd */
void
OP_1223 ()
{
int64 tmp;
#ifdef DEBUG
printf(" sadd\t%x,%x\n",OP[0],OP[1]);
printf(" sadd\ta%d,a%d\n",OP[0],OP[1]);
#endif
tmp = State.a[OP[0]] + (State.a[OP[1]] >> 16);
if (State.ST)
{
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if (tmp < MIN32)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp;
}
else
State.a[OP[0]] = tmp;
}
/* setf0f */
@ -1317,8 +1482,9 @@ void
OP_4611 ()
{
#ifdef DEBUG
printf(" setf0f\t%x\n",OP[0]);
printf(" setf0f\tr%d\n",OP[0]);
#endif
State.regs[OP[0]] = (State.F0 == 0) ? 1 : 0;
}
/* setf0t */
@ -1326,8 +1492,9 @@ void
OP_4613 ()
{
#ifdef DEBUG
printf(" setf0t\t%x\n",OP[0]);
printf(" setf0t\tr%d\n",OP[0]);
#endif
State.regs[OP[0]] = (State.F0 == 1) ? 1 : 0;
}
/* sleep */
@ -1335,8 +1502,9 @@ void
OP_5FC0 ()
{
#ifdef DEBUG
printf(" sleep\n");
printf(" sleep\n");
#endif
State.IE = 1;
}
/* sll */
@ -1353,9 +1521,24 @@ OP_2200 ()
void
OP_3200 ()
{
int64 tmp;
#ifdef DEBUG
printf(" sll\t%x,%x\n",OP[0],OP[1]);
printf(" sll\ta%d,r%d\n",OP[0],OP[1]);
#endif
if (State.regs[OP[1]] & 31 <= 16)
tmp = SEXT40 (State.a[OP[0]]) << (State.regs[OP[1]] & 31);
if (State.ST)
{
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if (tmp < 0xffffff80000000LL)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp & MASK40;
}
else
State.a[OP[0]] = tmp & MASK40;
}
/* slli */
@ -1372,9 +1555,26 @@ OP_2201 ()
void
OP_3201 ()
{
int64 tmp;
#ifdef DEBUG
printf(" slli\t%x,%x\n",OP[0],OP[1]);
printf(" slli\ta%d,%d\n",OP[0],OP[1]);
#endif
if (OP[1] == 0)
tmp = SEXT40(State.a[OP[0]]) << 16;
else
tmp = SEXT40(State.a[OP[0]]) << OP[2];
if (State.ST)
{
if (tmp > MAX32)
State.a[OP[0]] = MAX32;
else if (tmp < 0xffffff80000000LL)
State.a[OP[0]] = MIN32;
else
State.a[OP[0]] = tmp & MASK40;
}
else
State.a[OP[0]] = tmp & MASK40;
}
/* slx */
@ -1403,8 +1603,10 @@ void
OP_3400 ()
{
#ifdef DEBUG
printf(" sra\t%x,%x\n",OP[0],OP[1]);
printf(" sra\ta%d,r%d\n",OP[0],OP[1]);
#endif
if (State.regs[OP[1]] & 31 <= 16)
State.a[OP[0]] >>= (State.regs[OP[1]] & 31);
}
/* srai */
@ -1422,8 +1624,12 @@ void
OP_3401 ()
{
#ifdef DEBUG
printf(" srai\t%x,%x\n",OP[0],OP[1]);
printf(" srai\ta%d,%d\n",OP[0],OP[1]);
#endif
if (OP[1] == 0)
State.a[OP[0]] >>= 16;
else
State.a[OP[0]] >>= OP[1];
}
/* srl */
@ -1441,8 +1647,10 @@ void
OP_3000 ()
{
#ifdef DEBUG
printf(" srl\t%x,%x\n",OP[0],OP[1]);
printf(" srl\ta%d,r%d\n",OP[0],OP[1]);
#endif
if (State.regs[OP[1]] & 31 <= 16)
State.a[OP[0]] >>= (State.regs[OP[1]] & 31);
}
/* srli */
@ -1460,8 +1668,12 @@ void
OP_3001 ()
{
#ifdef DEBUG
printf(" srli\t%x,%x\n",OP[0],OP[1]);
printf(" srli\ta%d,%d\n",OP[0],OP[1]);
#endif
if (OP[1] == 0)
State.a[OP[0]] >>= 16;
else
State.a[OP[0]] >>= OP[1];
}
/* srx */
@ -1501,8 +1713,15 @@ void
OP_6C1F ()
{
#ifdef DEBUG
printf(" st\t%x,%x\n",OP[0],OP[1]);
printf(" st\tr%d,@-r%d\n",OP[0],OP[1]);
#endif
if ( OP[1] != 15 )
{
fprintf (stderr,"ERROR: cannot pre-decrement any registers but r15 (SP).\n");
exit(1);
}
State.regs[OP[1]] -= 2;
SW (State.regs[OP[1]], State.regs[OP[0]]);
}
/* st */
@ -1510,8 +1729,10 @@ void
OP_6801 ()
{
#ifdef DEBUG
printf(" st\t%x,%x\n",OP[0],OP[1]);
printf(" st\tr%d,@r%d+\n",OP[0],OP[1]);
#endif
SW (State.regs[OP[1]], State.regs[OP[0]]);
State.regs[OP[1]] += 2;
}
/* st */
@ -1519,8 +1740,10 @@ void
OP_6C01 ()
{
#ifdef DEBUG
printf(" st\t%x,%x\n",OP[0],OP[1]);
printf(" st\tr%d,@r%d-\n",OP[0],OP[1]);
#endif
SW (State.regs[OP[1]], State.regs[OP[0]]);
State.regs[OP[1]] -= 2;
}
/* st2w */
@ -1528,8 +1751,10 @@ void
OP_35000000 ()
{
#ifdef DEBUG
printf(" st2w\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" st2w\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
#endif
SW (State.regs[OP[1]]+OP[2], State.regs[OP[0]]);
SW (State.regs[OP[1]]+OP[2]+2, State.regs[OP[0]+1]);
}
/* st2w */
@ -1537,8 +1762,10 @@ void
OP_6A00 ()
{
#ifdef DEBUG
printf(" st2w\t%x,%x\n",OP[0],OP[1]);
printf(" st2w\tr%d,@r%d\n",OP[0],OP[1]);
#endif
SW (State.regs[OP[1]], State.regs[OP[0]]);
SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
}
/* st2w */
@ -1546,8 +1773,16 @@ void
OP_6E1F ()
{
#ifdef DEBUG
printf(" st2w\t%x,%x\n",OP[0],OP[1]);
printf(" st2w\tr%d,@-r%d\n",OP[0],OP[1]);
#endif
if ( OP[1] != 15 )
{
fprintf (stderr,"ERROR: cannot pre-decrement any registers but r15 (SP).\n");
exit(1);
}
State.regs[OP[1]] -= 4;
SW (State.regs[OP[1]], State.regs[OP[0]]);
SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
}
/* st2w */
@ -1555,8 +1790,11 @@ void
OP_6A01 ()
{
#ifdef DEBUG
printf(" st2w\t%x,%x\n",OP[0],OP[1]);
printf(" st2w\tr%d,r%d+\n",OP[0],OP[1]);
#endif
SW (State.regs[OP[1]], State.regs[OP[0]]);
SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
State.regs[OP[1]] += 4;
}
/* st2w */
@ -1564,8 +1802,11 @@ void
OP_6E01 ()
{
#ifdef DEBUG
printf(" st2w\t%x,%x\n",OP[0],OP[1]);
printf(" st2w\tr%d,r%d-\n",OP[0],OP[1]);
#endif
SW (State.regs[OP[1]], State.regs[OP[0]]);
SW (State.regs[OP[1]]+2, State.regs[OP[0]+1]);
State.regs[OP[1]] -= 4;
}
/* stb */
@ -1573,8 +1814,9 @@ void
OP_3C000000 ()
{
#ifdef DEBUG
printf(" stb\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" stb\tr%d,@(0x%x,r%d)\n",OP[0],OP[1],OP[2]);
#endif
SB (State.regs[OP[1]]+OP[2], State.regs[OP[0]]);
}
/* stb */
@ -1582,8 +1824,9 @@ void
OP_7800 ()
{
#ifdef DEBUG
printf(" stb\t%x,%x\n",OP[0],OP[1]);
printf(" stb\tr%d,@r%d\n",OP[0],OP[1]);
#endif
SB (State.regs[OP[1]], State.regs[OP[0]]);
}
/* stop */
@ -1600,18 +1843,51 @@ OP_5FE0 ()
void
OP_0 ()
{
int32 tmp;
#ifdef DEBUG
printf(" sub\t%x,%x\n",OP[0],OP[1]);
printf(" sub\tr%d,r%d\n",OP[0],OP[1]);
#endif
tmp = (int16)State.regs[OP[0]]- (int16)State.regs[OP[1]];
State.C = (tmp & 0xffff0000) ? 1 : 0;
State.regs[OP[0]] = tmp & 0xffff;
}
/* sub */
void
OP_1001 ()
{
#ifdef DEBUG
printf(" sub\ta%d,r%d\n",OP[0],OP[1]);
#endif
}
/* sub */
void
OP_1003 ()
{
#ifdef DEBUG
printf(" sub\ta%d,a%d\n",OP[0],OP[1]);
#endif
}
/* sub2w */
void
OP_1000 ()
{
int64 tmp;
int32 a,b;
#ifdef DEBUG
printf(" sub2w\t%x,%x\n",OP[0],OP[1]);
printf(" sub2w\tr%d,r%d\n",OP[0],OP[1]);
#endif
a = (int32)((State.regs[OP[0]] << 16) | State.regs[OP[0]+1]);
b = (int32)((State.regs[OP[1]] << 16) | State.regs[OP[1]+1]);
tmp = a-b;
State.C = (tmp & 0xffffffff00000000LL) ? 1 : 0;
State.regs[OP[0]] = (tmp >> 16) & 0xffff;
State.regs[OP[0]+1] = tmp & 0xffff;
}
/* subac3 */
@ -1654,9 +1930,15 @@ printf(" subac3s\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
void
OP_1 ()
{
int32 tmp;
#ifdef DEBUG
printf(" subi\t%x,%x\n",OP[0],OP[1]);
printf(" subi\tr%d,%d\n",OP[0],OP[1]);
#endif
if (OP[1] == 0)
OP[1] = 16;
tmp = (int16)State.regs[OP[0]] - OP[1];
State.C = (tmp & 0xffff0000) ? 1 : 0;
State.regs[OP[0]] = tmp & 0xffff;
}
/* trap */
@ -1686,8 +1968,10 @@ void
OP_7000000 ()
{
#ifdef DEBUG
printf(" tst0i\t%x,%x\n",OP[0],OP[1]);
printf(" tst0i\tr%d,0x%x\n",OP[0],OP[1]);
#endif
State.F1 = State.F0;
State.F0 = (State.regs[OP[0]] & OP[2]) ? 1 : 0;
}
/* tst1i */
@ -1695,8 +1979,10 @@ void
OP_F000000 ()
{
#ifdef DEBUG
printf(" tst1i\t%x,%x\n",OP[0],OP[1]);
printf(" tst1i\tr%d,0x%x\n",OP[0],OP[1]);
#endif
State.F1 = State.F0;
State.F0 = (~(State.regs[OP[0]]) & OP[2]) ? 1 : 0;
}
/* wait */
@ -1704,8 +1990,9 @@ void
OP_5F80 ()
{
#ifdef DEBUG
printf(" wait\n");
printf(" wait\n");
#endif
State.IE = 1;
}
/* xor */
@ -1713,8 +2000,9 @@ void
OP_A00 ()
{
#ifdef DEBUG
printf(" xor\t%x,%x\n",OP[0],OP[1]);
printf(" xor\tr%d,r%d\n",OP[0],OP[1]);
#endif
State.regs[OP[0]] ^= State.regs[OP[1]];
}
/* xor3 */
@ -1722,7 +2010,8 @@ void
OP_5000000 ()
{
#ifdef DEBUG
printf(" xor3\t%x,%x,%x\n",OP[0],OP[1],OP[2]);
printf(" xor3\tr%d,r%d,0x%x\n",OP[0],OP[1],OP[2]);
#endif
State.regs[OP[0]] = State.regs[OP[1]] ^ OP[2];
}