summaryrefslogtreecommitdiff
path: root/utils/5l/asm.c
diff options
context:
space:
mode:
authorValery Ushakov <uwe@stderr.spb.ru>2020-11-10 01:01:06 +0300
committerValery Ushakov <uwe@stderr.spb.ru>2020-11-10 01:01:06 +0300
commita93f6c888f6d530420fbb54e2f7fa4572cdc5208 (patch)
treecb1afd76dc6298465dc32e7cacf244c2c02c9700 /utils/5l/asm.c
parent7828d5d2aa2aeba1588dba190fd80dcab95d982b (diff)
parentff5ab8e7bad9f4c04b5d06dbc4290fe0f43c4467 (diff)
Merged inferno-os/inferno-os into master
Diffstat (limited to 'utils/5l/asm.c')
-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 */