📄 op.c
字号:
do_addzeo(); RETURN();}/* divide word */PPC_OP(divw){ if ((Ts0 == INT32_MIN && Ts1 == -1) || Ts1 == 0) { T0 = (int32_t)((-1) * (T0 >> 31)); } else { T0 = (Ts0 / Ts1); } RETURN();}void do_divwo (void);void op_divwo (void){ do_divwo(); RETURN();}/* divide word unsigned */PPC_OP(divwu){ if (T1 == 0) { T0 = 0; } else { T0 /= T1; } RETURN();}void do_divwuo (void);void op_divwuo (void){ do_divwuo(); RETURN();}/* multiply high word */PPC_OP(mulhw){ T0 = ((int64_t)Ts0 * (int64_t)Ts1) >> 32; RETURN();}/* multiply high word unsigned */PPC_OP(mulhwu){ T0 = ((uint64_t)T0 * (uint64_t)T1) >> 32; RETURN();}/* multiply low immediate */PPC_OP(mulli){ T0 = (Ts0 * SPARAM(1)); RETURN();}/* multiply low word */PPC_OP(mullw){ T0 *= T1; RETURN();}void do_mullwo (void);void op_mullwo (void){ do_mullwo(); RETURN();}/* negate */PPC_OP(neg){ if (T0 != 0x80000000) { T0 = -Ts0; } RETURN();}void do_nego (void);void op_nego (void){ do_nego(); RETURN();}/* substract from */PPC_OP(subf){ T0 = T1 - T0; RETURN();}void do_subfo (void);void op_subfo (void){ do_subfo(); RETURN();}/* substract from carrying */PPC_OP(subfc){ T0 = T1 - T0; if (T0 <= T1) { xer_ca = 1; } else { xer_ca = 0; } RETURN();}void do_subfco (void);void op_subfco (void){ do_subfco(); RETURN();}/* substract from extended */void do_subfe (void);void op_subfe (void){ do_subfe(); RETURN();}void do_subfeo (void);PPC_OP(subfeo){ do_subfeo(); RETURN();}/* substract from immediate carrying */PPC_OP(subfic){ T0 = PARAM(1) + ~T0 + 1; if (T0 <= PARAM(1)) { xer_ca = 1; } else { xer_ca = 0; } RETURN();}/* substract from minus one extended */PPC_OP(subfme){ T0 = ~T0 + xer_ca - 1; if (T0 != -1) xer_ca = 1; RETURN();}void do_subfmeo (void);void op_subfmeo (void){ do_subfmeo(); RETURN();}/* substract from zero extended */PPC_OP(subfze){ T1 = ~T0; T0 = T1 + xer_ca; if (T0 < T1) { xer_ca = 1; } else { xer_ca = 0; } RETURN();}void do_subfzeo (void);void op_subfzeo (void){ do_subfzeo(); RETURN();}/*** Integer comparison ***//* compare */PPC_OP(cmp){ if (Ts0 < Ts1) { T0 = 0x08; } else if (Ts0 > Ts1) { T0 = 0x04; } else { T0 = 0x02; } RETURN();}/* compare immediate */PPC_OP(cmpi){ if (Ts0 < SPARAM(1)) { T0 = 0x08; } else if (Ts0 > SPARAM(1)) { T0 = 0x04; } else { T0 = 0x02; } RETURN();}/* compare logical */PPC_OP(cmpl){ if (T0 < T1) { T0 = 0x08; } else if (T0 > T1) { T0 = 0x04; } else { T0 = 0x02; } RETURN();}/* compare logical immediate */PPC_OP(cmpli){ if (T0 < PARAM(1)) { T0 = 0x08; } else if (T0 > PARAM(1)) { T0 = 0x04; } else { T0 = 0x02; } RETURN();}/*** Integer logical ***//* and */PPC_OP(and){ T0 &= T1; RETURN();}/* andc */PPC_OP(andc){ T0 &= ~T1; RETURN();}/* andi. */PPC_OP(andi_){ T0 &= PARAM(1); RETURN();}/* count leading zero */PPC_OP(cntlzw){ T1 = T0; for (T0 = 32; T1 > 0; T0--) T1 = T1 >> 1; RETURN();}/* eqv */PPC_OP(eqv){ T0 = ~(T0 ^ T1); RETURN();}/* extend sign byte */PPC_OP(extsb){ T0 = (int32_t)((int8_t)(Ts0)); RETURN();}/* extend sign half word */PPC_OP(extsh){ T0 = (int32_t)((int16_t)(Ts0)); RETURN();}/* nand */PPC_OP(nand){ T0 = ~(T0 & T1); RETURN();}/* nor */PPC_OP(nor){ T0 = ~(T0 | T1); RETURN();}/* or */PPC_OP(or){ T0 |= T1; RETURN();}/* orc */PPC_OP(orc){ T0 |= ~T1; RETURN();}/* ori */PPC_OP(ori){ T0 |= PARAM(1); RETURN();}/* xor */PPC_OP(xor){ T0 ^= T1; RETURN();}/* xori */PPC_OP(xori){ T0 ^= PARAM(1); RETURN();}/*** Integer rotate ***//* rotate left word immediate then mask insert */PPC_OP(rlwimi){ T0 = (rotl(T0, PARAM(1)) & PARAM(2)) | (T1 & PARAM(3)); RETURN();}/* rotate left immediate then and with mask insert */PPC_OP(rotlwi){ T0 = rotl(T0, PARAM(1)); RETURN();}PPC_OP(slwi){ T0 = T0 << PARAM(1); RETURN();}PPC_OP(srwi){ T0 = T0 >> PARAM(1); RETURN();}/* rotate left word then and with mask insert */PPC_OP(rlwinm){ T0 = rotl(T0, PARAM(1)) & PARAM(2); RETURN();}PPC_OP(rotl){ T0 = rotl(T0, T1); RETURN();}PPC_OP(rlwnm){ T0 = rotl(T0, T1) & PARAM(1); RETURN();}/*** Integer shift ***//* shift left word */PPC_OP(slw){ if (T1 & 0x20) { T0 = 0; } else { T0 = T0 << T1; } RETURN();}/* shift right algebraic word */void op_sraw (void){ do_sraw(); RETURN();}/* shift right algebraic word immediate */PPC_OP(srawi){ T1 = T0; T0 = (Ts0 >> PARAM(1)); if (Ts1 < 0 && (Ts1 & PARAM(2)) != 0) { xer_ca = 1; } else { xer_ca = 0; } RETURN();}/* shift right word */PPC_OP(srw){ if (T1 & 0x20) { T0 = 0; } else { T0 = T0 >> T1; } RETURN();}/*** Floating-Point arithmetic ***//* fadd - fadd. */PPC_OP(fadd){ FT0 += FT1; RETURN();}/* fsub - fsub. */PPC_OP(fsub){ FT0 -= FT1; RETURN();}/* fmul - fmul. */PPC_OP(fmul){ FT0 *= FT1; RETURN();}/* fdiv - fdiv. */PPC_OP(fdiv){ FT0 = float64_div(FT0, FT1, &env->fp_status); RETURN();}/* fsqrt - fsqrt. */PPC_OP(fsqrt){ do_fsqrt(); RETURN();}/* fres - fres. */PPC_OP(fres){ do_fres(); RETURN();}/* frsqrte - frsqrte. */PPC_OP(frsqrte){ do_frsqrte(); RETURN();}/* fsel - fsel. */PPC_OP(fsel){ do_fsel(); RETURN();}/*** Floating-Point multiply-and-add ***//* fmadd - fmadd. */PPC_OP(fmadd){ FT0 = (FT0 * FT1) + FT2; RETURN();}/* fmsub - fmsub. */PPC_OP(fmsub){ FT0 = (FT0 * FT1) - FT2; RETURN();}/* fnmadd - fnmadd. - fnmadds - fnmadds. */PPC_OP(fnmadd){ do_fnmadd(); RETURN();}/* fnmsub - fnmsub. */PPC_OP(fnmsub){ do_fnmsub(); RETURN();}/*** Floating-Point round & convert ***//* frsp - frsp. */PPC_OP(frsp){ FT0 = (float)FT0; RETURN();}/* fctiw - fctiw. */PPC_OP(fctiw){ do_fctiw(); RETURN();}/* fctiwz - fctiwz. */PPC_OP(fctiwz){ do_fctiwz(); RETURN();}/*** Floating-Point compare ***//* fcmpu */PPC_OP(fcmpu){ do_fcmpu(); RETURN();}/* fcmpo */PPC_OP(fcmpo){ do_fcmpo(); RETURN();}/*** Floating-point move ***//* fabs */PPC_OP(fabs){ FT0 = float64_abs(FT0); RETURN();}/* fnabs */PPC_OP(fnabs){ FT0 = float64_abs(FT0); FT0 = float64_chs(FT0); RETURN();}/* fneg */PPC_OP(fneg){ FT0 = float64_chs(FT0); RETURN();}/* Load and store */#define MEMSUFFIX _raw#include "op_mem.h"#if !defined(CONFIG_USER_ONLY)#define MEMSUFFIX _user#include "op_mem.h"#define MEMSUFFIX _kernel#include "op_mem.h"#endif/* Special op to check and maybe clear reservation */PPC_OP(check_reservation){ if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003)) env->reserve = -1; RETURN();}/* Return from interrupt */void do_rfi (void);void op_rfi (void){ do_rfi(); RETURN();}/* Trap word */void do_tw (uint32_t cmp, int flags);void op_tw (void){ do_tw(T1, PARAM(1)); RETURN();}void op_twi (void){ do_tw(PARAM(1), PARAM(2)); RETURN();}/* Instruction cache block invalidate */PPC_OP(icbi){ do_icbi(); RETURN();}/* tlbia */PPC_OP(tlbia){ do_tlbia(); RETURN();}/* tlbie */PPC_OP(tlbie){ do_tlbie(); RETURN();}void op_store_pir (void){ env->spr[SPR_PIR] = T0 & 0x0000000FUL; RETURN();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -