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

📄 ppc_fpu.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (A.type == ppc_fpr_Inf && B.type == ppc_fpr_Inf) {		gCPU.fpscr |= FPSCR_VXIDI;	}	if (B.type == ppc_fpr_zero && A.type != ppc_fpr_zero) {		// FIXME::		gCPU.fpscr |= FPSCR_VXIDI;			}	ppc_fpu_div(&D, &A, &B);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fdiv.\n");	}}/* *	fdivsx		Floating Divide Single *	.495 */void ppc_opc_fdivsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frC==0);	ppc_double A, B, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	if (A.type == ppc_fpr_zero && B.type == ppc_fpr_zero) {		gCPU.fpscr |= FPSCR_VXZDZ;	}	if (A.type == ppc_fpr_Inf && B.type == ppc_fpr_Inf) {		gCPU.fpscr |= FPSCR_VXIDI;	}	if (B.type == ppc_fpr_zero && A.type != ppc_fpr_zero) {		// FIXME::		gCPU.fpscr |= FPSCR_VXIDI;			}	ppc_fpu_div(&D, &A, &B);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fdivs.\n");	}}/* *	fmaddx		Floating Multiply-Add (Double-Precision) *	.496 */void ppc_opc_fmaddx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	ppc_fpu_mul_add(&D, &A, &C, &B);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmadd.\n");	}}/* *	fmaddx		Floating Multiply-Add Single *	.497 */void ppc_opc_fmaddsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	ppc_fpu_mul_add(&D, &A, &C, &B);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmadds.\n");	}}/* *	fmrx		Floating Move Register *	.498 */void ppc_opc_fmrx(){	int frD, rA, frB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, frB);	PPC_OPC_ASSERT(rA==0);	gCPU.fpr[frD] = gCPU.fpr[frB];	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmr.\n");	}}/* *	fmsubx		Floating Multiply-Subtract (Double-Precision) *	.499 */void ppc_opc_fmsubx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	B.s ^= 1;	ppc_fpu_mul_add(&D, &A, &C, &B);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmsub.\n");	}}/* *	fmsubsx		Floating Multiply-Subtract Single *	.500 */void ppc_opc_fmsubsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	ppc_fpu_mul_add(&D, &A, &C, &B);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmsubs.\n");	}}/* *	fmulx		Floating Multipy (Double-Precision) *	.501 */void ppc_opc_fmulx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frB==0);	ppc_double A, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	if ((A.type == ppc_fpr_Inf && C.type == ppc_fpr_zero)	 || (A.type == ppc_fpr_zero && C.type == ppc_fpr_Inf)) {		gCPU.fpscr |= FPSCR_VXIMZ;	}	ppc_fpu_mul(&D, &A, &C);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));//	*((double*)&gCPU.fpr[frD]) = *((double*)(&gCPU.fpr[frA]))*(*((double*)(&gCPU.fpr[frC])));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmul.\n");	}}/* *	fmulsx		Floating Multipy Single *	.502 */void ppc_opc_fmulsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frB==0);	ppc_double A, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	if ((A.type == ppc_fpr_Inf && C.type == ppc_fpr_zero)	 || (A.type == ppc_fpr_zero && C.type == ppc_fpr_Inf)) {		gCPU.fpscr |= FPSCR_VXIMZ;	}	ppc_fpu_mul(&D, &A, &C);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fmuls.\n");	}}/* *	fnabsx		Floating Negative Absolute Value *	.503 */void ppc_opc_fnabsx(){	int frD, frA, frB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, frA, frB);	PPC_OPC_ASSERT(frA==0);	gCPU.fpr[frD] = gCPU.fpr[frB] | FPU_SIGN_BIT;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fnabs.\n");	}}/* *	fnegx		Floating Negate *	.504 */void ppc_opc_fnegx(){	int frD, frA, frB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, frA, frB);	PPC_OPC_ASSERT(frA==0);	gCPU.fpr[frD] = gCPU.fpr[frB] ^ FPU_SIGN_BIT;	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fneg.\n");	}}/* *	fnmaddx		Floating Negative Multiply-Add (Double-Precision)  *	.505 */void ppc_opc_fnmaddx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D/*, E*/;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	ppc_fpu_mul_add(&D, &A, &C, &B);	D.s ^= 1;	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fnmadd.\n");	}}/* *	fnmaddsx	Floating Negative Multiply-Add Single *	.506 */void ppc_opc_fnmaddsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	ppc_fpu_mul_add(&D, &A, &C, &B);	D.s ^= 1;	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fnmadds.\n");	}}/* *	fnmsubx		Floating Negative Multiply-Subtract (Double-Precision) *	.507 */void ppc_opc_fnmsubx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	B.s ^= 1;	ppc_fpu_mul_add(&D, &A, &C, &B);	D.s ^= 1;	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fnmsub.\n");	}}/* *	fnsubsx		Floating Negative Multiply-Subtract Single *	.508 */void ppc_opc_fnmsubsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A, B, C, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_unpack_double(&C, gCPU.fpr[frC]);	B.s ^= 1;	ppc_fpu_mul_add(&D, &A, &C, &B);	D.s ^= 1;	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fnmsubs.\n");	}}/* *	fresx		Floating Reciprocal Estimate Single *	.509 */void ppc_opc_fresx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frA==0 && frC==0);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fres.\n");	}	PPC_FPU_ERR("fres\n");}/* *	frspx		Floating Round to Single *	.511 */void ppc_opc_frspx(){	int frD, frA, frB;	PPC_OPC_TEMPL_X(gCPU.current_opc, frD, frA, frB);	PPC_OPC_ASSERT(frA==0);	ppc_double B;	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&B, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("frsp.\n");	}}/* *	frsqrtex	Floating Reciprocal Square Root Estimate *	.512 */void ppc_opc_frsqrtex(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frA==0 && frC==0);	ppc_double B;	ppc_double D;	ppc_double E;	ppc_double Q;	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_sqrt(&Q, &B);	E.type = ppc_fpr_norm; E.s = 0; E.e = 0; E.m = 0x80000000000000ULL;	ppc_fpu_div(&D, &E, &Q);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));		if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("frsqrte.\n");	}}/* *	fselx		Floating Select *	.514 */void ppc_opc_fselx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	ppc_double A;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	if (A.type == ppc_fpr_NaN || (A.type != ppc_fpr_zero && A.s)) {		gCPU.fpr[frD] = gCPU.fpr[frB];	} else {		gCPU.fpr[frD] = gCPU.fpr[frC];	}	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fsel.\n");	}}/* *	fsqrtx		Floating Square Root (Double-Precision) *	.515 */void ppc_opc_fsqrtx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frA==0 && frC==0);	ppc_double B;	ppc_double D;	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	ppc_fpu_sqrt(&D, &B);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fsqrt.\n");	}}/* *	fsqrtsx		Floating Square Root Single *	.515 */void ppc_opc_fsqrtsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frA==0 && frC==0);	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fsqrts.\n");	}	PPC_FPU_ERR("fsqrts\n");}/* *	fsubx		Floating Subtract (Double-Precision) *	.517 */void ppc_opc_fsubx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frC==0);	ppc_double A, B, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	if (B.type != ppc_fpr_NaN) {		B.s ^= 1;	}	if (A.s != B.s && A.type == ppc_fpr_Inf && B.type == ppc_fpr_Inf) {		gCPU.fpscr |= FPSCR_VXISI;	}	ppc_fpu_add(&D, &A, &B);	gCPU.fpscr |= ppc_fpu_pack_double(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fsub.\n");	}}/* *	fsubsx		Floating Subtract Single *	.518 */void ppc_opc_fsubsx(){	int frD, frA, frB, frC;	PPC_OPC_TEMPL_A(gCPU.current_opc, frD, frA, frB, frC);	PPC_OPC_ASSERT(frC==0);	ppc_double A, B, D;	ppc_fpu_unpack_double(&A, gCPU.fpr[frA]);	ppc_fpu_unpack_double(&B, gCPU.fpr[frB]);	if (B.type != ppc_fpr_NaN) {		B.s ^= 1;	}	if (A.s != B.s && A.type == ppc_fpr_Inf && B.type == ppc_fpr_Inf) {		gCPU.fpscr |= FPSCR_VXISI;	}	ppc_fpu_add(&D, &A, &B);	gCPU.fpscr |= ppc_fpu_pack_double_as_single(&D, &(gCPU.fpr[frD]));	if (gCPU.current_opc & PPC_OPC_Rc) {		// update cr1 flags		PPC_FPU_ERR("fsubs.\n");	}}

⌨️ 快捷键说明

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