summaryrefslogtreecommitdiff
path: root/sys/src/cmd/5l
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-08-07 20:22:00 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-08-07 20:22:00 +0200
commitd304dc8119a737c65eca8717e1f436a1e0edf880 (patch)
tree7624038298624a6bc1dc387fb58f5274a6a465f0 /sys/src/cmd/5l
parentca4f815cfc673d00834b48535b9903aae3ac3961 (diff)
5a, 5l: add LDREX/STREX/CLREX instructions
Diffstat (limited to 'sys/src/cmd/5l')
-rw-r--r--sys/src/cmd/5l/asm.c21
-rw-r--r--sys/src/cmd/5l/optab.c3
-rw-r--r--sys/src/cmd/5l/span.c5
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: