1
0
mirror of https://github.com/golang/go synced 2024-09-25 05:10:12 -06:00

avoid register computing len(x), cap(x)

for slice or string x.

R=ken
OCL=32249
CL=32249
This commit is contained in:
Russ Cox 2009-07-27 15:55:27 -07:00
parent 33c1045056
commit 30228a3bc6
6 changed files with 111 additions and 29 deletions

View File

@ -91,6 +91,20 @@ cgen(Node *n, Node *res)
goto ret;
}
// update addressability for string, slice
// can't do in walk because n->left->addable
// changes if n->left is an escaping local variable.
switch(n->op) {
case OLEN:
if(isslice(n->left->type) || istype(n->left->type, TSTRING))
n->addable = n->left->addable;
break;
case OCAP:
if(isslice(n->left->type))
n->addable = n->left->addable;
break;
}
if(n->addable) {
gmove(n, res);
goto ret;

View File

@ -628,23 +628,23 @@ gmove(Node *f, Node *t)
// case CASE(TINT32, TINT64): // sign extend int32
// case CASE(TINT32, TUINT64):
// fatal("gmove TINT32,INT64 not implemented");
//// split64(t, &tlo, &thi);
//// nodreg(&flo, tlo.type, D_AX);
//// nodreg(&fhi, thi.type, D_DX);
//// gmove(f, &flo);
//// gins(ACDQ, N, N);
//// gins(AMOVL, &flo, &tlo);
//// gins(AMOVL, &fhi, &thi);
//// splitclean();
//// split64(t, &tlo, &thi);
//// nodreg(&flo, tlo.type, D_AX);
//// nodreg(&fhi, thi.type, D_DX);
//// gmove(f, &flo);
//// gins(ACDQ, N, N);
//// gins(AMOVL, &flo, &tlo);
//// gins(AMOVL, &fhi, &thi);
//// splitclean();
// return;
// case CASE(TUINT32, TINT64): // zero extend uint32
// case CASE(TUINT32, TUINT64):
// fatal("gmove TUINT32,INT64 not implemented");
//// split64(t, &tlo, &thi);
//// gmove(f, &tlo);
//// gins(AMOVL, ncon(0), &thi);
//// splitclean();
//// split64(t, &tlo, &thi);
//// gmove(f, &tlo);
//// gins(AMOVL, ncon(0), &thi);
//// splitclean();
// return;
// /*
@ -813,23 +813,23 @@ gmove(Node *f, Node *t)
// case CASE(TINT64, TFLOAT32):
// case CASE(TINT64, TFLOAT64):
// fatal("gmove TINT,TFLOAT not implemented");
//// if(t->op != OREGISTER)
//// goto hard;
//// if(f->op == OREGISTER) {
//// cvt = f->type;
//// goto hardmem;
//// }
//// switch(ft) {
//// case TINT16:
//// a = AFMOVW;
//// break;
//// case TINT32:
//// a = AFMOVL;
//// break;
//// default:
//// a = AFMOVV;
//// break;
//// }
//// if(t->op != OREGISTER)
//// goto hard;
//// if(f->op == OREGISTER) {
//// cvt = f->type;
//// goto hardmem;
//// }
//// switch(ft) {
//// case TINT16:
//// a = AFMOVW;
//// break;
//// case TINT32:
//// a = AFMOVL;
//// break;
//// default:
//// a = AFMOVV;
//// break;
//// }
// break;
// case CASE(TINT8, TFLOAT32):
@ -1186,6 +1186,18 @@ naddr(Node *n, Addr *a)
}
break;
case OLEN:
// len of string or slice
naddr(n->left, a);
a->offset += Array_nel;
break;
case OCAP:
// cap of string or slice
naddr(n->left, a);
a->offset += Array_cap;
break;
case OADDR:
naddr(n->left, a);
if(a->type == D_OREG) {

View File

@ -102,6 +102,20 @@ cgen(Node *n, Node *res)
goto ret;
}
// update addressability for string, slice
// can't do in walk because n->left->addable
// changes if n->left is an escaping local variable.
switch(n->op) {
case OLEN:
if(isslice(n->left->type) || istype(n->left->type, TSTRING))
n->addable = n->left->addable;
break;
case OCAP:
if(isslice(n->left->type))
n->addable = n->left->addable;
break;
}
if(n->addable) {
gmove(n, res);
goto ret;

View File

@ -417,6 +417,8 @@ int
ismem(Node *n)
{
switch(n->op) {
case OLEN:
case OCAP:
case OINDREG:
case ONAME:
case OPARAM:
@ -1012,6 +1014,18 @@ naddr(Node *n, Addr *a)
}
fatal("naddr: OADDR\n");
case OLEN:
// len of string or slice
naddr(n->left, a);
a->offset += Array_nel;
break;
case OCAP:
// cap of string or slice
naddr(n->left, a);
a->offset += Array_cap;
break;
// case OADD:
// if(n->right->op == OLITERAL) {
// v = n->right->vconst;

View File

@ -83,6 +83,20 @@ cgen(Node *n, Node *res)
return;
}
// update addressability for string, slice
// can't do in walk because n->left->addable
// changes if n->left is an escaping local variable.
switch(n->op) {
case OLEN:
if(isslice(n->left->type) || istype(n->left->type, TSTRING))
n->addable = n->left->addable;
break;
case OCAP:
if(isslice(n->left->type))
n->addable = n->left->addable;
break;
}
// if both are addressable, move
if(n->addable && res->addable) {
gmove(n, res);

View File

@ -959,6 +959,8 @@ int
ismem(Node *n)
{
switch(n->op) {
case OLEN:
case OCAP:
case OINDREG:
case ONAME:
case OPARAM:
@ -1762,6 +1764,18 @@ naddr(Node *n, Addr *a)
}
fatal("naddr: OADDR\n");
case OLEN:
// len of string or slice
naddr(n->left, a);
a->offset += Array_nel;
break;
case OCAP:
// cap of string or slice
naddr(n->left, a);
a->offset += Array_cap;
break;
// case OADD:
// if(n->right->op == OLITERAL) {
// v = n->right->vconst;