Statistics
| Branch: | Revision:

root / tci.c @ e2134eb9

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