summaryrefslogtreecommitdiff
path: root/sys/src
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
parentca4f815cfc673d00834b48535b9903aae3ac3961 (diff)
5a, 5l: add LDREX/STREX/CLREX instructions
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/cmd/5a/lex.c1
-rw-r--r--sys/src/cmd/5c/5.out.h2
-rw-r--r--sys/src/cmd/5c/enam.c104
-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
6 files changed, 27 insertions, 109 deletions
diff --git a/sys/src/cmd/5a/lex.c b/sys/src/cmd/5a/lex.c
index 0ee8cf774..e052ce284 100644
--- a/sys/src/cmd/5a/lex.c
+++ b/sys/src/cmd/5a/lex.c
@@ -380,6 +380,7 @@ struct
"RET", LTYPEA, ARET,
"RFE", LTYPEA, ARFE,
+ "CLREX", LTYPEA, ACLREX,
"TEXT", LTYPEB, ATEXT,
"GLOBL", LTYPEB, AGLOBL,
diff --git a/sys/src/cmd/5c/5.out.h b/sys/src/cmd/5c/5.out.h
index a618f8f10..9e1854e3c 100644
--- a/sys/src/cmd/5c/5.out.h
+++ b/sys/src/cmd/5c/5.out.h
@@ -156,6 +156,8 @@ enum as
ALDREXD,
ASTREXD,
+ ACLREX,
+
ALAST,
};
diff --git a/sys/src/cmd/5c/enam.c b/sys/src/cmd/5c/enam.c
deleted file mode 100644
index e5ea0b847..000000000
--- a/sys/src/cmd/5c/enam.c
+++ /dev/null
@@ -1,104 +0,0 @@
-char* anames[] =
-{
- "XXX",
- "AND",
- "EOR",
- "SUB",
- "RSB",
- "ADD",
- "ADC",
- "SBC",
- "RSC",
- "TST",
- "TEQ",
- "CMP",
- "CMN",
- "ORR",
- "BIC",
- "MVN",
- "B",
- "BL",
- "BEQ",
- "BNE",
- "BCS",
- "BHS",
- "BCC",
- "BLO",
- "BMI",
- "BPL",
- "BVS",
- "BVC",
- "BHI",
- "BLS",
- "BGE",
- "BLT",
- "BGT",
- "BLE",
- "MOVWD",
- "MOVWF",
- "MOVDW",
- "MOVFW",
- "MOVFD",
- "MOVDF",
- "MOVF",
- "MOVD",
- "CMPF",
- "CMPD",
- "ADDF",
- "ADDD",
- "SUBF",
- "SUBD",
- "MULF",
- "MULD",
- "DIVF",
- "DIVD",
- "SRL",
- "SRA",
- "SLL",
- "MULU",
- "DIVU",
- "MUL",
- "DIV",
- "MOD",
- "MODU",
- "MOVB",
- "MOVBU",
- "MOVH",
- "MOVHU",
- "MOVW",
- "MOVM",
- "SWPBU",
- "SWPW",
- "NOP",
- "RFE",
- "SWI",
- "MULA",
- "DATA",
- "GLOBL",
- "GOK",
- "HISTORY",
- "NAME",
- "RET",
- "TEXT",
- "WORD",
- "DYNT",
- "INIT",
- "BCASE",
- "CASE",
- "END",
- "MULL",
- "MULAL",
- "MULLU",
- "MULALU",
- "BX",
- "BXRET",
- "DWORD",
- "SIGNAME",
- "SQRTF",
- "SQRTD",
- "LDREX",
- "STREX",
- "LDREXD",
- "STREXD",
- "LAST",
-};
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: