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

📄 txt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
		case TVLONG:		case TDOUBLE:			a = AMOVD;			break;		}		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 = AMOVD;			if(ft == TFLOAT)				a = AMOVFD;			break;		case TFLOAT:			a = AMOVDF;			if(ft == TFLOAT)				a = AMOVF;			break;		case TINT:		case TUINT:		case TLONG:		case TULONG:		case TIND:			a = AMOVDW;			if(ft == TFLOAT)				a = AMOVFW;			break;		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			a = AMOVDW;			if(ft == TFLOAT)				a = AMOVFW;			break;		}		break;	case TUINT:	case TINT:	case TULONG:	case TLONG:	case TIND:		switch(tt) {		case TDOUBLE:		case TVLONG:			gins(AMOVWD, f, t);			if(ft == TULONG) {			}			return;		case TFLOAT:			gins(AMOVWF, f, t);			if(ft == TULONG) {			}			return;		case TINT:		case TUINT:		case TLONG:		case TULONG:		case TIND:		case TSHORT:		case TUSHORT:		case TCHAR:		case TUCHAR:			a = AMOVW;			break;		}		break;	case TSHORT:		switch(tt) {		case TDOUBLE:		case TVLONG:			regalloc(&nod, f, Z);			gins(AMOVH, f, &nod);			gins(AMOVWD, &nod, t);			regfree(&nod);			return;		case TFLOAT:			regalloc(&nod, f, Z);			gins(AMOVH, f, &nod);			gins(AMOVWF, &nod, t);			regfree(&nod);			return;		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:			regalloc(&nod, f, Z);			gins(AMOVHU, f, &nod);			gins(AMOVWD, &nod, t);			regfree(&nod);			return;		case TFLOAT:			regalloc(&nod, f, Z);			gins(AMOVHU, f, &nod);			gins(AMOVWF, &nod, t);			regfree(&nod);			return;		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:			regalloc(&nod, f, Z);			gins(AMOVB, f, &nod);			gins(AMOVWD, &nod, t);			regfree(&nod);			return;		case TFLOAT:			regalloc(&nod, f, Z);			gins(AMOVB, f, &nod);			gins(AMOVWF, &nod, t);			regfree(&nod);			return;		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:			regalloc(&nod, f, Z);			gins(AMOVBU, f, &nod);			gins(AMOVWD, &nod, t);			regfree(&nod);			return;		case TFLOAT:			regalloc(&nod, f, Z);			gins(AMOVBU, f, &nod);			gins(AMOVWF, &nod, t);			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 == AMOVF || a == AMOVD)	if(samaddr(f, t))		return;	gins(a, f, t);}voidgmover(Node *f, Node *t){	int ft, tt, a;	ft = f->type->etype;	tt = t->type->etype;	a = AGOK;	if(typechlp[ft] && typechlp[tt] && ewidth[ft] >= ewidth[tt]){		switch(tt){		case TSHORT:			a = AMOVH;			break;		case TUSHORT:			a = AMOVHU;			break;		case TCHAR:			a = AMOVB;			break;		case TUCHAR:			a = AMOVBU;			break;		}	}	if(a == AGOK)		gmove(f, t);	else		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 = AADDF;		else		if(et == TDOUBLE || et == TVLONG)			a = AADDD;		break;	case OASSUB:	case OSUB:		if(f2 && f2->op == OCONST) {			Node *t = f1;			f1 = f2;			f2 = t;			a = ARSB;		} else			a = ASUB;		if(et == TFLOAT)			a = ASUBF;		else		if(et == TDOUBLE || et == TVLONG)			a = ASUBD;		break;	case OASOR:	case OOR:		a = AORR;		break;	case OASAND:	case OAND:		a = AAND;		break;	case OASXOR:	case OXOR:		a = AEOR;		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 = ABL;		break;	case OASMUL:	case OMUL:		a = AMUL;		if(et == TFLOAT)			a = AMULF;		else		if(et == TDOUBLE || et == TVLONG)			a = AMULD;		break;	case OASDIV:	case ODIV:		a = ADIV;		if(et == TFLOAT)			a = ADIVF;		else		if(et == TDOUBLE || et == TVLONG)			a = ADIVD;		break;	case OASMOD:	case OMOD:		a = AMOD;		break;	case OASLMUL:	case OLMUL:		a = AMULU;		break;	case OASLMOD:	case OLMOD:		a = AMODU;		break;	case OASLDIV:	case OLDIV:		a = ADIVU;		break;	case OCASE:	case OEQ:	case ONE:	case OLT:	case OLE:	case OGE:	case OGT:	case OLO:	case OLS:	case OHS:	case OHI:		a = ACMP;		if(et == TFLOAT)			a = ACMPF;		else		if(et == TDOUBLE || et == TVLONG)			a = ACMPD;		nextpc();		p->as = a;		naddr(f1, &p->from);		if(a == ACMP && f1->op == OCONST && p->from.offset < 0) {			p->as = ACMN;			p->from.offset = -p->from.offset;		}		raddr(f2, p);		switch(o) {		case OEQ:			a = ABEQ;			break;		case ONE:			a = ABNE;			break;		case OLT:			a = ABLT;			break;		case OLE:			a = ABLE;			break;		case OGE:			a = ABGE;			break;		case OGT:			a = ABGT;			break;		case OLO:			a = ABLO;			break;		case OLS:			a = ABLS;			break;		case OHS:			a = ABHS;			break;		case OHI:			a = ABHI;			break;		case OCASE:			nextpc();			p->as = ACASE;			p->scond = 0x9;			naddr(f2, &p->from);			a = ABHI;			break;		}		f1 = Z;		f2 = 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(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 = ARET;		break;	case OGOTO:		a = AB;		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->from.name = D_EXTERN;	p->reg = (profileflg ? 0 : NOPROF);	if(s->class == CSTATIC)		p->from.name = D_STATIC;	naddr(n, &p->to);	if(a == ADATA || a == AGLOBL)		pc--;}intsconst(Node *n){	vlong vv;	if(n->op == OCONST) {		if(!typefd[n->type->etype]) {			vv = n->vconst;			if(vv >= (vlong)(-32766) && vv < (vlong)32766)				return 1;			/*			 * should be specialised for constant values which will			 * fit in different instructionsl; for now, let 5l			 * sort it out			 */			return 1;		}	}	return 0;}intsval(long v){	int i;	for(i=0; i<16; i++) {		if((v & ~0xff) == 0)			return 1;		if((~v & ~0xff) == 0)			return 1;		v = (v<<2) | ((ulong)v>>30);	}	return 0;}longexreg(Type *t){	long o;	if(typechlp[t->etype]) {		if(exregoffset <= REGEXT-4)			return 0;		o = exregoffset;		exregoffset--;		return o;	}	if(typefd[t->etype]) {		if(exfregoffset <= NFREG-1)			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 + -