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 + -
显示快捷键?