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 | |
parent | ca4f815cfc673d00834b48535b9903aae3ac3961 (diff) |
5a, 5l: add LDREX/STREX/CLREX instructions
Diffstat (limited to 'sys/src/cmd/5l')
-rw-r--r-- | sys/src/cmd/5l/asm.c | 21 | ||||
-rw-r--r-- | sys/src/cmd/5l/optab.c | 3 | ||||
-rw-r--r-- | sys/src/cmd/5l/span.c | 5 |
3 files changed, 24 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; diff --git a/sys/src/cmd/5l/optab.c b/sys/src/cmd/5l/optab.c index e9a566fd6..dc4283968 100644 --- a/sys/src/cmd/5l/optab.c +++ b/sys/src/cmd/5l/optab.c @@ -161,8 +161,11 @@ Optab optab[] = { AMOVM, C_SOREG,C_NONE, C_LCON, 39, 4, 0 }, { ASWPW, C_SOREG,C_REG, C_REG, 40, 4, 0 }, + { ALDREX, C_SOREG,C_NONE, C_REG, 40, 4, 0 }, + { ASTREX, C_SOREG,C_REG, C_REG, 40, 4, 0 }, { ARFE, C_NONE, C_NONE, C_NONE, 41, 4, 0 }, + { ACLREX, C_NONE, C_NONE, C_NONE, 42, 4, 0 }, { AMOVF, C_FREG, C_NONE, C_FEXT, 50, 4, REGSB }, { AMOVF, C_FREG, C_NONE, C_FAUTO, 50, 4, REGSP }, diff --git a/sys/src/cmd/5l/span.c b/sys/src/cmd/5l/span.c index b41b0e0c8..e3e02f1ac 100644 --- a/sys/src/cmd/5l/span.c +++ b/sys/src/cmd/5l/span.c @@ -743,7 +743,11 @@ buildop(void) break; case ASWPW: oprange[ASWPBU] = oprange[r]; + oprange[ALDREX] = oprange[r]; + oprange[ASTREX] = oprange[r]; break; + case ALDREX: + case ASTREX: case AB: case ABL: case ABX: @@ -752,6 +756,7 @@ buildop(void) case AWORD: case AMOVM: case ARFE: + case ACLREX: case ATEXT: case ACASE: case ABCASE: |