?? op.c
字號:
void OPPROTO op_srli_T0 (void){ T0 = (uint32_t)T0 >> PARAM1; RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_srli_T0_64 (void){ T0 = (uint64_t)T0 >> PARAM1; RETURN();}#endifvoid OPPROTO op_srli_T1 (void){ T1 = (uint32_t)T1 >> PARAM1; RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_srli_T1_64 (void){ T1 = (uint64_t)T1 >> PARAM1; RETURN();}#endif/*** Floating-Point arithmetic ***//* fadd - fadd. */void OPPROTO op_fadd (void){#if USE_PRECISE_EMULATION do_fadd();#else FT0 = float64_add(FT0, FT1, &env->fp_status);#endif RETURN();}/* fsub - fsub. */void OPPROTO op_fsub (void){#if USE_PRECISE_EMULATION do_fsub();#else FT0 = float64_sub(FT0, FT1, &env->fp_status);#endif RETURN();}/* fmul - fmul. */void OPPROTO op_fmul (void){#if USE_PRECISE_EMULATION do_fmul();#else FT0 = float64_mul(FT0, FT1, &env->fp_status);#endif RETURN();}/* fdiv - fdiv. */void OPPROTO op_fdiv (void){#if USE_PRECISE_EMULATION do_fdiv();#else FT0 = float64_div(FT0, FT1, &env->fp_status);#endif RETURN();}/* fsqrt - fsqrt. */void OPPROTO op_fsqrt (void){ do_fsqrt(); RETURN();}/* fre - fre. */void OPPROTO op_fre (void){ do_fre(); RETURN();}/* fres - fres. */void OPPROTO op_fres (void){ do_fres(); RETURN();}/* frsqrte - frsqrte. */void OPPROTO op_frsqrte (void){ do_frsqrte(); RETURN();}/* fsel - fsel. */void OPPROTO op_fsel (void){ do_fsel(); RETURN();}/*** Floating-Point multiply-and-add ***//* fmadd - fmadd. */void OPPROTO op_fmadd (void){#if USE_PRECISE_EMULATION do_fmadd();#else FT0 = float64_mul(FT0, FT1, &env->fp_status); FT0 = float64_add(FT0, FT2, &env->fp_status);#endif RETURN();}/* fmsub - fmsub. */void OPPROTO op_fmsub (void){#if USE_PRECISE_EMULATION do_fmsub();#else FT0 = float64_mul(FT0, FT1, &env->fp_status); FT0 = float64_sub(FT0, FT2, &env->fp_status);#endif RETURN();}/* fnmadd - fnmadd. - fnmadds - fnmadds. */void OPPROTO op_fnmadd (void){ do_fnmadd(); RETURN();}/* fnmsub - fnmsub. */void OPPROTO op_fnmsub (void){ do_fnmsub(); RETURN();}/*** Floating-Point round & convert ***//* frsp - frsp. */void OPPROTO op_frsp (void){#if USE_PRECISE_EMULATION do_frsp();#else FT0 = float64_to_float32(FT0, &env->fp_status);#endif RETURN();}/* fctiw - fctiw. */void OPPROTO op_fctiw (void){ do_fctiw(); RETURN();}/* fctiwz - fctiwz. */void OPPROTO op_fctiwz (void){ do_fctiwz(); RETURN();}#if defined(TARGET_PPC64)/* fcfid - fcfid. */void OPPROTO op_fcfid (void){ do_fcfid(); RETURN();}/* fctid - fctid. */void OPPROTO op_fctid (void){ do_fctid(); RETURN();}/* fctidz - fctidz. */void OPPROTO op_fctidz (void){ do_fctidz(); RETURN();}#endifvoid OPPROTO op_frin (void){ do_frin(); RETURN();}void OPPROTO op_friz (void){ do_friz(); RETURN();}void OPPROTO op_frip (void){ do_frip(); RETURN();}void OPPROTO op_frim (void){ do_frim(); RETURN();}/*** Floating-Point compare ***//* fcmpu */void OPPROTO op_fcmpu (void){ do_fcmpu(); RETURN();}/* fcmpo */void OPPROTO op_fcmpo (void){ do_fcmpo(); RETURN();}/*** Floating-point move ***//* fabs */void OPPROTO op_fabs (void){ FT0 = float64_abs(FT0); RETURN();}/* fnabs */void OPPROTO op_fnabs (void){ FT0 = float64_abs(FT0); FT0 = float64_chs(FT0); RETURN();}/* fneg */void OPPROTO op_fneg (void){ FT0 = float64_chs(FT0); RETURN();}/* Load and store */#define MEMSUFFIX _raw#include "op_helper.h"#include "op_mem.h"#if !defined(CONFIG_USER_ONLY)#define MEMSUFFIX _user#include "op_helper.h"#include "op_mem.h"#define MEMSUFFIX _kernel#include "op_helper.h"#include "op_mem.h"#define MEMSUFFIX _hypv#include "op_helper.h"#include "op_mem.h"#endif/* Special op to check and maybe clear reservation */void OPPROTO op_check_reservation (void){ if ((uint32_t)env->reserve == (uint32_t)(T0 & ~0x00000003)) env->reserve = (target_ulong)-1ULL; RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_check_reservation_64 (void){ if ((uint64_t)env->reserve == (uint64_t)(T0 & ~0x00000003)) env->reserve = (target_ulong)-1ULL; RETURN();}#endifvoid OPPROTO op_wait (void){ env->halted = 1; RETURN();}/* Return from interrupt */#if !defined(CONFIG_USER_ONLY)void OPPROTO op_rfi (void){ do_rfi(); RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_rfid (void){ do_rfid(); RETURN();}void OPPROTO op_hrfid (void){ do_hrfid(); RETURN();}#endif/* Exception vectors */void OPPROTO op_store_excp_prefix (void){ T0 &= env->ivpr_mask; env->excp_prefix = T0; RETURN();}void OPPROTO op_store_excp_vector (void){ T0 &= env->ivor_mask; env->excp_vectors[PARAM1] = T0; RETURN();}#endif/* Trap word */void OPPROTO op_tw (void){ do_tw(PARAM1); RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_td (void){ do_td(PARAM1); RETURN();}#endif#if !defined(CONFIG_USER_ONLY)/* tlbia */void OPPROTO op_tlbia (void){ ppc_tlb_invalidate_all(env); RETURN();}/* tlbie */void OPPROTO op_tlbie (void){ ppc_tlb_invalidate_one(env, (uint32_t)T0); RETURN();}#if defined(TARGET_PPC64)void OPPROTO op_tlbie_64 (void){ ppc_tlb_invalidate_one(env, T0); RETURN();}#endif#if defined(TARGET_PPC64)void OPPROTO op_slbia (void){ ppc_slb_invalidate_all(env); RETURN();}void OPPROTO op_slbie (void){ ppc_slb_invalidate_one(env, (uint32_t)T0); RETURN();}void OPPROTO op_slbie_64 (void){ ppc_slb_invalidate_one(env, T0); RETURN();}#endif#endif#if !defined(CONFIG_USER_ONLY)/* PowerPC 602/603/755 software TLB load instructions */void OPPROTO op_6xx_tlbld (void){ do_load_6xx_tlb(0); RETURN();}void OPPROTO op_6xx_tlbli (void){ do_load_6xx_tlb(1); RETURN();}/* PowerPC 74xx software TLB load instructions */void OPPROTO op_74xx_tlbld (void){ do_load_74xx_tlb(0); RETURN();}void OPPROTO op_74xx_tlbli (void){ do_load_74xx_tlb(1); RETURN();}#endif/* 601 specific */void OPPROTO op_load_601_rtcl (void){ T0 = cpu_ppc601_load_rtcl(env); RETURN();}void OPPROTO op_load_601_rtcu (void){ T0 = cpu_ppc601_load_rtcu(env); RETURN();}#if !defined(CONFIG_USER_ONLY)void OPPROTO op_store_601_rtcl (void){ cpu_ppc601_store_rtcl(env, T0); RETURN();}void OPPROTO op_store_601_rtcu (void){ cpu_ppc601_store_rtcu(env, T0); RETURN();}void OPPROTO op_store_hid0_601 (void){ do_store_hid0_601(); RETURN();}void OPPROTO op_load_601_bat (void){ T0 = env->IBAT[PARAM1][PARAM2]; RETURN();}void OPPROTO op_store_601_batl (void){ do_store_ibatl_601(env, PARAM1, T0); RETURN();}void OPPROTO op_store_601_batu (void){ do_store_ibatu_601(env, PARAM1, T0); RETURN();}#endif /* !defined(CONFIG_USER_ONLY) *//* PowerPC 601 specific instructions (POWER bridge) *//* XXX: those micro-ops need tests ! */void OPPROTO op_POWER_abs (void){ if ((int32_t)T0 == INT32_MIN) T0 = INT32_MAX; else if ((int32_t)T0 < 0) T0 = -T0; RETURN();}void OPPROTO op_POWER_abso (void){ do_POWER_abso(); RETURN();}void OPPROTO op_POWER_clcs (void){ do_POWER_clcs(); RETURN();}void OPPROTO op_POWER_div (void){ do_POWER_div(); RETURN();}void OPPROTO op_POWER_divo (void){ do_POWER_divo(); RETURN();}void OPPROTO op_POWER_divs (void){ do_POWER_divs(); RETURN();}void OPPROTO op_POWER_divso (void){ do_POWER_divso(); RETURN();}void OPPROTO op_POWER_doz (void){ if ((int32_t)T1 > (int32_t)T0) T0 = T1 - T0; else T0 = 0; RETURN();}void OPPROTO op_POWER_dozo (void){ do_POWER_dozo(); RETURN();}void OPPROTO op_load_xer_cmp (void){ T2 = xer_cmp; RETURN();}void OPPROTO op_POWER_maskg (void){ do_POWER_maskg(); RETURN();}void OPPROTO op_POWER_maskir (void){ T0 = (T0 & ~T2) | (T1 & T2); RETURN();}void OPPROTO op_POWER_mul (void){ uint64_t tmp; tmp = (uint64_t)T0 * (uint64_t)T1; env->spr[SPR_MQ] = tmp >> 32; T0 = tmp; RETURN();}void OPPROTO op_POWER_mulo (void){ do_POWER_mulo(); RETURN();}void OPPROTO op_POWER_nabs (void){ if (T0 > 0) T0 = -T0; RETURN();}void OPPROTO op_POWER_nabso (void){ /* nabs never overflows */ if (T0 > 0) T0 = -T0; xer_ov = 0; RETURN();}/* XXX: factorise POWER rotates... */void OPPROTO op_POWER_rlmi (void){ T0 = rotl32(T0, T2) & PARAM1; T0 |= T1 & (uint32_t)PARAM2; RETURN();}void OPPROTO op_POWER_rrib (void){ T2 &= 0x1FUL; T0 = rotl32(T0 & INT32_MIN, T2); T0 |= T1 & ~rotl32(INT32_MIN, T2); RETURN();}void OPPROTO op_POWER_sle (void){ T1 &= 0x1FUL; env->spr[SPR_MQ] = rotl32(T0, T1); T0 = T0 << T1; RETURN();}void OPPROTO op_POWER_sleq (void){ uint32_t tmp = env->spr[SPR_MQ]; T1 &= 0x1FUL; env->spr[SPR_MQ] = rotl32(T0, T1); T0 = T0 << T1; T0 |= tmp >> (32 - T1); RETURN();}void OPPROTO op_POWER_sllq (void){ uint32_t msk = UINT32_MAX; msk = msk << (T1 & 0x1FUL); if (T1 & 0x20UL) msk = ~msk; T1 &= 0x1FUL; T0 = (T0 << T1) & msk; T0 |= env->spr[SPR_MQ] & ~msk; RETURN();}void OPPROTO op_POWER_slq (void){ uint32_t msk = UINT32_MAX, tmp; msk = msk << (T1 & 0x1FUL); if (T1 & 0x20UL) msk = ~msk; T1 &= 0x1FUL; tmp = rotl32(T0, T1); T0 = tmp & msk; env->spr[SPR_MQ] = tmp; RETURN();}void OPPROTO op_POWER_sraq (void){ env->spr[SPR_MQ] = rotl32(T0, 32 - (T1 & 0x1FUL)); if (T1 & 0x20UL) T0 = UINT32_MAX; else T0 = (int32_t)T0 >> T1; RETURN();}void OPPROTO op_POWER_sre (void){ T1 &= 0x1FUL; env->spr[SPR_MQ] = rotl32(T0, 32 - T1); T0 = (int32_t)T0 >> T1; RETURN();}void OPPROTO op_POWER_srea (void){ T1 &= 0x1FUL; env->spr[SPR_MQ] = T0 >> T1; T0 = (int32_t)T0 >> T1; RETURN();}void OPPROTO op_POWER_sreq (void){ uint32_t tmp; int32_t msk; T1 &= 0x1FUL; msk = INT32_MIN >> T1; tmp = env->spr[SPR_MQ]; env->spr[SPR_MQ] = rotl32(T0, 32 - T1); T0 = T0 >> T1; T0 |= tmp & msk; RETURN();}void OPPROTO op_POWER_srlq (void){ uint32_t tmp; int32_t msk; msk = INT32_MIN >> (T1 & 0x1FUL); if (T1 & 0x20UL) msk = ~msk; T1 &= 0x1FUL; tmp = env->spr[SPR_MQ]; env->spr[SPR_MQ] = rotl32(T0, 32 - T1); T0 = T0 >> T1; T0 &= msk; T0 |= tmp & ~msk; RETURN();}void OPPROTO op_POWER_srq (void){ T1 &= 0x1FUL; env->spr[SPR_MQ] = rotl32(T0, 32 - T1); T0 = T0 >> T1; RETURN();}/* POWER instructions not implemented in PowerPC 601 */#if !defined(CONFIG_USER_ONLY)void OPPROTO op_POWER_mfsri (void){ T1 = T0 >> 28; T0 = env->sr[T1]; RETURN();}void OPPROTO op_POWER_rac (void){ do_POWER_rac(); RETURN();}void OPPROTO op_POWER_rfsvc (void){ do_POWER_rfsvc(); RETURN();}#endif/* PowerPC 602 specific instruction */#if !defined(CONFIG_USER_ONLY)void OPPROTO op_602_mfrom (void){ do_op_602_mfrom(); RETURN();}#endif/* PowerPC 4xx specific micro-ops */void OPPROTO op_405_add_T0_T2 (void){ T0 = (int32_t)T0 + (int32_t)T2; RETURN();}void OPPROTO op_405_mulchw (void){ T0 = ((int16_t)T0) * ((int16_t)(T1 >> 16)); RETURN();}void OPPROTO op_405_mulchwu (void){ T0 = ((uint16_t)T0) * ((uint16_t)(T1 >> 16)); RETURN();}void OPPROTO op_405_mulhhw (void){ T0 = ((int16_t)(T0 >> 16)) * ((int16_t)(T1 >> 16)); RETURN();}void OPPROTO op_405_mulhhwu (void){ T0 = ((uint16_t)(T0 >> 16)) * ((uint16_t)(T1 >> 16)); RETURN();}void OPPROTO op_405_mullhw (void){ T0 = ((int16_t)T0) * ((int16_t)T1); RETURN();}void OPPROTO op_405_mullhwu (void){ T0 = ((uint16_t)T0) * ((uint16_t)T1); RETURN();}void OPPROTO op_405_check_sat (void){ do_405_check_sat(); RETURN();}void OPPROTO op_405_check_ovu (void){ if (likely(T0 >= T2)) { xer_ov = 0; } else { xer_ov = 1; xer_so = 1; } RETURN();}void OPPROTO op_405_check_satu (void){ if (unlikely(T0 < T2)) { /* Saturate result */ T0 = UINT32_MAX; } RETURN();}void OPPROTO op_load_dcr (void){ do_load_dcr(); RETURN();}void OPPROTO op_store_dcr (void){ do_store_dcr(); RETURN();}#if !defined(CONFIG_USER_ONLY)/* Return from critical interrupt : * same as rfi, except nip & MSR are loaded from SRR2/3 instead of SRR0/1 */void OPPROTO op_40x_rfci (void){ do_40x_rfci(); RETURN();}void OPPROTO op_rfci (void){ do_rfci(); RETURN();}void OPPROTO op_rfdi (void){ do_rfdi(); RETURN();}void OPPROTO op_rfmci (void){ do_rfmci(); RETURN();}void OPPROTO op_wrte (void){ /* We don't call do_store_msr here as we won't trigger * any special case nor change hflags */ T0 &= 1 << MSR_EE; env->msr &= ~(1 << MSR_EE); env->msr |= T0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -