📄 math.c
字号:
/* Load lengthened float to long double */static int emu_lxebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f); FP_CONV (Q, S, 4, 1, QR, SA); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; return _fex;}/* Load lengthened float to long double */static int emu_lxeb (int rx, float *val) { FP_DECL_S(SA); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, val); FP_CONV (Q, S, 4, 1, QR, SA); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; return _fex;}/* Load lengthened float to double */static int emu_ldebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f); FP_CONV (D, S, 2, 1, DR, SA); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Load lengthened float to double */static int emu_ldeb (int rx, float *val) { FP_DECL_S(SA); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, val); FP_CONV (D, S, 2, 1, DR, SA); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Load negative long double */static int emu_lnxbr (int rx, int ry) { FP_DECL_Q(QA); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[ry].ui; cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui; FP_UNPACK_QP(QA, &cvt.ld); if (QA_s == 0) { FP_NEG_Q(QR, QA); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; } else { current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; current->thread.fp_regs.fprs[rx+2].ui = current->thread.fp_regs.fprs[ry+2].ui; } emu_set_CC_cs(QR_c, QR_s); return _fex;}/* Load negative double */static int emu_lndbr (int rx, int ry) { FP_DECL_D(DA); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d); if (DA_s == 0) { FP_NEG_D(DR, DA); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); } else current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; emu_set_CC_cs(DR_c, DR_s); return _fex;}/* Load negative float */static int emu_lnebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_S(SR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f); if (SA_s == 0) { FP_NEG_S(SR, SA); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); } else current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; emu_set_CC_cs(SR_c, SR_s); return _fex;}/* Load positive long double */static int emu_lpxbr (int rx, int ry) { FP_DECL_Q(QA); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[ry].ui; cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui; FP_UNPACK_QP(QA, &cvt.ld); if (QA_s != 0) { FP_NEG_Q(QR, QA); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; } else{ current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; current->thread.fp_regs.fprs[rx+2].ui = current->thread.fp_regs.fprs[ry+2].ui; } emu_set_CC_cs(QR_c, QR_s); return _fex;}/* Load positive double */static int emu_lpdbr (int rx, int ry) { FP_DECL_D(DA); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d); if (DA_s != 0) { FP_NEG_D(DR, DA); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); } else current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; emu_set_CC_cs(DR_c, DR_s); return _fex;}/* Load positive float */static int emu_lpebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_S(SR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f); if (SA_s != 0) { FP_NEG_S(SR, SA); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); } else current->thread.fp_regs.fprs[rx].ui = current->thread.fp_regs.fprs[ry].ui; emu_set_CC_cs(SR_c, SR_s); return _fex;}/* Load rounded long double to double */static int emu_ldxbr (int rx, int ry) { FP_DECL_Q(QA); FP_DECL_D(DR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[ry].ui; cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui; FP_UNPACK_QP(QA, &cvt.ld); FP_CONV (D, Q, 2, 4, DR, QA); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].f, DR); return _fex;}/* Load rounded long double to float */static int emu_lexbr (int rx, int ry) { FP_DECL_Q(QA); FP_DECL_S(SR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[ry].ui; cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui; FP_UNPACK_QP(QA, &cvt.ld); FP_CONV (S, Q, 1, 4, SR, QA); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); return _fex;}/* Load rounded double to float */static int emu_ledbr (int rx, int ry) { FP_DECL_D(DA); FP_DECL_S(SR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d); FP_CONV (S, D, 1, 2, SR, DA); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); return _fex;}/* Multiply long double */static int emu_mxbr (int rx, int ry) { FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[rx].ui; cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui; FP_UNPACK_QP(QA, &cvt.ld); cvt.w.high = current->thread.fp_regs.fprs[ry].ui; cvt.w.low = current->thread.fp_regs.fprs[ry+2].ui; FP_UNPACK_QP(QB, &cvt.ld); FP_MUL_Q(QR, QA, QB); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; return _fex;}/* Multiply double */static int emu_mdbr (int rx, int ry) { FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d); FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d); FP_MUL_D(DR, DA, DB); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Multiply double */static int emu_mdb (int rx, double *val) { FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d); FP_UNPACK_DP(DB, val); FP_MUL_D(DR, DA, DB); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Multiply double to long double */static int emu_mxdbr (int rx, int ry) { FP_DECL_D(DA); FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d); FP_CONV (Q, D, 4, 2, QA, DA); FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[ry].d); FP_CONV (Q, D, 4, 2, QB, DA); FP_MUL_Q(QR, QA, QB); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; return _fex;}/* Multiply double to long double */static int emu_mxdb (int rx, long double *val) { FP_DECL_Q(QA); FP_DECL_Q(QB); FP_DECL_Q(QR); FP_DECL_EX; mathemu_ldcv cvt; int mode; mode = current->thread.fp_regs.fpc & 3; cvt.w.high = current->thread.fp_regs.fprs[rx].ui; cvt.w.low = current->thread.fp_regs.fprs[rx+2].ui; FP_UNPACK_QP(QA, &cvt.ld); FP_UNPACK_QP(QB, val); FP_MUL_Q(QR, QA, QB); FP_PACK_QP(&cvt.ld, QR); current->thread.fp_regs.fprs[rx].ui = cvt.w.high; current->thread.fp_regs.fprs[rx+2].ui = cvt.w.low; return _fex;}/* Multiply float */static int emu_meebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f); FP_UNPACK_SP(SB, ¤t->thread.fp_regs.fprs[ry].f); FP_MUL_S(SR, SA, SB); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); return _fex;}/* Multiply float */static int emu_meeb (int rx, float *val) { FP_DECL_S(SA); FP_DECL_S(SB); FP_DECL_S(SR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f); FP_UNPACK_SP(SB, val); FP_MUL_S(SR, SA, SB); FP_PACK_SP(¤t->thread.fp_regs.fprs[rx].f, SR); return _fex;}/* Multiply float to double */static int emu_mdebr (int rx, int ry) { FP_DECL_S(SA); FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f); FP_CONV (D, S, 2, 1, DA, SA); FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[ry].f); FP_CONV (D, S, 2, 1, DB, SA); FP_MUL_D(DR, DA, DB); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Multiply float to double */static int emu_mdeb (int rx, float *val) { FP_DECL_S(SA); FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_SP(SA, ¤t->thread.fp_regs.fprs[rx].f); FP_CONV (D, S, 2, 1, DA, SA); FP_UNPACK_SP(SA, val); FP_CONV (D, S, 2, 1, DB, SA); FP_MUL_D(DR, DA, DB); FP_PACK_DP(¤t->thread.fp_regs.fprs[rx].d, DR); return _fex;}/* Multiply and add double */static int emu_madbr (int rx, int ry, int rz) { FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d); FP_UNPACK_DP(DB, ¤t->thread.fp_regs.fprs[ry].d); FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d); FP_MUL_D(DR, DA, DB); FP_ADD_D(DR, DR, DC); FP_PACK_DP(¤t->thread.fp_regs.fprs[rz].d, DR); return _fex;}/* Multiply and add double */static int emu_madb (int rx, double *val, int rz) { FP_DECL_D(DA); FP_DECL_D(DB); FP_DECL_D(DC); FP_DECL_D(DR); FP_DECL_EX; int mode; mode = current->thread.fp_regs.fpc & 3; FP_UNPACK_DP(DA, ¤t->thread.fp_regs.fprs[rx].d); FP_UNPACK_DP(DB, val); FP_UNPACK_DP(DC, ¤t->thread.fp_regs.fprs[rz].d); FP_MUL_D(DR, DA, DB);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -