summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-09-22 13:13:23 -0700
committerKai Backman <kaib@golang.org>2009-09-22 13:13:23 -0700
commit658ed4069e163d45a03cd54ca30cd8816301fc52 (patch)
treee076aba4200efcffdb7a13e96b87286166a64d1b /src
parentfa4e5539fa7aa67239c6c03c78a859e75386e169 (diff)
downloadgolang-658ed4069e163d45a03cd54ca30cd8816301fc52.tar.gz
fix bad code generation.
go/test: passes 64% (215/337) tests metric updated, had total number of tests wrong. number of failing tests is down from 129 to 122. R=rsc APPROVED=rsc DELTA=228 (12 added, 5 deleted, 211 changed) OCL=34897 CL=34899
Diffstat (limited to 'src')
-rw-r--r--src/cmd/5g/cgen.c5
-rw-r--r--src/cmd/5g/gsubr.c10
2 files changed, 7 insertions, 8 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index d6c55a0fa..6c2a22b9c 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -103,7 +103,6 @@ cgen(Node *n, Node *res)
} else
p1 = gins(a, n, N);
p1->to = addr;
- p1->reg = w;
if(debug['g'])
print("%P [ignore previous line]\n", p1);
sudoclean();
@@ -179,12 +178,10 @@ cgen(Node *n, Node *res)
if(res->op == OREGISTER) {
p1 = gins(a, N, res);
p1->from = addr;
- p1->reg = w;
} else {
regalloc(&n2, n->type, N);
p1 = gins(a, N, &n2);
p1->from = addr;
- p1->reg = w;
gins(a, &n2, res);
regfree(&n2);
}
@@ -372,7 +369,6 @@ abop: // asymmetric binary
if(sudoaddable(a, nr, &addr, &w)) {
p1 = gins(a, N, &n1);
p1->from = addr;
- p1->reg = w;
gmove(&n1, res);
sudoclean();
regfree(&n1);
@@ -574,7 +570,6 @@ agen(Node *n, Node *res)
tmp.op = OADDR;
tmp.left = &n2;
p1 = gins(AMOVW, &tmp, &n3);
- p1->reg = w;
} else {
nodconst(&n1, t, w);
gins(optoas(OMUL, t), &n1, &n2);
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index 37e9db126..03c9c2de9 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -184,11 +184,12 @@ isfat(Type *t)
* naddr of func generates code for address of func.
* if using opcode that can take address implicitly,
* call afunclit to fix up the argument.
+ * also fix up direct register references to be D_OREG.
*/
void
afunclit(Addr *a)
{
- if(a->type == D_ADDR && a->name == D_EXTERN) {
+ if(a->type == D_ADDR && a->name == D_EXTERN || a->type == D_REG) {
a->type = D_OREG;
}
}
@@ -1441,7 +1442,7 @@ sudoaddable(int as, Node *n, Addr *a, int *w)
int o, i;
int oary[10];
int64 v;
- Node n1, n2, n3, *nn, *l, *r;
+ Node n1, n2, n3, n4, *nn, *l, *r;
Node *reg, *reg1;
Prog *p1;
Type *t;
@@ -1655,8 +1656,11 @@ oindex_const:
nodconst(&n2, types[TUINT32], v);
regalloc(&n3, types[TUINT32], N);
cgen(&n2, &n3);
- p1 = gins(optoas(OCMP, types[TUINT32]), &n1, N);
+ regalloc(&n4, n1.type, N);
+ cgen(&n1, &n4);
+ p1 = gins(optoas(OCMP, types[TUINT32]), &n4, N);
raddr(&n3, p1);
+ regfree(&n4);
regfree(&n3);
p1 = gbranch(optoas(OGT, types[TUINT32]), T);
ginscall(throwindex, 0);