summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Boddie <david@boddie.org.uk>2020-11-09 18:13:18 +0000
committerCharles Forsyth <charles.forsyth@gmail.com>2020-11-09 18:13:18 +0000
commit715e493b33d319e00902b3678989cf72ec9db0f1 (patch)
treea360b18622098a48b8f4093cc4512fe77edb87d6
parentec7a4b742467a19160dfa5322e3e0880e4abed48 (diff)
parent83beab8bbcbec5a219996d2118aa15bebc108e91 (diff)
Merged in dboddie/inferno-os-git/fix-armv3 (pull request #6)
Fix pre-ARMv4 code generation Approved-by: Charles Forsyth <charles.forsyth@gmail.com>
-rw-r--r--utils/5l/asm.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/utils/5l/asm.c b/utils/5l/asm.c
index 53d51c45..d693eea6 100644
--- a/utils/5l/asm.c
+++ b/utils/5l/asm.c
@@ -902,13 +902,15 @@ PP = p;
r = o->param;
o1 = olr(instoffset, r, p->to.reg, p->scond);
- o2 = oprrr(ASLL, p->scond);
- o3 = oprrr(ASRA, p->scond);
r = p->to.reg;
if(p->as == AMOVB) {
+ o2 = oprrr(ASLL, p->scond & ~C_PBIT);
+ o3 = oprrr(ASRA, p->scond & ~C_PBIT);
o2 |= (24<<7)|(r)|(r<<12);
o3 |= (24<<7)|(r)|(r<<12);
} else {
+ o2 = oprrr(ASLL, p->scond);
+ o3 = oprrr(ASRA, p->scond);
o2 |= (16<<7)|(r)|(r<<12);
if(p->as == AMOVHU)
o3 = oprrr(ASRL, p->scond);
@@ -1195,15 +1197,18 @@ PP = p;
o1 |= 1<<22;
break;
- case 60: /* movb R(R),R -> ldrsb indexed */
+ case 60: /* movb R(R),R -> ldrb indexed */
if(p->from.reg == NREG) {
diag("byte MOV from shifter operand");
goto mov;
}
if(p->from.offset&(~0xf))
- diag("bad shift in LDRSB");
- o1 = olhrr(p->from.offset, p->from.reg, p->to.reg, p->scond);
- o1 ^= (1<<5)|(1<<6);
+ diag("bad shift in LDRB");
+ o1 = olr(p->from.offset, p->from.reg, p->to.reg, p->scond);
+ if(p->as == AMOVB) {
+ o1 |= 1<<22; /* B */
+ o1 ^= 1<<25; /* instruction with Rm */
+ }
break;
case 61: /* movw/b/bu R,R<<[IR](R) -> str indexed */