📄 op.c
字号:
FLOAT_ROUNDOP(floor, w, d)FLOAT_ROUNDOP(floor, w, s)#undef FLOAR_ROUNDOPFLOAT_OP(movf, d){ if (!(env->fpu->fcr31 & PARAM1)) DT2 = DT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movf, s){ if (!(env->fpu->fcr31 & PARAM1)) WT2 = WT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movf, ps){ if (!(env->fpu->fcr31 & PARAM1)) { WT2 = WT0; WTH2 = WTH0; } DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movt, d){ if (env->fpu->fcr31 & PARAM1) DT2 = DT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movt, s){ if (env->fpu->fcr31 & PARAM1) WT2 = WT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movt, ps){ if (env->fpu->fcr31 & PARAM1) { WT2 = WT0; WTH2 = WTH0; } DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movz, d){ if (!T0) DT2 = DT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movz, s){ if (!T0) WT2 = WT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movz, ps){ if (!T0) { WT2 = WT0; WTH2 = WTH0; } DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movn, d){ if (T0) DT2 = DT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movn, s){ if (T0) WT2 = WT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(movn, ps){ if (T0) { WT2 = WT0; WTH2 = WTH0; } DEBUG_FPU_STATE(); FORCE_RET();}/* operations calling helpers, for s, d and ps */#define FLOAT_HOP(name) \FLOAT_OP(name, d) \{ \ CALL_FROM_TB0(do_float_ ## name ## _d); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, s) \{ \ CALL_FROM_TB0(do_float_ ## name ## _s); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, ps) \{ \ CALL_FROM_TB0(do_float_ ## name ## _ps); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_HOP(add)FLOAT_HOP(sub)FLOAT_HOP(mul)FLOAT_HOP(div)FLOAT_HOP(recip2)FLOAT_HOP(rsqrt2)FLOAT_HOP(rsqrt1)FLOAT_HOP(recip1)#undef FLOAT_HOP/* operations calling helpers, for s and d */#define FLOAT_HOP(name) \FLOAT_OP(name, d) \{ \ CALL_FROM_TB0(do_float_ ## name ## _d); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, s) \{ \ CALL_FROM_TB0(do_float_ ## name ## _s); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_HOP(rsqrt)FLOAT_HOP(recip)#undef FLOAT_HOP/* operations calling helpers, for ps */#define FLOAT_HOP(name) \FLOAT_OP(name, ps) \{ \ CALL_FROM_TB0(do_float_ ## name ## _ps); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_HOP(addr)FLOAT_HOP(mulr)#undef FLOAT_HOP/* ternary operations */#define FLOAT_TERNOP(name1, name2) \FLOAT_OP(name1 ## name2, d) \{ \ FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \ FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name1 ## name2, s) \{ \ FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \ FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name1 ## name2, ps) \{ \ FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \ FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \ FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_TERNOP(mul, add)FLOAT_TERNOP(mul, sub)#undef FLOAT_TERNOP/* negated ternary operations */#define FLOAT_NTERNOP(name1, name2) \FLOAT_OP(n ## name1 ## name2, d) \{ \ FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \ FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \ FDT2 = float64_chs(FDT2); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(n ## name1 ## name2, s) \{ \ FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \ FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ FST2 = float32_chs(FST2); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(n ## name1 ## name2, ps) \{ \ FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \ FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \ FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \ FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \ FST2 = float32_chs(FST2); \ FSTH2 = float32_chs(FSTH2); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_NTERNOP(mul, add)FLOAT_NTERNOP(mul, sub)#undef FLOAT_NTERNOP/* unary operations, modifying fp status */#define FLOAT_UNOP(name) \FLOAT_OP(name, d) \{ \ FDT2 = float64_ ## name(FDT0, &env->fpu->fp_status); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, s) \{ \ FST2 = float32_ ## name(FST0, &env->fpu->fp_status); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_UNOP(sqrt)#undef FLOAT_UNOP/* unary operations, not modifying fp status */#define FLOAT_UNOP(name) \FLOAT_OP(name, d) \{ \ FDT2 = float64_ ## name(FDT0); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, s) \{ \ FST2 = float32_ ## name(FST0); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \FLOAT_OP(name, ps) \{ \ FST2 = float32_ ## name(FST0); \ FSTH2 = float32_ ## name(FSTH0); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}FLOAT_UNOP(abs)FLOAT_UNOP(chs)#undef FLOAT_UNOPFLOAT_OP(mov, d){ FDT2 = FDT0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(mov, s){ FST2 = FST0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(mov, ps){ FST2 = FST0; FSTH2 = FSTH0; DEBUG_FPU_STATE(); FORCE_RET();}FLOAT_OP(alnv, ps){ switch (T0 & 0x7) { case 0: FST2 = FST0; FSTH2 = FSTH0; break; case 4:#ifdef TARGET_WORDS_BIGENDIAN FSTH2 = FST0; FST2 = FSTH1;#else FSTH2 = FST1; FST2 = FSTH0;#endif break; default: /* unpredictable */ break; } DEBUG_FPU_STATE(); FORCE_RET();}#ifdef CONFIG_SOFTFLOAT#define clear_invalid() do { \ int flags = get_float_exception_flags(&env->fpu->fp_status); \ flags &= ~float_flag_invalid; \ set_float_exception_flags(flags, &env->fpu->fp_status); \} while(0)#else#define clear_invalid() do { } while(0)#endifextern void dump_fpu_s(CPUState *env);#define CMP_OP(fmt, op) \void OPPROTO op_cmp ## _ ## fmt ## _ ## op(void) \{ \ CALL_FROM_TB1(do_cmp ## _ ## fmt ## _ ## op, PARAM1); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \} \void OPPROTO op_cmpabs ## _ ## fmt ## _ ## op(void) \{ \ CALL_FROM_TB1(do_cmpabs ## _ ## fmt ## _ ## op, PARAM1); \ DEBUG_FPU_STATE(); \ FORCE_RET(); \}#define CMP_OPS(op) \CMP_OP(d, op) \CMP_OP(s, op) \CMP_OP(ps, op)CMP_OPS(f)CMP_OPS(un)CMP_OPS(eq)CMP_OPS(ueq)CMP_OPS(olt)CMP_OPS(ult)CMP_OPS(ole)CMP_OPS(ule)CMP_OPS(sf)CMP_OPS(ngle)CMP_OPS(seq)CMP_OPS(ngl)CMP_OPS(lt)CMP_OPS(nge)CMP_OPS(le)CMP_OPS(ngt)#undef CMP_OPS#undef CMP_OPvoid op_bc1f (void){ T0 = !!(~GET_FP_COND(env->fpu) & (0x1 << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_bc1any2f (void){ T0 = !!(~GET_FP_COND(env->fpu) & (0x3 << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_bc1any4f (void){ T0 = !!(~GET_FP_COND(env->fpu) & (0xf << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_bc1t (void){ T0 = !!(GET_FP_COND(env->fpu) & (0x1 << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_bc1any2t (void){ T0 = !!(GET_FP_COND(env->fpu) & (0x3 << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_bc1any4t (void){ T0 = !!(GET_FP_COND(env->fpu) & (0xf << PARAM1)); DEBUG_FPU_STATE(); FORCE_RET();}void op_tlbwi (void){ CALL_FROM_TB0(env->tlb->do_tlbwi); FORCE_RET();}void op_tlbwr (void){ CALL_FROM_TB0(env->tlb->do_tlbwr); FORCE_RET();}void op_tlbp (void){ CALL_FROM_TB0(env->tlb->do_tlbp); FORCE_RET();}void op_tlbr (void){ CALL_FROM_TB0(env->tlb->do_tlbr); FORCE_RET();}/* Specials */#if defined (CONFIG_USER_ONLY)void op_tls_value (void){ T0 = env->tls_value;}#endifvoid op_pmon (void){ CALL_FROM_TB1(do_pmon, PARAM1); FORCE_RET();}void op_di (void){ T0 = env->CP0_Status; env->CP0_Status = T0 & ~(1 << CP0St_IE); CALL_FROM_TB1(cpu_mips_update_irq, env); FORCE_RET();}void op_ei (void){ T0 = env->CP0_Status; env->CP0_Status = T0 | (1 << CP0St_IE); CALL_FROM_TB1(cpu_mips_update_irq, env); FORCE_RET();}void op_trap (void){ if (T0) { CALL_FROM_TB1(do_raise_exception, EXCP_TRAP); } FORCE_RET();}void op_debug (void){ CALL_FROM_TB1(do_raise_exception, EXCP_DEBUG); FORCE_RET();}void op_set_lladdr (void){ env->CP0_LLAddr = T2; FORCE_RET();}void debug_pre_eret (void);void debug_post_eret (void);void op_eret (void){ if (loglevel & CPU_LOG_EXEC) CALL_FROM_TB0(debug_pre_eret); if (env->CP0_Status & (1 << CP0St_ERL)) { env->PC[env->current_tc] = env->CP0_ErrorEPC; env->CP0_Status &= ~(1 << CP0St_ERL); } else { env->PC[env->current_tc] = env->CP0_EPC; env->CP0_Status &= ~(1 << CP0St_EXL); } CALL_FROM_TB1(compute_hflags, env); if (loglevel & CPU_LOG_EXEC) CALL_FROM_TB0(debug_post_eret); env->CP0_LLAddr = 1; FORCE_RET();}void op_deret (void){ if (loglevel & CPU_LOG_EXEC) CALL_FROM_TB0(debug_pre_eret); env->PC[env->current_tc] = env->CP0_DEPC; env->hflags &= MIPS_HFLAG_DM; CALL_FROM_TB1(compute_hflags, env); if (loglevel & CPU_LOG_EXEC) CALL_FROM_TB0(debug_post_eret); env->CP0_LLAddr = 1; FORCE_RET();}void op_rdhwr_cpunum(void){ if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << 0))) T0 = env->CP0_EBase & 0x3ff; else CALL_FROM_TB1(do_raise_exception, EXCP_RI); FORCE_RET();}void op_rdhwr_synci_step(void){ if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << 1))) T0 = env->SYNCI_Step; else CALL_FROM_TB1(do_raise_exception, EXCP_RI); FORCE_RET();}void op_rdhwr_cc(void){ if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << 2))) T0 = env->CP0_Count; else CALL_FROM_TB1(do_raise_exception, EXCP_RI); FORCE_RET();}void op_rdhwr_ccres(void){ if ((env->hflags & MIPS_HFLAG_CP0) || (env->CP0_HWREna & (1 << 3))) T0 = env->CCRes; else CALL_FROM_TB1(do_raise_exception, EXCP_RI); FORCE_RET();}void op_save_state (void){ env->hflags = PARAM1; FORCE_RET();}void op_save_pc (void){ env->PC[env->current_tc] = PARAM1; FORCE_RET();}#if defined(TARGET_MIPS64)void op_save_pc64 (void){ env->PC[env->current_tc] = ((uint64_t)PARAM1 << 32) | (uint32_t)PARAM2; FORCE_RET();}#endifvoid op_interrupt_restart (void){ if (!(env->CP0_Status & (1 << CP0St_EXL)) && !(env->CP0_Status & (1 << CP0St_ERL)) && !(env->hflags & MIPS_HFLAG_DM) && (env->CP0_Status & (1 << CP0St_IE)) && (env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask)) { env->CP0_Cause &= ~(0x1f << CP0Ca_EC); CALL_FROM_TB1(do_raise_exception, EXCP_EXT_INTERRUPT); } FORCE_RET();}void op_raise_exception (void){ CALL_FROM_TB1(do_raise_exception, PARAM1); FORCE_RET();}void op_raise_exception_err (void){ CALL_FROM_TB2(do_raise_exception_err, PARAM1, PARAM2); FORCE_RET();}void op_exit_tb (void){ EXIT_TB(); FORCE_RET();}void op_wait (void){ env->halted = 1; CALL_FROM_TB1(do_raise_exception, EXCP_HLT); FORCE_RET();}/* Bitfield operations. */void op_ext(void){ unsigned int pos = PARAM1; unsigned int size = PARAM2; T0 = (int32_t)((T1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0)); FORCE_RET();}void op_ins(void){ unsigned int pos = PARAM1; unsigned int size = PARAM2; target_ulong mask = ((size < 32) ? ((1 << size) - 1) : ~0) << pos; T0 = (int32_t)((T0 & ~mask) | ((T1 << pos) & mask)); FORCE_RET();}void op_wsbh(void){ T0 = (int32_t)(((T1 << 8) & ~0x00FF00FF) | ((T1 >> 8) & 0x00FF00FF)); FORCE_RET();}#if defined(TARGET_MIPS64)void op_dext(void){ unsigned int pos = PARAM1; unsigned int size = PARAM2; T0 = (T1 >> pos) & ((size < 64) ? ((1ULL << size) - 1) : ~0ULL); FORCE_RET();}void op_dins(void){ unsigned int pos = PARAM1; unsigned int size = PARAM2; target_ulong mask = ((size < 64) ? ((1ULL << size) - 1) : ~0ULL) << pos; T0 = (T0 & ~mask) | ((T1 << pos) & mask); FORCE_RET();}void op_dsbh(void){ T0 = ((T1 << 8) & ~0x00FF00FF00FF00FFULL) | ((T1 >> 8) & 0x00FF00FF00FF00FFULL); FORCE_RET();}void op_dshd(void){ T1 = ((T1 << 16) & ~0x0000FFFF0000FFFFULL) | ((T1 >> 16) & 0x0000FFFF0000FFFFULL); T0 = (T1 << 32) | (T1 >> 32); FORCE_RET();}#endifvoid op_seb(void){ T0 = ((T1 & 0xFF) ^ 0x80) - 0x80; FORCE_RET();}void op_seh(void){ T0 = ((T1 & 0xFFFF) ^ 0x8000) - 0x8000; FORCE_RET();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -