]> Cypherpunks repositories - gostls13.git/commitdiff
5a, 5l: add LDREXD, STREXD
authorRuss Cox <rsc@golang.org>
Fri, 25 Feb 2011 06:03:54 +0000 (01:03 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 25 Feb 2011 06:03:54 +0000 (01:03 -0500)
R=ken2
CC=golang-dev
https://golang.org/cl/4239041

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 e762f5646224cd0e0d6c0dd09f4fe20142c8d908..dbee3657f1aa4e4ba7ce7e92bc4770fb62a0e9ce 100644 (file)
@@ -364,7 +364,9 @@ struct
        "MOVWF",                LTYPE3, AMOVWF,
 
        "LDREX",                LTYPE3, ALDREX,
+       "LDREXD",               LTYPE3, ALDREXD,
        "STREX",                LTYPE9, ASTREX,
+       "STREXD",               LTYPE9, ASTREXD,
 
 /*
        "ABSF",         LTYPEI, AABSF,
index a25c0f71d33b939967200dd48efc2ff794f67c41..002b46d451bdb1933eb06afdd1ad3878606f14b9 100644 (file)
@@ -179,6 +179,9 @@ enum        as
 
        ALDREX,
        ASTREX,
+       
+       ALDREXD,
+       ASTREXD,
 
        ALAST,
 };
index adc4ae7478c6910a6163edfea7985c3aaaf27752..af6d1dfda06150262b5d0088e1b10f9495531434 100644 (file)
@@ -1463,7 +1463,7 @@ if(debug['G']) print("%ux: %s: arm %d %d %d\n", (uint32)(p->pc), p->from.sym->na
                aclass(&p->from);
                if(instoffset != 0)
                        diag("offset must be zero in STREX");
-               o1 = (0x3<<23) | (0xf9<<4);
+               o1 = (0x18<<20) | (0xf90);
                o1 |= p->from.reg << 16;
                o1 |= p->reg << 0;
                o1 |= p->to.reg << 12;
@@ -1553,6 +1553,25 @@ if(debug['G']) print("%ux: %s: arm %d %d %d\n", (uint32)(p->pc), p->from.sym->na
                o1 = oprrr(ACMP+AEND, p->scond);
                o1 |= p->from.reg<<16;
                break;
+       case 91:        /* ldrexd oreg,reg */
+               aclass(&p->from);
+               if(instoffset != 0)
+                       diag("offset must be zero in LDREX");
+               o1 = (0x1b<<20) | (0xf9f);
+               o1 |= p->from.reg << 16;
+               o1 |= p->to.reg << 12;
+               o1 |= (p->scond & C_SCOND) << 28;
+               break;
+       case 92:        /* strexd reg,oreg,reg */
+               aclass(&p->from);
+               if(instoffset != 0)
+                       diag("offset must be zero in STREX");
+               o1 = (0x1a<<20) | (0xf90);
+               o1 |= p->from.reg << 16;
+               o1 |= p->reg << 0;
+               o1 |= p->to.reg << 12;
+               o1 |= (p->scond & C_SCOND) << 28;
+               break;
        }
        
        out[0] = o1;
index 8b3135e06ed698924498cf15c15452ca0d6da52a..625b668121028625162dfc5714e3052e5cc1ad58 100644 (file)
@@ -253,5 +253,8 @@ Optab       optab[] =
 
        { ATST,         C_REG,  C_NONE, C_NONE,         90, 4, 0 },
 
+       { ALDREXD,      C_SOREG,C_NONE, C_REG,          91, 4, 0 },
+       { ASTREXD,      C_SOREG,C_REG,  C_REG,          92, 4, 0 },
+
        { AXXX,         C_NONE, C_NONE, C_NONE,          0, 4, 0 },
 };
index 220140f433b2a74785724b9898dff8ea92f21e7e..482d3e90a23ee97ad75ee64a1167786dc7f7daf1 100644 (file)
@@ -1054,6 +1054,8 @@ buildop(void)
 
                case ALDREX:
                case ASTREX:
+               case ALDREXD:
+               case ASTREXD:
                case ATST:
                        break;
                }