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

📄 op.c

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