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

📄 ppc_alu.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	// update XER flags	PPC_ALU_ERR("divwuox unimplemented\n");}/* *	eqvx		Equivalent *	.480 */void ppc_opc_eqvx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = ~(gCPU.gpr[rS] ^ gCPU.gpr[rB]);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	extsbx		Extend Sign Byte *	.481 */void ppc_opc_extsbx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	PPC_OPC_ASSERT(rB==0);	gCPU.gpr[rA] = gCPU.gpr[rS];	if (gCPU.gpr[rA] & 0x80) {		gCPU.gpr[rA] |= 0xffffff00;	} else {		gCPU.gpr[rA] &= ~0xffffff00;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	extshx		Extend Sign Half Word *	.482 */void ppc_opc_extshx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	PPC_OPC_ASSERT(rB==0);	gCPU.gpr[rA] = gCPU.gpr[rS];	if (gCPU.gpr[rA] & 0x8000) {		gCPU.gpr[rA] |= 0xffff0000;	} else {		gCPU.gpr[rA] &= ~0xffff0000;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	mulhwx		Multiply High Word *	.595 */void ppc_opc_mulhwx(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	sint64 a = (sint32)gCPU.gpr[rA];	sint64 b = (sint32)gCPU.gpr[rB];	sint64 c = a*b;	gCPU.gpr[rD] = ((uint64)c)>>32;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);//		PPC_ALU_WARN("mulhw. correct?\n");	}}/* *	mulhwux		Multiply High Word Unsigned *	.596 */void ppc_opc_mulhwux(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	uint64 a = gCPU.gpr[rA];	uint64 b = gCPU.gpr[rB];	uint64 c = a*b;	gCPU.gpr[rD] = c>>32;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	mulli		Multiply Low Immediate *	.598 */void ppc_opc_mulli(){	int rD, rA;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	// FIXME: signed / unsigned correct?	gCPU.gpr[rD] = gCPU.gpr[rA] * imm;}/* *	mullwx		Multiply Low Word *	.599 */void ppc_opc_mullwx(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	gCPU.gpr[rD] = gCPU.gpr[rA] * gCPU.gpr[rB];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	if (gCPU.current_opc & PPC_OPC_OE) {		// update XER flags		PPC_ALU_ERR("mullwx unimplemented\n");	}}/* *	nandx		NAND *	.600 */void ppc_opc_nandx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = ~(gCPU.gpr[rS] & gCPU.gpr[rB]);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	negx		Negate *	.601 */void ppc_opc_negx(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	gCPU.gpr[rD] = -gCPU.gpr[rA];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	negox		Negate with Overflow *	.601 */void ppc_opc_negox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	gCPU.gpr[rD] = -gCPU.gpr[rA];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("negox unimplemented\n");}/* *	norx		NOR *	.602 */void ppc_opc_norx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = ~(gCPU.gpr[rS] | gCPU.gpr[rB]);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	orx		OR *	.603 */void ppc_opc_orx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = gCPU.gpr[rS] | gCPU.gpr[rB];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	orcx		OR with Complement *	.604 */void ppc_opc_orcx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = gCPU.gpr[rS] | ~gCPU.gpr[rB];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	ori		OR Immediate *	.605 */void ppc_opc_ori(){	int rS, rA;	uint32 imm;	PPC_OPC_TEMPL_D_UImm(gCPU.current_opc, rS, rA, imm);	gCPU.gpr[rA] = gCPU.gpr[rS] | imm;}/* *	oris		OR Immediate Shifted *	.606 */void ppc_opc_oris(){	int rS, rA;	uint32 imm;	PPC_OPC_TEMPL_D_Shift16(gCPU.current_opc, rS, rA, imm);	gCPU.gpr[rA] = gCPU.gpr[rS] | imm;}/* *	rlwimix		Rotate Left Word Immediate then Mask Insert *	.617 */void ppc_opc_rlwimix(){	int rS, rA, SH, MB, ME;	PPC_OPC_TEMPL_M(gCPU.current_opc, rS, rA, SH, MB, ME);	uint32 v = ppc_word_rotl(gCPU.gpr[rS], SH);	uint32 mask = ppc_mask(MB, ME);	gCPU.gpr[rA] = (v & mask) | (gCPU.gpr[rA] & ~mask);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	rlwinmx		Rotate Left Word Immediate then AND with Mask *	.618 */void ppc_opc_rlwinmx(){	int rS, rA, SH, MB, ME;	PPC_OPC_TEMPL_M(gCPU.current_opc, rS, rA, SH, MB, ME);	uint32 v = ppc_word_rotl(gCPU.gpr[rS], SH);	uint32 mask = ppc_mask(MB, ME);	gCPU.gpr[rA] = v & mask;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	rlwnmx		Rotate Left Word then AND with Mask *	.620 */void ppc_opc_rlwnmx(){	int rS, rA, rB, MB, ME;	PPC_OPC_TEMPL_M(gCPU.current_opc, rS, rA, rB, MB, ME);	uint32 v = ppc_word_rotl(gCPU.gpr[rS], gCPU.gpr[rB]);	uint32 mask = ppc_mask(MB, ME);	gCPU.gpr[rA] = v & mask;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	slwx		Shift Left Word *	.625 */void ppc_opc_slwx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	uint32 s = gCPU.gpr[rB] & 0x3f;	if (s > 31) {		gCPU.gpr[rA] = 0;	} else {		gCPU.gpr[rA] = gCPU.gpr[rS] << s;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	srawx		Shift Right Algebraic Word *	.628 */void ppc_opc_srawx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	uint32 SH = gCPU.gpr[rB] & 0x3f;	gCPU.gpr[rA] = gCPU.gpr[rS];	gCPU.xer &= ~XER_CA;	if (gCPU.gpr[rA] & 0x80000000) {		uint32 ca = 0;		uint i;		for (i=0; i < SH; i++) {			if (gCPU.gpr[rA] & 1) ca = 1;			gCPU.gpr[rA] >>= 1;			gCPU.gpr[rA] |= 0x80000000;		}		if (ca) gCPU.xer |= XER_CA;	} else {		if (SH > 31) {			gCPU.gpr[rA] = 0;		} else {			gCPU.gpr[rA] >>= SH;		}	}     	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	srawix		Shift Right Algebraic Word Immediate *	.629 */void ppc_opc_srawix(){	int rS, rA;	uint32 SH;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, SH);	gCPU.gpr[rA] = gCPU.gpr[rS];	gCPU.xer &= ~XER_CA;	if (gCPU.gpr[rA] & 0x80000000) {		uint32 ca = 0;		uint i;		for (i=0; i < SH; i++) {			if (gCPU.gpr[rA] & 1) ca = 1;			gCPU.gpr[rA] >>= 1;			gCPU.gpr[rA] |= 0x80000000;		}		if (ca) gCPU.xer |= XER_CA;	} else {		if (SH > 31) {			gCPU.gpr[rA] = 0;		} else {			gCPU.gpr[rA] >>= SH;		}	}     	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	srwx		Shift Right Word *	.631 */void ppc_opc_srwx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	uint32 v = gCPU.gpr[rB] & 0x3f;	if (v > 31) {		gCPU.gpr[rA] = 0;	} else {		gCPU.gpr[rA] = gCPU.gpr[rS] >> v;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	subfx		Subtract From *	.666 */void ppc_opc_subfx(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	gCPU.gpr[rD] = ~gCPU.gpr[rA] + gCPU.gpr[rB] + 1;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	subfox		Subtract From with Overflow *	.666 */void ppc_opc_subfox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	gCPU.gpr[rD] = ~gCPU.gpr[rA] + gCPU.gpr[rB] + 1;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("subfox unimplemented\n");}/* *	subfcx		Subtract From Carrying *	.667 */void ppc_opc_subfcx(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	uint32 a = gCPU.gpr[rA];	uint32 b = gCPU.gpr[rB];	gCPU.gpr[rD] = ~a + b + 1;	// update xer	if (ppc_carry_3(~a, b, 1)) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	subfcox		Subtract From Carrying with Overflow *	.667 */void ppc_opc_subfcox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	uint32 a = gCPU.gpr[rA];	uint32 b = gCPU.gpr[rB];	gCPU.gpr[rD] = ~a + b + 1;	// update xer	if (ppc_carry_3(~a, b, 1)) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("subfcox unimplemented\n");}/* *	subfex		Subtract From Extended *	.668 */void ppc_opc_subfex(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	uint32 a = gCPU.gpr[rA];	uint32 b = gCPU.gpr[rB];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + b + ca;	// update xer	if (ppc_carry_3(~a, b, ca)) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	subfeox		Subtract From Extended with Overflow *	.668 */void ppc_opc_subfeox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	uint32 a = gCPU.gpr[rA];	uint32 b = gCPU.gpr[rB];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + b + ca;	// update xer	if (ppc_carry_3(~a, b, ca)) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("subfeox unimplemented\n");}/* *	subfic		Subtract From Immediate Carrying *	.669 */void ppc_opc_subfic(){	int rD, rA;	uint32 imm;	PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm);	uint32 a = gCPU.gpr[rA];	gCPU.gpr[rD] = ~a + imm + 1;	// update XER	if (ppc_carry_3(~a, imm, 1)) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}}/* *	subfmex		Subtract From Minus One Extended *	.670 */void ppc_opc_subfmex(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	uint32 a = gCPU.gpr[rA];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + ca + 0xffffffff;	// update XER	if ((a!=0xffffffff) || ca) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	subfmeox	Subtract From Minus One Extended with Overflow *	.670 */void ppc_opc_subfmeox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	uint32 a = gCPU.gpr[rA];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + ca + 0xffffffff;	// update XER	if ((a!=0xffffffff) || ca) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("subfmeox unimplemented\n");}/* *	subfzex		Subtract From Zero Extended *	.671 */void ppc_opc_subfzex(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	uint32 a = gCPU.gpr[rA];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + ca;	if (!a && ca) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}}/* *	subfzeox	Subtract From Zero Extended with Overflow *	.671 */void ppc_opc_subfzeox(){	int rD, rA, rB;	PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	PPC_OPC_ASSERT(rB == 0);	uint32 a = gCPU.gpr[rA];	uint32 ca = ((gCPU.xer&XER_CA)?1:0);	gCPU.gpr[rD] = ~a + ca;	if (!a && ca) {		gCPU.xer |= XER_CA;	} else {		gCPU.xer &= ~XER_CA;	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rD]);	}	// update XER flags	PPC_ALU_ERR("subfzeox unimplemented\n");}/* *	xorx		XOR *	.680 */void ppc_opc_xorx(){	int rS, rA, rB;	PPC_OPC_TEMPL_X(gCPU.current_opc, rS, rA, rB);	gCPU.gpr[rA] = gCPU.gpr[rS] ^ gCPU.gpr[rB];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr0 flags		ppc_update_cr0(gCPU.gpr[rA]);	}}/* *	xori		XOR Immediate *	.681 */void ppc_opc_xori(){	int rS, rA;	uint32 imm;	PPC_OPC_TEMPL_D_UImm(gCPU.current_opc, rS, rA, imm);	gCPU.gpr[rA] = gCPU.gpr[rS] ^ imm;}/* *	xoris		XOR Immediate Shifted *	.682 */void ppc_opc_xoris(){	int rS, rA;	uint32 imm;	PPC_OPC_TEMPL_D_Shift16(gCPU.current_opc, rS, rA, imm);	gCPU.gpr[rA] = gCPU.gpr[rS] ^ imm;}void ppc_opc_iseleq(){	int rD, rA, rB;        PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);        //int crb = 2;        if(gCPU.cr & CR_CR0_EQ)                gCPU.gpr[rD] = gCPU.gpr[rA];        else                gCPU.gpr[rD] = gCPU.gpr[rB];#ifdef E500	//fprintf(stderr,"In %s, not implemented in E500.\n", __FUNCTION__);#else	fprintf(stderr,"In %s, not implemented .\n", __FUNCTION);#endif}void ppc_opc_iselgt(){        int rD, rA, rB;        PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	int crb = ((gCPU.current_opc)>>6)&0x1f;        if(gCPU.cr & CR_CR0_GT)                gCPU.gpr[rD] = gCPU.gpr[rA];        else                gCPU.gpr[rD] = gCPU.gpr[rB];#ifdef E500        //fprintf(stderr,"In %s, crb=0x%x, not implemented in E500.\n", __FUNCTION__, crb);#else        fprintf(stderr,"In %s, not implemented .\n", __FUNCTION);#endif}void ppc_opc_isel(){#ifdef E500	int rD, rA, rB;        PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB);	int crb = ((gCPU.current_opc)>>6)&0x1f;	if(gCPU.cr & (1 << (31 - crb)))		gCPU.gpr[rD] = gCPU.gpr[rA];	else		gCPU.gpr[rD] = gCPU.gpr[rB];        //fprintf(stderr,"In %s, crb=0x%x,not implemented in E500.\n", __FUNCTION__, crb);#else        fprintf(stderr,"In %s, not implemented .\n", __FUNCTION__);#endif}

⌨️ 快捷键说明

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