Statistics
| Branch: | Revision:

root / tci.c @ c0424934

History | View | Annotate | Download (35.1 kB)

1 7657f4bf Stefan Weil
/*
2 7657f4bf Stefan Weil
 * Tiny Code Interpreter for QEMU
3 7657f4bf Stefan Weil
 *
4 7657f4bf Stefan Weil
 * Copyright (c) 2009, 2011 Stefan Weil
5 7657f4bf Stefan Weil
 *
6 7657f4bf Stefan Weil
 * This program is free software: you can redistribute it and/or modify
7 7657f4bf Stefan Weil
 * it under the terms of the GNU General Public License as published by
8 7657f4bf Stefan Weil
 * the Free Software Foundation, either version 2 of the License, or
9 7657f4bf Stefan Weil
 * (at your option) any later version.
10 7657f4bf Stefan Weil
 *
11 7657f4bf Stefan Weil
 * This program is distributed in the hope that it will be useful,
12 7657f4bf Stefan Weil
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 7657f4bf Stefan Weil
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 7657f4bf Stefan Weil
 * GNU General Public License for more details.
15 7657f4bf Stefan Weil
 *
16 7657f4bf Stefan Weil
 * You should have received a copy of the GNU General Public License
17 7657f4bf Stefan Weil
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 7657f4bf Stefan Weil
 */
19 7657f4bf Stefan Weil
20 7657f4bf Stefan Weil
#include "config.h"
21 7657f4bf Stefan Weil
22 7657f4bf Stefan Weil
/* Defining NDEBUG disables assertions (which makes the code faster). */
23 7657f4bf Stefan Weil
#if !defined(CONFIG_TCG_DEBUG) && !defined(NDEBUG)
24 7657f4bf Stefan Weil
# define NDEBUG
25 7657f4bf Stefan Weil
#endif
26 7657f4bf Stefan Weil
27 7657f4bf Stefan Weil
#include "qemu-common.h"
28 7657f4bf Stefan Weil
#include "dyngen-exec.h"        /* env */
29 7657f4bf Stefan Weil
#include "exec-all.h"           /* MAX_OPC_PARAM_IARGS */
30 7657f4bf Stefan Weil
#include "tcg-op.h"
31 7657f4bf Stefan Weil
32 7657f4bf Stefan Weil
/* Marker for missing code. */
33 7657f4bf Stefan Weil
#define TODO() \
34 7657f4bf Stefan Weil
    do { \
35 7657f4bf Stefan Weil
        fprintf(stderr, "TODO %s:%u: %s()\n", \
36 7657f4bf Stefan Weil
                __FILE__, __LINE__, __func__); \
37 7657f4bf Stefan Weil
        tcg_abort(); \
38 7657f4bf Stefan Weil
    } while (0)
39 7657f4bf Stefan Weil
40 7657f4bf Stefan Weil
#if MAX_OPC_PARAM_IARGS != 4
41 7657f4bf Stefan Weil
# error Fix needed, number of supported input arguments changed!
42 7657f4bf Stefan Weil
#endif
43 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
44 7657f4bf Stefan Weil
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
45 7657f4bf Stefan Weil
                                    tcg_target_ulong, tcg_target_ulong,
46 7657f4bf Stefan Weil
                                    tcg_target_ulong, tcg_target_ulong,
47 7657f4bf Stefan Weil
                                    tcg_target_ulong, tcg_target_ulong);
48 7657f4bf Stefan Weil
#else
49 7657f4bf Stefan Weil
typedef uint64_t (*helper_function)(tcg_target_ulong, tcg_target_ulong,
50 7657f4bf Stefan Weil
                                    tcg_target_ulong, tcg_target_ulong);
51 7657f4bf Stefan Weil
#endif
52 7657f4bf Stefan Weil
53 7657f4bf Stefan Weil
/* TCI can optionally use a global register variable for env. */
54 7657f4bf Stefan Weil
#if !defined(AREG0)
55 9349b4f9 Andreas Färber
CPUArchState *env;
56 7657f4bf Stefan Weil
#endif
57 7657f4bf Stefan Weil
58 7657f4bf Stefan Weil
/* Targets which don't use GETPC also don't need tci_tb_ptr
59 7657f4bf Stefan Weil
   which makes them a little faster. */
60 7657f4bf Stefan Weil
#if defined(GETPC)
61 c3ca0467 Stefan Weil
uintptr_t tci_tb_ptr;
62 7657f4bf Stefan Weil
#endif
63 7657f4bf Stefan Weil
64 7657f4bf Stefan Weil
static tcg_target_ulong tci_reg[TCG_TARGET_NB_REGS];
65 7657f4bf Stefan Weil
66 3b2aba2f Stefan Weil
#if !defined(CONFIG_TCG_PASS_AREG0)
67 3b2aba2f Stefan Weil
# define helper_ldb_mmu(env, addr, mmu_idx) __ldb_mmu(addr, mmu_idx)
68 3b2aba2f Stefan Weil
# define helper_ldw_mmu(env, addr, mmu_idx) __ldw_mmu(addr, mmu_idx)
69 3b2aba2f Stefan Weil
# define helper_ldl_mmu(env, addr, mmu_idx) __ldl_mmu(addr, mmu_idx)
70 3b2aba2f Stefan Weil
# define helper_ldq_mmu(env, addr, mmu_idx) __ldq_mmu(addr, mmu_idx)
71 3b2aba2f Stefan Weil
# define helper_stb_mmu(env, addr, val, mmu_idx) __stb_mmu(addr, val, mmu_idx)
72 3b2aba2f Stefan Weil
# define helper_stw_mmu(env, addr, val, mmu_idx) __stw_mmu(addr, val, mmu_idx)
73 3b2aba2f Stefan Weil
# define helper_stl_mmu(env, addr, val, mmu_idx) __stl_mmu(addr, val, mmu_idx)
74 3b2aba2f Stefan Weil
# define helper_stq_mmu(env, addr, val, mmu_idx) __stq_mmu(addr, val, mmu_idx)
75 3b2aba2f Stefan Weil
#endif /* !CONFIG_TCG_PASS_AREG0 */
76 3b2aba2f Stefan Weil
77 771142c2 Richard Henderson
static tcg_target_ulong tci_read_reg(TCGReg index)
78 7657f4bf Stefan Weil
{
79 7657f4bf Stefan Weil
    assert(index < ARRAY_SIZE(tci_reg));
80 7657f4bf Stefan Weil
    return tci_reg[index];
81 7657f4bf Stefan Weil
}
82 7657f4bf Stefan Weil
83 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8s_i32 || TCG_TARGET_HAS_ext8s_i64
84 771142c2 Richard Henderson
static int8_t tci_read_reg8s(TCGReg index)
85 7657f4bf Stefan Weil
{
86 7657f4bf Stefan Weil
    return (int8_t)tci_read_reg(index);
87 7657f4bf Stefan Weil
}
88 7657f4bf Stefan Weil
#endif
89 7657f4bf Stefan Weil
90 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16s_i32 || TCG_TARGET_HAS_ext16s_i64
91 771142c2 Richard Henderson
static int16_t tci_read_reg16s(TCGReg index)
92 7657f4bf Stefan Weil
{
93 7657f4bf Stefan Weil
    return (int16_t)tci_read_reg(index);
94 7657f4bf Stefan Weil
}
95 7657f4bf Stefan Weil
#endif
96 7657f4bf Stefan Weil
97 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
98 771142c2 Richard Henderson
static int32_t tci_read_reg32s(TCGReg index)
99 7657f4bf Stefan Weil
{
100 7657f4bf Stefan Weil
    return (int32_t)tci_read_reg(index);
101 7657f4bf Stefan Weil
}
102 7657f4bf Stefan Weil
#endif
103 7657f4bf Stefan Weil
104 771142c2 Richard Henderson
static uint8_t tci_read_reg8(TCGReg index)
105 7657f4bf Stefan Weil
{
106 7657f4bf Stefan Weil
    return (uint8_t)tci_read_reg(index);
107 7657f4bf Stefan Weil
}
108 7657f4bf Stefan Weil
109 771142c2 Richard Henderson
static uint16_t tci_read_reg16(TCGReg index)
110 7657f4bf Stefan Weil
{
111 7657f4bf Stefan Weil
    return (uint16_t)tci_read_reg(index);
112 7657f4bf Stefan Weil
}
113 7657f4bf Stefan Weil
114 771142c2 Richard Henderson
static uint32_t tci_read_reg32(TCGReg index)
115 7657f4bf Stefan Weil
{
116 7657f4bf Stefan Weil
    return (uint32_t)tci_read_reg(index);
117 7657f4bf Stefan Weil
}
118 7657f4bf Stefan Weil
119 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
120 771142c2 Richard Henderson
static uint64_t tci_read_reg64(TCGReg index)
121 7657f4bf Stefan Weil
{
122 7657f4bf Stefan Weil
    return tci_read_reg(index);
123 7657f4bf Stefan Weil
}
124 7657f4bf Stefan Weil
#endif
125 7657f4bf Stefan Weil
126 771142c2 Richard Henderson
static void tci_write_reg(TCGReg index, tcg_target_ulong value)
127 7657f4bf Stefan Weil
{
128 7657f4bf Stefan Weil
    assert(index < ARRAY_SIZE(tci_reg));
129 7657f4bf Stefan Weil
    assert(index != TCG_AREG0);
130 7657f4bf Stefan Weil
    tci_reg[index] = value;
131 7657f4bf Stefan Weil
}
132 7657f4bf Stefan Weil
133 771142c2 Richard Henderson
static void tci_write_reg8s(TCGReg index, int8_t value)
134 7657f4bf Stefan Weil
{
135 7657f4bf Stefan Weil
    tci_write_reg(index, value);
136 7657f4bf Stefan Weil
}
137 7657f4bf Stefan Weil
138 771142c2 Richard Henderson
static void tci_write_reg16s(TCGReg index, int16_t value)
139 7657f4bf Stefan Weil
{
140 7657f4bf Stefan Weil
    tci_write_reg(index, value);
141 7657f4bf Stefan Weil
}
142 7657f4bf Stefan Weil
143 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
144 771142c2 Richard Henderson
static void tci_write_reg32s(TCGReg index, int32_t value)
145 7657f4bf Stefan Weil
{
146 7657f4bf Stefan Weil
    tci_write_reg(index, value);
147 7657f4bf Stefan Weil
}
148 7657f4bf Stefan Weil
#endif
149 7657f4bf Stefan Weil
150 771142c2 Richard Henderson
static void tci_write_reg8(TCGReg index, uint8_t value)
151 7657f4bf Stefan Weil
{
152 7657f4bf Stefan Weil
    tci_write_reg(index, value);
153 7657f4bf Stefan Weil
}
154 7657f4bf Stefan Weil
155 771142c2 Richard Henderson
static void tci_write_reg16(TCGReg index, uint16_t value)
156 7657f4bf Stefan Weil
{
157 7657f4bf Stefan Weil
    tci_write_reg(index, value);
158 7657f4bf Stefan Weil
}
159 7657f4bf Stefan Weil
160 771142c2 Richard Henderson
static void tci_write_reg32(TCGReg index, uint32_t value)
161 7657f4bf Stefan Weil
{
162 7657f4bf Stefan Weil
    tci_write_reg(index, value);
163 7657f4bf Stefan Weil
}
164 7657f4bf Stefan Weil
165 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
166 7657f4bf Stefan Weil
static void tci_write_reg64(uint32_t high_index, uint32_t low_index,
167 7657f4bf Stefan Weil
                            uint64_t value)
168 7657f4bf Stefan Weil
{
169 7657f4bf Stefan Weil
    tci_write_reg(low_index, value);
170 7657f4bf Stefan Weil
    tci_write_reg(high_index, value >> 32);
171 7657f4bf Stefan Weil
}
172 7657f4bf Stefan Weil
#elif TCG_TARGET_REG_BITS == 64
173 771142c2 Richard Henderson
static void tci_write_reg64(TCGReg index, uint64_t value)
174 7657f4bf Stefan Weil
{
175 7657f4bf Stefan Weil
    tci_write_reg(index, value);
176 7657f4bf Stefan Weil
}
177 7657f4bf Stefan Weil
#endif
178 7657f4bf Stefan Weil
179 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
180 7657f4bf Stefan Weil
/* Create a 64 bit value from two 32 bit values. */
181 7657f4bf Stefan Weil
static uint64_t tci_uint64(uint32_t high, uint32_t low)
182 7657f4bf Stefan Weil
{
183 7657f4bf Stefan Weil
    return ((uint64_t)high << 32) + low;
184 7657f4bf Stefan Weil
}
185 7657f4bf Stefan Weil
#endif
186 7657f4bf Stefan Weil
187 7657f4bf Stefan Weil
/* Read constant (native size) from bytecode. */
188 7657f4bf Stefan Weil
static tcg_target_ulong tci_read_i(uint8_t **tb_ptr)
189 7657f4bf Stefan Weil
{
190 7657f4bf Stefan Weil
    tcg_target_ulong value = *(tcg_target_ulong *)(*tb_ptr);
191 7657f4bf Stefan Weil
    *tb_ptr += sizeof(value);
192 7657f4bf Stefan Weil
    return value;
193 7657f4bf Stefan Weil
}
194 7657f4bf Stefan Weil
195 7657f4bf Stefan Weil
/* Read constant (32 bit) from bytecode. */
196 7657f4bf Stefan Weil
static uint32_t tci_read_i32(uint8_t **tb_ptr)
197 7657f4bf Stefan Weil
{
198 7657f4bf Stefan Weil
    uint32_t value = *(uint32_t *)(*tb_ptr);
199 7657f4bf Stefan Weil
    *tb_ptr += sizeof(value);
200 7657f4bf Stefan Weil
    return value;
201 7657f4bf Stefan Weil
}
202 7657f4bf Stefan Weil
203 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
204 7657f4bf Stefan Weil
/* Read constant (64 bit) from bytecode. */
205 7657f4bf Stefan Weil
static uint64_t tci_read_i64(uint8_t **tb_ptr)
206 7657f4bf Stefan Weil
{
207 7657f4bf Stefan Weil
    uint64_t value = *(uint64_t *)(*tb_ptr);
208 7657f4bf Stefan Weil
    *tb_ptr += sizeof(value);
209 7657f4bf Stefan Weil
    return value;
210 7657f4bf Stefan Weil
}
211 7657f4bf Stefan Weil
#endif
212 7657f4bf Stefan Weil
213 7657f4bf Stefan Weil
/* Read indexed register (native size) from bytecode. */
214 7657f4bf Stefan Weil
static tcg_target_ulong tci_read_r(uint8_t **tb_ptr)
215 7657f4bf Stefan Weil
{
216 7657f4bf Stefan Weil
    tcg_target_ulong value = tci_read_reg(**tb_ptr);
217 7657f4bf Stefan Weil
    *tb_ptr += 1;
218 7657f4bf Stefan Weil
    return value;
219 7657f4bf Stefan Weil
}
220 7657f4bf Stefan Weil
221 7657f4bf Stefan Weil
/* Read indexed register (8 bit) from bytecode. */
222 7657f4bf Stefan Weil
static uint8_t tci_read_r8(uint8_t **tb_ptr)
223 7657f4bf Stefan Weil
{
224 7657f4bf Stefan Weil
    uint8_t value = tci_read_reg8(**tb_ptr);
225 7657f4bf Stefan Weil
    *tb_ptr += 1;
226 7657f4bf Stefan Weil
    return value;
227 7657f4bf Stefan Weil
}
228 7657f4bf Stefan Weil
229 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8s_i32 || TCG_TARGET_HAS_ext8s_i64
230 7657f4bf Stefan Weil
/* Read indexed register (8 bit signed) from bytecode. */
231 7657f4bf Stefan Weil
static int8_t tci_read_r8s(uint8_t **tb_ptr)
232 7657f4bf Stefan Weil
{
233 7657f4bf Stefan Weil
    int8_t value = tci_read_reg8s(**tb_ptr);
234 7657f4bf Stefan Weil
    *tb_ptr += 1;
235 7657f4bf Stefan Weil
    return value;
236 7657f4bf Stefan Weil
}
237 7657f4bf Stefan Weil
#endif
238 7657f4bf Stefan Weil
239 7657f4bf Stefan Weil
/* Read indexed register (16 bit) from bytecode. */
240 7657f4bf Stefan Weil
static uint16_t tci_read_r16(uint8_t **tb_ptr)
241 7657f4bf Stefan Weil
{
242 7657f4bf Stefan Weil
    uint16_t value = tci_read_reg16(**tb_ptr);
243 7657f4bf Stefan Weil
    *tb_ptr += 1;
244 7657f4bf Stefan Weil
    return value;
245 7657f4bf Stefan Weil
}
246 7657f4bf Stefan Weil
247 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16s_i32 || TCG_TARGET_HAS_ext16s_i64
248 7657f4bf Stefan Weil
/* Read indexed register (16 bit signed) from bytecode. */
249 7657f4bf Stefan Weil
static int16_t tci_read_r16s(uint8_t **tb_ptr)
250 7657f4bf Stefan Weil
{
251 7657f4bf Stefan Weil
    int16_t value = tci_read_reg16s(**tb_ptr);
252 7657f4bf Stefan Weil
    *tb_ptr += 1;
253 7657f4bf Stefan Weil
    return value;
254 7657f4bf Stefan Weil
}
255 7657f4bf Stefan Weil
#endif
256 7657f4bf Stefan Weil
257 7657f4bf Stefan Weil
/* Read indexed register (32 bit) from bytecode. */
258 7657f4bf Stefan Weil
static uint32_t tci_read_r32(uint8_t **tb_ptr)
259 7657f4bf Stefan Weil
{
260 7657f4bf Stefan Weil
    uint32_t value = tci_read_reg32(**tb_ptr);
261 7657f4bf Stefan Weil
    *tb_ptr += 1;
262 7657f4bf Stefan Weil
    return value;
263 7657f4bf Stefan Weil
}
264 7657f4bf Stefan Weil
265 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
266 7657f4bf Stefan Weil
/* Read two indexed registers (2 * 32 bit) from bytecode. */
267 7657f4bf Stefan Weil
static uint64_t tci_read_r64(uint8_t **tb_ptr)
268 7657f4bf Stefan Weil
{
269 7657f4bf Stefan Weil
    uint32_t low = tci_read_r32(tb_ptr);
270 7657f4bf Stefan Weil
    return tci_uint64(tci_read_r32(tb_ptr), low);
271 7657f4bf Stefan Weil
}
272 7657f4bf Stefan Weil
#elif TCG_TARGET_REG_BITS == 64
273 7657f4bf Stefan Weil
/* Read indexed register (32 bit signed) from bytecode. */
274 7657f4bf Stefan Weil
static int32_t tci_read_r32s(uint8_t **tb_ptr)
275 7657f4bf Stefan Weil
{
276 7657f4bf Stefan Weil
    int32_t value = tci_read_reg32s(**tb_ptr);
277 7657f4bf Stefan Weil
    *tb_ptr += 1;
278 7657f4bf Stefan Weil
    return value;
279 7657f4bf Stefan Weil
}
280 7657f4bf Stefan Weil
281 7657f4bf Stefan Weil
/* Read indexed register (64 bit) from bytecode. */
282 7657f4bf Stefan Weil
static uint64_t tci_read_r64(uint8_t **tb_ptr)
283 7657f4bf Stefan Weil
{
284 7657f4bf Stefan Weil
    uint64_t value = tci_read_reg64(**tb_ptr);
285 7657f4bf Stefan Weil
    *tb_ptr += 1;
286 7657f4bf Stefan Weil
    return value;
287 7657f4bf Stefan Weil
}
288 7657f4bf Stefan Weil
#endif
289 7657f4bf Stefan Weil
290 7657f4bf Stefan Weil
/* Read indexed register(s) with target address from bytecode. */
291 7657f4bf Stefan Weil
static target_ulong tci_read_ulong(uint8_t **tb_ptr)
292 7657f4bf Stefan Weil
{
293 7657f4bf Stefan Weil
    target_ulong taddr = tci_read_r(tb_ptr);
294 7657f4bf Stefan Weil
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
295 7657f4bf Stefan Weil
    taddr += (uint64_t)tci_read_r(tb_ptr) << 32;
296 7657f4bf Stefan Weil
#endif
297 7657f4bf Stefan Weil
    return taddr;
298 7657f4bf Stefan Weil
}
299 7657f4bf Stefan Weil
300 7657f4bf Stefan Weil
/* Read indexed register or constant (native size) from bytecode. */
301 7657f4bf Stefan Weil
static tcg_target_ulong tci_read_ri(uint8_t **tb_ptr)
302 7657f4bf Stefan Weil
{
303 7657f4bf Stefan Weil
    tcg_target_ulong value;
304 771142c2 Richard Henderson
    TCGReg r = **tb_ptr;
305 7657f4bf Stefan Weil
    *tb_ptr += 1;
306 7657f4bf Stefan Weil
    if (r == TCG_CONST) {
307 7657f4bf Stefan Weil
        value = tci_read_i(tb_ptr);
308 7657f4bf Stefan Weil
    } else {
309 7657f4bf Stefan Weil
        value = tci_read_reg(r);
310 7657f4bf Stefan Weil
    }
311 7657f4bf Stefan Weil
    return value;
312 7657f4bf Stefan Weil
}
313 7657f4bf Stefan Weil
314 7657f4bf Stefan Weil
/* Read indexed register or constant (32 bit) from bytecode. */
315 7657f4bf Stefan Weil
static uint32_t tci_read_ri32(uint8_t **tb_ptr)
316 7657f4bf Stefan Weil
{
317 7657f4bf Stefan Weil
    uint32_t value;
318 771142c2 Richard Henderson
    TCGReg r = **tb_ptr;
319 7657f4bf Stefan Weil
    *tb_ptr += 1;
320 7657f4bf Stefan Weil
    if (r == TCG_CONST) {
321 7657f4bf Stefan Weil
        value = tci_read_i32(tb_ptr);
322 7657f4bf Stefan Weil
    } else {
323 7657f4bf Stefan Weil
        value = tci_read_reg32(r);
324 7657f4bf Stefan Weil
    }
325 7657f4bf Stefan Weil
    return value;
326 7657f4bf Stefan Weil
}
327 7657f4bf Stefan Weil
328 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
329 7657f4bf Stefan Weil
/* Read two indexed registers or constants (2 * 32 bit) from bytecode. */
330 7657f4bf Stefan Weil
static uint64_t tci_read_ri64(uint8_t **tb_ptr)
331 7657f4bf Stefan Weil
{
332 7657f4bf Stefan Weil
    uint32_t low = tci_read_ri32(tb_ptr);
333 7657f4bf Stefan Weil
    return tci_uint64(tci_read_ri32(tb_ptr), low);
334 7657f4bf Stefan Weil
}
335 7657f4bf Stefan Weil
#elif TCG_TARGET_REG_BITS == 64
336 7657f4bf Stefan Weil
/* Read indexed register or constant (64 bit) from bytecode. */
337 7657f4bf Stefan Weil
static uint64_t tci_read_ri64(uint8_t **tb_ptr)
338 7657f4bf Stefan Weil
{
339 7657f4bf Stefan Weil
    uint64_t value;
340 771142c2 Richard Henderson
    TCGReg r = **tb_ptr;
341 7657f4bf Stefan Weil
    *tb_ptr += 1;
342 7657f4bf Stefan Weil
    if (r == TCG_CONST) {
343 7657f4bf Stefan Weil
        value = tci_read_i64(tb_ptr);
344 7657f4bf Stefan Weil
    } else {
345 7657f4bf Stefan Weil
        value = tci_read_reg64(r);
346 7657f4bf Stefan Weil
    }
347 7657f4bf Stefan Weil
    return value;
348 7657f4bf Stefan Weil
}
349 7657f4bf Stefan Weil
#endif
350 7657f4bf Stefan Weil
351 7657f4bf Stefan Weil
static target_ulong tci_read_label(uint8_t **tb_ptr)
352 7657f4bf Stefan Weil
{
353 7657f4bf Stefan Weil
    target_ulong label = tci_read_i(tb_ptr);
354 7657f4bf Stefan Weil
    assert(label != 0);
355 7657f4bf Stefan Weil
    return label;
356 7657f4bf Stefan Weil
}
357 7657f4bf Stefan Weil
358 7657f4bf Stefan Weil
static bool tci_compare32(uint32_t u0, uint32_t u1, TCGCond condition)
359 7657f4bf Stefan Weil
{
360 7657f4bf Stefan Weil
    bool result = false;
361 7657f4bf Stefan Weil
    int32_t i0 = u0;
362 7657f4bf Stefan Weil
    int32_t i1 = u1;
363 7657f4bf Stefan Weil
    switch (condition) {
364 7657f4bf Stefan Weil
    case TCG_COND_EQ:
365 7657f4bf Stefan Weil
        result = (u0 == u1);
366 7657f4bf Stefan Weil
        break;
367 7657f4bf Stefan Weil
    case TCG_COND_NE:
368 7657f4bf Stefan Weil
        result = (u0 != u1);
369 7657f4bf Stefan Weil
        break;
370 7657f4bf Stefan Weil
    case TCG_COND_LT:
371 7657f4bf Stefan Weil
        result = (i0 < i1);
372 7657f4bf Stefan Weil
        break;
373 7657f4bf Stefan Weil
    case TCG_COND_GE:
374 7657f4bf Stefan Weil
        result = (i0 >= i1);
375 7657f4bf Stefan Weil
        break;
376 7657f4bf Stefan Weil
    case TCG_COND_LE:
377 7657f4bf Stefan Weil
        result = (i0 <= i1);
378 7657f4bf Stefan Weil
        break;
379 7657f4bf Stefan Weil
    case TCG_COND_GT:
380 7657f4bf Stefan Weil
        result = (i0 > i1);
381 7657f4bf Stefan Weil
        break;
382 7657f4bf Stefan Weil
    case TCG_COND_LTU:
383 7657f4bf Stefan Weil
        result = (u0 < u1);
384 7657f4bf Stefan Weil
        break;
385 7657f4bf Stefan Weil
    case TCG_COND_GEU:
386 7657f4bf Stefan Weil
        result = (u0 >= u1);
387 7657f4bf Stefan Weil
        break;
388 7657f4bf Stefan Weil
    case TCG_COND_LEU:
389 7657f4bf Stefan Weil
        result = (u0 <= u1);
390 7657f4bf Stefan Weil
        break;
391 7657f4bf Stefan Weil
    case TCG_COND_GTU:
392 7657f4bf Stefan Weil
        result = (u0 > u1);
393 7657f4bf Stefan Weil
        break;
394 7657f4bf Stefan Weil
    default:
395 7657f4bf Stefan Weil
        TODO();
396 7657f4bf Stefan Weil
    }
397 7657f4bf Stefan Weil
    return result;
398 7657f4bf Stefan Weil
}
399 7657f4bf Stefan Weil
400 7657f4bf Stefan Weil
static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
401 7657f4bf Stefan Weil
{
402 7657f4bf Stefan Weil
    bool result = false;
403 7657f4bf Stefan Weil
    int64_t i0 = u0;
404 7657f4bf Stefan Weil
    int64_t i1 = u1;
405 7657f4bf Stefan Weil
    switch (condition) {
406 7657f4bf Stefan Weil
    case TCG_COND_EQ:
407 7657f4bf Stefan Weil
        result = (u0 == u1);
408 7657f4bf Stefan Weil
        break;
409 7657f4bf Stefan Weil
    case TCG_COND_NE:
410 7657f4bf Stefan Weil
        result = (u0 != u1);
411 7657f4bf Stefan Weil
        break;
412 7657f4bf Stefan Weil
    case TCG_COND_LT:
413 7657f4bf Stefan Weil
        result = (i0 < i1);
414 7657f4bf Stefan Weil
        break;
415 7657f4bf Stefan Weil
    case TCG_COND_GE:
416 7657f4bf Stefan Weil
        result = (i0 >= i1);
417 7657f4bf Stefan Weil
        break;
418 7657f4bf Stefan Weil
    case TCG_COND_LE:
419 7657f4bf Stefan Weil
        result = (i0 <= i1);
420 7657f4bf Stefan Weil
        break;
421 7657f4bf Stefan Weil
    case TCG_COND_GT:
422 7657f4bf Stefan Weil
        result = (i0 > i1);
423 7657f4bf Stefan Weil
        break;
424 7657f4bf Stefan Weil
    case TCG_COND_LTU:
425 7657f4bf Stefan Weil
        result = (u0 < u1);
426 7657f4bf Stefan Weil
        break;
427 7657f4bf Stefan Weil
    case TCG_COND_GEU:
428 7657f4bf Stefan Weil
        result = (u0 >= u1);
429 7657f4bf Stefan Weil
        break;
430 7657f4bf Stefan Weil
    case TCG_COND_LEU:
431 7657f4bf Stefan Weil
        result = (u0 <= u1);
432 7657f4bf Stefan Weil
        break;
433 7657f4bf Stefan Weil
    case TCG_COND_GTU:
434 7657f4bf Stefan Weil
        result = (u0 > u1);
435 7657f4bf Stefan Weil
        break;
436 7657f4bf Stefan Weil
    default:
437 7657f4bf Stefan Weil
        TODO();
438 7657f4bf Stefan Weil
    }
439 7657f4bf Stefan Weil
    return result;
440 7657f4bf Stefan Weil
}
441 7657f4bf Stefan Weil
442 7657f4bf Stefan Weil
/* Interpret pseudo code in tb. */
443 69784eae Stefan Weil
tcg_target_ulong tcg_qemu_tb_exec(CPUArchState *cpustate, uint8_t *tb_ptr)
444 7657f4bf Stefan Weil
{
445 69784eae Stefan Weil
    tcg_target_ulong next_tb = 0;
446 7657f4bf Stefan Weil
447 7657f4bf Stefan Weil
    env = cpustate;
448 7657f4bf Stefan Weil
    tci_reg[TCG_AREG0] = (tcg_target_ulong)env;
449 7657f4bf Stefan Weil
    assert(tb_ptr);
450 7657f4bf Stefan Weil
451 7657f4bf Stefan Weil
    for (;;) {
452 7657f4bf Stefan Weil
#if defined(GETPC)
453 c3ca0467 Stefan Weil
        tci_tb_ptr = (uintptr_t)tb_ptr;
454 7657f4bf Stefan Weil
#endif
455 7657f4bf Stefan Weil
        TCGOpcode opc = tb_ptr[0];
456 7657f4bf Stefan Weil
#if !defined(NDEBUG)
457 7657f4bf Stefan Weil
        uint8_t op_size = tb_ptr[1];
458 7657f4bf Stefan Weil
        uint8_t *old_code_ptr = tb_ptr;
459 7657f4bf Stefan Weil
#endif
460 7657f4bf Stefan Weil
        tcg_target_ulong t0;
461 7657f4bf Stefan Weil
        tcg_target_ulong t1;
462 7657f4bf Stefan Weil
        tcg_target_ulong t2;
463 7657f4bf Stefan Weil
        tcg_target_ulong label;
464 7657f4bf Stefan Weil
        TCGCond condition;
465 7657f4bf Stefan Weil
        target_ulong taddr;
466 7657f4bf Stefan Weil
#ifndef CONFIG_SOFTMMU
467 7657f4bf Stefan Weil
        tcg_target_ulong host_addr;
468 7657f4bf Stefan Weil
#endif
469 7657f4bf Stefan Weil
        uint8_t tmp8;
470 7657f4bf Stefan Weil
        uint16_t tmp16;
471 7657f4bf Stefan Weil
        uint32_t tmp32;
472 7657f4bf Stefan Weil
        uint64_t tmp64;
473 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
474 7657f4bf Stefan Weil
        uint64_t v64;
475 7657f4bf Stefan Weil
#endif
476 7657f4bf Stefan Weil
477 7657f4bf Stefan Weil
        /* Skip opcode and size entry. */
478 7657f4bf Stefan Weil
        tb_ptr += 2;
479 7657f4bf Stefan Weil
480 7657f4bf Stefan Weil
        switch (opc) {
481 7657f4bf Stefan Weil
        case INDEX_op_end:
482 7657f4bf Stefan Weil
        case INDEX_op_nop:
483 7657f4bf Stefan Weil
            break;
484 7657f4bf Stefan Weil
        case INDEX_op_nop1:
485 7657f4bf Stefan Weil
        case INDEX_op_nop2:
486 7657f4bf Stefan Weil
        case INDEX_op_nop3:
487 7657f4bf Stefan Weil
        case INDEX_op_nopn:
488 7657f4bf Stefan Weil
        case INDEX_op_discard:
489 7657f4bf Stefan Weil
            TODO();
490 7657f4bf Stefan Weil
            break;
491 7657f4bf Stefan Weil
        case INDEX_op_set_label:
492 7657f4bf Stefan Weil
            TODO();
493 7657f4bf Stefan Weil
            break;
494 7657f4bf Stefan Weil
        case INDEX_op_call:
495 7657f4bf Stefan Weil
            t0 = tci_read_ri(&tb_ptr);
496 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
497 7657f4bf Stefan Weil
            tmp64 = ((helper_function)t0)(tci_read_reg(TCG_REG_R0),
498 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R1),
499 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R2),
500 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R3),
501 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R5),
502 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R6),
503 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R7),
504 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R8));
505 7657f4bf Stefan Weil
            tci_write_reg(TCG_REG_R0, tmp64);
506 7657f4bf Stefan Weil
            tci_write_reg(TCG_REG_R1, tmp64 >> 32);
507 7657f4bf Stefan Weil
#else
508 7657f4bf Stefan Weil
            tmp64 = ((helper_function)t0)(tci_read_reg(TCG_REG_R0),
509 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R1),
510 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R2),
511 7657f4bf Stefan Weil
                                          tci_read_reg(TCG_REG_R3));
512 7657f4bf Stefan Weil
            tci_write_reg(TCG_REG_R0, tmp64);
513 7657f4bf Stefan Weil
#endif
514 7657f4bf Stefan Weil
            break;
515 7657f4bf Stefan Weil
        case INDEX_op_jmp:
516 7657f4bf Stefan Weil
        case INDEX_op_br:
517 7657f4bf Stefan Weil
            label = tci_read_label(&tb_ptr);
518 7657f4bf Stefan Weil
            assert(tb_ptr == old_code_ptr + op_size);
519 7657f4bf Stefan Weil
            tb_ptr = (uint8_t *)label;
520 7657f4bf Stefan Weil
            continue;
521 7657f4bf Stefan Weil
        case INDEX_op_setcond_i32:
522 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
523 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
524 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
525 7657f4bf Stefan Weil
            condition = *tb_ptr++;
526 7657f4bf Stefan Weil
            tci_write_reg32(t0, tci_compare32(t1, t2, condition));
527 7657f4bf Stefan Weil
            break;
528 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
529 7657f4bf Stefan Weil
        case INDEX_op_setcond2_i32:
530 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
531 7657f4bf Stefan Weil
            tmp64 = tci_read_r64(&tb_ptr);
532 7657f4bf Stefan Weil
            v64 = tci_read_ri64(&tb_ptr);
533 7657f4bf Stefan Weil
            condition = *tb_ptr++;
534 7657f4bf Stefan Weil
            tci_write_reg32(t0, tci_compare64(tmp64, v64, condition));
535 7657f4bf Stefan Weil
            break;
536 7657f4bf Stefan Weil
#elif TCG_TARGET_REG_BITS == 64
537 7657f4bf Stefan Weil
        case INDEX_op_setcond_i64:
538 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
539 7657f4bf Stefan Weil
            t1 = tci_read_r64(&tb_ptr);
540 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
541 7657f4bf Stefan Weil
            condition = *tb_ptr++;
542 7657f4bf Stefan Weil
            tci_write_reg64(t0, tci_compare64(t1, t2, condition));
543 7657f4bf Stefan Weil
            break;
544 7657f4bf Stefan Weil
#endif
545 7657f4bf Stefan Weil
        case INDEX_op_mov_i32:
546 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
547 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
548 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
549 7657f4bf Stefan Weil
            break;
550 7657f4bf Stefan Weil
        case INDEX_op_movi_i32:
551 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
552 7657f4bf Stefan Weil
            t1 = tci_read_i32(&tb_ptr);
553 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
554 7657f4bf Stefan Weil
            break;
555 7657f4bf Stefan Weil
556 7657f4bf Stefan Weil
            /* Load/store operations (32 bit). */
557 7657f4bf Stefan Weil
558 7657f4bf Stefan Weil
        case INDEX_op_ld8u_i32:
559 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
560 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
561 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
562 7657f4bf Stefan Weil
            tci_write_reg8(t0, *(uint8_t *)(t1 + t2));
563 7657f4bf Stefan Weil
            break;
564 7657f4bf Stefan Weil
        case INDEX_op_ld8s_i32:
565 7657f4bf Stefan Weil
        case INDEX_op_ld16u_i32:
566 7657f4bf Stefan Weil
            TODO();
567 7657f4bf Stefan Weil
            break;
568 7657f4bf Stefan Weil
        case INDEX_op_ld16s_i32:
569 7657f4bf Stefan Weil
            TODO();
570 7657f4bf Stefan Weil
            break;
571 7657f4bf Stefan Weil
        case INDEX_op_ld_i32:
572 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
573 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
574 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
575 7657f4bf Stefan Weil
            tci_write_reg32(t0, *(uint32_t *)(t1 + t2));
576 7657f4bf Stefan Weil
            break;
577 7657f4bf Stefan Weil
        case INDEX_op_st8_i32:
578 7657f4bf Stefan Weil
            t0 = tci_read_r8(&tb_ptr);
579 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
580 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
581 7657f4bf Stefan Weil
            *(uint8_t *)(t1 + t2) = t0;
582 7657f4bf Stefan Weil
            break;
583 7657f4bf Stefan Weil
        case INDEX_op_st16_i32:
584 7657f4bf Stefan Weil
            t0 = tci_read_r16(&tb_ptr);
585 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
586 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
587 7657f4bf Stefan Weil
            *(uint16_t *)(t1 + t2) = t0;
588 7657f4bf Stefan Weil
            break;
589 7657f4bf Stefan Weil
        case INDEX_op_st_i32:
590 7657f4bf Stefan Weil
            t0 = tci_read_r32(&tb_ptr);
591 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
592 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
593 7657f4bf Stefan Weil
            *(uint32_t *)(t1 + t2) = t0;
594 7657f4bf Stefan Weil
            break;
595 7657f4bf Stefan Weil
596 7657f4bf Stefan Weil
            /* Arithmetic operations (32 bit). */
597 7657f4bf Stefan Weil
598 7657f4bf Stefan Weil
        case INDEX_op_add_i32:
599 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
600 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
601 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
602 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 + t2);
603 7657f4bf Stefan Weil
            break;
604 7657f4bf Stefan Weil
        case INDEX_op_sub_i32:
605 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
606 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
607 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
608 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 - t2);
609 7657f4bf Stefan Weil
            break;
610 7657f4bf Stefan Weil
        case INDEX_op_mul_i32:
611 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
612 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
613 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
614 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 * t2);
615 7657f4bf Stefan Weil
            break;
616 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_div_i32
617 7657f4bf Stefan Weil
        case INDEX_op_div_i32:
618 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
619 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
620 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
621 7657f4bf Stefan Weil
            tci_write_reg32(t0, (int32_t)t1 / (int32_t)t2);
622 7657f4bf Stefan Weil
            break;
623 7657f4bf Stefan Weil
        case INDEX_op_divu_i32:
624 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
625 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
626 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
627 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 / t2);
628 7657f4bf Stefan Weil
            break;
629 7657f4bf Stefan Weil
        case INDEX_op_rem_i32:
630 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
631 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
632 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
633 7657f4bf Stefan Weil
            tci_write_reg32(t0, (int32_t)t1 % (int32_t)t2);
634 7657f4bf Stefan Weil
            break;
635 7657f4bf Stefan Weil
        case INDEX_op_remu_i32:
636 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
637 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
638 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
639 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 % t2);
640 7657f4bf Stefan Weil
            break;
641 7657f4bf Stefan Weil
#elif TCG_TARGET_HAS_div2_i32
642 7657f4bf Stefan Weil
        case INDEX_op_div2_i32:
643 7657f4bf Stefan Weil
        case INDEX_op_divu2_i32:
644 7657f4bf Stefan Weil
            TODO();
645 7657f4bf Stefan Weil
            break;
646 7657f4bf Stefan Weil
#endif
647 7657f4bf Stefan Weil
        case INDEX_op_and_i32:
648 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
649 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
650 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
651 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 & t2);
652 7657f4bf Stefan Weil
            break;
653 7657f4bf Stefan Weil
        case INDEX_op_or_i32:
654 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
655 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
656 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
657 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 | t2);
658 7657f4bf Stefan Weil
            break;
659 7657f4bf Stefan Weil
        case INDEX_op_xor_i32:
660 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
661 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
662 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
663 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 ^ t2);
664 7657f4bf Stefan Weil
            break;
665 7657f4bf Stefan Weil
666 7657f4bf Stefan Weil
            /* Shift/rotate operations (32 bit). */
667 7657f4bf Stefan Weil
668 7657f4bf Stefan Weil
        case INDEX_op_shl_i32:
669 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
670 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
671 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
672 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 << t2);
673 7657f4bf Stefan Weil
            break;
674 7657f4bf Stefan Weil
        case INDEX_op_shr_i32:
675 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
676 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
677 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
678 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1 >> t2);
679 7657f4bf Stefan Weil
            break;
680 7657f4bf Stefan Weil
        case INDEX_op_sar_i32:
681 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
682 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
683 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
684 7657f4bf Stefan Weil
            tci_write_reg32(t0, ((int32_t)t1 >> t2));
685 7657f4bf Stefan Weil
            break;
686 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_rot_i32
687 7657f4bf Stefan Weil
        case INDEX_op_rotl_i32:
688 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
689 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
690 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
691 7657f4bf Stefan Weil
            tci_write_reg32(t0, (t1 << t2) | (t1 >> (32 - t2)));
692 7657f4bf Stefan Weil
            break;
693 7657f4bf Stefan Weil
        case INDEX_op_rotr_i32:
694 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
695 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
696 7657f4bf Stefan Weil
            t2 = tci_read_ri32(&tb_ptr);
697 7657f4bf Stefan Weil
            tci_write_reg32(t0, (t1 >> t2) | (t1 << (32 - t2)));
698 7657f4bf Stefan Weil
            break;
699 7657f4bf Stefan Weil
#endif
700 7657f4bf Stefan Weil
        case INDEX_op_brcond_i32:
701 7657f4bf Stefan Weil
            t0 = tci_read_r32(&tb_ptr);
702 7657f4bf Stefan Weil
            t1 = tci_read_ri32(&tb_ptr);
703 7657f4bf Stefan Weil
            condition = *tb_ptr++;
704 7657f4bf Stefan Weil
            label = tci_read_label(&tb_ptr);
705 7657f4bf Stefan Weil
            if (tci_compare32(t0, t1, condition)) {
706 7657f4bf Stefan Weil
                assert(tb_ptr == old_code_ptr + op_size);
707 7657f4bf Stefan Weil
                tb_ptr = (uint8_t *)label;
708 7657f4bf Stefan Weil
                continue;
709 7657f4bf Stefan Weil
            }
710 7657f4bf Stefan Weil
            break;
711 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
712 7657f4bf Stefan Weil
        case INDEX_op_add2_i32:
713 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
714 7657f4bf Stefan Weil
            t1 = *tb_ptr++;
715 7657f4bf Stefan Weil
            tmp64 = tci_read_r64(&tb_ptr);
716 7657f4bf Stefan Weil
            tmp64 += tci_read_r64(&tb_ptr);
717 7657f4bf Stefan Weil
            tci_write_reg64(t1, t0, tmp64);
718 7657f4bf Stefan Weil
            break;
719 7657f4bf Stefan Weil
        case INDEX_op_sub2_i32:
720 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
721 7657f4bf Stefan Weil
            t1 = *tb_ptr++;
722 7657f4bf Stefan Weil
            tmp64 = tci_read_r64(&tb_ptr);
723 7657f4bf Stefan Weil
            tmp64 -= tci_read_r64(&tb_ptr);
724 7657f4bf Stefan Weil
            tci_write_reg64(t1, t0, tmp64);
725 7657f4bf Stefan Weil
            break;
726 7657f4bf Stefan Weil
        case INDEX_op_brcond2_i32:
727 7657f4bf Stefan Weil
            tmp64 = tci_read_r64(&tb_ptr);
728 7657f4bf Stefan Weil
            v64 = tci_read_ri64(&tb_ptr);
729 7657f4bf Stefan Weil
            condition = *tb_ptr++;
730 7657f4bf Stefan Weil
            label = tci_read_label(&tb_ptr);
731 7657f4bf Stefan Weil
            if (tci_compare64(tmp64, v64, condition)) {
732 7657f4bf Stefan Weil
                assert(tb_ptr == old_code_ptr + op_size);
733 7657f4bf Stefan Weil
                tb_ptr = (uint8_t *)label;
734 7657f4bf Stefan Weil
                continue;
735 7657f4bf Stefan Weil
            }
736 7657f4bf Stefan Weil
            break;
737 7657f4bf Stefan Weil
        case INDEX_op_mulu2_i32:
738 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
739 7657f4bf Stefan Weil
            t1 = *tb_ptr++;
740 7657f4bf Stefan Weil
            t2 = tci_read_r32(&tb_ptr);
741 7657f4bf Stefan Weil
            tmp64 = tci_read_r32(&tb_ptr);
742 7657f4bf Stefan Weil
            tci_write_reg64(t1, t0, t2 * tmp64);
743 7657f4bf Stefan Weil
            break;
744 7657f4bf Stefan Weil
#endif /* TCG_TARGET_REG_BITS == 32 */
745 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8s_i32
746 7657f4bf Stefan Weil
        case INDEX_op_ext8s_i32:
747 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
748 7657f4bf Stefan Weil
            t1 = tci_read_r8s(&tb_ptr);
749 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
750 7657f4bf Stefan Weil
            break;
751 7657f4bf Stefan Weil
#endif
752 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16s_i32
753 7657f4bf Stefan Weil
        case INDEX_op_ext16s_i32:
754 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
755 7657f4bf Stefan Weil
            t1 = tci_read_r16s(&tb_ptr);
756 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
757 7657f4bf Stefan Weil
            break;
758 7657f4bf Stefan Weil
#endif
759 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8u_i32
760 7657f4bf Stefan Weil
        case INDEX_op_ext8u_i32:
761 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
762 7657f4bf Stefan Weil
            t1 = tci_read_r8(&tb_ptr);
763 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
764 7657f4bf Stefan Weil
            break;
765 7657f4bf Stefan Weil
#endif
766 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16u_i32
767 7657f4bf Stefan Weil
        case INDEX_op_ext16u_i32:
768 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
769 7657f4bf Stefan Weil
            t1 = tci_read_r16(&tb_ptr);
770 7657f4bf Stefan Weil
            tci_write_reg32(t0, t1);
771 7657f4bf Stefan Weil
            break;
772 7657f4bf Stefan Weil
#endif
773 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_bswap16_i32
774 7657f4bf Stefan Weil
        case INDEX_op_bswap16_i32:
775 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
776 7657f4bf Stefan Weil
            t1 = tci_read_r16(&tb_ptr);
777 7657f4bf Stefan Weil
            tci_write_reg32(t0, bswap16(t1));
778 7657f4bf Stefan Weil
            break;
779 7657f4bf Stefan Weil
#endif
780 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_bswap32_i32
781 7657f4bf Stefan Weil
        case INDEX_op_bswap32_i32:
782 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
783 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
784 7657f4bf Stefan Weil
            tci_write_reg32(t0, bswap32(t1));
785 7657f4bf Stefan Weil
            break;
786 7657f4bf Stefan Weil
#endif
787 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_not_i32
788 7657f4bf Stefan Weil
        case INDEX_op_not_i32:
789 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
790 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
791 7657f4bf Stefan Weil
            tci_write_reg32(t0, ~t1);
792 7657f4bf Stefan Weil
            break;
793 7657f4bf Stefan Weil
#endif
794 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_neg_i32
795 7657f4bf Stefan Weil
        case INDEX_op_neg_i32:
796 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
797 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
798 7657f4bf Stefan Weil
            tci_write_reg32(t0, -t1);
799 7657f4bf Stefan Weil
            break;
800 7657f4bf Stefan Weil
#endif
801 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
802 7657f4bf Stefan Weil
        case INDEX_op_mov_i64:
803 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
804 7657f4bf Stefan Weil
            t1 = tci_read_r64(&tb_ptr);
805 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
806 7657f4bf Stefan Weil
            break;
807 7657f4bf Stefan Weil
        case INDEX_op_movi_i64:
808 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
809 7657f4bf Stefan Weil
            t1 = tci_read_i64(&tb_ptr);
810 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
811 7657f4bf Stefan Weil
            break;
812 7657f4bf Stefan Weil
813 7657f4bf Stefan Weil
            /* Load/store operations (64 bit). */
814 7657f4bf Stefan Weil
815 7657f4bf Stefan Weil
        case INDEX_op_ld8u_i64:
816 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
817 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
818 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
819 7657f4bf Stefan Weil
            tci_write_reg8(t0, *(uint8_t *)(t1 + t2));
820 7657f4bf Stefan Weil
            break;
821 7657f4bf Stefan Weil
        case INDEX_op_ld8s_i64:
822 7657f4bf Stefan Weil
        case INDEX_op_ld16u_i64:
823 7657f4bf Stefan Weil
        case INDEX_op_ld16s_i64:
824 7657f4bf Stefan Weil
            TODO();
825 7657f4bf Stefan Weil
            break;
826 7657f4bf Stefan Weil
        case INDEX_op_ld32u_i64:
827 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
828 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
829 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
830 7657f4bf Stefan Weil
            tci_write_reg32(t0, *(uint32_t *)(t1 + t2));
831 7657f4bf Stefan Weil
            break;
832 7657f4bf Stefan Weil
        case INDEX_op_ld32s_i64:
833 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
834 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
835 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
836 7657f4bf Stefan Weil
            tci_write_reg32s(t0, *(int32_t *)(t1 + t2));
837 7657f4bf Stefan Weil
            break;
838 7657f4bf Stefan Weil
        case INDEX_op_ld_i64:
839 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
840 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
841 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
842 7657f4bf Stefan Weil
            tci_write_reg64(t0, *(uint64_t *)(t1 + t2));
843 7657f4bf Stefan Weil
            break;
844 7657f4bf Stefan Weil
        case INDEX_op_st8_i64:
845 7657f4bf Stefan Weil
            t0 = tci_read_r8(&tb_ptr);
846 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
847 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
848 7657f4bf Stefan Weil
            *(uint8_t *)(t1 + t2) = t0;
849 7657f4bf Stefan Weil
            break;
850 7657f4bf Stefan Weil
        case INDEX_op_st16_i64:
851 7657f4bf Stefan Weil
            t0 = tci_read_r16(&tb_ptr);
852 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
853 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
854 7657f4bf Stefan Weil
            *(uint16_t *)(t1 + t2) = t0;
855 7657f4bf Stefan Weil
            break;
856 7657f4bf Stefan Weil
        case INDEX_op_st32_i64:
857 7657f4bf Stefan Weil
            t0 = tci_read_r32(&tb_ptr);
858 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
859 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
860 7657f4bf Stefan Weil
            *(uint32_t *)(t1 + t2) = t0;
861 7657f4bf Stefan Weil
            break;
862 7657f4bf Stefan Weil
        case INDEX_op_st_i64:
863 7657f4bf Stefan Weil
            t0 = tci_read_r64(&tb_ptr);
864 7657f4bf Stefan Weil
            t1 = tci_read_r(&tb_ptr);
865 7657f4bf Stefan Weil
            t2 = tci_read_i32(&tb_ptr);
866 7657f4bf Stefan Weil
            *(uint64_t *)(t1 + t2) = t0;
867 7657f4bf Stefan Weil
            break;
868 7657f4bf Stefan Weil
869 7657f4bf Stefan Weil
            /* Arithmetic operations (64 bit). */
870 7657f4bf Stefan Weil
871 7657f4bf Stefan Weil
        case INDEX_op_add_i64:
872 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
873 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
874 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
875 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 + t2);
876 7657f4bf Stefan Weil
            break;
877 7657f4bf Stefan Weil
        case INDEX_op_sub_i64:
878 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
879 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
880 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
881 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 - t2);
882 7657f4bf Stefan Weil
            break;
883 7657f4bf Stefan Weil
        case INDEX_op_mul_i64:
884 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
885 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
886 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
887 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 * t2);
888 7657f4bf Stefan Weil
            break;
889 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_div_i64
890 7657f4bf Stefan Weil
        case INDEX_op_div_i64:
891 7657f4bf Stefan Weil
        case INDEX_op_divu_i64:
892 7657f4bf Stefan Weil
        case INDEX_op_rem_i64:
893 7657f4bf Stefan Weil
        case INDEX_op_remu_i64:
894 7657f4bf Stefan Weil
            TODO();
895 7657f4bf Stefan Weil
            break;
896 7657f4bf Stefan Weil
#elif TCG_TARGET_HAS_div2_i64
897 7657f4bf Stefan Weil
        case INDEX_op_div2_i64:
898 7657f4bf Stefan Weil
        case INDEX_op_divu2_i64:
899 7657f4bf Stefan Weil
            TODO();
900 7657f4bf Stefan Weil
            break;
901 7657f4bf Stefan Weil
#endif
902 7657f4bf Stefan Weil
        case INDEX_op_and_i64:
903 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
904 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
905 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
906 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 & t2);
907 7657f4bf Stefan Weil
            break;
908 7657f4bf Stefan Weil
        case INDEX_op_or_i64:
909 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
910 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
911 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
912 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 | t2);
913 7657f4bf Stefan Weil
            break;
914 7657f4bf Stefan Weil
        case INDEX_op_xor_i64:
915 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
916 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
917 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
918 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 ^ t2);
919 7657f4bf Stefan Weil
            break;
920 7657f4bf Stefan Weil
921 7657f4bf Stefan Weil
            /* Shift/rotate operations (64 bit). */
922 7657f4bf Stefan Weil
923 7657f4bf Stefan Weil
        case INDEX_op_shl_i64:
924 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
925 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
926 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
927 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 << t2);
928 7657f4bf Stefan Weil
            break;
929 7657f4bf Stefan Weil
        case INDEX_op_shr_i64:
930 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
931 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
932 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
933 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1 >> t2);
934 7657f4bf Stefan Weil
            break;
935 7657f4bf Stefan Weil
        case INDEX_op_sar_i64:
936 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
937 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
938 7657f4bf Stefan Weil
            t2 = tci_read_ri64(&tb_ptr);
939 7657f4bf Stefan Weil
            tci_write_reg64(t0, ((int64_t)t1 >> t2));
940 7657f4bf Stefan Weil
            break;
941 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_rot_i64
942 7657f4bf Stefan Weil
        case INDEX_op_rotl_i64:
943 7657f4bf Stefan Weil
        case INDEX_op_rotr_i64:
944 7657f4bf Stefan Weil
            TODO();
945 7657f4bf Stefan Weil
            break;
946 7657f4bf Stefan Weil
#endif
947 7657f4bf Stefan Weil
        case INDEX_op_brcond_i64:
948 7657f4bf Stefan Weil
            t0 = tci_read_r64(&tb_ptr);
949 7657f4bf Stefan Weil
            t1 = tci_read_ri64(&tb_ptr);
950 7657f4bf Stefan Weil
            condition = *tb_ptr++;
951 7657f4bf Stefan Weil
            label = tci_read_label(&tb_ptr);
952 7657f4bf Stefan Weil
            if (tci_compare64(t0, t1, condition)) {
953 7657f4bf Stefan Weil
                assert(tb_ptr == old_code_ptr + op_size);
954 7657f4bf Stefan Weil
                tb_ptr = (uint8_t *)label;
955 7657f4bf Stefan Weil
                continue;
956 7657f4bf Stefan Weil
            }
957 7657f4bf Stefan Weil
            break;
958 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8u_i64
959 7657f4bf Stefan Weil
        case INDEX_op_ext8u_i64:
960 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
961 7657f4bf Stefan Weil
            t1 = tci_read_r8(&tb_ptr);
962 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
963 7657f4bf Stefan Weil
            break;
964 7657f4bf Stefan Weil
#endif
965 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext8s_i64
966 7657f4bf Stefan Weil
        case INDEX_op_ext8s_i64:
967 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
968 7657f4bf Stefan Weil
            t1 = tci_read_r8s(&tb_ptr);
969 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
970 7657f4bf Stefan Weil
            break;
971 7657f4bf Stefan Weil
#endif
972 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16s_i64
973 7657f4bf Stefan Weil
        case INDEX_op_ext16s_i64:
974 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
975 7657f4bf Stefan Weil
            t1 = tci_read_r16s(&tb_ptr);
976 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
977 7657f4bf Stefan Weil
            break;
978 7657f4bf Stefan Weil
#endif
979 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext16u_i64
980 7657f4bf Stefan Weil
        case INDEX_op_ext16u_i64:
981 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
982 7657f4bf Stefan Weil
            t1 = tci_read_r16(&tb_ptr);
983 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
984 7657f4bf Stefan Weil
            break;
985 7657f4bf Stefan Weil
#endif
986 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext32s_i64
987 7657f4bf Stefan Weil
        case INDEX_op_ext32s_i64:
988 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
989 7657f4bf Stefan Weil
            t1 = tci_read_r32s(&tb_ptr);
990 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
991 7657f4bf Stefan Weil
            break;
992 7657f4bf Stefan Weil
#endif
993 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_ext32u_i64
994 7657f4bf Stefan Weil
        case INDEX_op_ext32u_i64:
995 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
996 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
997 7657f4bf Stefan Weil
            tci_write_reg64(t0, t1);
998 7657f4bf Stefan Weil
            break;
999 7657f4bf Stefan Weil
#endif
1000 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_bswap16_i64
1001 7657f4bf Stefan Weil
        case INDEX_op_bswap16_i64:
1002 7657f4bf Stefan Weil
            TODO();
1003 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1004 7657f4bf Stefan Weil
            t1 = tci_read_r16(&tb_ptr);
1005 7657f4bf Stefan Weil
            tci_write_reg64(t0, bswap16(t1));
1006 7657f4bf Stefan Weil
            break;
1007 7657f4bf Stefan Weil
#endif
1008 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_bswap32_i64
1009 7657f4bf Stefan Weil
        case INDEX_op_bswap32_i64:
1010 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1011 7657f4bf Stefan Weil
            t1 = tci_read_r32(&tb_ptr);
1012 7657f4bf Stefan Weil
            tci_write_reg64(t0, bswap32(t1));
1013 7657f4bf Stefan Weil
            break;
1014 7657f4bf Stefan Weil
#endif
1015 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_bswap64_i64
1016 7657f4bf Stefan Weil
        case INDEX_op_bswap64_i64:
1017 7657f4bf Stefan Weil
            TODO();
1018 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1019 7657f4bf Stefan Weil
            t1 = tci_read_r64(&tb_ptr);
1020 7657f4bf Stefan Weil
            tci_write_reg64(t0, bswap64(t1));
1021 7657f4bf Stefan Weil
            break;
1022 7657f4bf Stefan Weil
#endif
1023 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_not_i64
1024 7657f4bf Stefan Weil
        case INDEX_op_not_i64:
1025 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1026 7657f4bf Stefan Weil
            t1 = tci_read_r64(&tb_ptr);
1027 7657f4bf Stefan Weil
            tci_write_reg64(t0, ~t1);
1028 7657f4bf Stefan Weil
            break;
1029 7657f4bf Stefan Weil
#endif
1030 7657f4bf Stefan Weil
#if TCG_TARGET_HAS_neg_i64
1031 7657f4bf Stefan Weil
        case INDEX_op_neg_i64:
1032 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1033 7657f4bf Stefan Weil
            t1 = tci_read_r64(&tb_ptr);
1034 7657f4bf Stefan Weil
            tci_write_reg64(t0, -t1);
1035 7657f4bf Stefan Weil
            break;
1036 7657f4bf Stefan Weil
#endif
1037 7657f4bf Stefan Weil
#endif /* TCG_TARGET_REG_BITS == 64 */
1038 7657f4bf Stefan Weil
1039 7657f4bf Stefan Weil
            /* QEMU specific operations. */
1040 7657f4bf Stefan Weil
1041 7657f4bf Stefan Weil
#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1042 7657f4bf Stefan Weil
        case INDEX_op_debug_insn_start:
1043 7657f4bf Stefan Weil
            TODO();
1044 7657f4bf Stefan Weil
            break;
1045 7657f4bf Stefan Weil
#else
1046 7657f4bf Stefan Weil
        case INDEX_op_debug_insn_start:
1047 7657f4bf Stefan Weil
            TODO();
1048 7657f4bf Stefan Weil
            break;
1049 7657f4bf Stefan Weil
#endif
1050 7657f4bf Stefan Weil
        case INDEX_op_exit_tb:
1051 7657f4bf Stefan Weil
            next_tb = *(uint64_t *)tb_ptr;
1052 7657f4bf Stefan Weil
            goto exit;
1053 7657f4bf Stefan Weil
            break;
1054 7657f4bf Stefan Weil
        case INDEX_op_goto_tb:
1055 7657f4bf Stefan Weil
            t0 = tci_read_i32(&tb_ptr);
1056 7657f4bf Stefan Weil
            assert(tb_ptr == old_code_ptr + op_size);
1057 7657f4bf Stefan Weil
            tb_ptr += (int32_t)t0;
1058 7657f4bf Stefan Weil
            continue;
1059 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld8u:
1060 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1061 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1062 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1063 3b2aba2f Stefan Weil
            tmp8 = helper_ldb_mmu(env, taddr, tci_read_i(&tb_ptr));
1064 7657f4bf Stefan Weil
#else
1065 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1066 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1067 7657f4bf Stefan Weil
            tmp8 = *(uint8_t *)(host_addr + GUEST_BASE);
1068 7657f4bf Stefan Weil
#endif
1069 7657f4bf Stefan Weil
            tci_write_reg8(t0, tmp8);
1070 7657f4bf Stefan Weil
            break;
1071 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld8s:
1072 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1073 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1074 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1075 3b2aba2f Stefan Weil
            tmp8 = helper_ldb_mmu(env, taddr, tci_read_i(&tb_ptr));
1076 7657f4bf Stefan Weil
#else
1077 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1078 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1079 7657f4bf Stefan Weil
            tmp8 = *(uint8_t *)(host_addr + GUEST_BASE);
1080 7657f4bf Stefan Weil
#endif
1081 7657f4bf Stefan Weil
            tci_write_reg8s(t0, tmp8);
1082 7657f4bf Stefan Weil
            break;
1083 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld16u:
1084 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1085 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1086 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1087 3b2aba2f Stefan Weil
            tmp16 = helper_ldw_mmu(env, taddr, tci_read_i(&tb_ptr));
1088 7657f4bf Stefan Weil
#else
1089 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1090 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1091 7657f4bf Stefan Weil
            tmp16 = tswap16(*(uint16_t *)(host_addr + GUEST_BASE));
1092 7657f4bf Stefan Weil
#endif
1093 7657f4bf Stefan Weil
            tci_write_reg16(t0, tmp16);
1094 7657f4bf Stefan Weil
            break;
1095 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld16s:
1096 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1097 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1098 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1099 3b2aba2f Stefan Weil
            tmp16 = helper_ldw_mmu(env, taddr, tci_read_i(&tb_ptr));
1100 7657f4bf Stefan Weil
#else
1101 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1102 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1103 7657f4bf Stefan Weil
            tmp16 = tswap16(*(uint16_t *)(host_addr + GUEST_BASE));
1104 7657f4bf Stefan Weil
#endif
1105 7657f4bf Stefan Weil
            tci_write_reg16s(t0, tmp16);
1106 7657f4bf Stefan Weil
            break;
1107 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 64
1108 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld32u:
1109 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1110 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1111 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1112 3b2aba2f Stefan Weil
            tmp32 = helper_ldl_mmu(env, taddr, tci_read_i(&tb_ptr));
1113 7657f4bf Stefan Weil
#else
1114 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1115 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1116 7657f4bf Stefan Weil
            tmp32 = tswap32(*(uint32_t *)(host_addr + GUEST_BASE));
1117 7657f4bf Stefan Weil
#endif
1118 7657f4bf Stefan Weil
            tci_write_reg32(t0, tmp32);
1119 7657f4bf Stefan Weil
            break;
1120 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld32s:
1121 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1122 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1123 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1124 3b2aba2f Stefan Weil
            tmp32 = helper_ldl_mmu(env, taddr, tci_read_i(&tb_ptr));
1125 7657f4bf Stefan Weil
#else
1126 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1127 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1128 7657f4bf Stefan Weil
            tmp32 = tswap32(*(uint32_t *)(host_addr + GUEST_BASE));
1129 7657f4bf Stefan Weil
#endif
1130 7657f4bf Stefan Weil
            tci_write_reg32s(t0, tmp32);
1131 7657f4bf Stefan Weil
            break;
1132 7657f4bf Stefan Weil
#endif /* TCG_TARGET_REG_BITS == 64 */
1133 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld32:
1134 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1135 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1136 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1137 3b2aba2f Stefan Weil
            tmp32 = helper_ldl_mmu(env, taddr, tci_read_i(&tb_ptr));
1138 7657f4bf Stefan Weil
#else
1139 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1140 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1141 7657f4bf Stefan Weil
            tmp32 = tswap32(*(uint32_t *)(host_addr + GUEST_BASE));
1142 7657f4bf Stefan Weil
#endif
1143 7657f4bf Stefan Weil
            tci_write_reg32(t0, tmp32);
1144 7657f4bf Stefan Weil
            break;
1145 7657f4bf Stefan Weil
        case INDEX_op_qemu_ld64:
1146 7657f4bf Stefan Weil
            t0 = *tb_ptr++;
1147 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
1148 7657f4bf Stefan Weil
            t1 = *tb_ptr++;
1149 7657f4bf Stefan Weil
#endif
1150 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1151 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1152 3b2aba2f Stefan Weil
            tmp64 = helper_ldq_mmu(env, taddr, tci_read_i(&tb_ptr));
1153 7657f4bf Stefan Weil
#else
1154 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1155 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1156 7657f4bf Stefan Weil
            tmp64 = tswap64(*(uint64_t *)(host_addr + GUEST_BASE));
1157 7657f4bf Stefan Weil
#endif
1158 7657f4bf Stefan Weil
            tci_write_reg(t0, tmp64);
1159 7657f4bf Stefan Weil
#if TCG_TARGET_REG_BITS == 32
1160 7657f4bf Stefan Weil
            tci_write_reg(t1, tmp64 >> 32);
1161 7657f4bf Stefan Weil
#endif
1162 7657f4bf Stefan Weil
            break;
1163 7657f4bf Stefan Weil
        case INDEX_op_qemu_st8:
1164 7657f4bf Stefan Weil
            t0 = tci_read_r8(&tb_ptr);
1165 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1166 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1167 7657f4bf Stefan Weil
            t2 = tci_read_i(&tb_ptr);
1168 3b2aba2f Stefan Weil
            helper_stb_mmu(env, taddr, t0, t2);
1169 7657f4bf Stefan Weil
#else
1170 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1171 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1172 7657f4bf Stefan Weil
            *(uint8_t *)(host_addr + GUEST_BASE) = t0;
1173 7657f4bf Stefan Weil
#endif
1174 7657f4bf Stefan Weil
            break;
1175 7657f4bf Stefan Weil
        case INDEX_op_qemu_st16:
1176 7657f4bf Stefan Weil
            t0 = tci_read_r16(&tb_ptr);
1177 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1178 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1179 7657f4bf Stefan Weil
            t2 = tci_read_i(&tb_ptr);
1180 3b2aba2f Stefan Weil
            helper_stw_mmu(env, taddr, t0, t2);
1181 7657f4bf Stefan Weil
#else
1182 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1183 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1184 7657f4bf Stefan Weil
            *(uint16_t *)(host_addr + GUEST_BASE) = tswap16(t0);
1185 7657f4bf Stefan Weil
#endif
1186 7657f4bf Stefan Weil
            break;
1187 7657f4bf Stefan Weil
        case INDEX_op_qemu_st32:
1188 7657f4bf Stefan Weil
            t0 = tci_read_r32(&tb_ptr);
1189 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1190 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1191 7657f4bf Stefan Weil
            t2 = tci_read_i(&tb_ptr);
1192 3b2aba2f Stefan Weil
            helper_stl_mmu(env, taddr, t0, t2);
1193 7657f4bf Stefan Weil
#else
1194 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1195 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1196 7657f4bf Stefan Weil
            *(uint32_t *)(host_addr + GUEST_BASE) = tswap32(t0);
1197 7657f4bf Stefan Weil
#endif
1198 7657f4bf Stefan Weil
            break;
1199 7657f4bf Stefan Weil
        case INDEX_op_qemu_st64:
1200 7657f4bf Stefan Weil
            tmp64 = tci_read_r64(&tb_ptr);
1201 7657f4bf Stefan Weil
            taddr = tci_read_ulong(&tb_ptr);
1202 7657f4bf Stefan Weil
#ifdef CONFIG_SOFTMMU
1203 7657f4bf Stefan Weil
            t2 = tci_read_i(&tb_ptr);
1204 3b2aba2f Stefan Weil
            helper_stq_mmu(env, taddr, tmp64, t2);
1205 7657f4bf Stefan Weil
#else
1206 7657f4bf Stefan Weil
            host_addr = (tcg_target_ulong)taddr;
1207 7657f4bf Stefan Weil
            assert(taddr == host_addr);
1208 7657f4bf Stefan Weil
            *(uint64_t *)(host_addr + GUEST_BASE) = tswap64(tmp64);
1209 7657f4bf Stefan Weil
#endif
1210 7657f4bf Stefan Weil
            break;
1211 7657f4bf Stefan Weil
        default:
1212 7657f4bf Stefan Weil
            TODO();
1213 7657f4bf Stefan Weil
            break;
1214 7657f4bf Stefan Weil
        }
1215 7657f4bf Stefan Weil
        assert(tb_ptr == old_code_ptr + op_size);
1216 7657f4bf Stefan Weil
    }
1217 7657f4bf Stefan Weil
exit:
1218 7657f4bf Stefan Weil
    return next_tb;
1219 7657f4bf Stefan Weil
}