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

📄 span.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
			goto aconsize;		case D_PARAM:			instoffset = autosize + a->offset + 4L;		aconsize:			t = immrot(instoffset);			if(t)				return C_RACON;			return C_LACON;		}		return C_GOK;	case D_BRANCH:		return C_SBRA;	}	return C_GOK;}Optab*oplook(Prog *p){	int a1, a2, a3, r;	char *c1, *c3;	Optab *o, *e;	a1 = p->optab;	if(a1)		return optab+(a1-1);	a1 = p->from.class;	if(a1 == 0) {		a1 = aclass(&p->from) + 1;		p->from.class = a1;	}	a1--;	a3 = p->to.class;	if(a3 == 0) {		a3 = aclass(&p->to) + 1;		p->to.class = a3;	}	a3--;	a2 = C_NONE;	if(p->reg != NREG)		a2 = C_REG;	r = p->as;	o = oprange[r].start;	if(o == 0) {		a1 = opcross[repop[r]][a1][a2][a3];		if(a1) {			p->optab = a1+1;			return optab+a1;		}		o = oprange[r].stop; /* just generate an error */	}	if(0) {		print("oplook %A %d %d %d\n",			(int)p->as, a1, a2, a3);		print("		%d %d\n", p->from.type, p->to.type);	}	e = oprange[r].stop;	c1 = xcmp[a1];	c3 = xcmp[a3];	for(; o<e; o++)		if(o->a2 == a2)		if(c1[o->a1])		if(c3[o->a3]) {			p->optab = (o-optab)+1;			return o;		}	diag("illegal combination %A %d %d %d",		p->as, a1, a2, a3);	prasm(p);	if(o == 0)		o = optab;	return o;}intcmp(int a, int b){	if(a == b)		return 1;	switch(a) {	case C_LCON:		if(b == C_RCON || b == C_NCON)			return 1;		break;	case C_LACON:		if(b == C_RACON)			return 1;		break;	case C_LECON:		if(b == C_RECON)			return 1;		break;	case C_HFEXT:		return b == C_HEXT || b == C_FEXT;	case C_FEXT:	case C_HEXT:		return b == C_HFEXT;	case C_SEXT:		return cmp(C_HFEXT, b);	case C_LEXT:		return cmp(C_SEXT, b);	case C_HFAUTO:		return b == C_HAUTO || b == C_FAUTO;	case C_FAUTO:	case C_HAUTO:		return b == C_HFAUTO;	case C_SAUTO:		return cmp(C_HFAUTO, b);	case C_LAUTO:		return cmp(C_SAUTO, b);	case C_HFOREG:		return b == C_HOREG || b == C_FOREG;	case C_FOREG:	case C_HOREG:		return b == C_HFOREG;	case C_SROREG:		return cmp(C_SOREG, b) || cmp(C_ROREG, b);	case C_SOREG:	case C_ROREG:		return b == C_SROREG || cmp(C_HFOREG, b);	case C_LOREG:		return cmp(C_SROREG, b);	case C_LBRA:		if(b == C_SBRA)			return 1;		break;	}	return 0;}intocmp(const void *a1, const void *a2){	Optab *p1, *p2;	int n;	p1 = (Optab*)a1;	p2 = (Optab*)a2;	n = p1->as - p2->as;	if(n)		return n;	n = (p2->flag&V4) - (p1->flag&V4);	/* architecture version */	if(n)		return n;	n = p1->a1 - p2->a1;	if(n)		return n;	n = p1->a2 - p2->a2;	if(n)		return n;	n = p1->a3 - p2->a3;	if(n)		return n;	return 0;}voidbuildop(void){	int i, n, r;	armv4 = !debug['h'];	for(i=0; i<C_GOK; i++)		for(n=0; n<C_GOK; n++)			xcmp[i][n] = cmp(n, i);	for(n=0; optab[n].as != AXXX; n++)		if((optab[n].flag & V4) && !armv4) {			optab[n].as = AXXX;			break;		}	qsort(optab, n, sizeof(optab[0]), ocmp);	for(i=0; i<n; i++) {		r = optab[i].as;		oprange[r].start = optab+i;		while(optab[i].as == r)			i++;		oprange[r].stop = optab+i;		i--;		switch(r)		{		default:			diag("unknown op in build: %A", r);			errorexit();		case AADD:			oprange[AAND] = oprange[r];			oprange[AEOR] = oprange[r];			oprange[ASUB] = oprange[r];			oprange[ARSB] = oprange[r];			oprange[AADC] = oprange[r];			oprange[ASBC] = oprange[r];			oprange[ARSC] = oprange[r];			oprange[AORR] = oprange[r];			oprange[ABIC] = oprange[r];			break;		case ACMP:			oprange[ATST] = oprange[r];			oprange[ATEQ] = oprange[r];			oprange[ACMN] = oprange[r];			break;		case AMVN:			break;		case ABEQ:			oprange[ABNE] = oprange[r];			oprange[ABCS] = oprange[r];			oprange[ABHS] = oprange[r];			oprange[ABCC] = oprange[r];			oprange[ABLO] = oprange[r];			oprange[ABMI] = oprange[r];			oprange[ABPL] = oprange[r];			oprange[ABVS] = oprange[r];			oprange[ABVC] = oprange[r];			oprange[ABHI] = oprange[r];			oprange[ABLS] = oprange[r];			oprange[ABGE] = oprange[r];			oprange[ABLT] = oprange[r];			oprange[ABGT] = oprange[r];			oprange[ABLE] = oprange[r];			break;		case ASLL:			oprange[ASRL] = oprange[r];			oprange[ASRA] = oprange[r];			break;		case AMUL:			oprange[AMULU] = oprange[r];			break;		case ADIV:			oprange[AMOD] = oprange[r];			oprange[AMODU] = oprange[r];			oprange[ADIVU] = oprange[r];			break;		case AMOVW:		case AMOVB:		case AMOVBU:		case AMOVH:		case AMOVHU:			break;		case ASWPW:			oprange[ASWPBU] = oprange[r];			break;		case AB:		case ABL:		case ABX:		case ABXRET:		case ASWI:		case AWORD:		case AMOVM:		case ARFE:		case ATEXT:		case ACASE:		case ABCASE:			break;		case AADDF:			oprange[AADDD] = oprange[r];			oprange[ASUBF] = oprange[r];			oprange[ASUBD] = oprange[r];			oprange[AMULF] = oprange[r];			oprange[AMULD] = oprange[r];			oprange[ADIVF] = oprange[r];			oprange[ADIVD] = oprange[r];			oprange[AMOVFD] = oprange[r];			oprange[AMOVDF] = oprange[r];			break;					case ACMPF:			oprange[ACMPD] = oprange[r];			break;		case AMOVF:			oprange[AMOVD] = oprange[r];			break;		case AMOVFW:			oprange[AMOVWF] = oprange[r];			oprange[AMOVWD] = oprange[r];			oprange[AMOVDW] = oprange[r];			break;		case AMULL:			oprange[AMULA] = oprange[r];			oprange[AMULAL] = oprange[r];			oprange[AMULLU] = oprange[r];			oprange[AMULALU] = oprange[r];			break;		}	}}/*voidbuildrep(int x, int as){	Opcross *p;	Optab *e, *s, *o;	int a1, a2, a3, n;	if(C_NONE != 0 || C_REG != 1 || C_GOK >= 32 || x >= nelem(opcross)) {		diag("assumptions fail in buildrep");		errorexit();	}	repop[as] = x;	p = (opcross + x);	s = oprange[as].start;	e = oprange[as].stop;	for(o=e-1; o>=s; o--) {		n = o-optab;		for(a2=0; a2<2; a2++) {			if(a2) {				if(o->a2 == C_NONE)					continue;			} else				if(o->a2 != C_NONE)					continue;			for(a1=0; a1<32; a1++) {				if(!xcmp[a1][o->a1])					continue;				for(a3=0; a3<32; a3++)					if(xcmp[a3][o->a3])						(*p)[a1][a2][a3] = n;			}		}	}	oprange[as].start = 0;}*/enum{	ABSD = 0,	ABSU = 1,	RELD = 2,	RELU = 3,};int modemap[4] = { 0, 1, -1, 2, };typedef struct Reloc Reloc;struct Reloc{	int n;	int t;	uchar *m;	ulong *a;};Reloc rels;static voidgrow(Reloc *r){	int t;	uchar *m, *nm;	ulong *a, *na;	t = r->t;	r->t += 64;	m = r->m;	a = r->a;	r->m = nm = malloc(r->t*sizeof(uchar));	r->a = na = malloc(r->t*sizeof(ulong));	memmove(nm, m, t*sizeof(uchar));	memmove(na, a, t*sizeof(ulong));	free(m);	free(a);}voiddynreloc(Sym *s, long v, int abs){	int i, k, n;	uchar *m;	ulong *a;	Reloc *r;	if(v&3)		diag("bad relocation address");	v >>= 2;	if(s != S && s->type == SUNDEF)		k = abs ? ABSU : RELU;	else		k = abs ? ABSD : RELD;	/* Bprint(&bso, "R %s a=%ld(%lx) %d\n", s->name, a, a, k); */	k = modemap[k];	r = &rels;	n = r->n;	if(n >= r->t)		grow(r);	m = r->m;	a = r->a;	for(i = n; i > 0; i--){		if(v < a[i-1]){	/* happens occasionally for data */			m[i] = m[i-1];			a[i] = a[i-1];		}		else			break;	}	m[i] = k;	a[i] = v;	r->n++;}static intsput(char *s){	char *p;	p = s;	while(*s)		cput(*s++);	cput(0);	return  s-p+1;}voidasmdyn(){	int i, n, t, c;	Sym *s;	ulong la, ra, *a;	vlong off;	uchar *m;	Reloc *r;	cflush();	off = seek(cout, 0, 1);	lput(0);	t = 0;	lput(imports);	t += 4;	for(i = 0; i < NHASH; i++)		for(s = hash[i]; s != S; s = s->link)			if(s->type == SUNDEF){				lput(s->sig);				t += 4;				t += sput(s->name);			}		la = 0;	r = &rels;	n = r->n;	m = r->m;	a = r->a;	lput(n);	t += 4;	for(i = 0; i < n; i++){		ra = *a-la;		if(*a < la)			diag("bad relocation order");		if(ra < 256)			c = 0;		else if(ra < 65536)			c = 1;		else			c = 2;		cput((c<<6)|*m++);		t++;		if(c == 0){			cput(ra);			t++;		}		else if(c == 1){			wput(ra);			t += 2;		}		else{			lput(ra);			t += 4;		}		la = *a++;	}	cflush();	seek(cout, off, 0);	lput(t);	if(debug['v']){		Bprint(&bso, "import table entries = %d\n", imports);		Bprint(&bso, "export table entries = %d\n", exports);	}}

⌨️ 快捷键说明

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