From d304dc8119a737c65eca8717e1f436a1e0edf880 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 7 Aug 2014 20:22:00 +0200 Subject: [PATCH] 5a, 5l: add LDREX/STREX/CLREX instructions --- sys/src/cmd/5a/lex.c | 1 + sys/src/cmd/5c/5.out.h | 2 + sys/src/cmd/5c/enam.c | 104 ----------------------------------------- sys/src/cmd/5l/asm.c | 21 +++++++-- sys/src/cmd/5l/optab.c | 3 ++ sys/src/cmd/5l/span.c | 5 ++ 6 files changed, 27 insertions(+), 109 deletions(-) delete mode 100644 sys/src/cmd/5c/enam.c 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: