diff mbox

[v5,3/7] TCG: Use gen_opc_ptr from context instead of global variable.

Message ID 1352176885-13324-4-git-send-email-e.voevodin@samsung.com
State New
Headers show

Commit Message

Evgeny Voevodin Nov. 6, 2012, 4:41 a.m. UTC
Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
Reviewed-by: Richard Henderson <rth@twiddle.net>
---
 target-alpha/translate.c      |    8 ++---
 target-arm/translate.c        |    8 ++---
 target-cris/translate.c       |   10 +++---
 target-i386/translate.c       |    8 ++---
 target-lm32/translate.c       |   10 +++---
 target-m68k/translate.c       |    8 ++---
 target-microblaze/translate.c |   10 +++---
 target-mips/translate.c       |    9 +++---
 target-openrisc/translate.c   |   10 +++---
 target-ppc/translate.c        |    9 +++---
 target-s390x/translate.c      |    9 +++---
 target-sh4/translate.c        |    8 ++---
 target-sparc/translate.c      |    8 ++---
 target-unicore32/translate.c  |    8 ++---
 target-xtensa/translate.c     |    6 ++--
 tcg/tcg-op.h                  |   70 ++++++++++++++++++++---------------------
 tcg/tcg.c                     |   16 +++++-----
 17 files changed, 109 insertions(+), 106 deletions(-)

Comments

Blue Swirl Nov. 10, 2012, 12:37 p.m. UTC | #1
On Tue, Nov 6, 2012 at 4:41 AM, Evgeny Voevodin <e.voevodin@samsung.com> wrote:
> Signed-off-by: Evgeny Voevodin <e.voevodin@samsung.com>
> Reviewed-by: Richard Henderson <rth@twiddle.net>
> ---
>  target-alpha/translate.c      |    8 ++---
>  target-arm/translate.c        |    8 ++---
>  target-cris/translate.c       |   10 +++---
>  target-i386/translate.c       |    8 ++---
>  target-lm32/translate.c       |   10 +++---
>  target-m68k/translate.c       |    8 ++---
>  target-microblaze/translate.c |   10 +++---
>  target-mips/translate.c       |    9 +++---
>  target-openrisc/translate.c   |   10 +++---
>  target-ppc/translate.c        |    9 +++---
>  target-s390x/translate.c      |    9 +++---
>  target-sh4/translate.c        |    8 ++---
>  target-sparc/translate.c      |    8 ++---
>  target-unicore32/translate.c  |    8 ++---
>  target-xtensa/translate.c     |    6 ++--
>  tcg/tcg-op.h                  |   70 ++++++++++++++++++++---------------------
>  tcg/tcg.c                     |   16 +++++-----
>  17 files changed, 109 insertions(+), 106 deletions(-)
>
> diff --git a/target-alpha/translate.c b/target-alpha/translate.c
> index f707d8d..6676cbf 100644
> --- a/target-alpha/translate.c
> +++ b/target-alpha/translate.c
> @@ -3406,7 +3406,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
>              }
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -3432,7 +3432,7 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
>             or exhaust instruction count, stop generation.  */
>          if (ret == NO_EXIT
>              && ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0
> -                || gen_opc_ptr >= gen_opc_end
> +                || tcg_ctx.gen_opc_ptr >= gen_opc_end
>                  || num_insns >= max_insns
>                  || singlestep
>                  || env->singlestep_enabled)) {
> @@ -3463,9 +3463,9 @@ static inline void gen_intermediate_code_internal(CPUAlphaState *env,
>      }
>
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-arm/translate.c b/target-arm/translate.c
> index 25433da..ff5d294 100644
> --- a/target-arm/translate.c
> +++ b/target-arm/translate.c
> @@ -9834,7 +9834,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
>              }
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -9881,7 +9881,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
>           * Also stop translation when a page boundary is reached.  This
>           * ensures prefetch aborts occur at the right place.  */
>          num_insns ++;
> -    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
> +    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
>               !env->singlestep_enabled &&
>               !singlestep &&
>               dc->pc < next_page_start &&
> @@ -9962,7 +9962,7 @@ static inline void gen_intermediate_code_internal(CPUARMState *env,
>
>  done_generating:
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>
>  #ifdef DEBUG_DISAS
>      if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
> @@ -9974,7 +9974,7 @@ done_generating:
>      }
>  #endif
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-cris/translate.c b/target-cris/translate.c
> index 27b82cf..e34288e 100644
> --- a/target-cris/translate.c
> +++ b/target-cris/translate.c
> @@ -3297,7 +3297,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
>          check_breakpoint(env, dc);
>
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j) {
> @@ -3381,7 +3381,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
>              break;
>          }
>      } while (!dc->is_jmp && !dc->cpustate_changed
> -            && gen_opc_ptr < gen_opc_end
> +            && tcg_ctx.gen_opc_ptr < gen_opc_end
>              && !singlestep
>              && (dc->pc < next_page_start)
>              && num_insns < max_insns);
> @@ -3434,9 +3434,9 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
>          }
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j) {
>              gen_opc_instr_start[lj++] = 0;
> @@ -3452,7 +3452,7 @@ gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
>          log_target_disas(pc_start, dc->pc - pc_start,
>                                   dc->env->pregs[PR_VR]);
>          qemu_log("\nisize=%d osize=%td\n",
> -            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
> +            dc->pc - pc_start, gtcg_ctx.en_opc_ptr - gen_opc_buf);

Patch is broken:
/src/qemu/target-cris/translate.c: In function 'gen_intermediate_code_internal':
/src/qemu/target-cris/translate.c:3455: error: 'gtcg_ctx' undeclared
(first use in this function)
/src/qemu/target-cris/translate.c:3455: error: (Each undeclared
identifier is reported only once
/src/qemu/target-cris/translate.c:3455: error: for each function it appears in.)

>      }
>  #endif
>  #endif
> diff --git a/target-i386/translate.c b/target-i386/translate.c
> index ee75850..5f977d9 100644
> --- a/target-i386/translate.c
> +++ b/target-i386/translate.c
> @@ -7980,7 +7980,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
>              }
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -8011,7 +8011,7 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
>              break;
>          }
>          /* if too long translation, stop generation too */
> -        if (gen_opc_ptr >= gen_opc_end ||
> +        if (tcg_ctx.gen_opc_ptr >= gen_opc_end ||
>              (pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) ||
>              num_insns >= max_insns) {
>              gen_jmp_im(pc_ptr - dc->cs_base);
> @@ -8027,10 +8027,10 @@ static inline void gen_intermediate_code_internal(CPUX86State *env,
>      if (tb->cflags & CF_LAST_IO)
>          gen_io_end();
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      /* we don't forget to fill the last values */
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-lm32/translate.c b/target-lm32/translate.c
> index 77c2866..7446a50 100644
> --- a/target-lm32/translate.c
> +++ b/target-lm32/translate.c
> @@ -1047,7 +1047,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
>          check_breakpoint(env, dc);
>
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j) {
> @@ -1071,7 +1071,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
>          num_insns++;
>
>      } while (!dc->is_jmp
> -         && gen_opc_ptr < gen_opc_end
> +         && tcg_ctx.gen_opc_ptr < gen_opc_end
>           && !env->singlestep_enabled
>           && !singlestep
>           && (dc->pc < next_page_start)
> @@ -1105,9 +1105,9 @@ static void gen_intermediate_code_internal(CPULM32State *env,
>      }
>
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j) {
>              gen_opc_instr_start[lj++] = 0;
> @@ -1122,7 +1122,7 @@ static void gen_intermediate_code_internal(CPULM32State *env,
>          qemu_log("\n");
>          log_target_disas(pc_start, dc->pc - pc_start, 0);
>          qemu_log("\nisize=%d osize=%td\n",
> -            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
> +            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
>      }
>  #endif
>  }
> diff --git a/target-m68k/translate.c b/target-m68k/translate.c
> index 451ef74..568e187 100644
> --- a/target-m68k/translate.c
> +++ b/target-m68k/translate.c
> @@ -3015,7 +3015,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
>                  break;
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -3030,7 +3030,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
>          dc->insn_pc = dc->pc;
>         disas_m68k_insn(env, dc);
>          num_insns++;
> -    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
> +    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
>               !env->singlestep_enabled &&
>               !singlestep &&
>               (pc_offset) < (TARGET_PAGE_SIZE - 32) &&
> @@ -3064,7 +3064,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
>          }
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>
>  #ifdef DEBUG_DISAS
>      if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
> @@ -3075,7 +3075,7 @@ gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
>      }
>  #endif
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
> index 7d864b1..a3bd799 100644
> --- a/target-microblaze/translate.c
> +++ b/target-microblaze/translate.c
> @@ -1784,7 +1784,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
>          check_breakpoint(env, dc);
>
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -1846,7 +1846,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
>          if (env->singlestep_enabled)
>              break;
>      } while (!dc->is_jmp && !dc->cpustate_changed
> -         && gen_opc_ptr < gen_opc_end
> +         && tcg_ctx.gen_opc_ptr < gen_opc_end
>                   && !singlestep
>           && (dc->pc < next_page_start)
>                   && num_insns < max_insns);
> @@ -1897,9 +1897,9 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
>          }
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> @@ -1916,7 +1916,7 @@ gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
>          log_target_disas(pc_start, dc->pc - pc_start, 0);
>  #endif
>          qemu_log("\nisize=%d osize=%td\n",
> -            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
> +            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
>      }
>  #endif
>  #endif
> diff --git a/target-mips/translate.c b/target-mips/translate.c
> index 8175da0..c86e16e 100644
> --- a/target-mips/translate.c
> +++ b/target-mips/translate.c
> @@ -15545,7 +15545,7 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
>          }
>
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -15593,8 +15593,9 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
>          if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
>              break;
>
> -        if (gen_opc_ptr >= gen_opc_end)
> +        if (tcg_ctx.gen_opc_ptr >= gen_opc_end) {
>              break;
> +        }
>
>          if (num_insns >= max_insns)
>              break;
> @@ -15626,9 +15627,9 @@ gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
>      }
>  done_generating:
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c
> index e2cad3a..db977ca 100644
> --- a/target-openrisc/translate.c
> +++ b/target-openrisc/translate.c
> @@ -1703,7 +1703,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
>      do {
>          check_breakpoint(cpu, dc);
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (k < j) {
>                  k++;
>                  while (k < j) {
> @@ -1744,7 +1744,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
>              }
>          }
>      } while (!dc->is_jmp
> -             && gen_opc_ptr < gen_opc_end
> +             && tcg_ctx.gen_opc_ptr < gen_opc_end
>               && !cpu->env.singlestep_enabled
>               && !singlestep
>               && (dc->pc < next_page_start)
> @@ -1782,9 +1782,9 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
>      }
>
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          k++;
>          while (k <= j) {
>              gen_opc_instr_start[k++] = 0;
> @@ -1799,7 +1799,7 @@ static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
>          qemu_log("\n");
>          log_target_disas(pc_start, dc->pc - pc_start, 0);
>          qemu_log("\nisize=%d osize=%td\n",
> -            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
> +            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
>      }
>  #endif
>  }
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 56725e6..d30abd0 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -9664,7 +9664,8 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
>
>      gen_icount_start();
>      /* Set env in case of segfault during code fetch */
> -    while (ctx.exception == POWERPC_EXCP_NONE && gen_opc_ptr < gen_opc_end) {
> +    while (ctx.exception == POWERPC_EXCP_NONE
> +            && tcg_ctx.gen_opc_ptr < gen_opc_end) {
>          if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
>              QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
>                  if (bp->pc == ctx.nip) {
> @@ -9674,7 +9675,7 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
>              }
>          }
>          if (unlikely(search_pc)) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -9774,9 +9775,9 @@ static inline void gen_intermediate_code_internal(CPUPPCState *env,
>          tcg_gen_exit_tb(0);
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (unlikely(search_pc)) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-s390x/translate.c b/target-s390x/translate.c
> index db464cc..85ba318 100644
> --- a/target-s390x/translate.c
> +++ b/target-s390x/translate.c
> @@ -5156,7 +5156,7 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
>              }
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j) {
> @@ -5182,7 +5182,8 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
>          if (env->singlestep_enabled) {
>              gen_debug(&dc);
>          }
> -    } while (!dc.is_jmp && gen_opc_ptr < gen_opc_end && dc.pc < next_page_start
> +    } while (!dc.is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end
> +             && dc.pc < next_page_start
>               && num_insns < max_insns && !env->singlestep_enabled
>               && !singlestep);
>
> @@ -5206,9 +5207,9 @@ static inline void gen_intermediate_code_internal(CPUS390XState *env,
>          tcg_gen_exit_tb(0);
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j) {
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-sh4/translate.c b/target-sh4/translate.c
> index 9d955eb..4521c1c 100644
> --- a/target-sh4/translate.c
> +++ b/target-sh4/translate.c
> @@ -1986,7 +1986,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
>      if (max_insns == 0)
>          max_insns = CF_COUNT_MASK;
>      gen_icount_start();
> -    while (ctx.bstate == BS_NONE && gen_opc_ptr < gen_opc_end) {
> +    while (ctx.bstate == BS_NONE && tcg_ctx.gen_opc_ptr < gen_opc_end) {
>          if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
>              QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
>                  if (ctx.pc == bp->pc) {
> @@ -1999,7 +1999,7 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
>             }
>         }
>          if (search_pc) {
> -            i = gen_opc_ptr - gen_opc_buf;
> +            i = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (ii < i) {
>                  ii++;
>                  while (ii < i)
> @@ -2056,9 +2056,9 @@ gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
>      }
>
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (search_pc) {
> -        i = gen_opc_ptr - gen_opc_buf;
> +        i = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          ii++;
>          while (ii <= i)
>              gen_opc_instr_start[ii++] = 0;
> diff --git a/target-sparc/translate.c b/target-sparc/translate.c
> index 9e46f14..d179675 100644
> --- a/target-sparc/translate.c
> +++ b/target-sparc/translate.c
> @@ -5279,7 +5279,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
>          }
>          if (spc) {
>              qemu_log("Search PC...\n");
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j)
> @@ -5312,7 +5312,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
>          if (dc->singlestep) {
>              break;
>          }
> -    } while ((gen_opc_ptr < gen_opc_end) &&
> +    } while ((tcg_ctx.gen_opc_ptr < gen_opc_end) &&
>               (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
>               num_insns < max_insns);
>
> @@ -5334,9 +5334,9 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
>          }
>      }
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>      if (spc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j)
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c
> index c3cdafa..79bc431 100644
> --- a/target-unicore32/translate.c
> +++ b/target-unicore32/translate.c
> @@ -1999,7 +1999,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
>              }
>          }
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j) {
> @@ -2031,7 +2031,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
>           * Also stop translation when a page boundary is reached.  This
>           * ensures prefetch aborts occur at the right place.  */
>          num_insns++;
> -    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
> +    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
>               !env->singlestep_enabled &&
>               !singlestep &&
>               dc->pc < next_page_start &&
> @@ -2103,7 +2103,7 @@ static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
>
>  done_generating:
>      gen_icount_end(tb, num_insns);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>
>  #ifdef DEBUG_DISAS
>      if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
> @@ -2114,7 +2114,7 @@ done_generating:
>      }
>  #endif
>      if (search_pc) {
> -        j = gen_opc_ptr - gen_opc_buf;
> +        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>          lj++;
>          while (lj <= j) {
>              gen_opc_instr_start[lj++] = 0;
> diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
> index 82e8ccc..c7971bc 100644
> --- a/target-xtensa/translate.c
> +++ b/target-xtensa/translate.c
> @@ -2893,7 +2893,7 @@ static void gen_intermediate_code_internal(
>          check_breakpoint(env, &dc);
>
>          if (search_pc) {
> -            j = gen_opc_ptr - gen_opc_buf;
> +            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
>              if (lj < j) {
>                  lj++;
>                  while (lj < j) {
> @@ -2944,7 +2944,7 @@ static void gen_intermediate_code_internal(
>      } while (dc.is_jmp == DISAS_NEXT &&
>              insn_count < max_insns &&
>              dc.pc < next_page_start &&
> -            gen_opc_ptr < gen_opc_end);
> +            tcg_ctx.gen_opc_ptr < gen_opc_end);
>
>      reset_litbase(&dc);
>      reset_sar_tracker(&dc);
> @@ -2960,7 +2960,7 @@ static void gen_intermediate_code_internal(
>          gen_jumpi(&dc, dc.pc, 0);
>      }
>      gen_icount_end(tb, insn_count);
> -    *gen_opc_ptr = INDEX_op_end;
> +    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
>
>      if (!search_pc) {
>          tb->size = dc.pc - pc_start;
> diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
> index 8d1da2b..9bc890f 100644
> --- a/tcg/tcg-op.h
> +++ b/tcg/tcg-op.h
> @@ -27,58 +27,58 @@ int gen_new_label(void);
>
>  static inline void tcg_gen_op0(TCGOpcode opc)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>  }
>
>  static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>  }
>
>  static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>  }
>
>  static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = arg1;
>  }
>
>  static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>  }
>
>  static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>  }
>
>  static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = arg2;
>  }
>
>  static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = arg2;
>  }
>
>  static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = arg1;
>      *gen_opparam_ptr++ = arg2;
>  }
> @@ -86,7 +86,7 @@ static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
>  static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                     TCGv_i32 arg3)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -95,7 +95,7 @@ static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>  static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                     TCGv_i64 arg3)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -104,7 +104,7 @@ static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>  static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
>                                      TCGv_i32 arg2, TCGArg arg3)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = arg3;
> @@ -113,7 +113,7 @@ static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
>  static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
>                                      TCGv_i64 arg2, TCGArg arg3)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = arg3;
> @@ -122,7 +122,7 @@ static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
>  static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
>                                         TCGv_ptr base, TCGArg offset)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(val);
>      *gen_opparam_ptr++ = GET_TCGV_PTR(base);
>      *gen_opparam_ptr++ = offset;
> @@ -131,7 +131,7 @@ static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
>  static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
>                                         TCGv_ptr base, TCGArg offset)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(val);
>      *gen_opparam_ptr++ = GET_TCGV_PTR(base);
>      *gen_opparam_ptr++ = offset;
> @@ -140,7 +140,7 @@ static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
>  static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
>                                                  TCGv_i32 addr, TCGArg mem_index)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(val);
>      *gen_opparam_ptr++ = GET_TCGV_I32(addr);
>      *gen_opparam_ptr++ = mem_index;
> @@ -149,7 +149,7 @@ static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
>  static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
>                                                  TCGv_i64 addr, TCGArg mem_index)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(val);
>      *gen_opparam_ptr++ = GET_TCGV_I64(addr);
>      *gen_opparam_ptr++ = mem_index;
> @@ -158,7 +158,7 @@ static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
>  static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                     TCGv_i32 arg3, TCGv_i32 arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -168,7 +168,7 @@ static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>  static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                     TCGv_i64 arg3, TCGv_i64 arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -178,7 +178,7 @@ static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>  static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                      TCGv_i32 arg3, TCGArg arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -188,7 +188,7 @@ static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>  static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                      TCGv_i64 arg3, TCGArg arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -198,7 +198,7 @@ static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>  static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                       TCGArg arg3, TCGArg arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = arg3;
> @@ -208,7 +208,7 @@ static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2
>  static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                       TCGArg arg3, TCGArg arg4)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = arg3;
> @@ -218,7 +218,7 @@ static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2
>  static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                     TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -229,7 +229,7 @@ static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>  static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                     TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -240,7 +240,7 @@ static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>  static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                      TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -251,7 +251,7 @@ static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>  static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                      TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -263,7 +263,7 @@ static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
>                                       TCGv_i32 arg2, TCGv_i32 arg3,
>                                       TCGArg arg4, TCGArg arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -275,7 +275,7 @@ static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
>                                       TCGv_i64 arg2, TCGv_i64 arg3,
>                                       TCGArg arg4, TCGArg arg5)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -287,7 +287,7 @@ static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                     TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
>                                     TCGv_i32 arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -300,7 +300,7 @@ static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                     TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
>                                     TCGv_i64 arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -313,7 +313,7 @@ static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
>                                      TCGv_i32 arg3, TCGv_i32 arg4,
>                                      TCGv_i32 arg5, TCGArg arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -326,7 +326,7 @@ static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
>                                      TCGv_i64 arg3, TCGv_i64 arg4,
>                                      TCGv_i64 arg5, TCGArg arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> @@ -339,7 +339,7 @@ static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
>                                       TCGv_i32 arg2, TCGv_i32 arg3,
>                                       TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
> @@ -352,7 +352,7 @@ static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
>                                       TCGv_i64 arg2, TCGv_i64 arg3,
>                                       TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
>  {
> -    *gen_opc_ptr++ = opc;
> +    *tcg_ctx.gen_opc_ptr++ = opc;
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
>      *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 42052db..9a41b58 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -297,7 +297,7 @@ void tcg_func_start(TCGContext *s)
>      s->goto_tb_issue_mask = 0;
>  #endif
>
> -    gen_opc_ptr = gen_opc_buf;
> +    s->gen_opc_ptr = gen_opc_buf;
>      gen_opparam_ptr = gen_opparam_buf;
>
>  #if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU)
> @@ -641,7 +641,7 @@ void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
>      }
>  #endif /* TCG_TARGET_EXTEND_ARGS */
>
> -    *gen_opc_ptr++ = INDEX_op_call;
> +    *s->gen_opc_ptr++ = INDEX_op_call;
>      nparam = gen_opparam_ptr++;
>      if (ret != TCG_CALL_DUMMY_ARG) {
>  #if TCG_TARGET_REG_BITS < 64
> @@ -898,7 +898,7 @@ void tcg_dump_ops(TCGContext *s)
>      first_insn = 1;
>      opc_ptr = gen_opc_buf;
>      args = gen_opparam_buf;
> -    while (opc_ptr < gen_opc_ptr) {
> +    while (opc_ptr < s->gen_opc_ptr) {
>          c = *opc_ptr++;
>          def = &tcg_op_defs[c];
>          if (c == INDEX_op_debug_insn_start) {
> @@ -1229,9 +1229,9 @@ static void tcg_liveness_analysis(TCGContext *s)
>      uint16_t dead_args;
>      uint8_t sync_args;
>
> -    gen_opc_ptr++; /* skip end */
> +    s->gen_opc_ptr++; /* skip end */
>
> -    nb_ops = gen_opc_ptr - gen_opc_buf;
> +    nb_ops = s->gen_opc_ptr - gen_opc_buf;
>
>      s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
>      s->op_sync_args = tcg_malloc(nb_ops * sizeof(uint8_t));
> @@ -1448,7 +1448,7 @@ static void tcg_liveness_analysis(TCGContext *s)
>  static void tcg_liveness_analysis(TCGContext *s)
>  {
>      int nb_ops;
> -    nb_ops = gen_opc_ptr - gen_opc_buf;
> +    nb_ops = s->gen_opc_ptr - gen_opc_buf;
>
>      s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
>      memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t));
> @@ -2222,7 +2222,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
>
>  #ifdef USE_TCG_OPTIMIZATIONS
>      gen_opparam_ptr =
> -        tcg_optimize(s, gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
> +        tcg_optimize(s, s->gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
>  #endif
>
>  #ifdef CONFIG_PROFILER
> @@ -2334,7 +2334,7 @@ int tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf)
>  #ifdef CONFIG_PROFILER
>      {
>          int n;
> -        n = (gen_opc_ptr - gen_opc_buf);
> +        n = (s->gen_opc_ptr - gen_opc_buf);
>          s->op_count += n;
>          if (n > s->op_count_max)
>              s->op_count_max = n;
> --
> 1.7.9.5
>
diff mbox

Patch

diff --git a/target-alpha/translate.c b/target-alpha/translate.c
index f707d8d..6676cbf 100644
--- a/target-alpha/translate.c
+++ b/target-alpha/translate.c
@@ -3406,7 +3406,7 @@  static inline void gen_intermediate_code_internal(CPUAlphaState *env,
             }
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -3432,7 +3432,7 @@  static inline void gen_intermediate_code_internal(CPUAlphaState *env,
            or exhaust instruction count, stop generation.  */
         if (ret == NO_EXIT
             && ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0
-                || gen_opc_ptr >= gen_opc_end
+                || tcg_ctx.gen_opc_ptr >= gen_opc_end
                 || num_insns >= max_insns
                 || singlestep
                 || env->singlestep_enabled)) {
@@ -3463,9 +3463,9 @@  static inline void gen_intermediate_code_internal(CPUAlphaState *env,
     }
 
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-arm/translate.c b/target-arm/translate.c
index 25433da..ff5d294 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -9834,7 +9834,7 @@  static inline void gen_intermediate_code_internal(CPUARMState *env,
             }
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -9881,7 +9881,7 @@  static inline void gen_intermediate_code_internal(CPUARMState *env,
          * Also stop translation when a page boundary is reached.  This
          * ensures prefetch aborts occur at the right place.  */
         num_insns ++;
-    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
              !env->singlestep_enabled &&
              !singlestep &&
              dc->pc < next_page_start &&
@@ -9962,7 +9962,7 @@  static inline void gen_intermediate_code_internal(CPUARMState *env,
 
 done_generating:
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
 
 #ifdef DEBUG_DISAS
     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -9974,7 +9974,7 @@  done_generating:
     }
 #endif
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-cris/translate.c b/target-cris/translate.c
index 27b82cf..e34288e 100644
--- a/target-cris/translate.c
+++ b/target-cris/translate.c
@@ -3297,7 +3297,7 @@  gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
         check_breakpoint(env, dc);
 
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j) {
@@ -3381,7 +3381,7 @@  gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
             break;
         }
     } while (!dc->is_jmp && !dc->cpustate_changed
-            && gen_opc_ptr < gen_opc_end
+            && tcg_ctx.gen_opc_ptr < gen_opc_end
             && !singlestep
             && (dc->pc < next_page_start)
             && num_insns < max_insns);
@@ -3434,9 +3434,9 @@  gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
         }
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j) {
             gen_opc_instr_start[lj++] = 0;
@@ -3452,7 +3452,7 @@  gen_intermediate_code_internal(CPUCRISState *env, TranslationBlock *tb,
         log_target_disas(pc_start, dc->pc - pc_start,
                                  dc->env->pregs[PR_VR]);
         qemu_log("\nisize=%d osize=%td\n",
-            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+            dc->pc - pc_start, gtcg_ctx.en_opc_ptr - gen_opc_buf);
     }
 #endif
 #endif
diff --git a/target-i386/translate.c b/target-i386/translate.c
index ee75850..5f977d9 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -7980,7 +7980,7 @@  static inline void gen_intermediate_code_internal(CPUX86State *env,
             }
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -8011,7 +8011,7 @@  static inline void gen_intermediate_code_internal(CPUX86State *env,
             break;
         }
         /* if too long translation, stop generation too */
-        if (gen_opc_ptr >= gen_opc_end ||
+        if (tcg_ctx.gen_opc_ptr >= gen_opc_end ||
             (pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) ||
             num_insns >= max_insns) {
             gen_jmp_im(pc_ptr - dc->cs_base);
@@ -8027,10 +8027,10 @@  static inline void gen_intermediate_code_internal(CPUX86State *env,
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     /* we don't forget to fill the last values */
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-lm32/translate.c b/target-lm32/translate.c
index 77c2866..7446a50 100644
--- a/target-lm32/translate.c
+++ b/target-lm32/translate.c
@@ -1047,7 +1047,7 @@  static void gen_intermediate_code_internal(CPULM32State *env,
         check_breakpoint(env, dc);
 
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j) {
@@ -1071,7 +1071,7 @@  static void gen_intermediate_code_internal(CPULM32State *env,
         num_insns++;
 
     } while (!dc->is_jmp
-         && gen_opc_ptr < gen_opc_end
+         && tcg_ctx.gen_opc_ptr < gen_opc_end
          && !env->singlestep_enabled
          && !singlestep
          && (dc->pc < next_page_start)
@@ -1105,9 +1105,9 @@  static void gen_intermediate_code_internal(CPULM32State *env,
     }
 
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j) {
             gen_opc_instr_start[lj++] = 0;
@@ -1122,7 +1122,7 @@  static void gen_intermediate_code_internal(CPULM32State *env,
         qemu_log("\n");
         log_target_disas(pc_start, dc->pc - pc_start, 0);
         qemu_log("\nisize=%d osize=%td\n",
-            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
     }
 #endif
 }
diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 451ef74..568e187 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -3015,7 +3015,7 @@  gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
                 break;
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -3030,7 +3030,7 @@  gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
         dc->insn_pc = dc->pc;
 	disas_m68k_insn(env, dc);
         num_insns++;
-    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
              !env->singlestep_enabled &&
              !singlestep &&
              (pc_offset) < (TARGET_PAGE_SIZE - 32) &&
@@ -3064,7 +3064,7 @@  gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
         }
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
 
 #ifdef DEBUG_DISAS
     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -3075,7 +3075,7 @@  gen_intermediate_code_internal(CPUM68KState *env, TranslationBlock *tb,
     }
 #endif
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c
index 7d864b1..a3bd799 100644
--- a/target-microblaze/translate.c
+++ b/target-microblaze/translate.c
@@ -1784,7 +1784,7 @@  gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
         check_breakpoint(env, dc);
 
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -1846,7 +1846,7 @@  gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
         if (env->singlestep_enabled)
             break;
     } while (!dc->is_jmp && !dc->cpustate_changed
-         && gen_opc_ptr < gen_opc_end
+         && tcg_ctx.gen_opc_ptr < gen_opc_end
                  && !singlestep
          && (dc->pc < next_page_start)
                  && num_insns < max_insns);
@@ -1897,9 +1897,9 @@  gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
         }
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
@@ -1916,7 +1916,7 @@  gen_intermediate_code_internal(CPUMBState *env, TranslationBlock *tb,
         log_target_disas(pc_start, dc->pc - pc_start, 0);
 #endif
         qemu_log("\nisize=%d osize=%td\n",
-            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
     }
 #endif
 #endif
diff --git a/target-mips/translate.c b/target-mips/translate.c
index 8175da0..c86e16e 100644
--- a/target-mips/translate.c
+++ b/target-mips/translate.c
@@ -15545,7 +15545,7 @@  gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
         }
 
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -15593,8 +15593,9 @@  gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
         if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
             break;
 
-        if (gen_opc_ptr >= gen_opc_end)
+        if (tcg_ctx.gen_opc_ptr >= gen_opc_end) {
             break;
+        }
 
         if (num_insns >= max_insns)
             break;
@@ -15626,9 +15627,9 @@  gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
     }
 done_generating:
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c
index e2cad3a..db977ca 100644
--- a/target-openrisc/translate.c
+++ b/target-openrisc/translate.c
@@ -1703,7 +1703,7 @@  static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
     do {
         check_breakpoint(cpu, dc);
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (k < j) {
                 k++;
                 while (k < j) {
@@ -1744,7 +1744,7 @@  static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
             }
         }
     } while (!dc->is_jmp
-             && gen_opc_ptr < gen_opc_end
+             && tcg_ctx.gen_opc_ptr < gen_opc_end
              && !cpu->env.singlestep_enabled
              && !singlestep
              && (dc->pc < next_page_start)
@@ -1782,9 +1782,9 @@  static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
     }
 
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         k++;
         while (k <= j) {
             gen_opc_instr_start[k++] = 0;
@@ -1799,7 +1799,7 @@  static inline void gen_intermediate_code_internal(OpenRISCCPU *cpu,
         qemu_log("\n");
         log_target_disas(pc_start, dc->pc - pc_start, 0);
         qemu_log("\nisize=%d osize=%td\n",
-            dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
+            dc->pc - pc_start, tcg_ctx.gen_opc_ptr - gen_opc_buf);
     }
 #endif
 }
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 56725e6..d30abd0 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -9664,7 +9664,8 @@  static inline void gen_intermediate_code_internal(CPUPPCState *env,
 
     gen_icount_start();
     /* Set env in case of segfault during code fetch */
-    while (ctx.exception == POWERPC_EXCP_NONE && gen_opc_ptr < gen_opc_end) {
+    while (ctx.exception == POWERPC_EXCP_NONE
+            && tcg_ctx.gen_opc_ptr < gen_opc_end) {
         if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
             QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
                 if (bp->pc == ctx.nip) {
@@ -9674,7 +9675,7 @@  static inline void gen_intermediate_code_internal(CPUPPCState *env,
             }
         }
         if (unlikely(search_pc)) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -9774,9 +9775,9 @@  static inline void gen_intermediate_code_internal(CPUPPCState *env,
         tcg_gen_exit_tb(0);
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (unlikely(search_pc)) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-s390x/translate.c b/target-s390x/translate.c
index db464cc..85ba318 100644
--- a/target-s390x/translate.c
+++ b/target-s390x/translate.c
@@ -5156,7 +5156,7 @@  static inline void gen_intermediate_code_internal(CPUS390XState *env,
             }
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j) {
@@ -5182,7 +5182,8 @@  static inline void gen_intermediate_code_internal(CPUS390XState *env,
         if (env->singlestep_enabled) {
             gen_debug(&dc);
         }
-    } while (!dc.is_jmp && gen_opc_ptr < gen_opc_end && dc.pc < next_page_start
+    } while (!dc.is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end
+             && dc.pc < next_page_start
              && num_insns < max_insns && !env->singlestep_enabled
              && !singlestep);
 
@@ -5206,9 +5207,9 @@  static inline void gen_intermediate_code_internal(CPUS390XState *env,
         tcg_gen_exit_tb(0);
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j) {
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-sh4/translate.c b/target-sh4/translate.c
index 9d955eb..4521c1c 100644
--- a/target-sh4/translate.c
+++ b/target-sh4/translate.c
@@ -1986,7 +1986,7 @@  gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
     if (max_insns == 0)
         max_insns = CF_COUNT_MASK;
     gen_icount_start();
-    while (ctx.bstate == BS_NONE && gen_opc_ptr < gen_opc_end) {
+    while (ctx.bstate == BS_NONE && tcg_ctx.gen_opc_ptr < gen_opc_end) {
         if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
             QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
                 if (ctx.pc == bp->pc) {
@@ -1999,7 +1999,7 @@  gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
 	    }
 	}
         if (search_pc) {
-            i = gen_opc_ptr - gen_opc_buf;
+            i = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (ii < i) {
                 ii++;
                 while (ii < i)
@@ -2056,9 +2056,9 @@  gen_intermediate_code_internal(CPUSH4State * env, TranslationBlock * tb,
     }
 
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (search_pc) {
-        i = gen_opc_ptr - gen_opc_buf;
+        i = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         ii++;
         while (ii <= i)
             gen_opc_instr_start[ii++] = 0;
diff --git a/target-sparc/translate.c b/target-sparc/translate.c
index 9e46f14..d179675 100644
--- a/target-sparc/translate.c
+++ b/target-sparc/translate.c
@@ -5279,7 +5279,7 @@  static inline void gen_intermediate_code_internal(TranslationBlock * tb,
         }
         if (spc) {
             qemu_log("Search PC...\n");
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j)
@@ -5312,7 +5312,7 @@  static inline void gen_intermediate_code_internal(TranslationBlock * tb,
         if (dc->singlestep) {
             break;
         }
-    } while ((gen_opc_ptr < gen_opc_end) &&
+    } while ((tcg_ctx.gen_opc_ptr < gen_opc_end) &&
              (dc->pc - pc_start) < (TARGET_PAGE_SIZE - 32) &&
              num_insns < max_insns);
 
@@ -5334,9 +5334,9 @@  static inline void gen_intermediate_code_internal(TranslationBlock * tb,
         }
     }
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
     if (spc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c
index c3cdafa..79bc431 100644
--- a/target-unicore32/translate.c
+++ b/target-unicore32/translate.c
@@ -1999,7 +1999,7 @@  static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
             }
         }
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j) {
@@ -2031,7 +2031,7 @@  static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
          * Also stop translation when a page boundary is reached.  This
          * ensures prefetch aborts occur at the right place.  */
         num_insns++;
-    } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
+    } while (!dc->is_jmp && tcg_ctx.gen_opc_ptr < gen_opc_end &&
              !env->singlestep_enabled &&
              !singlestep &&
              dc->pc < next_page_start &&
@@ -2103,7 +2103,7 @@  static inline void gen_intermediate_code_internal(CPUUniCore32State *env,
 
 done_generating:
     gen_icount_end(tb, num_insns);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
 
 #ifdef DEBUG_DISAS
     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
@@ -2114,7 +2114,7 @@  done_generating:
     }
 #endif
     if (search_pc) {
-        j = gen_opc_ptr - gen_opc_buf;
+        j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
         lj++;
         while (lj <= j) {
             gen_opc_instr_start[lj++] = 0;
diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c
index 82e8ccc..c7971bc 100644
--- a/target-xtensa/translate.c
+++ b/target-xtensa/translate.c
@@ -2893,7 +2893,7 @@  static void gen_intermediate_code_internal(
         check_breakpoint(env, &dc);
 
         if (search_pc) {
-            j = gen_opc_ptr - gen_opc_buf;
+            j = tcg_ctx.gen_opc_ptr - gen_opc_buf;
             if (lj < j) {
                 lj++;
                 while (lj < j) {
@@ -2944,7 +2944,7 @@  static void gen_intermediate_code_internal(
     } while (dc.is_jmp == DISAS_NEXT &&
             insn_count < max_insns &&
             dc.pc < next_page_start &&
-            gen_opc_ptr < gen_opc_end);
+            tcg_ctx.gen_opc_ptr < gen_opc_end);
 
     reset_litbase(&dc);
     reset_sar_tracker(&dc);
@@ -2960,7 +2960,7 @@  static void gen_intermediate_code_internal(
         gen_jumpi(&dc, dc.pc, 0);
     }
     gen_icount_end(tb, insn_count);
-    *gen_opc_ptr = INDEX_op_end;
+    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
 
     if (!search_pc) {
         tb->size = dc.pc - pc_start;
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 8d1da2b..9bc890f 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -27,58 +27,58 @@  int gen_new_label(void);
 
 static inline void tcg_gen_op0(TCGOpcode opc)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
 }
 
 static inline void tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 arg1)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
 }
 
 static inline void tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 arg1)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
 }
 
 static inline void tcg_gen_op1i(TCGOpcode opc, TCGArg arg1)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = arg1;
 }
 
 static inline void tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
 }
 
 static inline void tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
 }
 
 static inline void tcg_gen_op2i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGArg arg2)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = arg2;
 }
 
 static inline void tcg_gen_op2i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGArg arg2)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = arg2;
 }
 
 static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = arg1;
     *gen_opparam_ptr++ = arg2;
 }
@@ -86,7 +86,7 @@  static inline void tcg_gen_op2ii(TCGOpcode opc, TCGArg arg1, TCGArg arg2)
 static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                    TCGv_i32 arg3)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -95,7 +95,7 @@  static inline void tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
 static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                    TCGv_i64 arg3)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -104,7 +104,7 @@  static inline void tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
 static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
                                     TCGv_i32 arg2, TCGArg arg3)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = arg3;
@@ -113,7 +113,7 @@  static inline void tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 arg1,
 static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
                                     TCGv_i64 arg2, TCGArg arg3)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = arg3;
@@ -122,7 +122,7 @@  static inline void tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 arg1,
 static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
                                        TCGv_ptr base, TCGArg offset)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(val);
     *gen_opparam_ptr++ = GET_TCGV_PTR(base);
     *gen_opparam_ptr++ = offset;
@@ -131,7 +131,7 @@  static inline void tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
 static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
                                        TCGv_ptr base, TCGArg offset)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(val);
     *gen_opparam_ptr++ = GET_TCGV_PTR(base);
     *gen_opparam_ptr++ = offset;
@@ -140,7 +140,7 @@  static inline void tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
 static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
                                                 TCGv_i32 addr, TCGArg mem_index)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(val);
     *gen_opparam_ptr++ = GET_TCGV_I32(addr);
     *gen_opparam_ptr++ = mem_index;
@@ -149,7 +149,7 @@  static inline void tcg_gen_qemu_ldst_op_i64_i32(TCGOpcode opc, TCGv_i64 val,
 static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
                                                 TCGv_i64 addr, TCGArg mem_index)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(val);
     *gen_opparam_ptr++ = GET_TCGV_I64(addr);
     *gen_opparam_ptr++ = mem_index;
@@ -158,7 +158,7 @@  static inline void tcg_gen_qemu_ldst_op_i64_i64(TCGOpcode opc, TCGv_i64 val,
 static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                    TCGv_i32 arg3, TCGv_i32 arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -168,7 +168,7 @@  static inline void tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
 static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                    TCGv_i64 arg3, TCGv_i64 arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -178,7 +178,7 @@  static inline void tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
 static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                     TCGv_i32 arg3, TCGArg arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -188,7 +188,7 @@  static inline void tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
 static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                     TCGv_i64 arg3, TCGArg arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -198,7 +198,7 @@  static inline void tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
 static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                      TCGArg arg3, TCGArg arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = arg3;
@@ -208,7 +208,7 @@  static inline void tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2
 static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                      TCGArg arg3, TCGArg arg4)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = arg3;
@@ -218,7 +218,7 @@  static inline void tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2
 static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                    TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -229,7 +229,7 @@  static inline void tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
 static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                    TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -240,7 +240,7 @@  static inline void tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
 static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                     TCGv_i32 arg3, TCGv_i32 arg4, TCGArg arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -251,7 +251,7 @@  static inline void tcg_gen_op5i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
 static inline void tcg_gen_op5i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                     TCGv_i64 arg3, TCGv_i64 arg4, TCGArg arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -263,7 +263,7 @@  static inline void tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 arg1,
                                      TCGv_i32 arg2, TCGv_i32 arg3,
                                      TCGArg arg4, TCGArg arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -275,7 +275,7 @@  static inline void tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 arg1,
                                      TCGv_i64 arg2, TCGv_i64 arg3,
                                      TCGArg arg4, TCGArg arg5)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -287,7 +287,7 @@  static inline void tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                    TCGv_i32 arg3, TCGv_i32 arg4, TCGv_i32 arg5,
                                    TCGv_i32 arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -300,7 +300,7 @@  static inline void tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                    TCGv_i64 arg3, TCGv_i64 arg4, TCGv_i64 arg5,
                                    TCGv_i64 arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -313,7 +313,7 @@  static inline void tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 arg1, TCGv_i32 arg2,
                                     TCGv_i32 arg3, TCGv_i32 arg4,
                                     TCGv_i32 arg5, TCGArg arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -326,7 +326,7 @@  static inline void tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 arg1, TCGv_i64 arg2,
                                     TCGv_i64 arg3, TCGv_i64 arg4,
                                     TCGv_i64 arg5, TCGArg arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
@@ -339,7 +339,7 @@  static inline void tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 arg1,
                                      TCGv_i32 arg2, TCGv_i32 arg3,
                                      TCGv_i32 arg4, TCGArg arg5, TCGArg arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I32(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I32(arg3);
@@ -352,7 +352,7 @@  static inline void tcg_gen_op6ii_i64(TCGOpcode opc, TCGv_i64 arg1,
                                      TCGv_i64 arg2, TCGv_i64 arg3,
                                      TCGv_i64 arg4, TCGArg arg5, TCGArg arg6)
 {
-    *gen_opc_ptr++ = opc;
+    *tcg_ctx.gen_opc_ptr++ = opc;
     *gen_opparam_ptr++ = GET_TCGV_I64(arg1);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg2);
     *gen_opparam_ptr++ = GET_TCGV_I64(arg3);
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 42052db..9a41b58 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -297,7 +297,7 @@  void tcg_func_start(TCGContext *s)
     s->goto_tb_issue_mask = 0;
 #endif
 
-    gen_opc_ptr = gen_opc_buf;
+    s->gen_opc_ptr = gen_opc_buf;
     gen_opparam_ptr = gen_opparam_buf;
 
 #if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU)
@@ -641,7 +641,7 @@  void tcg_gen_callN(TCGContext *s, TCGv_ptr func, unsigned int flags,
     }
 #endif /* TCG_TARGET_EXTEND_ARGS */
 
-    *gen_opc_ptr++ = INDEX_op_call;
+    *s->gen_opc_ptr++ = INDEX_op_call;
     nparam = gen_opparam_ptr++;
     if (ret != TCG_CALL_DUMMY_ARG) {
 #if TCG_TARGET_REG_BITS < 64
@@ -898,7 +898,7 @@  void tcg_dump_ops(TCGContext *s)
     first_insn = 1;
     opc_ptr = gen_opc_buf;
     args = gen_opparam_buf;
-    while (opc_ptr < gen_opc_ptr) {
+    while (opc_ptr < s->gen_opc_ptr) {
         c = *opc_ptr++;
         def = &tcg_op_defs[c];
         if (c == INDEX_op_debug_insn_start) {
@@ -1229,9 +1229,9 @@  static void tcg_liveness_analysis(TCGContext *s)
     uint16_t dead_args;
     uint8_t sync_args;
     
-    gen_opc_ptr++; /* skip end */
+    s->gen_opc_ptr++; /* skip end */
 
-    nb_ops = gen_opc_ptr - gen_opc_buf;
+    nb_ops = s->gen_opc_ptr - gen_opc_buf;
 
     s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
     s->op_sync_args = tcg_malloc(nb_ops * sizeof(uint8_t));
@@ -1448,7 +1448,7 @@  static void tcg_liveness_analysis(TCGContext *s)
 static void tcg_liveness_analysis(TCGContext *s)
 {
     int nb_ops;
-    nb_ops = gen_opc_ptr - gen_opc_buf;
+    nb_ops = s->gen_opc_ptr - gen_opc_buf;
 
     s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
     memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t));
@@ -2222,7 +2222,7 @@  static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
 
 #ifdef USE_TCG_OPTIMIZATIONS
     gen_opparam_ptr =
-        tcg_optimize(s, gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
+        tcg_optimize(s, s->gen_opc_ptr, gen_opparam_buf, tcg_op_defs);
 #endif
 
 #ifdef CONFIG_PROFILER
@@ -2334,7 +2334,7 @@  int tcg_gen_code(TCGContext *s, uint8_t *gen_code_buf)
 #ifdef CONFIG_PROFILER
     {
         int n;
-        n = (gen_opc_ptr - gen_opc_buf);
+        n = (s->gen_opc_ptr - gen_opc_buf);
         s->op_count += n;
         if (n > s->op_count_max)
             s->op_count_max = n;