⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 op_helper.c

📁 QEMU 0.91 source code, supports ARM processor including S3C24xx series
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -