📄 op.c
字号:
T0 = ((int32_t) T0) >> T1;}#endif/* 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"#endifvoid OPPROTO op_ldfsr(void){ PUT_FSR32(env, *((uint32_t *) &FT0)); helper_ldfsr();}void OPPROTO op_stfsr(void){ *((uint32_t *) &FT0) = GET_FSR32(env);}#ifndef TARGET_SPARC64void OPPROTO op_rdpsr(void){ do_rdpsr();}void OPPROTO op_wrpsr(void){ do_wrpsr(); FORCE_RET();}void OPPROTO op_rett(void){ helper_rett(); FORCE_RET();}/* XXX: use another pointer for %iN registers to avoid slow wrapping handling ? */void OPPROTO op_save(void){ uint32_t cwp; cwp = (env->cwp - 1) & (NWINDOWS - 1); if (env->wim & (1 << cwp)) { raise_exception(TT_WIN_OVF); } set_cwp(cwp); FORCE_RET();}void OPPROTO op_restore(void){ uint32_t cwp; cwp = (env->cwp + 1) & (NWINDOWS - 1); if (env->wim & (1 << cwp)) { raise_exception(TT_WIN_UNF); } set_cwp(cwp); FORCE_RET();}#elsevoid OPPROTO op_rdccr(void){ T0 = GET_CCR(env);}void OPPROTO op_wrccr(void){ PUT_CCR(env, T0);}void OPPROTO op_rdtick(void){ T0 = 0; // XXX read cycle counter and bit 31}void OPPROTO op_wrtick(void){ // XXX write cycle counter and bit 31}void OPPROTO op_rdtpc(void){ T0 = env->tpc[env->tl];}void OPPROTO op_wrtpc(void){ env->tpc[env->tl] = T0;}void OPPROTO op_rdtnpc(void){ T0 = env->tnpc[env->tl];}void OPPROTO op_wrtnpc(void){ env->tnpc[env->tl] = T0;}void OPPROTO op_rdtstate(void){ T0 = env->tstate[env->tl];}void OPPROTO op_wrtstate(void){ env->tstate[env->tl] = T0;}void OPPROTO op_rdtt(void){ T0 = env->tt[env->tl];}void OPPROTO op_wrtt(void){ env->tt[env->tl] = T0;}void OPPROTO op_rdpstate(void){ T0 = env->pstate;}void OPPROTO op_wrpstate(void){ do_wrpstate();}// CWP handling is reversed in V9, but we still use the V8 register// order.void OPPROTO op_rdcwp(void){ T0 = NWINDOWS - 1 - env->cwp;}void OPPROTO op_wrcwp(void){ env->cwp = NWINDOWS - 1 - T0;}/* XXX: use another pointer for %iN registers to avoid slow wrapping handling ? */void OPPROTO op_save(void){ uint32_t cwp; cwp = (env->cwp - 1) & (NWINDOWS - 1); if (env->cansave == 0) { raise_exception(TT_SPILL | (env->otherwin != 0 ? (TT_WOTHER | ((env->wstate & 0x38) >> 1)): ((env->wstate & 0x7) << 2))); } else { if (env->cleanwin - env->canrestore == 0) { // XXX Clean windows without trap raise_exception(TT_CLRWIN); } else { env->cansave--; env->canrestore++; set_cwp(cwp); } } FORCE_RET();}void OPPROTO op_restore(void){ uint32_t cwp; cwp = (env->cwp + 1) & (NWINDOWS - 1); if (env->canrestore == 0) { raise_exception(TT_FILL | (env->otherwin != 0 ? (TT_WOTHER | ((env->wstate & 0x38) >> 1)): ((env->wstate & 0x7) << 2))); } else { env->cansave++; env->canrestore--; set_cwp(cwp); } FORCE_RET();}#endifvoid OPPROTO op_exception(void){ env->exception_index = PARAM1; cpu_loop_exit();}void OPPROTO op_trap_T0(void){ env->exception_index = TT_TRAP + (T0 & 0x7f); cpu_loop_exit();}void OPPROTO op_trapcc_T0(void){ if (T2) { env->exception_index = TT_TRAP + (T0 & 0x7f); cpu_loop_exit(); } FORCE_RET();}void OPPROTO op_trap_ifnofpu(void){ if (!env->psref) { env->exception_index = TT_NFPU_INSN; cpu_loop_exit(); } FORCE_RET();}void OPPROTO op_fpexception_im(void){ env->exception_index = TT_FP_EXCP; env->fsr &= ~FSR_FTT_MASK; env->fsr |= PARAM1; cpu_loop_exit(); FORCE_RET();}void OPPROTO op_debug(void){ helper_debug();}void OPPROTO op_exit_tb(void){ EXIT_TB();}void OPPROTO op_eval_ba(void){ T2 = 1;}void OPPROTO op_eval_be(void){ T2 = FLAG_SET(PSR_ZERO);}void OPPROTO op_eval_ble(void){ target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); T2 = Z | (N ^ V);}void OPPROTO op_eval_bl(void){ target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); T2 = N ^ V;}void OPPROTO op_eval_bleu(void){ target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY); T2 = C | Z;}void OPPROTO op_eval_bcs(void){ T2 = FLAG_SET(PSR_CARRY);}void OPPROTO op_eval_bvs(void){ T2 = FLAG_SET(PSR_OVF);}void OPPROTO op_eval_bn(void){ T2 = 0;}void OPPROTO op_eval_bneg(void){ T2 = FLAG_SET(PSR_NEG);}void OPPROTO op_eval_bne(void){ T2 = !FLAG_SET(PSR_ZERO);}void OPPROTO op_eval_bg(void){ target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); T2 = !(Z | (N ^ V));}void OPPROTO op_eval_bge(void){ target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF); T2 = !(N ^ V);}void OPPROTO op_eval_bgu(void){ target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY); T2 = !(C | Z);}void OPPROTO op_eval_bcc(void){ T2 = !FLAG_SET(PSR_CARRY);}void OPPROTO op_eval_bpos(void){ T2 = !FLAG_SET(PSR_NEG);}void OPPROTO op_eval_bvc(void){ T2 = !FLAG_SET(PSR_OVF);}#ifdef TARGET_SPARC64void OPPROTO op_eval_xbe(void){ T2 = XFLAG_SET(PSR_ZERO);}void OPPROTO op_eval_xble(void){ target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); T2 = Z | (N ^ V);}void OPPROTO op_eval_xbl(void){ target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); T2 = N ^ V;}void OPPROTO op_eval_xbleu(void){ target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY); T2 = C | Z;}void OPPROTO op_eval_xbcs(void){ T2 = XFLAG_SET(PSR_CARRY);}void OPPROTO op_eval_xbvs(void){ T2 = XFLAG_SET(PSR_OVF);}void OPPROTO op_eval_xbneg(void){ T2 = XFLAG_SET(PSR_NEG);}void OPPROTO op_eval_xbne(void){ T2 = !XFLAG_SET(PSR_ZERO);}void OPPROTO op_eval_xbg(void){ target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); T2 = !(Z | (N ^ V));}void OPPROTO op_eval_xbge(void){ target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF); T2 = !(N ^ V);}void OPPROTO op_eval_xbgu(void){ target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY); T2 = !(C | Z);}void OPPROTO op_eval_xbcc(void){ T2 = !XFLAG_SET(PSR_CARRY);}void OPPROTO op_eval_xbpos(void){ T2 = !XFLAG_SET(PSR_NEG);}void OPPROTO op_eval_xbvc(void){ T2 = !XFLAG_SET(PSR_OVF);}#endif#define FCC#define FFLAG_SET(x) (env->fsr & x? 1: 0)#include "fbranch_template.h"#ifdef TARGET_SPARC64#define FCC _fcc1#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 32))? 1: 0)#include "fbranch_template.h"#define FCC _fcc2#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 34))? 1: 0)#include "fbranch_template.h"#define FCC _fcc3#define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 36))? 1: 0)#include "fbranch_template.h"#endif#ifdef TARGET_SPARC64void OPPROTO op_eval_brz(void){ T2 = (T0 == 0);}void OPPROTO op_eval_brnz(void){ T2 = (T0 != 0);}void OPPROTO op_eval_brlz(void){ T2 = ((int64_t)T0 < 0);}void OPPROTO op_eval_brlez(void){ T2 = ((int64_t)T0 <= 0);}void OPPROTO op_eval_brgz(void){ T2 = ((int64_t)T0 > 0);}void OPPROTO op_eval_brgez(void){ T2 = ((int64_t)T0 >= 0);}void OPPROTO op_jmp_im64(void){ env->pc = PARAMQ1;}void OPPROTO op_movq_npc_im64(void){ env->npc = PARAMQ1;}#endifvoid OPPROTO op_jmp_im(void){ env->pc = (uint32_t)PARAM1;}void OPPROTO op_movl_npc_im(void){ env->npc = (uint32_t)PARAM1;}void OPPROTO op_movl_npc_T0(void){ env->npc = T0;}void OPPROTO op_mov_pc_npc(void){ env->pc = env->npc;}void OPPROTO op_next_insn(void){ env->pc = env->npc; env->npc = env->npc + 4;}void OPPROTO op_goto_tb0(void){ GOTO_TB(op_goto_tb0, PARAM1, 0);}void OPPROTO op_goto_tb1(void){ GOTO_TB(op_goto_tb1, PARAM1, 1);}void OPPROTO op_jmp_label(void){ GOTO_LABEL_PARAM(1);}void OPPROTO op_jnz_T2_label(void){ if (T2) GOTO_LABEL_PARAM(1); FORCE_RET();}void OPPROTO op_jz_T2_label(void){ if (!T2) GOTO_LABEL_PARAM(1); FORCE_RET();}void OPPROTO op_flush_T0(void){ helper_flush(T0);}void OPPROTO op_fnegs(void){ FT0 = -FT1;}void OPPROTO op_fabss(void){ do_fabss();}#ifdef TARGET_SPARC64void OPPROTO op_fnegd(void){ DT0 = -DT1;}void OPPROTO op_fabsd(void){ do_fabsd();}#endifvoid OPPROTO op_fsqrts(void){ do_fsqrts();}void OPPROTO op_fsqrtd(void){ do_fsqrtd();}void OPPROTO op_fmuls(void){ FT0 *= FT1;}void OPPROTO op_fmuld(void){ DT0 *= DT1;}void OPPROTO op_fsmuld(void){ DT0 = FT0 * FT1;}void OPPROTO op_fadds(void){ FT0 += FT1;}void OPPROTO op_faddd(void){ DT0 += DT1;}void OPPROTO op_fsubs(void){ FT0 -= FT1;}void OPPROTO op_fsubd(void){ DT0 -= DT1;}void OPPROTO op_fdivs(void){ FT0 /= FT1;}void OPPROTO op_fdivd(void){ DT0 /= DT1;}void OPPROTO op_fcmps(void){ do_fcmps();}void OPPROTO op_fcmpd(void){ do_fcmpd();}#ifdef TARGET_SPARC64void OPPROTO op_fcmps_fcc1(void){ do_fcmps_fcc1();}void OPPROTO op_fcmpd_fcc1(void){ do_fcmpd_fcc1();}void OPPROTO op_fcmps_fcc2(void){ do_fcmps_fcc2();}void OPPROTO op_fcmpd_fcc2(void){ do_fcmpd_fcc2();}void OPPROTO op_fcmps_fcc3(void){ do_fcmps_fcc3();}void OPPROTO op_fcmpd_fcc3(void){ do_fcmpd_fcc3();}#endif#ifdef USE_INT_TO_FLOAT_HELPERSvoid OPPROTO op_fitos(void){ do_fitos();}void OPPROTO op_fitod(void){ do_fitod();}#elsevoid OPPROTO op_fitos(void){ FT0 = (float) *((int32_t *)&FT1);}void OPPROTO op_fitod(void){ DT0 = (double) *((int32_t *)&FT1);}#ifdef TARGET_SPARC64void OPPROTO op_fxtos(void){ FT0 = (float) *((int64_t *)&DT1);}void OPPROTO op_fxtod(void){ DT0 = (double) *((int64_t *)&DT1);}#endif#endifvoid OPPROTO op_fdtos(void){ FT0 = (float) DT1;}void OPPROTO op_fstod(void){ DT0 = (double) FT1;}void OPPROTO op_fstoi(void){ *((int32_t *)&FT0) = (int32_t) FT1;}void OPPROTO op_fdtoi(void){ *((int32_t *)&FT0) = (int32_t) DT1;}#ifdef TARGET_SPARC64void OPPROTO op_fstox(void){ *((int64_t *)&DT0) = (int64_t) FT1;}void OPPROTO op_fdtox(void){ *((int64_t *)&DT0) = (int64_t) DT1;}void OPPROTO op_fmovs_cc(void){ if (T2) FT0 = FT1;}void OPPROTO op_fmovd_cc(void){ if (T2) DT0 = DT1;}void OPPROTO op_mov_cc(void){ if (T2) T0 = T1;}void OPPROTO op_flushw(void){ if (env->cansave != NWINDOWS - 2) { raise_exception(TT_SPILL | (env->otherwin != 0 ? (TT_WOTHER | ((env->wstate & 0x38) >> 1)): ((env->wstate & 0x7) << 2))); }}void OPPROTO op_saved(void){ env->cansave++; if (env->otherwin == 0) env->canrestore--;}void OPPROTO op_restored(void){ env->canrestore++; if (env->cleanwin < NWINDOWS - 1) env->cleanwin++; if (env->otherwin == 0) env->cansave--; else env->otherwin--;}void OPPROTO op_popc(void){ do_popc();}void OPPROTO op_done(void){ do_done();}void OPPROTO op_retry(void){ do_retry();}void OPPROTO op_sir(void){ // XXX}void OPPROTO op_ld_asi_reg(){ T0 += PARAM1; helper_ld_asi(env->asi, PARAM2, PARAM3);}void OPPROTO op_st_asi_reg(){ T0 += PARAM1; helper_st_asi(env->asi, PARAM2, PARAM3);}#endifvoid OPPROTO op_ld_asi(){ helper_ld_asi(PARAM1, PARAM2, PARAM3);}void OPPROTO op_st_asi(){ helper_st_asi(PARAM1, PARAM2, PARAM3);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -