]> git.proxmox.com Git - mirror_qemu.git/blobdiff - translate-all.c
Include <strings.h> for ffs().
[mirror_qemu.git] / translate-all.c
index cf8cc9bff08c6fa5077e63c17735c4678787ff3c..1c27fd3296e0ea72c02d2f3c5d93dbf256b85487 100644 (file)
@@ -38,6 +38,7 @@ uint16_t gen_opc_buf[OPC_BUF_SIZE];
 TCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
 
 target_ulong gen_opc_pc[OPC_BUF_SIZE];
+uint16_t gen_opc_icount[OPC_BUF_SIZE];
 uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
 #if defined(TARGET_I386)
 uint8_t gen_opc_cc_op[OPC_BUF_SIZE];
@@ -48,23 +49,6 @@ target_ulong gen_opc_jump_pc[2];
 uint32_t gen_opc_hflags[OPC_BUF_SIZE];
 #endif
 
-int code_copy_enabled = 1;
-
-#ifdef CONFIG_PROFILER
-int64_t dyngen_tb_count1;
-int64_t dyngen_tb_count;
-int64_t dyngen_op_count;
-int64_t dyngen_old_op_count;
-int64_t dyngen_tcg_del_op_count;
-int dyngen_op_count_max;
-int64_t dyngen_code_in_len;
-int64_t dyngen_code_out_len;
-int64_t dyngen_interm_time;
-int64_t dyngen_code_time;
-int64_t dyngen_restore_count;
-int64_t dyngen_restore_time;
-#endif
-
 /* XXX: suppress that */
 unsigned long code_gen_max_block_size(void)
 {
@@ -104,15 +88,14 @@ int cpu_gen_code(CPUState *env, TranslationBlock *tb, int *gen_code_size_ptr)
 #endif
 
 #ifdef CONFIG_PROFILER
-    dyngen_tb_count1++; /* includes aborted translations because of
-                           exceptions */
+    s->tb_count1++; /* includes aborted translations because of
+                       exceptions */
     ti = profile_getclock();
 #endif
     tcg_func_start(s);
 
-    if (gen_intermediate_code(env, tb) < 0)
-        return -1;
-    
+    gen_intermediate_code(env, tb);
+
     /* generate machine code */
     gen_code_buf = tb->tc_ptr;
     tb->tb_next_offset[0] = 0xffff;
@@ -131,16 +114,16 @@ int cpu_gen_code(CPUState *env, TranslationBlock *tb, int *gen_code_size_ptr)
 #endif
 
 #ifdef CONFIG_PROFILER
-    dyngen_tb_count++;
-    dyngen_interm_time += profile_getclock() - ti;
-    dyngen_code_time -= profile_getclock();
+    s->tb_count++;
+    s->interm_time += profile_getclock() - ti;
+    s->code_time -= profile_getclock();
 #endif
     gen_code_size = dyngen_code(s, gen_code_buf);
     *gen_code_size_ptr = gen_code_size;
 #ifdef CONFIG_PROFILER
-    dyngen_code_time += profile_getclock();
-    dyngen_code_in_len += tb->size;
-    dyngen_code_out_len += gen_code_size;
+    s->code_time += profile_getclock();
+    s->code_in_len += tb->size;
+    s->code_out_len += gen_code_size;
 #endif
 
 #ifdef DEBUG_DISAS
@@ -172,8 +155,14 @@ int cpu_restore_state(TranslationBlock *tb,
 #endif
     tcg_func_start(s);
 
-    if (gen_intermediate_code_pc(env, tb) < 0)
-        return -1;
+    gen_intermediate_code_pc(env, tb);
+
+    if (use_icount) {
+        /* Reset the cycle counter to the start of the block.  */
+        env->icount_decr.u16.low += tb->icount;
+        /* Clear the IO flag.  */
+        env->can_do_io = 0;
+    }
 
     /* find opc index corresponding to search_pc */
     tc_ptr = (unsigned long)tb->tc_ptr;
@@ -194,12 +183,13 @@ int cpu_restore_state(TranslationBlock *tb,
     /* now find start of instruction before */
     while (gen_opc_instr_start[j] == 0)
         j--;
+    env->icount_decr.u16.low -= gen_opc_icount[j];
 
     gen_pc_load(env, tb, searched_pc, j, puc);
 
 #ifdef CONFIG_PROFILER
-    dyngen_restore_time += profile_getclock() - ti;
-    dyngen_restore_count++;
+    s->restore_time += profile_getclock() - ti;
+    s->restore_count++;
 #endif
     return 0;
 }