📄 op_helper.c
字号:
FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(rsqrt, d){ set_float_exception_flags(0, &env->fpu->fp_status); FDT2 = float64_sqrt(FDT0, &env->fpu->fp_status); FDT2 = float64_div(FLOAT_ONE64, FDT2, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(rsqrt, s){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_sqrt(FST0, &env->fpu->fp_status); FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(recip1, d){ set_float_exception_flags(0, &env->fpu->fp_status); FDT2 = float64_div(FLOAT_ONE64, FDT0, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(recip1, s){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(recip1, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_div(FLOAT_ONE32, FST0, &env->fpu->fp_status); FSTH2 = float32_div(FLOAT_ONE32, FSTH0, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(rsqrt1, d){ set_float_exception_flags(0, &env->fpu->fp_status); FDT2 = float64_sqrt(FDT0, &env->fpu->fp_status); FDT2 = float64_div(FLOAT_ONE64, FDT2, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(rsqrt1, s){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_sqrt(FST0, &env->fpu->fp_status); FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(rsqrt1, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_sqrt(FST0, &env->fpu->fp_status); FSTH2 = float32_sqrt(FSTH0, &env->fpu->fp_status); FST2 = float32_div(FLOAT_ONE32, FST2, &env->fpu->fp_status); FSTH2 = float32_div(FLOAT_ONE32, FSTH2, &env->fpu->fp_status); update_fcr31();}/* binary operations */#define FLOAT_BINOP(name) \FLOAT_OP(name, d) \{ \ set_float_exception_flags(0, &env->fpu->fp_status); \ FDT2 = float64_ ## name (FDT0, FDT1, &env->fpu->fp_status); \ update_fcr31(); \ if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ DT2 = FLOAT_QNAN64; \} \FLOAT_OP(name, s) \{ \ set_float_exception_flags(0, &env->fpu->fp_status); \ FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \ update_fcr31(); \ if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) \ WT2 = FLOAT_QNAN32; \} \FLOAT_OP(name, ps) \{ \ set_float_exception_flags(0, &env->fpu->fp_status); \ FST2 = float32_ ## name (FST0, FST1, &env->fpu->fp_status); \ FSTH2 = float32_ ## name (FSTH0, FSTH1, &env->fpu->fp_status); \ update_fcr31(); \ if (GET_FP_CAUSE(env->fpu->fcr31) & FP_INVALID) { \ WT2 = FLOAT_QNAN32; \ WTH2 = FLOAT_QNAN32; \ } \}FLOAT_BINOP(add)FLOAT_BINOP(sub)FLOAT_BINOP(mul)FLOAT_BINOP(div)#undef FLOAT_BINOP/* MIPS specific binary operations */FLOAT_OP(recip2, d){ set_float_exception_flags(0, &env->fpu->fp_status); FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status); FDT2 = float64_chs(float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(recip2, s){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(recip2, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status); FST2 = float32_chs(float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status)); FSTH2 = float32_chs(float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(rsqrt2, d){ set_float_exception_flags(0, &env->fpu->fp_status); FDT2 = float64_mul(FDT0, FDT2, &env->fpu->fp_status); FDT2 = float64_sub(FDT2, FLOAT_ONE64, &env->fpu->fp_status); FDT2 = float64_chs(float64_div(FDT2, FLOAT_TWO64, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(rsqrt2, s){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status); FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(rsqrt2, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_mul(FST0, FST2, &env->fpu->fp_status); FSTH2 = float32_mul(FSTH0, FSTH2, &env->fpu->fp_status); FST2 = float32_sub(FST2, FLOAT_ONE32, &env->fpu->fp_status); FSTH2 = float32_sub(FSTH2, FLOAT_ONE32, &env->fpu->fp_status); FST2 = float32_chs(float32_div(FST2, FLOAT_TWO32, &env->fpu->fp_status)); FSTH2 = float32_chs(float32_div(FSTH2, FLOAT_TWO32, &env->fpu->fp_status)); update_fcr31();}FLOAT_OP(addr, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_add (FST0, FSTH0, &env->fpu->fp_status); FSTH2 = float32_add (FST1, FSTH1, &env->fpu->fp_status); update_fcr31();}FLOAT_OP(mulr, ps){ set_float_exception_flags(0, &env->fpu->fp_status); FST2 = float32_mul (FST0, FSTH0, &env->fpu->fp_status); FSTH2 = float32_mul (FST1, FSTH1, &env->fpu->fp_status); update_fcr31();}/* compare operations */#define FOP_COND_D(op, cond) \void do_cmp_d_ ## op (long cc) \{ \ int c = cond; \ update_fcr31(); \ if (c) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \} \void do_cmpabs_d_ ## op (long cc) \{ \ int c; \ FDT0 = float64_chs(FDT0); \ FDT1 = float64_chs(FDT1); \ c = cond; \ update_fcr31(); \ if (c) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \}int float64_is_unordered(int sig, float64 a, float64 b STATUS_PARAM){ if (float64_is_signaling_nan(a) || float64_is_signaling_nan(b) || (sig && (float64_is_nan(a) || float64_is_nan(b)))) { float_raise(float_flag_invalid, status); return 1; } else if (float64_is_nan(a) || float64_is_nan(b)) { return 1; } else { return 0; }}/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_D(f, (float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status), 0))FOP_COND_D(un, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status))FOP_COND_D(eq, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_eq(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ueq, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_eq(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(olt, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_lt(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ult, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_lt(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ole, !float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) && float64_le(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ule, float64_is_unordered(0, FDT1, FDT0, &env->fpu->fp_status) || float64_le(FDT0, FDT1, &env->fpu->fp_status))/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_D(sf, (float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status), 0))FOP_COND_D(ngle,float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status))FOP_COND_D(seq, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_eq(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ngl, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_eq(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(lt, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_lt(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(nge, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_lt(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(le, !float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) && float64_le(FDT0, FDT1, &env->fpu->fp_status))FOP_COND_D(ngt, float64_is_unordered(1, FDT1, FDT0, &env->fpu->fp_status) || float64_le(FDT0, FDT1, &env->fpu->fp_status))#define FOP_COND_S(op, cond) \void do_cmp_s_ ## op (long cc) \{ \ int c = cond; \ update_fcr31(); \ if (c) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \} \void do_cmpabs_s_ ## op (long cc) \{ \ int c; \ FST0 = float32_abs(FST0); \ FST1 = float32_abs(FST1); \ c = cond; \ update_fcr31(); \ if (c) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \}flag float32_is_unordered(int sig, float32 a, float32 b STATUS_PARAM){ if (float32_is_signaling_nan(a) || float32_is_signaling_nan(b) || (sig && (float32_is_nan(a) || float32_is_nan(b)))) { float_raise(float_flag_invalid, status); return 1; } else if (float32_is_nan(a) || float32_is_nan(b)) { return 1; } else { return 0; }}/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_S(f, (float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status), 0))FOP_COND_S(un, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status))FOP_COND_S(eq, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ueq, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(olt, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ult, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ole, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ule, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status))/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_S(sf, (float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status), 0))FOP_COND_S(ngle,float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status))FOP_COND_S(seq, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ngl, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(lt, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(nge, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(le, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status))FOP_COND_S(ngt, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status))#define FOP_COND_PS(op, condl, condh) \void do_cmp_ps_ ## op (long cc) \{ \ int cl = condl; \ int ch = condh; \ update_fcr31(); \ if (cl) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \ if (ch) \ SET_FP_COND(cc + 1, env->fpu); \ else \ CLEAR_FP_COND(cc + 1, env->fpu); \} \void do_cmpabs_ps_ ## op (long cc) \{ \ int cl, ch; \ FST0 = float32_abs(FST0); \ FSTH0 = float32_abs(FSTH0); \ FST1 = float32_abs(FST1); \ FSTH1 = float32_abs(FSTH1); \ cl = condl; \ ch = condh; \ update_fcr31(); \ if (cl) \ SET_FP_COND(cc, env->fpu); \ else \ CLEAR_FP_COND(cc, env->fpu); \ if (ch) \ SET_FP_COND(cc + 1, env->fpu); \ else \ CLEAR_FP_COND(cc + 1, env->fpu); \}/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_PS(f, (float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status), 0), (float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status), 0))FOP_COND_PS(un, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status), float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status))FOP_COND_PS(eq, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ueq, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(olt, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ult, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ole, !float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) && float32_le(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ule, float32_is_unordered(0, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(0, FSTH1, FSTH0, &env->fpu->fp_status) || float32_le(FSTH0, FSTH1, &env->fpu->fp_status))/* NOTE: the comma operator will make "cond" to eval to false, * but float*_is_unordered() is still called. */FOP_COND_PS(sf, (float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status), 0), (float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status), 0))FOP_COND_PS(ngle,float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status), float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status))FOP_COND_PS(seq, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_eq(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ngl, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_eq(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_eq(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(lt, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_lt(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(nge, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_lt(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_lt(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(le, !float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) && float32_le(FST0, FST1, &env->fpu->fp_status), !float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) && float32_le(FSTH0, FSTH1, &env->fpu->fp_status))FOP_COND_PS(ngt, float32_is_unordered(1, FST1, FST0, &env->fpu->fp_status) || float32_le(FST0, FST1, &env->fpu->fp_status), float32_is_unordered(1, FSTH1, FSTH0, &env->fpu->fp_status) || float32_le(FSTH0, FSTH1, &env->fpu->fp_status))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -