summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/realemu
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@visitor-011.row-08.revision-party.de>2011-04-25 21:32:10 +0000
committercinap_lenrek <cinap_lenrek@visitor-011.row-08.revision-party.de>2011-04-25 21:32:10 +0000
commit028bd871a9934e74b0641aaccc145e8b6ee13b1b (patch)
tree9f3dae7f977963b6e5b90e04ed40b76fecab6d53 /sys/src/cmd/aux/realemu
parentc988841a50eefd3a72c3a865f957df2d0f048f82 (diff)
realemu: complete bitttest ops (tested at revision 2011)
Diffstat (limited to 'sys/src/cmd/aux/realemu')
-rw-r--r--sys/src/cmd/aux/realemu/xec.c59
1 files changed, 33 insertions, 26 deletions
diff --git a/sys/src/cmd/aux/realemu/xec.c b/sys/src/cmd/aux/realemu/xec.c
index 4d81c4d5c..c39ad27b5 100644
--- a/sys/src/cmd/aux/realemu/xec.c
+++ b/sys/src/cmd/aux/realemu/xec.c
@@ -485,39 +485,43 @@ opror(Cpu *cpu, Inst *i)
}
static void
-opbts(Cpu *cpu, Inst *i)
+opbt(Cpu *cpu, Inst *i)
{
ulong a, m;
- int n;
-
- a = ar(i->a1);
- n = ar(i->a2) & 31;
+ int n, s;
+ Iarg *x;
+
+ n = ar(i->a2);
+ x = i->a1;
+ s = x->len*8;
+ if(x->tag == TMEM){
+ x = adup(x);
+ x->off += n / s;
+ x->off &= mask(i->alen*8);
+ }
+ a = ar(x);
+ n &= s-1;
m = 1<<n;
if(a & m)
- cpu->reg[RFL] |= CF;
- else {
+ cpu->reg[RFL] |= CF;
+ else
cpu->reg[RFL] &= ~CF;
- aw(i->a1, a | m);
+ switch(i->op){
+ case OBT:
+ break;
+ case OBTS:
+ aw(x, a | m);
+ break;
+ case OBTR:
+ aw(x, a & ~m);
+ break;
+ case OBTC:
+ aw(x, a ^ m);
+ break;
}
}
static void
-opbtr(Cpu *cpu, Inst *i)
-{
- ulong a, m;
- int n;
-
- a = ar(i->a1);
- n = ar(i->a2) & 31;
- m = 1<<n;
- if(a & m){
- cpu->reg[RFL] |= CF;
- aw(i->a1, a & ~m);
- } else
- cpu->reg[RFL] &= ~CF;
-}
-
-static void
opbitscan(Cpu *cpu, Inst *i)
{
ulong a;
@@ -1204,8 +1208,11 @@ static void (*exctab[NUMOP])(Cpu *cpu, Inst*) = {
[OROL] = oprol,
[OROR] = opror,
- [OBTS] = opbts,
- [OBTR] = opbtr,
+ [OBT] = opbt,
+ [OBTS] = opbt,
+ [OBTR] = opbt,
+ [OBTC] = opbt,
+
[OBSF] = opbitscan,
[OBSR] = opbitscan,