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

📄 txt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
		case TSHORT:			a = AMOVH;			break;		case TUSHORT:			a = AMOVHU;			break;		}		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:			if(typefd[ft]) {				/* special case can store mem from Freg */				regalloc(&nod, f, Z);				a = AFMOVDW;				if(ft == TFLOAT)					a = AFMOVFW;				gins(a, f, &nod);				gins(AMOVW, &nod, t);				regfree(&nod);				return;			}			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 = AFMOVF;			break;		case TVLONG:		case TDOUBLE:			a = AFMOVD;			break;		}		if(!typefd[ft] && vconst(f) == 0) {			gins(a, f, t);			return;		}		if(ft == tt)			regalloc(&nod, t, f);		else			regalloc(&nod, t, Z);		gmove(f, &nod);		gins(a, &nod, t);		regfree(&nod);		return;	}	/*	 * type x type cross table	 */	a = AGOK;	switch(ft) {	case TDOUBLE:	case TVLONG:	case TFLOAT:		switch(tt) {		case TDOUBLE:		case TVLONG:			a = AFMOVD;			if(ft == TFLOAT)				a = AFMOVFD;			break;		case TFLOAT:			a = AFMOVDF;			if(ft == TFLOAT)				a = AFMOVF;			break;		case TLONG:		case TULONG:		case TIND:		case TINT:		case TUINT:		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			regalloc(&nod, f, Z);	/* should be type float */			a = AFMOVDW;			if(ft == TFLOAT)				a = AFMOVFW;			gins(a, f, &nod);			gins(AFMOVF, &nod, nodrat);			regfree(&nod);			gins(AMOVW, nodrat, t);			gmove(t, t);			if(nrathole < SZ_LONG)				nrathole = SZ_LONG;			return;		}		break;	case TINT:	case TUINT:	case TLONG:	case TULONG:	case TIND:		switch(tt) {		case TDOUBLE:		case TVLONG:		case TFLOAT:			goto fxtofl;		case TLONG:		case TULONG:		case TINT:		case TUINT:		case TIND:		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	case TSHORT:		switch(tt) {		case TDOUBLE:		case TVLONG:		case TFLOAT:			goto fxtofl;		case TUINT:		case TINT:		case TULONG:		case TLONG:		case TIND:			a = AMOVH;			break;		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	case TUSHORT:		switch(tt) {		case TDOUBLE:		case TVLONG:		case TFLOAT:			goto fxtofl;		case TINT:		case TUINT:		case TLONG:		case TULONG:		case TIND:			a = AMOVHU;			break;		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	case TCHAR:		switch(tt) {		case TDOUBLE:		case TVLONG:		case TFLOAT:			goto fxtofl;		case TINT:		case TUINT:		case TLONG:		case TULONG:		case TIND:		case TSHORT:		case TUSHORT:			a = AMOVB;			break;		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	case TUCHAR:		switch(tt) {		case TDOUBLE:		case TVLONG:		case TFLOAT:		fxtofl:			regalloc(&nod, t, t);	/* should be type float */			gins(AMOVW, f, nodrat);			gins(AFMOVF, nodrat, &nod);			a = AFMOVWD;			if(tt == TFLOAT)				a = AFMOVWF;			gins(a, &nod, t);			regfree(&nod);			if(nrathole < SZ_LONG)				nrathole = SZ_LONG;			if(ft == TULONG) {				regalloc(&nod, t, Z);				if(tt == TFLOAT) {					gins(AFCMPF, t, Z);					p->to.type = D_FREG;					p->to.reg = FREGZERO;					gins(AFBGE, Z, Z);					p1 = p;					gins(AFMOVF, nodfconst(4294967296.), &nod);					gins(AFADDF, &nod, t);				} else {					gins(AFCMPD, t, Z);					p->to.type = D_FREG;					p->to.reg = FREGZERO;					gins(AFBGE, Z, Z);					p1 = p;					gins(AFMOVD, nodfconst(4294967296.), &nod);					gins(AFADDD, &nod, t);				}				patch(p1, pc);				regfree(&nod);			}			return;		case TINT:		case TUINT:		case TLONG:		case TULONG:		case TIND:		case TSHORT:		case TUSHORT:			a = AMOVBU;			break;		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	}	if(a == AGOK)		diag(Z, "bad opcode in gmove %T -> %T", f->type, t->type);	if(a == AMOVW || a == AFMOVF || a == AFMOVD)	if(samaddr(f, t))		return;	gins(a, f, t);}voidgins(int a, Node *f, Node *t){	nextpc();	p->as = a;	if(f != Z)		naddr(f, &p->from);	if(t != Z)		naddr(t, &p->to);	if(debug['g'])		print("%P\n", p);}voidgopcode(int o, Node *f1, Node *f2, Node *t){	int a, et;	Adr ta;	et = TLONG;	if(f1 != Z && f1->type != T)		et = f1->type->etype;	a = AGOK;	switch(o) {	case OAS:		gmove(f1, t);		return;	case OASADD:	case OADD:		a = AADD;		if(et == TFLOAT)			a = AFADDF;		else		if(et == TDOUBLE || et == TVLONG)			a = AFADDD;		break;	case OASSUB:	case OSUB:		a = ASUB;		if(et == TFLOAT)			a = AFSUBF;		else		if(et == TDOUBLE || et == TVLONG)			a = AFSUBD;		break;	case OASOR:	case OOR:		a = AOR;		break;	case OASAND:	case OAND:		a = AAND;		break;	case OASXOR:	case OXOR:		a = AXOR;		break;	case OASLSHR:	case OLSHR:		a = ASRL;		break;	case OASASHR:	case OASHR:		a = ASRA;		break;	case OASASHL:	case OASHL:		a = ASLL;		break;	case OFUNC:		a = AJMPL;		break;	case OASLMUL:	case OLMUL:	case OASMUL:	case OMUL:		if(et == TFLOAT) {			a = AFMULF;			break;		} else		if(et == TDOUBLE || et == TVLONG) {			a = AFMULD;			break;		}		a = AMUL;		break;	case OASDIV:	case ODIV:		if(et == TFLOAT) {			a = AFDIVF;			break;		} else		if(et == TDOUBLE || et == TVLONG) {			a = AFDIVD;			break;		}		a = ADIV;		break;	case OASMOD:	case OMOD:		a = AMOD;		break;	case OASLMOD:	case OLMOD:		a = AMODL;		break;	case OASLDIV:	case OLDIV:		a = ADIVL;		break;	case OEQ:		a = ABE;		if(typefd[et])			a = AFBE;		goto cmp;	case ONE:		a = ABNE;		if(typefd[et])			a = AFBLG;		goto cmp;	case OLT:		a = ABL;		if(typefd[et])			a = AFBL;		goto cmp;	case OLE:		a = ABLE;		if(typefd[et])			a = AFBLE;		goto cmp;	case OGE:		a = ABGE;		if(typefd[et])			a = AFBGE;		goto cmp;	case OGT:		a = ABG;		if(typefd[et])			a = AFBG;		goto cmp;	case OLO:		a = ABCS;		goto cmp;	case OLS:		a = ABLEU;		goto cmp;	case OHS:		a = ABCC;		goto cmp;	case OHI:		a = ABGU;		goto cmp;	cmp:		nextpc();		p->as = ACMP;		if(et == TFLOAT)			p->as = AFCMPF;		else		if(et == TDOUBLE || et == TVLONG)			p->as = AFCMPD;		if(f1 != Z)			naddr(f1, &p->from);		if(t != Z)			naddr(t, &p->to);		if(f1 == Z || t == Z || f2 != Z)			diag(Z, "bad cmp in gopcode %O", o);		if(debug['g'])			print("%P\n", p);		f1 = Z;		f2 = Z;		t = Z;		break;	}	if(a == AGOK)		diag(Z, "bad in gopcode %O", o);	nextpc();	p->as = a;	if(f1 != Z)		naddr(f1, &p->from);	if(f2 != Z) {		naddr(f2, &ta);		p->reg = ta.reg;		if(ta.type == D_CONST && ta.offset == 0)			p->reg = REGZERO;	}	if(t != Z)		naddr(t, &p->to);	if(debug['g'])		print("%P\n", p);}samaddr(Node *f, Node *t){	if(f->op != t->op)		return 0;	switch(f->op) {	case OREGISTER:		if(f->reg != t->reg)			break;		return 1;	}	return 0;}voidgbranch(int o){	int a;	a = AGOK;	switch(o) {	case ORETURN:		a = ARETURN;		break;	case OGOTO:		a = AJMP;		break;	}	nextpc();	if(a == AGOK) {		diag(Z, "bad in gbranch %O",  o);		nextpc();	}	p->as = a;}voidpatch(Prog *op, long pc){	op->to.offset = pc;	op->to.type = D_BRANCH;}voidgpseudo(int a, Sym *s, Node *n){	nextpc();	p->as = a;	p->from.type = D_OREG;	p->from.sym = s;	p->reg = (profileflg ? 0 : NOPROF);	p->from.name = D_EXTERN;	if(s->class == CSTATIC)		p->from.name = D_STATIC;	naddr(n, &p->to);	if(a == ADATA || a == AGLOBL)		pc--;}intsval(long v){	if(v >= -(1<<12) && v < (1<<12))		return 1;	return 0;}intsconst(Node *n){	vlong vv;	if(n->op == OCONST) {		if(!typefd[n->type->etype]) {			vv = n->vconst;			if(vv >= -(vlong)(1<<12) && vv < (vlong)(1<<12))				return 1;		}	}	return 0;}longexreg(Type *t){	long o;	if(typechlp[t->etype]) {		if(exregoffset <= 3)			return 0;		o = exregoffset;		exregoffset--;		return o;	}	if(typefd[t->etype]) {		if(exfregoffset <= 16)			return 0;		o = exfregoffset + NREG;		exfregoffset--;		return o;	}	return 0;}schar	ewidth[NTYPE] ={	-1,		/* [TXXX] */	SZ_CHAR,	/* [TCHAR] */	SZ_CHAR,	/* [TUCHAR] */	SZ_SHORT,	/* [TSHORT] */	SZ_SHORT,	/* [TUSHORT] */	SZ_INT,		/* [TINT] */	SZ_INT,		/* [TUINT] */	SZ_LONG,	/* [TLONG] */	SZ_LONG,	/* [TULONG] */	SZ_VLONG,	/* [TVLONG] */	SZ_VLONG,	/* [TUVLONG] */	SZ_FLOAT,	/* [TFLOAT] */	SZ_DOUBLE,	/* [TDOUBLE] */	SZ_IND,		/* [TIND] */	0,		/* [TFUNC] */	-1,		/* [TARRAY] */	0,		/* [TVOID] */	-1,		/* [TSTRUCT] */	-1,		/* [TUNION] */	SZ_INT,		/* [TENUM] */};long	ncast[NTYPE] ={	0,				/* [TXXX] */	BCHAR|BUCHAR,			/* [TCHAR] */	BCHAR|BUCHAR,			/* [TUCHAR] */	BSHORT|BUSHORT,			/* [TSHORT] */	BSHORT|BUSHORT,			/* [TUSHORT] */	BINT|BUINT|BLONG|BULONG|BIND,	/* [TINT] */	BINT|BUINT|BLONG|BULONG|BIND,	/* [TUINT] */	BINT|BUINT|BLONG|BULONG|BIND,	/* [TLONG] */	BINT|BUINT|BLONG|BULONG|BIND,	/* [TULONG] */	BVLONG|BUVLONG,			/* [TVLONG] */	BVLONG|BUVLONG,			/* [TUVLONG] */	BFLOAT,				/* [TFLOAT] */	BDOUBLE,			/* [TDOUBLE] */	BLONG|BULONG|BIND,		/* [TIND] */	0,				/* [TFUNC] */	0,				/* [TARRAY] */	0,				/* [TVOID] */	BSTRUCT,			/* [TSTRUCT] */	BUNION,				/* [TUNION] */	0,				/* [TENUM] */};

⌨️ 快捷键说明

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