diff options
Diffstat (limited to 'src/cmd/8c')
| -rw-r--r-- | src/cmd/8c/gc.h | 1 | ||||
| -rw-r--r-- | src/cmd/8c/list.c | 4 | ||||
| -rw-r--r-- | src/cmd/8c/sgen.c | 32 | ||||
| -rw-r--r-- | src/cmd/8c/swt.c | 15 | ||||
| -rw-r--r-- | src/cmd/8c/txt.c | 13 | 
5 files changed, 64 insertions, 1 deletions
| diff --git a/src/cmd/8c/gc.h b/src/cmd/8c/gc.h index c30eb55bc..55a37c42c 100644 --- a/src/cmd/8c/gc.h +++ b/src/cmd/8c/gc.h @@ -66,6 +66,7 @@ EXTERN	struct  struct	Adr  {  	int32	offset; +	int32	offset2;  	double	dval;  	char	sval[NSNAME]; diff --git a/src/cmd/8c/list.c b/src/cmd/8c/list.c index d700b63af..ec5ac9d60 100644 --- a/src/cmd/8c/list.c +++ b/src/cmd/8c/list.c @@ -154,6 +154,10 @@ Dconv(Fmt *fp)  		sprint(str, "$%ld", a->offset);  		break; +	case D_CONST2: +		sprint(str, "$%ld-%ld", a->offset, a->offset2); +		break; +  	case D_FCONST:  		sprint(str, "$(%.17e)", a->dval);  		break; diff --git a/src/cmd/8c/sgen.c b/src/cmd/8c/sgen.c index 14bd32adb..c4d5665d8 100644 --- a/src/cmd/8c/sgen.c +++ b/src/cmd/8c/sgen.c @@ -30,6 +30,31 @@  #include "gc.h" +int32 +argsize(void) +{ +	Type *t; +	int32 s; + +//print("t=%T\n", thisfn); +	s = 0; +	for(t=thisfn->down; t!=T; t=t->down) { +		switch(t->etype) { +		case TVOID: +			break; +		case TDOT: +			s += 64; +			break; +		default: +			s = align(s, t, Aarg1); +			s = align(s, t, Aarg2); +			break; +		} +//print("	%d %T\n", s, t); +	} +	return (s+7) & ~7; +} +  void  codgen(Node *n, Node *nn)  { @@ -52,7 +77,10 @@ codgen(Node *n, Node *nn)  			break;  	}  	nearln = nn->lineno; +  	gpseudo(ATEXT, n1->sym, nodconst(stkoff)); +	p->to.type = D_CONST2; +	p->to.offset2 = argsize();  	/*  	 * isolate first argument @@ -494,6 +522,10 @@ xcom(Node *n)  			n->addable = 11;  		break; +	case OEXREG: +		n->addable = 10; +		break; +  	case OREGISTER:  		n->addable = 12;  		break; diff --git a/src/cmd/8c/swt.c b/src/cmd/8c/swt.c index 13e9a51e3..6d693337a 100644 --- a/src/cmd/8c/swt.c +++ b/src/cmd/8c/swt.c @@ -328,7 +328,10 @@ outcode(void)  		return;  	}  	Binit(&b, f, OWRITE); -	Bseek(&b, 0L, 2); + +	Bprint(&b, "%s\n", thestring); +	Bprint(&b, "!\n"); +  	outhist(&b);  	for(sym=0; sym<NSYM; sym++) {  		h[sym].sym = S; @@ -530,6 +533,9 @@ zaddr(Biobuf *b, Adr *a, int s)  	case D_SCONST:  		t |= T_SCONST;  		break; +	case D_CONST2: +		t |= T_OFFSET|T_OFFSET2; +		break;  	}  	Bputc(b, t); @@ -544,6 +550,13 @@ zaddr(Biobuf *b, Adr *a, int s)  		Bputc(b, l>>16);  		Bputc(b, l>>24);  	} +	if(t & T_OFFSET2) {	/* implies offset2 */ +		l = a->offset2; +		Bputc(b, l); +		Bputc(b, l>>8); +		Bputc(b, l>>16); +		Bputc(b, l>>24); +	}  	if(t & T_SYM)		/* implies sym */  		Bputc(b, s);  	if(t & T_FCONST) { diff --git a/src/cmd/8c/txt.c b/src/cmd/8c/txt.c index 4e95f3c7a..5cc43e0e9 100644 --- a/src/cmd/8c/txt.c +++ b/src/cmd/8c/txt.c @@ -449,6 +449,10 @@ naddr(Node *n, Adr *a)  		a->sym = S;  		break; +	case OEXREG: +		a->type = D_INDIR + D_FS; +		a->offset = n->reg - 1; +		break;  	case OIND:  		naddr(n->left, a); @@ -1389,6 +1393,15 @@ sconst(Node *n)  int32  exreg(Type *t)  { +	int32 o; + +	if(typechlp[t->etype]){ +		if(exregoffset >= 32) +			return 0; +		o = exregoffset; +		exregoffset += 4; +		return o+1;	// +1 to avoid 0 == failure; naddr case OEXREG will -1. +	}  	USED(t);  	return 0; | 
