]> Cypherpunks repositories - gostls13.git/commitdiff
a few more code generation bugs and an interface alignment issue.
authorKai Backman <kaib@golang.org>
Fri, 2 Oct 2009 16:06:51 +0000 (09:06 -0700)
committerKai Backman <kaib@golang.org>
Fri, 2 Oct 2009 16:06:51 +0000 (09:06 -0700)
go/test: passes 74% (251/339)

R=rsc
APPROVED=rsc
DELTA=40  (34 added, 0 deleted, 6 changed)
OCL=35254
CL=35275

src/cmd/5g/cgen.c
src/cmd/5g/ggen.c
src/cmd/5g/gsubr.c
test/arm-pass.txt

index 7a0b30655b82746ea0d207286dbddfa7e4e31a0a..93b79e3ce25d41ce7d1a2abef9caac18b8c0c27d 100644 (file)
@@ -604,7 +604,14 @@ agen(Node *n, Node *res)
                cgen(n->heapaddr, res);
                if(n->xoffset != 0) {
                        nodconst(&n1, types[TINT32], n->xoffset);
-                       gins(optoas(OADD, types[tptr]), &n1, res);
+                       regalloc(&n2, n1.type, N);
+                       regalloc(&n3, types[TINT32], N);
+                       gmove(&n1, &n2);
+                       gmove(res, &n3);
+                       gins(optoas(OADD, types[tptr]), &n2, &n3);
+                       gmove(&n3, res);
+                       regfree(&n2);
+                       regfree(&n3);
                }
                break;
 
@@ -616,7 +623,14 @@ agen(Node *n, Node *res)
                agen(nl, res);
                if(n->xoffset != 0) {
                        nodconst(&n1, types[TINT32], n->xoffset);
-                       gins(optoas(OADD, types[tptr]), &n1, res);
+                       regalloc(&n2, n1.type, N);
+                       regalloc(&n3, types[TINT32], N);
+                       gmove(&n1, &n2);
+                       gmove(res, &n3);
+                       gins(optoas(OADD, types[tptr]), &n2, &n3);
+                       gmove(&n3, res);
+                       regfree(&n2);
+                       regfree(&n3);
                }
                break;
 
@@ -624,7 +638,14 @@ agen(Node *n, Node *res)
                cgen(nl, res);
                if(n->xoffset != 0) {
                        nodconst(&n1, types[TINT32], n->xoffset);
-                       gins(optoas(OADD, types[tptr]), &n1, res);
+                       regalloc(&n2, n1.type, N);
+                       regalloc(&n3, types[tptr], N);
+                       gmove(&n1, &n2);
+                       gmove(res, &n3);
+                       gins(optoas(OADD, types[tptr]), &n2, &n3);
+                       gmove(&n3, res);
+                       regfree(&n2);
+                       regfree(&n3);
                }
                break;
        }
index 34c8bdd8ccb5cb9255b0d28ee30e0f10e65c2c4d..13b58790648135a3d5da254ede4be17ec0ce5c7b 100644 (file)
@@ -211,13 +211,14 @@ cgen_callinter(Node *n, Node *res, int proc)
        agen(i, &nodr);         // REG = &inter
 
        nodindreg(&nodsp, types[tptr], REGSP);
+       nodsp.xoffset = 4;
        nodo.xoffset += widthptr;
-       cgen(&nodo, &nodsp);    // 0(SP) = 8(REG) -- i.s
+       cgen(&nodo, &nodsp);    // 4(SP) = 8(REG) -- i.s
 
        nodo.xoffset -= widthptr;
        cgen(&nodo, &nodr);     // REG = 0(REG) -- i.m
 
-       nodo.xoffset = n->left->xoffset + 4*widthptr;
+       nodo.xoffset = n->left->xoffset + 3*widthptr + 8;
        cgen(&nodo, &nodr);     // REG = 32+offset(REG) -- i.m->fun[f]
 
        // BOTCH nodr.type = fntype;
index 2f5bc1724c626a5709ef5625baecd122d30c2517..3a64cee84eaa493ecf99e5bb08c1423a1a0ae254 100644 (file)
@@ -712,7 +712,10 @@ gmove(Node *f, Node *t)
        case CASE(TUINT32, TUINT64):
                split64(t, &tlo, &thi);
                gmove(f, &tlo);
-               gins(AMOVW, ncon(0), &thi);
+               regalloc(&r1, thi.type, N);
+               gins(AMOVW, ncon(0), &r1);
+               gins(AMOVW, &r1, &thi);
+               regfree(&r1);
                splitclean();
                return;
 
index 789fbedea37260afc9a0db44fa261dff0afdb0be..0c96afc9a3b1662cbbc3dc8f0ca05f87ca1ebc1e 100644 (file)
@@ -2,6 +2,7 @@
 assign.go
 blank1.go
 bugs/bug136.go
+bugs/bug162.go
 bugs/bug169.go
 bugs/bug190.go
 bugs/bug193.go
@@ -203,30 +204,38 @@ indirect.go
 indirect1.go
 initcomma.go
 initializerr.go
+interface/convert.go
 interface/convert1.go
 interface/convert2.go
 interface/explicit.go
 interface/fail.go
 interface/pointer.go
+interface/receiver.go
 interface/receiver1.go
 interface/recursive.go
 interface/returntype.go
 interface/struct.go
 iota.go
 ken/complit.go
+ken/embed.go
 ken/for.go
+ken/interfun.go
+ken/intervar.go
 ken/label.go
 ken/mfunc.go
 ken/ptrvar.go
+ken/rob1.go
 ken/rob2.go
 ken/robfor.go
 ken/robif.go
+ken/shift.go
 ken/simpbool.go
 ken/simpfun.go
 ken/simpprint.go
 ken/simpswitch.go
 ken/simpvar.go
 ken/strvar.go
+method.go
 method1.go
 method2.go
 method3.go