summaryrefslogtreecommitdiff
path: root/src/cmd/5g/cgen.c
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-06-26 22:04:30 -0700
committerKai Backman <kaib@golang.org>2009-06-26 22:04:30 -0700
commit0b5dd8859d5c65d294f470223ea15c0b7016ebf2 (patch)
treee5964bbadf220f4cdacca3ffb5f423730f098d35 /src/cmd/5g/cgen.c
parent00f5451227c170733a71fe334b8a540dc882e19d (diff)
downloadgolang-0b5dd8859d5c65d294f470223ea15c0b7016ebf2.tar.gz
working on bgen
- removed smallint optimizations - lifted raddr from 5c - add back %R, was used in gc/* causing -g to crash - changed naddr OREGISTER to emit D_REG instead of D_OREG R=rsc APPROVED=rsc DELTA=74 (38 added, 28 deleted, 8 changed) OCL=30799 CL=30822
Diffstat (limited to 'src/cmd/5g/cgen.c')
-rw-r--r--src/cmd/5g/cgen.c38
1 files changed, 13 insertions, 25 deletions
diff --git a/src/cmd/5g/cgen.c b/src/cmd/5g/cgen.c
index 443c2ca3a..70b8ccf6a 100644
--- a/src/cmd/5g/cgen.c
+++ b/src/cmd/5g/cgen.c
@@ -14,7 +14,7 @@ cgen(Node *n, Node *res)
{
Node *nl, *nr, *r;
Node n1, n2;
- int a, f;
+ int a;
Prog *p1, *p2, *p3;
Addr addr;
@@ -68,20 +68,9 @@ cgen(Node *n, Node *res)
if(res->ullman >= UINF)
goto gen;
- f = 1; // gen thru register
- switch(n->op) {
- case OLITERAL:
- if(smallintconst(n))
- f = 0;
- break;
- case OREGISTER:
- f = 0;
- break;
- }
-
a = optoas(OAS, res->type);
if(sudoaddable(a, res, &addr)) {
- if(f) {
+ if(n->op != OREGISTER) {
regalloc(&n2, res->type, N);
cgen(n, &n2);
p1 = gins(a, &n2, N);
@@ -224,7 +213,8 @@ cgen(Node *n, Node *res)
cgen(nl, &n1);
nodconst(&n2, types[tptr], 0);
- gins(optoas(OCMP, types[tptr]), &n1, &n2);
+ p1 = gins(optoas(OCMP, types[tptr]), &n1, N);
+ raddr(&n2, p1);
p1 = gbranch(optoas(OEQ, types[tptr]), T);
n2 = n1;
@@ -601,7 +591,7 @@ bgen(Node *n, int true, Prog *to)
{
int et, a;
Node *nl, *nr, *r;
- Node n1, n2, tmp;
+ Node n1, n2, n3, tmp;
Prog *p1, *p2;
if(debug['g']) {
@@ -635,12 +625,16 @@ bgen(Node *n, int true, Prog *to)
regalloc(&n1, n->type, N);
cgen(n, &n1);
nodconst(&n2, n->type, 0);
- gins(optoas(OCMP, n->type), &n1, &n2);
- a = ABNE;
+ regalloc(&n3, n->type, N);
+ cgen(&n2, &n3);
+ p1 = gins(optoas(OCMP, n->type), &n1, N);
+ raddr(&n3, p1);
+ a = ABNE;
if(!true)
a = ABEQ;
patch(gbranch(a, n->type), to);
regfree(&n1);
+ regfree(&n3);
goto ret;
case OLITERAL:
@@ -770,17 +764,11 @@ bgen(Node *n, int true, Prog *to)
regalloc(&n1, nl->type, N);
cgen(nl, &n1);
- if(smallintconst(nr)) {
- gins(optoas(OCMP, nr->type), &n1, nr);
- patch(gbranch(a, nr->type), to);
- regfree(&n1);
- break;
- }
-
regalloc(&n2, nr->type, N);
cgen(nr, &n2);
- gins(optoas(OCMP, nr->type), &n1, &n2);
+ p1 = gins(optoas(OCMP, nr->type), &n1, N);
+ raddr(&n2, p1);
patch(gbranch(a, nr->type), to);
regfree(&n1);