while(n->op == OCONVNOP)
n = n->left;
- // static initializations
- if(initflag && gen_as_init(n, res))
- goto ret;
-
if(n->ullman >= UINF) {
if(n->op == OINDREG)
fatal("cgen: this is going to misscompile");
void allocparams(void);
void checklabels();
void ginscall(Node*, int);
-int gen_as_init(Node*, Node*);
/*
* cgen
}
int
-gen_as_init(Node *nr, Node *nl)
+gen_as_init(Node *n)
{
- Node nam, nod1;
- Prog *p;
-
- if(!initflag)
- goto no;
-
- if(nr == N) {
- if(!stataddr(&nam, nl))
- goto no;
- if(nam.class != PEXTERN)
- goto no;
- return 1;
- }
-
- if(nr->op == OCOMPSLICE) {
- // create a slice pointing to an array
- if(!stataddr(&nam, nl)) {
- dump("stataddr", nl);
- goto no;
- }
-
- p = gins(ADATA, &nam, nr->left);
- p->reg = types[tptr]->width;
- p->to.type = D_CONST;
-//print("%P\n", p);
-
- nodconst(&nod1, types[TINT32], nr->left->type->bound);
- p = gins(ADATA, &nam, &nod1);
- p->reg = types[TINT32]->width;
- p->from.offset += types[tptr]->width;
-//print("%P\n", p);
-
- p = gins(ADATA, &nam, &nod1);
- p->reg = types[TINT32]->width;
- p->from.offset += types[tptr]->width+types[TINT32]->width;
-
- goto yes;
- }
-
- if(nr->op == OCOMPMAP) {
- goto yes;
- }
-
- if(nr->type == T ||
- !eqtype(nl->type, nr->type))
- goto no;
-
- if(!stataddr(&nam, nl))
- goto no;
- if(nam.class != PEXTERN)
- goto no;
-
- switch(nr->op) {
- default:
- goto no;
-
- case OLITERAL:
- goto lit;
- }
-
-no:
return 0;
-
-lit:
- switch(nr->type->etype) {
- default:
- goto no;
-
- case TBOOL:
- if(memcmp(nam.sym->name, "initdoneĀ·", 9) == 0)
- goto no;
- case TINT8:
- case TUINT8:
- case TINT16:
- case TUINT16:
- case TINT32:
- case TUINT32:
- case TINT64:
- case TUINT64:
- case TINT:
- case TUINT:
- case TFLOAT32:
- case TFLOAT64:
- case TFLOAT:
- p = gins(ADATA, &nam, nr);
- p->reg = nr->type->width;
- break;
-
- case TSTRING:
- p = gins(ADATA, &nam, N);
- datastring(nr->val.u.sval->s, nr->val.u.sval->len, &p->to);
- p->reg = types[tptr]->width;
- p->to.type = D_CONST;
-//print("%P\n", p);
-
- nodconst(&nod1, types[TINT32], nr->val.u.sval->len);
- p = gins(ADATA, &nam, &nod1);
- p->reg = types[TINT32]->width;
- p->from.offset += types[tptr]->width;
-//print("%P\n", p);
-
- p = gins(ADATA, &nam, &nod1);
- p->reg = types[TINT32]->width;
- p->from.offset += types[tptr]->width+types[TINT32]->width;
- break;
- }
-
-yes:
-//dump("\ngen_as_init", nl);
-//dump("", nr);
-//print("%P\n", p);
- return 1;
}
while(n->op == OCONVNOP)
n = n->left;
- // static initializations
- if(initflag && gen_as_init(n, res))
- return;
-
// function calls on both sides? introduce temporary
if(n->ullman >= UINF && res->ullman >= UINF) {
tempalloc(&n1, n->type);
}
int
-gen_as_init(Node *nr, Node *nl)
+gen_as_init(Node *n)
{
- Node nam, nod1, nhi, nlo;
- Prog *p;
- Addr a;
-
- if(!initflag)
- goto no;
-
- if(nr == N) {
- if(!stataddr(&nam, nl))
- goto no;
- if(nam.class != PEXTERN)
- goto no;
- return 1;
- }
-
- if(nr->op == OCOMPSLICE) {
- // create a slice pointing to an array
- if(!stataddr(&nam, nl)) {
- dump("stataddr", nl);
- goto no;
- }
-
- data();
- p = gins(ADATA, &nam, nr->left);
- p->from.scale = types[tptr]->width;
- p->to.index = p->to.type;
- p->to.type = D_ADDR;
-//print("%P\n", p);
-
- nodconst(&nod1, types[TINT32], nr->left->type->bound);
- p = gins(ADATA, &nam, &nod1);
- p->from.scale = types[TINT32]->width;
- p->from.offset += types[tptr]->width;
-//print("%P\n", p);
-
- p = gins(ADATA, &nam, &nod1);
- p->from.scale = types[TINT32]->width;
- p->from.offset += types[tptr]->width+types[TINT32]->width;
- text();
-
- goto yes;
- }
-
- if(nr->op == OCOMPMAP) {
- goto yes;
- }
-
- if(nr->type == T ||
- !eqtype(nl->type, nr->type))
- goto no;
-
- if(!stataddr(&nam, nl))
- goto no;
- if(nam.class != PEXTERN)
- goto no;
-
- switch(nr->op) {
- default:
- goto no;
-
- case OLITERAL:
- goto lit;
- }
-
-no:
return 0;
-
-lit:
- switch(nr->type->etype) {
- default:
- goto no;
-
- case TBOOL:
- if(memcmp(nam.sym->name, "initdoneĀ·", 9) == 0)
- goto no;
- case TINT8:
- case TUINT8:
- case TINT16:
- case TUINT16:
- case TINT32:
- case TUINT32:
- case TINT:
- case TUINT:
- case TFLOAT32:
- case TFLOAT64:
- case TFLOAT:
- data();
- p = gins(ADATA, &nam, nr);
- p->from.scale = nr->type->width;
- text();
- break;
-
- case TINT64:
- case TUINT64:
- data();
- split64(nr, &nlo, &nhi);
- p = gins(ADATA, &nam, &nlo);
- p->from.scale = 4;
- p = gins(ADATA, &nam, &nhi);
- p->from.scale = 4;
- p->from.offset += 4;
- splitclean();
- text();
- break;
-
- case TSTRING:
- datastring(nr->val.u.sval->s, nr->val.u.sval->len, &a);
- data();
- p = gins(ADATA, &nam, N);
- p->from.scale = types[tptr]->width;
- p->to = a;
- p->to.index = p->to.type;
- p->to.type = D_ADDR;
-//print("%P\n", p);
-
- nodconst(&nod1, types[TINT32], nr->val.u.sval->len);
- p = gins(ADATA, &nam, &nod1);
- p->from.scale = types[TINT32]->width;
- p->from.offset += types[tptr]->width;
-//print("%P\n", p);
- text();
- break;
- }
-
-yes:
-//dump("\ngen_as_init", nl);
-//dump("", nr);
-//print("%P\n", p);
- return 1;
}