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

📄 txt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "gc.h"voidginit(void){	Type *t;	thechar = '5';	thestring = "arm";	exregoffset = REGEXT;	exfregoffset = FREGEXT;	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.reg = NREG;	zprog.from.type = D_NONE;	zprog.from.name = D_NONE;	zprog.from.reg = NREG;	zprog.to = zprog.from;	zprog.scond = 0xE;  	regnode.op = OREGISTER;	regnode.class = CEXREG;	regnode.reg = REGTMP;	regnode.complex = 0;	regnode.addable = 11;	regnode.type = types[TLONG];	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();	memset(reg, 0, sizeof(reg));}voidgclean(void){	int i;	Sym *s;	for(i=0; i<NREG; i++)		if(reg[i])			diag(Z, "reg %d left allocated", i);	for(i=NREG; i<NREG+NFREG; i++)		if(reg[i])			diag(Z, "freg %d left allocated", i-NREG);	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;}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(typesuv[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 && typechlp[n->type->etype]) {		regaalloc1(tn1, n);		if(n->complex >= FNX) {			cgen(*fnxp, tn1);			(*fnxp)++;		} else			cgen(n, tn1);		return;	}	regalloc(tn1, n, Z);	if(n->complex >= FNX) {		cgen(*fnxp, tn1);		(*fnxp)++;	} else		cgen(n, tn1);	regaalloc(tn2, n);	gopcode(OAS, tn1, Z, tn2);	regfree(tn1);}Node*nodconst(long v){	constnode.vconst = v;	return &constnode;}Node*nod32const(vlong v){	constnode.vconst = v & MASK(32);	return &constnode;}Node*nodfconst(double d){	fconstnode.fconst = d;	return &fconstnode;}voidnodreg(Node *n, Node *nn, int reg){	*n = regnode;	n->reg = reg;	n->type = nn->type;	n->lineno = nn->lineno;}voidregret(Node *n, Node *nn){	int r;	r = REGRET;	if(typefd[nn->type->etype])		r = FREGRET+NREG;	nodreg(n, nn, r);	reg[r]++;}inttmpreg(void){	int i;	for(i=REGRET+1; i<NREG; i++)		if(reg[i] == 0)			return i;	diag(Z, "out of fixed registers");	return 0;}voidregalloc(Node *n, Node *tn, Node *o){	int i, j;	static int lasti;	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 >= 0 && i < NREG)				goto out;		}		j = lasti + REGRET+1;		for(i=REGRET+1; i<NREG; i++) {			if(j >= NREG)				j = REGRET+1;			if(reg[j] == 0) {				i = j;				goto out;			}			j++;		}		diag(tn, "out of fixed registers");		goto err;	case TFLOAT:	case TDOUBLE:	case TVLONG:		if(o != Z && o->op == OREGISTER) {			i = o->reg;			if(i >= NREG && i < NREG+NFREG)				goto out;		}		j = 0*2 + NREG;		for(i=NREG; i<NREG+NFREG; i++) {			if(j >= NREG+NFREG)				j = NREG;			if(reg[j] == 0) {				i = j;				goto out;			}			j++;		}		diag(tn, "out of float registers");		goto err;	}	diag(tn, "unknown type in regalloc: %T", tn->type);err:	nodreg(n, tn, 0);	return;out:	reg[i]++;/* 	lasti++;	*** StrongARM does register forwarding */		if(lasti >= 5)		lasti = 0;	nodreg(n, tn, 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]--;	return;err:	diag(n, "error in regfree: %d", 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){	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 + SZ_LONG;	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;}voidraddr(Node *n, Prog *p){	Adr a;	naddr(n, &a);	if(R0ISZERO && a.type == D_CONST && a.offset == 0) {		a.type = D_REG;		a.reg = 0;	}	if(a.type != D_REG && a.type != D_FREG) {		if(n)			diag(n, "bad in raddr: %O", n->op);		else			diag(n, "bad in raddr: <null>");		p->reg = NREG;	} else		p->reg = a.reg;}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", n->op);		break;	case OREGISTER:		a->type = D_REG;		a->sym = S;		a->reg = n->reg;		if(a->reg >= NREG) {			a->type = D_FREG;			a->reg -= NREG;		}		break;	case OIND:		naddr(n->left, a);		if(a->type == D_REG) {			a->type = D_OREG;			break;		}		if(a->type == D_CONST) {			a->type = D_OREG;			break;		}		goto bad;	case OINDREG:		a->type = D_OREG;		a->sym = S;		a->offset = n->xoffset;		a->reg = n->reg;		break;	case ONAME:		a->etype = n->etype;		a->type = D_OREG;		a->name = D_STATIC;		a->sym = n->sym;		a->offset = n->xoffset;		if(n->class == CSTATIC)			break;		if(n->class == CEXTERN || n->class == CGLOBL) {			a->name = D_EXTERN;			break;		}		if(n->class == CAUTO) {			a->name = D_AUTO;			break;		}		if(n->class == CPARAM) {			a->name = D_PARAM;			break;		}		goto bad;	case OCONST:		a->sym = S;		a->reg = NREG;		if(typefd[n->type->etype]) {			a->type = D_FCONST;			a->dval = n->fconst;		} else {			a->type = D_CONST;			a->offset = n->vconst;		}		break;	case OADDR:		naddr(n->left, a);		if(a->type == D_OREG) {			a->type = D_CONST;			break;		}		goto bad;	case OADD:		if(n->left->op == OCONST) {			naddr(n->left, a);			v = a->offset;			naddr(n->right, a);		} else {			naddr(n->right, a);			v = a->offset;			naddr(n->left, a);		}		a->offset += v;		break;	}}voidfop(int as, int f1, int f2, Node *t){	Node nod1, nod2, nod3;	nodreg(&nod1, t, NREG+f1);	nodreg(&nod2, t, NREG+f2);	regalloc(&nod3, t, t);	gopcode(as, &nod1, &nod2, &nod3);	gmove(&nod3, t);	regfree(&nod3);}voidgmovm(Node *f, Node *t, int w){	gins(AMOVM, f, t);	p->scond |= C_UBIT;	if(w)		p->scond |= C_WBIT;}voidgmove(Node *f, Node *t){	int ft, tt, a;	Node nod;	ft = f->type->etype;	tt = t->type->etype;	if(ft == TDOUBLE && f->op == OCONST) {	}	if(ft == TFLOAT && f->op == OCONST) {	}	/*	 * a load --	 * put it into a register then	 * worry what to do with it.	 */	if(f->op == ONAME || f->op == OINDREG || f->op == OIND) {		switch(ft) {		default:			a = AMOVW;			break;		case TFLOAT:			a = AMOVF;			break;		case TDOUBLE:			a = AMOVD;			break;		case TCHAR:			a = AMOVB;			break;		case TUCHAR:			a = AMOVBU;			break;		case TSHORT:			a = AMOVH;			break;		case TUSHORT:			a = AMOVHU;			break;		}		if(typechlp[ft] && typeilp[tt])			regalloc(&nod, t, t);		else			regalloc(&nod, f, t);		gins(a, f, &nod);		gmove(&nod, t);		regfree(&nod);		return;	}	/*	 * a store --	 * put it into a register then	 * store it.	 */	if(t->op == ONAME || t->op == OINDREG || t->op == OIND) {		switch(tt) {		default:			a = AMOVW;			break;		case TUCHAR:			a = AMOVBU;			break;		case TCHAR:			a = AMOVB;			break;		case TUSHORT:			a = AMOVHU;			break;		case TSHORT:			a = AMOVH;			break;		case TFLOAT:			a = AMOVF;			break;

⌨️ 快捷键说明

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