mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
- Move FPU exception handling into helper functions, since they are big.
- Fix FP-conditional branches. - Check FPU register mode at runtime, not translation time, as the F64 status bit can change. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2828 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
+3
-3
@@ -81,9 +81,9 @@ struct CPUMIPSState {
|
||||
#define FCR0_REV 0
|
||||
/* fcsr */
|
||||
uint32_t fcr31;
|
||||
#define SET_FP_COND(num,env) do { (env->fcr31) |= ((num) ? (1 << ((num) + 24)) : (1 << ((num) + 23))); } while(0)
|
||||
#define CLEAR_FP_COND(num,env) do { (env->fcr31) &= ~((num) ? (1 << ((num) + 24)) : (1 << ((num) + 23))); } while(0)
|
||||
#define IS_FP_COND_SET(num,env) (((env->fcr31) & ((num) ? (1 << ((num) + 24)) : (1 << ((num) + 23)))) != 0)
|
||||
#define SET_FP_COND(num,env) do { ((env)->fcr31) |= ((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0)
|
||||
#define CLEAR_FP_COND(num,env) do { ((env)->fcr31) &= ~((num) ? (1 << ((num) + 24)) : (1 << 23)); } while(0)
|
||||
#define GET_FP_COND(env) ((((env)->fcr31 >> 24) & 0xfe) | (((env)->fcr31 >> 23) & 0x1))
|
||||
#define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f)
|
||||
#define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f)
|
||||
#define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f)
|
||||
|
||||
@@ -165,4 +165,75 @@ void cpu_mips_update_irq (CPUState *env);
|
||||
void cpu_mips_clock_init (CPUState *env);
|
||||
void cpu_mips_tlb_flush (CPUState *env, int flush_global);
|
||||
|
||||
void do_ctc1 (void);
|
||||
void do_float_cvtd_s(void);
|
||||
void do_float_cvtd_w(void);
|
||||
void do_float_cvtd_l(void);
|
||||
void do_float_cvtl_d(void);
|
||||
void do_float_cvtl_s(void);
|
||||
void do_float_cvtps_pw(void);
|
||||
void do_float_cvtpw_ps(void);
|
||||
void do_float_cvts_d(void);
|
||||
void do_float_cvts_w(void);
|
||||
void do_float_cvts_l(void);
|
||||
void do_float_cvts_pl(void);
|
||||
void do_float_cvts_pu(void);
|
||||
void do_float_cvtw_s(void);
|
||||
void do_float_cvtw_d(void);
|
||||
void do_float_roundl_d(void);
|
||||
void do_float_roundl_s(void);
|
||||
void do_float_roundw_d(void);
|
||||
void do_float_roundw_s(void);
|
||||
void do_float_truncl_d(void);
|
||||
void do_float_truncl_s(void);
|
||||
void do_float_truncw_d(void);
|
||||
void do_float_truncw_s(void);
|
||||
void do_float_ceill_d(void);
|
||||
void do_float_ceill_s(void);
|
||||
void do_float_ceilw_d(void);
|
||||
void do_float_ceilw_s(void);
|
||||
void do_float_floorl_d(void);
|
||||
void do_float_floorl_s(void);
|
||||
void do_float_floorw_d(void);
|
||||
void do_float_floorw_s(void);
|
||||
void do_float_add_d(void);
|
||||
void do_float_add_s(void);
|
||||
void do_float_add_ps(void);
|
||||
void do_float_sub_d(void);
|
||||
void do_float_sub_s(void);
|
||||
void do_float_sub_ps(void);
|
||||
void do_float_mul_d(void);
|
||||
void do_float_mul_s(void);
|
||||
void do_float_mul_ps(void);
|
||||
void do_float_div_d(void);
|
||||
void do_float_div_s(void);
|
||||
void do_float_div_ps(void);
|
||||
void do_float_addr_ps(void);
|
||||
|
||||
#define CMP_OPS(op) \
|
||||
void do_cmp_d_ ## op(long cc); \
|
||||
void do_cmpabs_d_ ## op(long cc); \
|
||||
void do_cmp_s_ ## op(long cc); \
|
||||
void do_cmpabs_s_ ## op(long cc); \
|
||||
void do_cmp_ps_ ## op(long cc); \
|
||||
void do_cmpabs_ps_ ## op(long cc);
|
||||
|
||||
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
|
||||
|
||||
#endif /* !defined(__QEMU_MIPS_EXEC_H__) */
|
||||
|
||||
+103
-532
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+75
-101
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user