⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "gc.h"voidginit(void){	int i;	Type *t;	thechar = '8';	thestring = "386";	exregoffset = 0;	exfregoffset = 0;	listinit();	nstring = 0;	mnstring = 0;	nrathole = 0;	pc = 0;	breakpc = -1;	continpc = -1;	cases = C;	firstp = P;	lastp = P;	tfield = types[TLONG];	zprog.link = P;	zprog.as = AGOK;	zprog.from.type = D_NONE;	zprog.from.index = D_NONE;	zprog.from.scale = 0;	zprog.to = zprog.from;	regnode.op = OREGISTER;	regnode.class = CEXREG;	regnode.reg = REGTMP;	regnode.complex = 0;	regnode.addable = 11;	regnode.type = types[TLONG];	fregnode0 = regnode;	fregnode0.reg = D_F0;	fregnode0.type = types[TDOUBLE];	fregnode1 = fregnode0;	fregnode1.reg = D_F0+1;	constnode.op = OCONST;	constnode.class = CXXX;	constnode.complex = 0;	constnode.addable = 20;	constnode.type = types[TLONG];	fconstnode.op = OCONST;	fconstnode.class = CXXX;	fconstnode.complex = 0;	fconstnode.addable = 20;	fconstnode.type = types[TDOUBLE];	nodsafe = new(ONAME, Z, Z);	nodsafe->sym = slookup(".safe");	nodsafe->type = types[TINT];	nodsafe->etype = types[TINT]->etype;	nodsafe->class = CAUTO;	complex(nodsafe);	t = typ(TARRAY, types[TCHAR]);	symrathole = slookup(".rathole");	symrathole->class = CGLOBL;	symrathole->type = t;	nodrat = new(ONAME, Z, Z);	nodrat->sym = symrathole;	nodrat->type = types[TIND];	nodrat->etype = TVOID;	nodrat->class = CGLOBL;	complex(nodrat);	nodrat->type = t;	nodret = new(ONAME, Z, Z);	nodret->sym = slookup(".ret");	nodret->type = types[TIND];	nodret->etype = TIND;	nodret->class = CPARAM;	nodret = new(OIND, nodret, Z);	complex(nodret);	com64init();	for(i=0; i<nelem(reg); i++) {		reg[i] = 1;		if(i >= D_AX && i <= D_DI && i != D_SP)			reg[i] = 0;	}}voidgclean(void){	int i;	Sym *s;	reg[D_SP]--;	for(i=D_AX; i<=D_DI; i++)		if(reg[i])			diag(Z, "reg %R left allocated", i);	while(mnstring)		outstring("", 1L);	symstring->type->width = nstring;	symrathole->type->width = nrathole;	for(i=0; i<NHASH; i++)	for(s = hash[i]; s != S; s = s->link) {		if(s->type == T)			continue;		if(s->type->width == 0)			continue;		if(s->class != CGLOBL && s->class != CSTATIC)			continue;		if(s->type == types[TENUM])			continue;		gpseudo(AGLOBL, s, nodconst(s->type->width));	}	nextpc();	p->as = AEND;	outcode();}voidnextpc(void){	p = alloc(sizeof(*p));	*p = zprog;	p->lineno = nearln;	pc++;	if(firstp == P) {		firstp = p;		lastp = p;		return;	}	lastp->link = p;	lastp = p;}voidgargs(Node *n, Node *tn1, Node *tn2){	long regs;	Node fnxargs[20], *fnxp;	regs = cursafe;	fnxp = fnxargs;	garg1(n, tn1, tn2, 0, &fnxp);	/* compile fns to temps */	curarg = 0;	fnxp = fnxargs;	garg1(n, tn1, tn2, 1, &fnxp);	/* compile normal args and temps */	cursafe = regs;}int nareg(void){	int i, n;	n = 0;	for(i=D_AX; i<=D_DI; i++)		if(reg[i] == 0)			n++;	return n;}voidgarg1(Node *n, Node *tn1, Node *tn2, int f, Node **fnxp){	Node nod;	if(n == Z)		return;	if(n->op == OLIST) {		garg1(n->left, tn1, tn2, f, fnxp);		garg1(n->right, tn1, tn2, f, fnxp);		return;	}	if(f == 0) {		if(n->complex >= FNX) {			regsalloc(*fnxp, n);			nod = znode;			nod.op = OAS;			nod.left = *fnxp;			nod.right = n;			nod.type = n->type;			cgen(&nod, Z);			(*fnxp)++;		}		return;	}	if(typesu[n->type->etype] || typev[n->type->etype]) {		regaalloc(tn2, n);		if(n->complex >= FNX) {			sugen(*fnxp, tn2, n->type->width);			(*fnxp)++;		} else			sugen(n, tn2, n->type->width);		return;	}	if(REGARG>=0 && curarg == 0 && typeilp[n->type->etype]) {		regaalloc1(tn1, n);		if(n->complex >= FNX) {			cgen(*fnxp, tn1);			(*fnxp)++;		} else			cgen(n, tn1);		return;	}	if(vconst(n) == 0) {		regaalloc(tn2, n);		gmove(n, tn2);		return;	}	regalloc(tn1, n, Z);	if(n->complex >= FNX) {		cgen(*fnxp, tn1);		(*fnxp)++;	} else		cgen(n, tn1);	regaalloc(tn2, n);	gmove(tn1, tn2);	regfree(tn1);}Node*nodconst(long v){	constnode.vconst = v;	return &constnode;}Node*nodfconst(double d){	fconstnode.fconst = d;	return &fconstnode;}intisreg(Node *n, int r){	if(n->op == OREGISTER)		if(n->reg == r)			return 1;	return 0;}intnodreg(Node *n, Node *nn, int r){	*n = regnode;	n->reg = r;	if(reg[r] == 0)		return 0;	if(nn != Z) {		n->type = nn->type;		n->lineno = nn->lineno;		if(nn->op == OREGISTER)		if(nn->reg == r)			return 0;	}	return 1;}voidregret(Node *n, Node *nn){	int r;	r = REGRET;	if(typefd[nn->type->etype])		r = FREGRET;	nodreg(n, nn, r);	reg[r]++;}voidregalloc(Node *n, Node *tn, Node *o){	int i;	switch(tn->type->etype) {	case TCHAR:	case TUCHAR:	case TSHORT:	case TUSHORT:	case TINT:	case TUINT:	case TLONG:	case TULONG:	case TIND:		if(o != Z && o->op == OREGISTER) {			i = o->reg;			if(i >= D_AX && i <= D_DI)				goto out;		}		for(i=D_AX; i<=D_DI; i++)			if(reg[i] == 0)				goto out;		diag(tn, "out of fixed registers");abort();		goto err;	case TFLOAT:	case TDOUBLE:	case TVLONG:		i = D_F0;		goto out;	}	diag(tn, "unknown type in regalloc: %T", tn->type);err:	i = 0;out:	if(i)		reg[i]++;	nodreg(n, tn, i);//print("+ %R %d\n", i, reg[i]);}voidregialloc(Node *n, Node *tn, Node *o){	Node nod;	nod = *tn;	nod.type = types[TIND];	regalloc(n, &nod, o);}voidregfree(Node *n){	int i;	i = 0;	if(n->op != OREGISTER && n->op != OINDREG)		goto err;	i = n->reg;	if(i < 0 || i >= sizeof(reg))		goto err;	if(reg[i] <= 0)		goto err;	reg[i]--;//print("- %R %d\n", i, reg[i]);	return;err:	diag(n, "error in regfree: %R", i);}voidregsalloc(Node *n, Node *nn){	cursafe = align(cursafe, nn->type, Aaut3);	maxargsafe = maxround(maxargsafe, cursafe+curarg);	*n = *nodsafe;	n->xoffset = -(stkoff + cursafe);	n->type = nn->type;	n->etype = nn->type->etype;	n->lineno = nn->lineno;}voidregaalloc1(Node *n, Node *nn){	USED(nn);	if(REGARG < 0) {		diag(n, "regaalloc1");		return;	}/* not reached 	nodreg(n, nn, REGARG);	reg[REGARG]++;	curarg = align(curarg, nn->type, Aarg1);	curarg = align(curarg, nn->type, Aarg2);	maxargsafe = maxround(maxargsafe, cursafe+curarg);*/}voidregaalloc(Node *n, Node *nn){	curarg = align(curarg, nn->type, Aarg1);	*n = *nn;	n->op = OINDREG;	n->reg = REGSP;	n->xoffset = curarg;	n->complex = 0;	n->addable = 20;	curarg = align(curarg, nn->type, Aarg2);	maxargsafe = maxround(maxargsafe, cursafe+curarg);}voidregind(Node *n, Node *nn){	if(n->op != OREGISTER) {		diag(n, "regind not OREGISTER");		return;	}	n->op = OINDREG;	n->type = nn->type;}voidnaddr(Node *n, Adr *a){	long v;	a->type = D_NONE;	if(n == Z)		return;	switch(n->op) {	default:	bad:		diag(n, "bad in naddr: %O %D", n->op, a);//prtree(n, "naddr");		break;	case OREGISTER:		a->type = n->reg;		a->sym = S;		break;	case OIND:		naddr(n->left, a);		if(a->type >= D_AX && a->type <= D_DI)			a->type += D_INDIR;		else		if(a->type == D_CONST)			a->type = D_NONE+D_INDIR;		else		if(a->type == D_ADDR) {			a->type = a->index;			a->index = D_NONE;		} else			goto bad;		break;	case OINDEX:		a->type = idx.ptr;		if(n->left->op == OADDR || n->left->op == OCONST)			naddr(n->left, a);		if(a->type >= D_AX && a->type <= D_DI)			a->type += D_INDIR;		else		if(a->type == D_CONST)			a->type = D_NONE+D_INDIR;		else		if(a->type == D_ADDR) {			a->type = a->index;			a->index = D_NONE;		} else			goto bad;		a->index = idx.reg;		a->scale = n->scale;		a->offset += n->xoffset;		break;	case OINDREG:		a->type = n->reg+D_INDIR;		a->sym = S;		a->offset = n->xoffset;		break;	case ONAME:		a->etype = n->etype;		a->type = D_STATIC;		a->sym = n->sym;		a->offset = n->xoffset;		if(n->class == CSTATIC)			break;		if(n->class == CEXTERN || n->class == CGLOBL) {			a->type = D_EXTERN;			break;		}		if(n->class == CAUTO) {			a->type = D_AUTO;			break;		}		if(n->class == CPARAM) {			a->type = D_PARAM;			break;		}		goto bad;	case OCONST:		if(typefd[n->type->etype]) {			a->type = D_FCONST;			a->dval = n->fconst;			break;		}		a->sym = S;		a->type = D_CONST;		a->offset = n->vconst;		break;	case OADDR:		naddr(n->left, a);		if(a->type >= D_INDIR) {			a->type -= D_INDIR;			break;		}		if(a->type == D_EXTERN || a->type == D_STATIC ||		   a->type == D_AUTO || a->type == D_PARAM)			if(a->index == D_NONE) {				a->index = a->type;				a->type = D_ADDR;				break;			}		goto bad;	case OADD:		if(n->right->op == OCONST) {			v = n->right->vconst;			naddr(n->left, a);		} else		if(n->left->op == OCONST) {			v = n->left->vconst;			naddr(n->right, a);		} else			goto bad;		a->offset += v;		break;	}}#define	CASE(a,b)	((a<<8)|(b<<0))voidgmove(Node *f, Node *t){	int ft, tt, a;	Node nod, nod1;	Prog *p1;	ft = f->type->etype;	tt = t->type->etype;	if(debug['M'])		print("gop: %O %O[%s],%O[%s]\n", OAS,			f->op, tnames[ft], t->op, tnames[tt]);	if(typefd[ft] && f->op == OCONST) {		if(f->fconst == 0)			gins(AFLDZ, Z, Z);		else		if(f->fconst == 1)			gins(AFLD1, Z, Z);		else			gins(AFMOVD, f, &fregnode0);		gmove(&fregnode0, t);		return;	}/* * load */	if(f->op == ONAME || f->op == OINDREG ||	   f->op == OIND || f->op == OINDEX)	switch(ft) {	case TCHAR:		a = AMOVBLSX;		goto ld;	case TUCHAR:		a = AMOVBLZX;		goto ld;	case TSHORT:		if(typefd[tt]) {			gins(AFMOVW, f, &fregnode0);			gmove(&fregnode0, t);			return;		}		a = AMOVWLSX;		goto ld;	case TUSHORT:		a = AMOVWLZX;		goto ld;	case TINT:	case TUINT:	case TLONG:	case TULONG:	case TIND:		if(typefd[tt]) {			gins(AFMOVL, f, &fregnode0);			gmove(&fregnode0, t);			return;		}		a = AMOVL;	ld:		regalloc(&nod, f, t);		nod.type = types[TLONG];		gins(a, f, &nod);		gmove(&nod, t);		regfree(&nod);		return;	case TFLOAT:		gins(AFMOVF, f, t);		return;	case TDOUBLE:		gins(AFMOVD, f, t);		return;	case TVLONG:		gins(AFMOVV, f, t);		return;	}/* * store */	if(t->op == ONAME || t->op == OINDREG ||	   t->op == OIND || t->op == OINDEX)	switch(tt) {	case TCHAR:	case TUCHAR:		a = AMOVB;	goto st;	case TSHORT:	case TUSHORT:		a = AMOVW;	goto st;	case TINT:	case TUINT:	case TLONG:	case TULONG:	case TIND:		a = AMOVL;	goto st;	st:		if(f->op == OCONST) {			gins(a, f, t);			return;		}		regalloc(&nod, t, f);		gmove(f, &nod);		gins(a, &nod, t);		regfree(&nod);		return;	case TFLOAT:		gins(AFMOVFP, f, t);		return;	case TDOUBLE:		gins(AFMOVDP, f, t);		return;	case TVLONG:		gins(AFMOVVP, f, t);		return;	}/* * convert */	switch(CASE(ft,tt)) {	default:/* * integer to integer ********		a = AGOK;	break;	case CASE(	TCHAR,	TCHAR):	case CASE(	TUCHAR,	TCHAR):	case CASE(	TSHORT,	TCHAR):	case CASE(	TUSHORT,TCHAR):	case CASE(	TINT,	TCHAR):	case CASE(	TUINT,	TCHAR):	case CASE(	TLONG,	TCHAR):	case CASE(	TULONG,	TCHAR):	case CASE(	TIND,	TCHAR):	case CASE(	TCHAR,	TUCHAR):	case CASE(	TUCHAR,	TUCHAR):	case CASE(	TSHORT,	TUCHAR):	case CASE(	TUSHORT,TUCHAR):	case CASE(	TINT,	TUCHAR):	case CASE(	TUINT,	TUCHAR):	case CASE(	TLONG,	TUCHAR):	case CASE(	TULONG,	TUCHAR):	case CASE(	TIND,	TUCHAR):	case CASE(	TSHORT,	TSHORT):	case CASE(	TUSHORT,TSHORT):	case CASE(	TINT,	TSHORT):	case CASE(	TUINT,	TSHORT):	case CASE(	TLONG,	TSHORT):	case CASE(	TULONG,	TSHORT):	case CASE(	TIND,	TSHORT):	case CASE(	TSHORT,	TUSHORT):	case CASE(	TUSHORT,TUSHORT):	case CASE(	TINT,	TUSHORT):	case CASE(	TUINT,	TUSHORT):	case CASE(	TLONG,	TUSHORT):	case CASE(	TULONG,	TUSHORT):	case CASE(	TIND,	TUSHORT):	case CASE(	TINT,	TINT):

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -