op_helper.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 2,373 行 · 第 1/5 页

C
2,373
字号
#include "exec.h"#include "host-utils.h"#include "helper.h"#if !defined(CONFIG_USER_ONLY)#include "softmmu_exec.h"#endif /* !defined(CONFIG_USER_ONLY) *///#define DEBUG_PCALL//#define DEBUG_MMU//#define DEBUG_MXCC//#define DEBUG_UNALIGNED//#define DEBUG_UNASSIGNED//#define DEBUG_ASI#ifdef DEBUG_MMU#define DPRINTF_MMU(fmt, args...) \do { printf("MMU: " fmt , ##args); } while (0)#else#define DPRINTF_MMU(fmt, args...) do {} while (0)#endif#ifdef DEBUG_MXCC#define DPRINTF_MXCC(fmt, args...) \do { printf("MXCC: " fmt , ##args); } while (0)#else#define DPRINTF_MXCC(fmt, args...) do {} while (0)#endif#ifdef DEBUG_ASI#define DPRINTF_ASI(fmt, args...) \do { printf("ASI: " fmt , ##args); } while (0)#else#define DPRINTF_ASI(fmt, args...) do {} while (0)#endif#ifdef TARGET_ABI32#define ABI32_MASK(addr) do { (addr) &= 0xffffffffULL; } while (0)#else#define ABI32_MASK(addr) do {} while (0)#endifvoid raise_exception(int tt){    env->exception_index = tt;    cpu_loop_exit();}void helper_trap(target_ulong nb_trap){    env->exception_index = TT_TRAP + (nb_trap & 0x7f);    cpu_loop_exit();}void helper_trapcc(target_ulong nb_trap, target_ulong do_trap){    if (do_trap) {        env->exception_index = TT_TRAP + (nb_trap & 0x7f);        cpu_loop_exit();    }}void helper_check_align(target_ulong addr, uint32_t align){    if (addr & align) {#ifdef DEBUG_UNALIGNED    printf("Unaligned access to 0x" TARGET_FMT_lx " from 0x" TARGET_FMT_lx           "\n", addr, env->pc);#endif        raise_exception(TT_UNALIGNED);    }}#define F_HELPER(name, p) void helper_f##name##p(void)#define F_BINOP(name)                                           \    F_HELPER(name, s)                                           \    {                                                           \        FT0 = float32_ ## name (FT0, FT1, &env->fp_status);     \    }                                                           \    F_HELPER(name, d)                                           \    {                                                           \        DT0 = float64_ ## name (DT0, DT1, &env->fp_status);     \    }                                                           \    F_HELPER(name, q)                                           \    {                                                           \        QT0 = float128_ ## name (QT0, QT1, &env->fp_status);    \    }F_BINOP(add);F_BINOP(sub);F_BINOP(mul);F_BINOP(div);#undef F_BINOPvoid helper_fsmuld(void){    DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status),                      float32_to_float64(FT1, &env->fp_status),                      &env->fp_status);}void helper_fdmulq(void){    QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status),                       float64_to_float128(DT1, &env->fp_status),                       &env->fp_status);}F_HELPER(neg, s){    FT0 = float32_chs(FT1);}#ifdef TARGET_SPARC64F_HELPER(neg, d){    DT0 = float64_chs(DT1);}F_HELPER(neg, q){    QT0 = float128_chs(QT1);}#endif/* Integer to float conversion.  */F_HELPER(ito, s){    FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status);}F_HELPER(ito, d){    DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);}F_HELPER(ito, q){    QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status);}#ifdef TARGET_SPARC64F_HELPER(xto, s){    FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status);}F_HELPER(xto, d){    DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status);}F_HELPER(xto, q){    QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status);}#endif#undef F_HELPER/* floating point conversion */void helper_fdtos(void){    FT0 = float64_to_float32(DT1, &env->fp_status);}void helper_fstod(void){    DT0 = float32_to_float64(FT1, &env->fp_status);}void helper_fqtos(void){    FT0 = float128_to_float32(QT1, &env->fp_status);}void helper_fstoq(void){    QT0 = float32_to_float128(FT1, &env->fp_status);}void helper_fqtod(void){    DT0 = float128_to_float64(QT1, &env->fp_status);}void helper_fdtoq(void){    QT0 = float64_to_float128(DT1, &env->fp_status);}/* Float to integer conversion.  */void helper_fstoi(void){    *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status);}void helper_fdtoi(void){    *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status);}void helper_fqtoi(void){    *((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status);}#ifdef TARGET_SPARC64void helper_fstox(void){    *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status);}void helper_fdtox(void){    *((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status);}void helper_fqtox(void){    *((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status);}void helper_faligndata(void){    uint64_t tmp;    tmp = (*((uint64_t *)&DT0)) << ((env->gsr & 7) * 8);    tmp |= (*((uint64_t *)&DT1)) >> (64 - (env->gsr & 7) * 8);    *((uint64_t *)&DT0) = tmp;}void helper_movl_FT0_0(void){    *((uint32_t *)&FT0) = 0;}void helper_movl_DT0_0(void){    *((uint64_t *)&DT0) = 0;}void helper_movl_FT0_1(void){    *((uint32_t *)&FT0) = 0xffffffff;}void helper_movl_DT0_1(void){    *((uint64_t *)&DT0) = 0xffffffffffffffffULL;}void helper_fnot(void){    *(uint64_t *)&DT0 = ~*(uint64_t *)&DT1;}void helper_fnots(void){    *(uint32_t *)&FT0 = ~*(uint32_t *)&FT1;}void helper_fnor(void){    *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 | *(uint64_t *)&DT1);}void helper_fnors(void){    *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 | *(uint32_t *)&FT1);}void helper_for(void){    *(uint64_t *)&DT0 |= *(uint64_t *)&DT1;}void helper_fors(void){    *(uint32_t *)&FT0 |= *(uint32_t *)&FT1;}void helper_fxor(void){    *(uint64_t *)&DT0 ^= *(uint64_t *)&DT1;}void helper_fxors(void){    *(uint32_t *)&FT0 ^= *(uint32_t *)&FT1;}void helper_fand(void){    *(uint64_t *)&DT0 &= *(uint64_t *)&DT1;}void helper_fands(void){    *(uint32_t *)&FT0 &= *(uint32_t *)&FT1;}void helper_fornot(void){    *(uint64_t *)&DT0 = *(uint64_t *)&DT0 | ~*(uint64_t *)&DT1;}void helper_fornots(void){    *(uint32_t *)&FT0 = *(uint32_t *)&FT0 | ~*(uint32_t *)&FT1;}void helper_fandnot(void){    *(uint64_t *)&DT0 = *(uint64_t *)&DT0 & ~*(uint64_t *)&DT1;}void helper_fandnots(void){    *(uint32_t *)&FT0 = *(uint32_t *)&FT0 & ~*(uint32_t *)&FT1;}void helper_fnand(void){    *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 & *(uint64_t *)&DT1);}void helper_fnands(void){    *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 & *(uint32_t *)&FT1);}void helper_fxnor(void){    *(uint64_t *)&DT0 ^= ~*(uint64_t *)&DT1;}void helper_fxnors(void){    *(uint32_t *)&FT0 ^= ~*(uint32_t *)&FT1;}#ifdef WORDS_BIGENDIAN#define VIS_B64(n) b[7 - (n)]#define VIS_W64(n) w[3 - (n)]#define VIS_SW64(n) sw[3 - (n)]#define VIS_L64(n) l[1 - (n)]#define VIS_B32(n) b[3 - (n)]#define VIS_W32(n) w[1 - (n)]#else#define VIS_B64(n) b[n]#define VIS_W64(n) w[n]#define VIS_SW64(n) sw[n]#define VIS_L64(n) l[n]#define VIS_B32(n) b[n]#define VIS_W32(n) w[n]#endiftypedef union {    uint8_t b[8];    uint16_t w[4];    int16_t sw[4];    uint32_t l[2];    float64 d;} vis64;typedef union {    uint8_t b[4];    uint16_t w[2];    uint32_t l;    float32 f;} vis32;void helper_fpmerge(void){    vis64 s, d;    s.d = DT0;    d.d = DT1;    // Reverse calculation order to handle overlap    d.VIS_B64(7) = s.VIS_B64(3);    d.VIS_B64(6) = d.VIS_B64(3);    d.VIS_B64(5) = s.VIS_B64(2);    d.VIS_B64(4) = d.VIS_B64(2);    d.VIS_B64(3) = s.VIS_B64(1);    d.VIS_B64(2) = d.VIS_B64(1);    d.VIS_B64(1) = s.VIS_B64(0);    //d.VIS_B64(0) = d.VIS_B64(0);    DT0 = d.d;}void helper_fmul8x16(void){    vis64 s, d;    uint32_t tmp;    s.d = DT0;    d.d = DT1;#define PMUL(r)                                                 \    tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r);       \    if ((tmp & 0xff) > 0x7f)                                    \        tmp += 0x100;                                           \    d.VIS_W64(r) = tmp >> 8;    PMUL(0);    PMUL(1);    PMUL(2);    PMUL(3);#undef PMUL    DT0 = d.d;}void helper_fmul8x16al(void){    vis64 s, d;    uint32_t tmp;    s.d = DT0;    d.d = DT1;#define PMUL(r)                                                 \    tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r);       \    if ((tmp & 0xff) > 0x7f)                                    \        tmp += 0x100;                                           \    d.VIS_W64(r) = tmp >> 8;    PMUL(0);    PMUL(1);    PMUL(2);    PMUL(3);#undef PMUL    DT0 = d.d;}void helper_fmul8x16au(void){    vis64 s, d;    uint32_t tmp;    s.d = DT0;    d.d = DT1;#define PMUL(r)                                                 \    tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r);       \    if ((tmp & 0xff) > 0x7f)                                    \        tmp += 0x100;                                           \    d.VIS_W64(r) = tmp >> 8;    PMUL(0);    PMUL(1);    PMUL(2);    PMUL(3);#undef PMUL    DT0 = d.d;}void helper_fmul8sux16(void){    vis64 s, d;    uint32_t tmp;    s.d = DT0;    d.d = DT1;#define PMUL(r)                                                         \    tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8);       \    if ((tmp & 0xff) > 0x7f)                                            \        tmp += 0x100;                                                   \    d.VIS_W64(r) = tmp >> 8;

⌨️ 快捷键说明

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