diff options
| author | Kai Backman <kaib@golang.org> | 2009-09-22 13:13:23 -0700 |
|---|---|---|
| committer | Kai Backman <kaib@golang.org> | 2009-09-22 13:13:23 -0700 |
| commit | 658ed4069e163d45a03cd54ca30cd8816301fc52 (patch) | |
| tree | e076aba4200efcffdb7a13e96b87286166a64d1b /src | |
| parent | fa4e5539fa7aa67239c6c03c78a859e75386e169 (diff) | |
| download | golang-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.c | 5 | ||||
| -rw-r--r-- | src/cmd/5g/gsubr.c | 10 |
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); |
