]> Cypherpunks repositories - gostls13.git/commitdiff
LDREX and STREX
authorKai Backman <kaib@golang.org>
Thu, 15 Oct 2009 04:47:08 +0000 (21:47 -0700)
committerKai Backman <kaib@golang.org>
Thu, 15 Oct 2009 04:47:08 +0000 (21:47 -0700)
R=rsc
APPROVED=rsc
DELTA=30  (30 added, 0 deleted, 0 changed)
OCL=35751
CL=35756

src/cmd/5a/lex.c
src/cmd/5l/5.out.h
src/cmd/5l/asm.c
src/cmd/5l/optab.c
src/cmd/5l/span.c

index c5e9a3e78659c569ca6f7c951175ea0d5e7a1e66..44ce3bb40388a49c7e399b22b2cb41e6790a6b7b 100644 (file)
@@ -359,6 +359,9 @@ struct
        "MOVWD",        LTYPE3, AMOVWD,
        "MOVWF",                LTYPE3, AMOVWF,
 
+       "LDREX",                LTYPE3, ALDREX,
+       "STREX",                LTYPE9, ASTREX,
+
 /*
        "ABSF",         LTYPEI, AABSF,
        "ABSD",         LTYPEI, AABSD,
index f78b3f6b73b8b355e2e204eeab741ea54d51131e..07f0596fbdfad5ba981b1d9c059fd5b501eb9b22 100644 (file)
@@ -176,6 +176,9 @@ enum        as
 
        ASIGNAME,
 
+       ALDREX,
+       ASTREX,
+
        ALAST,
 };
 
index 1abf07bbec80f27fc5ccda736c7cecb2419d3e6b..6cd4b2390c02a3c22b8cde05410d6e3df60a395c 100644 (file)
@@ -1706,6 +1706,25 @@ if(debug['G']) print("%ulx: %s: arm %d %d %d %d\n", (uint32)(p->pc), p->from.sym
                // o1 = olr(instoffset, p->to.reg, REGTMP, p->scond);   // mov O(R), Rtmp
                o1 = ((p->scond&C_SCOND)<<28) | (0x12fff<<8) | (1<<4) | p->to.reg;              // BX R
                break;
+       case 77:        /* ldrex oreg,reg */
+               aclass(&p->from);
+               if(instoffset != 0)
+                       diag("offset must be zero in LDREX");
+               o1 = (0x19<<20) | (0xf9f);
+               o1 |= p->from.reg << 16;
+               o1 |= p->to.reg << 12;
+               o1 |= (p->scond & C_SCOND) << 28;
+               break;
+       case 78:        /* strex reg,oreg,reg */
+               aclass(&p->from);
+               if(instoffset != 0)
+                       diag("offset must be zero in STREX");
+               o1 = (0x3<<23) | (0xf9<<4);
+               o1 |= p->from.reg << 16;
+               o1 |= p->reg << 0;
+               o1 |= p->to.reg << 12;
+               o1 |= (p->scond & C_SCOND) << 28;
+               break;
        }
 
        v = p->pc;
index 88067c4b0a148381fa8846b86bede69b8d6b3b2d..92fe12fc29b950f0288933b1ef5de409ddbc8f8e 100644 (file)
@@ -281,6 +281,8 @@ Optab       optab[] =
        { AMOVHU,       C_LEXT, C_NONE, C_REG,          73, 8, REGSB,   LFROM|V4 },
        { AMOVHU,       C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM|V4 },
        { AMOVHU,       C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM|V4 },
+       { ALDREX,       C_SOREG,C_NONE, C_REG,          77, 4, 0 },
+       { ASTREX,       C_SOREG,C_REG,  C_REG,          78, 4, 0 },
 
        { AXXX,         C_NONE, C_NONE, C_NONE,          0, 4, 0 },
 };
index 72121bf32d1dafda2a4b65acc59bfe30f1175b1e..1272b05eccb7acee1ddc1cd1ae8d6c4d30cf899e 100644 (file)
@@ -1095,6 +1095,9 @@ buildop(void)
                        oprange[AMULLU] = oprange[r];
                        oprange[AMULALU] = oprange[r];
                        break;
+               case ALDREX:
+               case ASTREX:
+                       break;
                }
        }
 }