]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g: use all 16 float registers, optimize float moves
authorRuss Cox <rsc@golang.org>
Fri, 21 Sep 2012 17:39:09 +0000 (13:39 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 21 Sep 2012 17:39:09 +0000 (13:39 -0400)
Fixes #2446.

R=ken2
CC=golang-dev
https://golang.org/cl/6557044

src/cmd/6g/gsubr.c
src/cmd/6g/peep.c
src/cmd/6g/reg.c
src/cmd/6l/6.out.h

index aa2d4b8653c80029d214fa95695998bd9a6899ec..0b50b4f43e5b68423d63afb69108872836b70a76 100644 (file)
@@ -271,7 +271,7 @@ ginit(void)
                reg[i] = 1;
        for(i=D_AX; i<=D_R15; i++)
                reg[i] = 0;
-       for(i=D_X0; i<=D_X7; i++)
+       for(i=D_X0; i<=D_X15; i++)
                reg[i] = 0;
 
        for(i=0; i<nelem(resvd); i++)
@@ -289,7 +289,7 @@ gclean(void)
        for(i=D_AX; i<=D_R15; i++)
                if(reg[i])
                        yyerror("reg %R left allocated\n", i);
-       for(i=D_X0; i<=D_X7; i++)
+       for(i=D_X0; i<=D_X15; i++)
                if(reg[i])
                        yyerror("reg %R left allocated\n", i);
 }
@@ -359,10 +359,10 @@ regalloc(Node *n, Type *t, Node *o)
        case TFLOAT64:
                if(o != N && o->op == OREGISTER) {
                        i = o->val.u.reg;
-                       if(i >= D_X0 && i <= D_X7)
+                       if(i >= D_X0 && i <= D_X15)
                                goto out;
                }
-               for(i=D_X0; i<=D_X7; i++)
+               for(i=D_X0; i<=D_X15; i++)
                        if(reg[i] == 0)
                                goto out;
                fatal("out of floating registers");
index 22eb8dfa712c9227d934c8bdaab08ef3dde3f415..f597f28368ceed05091400908986c32afa2998bb 100644 (file)
@@ -627,19 +627,34 @@ subprop(Reg *r0)
        Reg *r;
        int t;
 
+       if(debug['P'] && debug['v'])
+               print("subprop %P\n", r0->prog);
        p = r0->prog;
        v1 = &p->from;
-       if(!regtyp(v1))
+       if(!regtyp(v1)) {
+               if(debug['P'] && debug['v'])
+                       print("\tnot regtype %D; return 0\n", v1);
                return 0;
+       }
        v2 = &p->to;
-       if(!regtyp(v2))
+       if(!regtyp(v2)) {
+               if(debug['P'] && debug['v'])
+                       print("\tnot regtype %D; return 0\n", v2);
                return 0;
+       }
        for(r=uniqp(r0); r!=R; r=uniqp(r)) {
-               if(uniqs(r) == R)
+               if(debug['P'] && debug['v'])
+                       print("\t? %P\n", r->prog);
+               if(uniqs(r) == R) {
+                       if(debug['P'] && debug['v'])
+                               print("\tno unique successor\n");
                        break;
+               }
                p = r->prog;
                switch(p->as) {
                case ACALL:
+                       if(debug['P'] && debug['v'])
+                               print("\tfound %P; return 0\n", p);
                        return 0;
 
                case AIMULL:
@@ -710,21 +725,33 @@ subprop(Reg *r0)
                case AMOVSB:
                case AMOVSL:
                case AMOVSQ:
+                       if(debug['P'] && debug['v'])
+                               print("\tfound %P; return 0\n", p);
                        return 0;
 
                case AMOVL:
                case AMOVQ:
+               case AMOVSS:
+               case AMOVSD:
                        if(p->to.type == v1->type)
                                goto gotit;
                        break;
                }
                if(copyau(&p->from, v2) ||
-                  copyau(&p->to, v2))
+                  copyau(&p->to, v2)) {
+                       if(debug['P'] && debug['v'])
+                               print("\tcopyau %D failed\n", v2);
                        break;
+               }
                if(copysub(&p->from, v1, v2, 0) ||
-                  copysub(&p->to, v1, v2, 0))
+                  copysub(&p->to, v1, v2, 0)) {
+                       if(debug['P'] && debug['v'])
+                               print("\tcopysub failed\n");
                        break;
+               }
        }
+       if(debug['P'] && debug['v'])
+               print("\tran off end; return 0\n", p);
        return 0;
 
 gotit:
@@ -769,6 +796,8 @@ copyprop(Reg *r0)
        Adr *v1, *v2;
        Reg *r;
 
+       if(debug['P'] && debug['v'])
+               print("copyprop %P\n", r0->prog);
        p = r0->prog;
        v1 = &p->from;
        v2 = &p->to;
@@ -1180,13 +1209,22 @@ int
 copyau(Adr *a, Adr *v)
 {
 
-       if(copyas(a, v))
+       if(copyas(a, v)) {
+               if(debug['P'] && debug['v'])
+                       print("\tcopyau: copyas returned 1\n");
                return 1;
+       }
        if(regtyp(v)) {
-               if(a->type-D_INDIR == v->type)
+               if(a->type-D_INDIR == v->type) {
+                       if(debug['P'] && debug['v'])
+                               print("\tcopyau: found indir use - return 1\n");
                        return 1;
-               if(a->index == v->type)
+               }
+               if(a->index == v->type) {
+                       if(debug['P'] && debug['v'])
+                               print("\tcopyau: found index use - return 1\n");
                        return 1;
+               }
        }
        return 0;
 }
index 0c22c9ffb841435fede0cf3750b30f6a9694f3f8..7b98b46e5be6459b41780f1bb01200a9a076d6cc 100644 (file)
@@ -1601,7 +1601,7 @@ int
 BtoF(int32 b)
 {
 
-       b &= 0xFF0000L;
+       b &= 0xFFFF0000L;
        if(b == 0)
                return 0;
        return bitno(b) - 16 + FREGMIN;
index 01c2ba840bca5b1272bd16f43a72b70d93e9efd9..769df3b5ac01dc1caddc8c0ae1961c4bffaac9d5 100644 (file)
@@ -805,6 +805,14 @@ enum
        D_X5,
        D_X6,
        D_X7,
+       D_X8,
+       D_X9,
+       D_X10,
+       D_X11,
+       D_X12,
+       D_X13,
+       D_X14,
+       D_X15,
 
        D_CS            = 68,
        D_SS,