native FPU support in code copy mode

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@643 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2004-02-25 23:19:55 +00:00
parent 7eee2a509a
commit 97eb5b14dc
1 changed files with 17 additions and 1 deletions

View File

@ -380,6 +380,11 @@ int cpu_exec(CPUState *env1)
) { ) {
spin_lock(&tb_lock); spin_lock(&tb_lock);
tb_add_jump((TranslationBlock *)(T0 & ~3), T0 & 3, tb); tb_add_jump((TranslationBlock *)(T0 & ~3), T0 & 3, tb);
#if defined(USE_CODE_COPY)
/* propagates the FP use info */
((TranslationBlock *)(T0 & ~3))->cflags |=
(tb->cflags & CF_FP_USED);
#endif
spin_unlock(&tb_lock); spin_unlock(&tb_lock);
} }
tc_ptr = tb->tc_ptr; tc_ptr = tb->tc_ptr;
@ -402,8 +407,14 @@ int cpu_exec(CPUState *env1)
#elif defined(TARGET_I386) && defined(USE_CODE_COPY) #elif defined(TARGET_I386) && defined(USE_CODE_COPY)
{ {
if (!(tb->cflags & CF_CODE_COPY)) { if (!(tb->cflags & CF_CODE_COPY)) {
if ((tb->cflags & CF_FP_USED) && env->native_fp_regs) {
save_native_fp_state(env);
}
gen_func(); gen_func();
} else { } else {
if ((tb->cflags & CF_FP_USED) && !env->native_fp_regs) {
restore_native_fp_state(env);
}
/* we work with native eflags */ /* we work with native eflags */
CC_SRC = cc_table[CC_OP].compute_all(); CC_SRC = cc_table[CC_OP].compute_all();
CC_OP = CC_OP_EFLAGS; CC_OP = CC_OP_EFLAGS;
@ -487,6 +498,11 @@ int cpu_exec(CPUState *env1)
#if defined(TARGET_I386) #if defined(TARGET_I386)
#if defined(USE_CODE_COPY)
if (env->native_fp_regs) {
save_native_fp_state(env);
}
#endif
/* restore flags in standard format */ /* restore flags in standard format */
env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK); env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK);
@ -747,7 +763,7 @@ int cpu_signal_handler(int host_signum, struct siginfo *info,
struct ucontext *uc = puc; struct ucontext *uc = puc;
unsigned long pc; unsigned long pc;
int trapno; int trapno;
#ifndef REG_EIP #ifndef REG_EIP
/* for glibc 2.1 */ /* for glibc 2.1 */
#define REG_EIP EIP #define REG_EIP EIP