Statistics
| Branch: | Revision:

root / tci.c @ 57c83dac

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