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

📄 iu.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
	ulong ea;	int ra, rd, upd;	long imm;	getairr(ir);	ea = imm;	upd = (ir&(1L<<26))!=0;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;	} else {		if(upd)			undef(ir);	}	if(trace)		itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",					ci->name, rd, imm, ra, ea, reg.r[rd], reg.r[rd]);	putmem_w(ea, reg.r[rd]);}voidstwx(ulong ir){	ulong ea;	int ra, rd, upd, rb;	getarrr(ir);	ea = reg.r[rb];	upd = getxo(ir)==183;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;		if(trace)			itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",					ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]);	} else {		if(upd)			undef(ir);		if(trace)			itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",					ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]);	}	putmem_w(ea, reg.r[rd]);}voidstwcx(ulong ir){	ulong ea;	int ra, rd, rb;	if((ir & Rc) == 0)		undef(ir);	getarrr(ir);	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",					ci->name, rd, ra, rb, ea, reg.r[rd], reg.r[rd]);	} else {		if(trace)			itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",					ci->name, rd, rb, ea, reg.r[rd], reg.r[rd]);	}	putmem_w(ea, reg.r[rd]);	/* assume a reservation exists; store succeeded */	setcr(0, 0);}voidstb(ulong ir){	ulong ea;	int ra, rd, upd, v;	long imm;	getairr(ir);	ea = imm;	upd = (ir&(1L<<26))!=0;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;	} else {		if(upd)			undef(ir);	}	v = reg.r[rd] & 0xFF;	if(trace)		itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",					ci->name, rd, imm, ra, ea, v, v);	putmem_b(ea, v);}voidstbx(ulong ir){	ulong ea;	int ra, rd, upd, rb, v;	getarrr(ir);	ea = reg.r[rb];	upd = getxo(ir)==247;	v = reg.r[rd] & 0xFF;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;		if(trace)			itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",					ci->name, rd, ra, rb, ea, v, v);	} else {		if(upd)			undef(ir);		if(trace)			itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",					ci->name, rd, rb, ea, v, v);	}	putmem_b(ea, v);}voidlhz(ulong ir){	ulong ea;	int imm, ra, rd, upd;	getairr(ir);	ea = imm;	upd = (ir&(1L<<26))!=0;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;	} else {		if(upd)			undef(ir);	}	if(trace)		itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);	reg.r[rd] = getmem_h(ea);}voidlhzx(ulong ir){	ulong ea;	int rb, ra, rd, upd;	getarrr(ir);	ea = reg.r[rb];	upd = getxo(ir)==311;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);	} else {		if(upd)			undef(ir);		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);	}	reg.r[rd] = getmem_h(ea);}voidlha(ulong ir){	ulong ea;	int imm, ra, rd, upd;	getairr(ir);	ea = imm;	upd = (ir&(1L<<26))!=0;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;	} else {		if(upd)			undef(ir);	}	if(trace)		itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);	reg.r[rd] = (short)getmem_h(ea);}voidlhax(ulong ir){	ulong ea;	int rb, ra, rd, upd;	getarrr(ir);	ea = reg.r[rb];	upd = getxo(ir)==311;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);	} else {		if(upd)			undef(ir);		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);	}	reg.r[rd] = (short)getmem_h(ea);}voidlhbrx(ulong ir){	ulong ea;	int rb, ra, rd;	ulong v;	getarrr(ir);	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);	} else {		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);	}	v = getmem_h(ea);	reg.r[rd] = ((v&0xFF)<<8)|(v&0xFF);}voidsth(ulong ir){	ulong ea;	int imm, ra, rd, upd, v;	getairr(ir);	ea = imm;	upd = (ir&(1L<<26))!=0;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;	} else {		if(upd)			undef(ir);	}	v = reg.r[rd] & 0xFFFF;	if(trace)		itrace("%s\tr%d,%ld(r%d) #%lux=#%lux (%ld)",					ci->name, rd, imm, ra, ea, v, v);	putmem_h(ea, v);}voidsthx(ulong ir){	ulong ea;	int ra, rd, upd, rb, v;	getarrr(ir);	ea = reg.r[rb];	upd = getxo(ir)==247;	v = reg.r[rd] & 0xFFFF;	if(ra) {		ea += reg.r[ra];		if(upd)			reg.r[ra] = ea;		if(trace)			itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",					ci->name, rd, ra, rb, ea, v, v);	} else {		if(upd)			undef(ir);		if(trace)			itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",					ci->name, rd, rb, ea, v, v);	}	putmem_h(ea, v);}voidsthbrx(ulong ir){	ulong ea;	int ra, rd, rb;	ulong v;	getarrr(ir);	ea = reg.r[rb];	v = reg.r[rd];	v = ((v&0xFF)<<8)|(v&0xFF);	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) #%lux=#%lux (%ld)",					ci->name, rd, ra, rb, ea, v, v);	} else {		if(trace)			itrace("%s\tr%d,(r%d) #%lux=#%lux (%ld)",					ci->name, rd, rb, ea, v, v);	}	putmem_h(ea, v);}voidlwbrx(ulong ir){	ulong ea;	int rb, ra, rd, i;	ulong v;	getarrr(ir);	if(ir & Rc)		undef(ir);	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);	} else {		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);	}	v = 0;	for(i = 0; i < 4; i++)		v = v>>8 | getmem_b(ea++);	/* assume unaligned load is allowed */	reg.r[rd] = v;}voidstwbrx(ulong ir){	ulong ea;	int rb, ra, rd, i;	ulong v;	getarrr(ir);	if(ir & Rc)		undef(ir);	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux", ci->name, rd, ra, rb, ea);	} else {		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux", ci->name, rd, rb, ea);	}	v = 0;	for(i = 0; i < 4; i++) {		putmem_b(ea++, v & 0xFF);	/* assume unaligned store is allowed */		v >>= 8;	}}voidlswi(ulong ir){	ulong ea;	int rb, ra, rd, n, i, r, b;	getarrr(ir);	if(ir & Rc)		undef(ir);	n = rb;	if(n == 0)		n = 32;	ea = 0;	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea);	} else {		if(trace)			itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n);	}	i = -1;	r = rd-1;	while(--n >= 0) {		if(i < 0) {			r = (r+1)&0x1F;			if(ra == 0 || r != ra)				reg.r[r] = 0;			i = 24;		}		b = getmem_b(ea++);		if(ra == 0 || r != ra)			reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i);		i -= 8;	}}voidlswx(ulong ir){	ulong ea;	int rb, ra, rd, n, i, r, b;	getarrr(ir);	if(ir & Rc)		undef(ir);	n = reg.xer & 0x7F;	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n);	} else {		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n);	}	i = -1;	r = rd-1;	while(--n >= 0) {		if(i < 0) {			r = (r+1)&0x1F;			if((ra == 0 || r != ra) && r != rb)				reg.r[r] = 0;			i = 24;		}		b = getmem_b(ea++);		if((ra == 0 || r != ra) && r != rb)			reg.r[r] = (reg.r[r] & ~(0xFF<<i)) | (b << i);		i -= 8;	}}voidstswx(ulong ir){	ulong ea;	int rb, ra, rd, n, i, r;	getarrr(ir);	if(ir & Rc)		undef(ir);	n = reg.xer & 0x7F;	ea = reg.r[rb];	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d+r%d) ea=%lux n=%d", ci->name, rd, ra, rb, ea, n);	} else {		if(trace)			itrace("%s\tr%d,(r%d) ea=%lux n=%d", ci->name, rd, rb, ea, n);	}	i = -1;	r = rd-1;	while(--n >= 0) {		if(i < 0) {			r = (r+1)&0x1F;			i = 24;		}		putmem_b(ea++, (reg.r[r]>>i)&0xFF);		i -= 8;	}}voidstswi(ulong ir){	ulong ea;	int rb, ra, rd, n, i, r;	getarrr(ir);	if(ir & Rc)		undef(ir);	n = rb;	if(n == 0)		n = 32;	ea = 0;	if(ra) {		ea += reg.r[ra];		if(trace)			itrace("%s\tr%d,(r%d),%d ea=%lux", ci->name, rd, ra, n, ea);	} else {		if(trace)			itrace("%s\tr%d,(0),%d ea=0", ci->name, rd, n);	}	i = -1;	r = rd-1;	while(--n >= 0) {		if(i < 0) {			r = (r+1)&0x1F;			i = 24;		}		putmem_b(ea++, (reg.r[r]>>i)&0xFF);		i -= 8;	}}voidlmw(ulong ir){	ulong ea;	int ra, rd, r;	long imm;	getairr(ir);	ea = imm;	if(ra)		ea += reg.r[ra];	if(trace)		itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);	for(r = rd; r <= 31; r++) {		if(r != 0 && r != rd)			reg.r[rd] = getmem_w(ea);		ea += 4;	}}voidstmw(ulong ir){	ulong ea;	int ra, rd, r;	long imm;	getairr(ir);	ea = imm;	if(ra)		ea += reg.r[ra];	if(trace)		itrace("%s\tr%d,%ld(r%d) ea=%lux", ci->name, rd, imm, ra, ea);	for(r = rd; r <= 31; r++) {		putmem_w(ea, reg.r[rd]);		ea += 4;	}}voidtwi(ulong ir){	int rd, ra;	long a, imm;	getairr(ir);	a = reg.r[ra];	if(trace)		itrace("twi\t#%.2x,r%d,$0x%lux (%ld)", rd, ra, imm, imm);	if(a < imm && rd&0x10 ||	   a > imm && rd&0x08 ||	   a == imm && rd&0x04 ||	   (ulong)a < imm && rd&0x02 ||	   (ulong)a > imm && rd&0x01) {		Bprint(bioout, "program_exception (trap type)\n");		longjmp(errjmp, 0);	}}voidtw(ulong ir){	int rd, ra, rb;	long a, b;	getarrr(ir);	a = reg.r[ra];	b = reg.r[rb];	if(trace)		itrace("tw\t#%.2x,r%d,r%d", rd, ra, rb);	if(a < b && rd&0x10 ||	   a > b && rd&0x08 ||	   a == b && rd&0x04 ||	   (ulong)a < b && rd&0x02 ||	   (ulong)a > b && rd&0x01) {		Bprint(bioout, "program_exception (trap type)\n");		longjmp(errjmp, 0);	}}voidsync(ulong ir){	USED(ir);	if(trace)		itrace("sync");}voidicbi(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbf(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbst(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbt(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbtst(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}voiddcbz(ulong ir){	int rd, ra, rb;	if(ir & Rc)		undef(ir);	getarrr(ir);	USED(rd);	if(trace)		itrace("%s\tr%d,r%d", ci->name, ra, rb);}

⌨️ 快捷键说明

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