Commit 97eb5b14dcfad346fa79e95e0e020aced9973311

Authored by bellard
1 parent 7eee2a50

native FPU support in code copy mode


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@643 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 17 additions and 1 deletions
cpu-exec.c
@@ -380,6 +380,11 @@ int cpu_exec(CPUState *env1) @@ -380,6 +380,11 @@ int cpu_exec(CPUState *env1)
380 ) { 380 ) {
381 spin_lock(&tb_lock); 381 spin_lock(&tb_lock);
382 tb_add_jump((TranslationBlock *)(T0 & ~3), T0 & 3, tb); 382 tb_add_jump((TranslationBlock *)(T0 & ~3), T0 & 3, tb);
  383 +#if defined(USE_CODE_COPY)
  384 + /* propagates the FP use info */
  385 + ((TranslationBlock *)(T0 & ~3))->cflags |=
  386 + (tb->cflags & CF_FP_USED);
  387 +#endif
383 spin_unlock(&tb_lock); 388 spin_unlock(&tb_lock);
384 } 389 }
385 tc_ptr = tb->tc_ptr; 390 tc_ptr = tb->tc_ptr;
@@ -402,8 +407,14 @@ int cpu_exec(CPUState *env1) @@ -402,8 +407,14 @@ int cpu_exec(CPUState *env1)
402 #elif defined(TARGET_I386) && defined(USE_CODE_COPY) 407 #elif defined(TARGET_I386) && defined(USE_CODE_COPY)
403 { 408 {
404 if (!(tb->cflags & CF_CODE_COPY)) { 409 if (!(tb->cflags & CF_CODE_COPY)) {
  410 + if ((tb->cflags & CF_FP_USED) && env->native_fp_regs) {
  411 + save_native_fp_state(env);
  412 + }
405 gen_func(); 413 gen_func();
406 } else { 414 } else {
  415 + if ((tb->cflags & CF_FP_USED) && !env->native_fp_regs) {
  416 + restore_native_fp_state(env);
  417 + }
407 /* we work with native eflags */ 418 /* we work with native eflags */
408 CC_SRC = cc_table[CC_OP].compute_all(); 419 CC_SRC = cc_table[CC_OP].compute_all();
409 CC_OP = CC_OP_EFLAGS; 420 CC_OP = CC_OP_EFLAGS;
@@ -487,6 +498,11 @@ int cpu_exec(CPUState *env1) @@ -487,6 +498,11 @@ int cpu_exec(CPUState *env1)
487 498
488 499
489 #if defined(TARGET_I386) 500 #if defined(TARGET_I386)
  501 +#if defined(USE_CODE_COPY)
  502 + if (env->native_fp_regs) {
  503 + save_native_fp_state(env);
  504 + }
  505 +#endif
490 /* restore flags in standard format */ 506 /* restore flags in standard format */
491 env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK); 507 env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK);
492 508
@@ -747,7 +763,7 @@ int cpu_signal_handler(int host_signum, struct siginfo *info, @@ -747,7 +763,7 @@ int cpu_signal_handler(int host_signum, struct siginfo *info,
747 struct ucontext *uc = puc; 763 struct ucontext *uc = puc;
748 unsigned long pc; 764 unsigned long pc;
749 int trapno; 765 int trapno;
750 - 766 +
751 #ifndef REG_EIP 767 #ifndef REG_EIP
752 /* for glibc 2.1 */ 768 /* for glibc 2.1 */
753 #define REG_EIP EIP 769 #define REG_EIP EIP