summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-10-02 09:06:51 -0700
committerKai Backman <kaib@golang.org>2009-10-02 09:06:51 -0700
commite4dc97f71b0e6e3cd18d489e612d7a927045611c (patch)
treeecbccb61f16436ac9e240573564214c0618d3c91
parent0123e9ab32cf607bac1dd51b815eeda0f2e1647f (diff)
downloadgolang-e4dc97f71b0e6e3cd18d489e612d7a927045611c.tar.gz
a few more code generation bugs and an interface alignment issue.
go/test: passes 74% (251/339) R=rsc APPROVED=rsc DELTA=40 (34 added, 0 deleted, 6 changed) OCL=35254 CL=35275
-rw-r--r--src/cmd/5g/cgen.c27
-rw-r--r--src/cmd/5g/ggen.c5
-rw-r--r--src/cmd/5g/gsubr.c5
-rw-r--r--test/arm-pass.txt9
4 files changed, 40 insertions, 6 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index 7a0b30655..93b79e3ce 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -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;
}
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c
index 34c8bdd8c..13b587906 100644
--- a/src/cmd/5g/ggen.c
+++ b/src/cmd/5g/ggen.c
@@ -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;
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index 2f5bc1724..3a64cee84 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -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;
diff --git a/test/arm-pass.txt b/test/arm-pass.txt
index 789fbedea..0c96afc9a 100644
--- a/test/arm-pass.txt
+++ b/test/arm-pass.txt
@@ -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