⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 translate.c

📁 qemu虚拟机代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -