asdf
SVN=121615
diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index a103a0f..df7dccf 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -127,62 +127,6 @@
regfree(&n1);
break;
-// case OINDEXPTRSTR:
-// nl = n->left;
-// nr = n->right;
-// if(nl->addable) {
-// cgen(nr);
-// cgen(nl);
-// gopcode(P_LOADI, T_ADDR, N);
-// gopcodet(P_INDEXZ, nr->type, N);
-// break;
-// }
-// break;
-
-// case OINDEXSTR:
-// nl = n->left;
-// nr = n->right;
-// if(nl->addable) {
-// cgen(nr);
-// gopcodet(P_INDEXZ, nr->type, nl);
-// break;
-// }
-// cgen(nl);
-// r = tempname(nl->type);
-// gopcodet(P_STORE, nl->type, r);
-// cgen(nr);
-// gopcodet(P_INDEXZ, nr->type, r);
-// break;
-
-// case OSLICESTR:
-// case OSLICEPTRSTR:
-// nl = n->left; // name
-// nr = n->right;
-//
-// r = nr->right; // index2
-// if(!r->addable) {
-// cgen(r);
-// r = tempname(r->type);
-// gopcodet(P_STORE, r->type, r);
-// }
-//
-// // string into T_ADDR
-// if(!nl->addable) {
-// cgen(nl);
-// gconv(T_ADDR, nl->type->etype);
-// } else
-// gopcode(P_LOAD, T_ADDR, nl);
-//
-// if(n->op == OSLICEPTRSTR)
-// gopcode(P_LOADI, T_ADDR, N);
-//
-// // offset in int reg
-// cgen(nr->left);
-//
-// // index 2 addressed
-// gopcodet(P_SLICE, r->type, r);
-// break;
-
case OS2I:
case OI2I:
case OI2S:
@@ -210,11 +154,6 @@
fatal("cgen: OLEN: unknown type %lT", nl->type);
break;
-// case ODOTMETH:
-// case ODOTINTER:
-// cgen(n->left);
-// break;
-
case OADDR:
agen(nl, res);
break;
@@ -238,6 +177,7 @@
case ODIV:
cgen_div(n->op, nl, nr, res);
break;
+
case OLSH:
case ORSH:
cgen_shift(n->op, nl, nr, res);
@@ -287,7 +227,7 @@
{
Node *nl, *nr;
Node n1, n2, n3, tmp;
- ulong w;
+ ulong w, lno;
Type *t;
if(n == N || n->type == T)
@@ -296,14 +236,21 @@
if(!isptr[res->type->etype])
fatal("agen: not tptr: %T", res->type);
+ lno = dynlineno;
+ if(n->op != ONAME)
+ dynlineno = n->lineno; // for diagnostics
+
if(n->addable) {
regalloc(&n1, types[tptr], res);
gins(ALEAQ, n, &n1);
gmove(&n1, res);
regfree(&n1);
- return;
+ goto ret;
}
+ nl = n->left;
+ nr = n->right;
+
switch(n->op) {
default:
fatal("agen: unknown op %N", n);
@@ -317,8 +264,6 @@
// break;
case OINDEXPTR:
- nl = n->left;
- nr = n->right;
w = n->type->width;
if(nr->addable)
goto iprad;
@@ -347,8 +292,6 @@
// case OINDREG:
case OINDEX:
- nl = n->left;
- nr = n->right;
w = n->type->width;
if(nr->addable)
goto irad;
@@ -395,7 +338,6 @@
// break;
case ODOT:
- nl = n->left;
t = nl->type;
agen(nl, res);
if(n->xoffset != 0) {
@@ -405,7 +347,6 @@
break;
case ODOTPTR:
- nl = n->left;
t = nl->type;
if(!isptr[t->etype])
fatal("agen: not ptr %N", n);
@@ -416,6 +357,9 @@
}
break;
}
+
+ret:
+ dynlineno = lno;
}
vlong
@@ -443,7 +387,7 @@
long lno;
int et, a;
Node *nl, *nr, *r;
- Node n1, n2;
+ Node n1, n2, tmp;
Prog *p1, *p2;
if(n == N)
@@ -453,6 +397,9 @@
if(n->op != ONAME)
dynlineno = n->lineno; // for diagnostics
+ nl = n->left;
+ nr = n->right;
+
if(n->type == T) {
convlit(n, types[TBOOL]);
if(n->type == T)
@@ -558,8 +505,32 @@
nl = nr;
nr = r;
}
+
a = optoas(a, nr->type);
+ if(nr->ullman >= UINF) {
+ regalloc(&n1, nr->type, N);
+ cgen(nr, &n1);
+
+ tempname(&tmp, nr->type);
+ gmove(&n1, &tmp);
+ regfree(&n1);
+
+ regalloc(&n1, nl->type, N);
+ cgen(nl, &n1);
+
+ regalloc(&n2, nr->type, &n2);
+ cgen(&tmp, &n2);
+
+ gins(optoas(OCMP, nr->type), &n1, &n2);
+ patch(gbranch(a, nr->type), to);
+
+ regfree(&n1);
+ regfree(&n2);
+ break;
+ }
+
+
regalloc(&n1, nl->type, N);
cgen(nl, &n1);