📄 translate.c.svn-base
字号:
gen_op_store_T0_gpr(rD(ctx->opcode));}/* mulli */GEN_HANDLER(mulli, 0x07, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rA(ctx->opcode)); gen_op_mulli(SIMM(ctx->opcode)); gen_op_store_T0_gpr(rD(ctx->opcode));}/* subfic */GEN_HANDLER(subfic, 0x08, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rA(ctx->opcode));#if defined(TARGET_PPC64) if (ctx->sf_mode) gen_op_subfic_64(SIMM(ctx->opcode)); else#endif gen_op_subfic(SIMM(ctx->opcode)); gen_op_store_T0_gpr(rD(ctx->opcode));}#if defined(TARGET_PPC64)/* mulhd mulhd. */GEN_INT_ARITHN (mulhd, 0x1F, 0x09, 0x02, PPC_64B);/* mulhdu mulhdu. */GEN_INT_ARITHN (mulhdu, 0x1F, 0x09, 0x00, PPC_64B);/* mulld mulld. mulldo mulldo. */GEN_INT_ARITH2 (mulld, 0x1F, 0x09, 0x07, PPC_64B);/* divd divd. divdo divdo. */GEN_INT_ARITH2 (divd, 0x1F, 0x09, 0x0F, PPC_64B);/* divdu divdu. divduo divduo. */GEN_INT_ARITH2 (divdu, 0x1F, 0x09, 0x0E, PPC_64B);#endif/*** Integer comparison ***/#if defined(TARGET_PPC64)#define GEN_CMP(name, opc, type) \GEN_HANDLER(name, 0x1F, 0x00, opc, 0x00400000, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ gen_op_load_gpr_T1(rB(ctx->opcode)); \ if (ctx->sf_mode && (ctx->opcode & 0x00200000)) \ gen_op_##name##_64(); \ else \ gen_op_##name(); \ gen_op_store_T0_crf(crfD(ctx->opcode)); \}#else#define GEN_CMP(name, opc, type) \GEN_HANDLER(name, 0x1F, 0x00, opc, 0x00400000, type) \{ \ gen_op_load_gpr_T0(rA(ctx->opcode)); \ gen_op_load_gpr_T1(rB(ctx->opcode)); \ gen_op_##name(); \ gen_op_store_T0_crf(crfD(ctx->opcode)); \}#endif/* cmp */GEN_CMP(cmp, 0x00, PPC_INTEGER);/* cmpi */GEN_HANDLER(cmpi, 0x0B, 0xFF, 0xFF, 0x00400000, PPC_INTEGER){ gen_op_load_gpr_T0(rA(ctx->opcode));#if defined(TARGET_PPC64) if (ctx->sf_mode && (ctx->opcode & 0x00200000)) gen_op_cmpi_64(SIMM(ctx->opcode)); else#endif gen_op_cmpi(SIMM(ctx->opcode)); gen_op_store_T0_crf(crfD(ctx->opcode));}/* cmpl */GEN_CMP(cmpl, 0x01, PPC_INTEGER);/* cmpli */GEN_HANDLER(cmpli, 0x0A, 0xFF, 0xFF, 0x00400000, PPC_INTEGER){ gen_op_load_gpr_T0(rA(ctx->opcode));#if defined(TARGET_PPC64) if (ctx->sf_mode && (ctx->opcode & 0x00200000)) gen_op_cmpli_64(UIMM(ctx->opcode)); else#endif gen_op_cmpli(UIMM(ctx->opcode)); gen_op_store_T0_crf(crfD(ctx->opcode));}/* isel (PowerPC 2.03 specification) */GEN_HANDLER(isel, 0x1F, 0x0F, 0x00, 0x00000001, PPC_ISEL){ uint32_t bi = rC(ctx->opcode); uint32_t mask; if (rA(ctx->opcode) == 0) { gen_set_T0(0); } else { gen_op_load_gpr_T1(rA(ctx->opcode)); } gen_op_load_gpr_T2(rB(ctx->opcode)); mask = 1 << (3 - (bi & 0x03)); gen_op_load_crf_T0(bi >> 2); gen_op_test_true(mask); gen_op_isel(); gen_op_store_T0_gpr(rD(ctx->opcode));}/*** Integer logical ***/#define __GEN_LOGICAL2(name, opc2, opc3, type) \GEN_HANDLER(name, 0x1F, opc2, opc3, 0x00000000, type) \{ \ gen_op_load_gpr_T0(rS(ctx->opcode)); \ gen_op_load_gpr_T1(rB(ctx->opcode)); \ gen_op_##name(); \ gen_op_store_T0_gpr(rA(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}#define GEN_LOGICAL2(name, opc, type) \__GEN_LOGICAL2(name, 0x1C, opc, type)#define GEN_LOGICAL1(name, opc, type) \GEN_HANDLER(name, 0x1F, 0x1A, opc, 0x00000000, type) \{ \ gen_op_load_gpr_T0(rS(ctx->opcode)); \ gen_op_##name(); \ gen_op_store_T0_gpr(rA(ctx->opcode)); \ if (unlikely(Rc(ctx->opcode) != 0)) \ gen_set_Rc0(ctx); \}/* and & and. */GEN_LOGICAL2(and, 0x00, PPC_INTEGER);/* andc & andc. */GEN_LOGICAL2(andc, 0x01, PPC_INTEGER);/* andi. */GEN_HANDLER2(andi_, "andi.", 0x1C, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rS(ctx->opcode)); gen_op_andi_T0(UIMM(ctx->opcode)); gen_op_store_T0_gpr(rA(ctx->opcode)); gen_set_Rc0(ctx);}/* andis. */GEN_HANDLER2(andis_, "andis.", 0x1D, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rS(ctx->opcode)); gen_op_andi_T0(UIMM(ctx->opcode) << 16); gen_op_store_T0_gpr(rA(ctx->opcode)); gen_set_Rc0(ctx);}/* cntlzw */GEN_LOGICAL1(cntlzw, 0x00, PPC_INTEGER);/* eqv & eqv. */GEN_LOGICAL2(eqv, 0x08, PPC_INTEGER);/* extsb & extsb. */GEN_LOGICAL1(extsb, 0x1D, PPC_INTEGER);/* extsh & extsh. */GEN_LOGICAL1(extsh, 0x1C, PPC_INTEGER);/* nand & nand. */GEN_LOGICAL2(nand, 0x0E, PPC_INTEGER);/* nor & nor. */GEN_LOGICAL2(nor, 0x03, PPC_INTEGER);/* or & or. */GEN_HANDLER(or, 0x1F, 0x1C, 0x0D, 0x00000000, PPC_INTEGER){ int rs, ra, rb; rs = rS(ctx->opcode); ra = rA(ctx->opcode); rb = rB(ctx->opcode); /* Optimisation for mr. ri case */ if (rs != ra || rs != rb) { gen_op_load_gpr_T0(rs); if (rs != rb) { gen_op_load_gpr_T1(rb); gen_op_or(); } gen_op_store_T0_gpr(ra); if (unlikely(Rc(ctx->opcode) != 0)) gen_set_Rc0(ctx); } else if (unlikely(Rc(ctx->opcode) != 0)) { gen_op_load_gpr_T0(rs); gen_set_Rc0(ctx); #if defined(TARGET_PPC64) } else { switch (rs) { case 1: /* Set process priority to low */ gen_op_store_pri(2); break; case 6: /* Set process priority to medium-low */ gen_op_store_pri(3); break; case 2: /* Set process priority to normal */ gen_op_store_pri(4); break;#if !defined(CONFIG_USER_ONLY) case 31: if (ctx->supervisor > 0) { /* Set process priority to very low */ gen_op_store_pri(1); } break; case 5: if (ctx->supervisor > 0) { /* Set process priority to medium-hight */ gen_op_store_pri(5); } break; case 3: if (ctx->supervisor > 0) { /* Set process priority to high */ gen_op_store_pri(6); } break; case 7: if (ctx->supervisor > 1) { /* Set process priority to very high */ gen_op_store_pri(7); } break;#endif default: /* nop */ break; }#endif }}/* orc & orc. */GEN_LOGICAL2(orc, 0x0C, PPC_INTEGER);/* xor & xor. */GEN_HANDLER(xor, 0x1F, 0x1C, 0x09, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rS(ctx->opcode)); /* Optimisation for "set to zero" case */ if (rS(ctx->opcode) != rB(ctx->opcode)) { gen_op_load_gpr_T1(rB(ctx->opcode)); gen_op_xor(); } else { gen_op_reset_T0(); } gen_op_store_T0_gpr(rA(ctx->opcode)); if (unlikely(Rc(ctx->opcode) != 0)) gen_set_Rc0(ctx);}/* ori */GEN_HANDLER(ori, 0x18, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_ulong uimm = UIMM(ctx->opcode); if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ /* XXX: should handle special NOPs for POWER series */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (likely(uimm != 0)) gen_op_ori(uimm); gen_op_store_T0_gpr(rA(ctx->opcode)); }/* oris */GEN_HANDLER(oris, 0x19, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_ulong uimm = UIMM(ctx->opcode); if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (likely(uimm != 0)) gen_op_ori(uimm << 16); gen_op_store_T0_gpr(rA(ctx->opcode));}/* xori */GEN_HANDLER(xori, 0x1A, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_ulong uimm = UIMM(ctx->opcode); if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (likely(uimm != 0)) gen_op_xori(uimm); gen_op_store_T0_gpr(rA(ctx->opcode));}/* xoris */GEN_HANDLER(xoris, 0x1B, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_ulong uimm = UIMM(ctx->opcode); if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (likely(uimm != 0)) gen_op_xori(uimm << 16); gen_op_store_T0_gpr(rA(ctx->opcode));}/* popcntb : PowerPC 2.03 specification */GEN_HANDLER(popcntb, 0x1F, 0x03, 0x03, 0x0000F801, PPC_POPCNTB){ gen_op_load_gpr_T0(rS(ctx->opcode));#if defined(TARGET_PPC64) if (ctx->sf_mode) gen_op_popcntb_64(); else#endif gen_op_popcntb(); gen_op_store_T0_gpr(rA(ctx->opcode));}#if defined(TARGET_PPC64)/* extsw & extsw. */GEN_LOGICAL1(extsw, 0x1E, PPC_64B);/* cntlzd */GEN_LOGICAL1(cntlzd, 0x01, PPC_64B);#endif/*** Integer rotate ***//* rlwimi & rlwimi. */GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ target_ulong mask; uint32_t mb, me, sh; mb = MB(ctx->opcode); me = ME(ctx->opcode); sh = SH(ctx->opcode); if (likely(sh == 0)) { if (likely(mb == 0 && me == 31)) { gen_op_load_gpr_T0(rS(ctx->opcode)); goto do_store; } else if (likely(mb == 31 && me == 0)) { gen_op_load_gpr_T0(rA(ctx->opcode)); goto do_store;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -