📄 ppc_fpu.c
字号:
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 + -