summaryrefslogtreecommitdiff
path: root/sys/src/libmach/5db.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-09-03 16:47:51 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-09-03 16:47:51 +0200
commit2e120a29db72b3fbe104d6168f2837f64c738e2e (patch)
treebd39d7450c743fbc87f7dadb70a410d27493a538 /sys/src/libmach/5db.c
parent1b4f432eaee86d49e4595cd4015f6f3e28b50a98 (diff)
libmach: fix RORREG, right shift with shift count 0 means >>32
Diffstat (limited to 'sys/src/libmach/5db.c')
-rw-r--r--sys/src/libmach/5db.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/src/libmach/5db.c b/sys/src/libmach/5db.c
index 411c057b4..1bd661423 100644
--- a/sys/src/libmach/5db.c
+++ b/sys/src/libmach/5db.c
@@ -185,7 +185,7 @@ armclass(long w)
if(w & (1<<4))
op += 32;
else
- if((w & (31<<7)) || (w & (1<<5)))
+ if(w & (31<<7 | 3<<5))
op += 16;
break;
case 1: /* data processing i,r,r */
@@ -680,11 +680,11 @@ armshiftval(Map *map, Rgetter rget, Instr *i)
}
return ROR(v, s);
case 7: /* RORREG */
- sprint(buf, "R%ld", (s>>1)&0xF);
- s = rget(map, buf);
- if(s == 0 || (s & 0xF) == 0)
+ sprint(buf, "R%ld", s >> 1);
+ s = rget(map, buf) & 0x1F;
+ if(s == 0)
return v;
- return ROR(v, s & 0xF);
+ return ROR(v, s);
}
}
}
@@ -1088,7 +1088,10 @@ format(char *mnemonic, Instr *i, char *f)
break;
case 'm':
- bprint(i, "%lud", (i->w>>7) & 0x1f);
+ n = (i->w>>7) & 0x1f;
+ if (n == 0 && (i->w & (3<<5)) != 0)
+ n = 32;
+ bprint(i, "%d", n);
break;
case 'h':