]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/5c, cmd/5g, cmd/5l: introduce MOVBS and MOVHS instructions.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 8 Aug 2013 21:28:53 +0000 (23:28 +0200)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 8 Aug 2013 21:28:53 +0000 (23:28 +0200)
MOVBS and MOVHS are defined as duplicates of MOVB and MOVH,
and perform sign-extension moving.
No change is made to code generation.

Update #1837

R=rsc, bradfitz
CC=golang-dev
https://golang.org/cl/12682043

src/cmd/5c/peep.c
src/cmd/5c/reg.c
src/cmd/5c/txt.c
src/cmd/5g/gsubr.c
src/cmd/5g/peep.c
src/cmd/5g/reg.c
src/cmd/5l/5.out.h
src/cmd/5l/asm.c
src/cmd/5l/optab.c
src/cmd/5l/span.c

index 31c132275730844764cb018d1823a12929e4f238..22328c18c37ef8eb3510b0bde784e00f0f9ccfd4 100644 (file)
@@ -127,8 +127,10 @@ loop1:
                        }
                        continue;
                case AMOVH:
+               case AMOVHS:
                case AMOVHU:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                        if(p->to.type != D_REG)
                                continue;
@@ -152,6 +154,7 @@ loop1:
                switch(p->as) {
                case AMOVW:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                        if(p->from.type == D_OREG && p->from.offset == 0)
                                xtramodes(r, &p->from);
@@ -824,7 +827,7 @@ xtramodes(Reg *r, Adr *a)
        Adr v;
 
        p = r->prog;
-       if(p->as == AMOVB && p->from.type == D_OREG)    /* byte load */
+       if((p->as == AMOVB || p->as == AMOVBS) && p->from.type == D_OREG)       /* byte load */
                return 0;
        v = *a;
        v.type = D_REG;
@@ -836,7 +839,7 @@ xtramodes(Reg *r, Adr *a)
                case AADD:
                        if(p1->from.type == D_REG ||
                           (p1->from.type == D_SHIFT && (p1->from.offset&(1<<4)) == 0 &&
-                           (p->as != AMOVB || (a == &p->from && (p1->from.offset&~0xf) == 0))) ||
+                           ((p->as != AMOVB && p->as != AMOVBS) || (a == &p->from && (p1->from.offset&~0xf) == 0))) ||
                           (p1->from.type == D_CONST &&
                            p1->from.offset > -4096 && p1->from.offset < 4096))
                        if(nochange(uniqs(r1), r, p1)) {
@@ -961,8 +964,10 @@ copyu(Prog *p, Adr *v, Adr *s)
        case AMOVF:
        case AMOVD:
        case AMOVH:
+       case AMOVHS:
        case AMOVHU:
        case AMOVB:
+       case AMOVBS:
        case AMOVBU:
        case AMOVDW:
        case AMOVWD:
index 25bfc582222cff5141aa2baecf66af07d4053dda..c12bd4711df1ceb22aa35ceae9386b2dbcc23d56 100644 (file)
@@ -175,8 +175,10 @@ regopt(Prog *p)
                 */
                case ANOP:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                case AMOVH:
+               case AMOVHS:
                case AMOVHU:
                case AMOVW:
                case AMOVF:
index 81da9fb8010539929c207ed7f07fa21f74470598..6d9b69d00102f45ed9410231153b12caa1814065 100644 (file)
@@ -594,13 +594,13 @@ gmove(Node *f, Node *t)
                        a = AMOVD;
                        break;
                case TCHAR:
-                       a = AMOVB;
+                       a = AMOVBS;
                        break;
                case TUCHAR:
                        a = AMOVBU;
                        break;
                case TSHORT:
-                       a = AMOVH;
+                       a = AMOVHS;
                        break;
                case TUSHORT:
                        a = AMOVHU;
@@ -630,13 +630,13 @@ gmove(Node *f, Node *t)
                        a = AMOVBU;
                        break;
                case TCHAR:
-                       a = AMOVB;
+                       a = AMOVBS;
                        break;
                case TUSHORT:
                        a = AMOVHU;
                        break;
                case TSHORT:
-                       a = AMOVH;
+                       a = AMOVHS;
                        break;
                case TFLOAT:
                        a = AMOVF;
@@ -761,13 +761,13 @@ gmove(Node *f, Node *t)
                switch(tt) {
                case TDOUBLE:
                        regalloc(&nod, f, Z);
-                       gins(AMOVH, f, &nod);
+                       gins(AMOVHS, f, &nod);
                        gins(AMOVWD, &nod, t);
                        regfree(&nod);
                        return;
                case TFLOAT:
                        regalloc(&nod, f, Z);
-                       gins(AMOVH, f, &nod);
+                       gins(AMOVHS, f, &nod);
                        gins(AMOVWF, &nod, t);
                        regfree(&nod);
                        return;
@@ -776,7 +776,7 @@ gmove(Node *f, Node *t)
                case TULONG:
                case TLONG:
                case TIND:
-                       a = AMOVH;
+                       a = AMOVHS;
                        break;
                case TSHORT:
                case TUSHORT:
@@ -819,13 +819,13 @@ gmove(Node *f, Node *t)
                switch(tt) {
                case TDOUBLE:
                        regalloc(&nod, f, Z);
-                       gins(AMOVB, f, &nod);
+                       gins(AMOVBS, f, &nod);
                        gins(AMOVWD, &nod, t);
                        regfree(&nod);
                        return;
                case TFLOAT:
                        regalloc(&nod, f, Z);
-                       gins(AMOVB, f, &nod);
+                       gins(AMOVBS, f, &nod);
                        gins(AMOVWF, &nod, t);
                        regfree(&nod);
                        return;
@@ -836,7 +836,7 @@ gmove(Node *f, Node *t)
                case TIND:
                case TSHORT:
                case TUSHORT:
-                       a = AMOVB;
+                       a = AMOVBS;
                        break;
                case TCHAR:
                case TUCHAR:
@@ -893,13 +893,13 @@ gmover(Node *f, Node *t)
        if(typechlp[ft] && typechlp[tt] && ewidth[ft] >= ewidth[tt]){
                switch(tt){
                case TSHORT:
-                       a = AMOVH;
+                       a = AMOVHS;
                        break;
                case TUSHORT:
                        a = AMOVHU;
                        break;
                case TCHAR:
-                       a = AMOVB;
+                       a = AMOVBS;
                        break;
                case TUCHAR:
                        a = AMOVBU;
index be4b7df5036f413c0f5ad32817eb76171ae1e9a0..2f0009f36cd072ada54245b62843fa58aae92aeb 100644 (file)
@@ -1877,7 +1877,8 @@ lit:
        default:
                return 0;
        case AADD: case ASUB: case AAND: case AORR: case AEOR:
-       case AMOVB: case AMOVBU: case AMOVH: case AMOVHU:
+       case AMOVB: case AMOVBS: case AMOVBU:
+       case AMOVH: case AMOVHS: case AMOVHU:
        case AMOVW:
                break;
        }
index c8e8174d36df04b2cc67638279498bd6e66e7543..78785bfe25360577ee2e4654493baccbef7493fc 100644 (file)
@@ -153,8 +153,10 @@ loop1:
                        break;
 
                case AMOVH:
+               case AMOVHS:
                case AMOVHU:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                        /*
                         * look for MOVB x,R; MOVB R,R
@@ -181,6 +183,7 @@ loop1:
                switch(p->as) {
                case AMOVW:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                        if(p->from.type == D_OREG && p->from.offset == 0)
                                xtramodes(r, &p->from);
@@ -893,7 +896,7 @@ xtramodes(Reg *r, Adr *a)
                                break;
                        if(p1->from.type == D_REG ||
                           (p1->from.type == D_SHIFT && (p1->from.offset&(1<<4)) == 0 &&
-                           (p->as != AMOVB || (a == &p->from && (p1->from.offset&~0xf) == 0))) ||
+                           ((p->as != AMOVB && p->as != AMOVBS) || (a == &p->from && (p1->from.offset&~0xf) == 0))) ||
                           (p1->from.type == D_CONST &&
                            p1->from.offset > -4096 && p1->from.offset < 4096))
                        if(nochange(uniqs(r1), r, p1)) {
@@ -1016,8 +1019,10 @@ copyu(Prog *p, Adr *v, Adr *s)
        case AMOVF:
        case AMOVD:
        case AMOVH:
+       case AMOVHS:
        case AMOVHU:
        case AMOVB:
+       case AMOVBS:
        case AMOVBU:
        case AMOVFW:
        case AMOVWF:
index 0c2898c4c95ab05fd0c470945de1dc03a4720161..3230ec33c8c1a29a1c7a0d6919269eab460f13fe 100644 (file)
@@ -374,6 +374,7 @@ regopt(Prog *firstp)
                 */
                case ANOP:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                case AMOVD:
                case AMOVDF:
@@ -381,6 +382,7 @@ regopt(Prog *firstp)
                case AMOVF:
                case AMOVFW:
                case AMOVH:
+               case AMOVHS:
                case AMOVHU:
                case AMOVW:
                case AMOVWD:
index 85dd17a8e59a224ea26fa54bec93a5bae4677e8c..b47eee3aa92299730fdc89f5ac39b987c025265b 100644 (file)
@@ -135,8 +135,10 @@ enum       as
        AMODU,
 
        AMOVB,
+       AMOVBS,
        AMOVBU,
        AMOVH,
+       AMOVHS,
        AMOVHU,
        AMOVW,
        AMOVM,
index 20ed5e5ae1cb5f1e8e4ecd095315e90f954f01ec..92296b5bc9cfd0eee11c46afce32557aebceb7be 100644 (file)
@@ -954,7 +954,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                r = p->to.reg;
                o1 |= (p->from.reg)|(r<<12);
                o2 |= (r)|(r<<12);
-               if(p->as == AMOVB || p->as == AMOVBU) {
+               if(p->as == AMOVB || p->as == AMOVBS || p->as == AMOVBU) {
                        o1 |= (24<<7);
                        o2 |= (24<<7);
                } else {
@@ -1035,7 +1035,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(r == NREG)
                        r = o->param;
                o2 = olrr(REGTMP,r, p->to.reg, p->scond);
-               if(p->as == AMOVBU || p->as == AMOVB)
+               if(p->as == AMOVBU || p->as == AMOVBS || p->as == AMOVB)
                        o2 |= 1<<22;
                break;
 
@@ -1224,7 +1224,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(p->to.reg == NREG)
                        diag("MOV to shifter operand");
                o1 = osrr(p->from.reg, p->to.offset, p->to.reg, p->scond);
-               if(p->as == AMOVB || p->as == AMOVBU)
+               if(p->as == AMOVB || p->as == AMOVBS || p->as == AMOVBU)
                        o1 |= 1<<22;
                break;
 
@@ -1265,7 +1265,7 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(!o1)
                        break;
                o2 = olr(0, REGTMP, p->to.reg, p->scond);
-               if(p->as == AMOVBU || p->as == AMOVB)
+               if(p->as == AMOVBU || p->as == AMOVBS || p->as == AMOVB)
                        o2 |= 1<<22;
                if(o->flag & LPCREL) {
                        o3 = o2;
@@ -1309,9 +1309,9 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(r == NREG)
                        r = o->param;
                o1 = olhr(instoffset, r, p->to.reg, p->scond);
-               if(p->as == AMOVB)
+               if(p->as == AMOVB || p->as == AMOVBS)
                        o1 ^= (1<<5)|(1<<6);
-               else if(p->as == AMOVH)
+               else if(p->as == AMOVH || p->as == AMOVHS)
                        o1 ^= (1<<6);
                break;
        case 72:        /* movh/movhu R,L(R) -> strh */
@@ -1331,9 +1331,9 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(r == NREG)
                        r = o->param;
                o2 = olhrr(REGTMP, r, p->to.reg, p->scond);
-               if(p->as == AMOVB)
+               if(p->as == AMOVB || p->as == AMOVBS)
                        o2 ^= (1<<5)|(1<<6);
-               else if(p->as == AMOVH)
+               else if(p->as == AMOVH || p->as == AMOVHS)
                        o2 ^= (1<<6);
                break;
        case 74:        /* bx $I */
@@ -1485,9 +1485,9 @@ if(debug['G']) print("%ux: %s: arm %d\n", (uint32)(p->pc), p->from.sym->name, p-
                if(!o1)
                        break;
                o2 = olhr(0, REGTMP, p->to.reg, p->scond);
-               if(p->as == AMOVB)
+               if(p->as == AMOVB || p->as == AMOVBS)
                        o2 ^= (1<<5)|(1<<6);
-               else if(p->as == AMOVH)
+               else if(p->as == AMOVH || p->as == AMOVHS)
                        o2 ^= (1<<6);
                if(o->flag & LPCREL) {
                        o3 = o2;
index 91cadbdf4527c2c211e1faeb663b4d3b4333fbb2..dfd93f31d100abf0ead20103b4673485ceba1154 100644 (file)
@@ -95,8 +95,10 @@ Optab        optab[] =
        { ACMP,         C_LCON, C_REG,  C_NONE,         13, 8, 0,       LFROM },
 
        { AMOVB,        C_REG,  C_NONE, C_REG,          14, 8, 0 },
+       { AMOVBS,       C_REG,  C_NONE, C_REG,          14, 8, 0 },
        { AMOVBU,       C_REG,  C_NONE, C_REG,          58, 4, 0 },
        { AMOVH,        C_REG,  C_NONE, C_REG,          14, 8, 0 },
+       { AMOVHS,       C_REG,  C_NONE, C_REG,          14, 8, 0 },
        { AMOVHU,       C_REG,  C_NONE, C_REG,          14, 8, 0 },
 
        { AMUL,         C_REG,  C_REG,  C_REG,          15, 4, 0 },
@@ -112,6 +114,8 @@ Optab       optab[] =
        { AMOVW,        C_REG,  C_NONE, C_SOREG,        20, 4, 0 },
        { AMOVB,        C_REG,  C_NONE, C_SAUTO,        20, 4, REGSP },
        { AMOVB,        C_REG,  C_NONE, C_SOREG,        20, 4, 0 },
+       { AMOVBS,       C_REG,  C_NONE, C_SAUTO,        20, 4, REGSP },
+       { AMOVBS,       C_REG,  C_NONE, C_SOREG,        20, 4, 0 },
        { AMOVBU,       C_REG,  C_NONE, C_SAUTO,        20, 4, REGSP },
        { AMOVBU,       C_REG,  C_NONE, C_SOREG,        20, 4, 0 },
 
@@ -126,6 +130,9 @@ Optab       optab[] =
        { AMOVB,        C_REG,  C_NONE, C_LAUTO,        30, 8, REGSP,   LTO },
        { AMOVB,        C_REG,  C_NONE, C_LOREG,        30, 8, 0,       LTO },
        { AMOVB,        C_REG,  C_NONE, C_ADDR,         64, 8, 0,       LTO | LPCREL, 4 },
+       { AMOVBS,       C_REG,  C_NONE, C_LAUTO,        30, 8, REGSP,   LTO },
+       { AMOVBS,       C_REG,  C_NONE, C_LOREG,        30, 8, 0,       LTO },
+       { AMOVBS,       C_REG,  C_NONE, C_ADDR,         64, 8, 0,       LTO | LPCREL, 4 },
        { AMOVBU,       C_REG,  C_NONE, C_LAUTO,        30, 8, REGSP,   LTO },
        { AMOVBU,       C_REG,  C_NONE, C_LOREG,        30, 8, 0,       LTO },
        { AMOVBU,       C_REG,  C_NONE, C_ADDR,         64, 8, 0,       LTO | LPCREL, 4 },
@@ -176,9 +183,11 @@ Optab      optab[] =
        { AMOVBU,       C_SHIFT,C_NONE, C_REG,          59, 4, 0 },
 
        { AMOVB,        C_SHIFT,C_NONE, C_REG,          60, 4, 0 },
+       { AMOVBS,       C_SHIFT,C_NONE, C_REG,          60, 4, 0 },
 
        { AMOVW,        C_REG,  C_NONE, C_SHIFT,        61, 4, 0 },
        { AMOVB,        C_REG,  C_NONE, C_SHIFT,        61, 4, 0 },
+       { AMOVBS,       C_REG,  C_NONE, C_SHIFT,        61, 4, 0 },
        { AMOVBU,       C_REG,  C_NONE, C_SHIFT,        61, 4, 0 },
 
        { ACASE,        C_REG,  C_NONE, C_NONE,         62, 4, 0, LPCREL, 8 },
@@ -186,19 +195,28 @@ Optab     optab[] =
 
        { AMOVH,        C_REG,  C_NONE, C_HAUTO,        70, 4, REGSP,   0 },
        { AMOVH,        C_REG,  C_NONE, C_HOREG,        70, 4, 0,       0 },
+       { AMOVHS,       C_REG,  C_NONE, C_HAUTO,        70, 4, REGSP,   0 },
+       { AMOVHS,       C_REG,  C_NONE, C_HOREG,        70, 4, 0,       0 },
        { AMOVHU,       C_REG,  C_NONE, C_HAUTO,        70, 4, REGSP,   0 },
        { AMOVHU,       C_REG,  C_NONE, C_HOREG,        70, 4, 0,       0 },
 
        { AMOVB,        C_HAUTO,C_NONE, C_REG,          71, 4, REGSP,   0 },
        { AMOVB,        C_HOREG,C_NONE, C_REG,          71, 4, 0,       0 },
+       { AMOVBS,       C_HAUTO,C_NONE, C_REG,          71, 4, REGSP,   0 },
+       { AMOVBS,       C_HOREG,C_NONE, C_REG,          71, 4, 0,       0 },
        { AMOVH,        C_HAUTO,C_NONE, C_REG,          71, 4, REGSP,   0 },
        { AMOVH,        C_HOREG,C_NONE, C_REG,          71, 4, 0,       0 },
+       { AMOVHS,       C_HAUTO,C_NONE, C_REG,          71, 4, REGSP,   0 },
+       { AMOVHS,       C_HOREG,C_NONE, C_REG,          71, 4, 0,       0 },
        { AMOVHU,       C_HAUTO,C_NONE, C_REG,          71, 4, REGSP,   0 },
        { AMOVHU,       C_HOREG,C_NONE, C_REG,          71, 4, 0,       0 },
 
        { AMOVH,        C_REG,  C_NONE, C_LAUTO,        72, 8, REGSP,   LTO },
        { AMOVH,        C_REG,  C_NONE, C_LOREG,        72, 8, 0,       LTO },
        { AMOVH,        C_REG,  C_NONE, C_ADDR, 94, 8, 0,       LTO | LPCREL, 4 },
+       { AMOVHS,       C_REG,  C_NONE, C_LAUTO,        72, 8, REGSP,   LTO },
+       { AMOVHS,       C_REG,  C_NONE, C_LOREG,        72, 8, 0,       LTO },
+       { AMOVHS,       C_REG,  C_NONE, C_ADDR, 94, 8, 0,       LTO | LPCREL, 4 },
        { AMOVHU,       C_REG,  C_NONE, C_LAUTO,        72, 8, REGSP,   LTO },
        { AMOVHU,       C_REG,  C_NONE, C_LOREG,        72, 8, 0,       LTO },
        { AMOVHU,       C_REG,  C_NONE, C_ADDR, 94, 8, 0,       LTO | LPCREL, 4 },
@@ -206,9 +224,15 @@ Optab      optab[] =
        { AMOVB,        C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM },
        { AMOVB,        C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM },
        { AMOVB,        C_ADDR, C_NONE, C_REG,          93, 8, 0,       LFROM | LPCREL, 4 },
+       { AMOVBS,       C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM },
+       { AMOVBS,       C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM },
+       { AMOVBS,       C_ADDR, C_NONE, C_REG,          93, 8, 0,       LFROM | LPCREL, 4 },
        { AMOVH,        C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM },
        { AMOVH,        C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM },
        { AMOVH,        C_ADDR, C_NONE, C_REG,          93, 8, 0,       LFROM | LPCREL, 4 },
+       { AMOVHS,       C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM },
+       { AMOVHS,       C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM },
+       { AMOVHS,       C_ADDR, C_NONE, C_REG,          93, 8, 0,       LFROM | LPCREL, 4 },
        { AMOVHU,       C_LAUTO,C_NONE, C_REG,          73, 8, REGSP,   LFROM },
        { AMOVHU,       C_LOREG,C_NONE, C_REG,          73, 8, 0,       LFROM },
        { AMOVHU,       C_ADDR, C_NONE, C_REG,          93, 8, 0,       LFROM | LPCREL, 4 },
index fe7aface9756f4da629b0bbe5d5181d7823a9bd3..7201c006f848dc0bb954527116e4d247c1ef5c03 100644 (file)
@@ -813,8 +813,10 @@ buildop(void)
                        break;
                case AMOVW:
                case AMOVB:
+               case AMOVBS:
                case AMOVBU:
                case AMOVH:
+               case AMOVHS:
                case AMOVHU:
                        break;
                case ASWPW: