diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-06-30 15:34:22 +0200 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-06-30 15:34:22 +0200 | 
| commit | d39f5aa373a4422f7a5f3ee764fb0f6b0b719d61 (patch) | |
| tree | 1833f8b72a4b3a8f00d0d143b079a8fcad01c6ae /src/cmd/8g/cgen.c | |
| parent | 8652e6c371b8905498d3d314491d36c58d5f68d5 (diff) | |
| download | golang-d39f5aa373a4422f7a5f3ee764fb0f6b0b719d61.tar.gz | |
Imported Upstream version 58upstream/58
Diffstat (limited to 'src/cmd/8g/cgen.c')
| -rw-r--r-- | src/cmd/8g/cgen.c | 40 | 
1 files changed, 29 insertions, 11 deletions
| diff --git a/src/cmd/8g/cgen.c b/src/cmd/8g/cgen.c index 596824a6c..1614a2d77 100644 --- a/src/cmd/8g/cgen.c +++ b/src/cmd/8g/cgen.c @@ -232,6 +232,7 @@ cgen(Node *n, Node *res)  			cgen(nl, res);  			break;  		} +  		tempname(&n2, n->type);  		mgen(nl, &n1, res);  		gmove(&n1, &n2); @@ -277,15 +278,10 @@ cgen(Node *n, Node *res)  		if(istype(nl->type, TSTRING) || isslice(nl->type)) {  			// both slice and string have len one pointer into the struct.  			igen(nl, &n1, res); -			n1.op = OREGISTER;	// was OINDREG -			regalloc(&n2, types[TUINT32], &n1); -			n1.op = OINDREG;  			n1.type = types[TUINT32]; -			n1.xoffset = Array_nel; -			gmove(&n1, &n2); -			gmove(&n2, res); +			n1.xoffset += Array_nel; +			gmove(&n1, res);  			regfree(&n1); -			regfree(&n2);  			break;  		}  		fatal("cgen: OLEN: unknown type %lT", nl->type); @@ -594,9 +590,10 @@ agen(Node *n, Node *res)  				gmove(&n1, &n3);  			} -			nodconst(&n2, types[tptr], v*w); -			gins(optoas(OADD, types[tptr]), &n2, &n3); - +			if (v*w != 0) { +				nodconst(&n2, types[tptr], v*w); +				gins(optoas(OADD, types[tptr]), &n2, &n3); +			}  			gmove(&n3, res);  			regfree(&n3);  			break; @@ -729,7 +726,27 @@ void  igen(Node *n, Node *a, Node *res)  {  	Node n1; - +	Type *fp; +	Iter flist; +   +	switch(n->op) { +	case ONAME: +		if((n->class&PHEAP) || n->class == PPARAMREF) +			break; +		*a = *n; +		return; +  +	case OCALLFUNC: +		fp = structfirst(&flist, getoutarg(n->left->type)); +		cgen_call(n, 0); +		memset(a, 0, sizeof *a); +		a->op = OINDREG; +		a->val.u.reg = D_SP; +		a->addable = 1; +		a->xoffset = fp->width; +		a->type = n->type; +		return; +	}  	// release register for now, to avoid  	// confusing tempname.  	if(res != N && res->op == OREGISTER) @@ -919,6 +936,7 @@ bgen(Node *n, int true, Prog *to)  			n2 = n1;  			n2.op = OINDREG;  			n2.xoffset = Array_array; +			n2.type = types[tptr];  			nodconst(&tmp, types[tptr], 0);  			gins(optoas(OCMP, types[tptr]), &n2, &tmp);  			patch(gbranch(a, types[tptr]), to); | 
