?? ppc_alu.c
字號:
/* * divwuox Divide Word Unsigned with Overflow * .472 */void ppc_opc_divwuox(){ int rD, rA, rB; PPC_OPC_TEMPL_XO(gCPU.current_opc, rD, rA, rB); if (!gCPU.gpr[rB]) {// PPC_ALU_ERR("division by zero\n"); } 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]); } // 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(){#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_isel(){#ifdef E500 //fprintf(stderr,"In %s, not implemented in E500.\n", __FUNCTION__);#else fprintf(stderr,"In %s, not implemented .\n", __FUNCTION__);#endif}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -