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:
parent
33c1045056
commit
30228a3bc6
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user