18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *  Host code generation
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *  Copyright (c) 2003 Fabrice Bellard
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is free software; you can redistribute it and/or
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * modify it under the terms of the GNU Lesser General Public
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * License as published by the Free Software Foundation; either
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This library is distributed in the hope that it will be useful,
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lesser General Public License for more details.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * You should have received a copy of the GNU Lesser General Public
172910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner * License along with this library; if not, see <http://www.gnu.org/licenses/>.
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h>
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdio.h>
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <inttypes.h>
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "config.h"
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NO_CPU_IO_DEFS
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "cpu.h"
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "exec-all.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "disas.h"
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg.h"
326a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "qemu-timer.h"
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* code generation context */
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectTCGContext tcg_ctx;
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t gen_opc_buf[OPC_BUF_SIZE];
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectTCGArg gen_opparam_buf[OPPARAM_BUF_SIZE];
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_pc[OPC_BUF_SIZE];
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint16_t gen_opc_icount[OPC_BUF_SIZE];
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint8_t gen_opc_instr_start[OPC_BUF_SIZE];
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(TARGET_I386)
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint8_t gen_opc_cc_op[OPC_BUF_SIZE];
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_SPARC)
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_npc[OPC_BUF_SIZE];
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttarget_ulong gen_opc_jump_pc[2];
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#elif defined(TARGET_MIPS) || defined(TARGET_SH4)
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectuint32_t gen_opc_hflags[OPC_BUF_SIZE];
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK
535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/*
545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * Memchecker code in this module copies TB PC <-> Guest PC map to the TB
555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * descriptor after guest code has been translated in cpu_gen_init routine.
565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine */
575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#include "memcheck/memcheck_api.h"
585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Array of (tb_pc, guest_pc) pairs, big enough for all translations. This
605389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * array is used to obtain guest PC address from a translated PC address.
615389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine * tcg_gen_code_common will fill it up when memchecker is enabled. */
62d9b6cb97a8a9e93f1bbe5351874b03f7faa81783David 'Digit' Turnerstatic void* gen_opc_tpc2gpc[OPC_BUF_SIZE * 2];
63d9b6cb97a8a9e93f1bbe5351874b03f7faa81783David 'Digit' Turnervoid** gen_opc_tpc2gpc_ptr = &gen_opc_tpc2gpc[0];
645389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine/* Number of (tb_pc, guest_pc) pairs stored in gen_opc_tpc2gpc array. */
655389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkineunsigned int gen_opc_tpc2gpc_pairs;
665389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif  // CONFIG_MEMCHECK
675389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* XXX: suppress that */
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned long code_gen_max_block_size(void)
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    static unsigned long max;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (max == 0) {
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        max = TCG_MAX_OP_SIZE;
75f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define DEF(name, iarg, oarg, carg, flags) DEF2((iarg) + (oarg) + (carg))
76f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#define DEF2(copy_size) max = (copy_size > max) ? copy_size : max;
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "tcg-opc.h"
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef DEF
79f1d9bf153726533acf659efd796aa484dfd0b412David 'Digit' Turner#undef DEF2
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        max *= OPC_MAX_SIZE;
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return max;
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid cpu_gen_init(void)
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
885389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    tcg_context_init(&tcg_ctx);
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tcg_set_frame(&tcg_ctx, TCG_AREG0, offsetof(CPUState, temp_buf),
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  CPU_TEMP_BUF_NLONGS * sizeof(long));
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* return non zero if the very first instruction is invalid so that
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   the virtual CPU can trigger an exception.
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   '*gen_code_size_ptr' contains the size of the generated code (host
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   code).
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_gen_code(CPUState *env, TranslationBlock *tb, int *gen_code_size_ptr)
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGContext *s = &tcg_ctx;
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint8_t *gen_code_buf;
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int gen_code_size;
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t ti;
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_count1++; /* includes aborted translations because of
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                       exceptions */
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ti = profile_getclock();
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tcg_func_start(s);
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    gen_intermediate_code(env, tb);
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* generate machine code */
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    gen_code_buf = tb->tc_ptr;
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tb->tb_next_offset[0] = 0xffff;
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tb->tb_next_offset[1] = 0xffff;
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next_offset = tb->tb_next_offset;
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_DIRECT_JUMP
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_jmp_offset = tb->tb_jmp_offset;
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next = NULL;
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* the following two entries are optional (only used for string ops) */
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* XXX: not used ? */
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tb->tb_jmp_offset[2] = 0xffff;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tb->tb_jmp_offset[3] = 0xffff;
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_jmp_offset = NULL;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next = tb->tb_next;
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_count++;
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->interm_time += profile_getclock() - ti;
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->code_time -= profile_getclock();
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    gen_code_size = tcg_gen_code(s, gen_code_buf);
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *gen_code_size_ptr = gen_code_size;
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->code_time += profile_getclock();
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->code_in_len += tb->size;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->code_out_len += gen_code_size;
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1475389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#ifdef CONFIG_MEMCHECK
1485389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    /* Save translated PC -> guest PC map into TB. */
1495389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    if (memcheck_enabled && gen_opc_tpc2gpc_pairs && is_cpu_user(env)) {
1505389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine        tb->tpc2gpc =
1515389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                qemu_malloc(gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong));
1525389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine        if (tb->tpc2gpc != NULL) {
1535389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine            memcpy(tb->tpc2gpc, gen_opc_tpc2gpc_ptr,
1545389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine                   gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong));
1555389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine            tb->tpc2gpc_pairs = gen_opc_tpc2gpc_pairs;
1565389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine        }
1575389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine    }
1585389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine#endif  // CONFIG_MEMCHECK
1595389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG_DISAS
1615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
1625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_log("OUT: [size=%d]\n", *gen_code_size_ptr);
1635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        log_disas(tb->tc_ptr, *gen_code_size_ptr);
1645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_log("\n");
1655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner        qemu_log_flush();
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* The cpu state corresponding to 'searched_pc' is restored.
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint cpu_restore_state(TranslationBlock *tb,
174f645f7d6fd841e39524e5df8c1a7fd8347f92ac1David 'Digit' Turner                      CPUState *env, unsigned long searched_pc)
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TCGContext *s = &tcg_ctx;
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int j;
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned long tc_ptr;
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int64_t ti;
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ti = profile_getclock();
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tcg_func_start(s);
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    gen_intermediate_code_pc(env, tb);
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (use_icount) {
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* Reset the cycle counter to the start of the block.  */
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->icount_decr.u16.low += tb->icount;
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* Clear the IO flag.  */
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        env->can_do_io = 0;
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* find opc index corresponding to search_pc */
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    tc_ptr = (unsigned long)tb->tc_ptr;
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (searched_pc < tc_ptr)
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next_offset = tb->tb_next_offset;
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef USE_DIRECT_JUMP
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_jmp_offset = tb->tb_jmp_offset;
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next = NULL;
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_jmp_offset = NULL;
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->tb_next = tb->tb_next;
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    j = tcg_gen_code_search_pc(s, (uint8_t *)tc_ptr, searched_pc - tc_ptr);
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (j < 0)
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* now find start of instruction before */
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (gen_opc_instr_start[j] == 0)
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        j--;
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    env->icount_decr.u16.low -= gen_opc_icount[j];
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
218d3d4468189618e89f74d8f51b8470f277e000938David 'Digit' Turner    restore_state_to_opc(env, tb, j);
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef CONFIG_PROFILER
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->restore_time += profile_getclock() - ti;
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    s->restore_count++;
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
226