txt.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 1,409 行 · 第 1/2 页

C
1,409
字号
	case CASE(	TUINT,	TINT):	case CASE(	TLONG,	TINT):	case CASE(	TULONG,	TINT):	case CASE(	TIND,	TINT):	case CASE(	TINT,	TUINT):	case CASE(	TUINT,	TUINT):	case CASE(	TLONG,	TUINT):	case CASE(	TULONG,	TUINT):	case CASE(	TIND,	TUINT):	case CASE(	TINT,	TLONG):	case CASE(	TUINT,	TLONG):	case CASE(	TLONG,	TLONG):	case CASE(	TULONG,	TLONG):	case CASE(	TIND,	TLONG):	case CASE(	TINT,	TULONG):	case CASE(	TUINT,	TULONG):	case CASE(	TLONG,	TULONG):	case CASE(	TULONG,	TULONG):	case CASE(	TIND,	TULONG):	case CASE(	TINT,	TIND):	case CASE(	TUINT,	TIND):	case CASE(	TLONG,	TIND):	case CASE(	TULONG,	TIND):	case CASE(	TIND,	TIND): *****/		a = AMOVL;		break;	case CASE(	TSHORT,	TINT):	case CASE(	TSHORT,	TUINT):	case CASE(	TSHORT,	TLONG):	case CASE(	TSHORT,	TULONG):	case CASE(	TSHORT,	TIND):		a = AMOVWLSX;		if(f->op == OCONST) {			f->vconst &= 0xffff;			if(f->vconst & 0x8000)				f->vconst |= 0xffff0000;			a = AMOVL;		}		break;	case CASE(	TUSHORT,TINT):	case CASE(	TUSHORT,TUINT):	case CASE(	TUSHORT,TLONG):	case CASE(	TUSHORT,TULONG):	case CASE(	TUSHORT,TIND):		a = AMOVWLZX;		if(f->op == OCONST) {			f->vconst &= 0xffff;			a = AMOVL;		}		break;	case CASE(	TCHAR,	TSHORT):	case CASE(	TCHAR,	TUSHORT):	case CASE(	TCHAR,	TINT):	case CASE(	TCHAR,	TUINT):	case CASE(	TCHAR,	TLONG):	case CASE(	TCHAR,	TULONG):	case CASE(	TCHAR,	TIND):		a = AMOVBLSX;		if(f->op == OCONST) {			f->vconst &= 0xff;			if(f->vconst & 0x80)				f->vconst |= 0xffffff00;			a = AMOVL;		}		break;	case CASE(	TUCHAR,	TSHORT):	case CASE(	TUCHAR,	TUSHORT):	case CASE(	TUCHAR,	TINT):	case CASE(	TUCHAR,	TUINT):	case CASE(	TUCHAR,	TLONG):	case CASE(	TUCHAR,	TULONG):	case CASE(	TUCHAR,	TIND):		a = AMOVBLZX;		if(f->op == OCONST) {			f->vconst &= 0xff;			a = AMOVL;		}		break;/* * float to fix */	case CASE(	TFLOAT,	TCHAR):	case CASE(	TFLOAT,	TUCHAR):	case CASE(	TFLOAT,	TSHORT):	case CASE(	TFLOAT,	TUSHORT):	case CASE(	TFLOAT,	TINT):	case CASE(	TFLOAT,	TLONG):	case CASE(	TFLOAT,	TIND):	case CASE(	TDOUBLE,TCHAR):	case CASE(	TDOUBLE,TUCHAR):	case CASE(	TDOUBLE,TSHORT):	case CASE(	TDOUBLE,TUSHORT):	case CASE(	TDOUBLE,TINT):	case CASE(	TDOUBLE,TLONG):	case CASE(	TDOUBLE,TIND):		if(fproundflg) {			regsalloc(&nod, &regnode);			gins(AFMOVLP, f, &nod);			gmove(&nod, t);			return;		}		regsalloc(&nod, &regnode);		regsalloc(&nod1, &regnode);		gins(AFSTCW, Z, &nod1);		nod1.xoffset += 2;		gins(AMOVW, nodconst(0xf7f), &nod1);		gins(AFLDCW, &nod1, Z);		gins(AFMOVLP, f, &nod);		nod1.xoffset -= 2;		gins(AFLDCW, &nod1, Z);		gmove(&nod, t);		return;/* * float to ulong */	case CASE(	TDOUBLE,	TULONG):	case CASE(	TFLOAT,	TULONG):	case CASE(	TDOUBLE,	TUINT):	case CASE(	TFLOAT,	TUINT):		regsalloc(&nod, &regnode);		gmove(f, &fregnode0);		gins(AFADDD, nodfconst(-2147483648.), &fregnode0);		gins(AFMOVLP, f, &nod);		gins(ASUBL, nodconst(-2147483648), &nod);		gmove(&nod, t);		return;/* * ulong to float */	case CASE(	TULONG,	TDOUBLE):	case CASE(	TULONG,	TFLOAT):	case CASE(	TUINT,	TDOUBLE):	case CASE(	TUINT,	TFLOAT):		regalloc(&nod, f, f);		gmove(f, &nod);		regsalloc(&nod1, &regnode);		gmove(&nod, &nod1);		gins(AFMOVL, &nod1, &fregnode0);		gins(ACMPL, &nod, nodconst(0));		gins(AJGE, Z, Z);		p1 = p;		gins(AFADDD, nodfconst(4294967296.), &fregnode0);		patch(p1, pc);		regfree(&nod);		return;/* * fix to float */	case CASE(	TCHAR,	TFLOAT):	case CASE(	TUCHAR,	TFLOAT):	case CASE(	TSHORT,	TFLOAT):	case CASE(	TUSHORT,TFLOAT):	case CASE(	TINT,	TFLOAT):	case CASE(	TLONG,	TFLOAT):	case CASE(	TIND,	TFLOAT):	case CASE(	TCHAR,	TDOUBLE):	case CASE(	TUCHAR,	TDOUBLE):	case CASE(	TSHORT,	TDOUBLE):	case CASE(	TUSHORT,TDOUBLE):	case CASE(	TINT,	TDOUBLE):	case CASE(	TLONG,	TDOUBLE):	case CASE(	TIND,	TDOUBLE):		regsalloc(&nod, &regnode);		gmove(f, &nod);		gins(AFMOVL, &nod, &fregnode0);		return;/* * float to float */	case CASE(	TFLOAT,	TFLOAT):	case CASE(	TDOUBLE,TFLOAT):	case CASE(	TFLOAT,	TDOUBLE):	case CASE(	TDOUBLE,TDOUBLE):		a = AFMOVD;	break;	}	if(a == AMOVL || a == AFMOVD)	if(samaddr(f, t))		return;	gins(a, f, t);}voiddoindex(Node *n){	Node nod, nod1;	long v;if(debug['Y'])prtree(n, "index");if(n->left->complex >= FNX)print("botch in doindex\n");	regalloc(&nod, &regnode, Z);	v = constnode.vconst;	cgen(n->right, &nod);	idx.ptr = D_NONE;	if(n->left->op == OCONST)		idx.ptr = D_CONST;	else if(n->left->op == OREGISTER)//	else if(n->left->op == OREGISTER && typeil[n->left->type->etype])		idx.ptr = n->left->reg;	else if(n->left->op != OADDR) {		reg[D_BP]++;	// cant be used as a base		regalloc(&nod1, &regnode, Z);		cgen(n->left, &nod1);		idx.ptr = nod1.reg;		regfree(&nod1);		reg[D_BP]--;	}	idx.reg = nod.reg;	regfree(&nod);	constnode.vconst = v;}voidgins(int a, Node *f, Node *t){	if(f != Z && f->op == OINDEX)		doindex(f);	if(t != Z && t->op == OINDEX)		doindex(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);}voidfgopcode(int o, Node *f, Node *t, int pop, int rev){	int a, et;	Node nod;	et = TLONG;	if(f != Z && f->type != T)		et = f->type->etype;	if(!typefd[et]) {		diag(f, "fop: integer %O", o);		return;	}	if(debug['M']) {		if(t != Z && t->type != T)			print("gop: %O %O-%s Z\n", o, f->op, tnames[et]);		else			print("gop: %O %O-%s %O-%s\n", o,				f->op, tnames[et], t->op, tnames[t->type->etype]);	}	a = AGOK;	switch(o) {	case OASADD:	case OADD:		if(et == TFLOAT)			a = AFADDF;		else		if(et == TDOUBLE || et == TVLONG) {			a = AFADDD;			if(pop)				a = AFADDDP;		}		break;	case OASSUB:	case OSUB:		if(et == TFLOAT) {			a = AFSUBF;			if(rev)				a = AFSUBRF;		} else		if(et == TDOUBLE || et == TVLONG) {			a = AFSUBD;			if(pop)				a = AFSUBDP;			if(rev) {				a = AFSUBRD;				if(pop)					a = AFSUBRDP;			}		}		break;	case OASMUL:	case OMUL:		if(et == TFLOAT)			a = AFMULF;		else		if(et == TDOUBLE || et == TVLONG) {			a = AFMULD;			if(pop)				a = AFMULDP;		}		break;	case OASMOD:	case OMOD:	case OASDIV:	case ODIV:		if(et == TFLOAT) {			a = AFDIVF;			if(rev)				a = AFDIVRF;		} else		if(et == TDOUBLE || et == TVLONG) {			a = AFDIVD;			if(pop)				a = AFDIVDP;			if(rev) {				a = AFDIVRD;				if(pop)					a = AFDIVRDP;			}		}		break;	case OEQ:	case ONE:	case OLT:	case OLE:	case OGE:	case OGT:		pop += rev;		if(et == TFLOAT) {			a = AFCOMF;			if(pop) {				a = AFCOMFP;				if(pop > 1)					a = AGOK;			}		} else		if(et == TDOUBLE || et == TVLONG) {			a = AFCOMF;			if(pop) {				a = AFCOMDP;				if(pop > 1)					a = AFCOMDPP;			}		}		gins(a, f, t);		regalloc(&nod, &regnode, Z);		if(nod.reg != D_AX) {			regfree(&nod);			nod.reg = D_AX;			gins(APUSHL, &nod, Z);			gins(AWAIT, Z, Z);			gins(AFSTSW, Z, &nod);			gins(ASAHF, Z, Z);			gins(APOPL, Z, &nod);		} else {			gins(AWAIT, Z, Z);			gins(AFSTSW, Z, &nod);			gins(ASAHF, Z, Z);			regfree(&nod);		}		switch(o) {		case OEQ:	a = AJEQ; break;		case ONE:	a = AJNE; break;		case OLT:	a = AJCS; break;		case OLE:	a = AJLS; break;		case OGE:	a = AJCC; break;		case OGT:	a = AJHI; break;		}		gins(a, Z, Z);		return;	}	if(a == AGOK)		diag(Z, "bad in gopcode %O", o);	gins(a, f, t);}voidgopcode(int o, Type *ty, Node *f, Node *t){	int a, et;	et = TLONG;	if(ty != T)		et = ty->etype;	if(typefd[et] && o != OADDR && o != OFUNC) {		diag(f, "gop: float %O", o);		return;	}	if(debug['M']) {		if(f != Z && f->type != T)			print("gop: %O %O[%s],", o, f->op, tnames[et]);		else			print("gop: %O Z,", o);		if(t != Z && t->type != T)			print("%O[%s]\n", t->op, tnames[t->type->etype]);		else			print("Z\n");	}	a = AGOK;	switch(o) {	case OCOM:		a = ANOTL;		if(et == TCHAR || et == TUCHAR)			a = ANOTB;		if(et == TSHORT || et == TUSHORT)			a = ANOTW;		break;	case ONEG:		a = ANEGL;		if(et == TCHAR || et == TUCHAR)			a = ANEGB;		if(et == TSHORT || et == TUSHORT)			a = ANEGW;		break;	case OADDR:		a = ALEAL;		break;	case OASADD:	case OADD:		a = AADDL;		if(et == TCHAR || et == TUCHAR)			a = AADDB;		if(et == TSHORT || et == TUSHORT)			a = AADDW;		break;	case OASSUB:	case OSUB:		a = ASUBL;		if(et == TCHAR || et == TUCHAR)			a = ASUBB;		if(et == TSHORT || et == TUSHORT)			a = ASUBW;		break;	case OASOR:	case OOR:		a = AORL;		if(et == TCHAR || et == TUCHAR)			a = AORB;		if(et == TSHORT || et == TUSHORT)			a = AORW;		break;	case OASAND:	case OAND:		a = AANDL;		if(et == TCHAR || et == TUCHAR)			a = AANDB;		if(et == TSHORT || et == TUSHORT)			a = AANDW;		break;	case OASXOR:	case OXOR:		a = AXORL;		if(et == TCHAR || et == TUCHAR)			a = AXORB;		if(et == TSHORT || et == TUSHORT)			a = AXORW;		break;	case OASLSHR:	case OLSHR:		a = ASHRL;		if(et == TCHAR || et == TUCHAR)			a = ASHRB;		if(et == TSHORT || et == TUSHORT)			a = ASHRW;		break;	case OASASHR:	case OASHR:		a = ASARL;		if(et == TCHAR || et == TUCHAR)			a = ASARB;		if(et == TSHORT || et == TUSHORT)			a = ASARW;		break;	case OASASHL:	case OASHL:		a = ASALL;		if(et == TCHAR || et == TUCHAR)			a = ASALB;		if(et == TSHORT || et == TUSHORT)			a = ASALW;		break;	case OFUNC:		a = ACALL;		break;	case OASMUL:	case OMUL:		if(f->op == OREGISTER && t != Z && isreg(t, D_AX) && reg[D_DX] == 0)			t = Z;		a = AIMULL;		break;	case OASMOD:	case OMOD:	case OASDIV:	case ODIV:		a = AIDIVL;		break;	case OASLMUL:	case OLMUL:		a = AMULL;		break;	case OASLMOD:	case OLMOD:	case OASLDIV:	case OLDIV:		a = ADIVL;		break;	case OEQ:	case ONE:	case OLT:	case OLE:	case OGE:	case OGT:	case OLO:	case OLS:	case OHS:	case OHI:		a = ACMPL;		if(et == TCHAR || et == TUCHAR)			a = ACMPB;		if(et == TSHORT || et == TUSHORT)			a = ACMPW;		gins(a, f, t);		switch(o) {		case OEQ:	a = AJEQ; break;		case ONE:	a = AJNE; break;		case OLT:	a = AJLT; break;		case OLE:	a = AJLE; break;		case OGE:	a = AJGE; break;		case OGT:	a = AJGT; break;		case OLO:	a = AJCS; break;		case OLS:	a = AJLS; break;		case OHS:	a = AJCC; break;		case OHI:	a = AJHI; break;		}		gins(a, Z, Z);		return;	}	if(a == AGOK)		diag(Z, "bad in gopcode %O", o);	gins(a, f, t);}intsamaddr(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 = 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_EXTERN;	p->from.sym = s;	p->from.scale = (profileflg ? 0 : NOPROF);	if(s->class == CSTATIC)		p->from.type = D_STATIC;	naddr(n, &p->to);	if(a == ADATA || a == AGLOBL)		pc--;}intsconst(Node *n){	long v;	if(n->op == OCONST && !typefd[n->type->etype]) {		v = n->vconst;		if(v >= -32766L && v < 32766L)			return 1;	}	return 0;}longexreg(Type *t){	USED(t);	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 + =
减小字号Ctrl + -
显示快捷键?