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

📄 swt.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
				goto jackpot;			break;		}		zwrite(&b, p, sf, st);	}	Bflush(&b);	close(f);	firstp = P;	lastp = P;}voidzwrite(Biobuf *b, Prog *p, int sf, int st){	long l;	l = p->as;	Bputc(b, l);	Bputc(b, l>>8);	l = p->lineno;	Bputc(b, l);	Bputc(b, l>>8);	Bputc(b, l>>16);	Bputc(b, l>>24);	zaddr(b, &p->from, sf);	zaddr(b, &p->to, st);}voidzname(Biobuf *b, Sym *s, int t){	char *n;	ulong sig;	if(debug['T'] && t == D_EXTERN && s->sig != SIGDONE && s->type != types[TENUM] && s != symrathole){		sig = sign(s);		Bputc(b, ASIGNAME);		Bputc(b, ASIGNAME>>8);		Bputc(b, sig);		Bputc(b, sig>>8);		Bputc(b, sig>>16);		Bputc(b, sig>>24);		s->sig = SIGDONE;	}	else{		Bputc(b, ANAME);	/* as */		Bputc(b, ANAME>>8);	/* as */	}	Bputc(b, t);		/* type */	Bputc(b, s->sym);		/* sym */	n = s->name;	while(*n) {		Bputc(b, *n);		n++;	}	Bputc(b, 0);}voidzaddr(Biobuf *b, Adr *a, int s){	long l;	int i, t;	char *n;	Ieee e;	t = 0;	if(a->field)		t |= T_FIELD;	if(s)		t |= T_SYM;	switch(a->type) {	default:		if(a->offset)			t |= T_OFFSET;		if(a->displace)			t |= T_INDEX;		if(a->type & ~0xff)			t |= T_TYPE;		break;	case D_FCONST:		t |= T_FCONST;		break;	case D_SCONST:		t |= T_SCONST;		break;	}	Bputc(b, t);	if(t & T_FIELD) {	/* implies field */		i = a->field;		Bputc(b, i);		Bputc(b, i>>8);	}	if(t & T_INDEX) {	/* implies index, scale, displace */		i = D_NONE;		Bputc(b, i);		Bputc(b, i>>8);		Bputc(b, 0);		l = a->displace;		Bputc(b, l);		Bputc(b, l>>8);		Bputc(b, l>>16);		Bputc(b, l>>24);	}	if(t & T_OFFSET) {	/* implies offset */		l = a->offset;		Bputc(b, l);		Bputc(b, l>>8);		Bputc(b, l>>16);		Bputc(b, l>>24);	}	if(t & T_SYM)		/* implies sym */		Bputc(b, s);	if(t & T_FCONST) {		ieeedtod(&e, a->dval);		l = e.l;		Bputc(b, l);		Bputc(b, l>>8);		Bputc(b, l>>16);		Bputc(b, l>>24);		l = e.h;		Bputc(b, l);		Bputc(b, l>>8);		Bputc(b, l>>16);		Bputc(b, l>>24);		return;	}	if(t & T_SCONST) {		n = a->sval;		for(i=0; i<NSNAME; i++) {			Bputc(b, *n);			n++;		}		return;	}	i = a->type;	Bputc(b, i);	if(t & T_TYPE)		Bputc(b, i>>8);}voidouthist(Biobuf *b){	Hist *h;	char *p, *q, *op, c;	Prog pg;	int n;	pg = zprog;	pg.as = AHISTORY;	c = pathchar();	for(h = hist; h != H; h = h->link) {		p = h->name;		op = 0;		/* on windows skip drive specifier in pathname */		if(systemtype(Windows) && p && p[1] == ':'){			p += 2;			c = *p;		}		if(p && p[0] != c && h->offset == 0 && pathname){			/* on windows skip drive specifier in pathname */			if(systemtype(Windows) && pathname[1] == ':') {				op = p;				p = pathname+2;				c = *p;			} else if(pathname[0] == c){				op = p;				p = pathname;			}		}		while(p) {			q = utfrune(p, c);			if(q) {				n = q-p;				if(n == 0){					n = 1;	/* leading "/" */					*p = '/';	/* don't emit "\" on windows */				}				q++;			} else {				n = strlen(p);				q = 0;			}			if(n) {				Bputc(b, ANAME);				Bputc(b, ANAME>>8);				Bputc(b, D_FILE);				Bputc(b, 1);				Bputc(b, '<');				Bwrite(b, p, n);				Bputc(b, 0);			}			p = q;			if(p == 0 && op) {				p = op;				op = 0;			}		}		pg.lineno = h->line;		pg.to.type = zprog.to.type;		pg.to.offset = h->offset;		if(h->offset)			pg.to.type = D_CONST;		zwrite(b, &pg, 0, 0);	}}voidieeedtod(Ieee *ieee, double native){	double fr, ho, f;	int exp;	if(native < 0) {		ieeedtod(ieee, -native);		ieee->h |= 0x80000000L;		return;	}	if(native == 0) {		ieee->l = 0;		ieee->h = 0;		return;	}	fr = frexp(native, &exp);	f = 2097152L;		/* shouldnt use fp constants here */	fr = modf(fr*f, &ho);	ieee->h = ho;	ieee->h &= 0xfffffL;	ieee->h |= (exp+1022L) << 20;	f = 65536L;	fr = modf(fr*f, &ho);	ieee->l = ho;	ieee->l <<= 16;	ieee->l |= (long)(fr*f);}intnodalloc(Type *t, int g, Node *n){	n->type = t;	n->op = OREGISTER;	n->addable = 12;	n->complex = 0;	g = regaddr(g);	n->reg = g | I_INDIR;	n->xoffset = 0;	return g;}intmulcon(Node *n, Node *c, int result, Node *nn){	long v;	if(typefd[n->type->etype])		return 0;	v = c->vconst;	if(mulcon1(n, v, result, nn))		return 1;	return 0;}intshlcon(Node *n, Node *c, int result, Node *nn){	long v;	v = 1L << c->vconst;	return mulcon1(n, v, result, nn);}intmulcon1(Node *n, long v, int result, Node *nn){	int g, g1, a1, a2, neg;	int o;	char code[10], *p;	if(result == D_NONE)		return 0;	neg = 0;	if(v < 0) {		v = -v;		neg++;	}	a1 = 0;	a2 = multabsize;	for(;;) {		if(a1 >= a2)			return 0;		g1 = (a2 + a1)/2;		if(v < multab[g1].val) {			a2 = g1;			continue;		}		if(v > multab[g1].val) {			a1 = g1+1;			continue;		}		break;	}	strcpy(code, "0");	strncat(code, multab[g1].code, sizeof(multab[0].code));	p = code;	if(p[1] == 'i')		p += 2;	g = regalloc(n->type, result);	cgen(n, g, n);	if(neg)		gopcode(ONEG, n->type, D_NONE, n, g, n);	g1 = regalloc(n->type, D_NONE);loop:	switch(*p) {	case 0:		regfree(g1);		gmove(n->type, nn->type, g, n, result, nn);		regfree(g);		return 1;	case '0':		o = OAS;		*p -= '0';		goto com;	case '1':	case '2':		o = OSUB;		*p -= '1';		goto com;	case '3':	case '4':	case '5':	case '6':		o = OADD;		*p -= '3';	com:		a1 = g;		if(*p == 1 || *p == 3)			a1 = g1;		a2 = g;		if(*p == 0 || *p == 3)			a2 = g1;		gopcode(o, n->type, a1, n, a2, n);		p++;		break;	default:		a1 = *p++ - 'a' + 1;		a2 = g;		if(a1 > 8) {			a2 = g1;			a1 -= 8;		}		gopcode(OASHL, n->type, D_CONST, nodconst(a1), a2, n);		break;	}	goto loop;}voidnullwarn(Node *l, Node *r){	warn(Z, "result of operation not used");	if(l != Z)		cgen(l, D_NONE, Z);	if(r != Z)		cgen(r, D_NONE, Z);}voidsextern(Sym *s, Node *a, long o, long w){	long e, lw;	for(e=0; e<w; e+=NSNAME) {		lw = NSNAME;		if(w-e < lw)			lw = w-e;		gpseudo(ADATA, s, D_SCONST, 0L);		p->from.offset += o+e;		p->from.displace = lw;		memmove(p->to.sval, a->cstring+e, lw);	}}voidgextern(Sym *s, Node *a, long o, long w){	if(a->op == OCONST && typev[a->type->etype]) {		gpseudo(ADATA, s, D_CONST, (long)(a->vconst>>32));		p->from.offset += o;		p->from.displace = 4;		gpseudo(ADATA, s, D_CONST, (long)(a->vconst));		p->from.offset += o + 4;		p->from.displace = 4;		return;	}	gpseudotree(ADATA, s, a);	p->from.offset += o;	p->from.displace = w;}longalign(long i, Type *t, int op){	long o;	Type *v;	int w;	o = i;	w = 1;	switch(op) {	default:		diag(Z, "unknown align opcode %d", op);		break;	case Asu2:	/* padding at end of a struct */		w = SZ_LONG;		if(packflg)			w = packflg;		break;	case Ael1:	/* initial allign of struct element */		for(v=t; v->etype==TARRAY; v=v->link)			;		w = ewidth[v->etype];		if(w <= 0 || w >= SZ_SHORT)			w = SZ_SHORT;		if(packflg)			w = packflg;		break;	case Ael2:	/* width of a struct element */		o += t->width;		break;	case Aarg0:	/* initial passbyptr argument in arg list */		if(typesuv[t->etype]) {			o = align(o, types[TIND], Aarg1);			o = align(o, types[TIND], Aarg2);		}		break;	case Aarg1:	/* initial allign of parameter */		w = ewidth[t->etype];		if(w <= 0 || w >= SZ_LONG) {			w = SZ_LONG;			break;		}		o += SZ_LONG - w;	/* big endian adjustment */		w = 1;		break;	case Aarg2:	/* width of a parameter */		o += t->width;		w = SZ_LONG;		break;	case Aaut3:	/* total allign of automatic */		o = align(o, t, Ael1);		o = align(o, t, Ael2);		break;	}	o = round(o, w);	if(debug['A'])		print("align %s %ld %T = %ld\n", bnames[op], i, t, o);	return o;}longmaxround(long max, long v){	v += SZ_LONG-1;	if(v > max)		max = round(v, SZ_LONG);	return max;}

⌨️ 快捷键说明

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