ppc_mmu.c
来自「skyeye是一个可以模拟嵌入式硬件开发板的系统软件」· C语言 代码 · 共 2,269 行 · 第 1/5 页
C
2,269 行
return false; } else { // ok return true; } } pteg_addr+=8; } hash1 = ~hash1; h = PTE1_H; } return false;}bool ppc_prom_page_free(uint32 ea){ return true;}/*************************************************************************** * MMU Opcodes */#include "ppc_dec.h"/* * dcbz Data Cache Clear to Zero * .464 */void ppc_opc_dcbz(){#ifdef E500 //printf("DBG:In %s, for e500,cache is not implemented.\n",__FUNCTION__);#else //PPC_L1_CACHE_LINE_SIZE int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); // assert rD=0 uint32 a = (rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB]; // BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ppc_write_effective_dword(a, 0) || ppc_write_effective_dword(a+8, 0) || ppc_write_effective_dword(a+16, 0) || ppc_write_effective_dword(a+24, 0);#endif}void ppc_opc_dcbtls(){#ifdef E500 //printf("DBG:In %s, for e500,cache is not implemented.\n",__FUNCTION__);#else fprintf(stderr,"In %s, cache is not implemented.\n",__FUNCTION__);#endif}/* * lbz Load Byte and Zero * .521 */void ppc_opc_lbz(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint8 r; int ret = ppc_read_effective_byte((rA?gCPU.gpr[rA]:0)+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = r; }}/* * lbzu Load Byte and Zero with Update * .522 */void ppc_opc_lbzu(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); // FIXME: check rA!=0 && rA!=rD uint8 r; int ret = ppc_read_effective_byte(gCPU.gpr[rA]+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += imm; gCPU.gpr[rD] = r; } }/* * lbzux Load Byte and Zero with Update Indexed * .523 */void ppc_opc_lbzux(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); // FIXME: check rA!=0 && rA!=rD uint8 r; int ret = ppc_read_effective_byte(gCPU.gpr[rA]+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += gCPU.gpr[rB]; gCPU.gpr[rD] = r; }}/* * lbzx Load Byte and Zero Indexed * .524 */void ppc_opc_lbzx(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint8 r; int ret = ppc_read_effective_byte((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = r; }}/* * lfd Load Floating-Point Double * .530 */void ppc_opc_lfd(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm); uint64 r; int ret = ppc_read_effective_dword((rA?gCPU.gpr[rA]:0)+imm, &r); if (ret == PPC_MMU_OK) { gCPU.fpr[frD] = r; } }/* * lfdu Load Floating-Point Double with Update * .531 */void ppc_opc_lfdu(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm); // FIXME: check rA!=0 uint64 r; int ret = ppc_read_effective_dword(gCPU.gpr[rA]+imm, &r); if (ret == PPC_MMU_OK) { gCPU.fpr[frD] = r; gCPU.gpr[rA] += imm; } }/* * lfdux Load Floating-Point Double with Update Indexed * .532 */void ppc_opc_lfdux(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB); // FIXME: check rA!=0 uint64 r; int ret = ppc_read_effective_dword(gCPU.gpr[rA]+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += gCPU.gpr[rB]; gCPU.fpr[frD] = r; } }/* * lfdx Load Floating-Point Double Indexed * .533 */void ppc_opc_lfdx(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB); uint64 r; int ret = ppc_read_effective_dword((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.fpr[frD] = r; } }/* * lfs Load Floating-Point Single * .534 */void ppc_opc_lfs(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm); uint32 r; int ret = ppc_read_effective_word((rA?gCPU.gpr[rA]:0)+imm, &r); if (ret == PPC_MMU_OK) { ppc_single s; ppc_double d; ppc_fpu_unpack_single(&s, r); ppc_fpu_single_to_double(&s, &d); ppc_fpu_pack_double(&d, &(gCPU.fpr[frD])); } }/* * lfsu Load Floating-Point Single with Update * .535 */void ppc_opc_lfsu(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, frD, rA, imm); // FIXME: check rA!=0 uint32 r; int ret = ppc_read_effective_word(gCPU.gpr[rA]+imm, &r); if (ret == PPC_MMU_OK) { ppc_single s; ppc_double d; ppc_fpu_unpack_single(&s, r); ppc_fpu_single_to_double(&s, &d); ppc_fpu_pack_double(&d, &(gCPU.fpr[frD])); gCPU.gpr[rA] += imm; } }/* * lfsux Load Floating-Point Single with Update Indexed * .536 */void ppc_opc_lfsux(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB); // FIXME: check rA!=0 uint32 r; int ret = ppc_read_effective_word(gCPU.gpr[rA]+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += gCPU.gpr[rB]; ppc_single s; ppc_double d; ppc_fpu_unpack_single(&s, r); ppc_fpu_single_to_double(&s, &d); ppc_fpu_pack_double(&d, &(gCPU.fpr[frD])); } }/* * lfsx Load Floating-Point Single Indexed * .537 */void ppc_opc_lfsx(){ if ((gCPU.msr & MSR_FP) == 0) { ppc_exception(PPC_EXC_NO_FPU, 0, 0); return; } int rA, frD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, frD, rA, rB); uint32 r; int ret = ppc_read_effective_word((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { ppc_single s; ppc_double d; ppc_fpu_unpack_single(&s, r); ppc_fpu_single_to_double(&s, &d); ppc_fpu_pack_double(&d, &(gCPU.fpr[frD])); } }/* * lha Load Half Word Algebraic * .538 */void ppc_opc_lha(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint16 r; int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r; }}/* * lhau Load Half Word Algebraic with Update * .539 */void ppc_opc_lhau(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint16 r; // FIXME: rA != 0 int ret = ppc_read_effective_half(gCPU.gpr[rA]+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += imm; gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r; }}/* * lhaux Load Half Word Algebraic with Update Indexed * .540 */void ppc_opc_lhaux(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint16 r; // FIXME: rA != 0 int ret = ppc_read_effective_half(gCPU.gpr[rA]+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += gCPU.gpr[rB]; gCPU.gpr[rD] = (r&0x8000)?(r|0xffff0000):r; }}/* * lhax Load Half Word Algebraic Indexed * .541 */void ppc_opc_lhax(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint16 r; // FIXME: rA != 0 int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = (r&0x8000) ? (r|0xffff0000):r; }}/* * lhbrx Load Half Word Byte-Reverse Indexed * .542 */void ppc_opc_lhbrx(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint16 r; int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = ppc_bswap_half(r); }}/* * lhz Load Half Word and Zero * .543 */void ppc_opc_lhz(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint16 r; int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = r; }}/* * lhzu Load Half Word and Zero with Update * .544 */void ppc_opc_lhzu(){ int rA, rD; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint16 r; // FIXME: rA!=0 int ret = ppc_read_effective_half(gCPU.gpr[rA]+imm, &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = r; gCPU.gpr[rA] += imm; }}/* * lhzux Load Half Word and Zero with Update Indexed * .545 */void ppc_opc_lhzux(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint16 r; // FIXME: rA != 0 int ret = ppc_read_effective_half(gCPU.gpr[rA]+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rA] += gCPU.gpr[rB]; gCPU.gpr[rD] = r; }}/* * lhzx Load Half Word and Zero Indexed * .546 */void ppc_opc_lhzx(){ int rA, rD, rB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, rB); uint16 r; int ret = ppc_read_effective_half((rA?gCPU.gpr[rA]:0)+gCPU.gpr[rB], &r); if (ret == PPC_MMU_OK) { gCPU.gpr[rD] = r; }}/* * lmw Load Multiple Word * .547 */void ppc_opc_lmw(){ int rD, rA; uint32 imm; PPC_OPC_TEMPL_D_SImm(gCPU.current_opc, rD, rA, imm); uint32 ea = (rA ? gCPU.gpr[rA] : 0) + imm; while (rD <= 31) { if (ppc_read_effective_word(ea, &(gCPU.gpr[rD]))) { return; } rD++; ea += 4; }}/* * lswi Load String Word Immediate * .548 */void ppc_opc_lswi(){ int rA, rD, NB; PPC_OPC_TEMPL_X(gCPU.current_opc, rD, rA, NB);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?