diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-09-03 16:47:51 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-09-03 16:47:51 +0200 |
commit | 2e120a29db72b3fbe104d6168f2837f64c738e2e (patch) | |
tree | bd39d7450c743fbc87f7dadb70a410d27493a538 | |
parent | 1b4f432eaee86d49e4595cd4015f6f3e28b50a98 (diff) |
libmach: fix RORREG, right shift with shift count 0 means >>32
-rw-r--r-- | sys/src/libmach/5db.c | 15 |
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': |