📄 translate.c
字号:
if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (uimm != 0) gen_op_xori(uimm); gen_op_store_T0_gpr(rA(ctx->opcode));}/* xoris */GEN_HANDLER(xoris, 0x1B, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ uint32_t uimm = UIMM(ctx->opcode); if (rS(ctx->opcode) == rA(ctx->opcode) && uimm == 0) { /* NOP */ return; } gen_op_load_gpr_T0(rS(ctx->opcode)); if (uimm != 0) gen_op_xori(uimm << 16); gen_op_store_T0_gpr(rA(ctx->opcode));}/*** Integer rotate ***//* rlwimi & rlwimi. */GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ uint32_t mb, me; mb = MB(ctx->opcode); me = ME(ctx->opcode); gen_op_load_gpr_T0(rS(ctx->opcode)); gen_op_load_gpr_T1(rA(ctx->opcode)); gen_op_rlwimi(SH(ctx->opcode), MASK(mb, me), ~MASK(mb, me)); if (Rc(ctx->opcode) != 0) gen_op_set_Rc0(); gen_op_store_T0_gpr(rA(ctx->opcode));}/* rlwinm & rlwinm. */GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ uint32_t mb, me, sh; sh = SH(ctx->opcode); mb = MB(ctx->opcode); me = ME(ctx->opcode); gen_op_load_gpr_T0(rS(ctx->opcode));#if 1 // TRY if (sh == 0) { gen_op_andi_(MASK(mb, me)); goto store; }#endif if (mb == 0) { if (me == 31) { gen_op_rotlwi(sh); goto store;#if 0 } else if (me == (31 - sh)) { gen_op_slwi(sh); goto store;#endif } } else if (me == 31) {#if 0 if (sh == (32 - mb)) { gen_op_srwi(mb); goto store; }#endif } gen_op_rlwinm(sh, MASK(mb, me));store: if (Rc(ctx->opcode) != 0) gen_op_set_Rc0(); gen_op_store_T0_gpr(rA(ctx->opcode));}/* rlwnm & rlwnm. */GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER){ uint32_t mb, me; mb = MB(ctx->opcode); me = ME(ctx->opcode); gen_op_load_gpr_T0(rS(ctx->opcode)); gen_op_load_gpr_T1(rB(ctx->opcode)); if (mb == 0 && me == 31) { gen_op_rotl(); } else { gen_op_rlwnm(MASK(mb, me)); } if (Rc(ctx->opcode) != 0) gen_op_set_Rc0(); gen_op_store_T0_gpr(rA(ctx->opcode));}/*** Integer shift ***//* slw & slw. */__GEN_LOGICAL2(slw, 0x18, 0x00);/* sraw & sraw. */__GEN_LOGICAL2(sraw, 0x18, 0x18);/* srawi & srawi. */GEN_HANDLER(srawi, 0x1F, 0x18, 0x19, 0x00000000, PPC_INTEGER){ gen_op_load_gpr_T0(rS(ctx->opcode)); if (SH(ctx->opcode) != 0) gen_op_srawi(SH(ctx->opcode), MASK(32 - SH(ctx->opcode), 31)); if (Rc(ctx->opcode) != 0) gen_op_set_Rc0(); gen_op_store_T0_gpr(rA(ctx->opcode));}/* srw & srw. */__GEN_LOGICAL2(srw, 0x18, 0x10);/*** Floating-Point arithmetic ***/#define _GEN_FLOAT_ACB(name, op, op1, op2, isfloat) \GEN_HANDLER(f##name, op1, op2, 0xFF, 0x00000000, PPC_FLOAT) \{ \ if (!ctx->fpu_enabled) { \ RET_EXCP(ctx, EXCP_NO_FP, 0); \ return; \ } \ gen_op_reset_scrfx(); \ gen_op_load_fpr_FT0(rA(ctx->opcode)); \ gen_op_load_fpr_FT1(rC(ctx->opcode)); \ gen_op_load_fpr_FT2(rB(ctx->opcode)); \ gen_op_f##op(); \ if (isfloat) { \ gen_op_frsp(); \ } \ gen_op_store_FT0_fpr(rD(ctx->opcode)); \ if (Rc(ctx->opcode)) \ gen_op_set_Rc1(); \}#define GEN_FLOAT_ACB(name, op2) \_GEN_FLOAT_ACB(name, name, 0x3F, op2, 0); \_GEN_FLOAT_ACB(name##s, name, 0x3B, op2, 1);#define _GEN_FLOAT_AB(name, op, op1, op2, inval, isfloat) \GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \{ \ if (!ctx->fpu_enabled) { \ RET_EXCP(ctx, EXCP_NO_FP, 0); \ return; \ } \ gen_op_reset_scrfx(); \ gen_op_load_fpr_FT0(rA(ctx->opcode)); \ gen_op_load_fpr_FT1(rB(ctx->opcode)); \ gen_op_f##op(); \ if (isfloat) { \ gen_op_frsp(); \ } \ gen_op_store_FT0_fpr(rD(ctx->opcode)); \ if (Rc(ctx->opcode)) \ gen_op_set_Rc1(); \}#define GEN_FLOAT_AB(name, op2, inval) \_GEN_FLOAT_AB(name, name, 0x3F, op2, inval, 0); \_GEN_FLOAT_AB(name##s, name, 0x3B, op2, inval, 1);#define _GEN_FLOAT_AC(name, op, op1, op2, inval, isfloat) \GEN_HANDLER(f##name, op1, op2, 0xFF, inval, PPC_FLOAT) \{ \ if (!ctx->fpu_enabled) { \ RET_EXCP(ctx, EXCP_NO_FP, 0); \ return; \ } \ gen_op_reset_scrfx(); \ gen_op_load_fpr_FT0(rA(ctx->opcode)); \ gen_op_load_fpr_FT1(rC(ctx->opcode)); \ gen_op_f##op(); \ if (isfloat) { \ gen_op_frsp(); \ } \ gen_op_store_FT0_fpr(rD(ctx->opcode)); \ if (Rc(ctx->opcode)) \ gen_op_set_Rc1(); \}#define GEN_FLOAT_AC(name, op2, inval) \_GEN_FLOAT_AC(name, name, 0x3F, op2, inval, 0); \_GEN_FLOAT_AC(name##s, name, 0x3B, op2, inval, 1);#define GEN_FLOAT_B(name, op2, op3) \GEN_HANDLER(f##name, 0x3F, op2, op3, 0x001F0000, PPC_FLOAT) \{ \ if (!ctx->fpu_enabled) { \ RET_EXCP(ctx, EXCP_NO_FP, 0); \ return; \ } \ gen_op_reset_scrfx(); \ gen_op_load_fpr_FT0(rB(ctx->opcode)); \ gen_op_f##name(); \ gen_op_store_FT0_fpr(rD(ctx->opcode)); \ if (Rc(ctx->opcode)) \ gen_op_set_Rc1(); \}#define GEN_FLOAT_BS(name, op1, op2) \GEN_HANDLER(f##name, op1, op2, 0xFF, 0x001F07C0, PPC_FLOAT) \{ \ if (!ctx->fpu_enabled) { \ RET_EXCP(ctx, EXCP_NO_FP, 0); \ return; \ } \ gen_op_reset_scrfx(); \ gen_op_load_fpr_FT0(rB(ctx->opcode)); \ gen_op_f##name(); \ gen_op_store_FT0_fpr(rD(ctx->opcode)); \ if (Rc(ctx->opcode)) \ gen_op_set_Rc1(); \}/* fadd - fadds */GEN_FLOAT_AB(add, 0x15, 0x000007C0);/* fdiv - fdivs */GEN_FLOAT_AB(div, 0x12, 0x000007C0);/* fmul - fmuls */GEN_FLOAT_AC(mul, 0x19, 0x0000F800);/* fres */GEN_FLOAT_BS(res, 0x3B, 0x18);/* frsqrte */GEN_FLOAT_BS(rsqrte, 0x3F, 0x1A);/* fsel */_GEN_FLOAT_ACB(sel, sel, 0x3F, 0x17, 0);/* fsub - fsubs */GEN_FLOAT_AB(sub, 0x14, 0x000007C0);/* Optional: *//* fsqrt */GEN_HANDLER(fsqrt, 0x3F, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT){ if (!ctx->fpu_enabled) { RET_EXCP(ctx, EXCP_NO_FP, 0); return; } gen_op_reset_scrfx(); gen_op_load_fpr_FT0(rB(ctx->opcode)); gen_op_fsqrt(); gen_op_store_FT0_fpr(rD(ctx->opcode)); if (Rc(ctx->opcode)) gen_op_set_Rc1();}GEN_HANDLER(fsqrts, 0x3B, 0x16, 0xFF, 0x001F07C0, PPC_FLOAT_OPT){ if (!ctx->fpu_enabled) { RET_EXCP(ctx, EXCP_NO_FP, 0); return; } gen_op_reset_scrfx(); gen_op_load_fpr_FT0(rB(ctx->opcode)); gen_op_fsqrt(); gen_op_frsp(); gen_op_store_FT0_fpr(rD(ctx->opcode)); if (Rc(ctx->opcode)) gen_op_set_Rc1();}/*** Floating-Point multiply-and-add ***//* fmadd - fmadds */GEN_FLOAT_ACB(madd, 0x1D);/* fmsub - fmsubs */GEN_FLOAT_ACB(msub, 0x1C);/* fnmadd - fnmadds */GEN_FLOAT_ACB(nmadd, 0x1F);/* fnmsub - fnmsubs */GEN_FLOAT_ACB(nmsub, 0x1E);/*** Floating-Point round & convert ***//* fctiw */GEN_FLOAT_B(ctiw, 0x0E, 0x00);/* fctiwz */GEN_FLOAT_B(ctiwz, 0x0F, 0x00);/* frsp */GEN_FLOAT_B(rsp, 0x0C, 0x00);/*** Floating-Point compare ***//* fcmpo */GEN_HANDLER(fcmpo, 0x3F, 0x00, 0x00, 0x00600001, PPC_FLOAT){ if (!ctx->fpu_enabled) { RET_EXCP(ctx, EXCP_NO_FP, 0); return; } gen_op_reset_scrfx(); gen_op_load_fpr_FT0(rA(ctx->opcode)); gen_op_load_fpr_FT1(rB(ctx->opcode)); gen_op_fcmpo(); gen_op_store_T0_crf(crfD(ctx->opcode));}/* fcmpu */GEN_HANDLER(fcmpu, 0x3F, 0x00, 0x01, 0x00600001, PPC_FLOAT){ if (!ctx->fpu_enabled) { RET_EXCP(ctx, EXCP_NO_FP, 0); return; } gen_op_reset_scrfx(); gen_op_load_fpr_FT0(rA(ctx->opcode)); gen_op_load_fpr_FT1(rB(ctx->opcode)); gen_op_fcmpu(); gen_op_store_T0_crf(crfD(ctx->opcode));}/*** Floating-point move ***//* fabs */GEN_FLOAT_B(abs, 0x08, 0x08);/* fmr - fmr. */GEN_HANDLER(fmr, 0x3F, 0x08, 0x02, 0x001F0000, PPC_FLOAT){ if (!ctx->fpu_enabled) { RET_EXCP(ctx, EXCP_NO_FP, 0); return; } gen_op_reset_scrfx(); gen_op_load_fpr_FT0(rB(ctx->opcode)); gen_op_store_FT0_fpr(rD(ctx->opcode)); if (Rc(ctx->opcode)) gen_op_set_Rc1();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -