diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-07 20:22:00 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-08-07 20:22:00 +0200 |
commit | d304dc8119a737c65eca8717e1f436a1e0edf880 (patch) | |
tree | 7624038298624a6bc1dc387fb58f5274a6a465f0 /sys/src/cmd/5l/asm.c | |
parent | ca4f815cfc673d00834b48535b9903aae3ac3961 (diff) |
5a, 5l: add LDREX/STREX/CLREX instructions
Diffstat (limited to 'sys/src/cmd/5l/asm.c')
-rw-r--r-- | sys/src/cmd/5l/asm.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/sys/src/cmd/5l/asm.c b/sys/src/cmd/5l/asm.c index 3dd6e1fe8..46e07ebc5 100644 --- a/sys/src/cmd/5l/asm.c +++ b/sys/src/cmd/5l/asm.c @@ -1094,12 +1094,19 @@ PP = p; break; case 40: /* swp oreg,reg,reg */ - aclass(&p->from); - if(instoffset != 0) - diag("offset must be zero in SWP"); + if(p->as != ASTREX){ + aclass(&p->from); + if(instoffset != 0) + diag("offset must be zero in SWP"); + } o1 = (0x2<<23) | (0x9<<4); - if(p->as != ASWPW) - o1 |= 1 << 22; + if(p->as == ASWPBU) + o1 |= (1 << 22); + else if(p->as == ALDREX || p->as == ASTREX){ + o1 |= (1 << 23) | 0xf00; + if(p->as == ALDREX) + o1 |= (1 << 20) | 0xf; + } o1 |= p->from.reg << 16; o1 |= p->reg << 0; o1 |= p->to.reg << 12; @@ -1110,6 +1117,10 @@ PP = p; o1 = 0xe8fd8000; break; + case 42: /* clrex */ + o1 = 0xf57ff01f; + break; + case 50: /* floating point store */ v = regoff(&p->to); r = p->to.reg; |