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

📄 op_helper.c.svn-base

📁 我们自己开发的一个OSEK操作系统!不知道可不可以?
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
        } else {            /* Denormalized */            p.f *= 2.0;        }    } else {        if (exp >= 253) {            /* Overflow */            p.i = 1;        } else {            p.f *= 4.0;        }    }    return p.f;}void helper_addf (void){    float ft0, ft1, ft2;    if (!vaxf_is_valid(FT0) || !vaxf_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxf_to_ieee32(FT0);    ft1 = vaxf_to_ieee32(FT1);    ft2 = float32_add(ft0, ft1, &FP_STATUS);    FT0 = ieee32_to_vaxf(ft2);}void helper_subf (void){    float ft0, ft1, ft2;    if (!vaxf_is_valid(FT0) || !vaxf_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxf_to_ieee32(FT0);    ft1 = vaxf_to_ieee32(FT1);    ft2 = float32_sub(ft0, ft1, &FP_STATUS);    FT0 = ieee32_to_vaxf(ft2);}void helper_mulf (void){    float ft0, ft1, ft2;    if (!vaxf_is_valid(FT0) || !vaxf_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxf_to_ieee32(FT0);    ft1 = vaxf_to_ieee32(FT1);    ft2 = float32_mul(ft0, ft1, &FP_STATUS);    FT0 = ieee32_to_vaxf(ft2);}void helper_divf (void){    float ft0, ft1, ft2;    if (!vaxf_is_valid(FT0) || !vaxf_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxf_to_ieee32(FT0);    ft1 = vaxf_to_ieee32(FT1);    ft2 = float32_div(ft0, ft1, &FP_STATUS);    FT0 = ieee32_to_vaxf(ft2);}void helper_sqrtf (void){    float ft0, ft1;    if (!vaxf_is_valid(FT0) || !vaxf_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxf_to_ieee32(FT0);    ft1 = float32_sqrt(ft0, &FP_STATUS);    FT0 = ieee32_to_vaxf(ft1);}void helper_itoff (void){    /* XXX: TODO */}static always_inline int vaxg_is_valid (double ff){    union {        double f;        uint64_t i;    } p;    uint64_t exp, mant;    p.f = ff;    exp = (p.i >> 52) & 0x7FF;    mant = p.i & 0x000FFFFFFFFFFFFFULL;    if (exp == 0 && ((p.i & 0x8000000000000000ULL) || mant != 0)) {        /* Reserved operands / Dirty zero */        return 0;    }    return 1;}static always_inline double vaxg_to_ieee64 (double fg){    union {        double f;        uint64_t i;    } p;    uint32_t exp;    p.f = fg;    exp = (p.i >> 52) & 0x7FF;    if (exp < 3) {        /* Underflow */        p.f = 0.0;    } else {        p.f *= 0.25;    }    return p.f;}static always_inline double ieee64_to_vaxg (double fi){    union {        double f;        uint64_t i;    } p;    uint64_t mant;    uint32_t exp;    p.f = fi;    exp = (p.i >> 52) & 0x7FF;    mant = p.i & 0x000FFFFFFFFFFFFFULL;    if (exp == 255) {        /* NaN or infinity */        p.i = 1; /* VAX dirty zero */    } else if (exp == 0) {        if (mant == 0) {            /* Zero */            p.i = 0;        } else {            /* Denormalized */            p.f *= 2.0;        }    } else {        if (exp >= 2045) {            /* Overflow */            p.i = 1; /* VAX dirty zero */        } else {            p.f *= 4.0;        }    }    return p.f;}void helper_addg (void){    double ft0, ft1, ft2;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    ft2 = float64_add(ft0, ft1, &FP_STATUS);    FT0 = ieee64_to_vaxg(ft2);}void helper_subg (void){    double ft0, ft1, ft2;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    ft2 = float64_sub(ft0, ft1, &FP_STATUS);    FT0 = ieee64_to_vaxg(ft2);}void helper_mulg (void){    double ft0, ft1, ft2;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    ft2 = float64_mul(ft0, ft1, &FP_STATUS);    FT0 = ieee64_to_vaxg(ft2);}void helper_divg (void){    double ft0, ft1, ft2;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    ft2 = float64_div(ft0, ft1, &FP_STATUS);    FT0 = ieee64_to_vaxg(ft2);}void helper_sqrtg (void){    double ft0, ft1;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = float64_sqrt(ft0, &FP_STATUS);    FT0 = ieee64_to_vaxg(ft1);}void helper_cmpgeq (void){    union {        double d;        uint64_t u;    } p;    double ft0, ft1;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    p.u = 0;    if (float64_eq(ft0, ft1, &FP_STATUS))        p.u = 0x4000000000000000ULL;    FT0 = p.d;}void helper_cmpglt (void){    union {        double d;        uint64_t u;    } p;    double ft0, ft1;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    p.u = 0;    if (float64_lt(ft0, ft1, &FP_STATUS))        p.u = 0x4000000000000000ULL;    FT0 = p.d;}void helper_cmpgle (void){    union {        double d;        uint64_t u;    } p;    double ft0, ft1;    if (!vaxg_is_valid(FT0) || !vaxg_is_valid(FT1)) {        /* XXX: TODO */    }    ft0 = vaxg_to_ieee64(FT0);    ft1 = vaxg_to_ieee64(FT1);    p.u = 0;    if (float64_le(ft0, ft1, &FP_STATUS))        p.u = 0x4000000000000000ULL;    FT0 = p.d;}void helper_cvtqs (void){    union {        double d;        uint64_t u;    } p;    p.d = FT0;    FT0 = (float)p.u;}void helper_cvttq (void){    union {        double d;        uint64_t u;    } p;    p.u = FT0;    FT0 = p.d;}void helper_cvtqt (void){    union {        double d;        uint64_t u;    } p;    p.d = FT0;    FT0 = p.u;}void helper_cvtqf (void){    union {        double d;        uint64_t u;    } p;    p.d = FT0;    FT0 = ieee32_to_vaxf(p.u);}void helper_cvtgf (void){    double ft0;    ft0 = vaxg_to_ieee64(FT0);    FT0 = ieee32_to_vaxf(ft0);}void helper_cvtgd (void){    /* XXX: TODO */}void helper_cvtgq (void){    union {        double d;        uint64_t u;    } p;    p.u = vaxg_to_ieee64(FT0);    FT0 = p.d;}void helper_cvtqg (void){    union {        double d;        uint64_t u;    } p;    p.d = FT0;    FT0 = ieee64_to_vaxg(p.u);}void helper_cvtdg (void){    /* XXX: TODO */}void helper_cvtlq (void){    union {        double d;        uint64_t u;    } p, q;    p.d = FT0;    q.u = (p.u >> 29) & 0x3FFFFFFF;    q.u |= (p.u >> 32);    q.u = (int64_t)((int32_t)q.u);    FT0 = q.d;}static always_inline void __helper_cvtql (int s, int v){    union {        double d;        uint64_t u;    } p, q;    p.d = FT0;    q.u = ((uint64_t)(p.u & 0xC0000000)) << 32;    q.u |= ((uint64_t)(p.u & 0x7FFFFFFF)) << 29;    FT0 = q.d;    if (v && (int64_t)((int32_t)p.u) != (int64_t)p.u) {        helper_excp(EXCP_ARITH, EXCP_ARITH_OVERFLOW);    }    if (s) {        /* TODO */    }}void helper_cvtql (void){    __helper_cvtql(0, 0);}void helper_cvtqlv (void){    __helper_cvtql(0, 1);}void helper_cvtqlsv (void){    __helper_cvtql(1, 1);}void helper_cmpfeq (void){    if (float64_eq(FT0, FT1, &FP_STATUS))        T0 = 1;    else        T0 = 0;}void helper_cmpfne (void){    if (float64_eq(FT0, FT1, &FP_STATUS))        T0 = 0;    else        T0 = 1;}void helper_cmpflt (void){    if (float64_lt(FT0, FT1, &FP_STATUS))        T0 = 1;    else        T0 = 0;}void helper_cmpfle (void){    if (float64_lt(FT0, FT1, &FP_STATUS))        T0 = 1;    else        T0 = 0;}void helper_cmpfgt (void){    if (float64_le(FT0, FT1, &FP_STATUS))        T0 = 0;    else        T0 = 1;}void helper_cmpfge (void){    if (float64_lt(FT0, FT1, &FP_STATUS))        T0 = 0;    else        T0 = 1;}#if !defined (CONFIG_USER_ONLY)void helper_mfpr (int iprn){    uint64_t val;    if (cpu_alpha_mfpr(env, iprn, &val) == 0)        T0 = val;}void helper_mtpr (int iprn){    cpu_alpha_mtpr(env, iprn, T0, NULL);}#endif#if defined(HOST_SPARC) || defined(HOST_SPARC64)void helper_reset_FT0 (void){    FT0 = 0;}void helper_reset_FT1 (void){    FT1 = 0;}void helper_reset_FT2 (void){    FT2 = 0;}#endif/*****************************************************************************//* Softmmu support */#if !defined (CONFIG_USER_ONLY)#ifdef __s390__# define GETPC() ((void*)((unsigned long)__builtin_return_address(0) & 0x7fffffffUL))#else# define GETPC() (__builtin_return_address(0))#endif/* XXX: the two following helpers are pure hacks. *      Hopefully, we emulate the PALcode, then we should never see *      HW_LD / HW_ST instructions. */void helper_ld_phys_to_virt (void){    uint64_t tlb_addr, physaddr;    int index, mmu_idx;    void *retaddr;    mmu_idx = cpu_mmu_index(env);    index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); redo:    tlb_addr = env->tlb_table[mmu_idx][index].addr_read;    if ((T0 & TARGET_PAGE_MASK) ==        (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {        physaddr = T0 + env->tlb_table[mmu_idx][index].addend;    } else {        /* the page is not in the TLB : fill it */        retaddr = GETPC();        tlb_fill(T0, 0, mmu_idx, retaddr);        goto redo;    }    T0 = physaddr;}void helper_st_phys_to_virt (void){    uint64_t tlb_addr, physaddr;    int index, mmu_idx;    void *retaddr;    printf("\n helper_st_phys_to_virt,t0 is:%x\n",T0);//debugger    mmu_idx = cpu_mmu_index(env);    index = (T0 >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); redo:    tlb_addr = env->tlb_table[mmu_idx][index].addr_write;    if ((T0 & TARGET_PAGE_MASK) ==        (tlb_addr & (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {        physaddr = T0 + env->tlb_table[mmu_idx][index].addend;    } else {        /* the page is not in the TLB : fill it */        retaddr = GETPC();        tlb_fill(T0, 1, mmu_idx, retaddr);        goto redo;    }    T0 = physaddr;}#define MMUSUFFIX _mmu#define SHIFT 0#include "softmmu_template.h"#define SHIFT 1#include "softmmu_template.h"#define SHIFT 2#include "softmmu_template.h"#define SHIFT 3#include "softmmu_template.h"/* try to fill the TLB and return an exception if error. If retaddr is   NULL, it means that the function was called in C code (i.e. not   from generated code or from helper.c) *//* XXX: fix it to restore all registers */void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr){    TranslationBlock *tb;    CPUState *saved_env;    unsigned long pc;    int ret;    /* XXX: hack to restore env in all cases, even if not called from       generated code */    saved_env = env;    env = cpu_single_env;    ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);    if (!likely(ret == 0)) {        if (likely(retaddr)) {            /* now we have a real cpu fault */            pc = (unsigned long)retaddr;            tb = tb_find_pc(pc);            if (likely(tb)) {                /* the PC is inside the translated code. It means that we have                   a virtual CPU fault */                cpu_restore_state(tb, env, pc, NULL);            }        }        /* Exception index and error code are already set */        cpu_loop_exit();    }    env = saved_env;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -