diff options
author | David Boddie <david@boddie.org.uk> | 2020-11-09 18:13:18 +0000 |
---|---|---|
committer | Charles Forsyth <charles.forsyth@gmail.com> | 2020-11-09 18:13:18 +0000 |
commit | 715e493b33d319e00902b3678989cf72ec9db0f1 (patch) | |
tree | a360b18622098a48b8f4093cc4512fe77edb87d6 | |
parent | ec7a4b742467a19160dfa5322e3e0880e4abed48 (diff) | |
parent | 83beab8bbcbec5a219996d2118aa15bebc108e91 (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.c | 17 |
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 */ |