Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ ffc500ea

History | View | Annotate | Download (75.2 kB)

1 4c9649a9 j_mayer
/*
2 4c9649a9 j_mayer
 *  Alpha emulation cpu translation for qemu.
3 5fafdf24 ths
 *
4 4c9649a9 j_mayer
 *  Copyright (c) 2007 Jocelyn Mayer
5 4c9649a9 j_mayer
 *
6 4c9649a9 j_mayer
 * This library is free software; you can redistribute it and/or
7 4c9649a9 j_mayer
 * modify it under the terms of the GNU Lesser General Public
8 4c9649a9 j_mayer
 * License as published by the Free Software Foundation; either
9 4c9649a9 j_mayer
 * version 2 of the License, or (at your option) any later version.
10 4c9649a9 j_mayer
 *
11 4c9649a9 j_mayer
 * This library is distributed in the hope that it will be useful,
12 4c9649a9 j_mayer
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 4c9649a9 j_mayer
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4c9649a9 j_mayer
 * Lesser General Public License for more details.
15 4c9649a9 j_mayer
 *
16 4c9649a9 j_mayer
 * You should have received a copy of the GNU Lesser General Public
17 4c9649a9 j_mayer
 * License along with this library; if not, write to the Free Software
18 fad6cb1a aurel32
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
19 4c9649a9 j_mayer
 */
20 4c9649a9 j_mayer
21 4c9649a9 j_mayer
#include <stdint.h>
22 4c9649a9 j_mayer
#include <stdlib.h>
23 4c9649a9 j_mayer
#include <stdio.h>
24 4c9649a9 j_mayer
25 4c9649a9 j_mayer
#include "cpu.h"
26 4c9649a9 j_mayer
#include "exec-all.h"
27 4c9649a9 j_mayer
#include "disas.h"
28 ae8ecd42 aurel32
#include "host-utils.h"
29 57fec1fe bellard
#include "tcg-op.h"
30 ca10f867 aurel32
#include "qemu-common.h"
31 4c9649a9 j_mayer
32 a7812ae4 pbrook
#include "helper.h"
33 a7812ae4 pbrook
#define GEN_HELPER 1
34 a7812ae4 pbrook
#include "helper.h"
35 a7812ae4 pbrook
36 55489a17 aurel32
/* #define DO_SINGLE_STEP */
37 4c9649a9 j_mayer
#define ALPHA_DEBUG_DISAS
38 55489a17 aurel32
/* #define DO_TB_FLUSH */
39 4c9649a9 j_mayer
40 d12d51d5 aliguori
41 d12d51d5 aliguori
#ifdef ALPHA_DEBUG_DISAS
42 93fcfe39 aliguori
#  define LOG_DISAS(...) qemu_log(__VA_ARGS__)
43 d12d51d5 aliguori
#else
44 d12d51d5 aliguori
#  define LOG_DISAS(...) do { } while (0)
45 d12d51d5 aliguori
#endif
46 d12d51d5 aliguori
47 4c9649a9 j_mayer
typedef struct DisasContext DisasContext;
48 4c9649a9 j_mayer
struct DisasContext {
49 4c9649a9 j_mayer
    uint64_t pc;
50 4c9649a9 j_mayer
    int mem_idx;
51 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
52 4c9649a9 j_mayer
    int pal_mode;
53 4c9649a9 j_mayer
#endif
54 8579095b aurel32
    CPUAlphaState *env;
55 4c9649a9 j_mayer
    uint32_t amask;
56 4c9649a9 j_mayer
};
57 4c9649a9 j_mayer
58 3761035f aurel32
/* global register indexes */
59 a7812ae4 pbrook
static TCGv_ptr cpu_env;
60 496cb5b9 aurel32
static TCGv cpu_ir[31];
61 f18cd223 aurel32
static TCGv cpu_fir[31];
62 496cb5b9 aurel32
static TCGv cpu_pc;
63 f4ed8679 aurel32
static TCGv cpu_lock;
64 496cb5b9 aurel32
65 3761035f aurel32
/* register names */
66 f18cd223 aurel32
static char cpu_reg_names[10*4+21*5 + 10*5+21*6];
67 2e70f6ef pbrook
68 2e70f6ef pbrook
#include "gen-icount.h"
69 2e70f6ef pbrook
70 a5f1b965 blueswir1
static void alpha_translate_init(void)
71 2e70f6ef pbrook
{
72 496cb5b9 aurel32
    int i;
73 496cb5b9 aurel32
    char *p;
74 2e70f6ef pbrook
    static int done_init = 0;
75 496cb5b9 aurel32
76 2e70f6ef pbrook
    if (done_init)
77 2e70f6ef pbrook
        return;
78 496cb5b9 aurel32
79 a7812ae4 pbrook
    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
80 496cb5b9 aurel32
81 496cb5b9 aurel32
    p = cpu_reg_names;
82 496cb5b9 aurel32
    for (i = 0; i < 31; i++) {
83 496cb5b9 aurel32
        sprintf(p, "ir%d", i);
84 a7812ae4 pbrook
        cpu_ir[i] = tcg_global_mem_new_i64(TCG_AREG0,
85 a7812ae4 pbrook
                                           offsetof(CPUState, ir[i]), p);
86 6ba8dcd7 aurel32
        p += (i < 10) ? 4 : 5;
87 f18cd223 aurel32
88 f18cd223 aurel32
        sprintf(p, "fir%d", i);
89 a7812ae4 pbrook
        cpu_fir[i] = tcg_global_mem_new_i64(TCG_AREG0,
90 a7812ae4 pbrook
                                            offsetof(CPUState, fir[i]), p);
91 f18cd223 aurel32
        p += (i < 10) ? 5 : 6;
92 496cb5b9 aurel32
    }
93 496cb5b9 aurel32
94 a7812ae4 pbrook
    cpu_pc = tcg_global_mem_new_i64(TCG_AREG0,
95 a7812ae4 pbrook
                                    offsetof(CPUState, pc), "pc");
96 496cb5b9 aurel32
97 a7812ae4 pbrook
    cpu_lock = tcg_global_mem_new_i64(TCG_AREG0,
98 a7812ae4 pbrook
                                      offsetof(CPUState, lock), "lock");
99 f4ed8679 aurel32
100 496cb5b9 aurel32
    /* register helpers */
101 a7812ae4 pbrook
#define GEN_HELPER 2
102 496cb5b9 aurel32
#include "helper.h"
103 496cb5b9 aurel32
104 2e70f6ef pbrook
    done_init = 1;
105 2e70f6ef pbrook
}
106 2e70f6ef pbrook
107 f071b4d3 j_mayer
static always_inline void gen_excp (DisasContext *ctx,
108 f071b4d3 j_mayer
                                    int exception, int error_code)
109 4c9649a9 j_mayer
{
110 a7812ae4 pbrook
    TCGv_i32 tmp1, tmp2;
111 6ad02592 aurel32
112 496cb5b9 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
113 6ad02592 aurel32
    tmp1 = tcg_const_i32(exception);
114 6ad02592 aurel32
    tmp2 = tcg_const_i32(error_code);
115 a7812ae4 pbrook
    gen_helper_excp(tmp1, tmp2);
116 a7812ae4 pbrook
    tcg_temp_free_i32(tmp2);
117 a7812ae4 pbrook
    tcg_temp_free_i32(tmp1);
118 4c9649a9 j_mayer
}
119 4c9649a9 j_mayer
120 f071b4d3 j_mayer
static always_inline void gen_invalid (DisasContext *ctx)
121 4c9649a9 j_mayer
{
122 4c9649a9 j_mayer
    gen_excp(ctx, EXCP_OPCDEC, 0);
123 4c9649a9 j_mayer
}
124 4c9649a9 j_mayer
125 f18cd223 aurel32
static always_inline void gen_qemu_ldf (TCGv t0, TCGv t1, int flags)
126 f18cd223 aurel32
{
127 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
128 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
129 f18cd223 aurel32
    tcg_gen_qemu_ld32u(tmp, t1, flags);
130 a7812ae4 pbrook
    tcg_gen_trunc_i64_i32(tmp32, tmp);
131 a7812ae4 pbrook
    gen_helper_memory_to_f(t0, tmp32);
132 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
133 f18cd223 aurel32
    tcg_temp_free(tmp);
134 f18cd223 aurel32
}
135 f18cd223 aurel32
136 f18cd223 aurel32
static always_inline void gen_qemu_ldg (TCGv t0, TCGv t1, int flags)
137 f18cd223 aurel32
{
138 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
139 f18cd223 aurel32
    tcg_gen_qemu_ld64(tmp, t1, flags);
140 a7812ae4 pbrook
    gen_helper_memory_to_g(t0, tmp);
141 f18cd223 aurel32
    tcg_temp_free(tmp);
142 f18cd223 aurel32
}
143 f18cd223 aurel32
144 f18cd223 aurel32
static always_inline void gen_qemu_lds (TCGv t0, TCGv t1, int flags)
145 f18cd223 aurel32
{
146 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
147 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
148 f18cd223 aurel32
    tcg_gen_qemu_ld32u(tmp, t1, flags);
149 a7812ae4 pbrook
    tcg_gen_trunc_i64_i32(tmp32, tmp);
150 a7812ae4 pbrook
    gen_helper_memory_to_s(t0, tmp32);
151 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
152 f18cd223 aurel32
    tcg_temp_free(tmp);
153 f18cd223 aurel32
}
154 f18cd223 aurel32
155 f4ed8679 aurel32
static always_inline void gen_qemu_ldl_l (TCGv t0, TCGv t1, int flags)
156 f4ed8679 aurel32
{
157 f4ed8679 aurel32
    tcg_gen_mov_i64(cpu_lock, t1);
158 f4ed8679 aurel32
    tcg_gen_qemu_ld32s(t0, t1, flags);
159 f4ed8679 aurel32
}
160 f4ed8679 aurel32
161 f4ed8679 aurel32
static always_inline void gen_qemu_ldq_l (TCGv t0, TCGv t1, int flags)
162 f4ed8679 aurel32
{
163 f4ed8679 aurel32
    tcg_gen_mov_i64(cpu_lock, t1);
164 f4ed8679 aurel32
    tcg_gen_qemu_ld64(t0, t1, flags);
165 f4ed8679 aurel32
}
166 f4ed8679 aurel32
167 023d8ca2 aurel32
static always_inline void gen_load_mem (DisasContext *ctx,
168 023d8ca2 aurel32
                                        void (*tcg_gen_qemu_load)(TCGv t0, TCGv t1, int flags),
169 023d8ca2 aurel32
                                        int ra, int rb, int32_t disp16,
170 f18cd223 aurel32
                                        int fp, int clear)
171 023d8ca2 aurel32
{
172 023d8ca2 aurel32
    TCGv addr;
173 023d8ca2 aurel32
174 023d8ca2 aurel32
    if (unlikely(ra == 31))
175 023d8ca2 aurel32
        return;
176 023d8ca2 aurel32
177 a7812ae4 pbrook
    addr = tcg_temp_new();
178 023d8ca2 aurel32
    if (rb != 31) {
179 023d8ca2 aurel32
        tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
180 023d8ca2 aurel32
        if (clear)
181 023d8ca2 aurel32
            tcg_gen_andi_i64(addr, addr, ~0x7);
182 023d8ca2 aurel32
    } else {
183 023d8ca2 aurel32
        if (clear)
184 023d8ca2 aurel32
            disp16 &= ~0x7;
185 023d8ca2 aurel32
        tcg_gen_movi_i64(addr, disp16);
186 023d8ca2 aurel32
    }
187 f18cd223 aurel32
    if (fp)
188 f18cd223 aurel32
        tcg_gen_qemu_load(cpu_fir[ra], addr, ctx->mem_idx);
189 f18cd223 aurel32
    else
190 f18cd223 aurel32
        tcg_gen_qemu_load(cpu_ir[ra], addr, ctx->mem_idx);
191 023d8ca2 aurel32
    tcg_temp_free(addr);
192 023d8ca2 aurel32
}
193 023d8ca2 aurel32
194 f18cd223 aurel32
static always_inline void gen_qemu_stf (TCGv t0, TCGv t1, int flags)
195 f18cd223 aurel32
{
196 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
197 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
198 a7812ae4 pbrook
    gen_helper_f_to_memory(tmp32, t0);
199 a7812ae4 pbrook
    tcg_gen_extu_i32_i64(tmp, tmp32);
200 f18cd223 aurel32
    tcg_gen_qemu_st32(tmp, t1, flags);
201 f18cd223 aurel32
    tcg_temp_free(tmp);
202 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
203 f18cd223 aurel32
}
204 f18cd223 aurel32
205 f18cd223 aurel32
static always_inline void gen_qemu_stg (TCGv t0, TCGv t1, int flags)
206 f18cd223 aurel32
{
207 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
208 a7812ae4 pbrook
    gen_helper_g_to_memory(tmp, t0);
209 f18cd223 aurel32
    tcg_gen_qemu_st64(tmp, t1, flags);
210 f18cd223 aurel32
    tcg_temp_free(tmp);
211 f18cd223 aurel32
}
212 f18cd223 aurel32
213 f18cd223 aurel32
static always_inline void gen_qemu_sts (TCGv t0, TCGv t1, int flags)
214 f18cd223 aurel32
{
215 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
216 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
217 a7812ae4 pbrook
    gen_helper_s_to_memory(tmp32, t0);
218 a7812ae4 pbrook
    tcg_gen_extu_i32_i64(tmp, tmp32);
219 f18cd223 aurel32
    tcg_gen_qemu_st32(tmp, t1, flags);
220 f18cd223 aurel32
    tcg_temp_free(tmp);
221 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
222 f18cd223 aurel32
}
223 f18cd223 aurel32
224 f4ed8679 aurel32
static always_inline void gen_qemu_stl_c (TCGv t0, TCGv t1, int flags)
225 f4ed8679 aurel32
{
226 f4ed8679 aurel32
    int l1, l2;
227 f4ed8679 aurel32
228 f4ed8679 aurel32
    l1 = gen_new_label();
229 f4ed8679 aurel32
    l2 = gen_new_label();
230 f4ed8679 aurel32
    tcg_gen_brcond_i64(TCG_COND_NE, cpu_lock, t1, l1);
231 f4ed8679 aurel32
    tcg_gen_qemu_st32(t0, t1, flags);
232 6223246a aurel32
    tcg_gen_movi_i64(t0, 1);
233 f4ed8679 aurel32
    tcg_gen_br(l2);
234 f4ed8679 aurel32
    gen_set_label(l1);
235 6223246a aurel32
    tcg_gen_movi_i64(t0, 0);
236 f4ed8679 aurel32
    gen_set_label(l2);
237 f4ed8679 aurel32
    tcg_gen_movi_i64(cpu_lock, -1);
238 f4ed8679 aurel32
}
239 f4ed8679 aurel32
240 f4ed8679 aurel32
static always_inline void gen_qemu_stq_c (TCGv t0, TCGv t1, int flags)
241 f4ed8679 aurel32
{
242 f4ed8679 aurel32
    int l1, l2;
243 f4ed8679 aurel32
244 f4ed8679 aurel32
    l1 = gen_new_label();
245 f4ed8679 aurel32
    l2 = gen_new_label();
246 f4ed8679 aurel32
    tcg_gen_brcond_i64(TCG_COND_NE, cpu_lock, t1, l1);
247 f4ed8679 aurel32
    tcg_gen_qemu_st64(t0, t1, flags);
248 6223246a aurel32
    tcg_gen_movi_i64(t0, 1);
249 f4ed8679 aurel32
    tcg_gen_br(l2);
250 f4ed8679 aurel32
    gen_set_label(l1);
251 6223246a aurel32
    tcg_gen_movi_i64(t0, 0);
252 f4ed8679 aurel32
    gen_set_label(l2);
253 f4ed8679 aurel32
    tcg_gen_movi_i64(cpu_lock, -1);
254 f4ed8679 aurel32
}
255 f4ed8679 aurel32
256 023d8ca2 aurel32
static always_inline void gen_store_mem (DisasContext *ctx,
257 023d8ca2 aurel32
                                         void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1, int flags),
258 023d8ca2 aurel32
                                         int ra, int rb, int32_t disp16,
259 57a92c8e aurel32
                                         int fp, int clear, int local)
260 023d8ca2 aurel32
{
261 9cd38c23 aurel32
    TCGv addr;
262 57a92c8e aurel32
    if (local)
263 a7812ae4 pbrook
        addr = tcg_temp_local_new();
264 57a92c8e aurel32
    else
265 a7812ae4 pbrook
        addr = tcg_temp_new();
266 023d8ca2 aurel32
    if (rb != 31) {
267 023d8ca2 aurel32
        tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
268 023d8ca2 aurel32
        if (clear)
269 023d8ca2 aurel32
            tcg_gen_andi_i64(addr, addr, ~0x7);
270 023d8ca2 aurel32
    } else {
271 023d8ca2 aurel32
        if (clear)
272 023d8ca2 aurel32
            disp16 &= ~0x7;
273 023d8ca2 aurel32
        tcg_gen_movi_i64(addr, disp16);
274 023d8ca2 aurel32
    }
275 f18cd223 aurel32
    if (ra != 31) {
276 f18cd223 aurel32
        if (fp)
277 f18cd223 aurel32
            tcg_gen_qemu_store(cpu_fir[ra], addr, ctx->mem_idx);
278 f18cd223 aurel32
        else
279 f18cd223 aurel32
            tcg_gen_qemu_store(cpu_ir[ra], addr, ctx->mem_idx);
280 f18cd223 aurel32
    } else {
281 57a92c8e aurel32
        TCGv zero;
282 57a92c8e aurel32
        if (local)
283 57a92c8e aurel32
            zero = tcg_const_local_i64(0);
284 57a92c8e aurel32
        else
285 57a92c8e aurel32
            zero = tcg_const_i64(0);
286 023d8ca2 aurel32
        tcg_gen_qemu_store(zero, addr, ctx->mem_idx);
287 023d8ca2 aurel32
        tcg_temp_free(zero);
288 023d8ca2 aurel32
    }
289 023d8ca2 aurel32
    tcg_temp_free(addr);
290 023d8ca2 aurel32
}
291 023d8ca2 aurel32
292 f071b4d3 j_mayer
static always_inline void gen_bcond (DisasContext *ctx,
293 9c29504e aurel32
                                     TCGCond cond,
294 a1516744 aurel32
                                     int ra, int32_t disp, int mask)
295 4c9649a9 j_mayer
{
296 9c29504e aurel32
    int l1, l2;
297 9c29504e aurel32
298 9c29504e aurel32
    l1 = gen_new_label();
299 9c29504e aurel32
    l2 = gen_new_label();
300 9c29504e aurel32
    if (likely(ra != 31)) {
301 9c29504e aurel32
        if (mask) {
302 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
303 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
304 9c29504e aurel32
            tcg_gen_brcondi_i64(cond, tmp, 0, l1);
305 9c29504e aurel32
            tcg_temp_free(tmp);
306 9c29504e aurel32
        } else
307 9c29504e aurel32
            tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1);
308 9c29504e aurel32
    } else {
309 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
310 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
311 9c29504e aurel32
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
312 9c29504e aurel32
        tcg_temp_free(tmp);
313 9c29504e aurel32
    }
314 9c29504e aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
315 9c29504e aurel32
    tcg_gen_br(l2);
316 9c29504e aurel32
    gen_set_label(l1);
317 a1516744 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp << 2));
318 9c29504e aurel32
    gen_set_label(l2);
319 4c9649a9 j_mayer
}
320 4c9649a9 j_mayer
321 a7812ae4 pbrook
static always_inline void gen_fbcond (DisasContext *ctx, int opc,
322 f071b4d3 j_mayer
                                      int ra, int32_t disp16)
323 4c9649a9 j_mayer
{
324 f18cd223 aurel32
    int l1, l2;
325 f18cd223 aurel32
    TCGv tmp;
326 a7812ae4 pbrook
    TCGv src;
327 f18cd223 aurel32
328 f18cd223 aurel32
    l1 = gen_new_label();
329 f18cd223 aurel32
    l2 = gen_new_label();
330 f18cd223 aurel32
    if (ra != 31) {
331 a7812ae4 pbrook
        tmp = tcg_temp_new();
332 a7812ae4 pbrook
        src = cpu_fir[ra];
333 f18cd223 aurel32
    } else  {
334 f18cd223 aurel32
        tmp = tcg_const_i64(0);
335 a7812ae4 pbrook
        src = tmp;
336 a7812ae4 pbrook
    }
337 a7812ae4 pbrook
    switch (opc) {
338 a7812ae4 pbrook
    case 0x31: /* FBEQ */
339 a7812ae4 pbrook
        gen_helper_cmpfeq(tmp, src);
340 a7812ae4 pbrook
        break;
341 a7812ae4 pbrook
    case 0x32: /* FBLT */
342 a7812ae4 pbrook
        gen_helper_cmpflt(tmp, src);
343 a7812ae4 pbrook
        break;
344 a7812ae4 pbrook
    case 0x33: /* FBLE */
345 a7812ae4 pbrook
        gen_helper_cmpfle(tmp, src);
346 a7812ae4 pbrook
        break;
347 a7812ae4 pbrook
    case 0x35: /* FBNE */
348 a7812ae4 pbrook
        gen_helper_cmpfne(tmp, src);
349 a7812ae4 pbrook
        break;
350 a7812ae4 pbrook
    case 0x36: /* FBGE */
351 a7812ae4 pbrook
        gen_helper_cmpfge(tmp, src);
352 a7812ae4 pbrook
        break;
353 a7812ae4 pbrook
    case 0x37: /* FBGT */
354 a7812ae4 pbrook
        gen_helper_cmpfgt(tmp, src);
355 a7812ae4 pbrook
        break;
356 a7812ae4 pbrook
    default:
357 a7812ae4 pbrook
        abort();
358 f18cd223 aurel32
    }
359 f18cd223 aurel32
    tcg_gen_brcondi_i64(TCG_COND_NE, tmp, 0, l1);
360 f18cd223 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
361 f18cd223 aurel32
    tcg_gen_br(l2);
362 f18cd223 aurel32
    gen_set_label(l1);
363 f18cd223 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2));
364 f18cd223 aurel32
    gen_set_label(l2);
365 4c9649a9 j_mayer
}
366 4c9649a9 j_mayer
367 fe2b269a aurel32
static always_inline void gen_cmov (TCGCond inv_cond,
368 f071b4d3 j_mayer
                                    int ra, int rb, int rc,
369 adf3c8b6 aurel32
                                    int islit, uint8_t lit, int mask)
370 4c9649a9 j_mayer
{
371 9c29504e aurel32
    int l1;
372 9c29504e aurel32
373 9c29504e aurel32
    if (unlikely(rc == 31))
374 9c29504e aurel32
        return;
375 9c29504e aurel32
376 9c29504e aurel32
    l1 = gen_new_label();
377 9c29504e aurel32
378 9c29504e aurel32
    if (ra != 31) {
379 9c29504e aurel32
        if (mask) {
380 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
381 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
382 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
383 9c29504e aurel32
            tcg_temp_free(tmp);
384 9c29504e aurel32
        } else
385 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
386 9c29504e aurel32
    } else {
387 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
388 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
389 9c29504e aurel32
        tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
390 9c29504e aurel32
        tcg_temp_free(tmp);
391 9c29504e aurel32
    }
392 9c29504e aurel32
393 4c9649a9 j_mayer
    if (islit)
394 9c29504e aurel32
        tcg_gen_movi_i64(cpu_ir[rc], lit);
395 4c9649a9 j_mayer
    else
396 dfaa8583 aurel32
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
397 9c29504e aurel32
    gen_set_label(l1);
398 4c9649a9 j_mayer
}
399 4c9649a9 j_mayer
400 a7812ae4 pbrook
#define FARITH2(name)                                       \
401 a7812ae4 pbrook
static always_inline void glue(gen_f, name)(int rb, int rc) \
402 a7812ae4 pbrook
{                                                           \
403 a7812ae4 pbrook
    if (unlikely(rc == 31))                                 \
404 a7812ae4 pbrook
      return;                                               \
405 a7812ae4 pbrook
                                                            \
406 a7812ae4 pbrook
    if (rb != 31)                                           \
407 a7812ae4 pbrook
        gen_helper_ ## name (cpu_fir[rc], cpu_fir[rb]);    \
408 a7812ae4 pbrook
    else {                                                  \
409 a7812ae4 pbrook
        TCGv tmp = tcg_const_i64(0);                        \
410 a7812ae4 pbrook
        gen_helper_ ## name (cpu_fir[rc], tmp);            \
411 a7812ae4 pbrook
        tcg_temp_free(tmp);                                 \
412 a7812ae4 pbrook
    }                                                       \
413 4c9649a9 j_mayer
}
414 a7812ae4 pbrook
FARITH2(sqrts)
415 a7812ae4 pbrook
FARITH2(sqrtf)
416 a7812ae4 pbrook
FARITH2(sqrtg)
417 a7812ae4 pbrook
FARITH2(sqrtt)
418 a7812ae4 pbrook
FARITH2(cvtgf)
419 a7812ae4 pbrook
FARITH2(cvtgq)
420 a7812ae4 pbrook
FARITH2(cvtqf)
421 a7812ae4 pbrook
FARITH2(cvtqg)
422 a7812ae4 pbrook
FARITH2(cvtst)
423 a7812ae4 pbrook
FARITH2(cvtts)
424 a7812ae4 pbrook
FARITH2(cvttq)
425 a7812ae4 pbrook
FARITH2(cvtqs)
426 a7812ae4 pbrook
FARITH2(cvtqt)
427 a7812ae4 pbrook
FARITH2(cvtlq)
428 a7812ae4 pbrook
FARITH2(cvtql)
429 a7812ae4 pbrook
FARITH2(cvtqlv)
430 a7812ae4 pbrook
FARITH2(cvtqlsv)
431 a7812ae4 pbrook
432 a7812ae4 pbrook
#define FARITH3(name)                                                     \
433 a7812ae4 pbrook
static always_inline void glue(gen_f, name) (int ra, int rb, int rc)      \
434 a7812ae4 pbrook
{                                                                         \
435 a7812ae4 pbrook
    if (unlikely(rc == 31))                                               \
436 a7812ae4 pbrook
        return;                                                           \
437 a7812ae4 pbrook
                                                                          \
438 a7812ae4 pbrook
    if (ra != 31) {                                                       \
439 a7812ae4 pbrook
        if (rb != 31)                                                     \
440 a7812ae4 pbrook
            gen_helper_ ## name (cpu_fir[rc], cpu_fir[ra], cpu_fir[rb]);  \
441 a7812ae4 pbrook
        else {                                                            \
442 a7812ae4 pbrook
            TCGv tmp = tcg_const_i64(0);                                  \
443 a7812ae4 pbrook
            gen_helper_ ## name (cpu_fir[rc], cpu_fir[ra], tmp);          \
444 a7812ae4 pbrook
            tcg_temp_free(tmp);                                           \
445 a7812ae4 pbrook
        }                                                                 \
446 a7812ae4 pbrook
    } else {                                                              \
447 a7812ae4 pbrook
        TCGv tmp = tcg_const_i64(0);                                      \
448 a7812ae4 pbrook
        if (rb != 31)                                                     \
449 a7812ae4 pbrook
            gen_helper_ ## name (cpu_fir[rc], tmp, cpu_fir[rb]);          \
450 a7812ae4 pbrook
        else                                                              \
451 a7812ae4 pbrook
            gen_helper_ ## name (cpu_fir[rc], tmp, tmp);                   \
452 a7812ae4 pbrook
        tcg_temp_free(tmp);                                               \
453 a7812ae4 pbrook
    }                                                                     \
454 4c9649a9 j_mayer
}
455 4c9649a9 j_mayer
456 a7812ae4 pbrook
FARITH3(addf)
457 a7812ae4 pbrook
FARITH3(subf)
458 a7812ae4 pbrook
FARITH3(mulf)
459 a7812ae4 pbrook
FARITH3(divf)
460 a7812ae4 pbrook
FARITH3(addg)
461 a7812ae4 pbrook
FARITH3(subg)
462 a7812ae4 pbrook
FARITH3(mulg)
463 a7812ae4 pbrook
FARITH3(divg)
464 a7812ae4 pbrook
FARITH3(cmpgeq)
465 a7812ae4 pbrook
FARITH3(cmpglt)
466 a7812ae4 pbrook
FARITH3(cmpgle)
467 a7812ae4 pbrook
FARITH3(adds)
468 a7812ae4 pbrook
FARITH3(subs)
469 a7812ae4 pbrook
FARITH3(muls)
470 a7812ae4 pbrook
FARITH3(divs)
471 a7812ae4 pbrook
FARITH3(addt)
472 a7812ae4 pbrook
FARITH3(subt)
473 a7812ae4 pbrook
FARITH3(mult)
474 a7812ae4 pbrook
FARITH3(divt)
475 a7812ae4 pbrook
FARITH3(cmptun)
476 a7812ae4 pbrook
FARITH3(cmpteq)
477 a7812ae4 pbrook
FARITH3(cmptlt)
478 a7812ae4 pbrook
FARITH3(cmptle)
479 a7812ae4 pbrook
FARITH3(cpys)
480 a7812ae4 pbrook
FARITH3(cpysn)
481 a7812ae4 pbrook
FARITH3(cpyse)
482 a7812ae4 pbrook
483 a7812ae4 pbrook
#define FCMOV(name)                                                   \
484 a7812ae4 pbrook
static always_inline void glue(gen_f, name) (int ra, int rb, int rc)  \
485 a7812ae4 pbrook
{                                                                     \
486 a7812ae4 pbrook
    int l1;                                                           \
487 a7812ae4 pbrook
    TCGv tmp;                                                         \
488 a7812ae4 pbrook
                                                                      \
489 a7812ae4 pbrook
    if (unlikely(rc == 31))                                           \
490 a7812ae4 pbrook
        return;                                                       \
491 a7812ae4 pbrook
                                                                      \
492 a7812ae4 pbrook
    l1 = gen_new_label();                                             \
493 a7812ae4 pbrook
    tmp = tcg_temp_new();                                 \
494 a7812ae4 pbrook
    if (ra != 31) {                                                   \
495 a7812ae4 pbrook
        tmp = tcg_temp_new();                             \
496 a7812ae4 pbrook
        gen_helper_ ## name (tmp, cpu_fir[ra]);                       \
497 a7812ae4 pbrook
    } else  {                                                         \
498 a7812ae4 pbrook
        tmp = tcg_const_i64(0);                                       \
499 a7812ae4 pbrook
        gen_helper_ ## name (tmp, tmp);                               \
500 a7812ae4 pbrook
    }                                                                 \
501 a7812ae4 pbrook
    tcg_gen_brcondi_i64(TCG_COND_EQ, tmp, 0, l1);                     \
502 a7812ae4 pbrook
    if (rb != 31)                                                     \
503 a7812ae4 pbrook
        tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[ra]);                    \
504 a7812ae4 pbrook
    else                                                              \
505 a7812ae4 pbrook
        tcg_gen_movi_i64(cpu_fir[rc], 0);                             \
506 a7812ae4 pbrook
    gen_set_label(l1);                                                \
507 4c9649a9 j_mayer
}
508 a7812ae4 pbrook
FCMOV(cmpfeq)
509 a7812ae4 pbrook
FCMOV(cmpfne)
510 a7812ae4 pbrook
FCMOV(cmpflt)
511 a7812ae4 pbrook
FCMOV(cmpfge)
512 a7812ae4 pbrook
FCMOV(cmpfle)
513 a7812ae4 pbrook
FCMOV(cmpfgt)
514 4c9649a9 j_mayer
515 b3249f63 aurel32
/* EXTWH, EXTWH, EXTLH, EXTQH */
516 b3249f63 aurel32
static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
517 b3249f63 aurel32
                                    int ra, int rb, int rc,
518 adf3c8b6 aurel32
                                    int islit, uint8_t lit)
519 b3249f63 aurel32
{
520 b3249f63 aurel32
    if (unlikely(rc == 31))
521 b3249f63 aurel32
        return;
522 b3249f63 aurel32
523 b3249f63 aurel32
    if (ra != 31) {
524 dfaa8583 aurel32
        if (islit) {
525 dfaa8583 aurel32
            if (lit != 0)
526 dfaa8583 aurel32
                tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
527 dfaa8583 aurel32
            else
528 dfaa8583 aurel32
                tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
529 fe2b269a aurel32
        } else {
530 b3249f63 aurel32
            TCGv tmp1, tmp2;
531 a7812ae4 pbrook
            tmp1 = tcg_temp_new();
532 b3249f63 aurel32
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
533 b3249f63 aurel32
            tcg_gen_shli_i64(tmp1, tmp1, 3);
534 b3249f63 aurel32
            tmp2 = tcg_const_i64(64);
535 b3249f63 aurel32
            tcg_gen_sub_i64(tmp1, tmp2, tmp1);
536 b3249f63 aurel32
            tcg_temp_free(tmp2);
537 dfaa8583 aurel32
            tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
538 b3249f63 aurel32
            tcg_temp_free(tmp1);
539 dfaa8583 aurel32
        }
540 dfaa8583 aurel32
        if (tcg_gen_ext_i64)
541 dfaa8583 aurel32
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
542 b3249f63 aurel32
    } else
543 b3249f63 aurel32
        tcg_gen_movi_i64(cpu_ir[rc], 0);
544 b3249f63 aurel32
}
545 b3249f63 aurel32
546 b3249f63 aurel32
/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */
547 b3249f63 aurel32
static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
548 b3249f63 aurel32
                                    int ra, int rb, int rc,
549 adf3c8b6 aurel32
                                    int islit, uint8_t lit)
550 b3249f63 aurel32
{
551 b3249f63 aurel32
    if (unlikely(rc == 31))
552 b3249f63 aurel32
        return;
553 b3249f63 aurel32
554 b3249f63 aurel32
    if (ra != 31) {
555 dfaa8583 aurel32
        if (islit) {
556 dfaa8583 aurel32
                tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
557 dfaa8583 aurel32
        } else {
558 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
559 b3249f63 aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
560 b3249f63 aurel32
            tcg_gen_shli_i64(tmp, tmp, 3);
561 dfaa8583 aurel32
            tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
562 b3249f63 aurel32
            tcg_temp_free(tmp);
563 fe2b269a aurel32
        }
564 dfaa8583 aurel32
        if (tcg_gen_ext_i64)
565 dfaa8583 aurel32
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
566 b3249f63 aurel32
    } else
567 b3249f63 aurel32
        tcg_gen_movi_i64(cpu_ir[rc], 0);
568 b3249f63 aurel32
}
569 b3249f63 aurel32
570 04acd307 aurel32
/* Code to call arith3 helpers */
571 a7812ae4 pbrook
#define ARITH3(name)                                                  \
572 a7812ae4 pbrook
static always_inline void glue(gen_, name) (int ra, int rb, int rc,   \
573 a7812ae4 pbrook
                                            int islit, uint8_t lit)   \
574 a7812ae4 pbrook
{                                                                     \
575 a7812ae4 pbrook
    if (unlikely(rc == 31))                                           \
576 a7812ae4 pbrook
        return;                                                       \
577 a7812ae4 pbrook
                                                                      \
578 a7812ae4 pbrook
    if (ra != 31) {                                                   \
579 a7812ae4 pbrook
        if (islit) {                                                  \
580 a7812ae4 pbrook
            TCGv tmp = tcg_const_i64(lit);                            \
581 a7812ae4 pbrook
            gen_helper_ ## name(cpu_ir[rc], cpu_ir[ra], tmp);         \
582 a7812ae4 pbrook
            tcg_temp_free(tmp);                                       \
583 a7812ae4 pbrook
        } else                                                        \
584 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); \
585 a7812ae4 pbrook
    } else {                                                          \
586 a7812ae4 pbrook
        TCGv tmp1 = tcg_const_i64(0);                                 \
587 a7812ae4 pbrook
        if (islit) {                                                  \
588 a7812ae4 pbrook
            TCGv tmp2 = tcg_const_i64(lit);                           \
589 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], tmp1, tmp2);             \
590 a7812ae4 pbrook
            tcg_temp_free(tmp2);                                      \
591 a7812ae4 pbrook
        } else                                                        \
592 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], tmp1, cpu_ir[rb]);       \
593 a7812ae4 pbrook
        tcg_temp_free(tmp1);                                          \
594 a7812ae4 pbrook
    }                                                                 \
595 b3249f63 aurel32
}
596 a7812ae4 pbrook
ARITH3(cmpbge)
597 a7812ae4 pbrook
ARITH3(addlv)
598 a7812ae4 pbrook
ARITH3(sublv)
599 a7812ae4 pbrook
ARITH3(addqv)
600 a7812ae4 pbrook
ARITH3(subqv)
601 a7812ae4 pbrook
ARITH3(mskbl)
602 a7812ae4 pbrook
ARITH3(insbl)
603 a7812ae4 pbrook
ARITH3(mskwl)
604 a7812ae4 pbrook
ARITH3(inswl)
605 a7812ae4 pbrook
ARITH3(mskll)
606 a7812ae4 pbrook
ARITH3(insll)
607 a7812ae4 pbrook
ARITH3(zap)
608 a7812ae4 pbrook
ARITH3(zapnot)
609 a7812ae4 pbrook
ARITH3(mskql)
610 a7812ae4 pbrook
ARITH3(insql)
611 a7812ae4 pbrook
ARITH3(mskwh)
612 a7812ae4 pbrook
ARITH3(inswh)
613 a7812ae4 pbrook
ARITH3(msklh)
614 a7812ae4 pbrook
ARITH3(inslh)
615 a7812ae4 pbrook
ARITH3(mskqh)
616 a7812ae4 pbrook
ARITH3(insqh)
617 a7812ae4 pbrook
ARITH3(umulh)
618 a7812ae4 pbrook
ARITH3(mullv)
619 a7812ae4 pbrook
ARITH3(mulqv)
620 b3249f63 aurel32
621 01ff9cc8 aurel32
static always_inline void gen_cmp(TCGCond cond,
622 01ff9cc8 aurel32
                                  int ra, int rb, int rc,
623 a1cf28f4 aurel32
                                  int islit, uint8_t lit)
624 01ff9cc8 aurel32
{
625 01ff9cc8 aurel32
    int l1, l2;
626 01ff9cc8 aurel32
    TCGv tmp;
627 01ff9cc8 aurel32
628 01ff9cc8 aurel32
    if (unlikely(rc == 31))
629 01ff9cc8 aurel32
    return;
630 01ff9cc8 aurel32
631 01ff9cc8 aurel32
    l1 = gen_new_label();
632 01ff9cc8 aurel32
    l2 = gen_new_label();
633 01ff9cc8 aurel32
634 01ff9cc8 aurel32
    if (ra != 31) {
635 a7812ae4 pbrook
        tmp = tcg_temp_new();
636 01ff9cc8 aurel32
        tcg_gen_mov_i64(tmp, cpu_ir[ra]);
637 01ff9cc8 aurel32
    } else
638 01ff9cc8 aurel32
        tmp = tcg_const_i64(0);
639 01ff9cc8 aurel32
    if (islit)
640 01ff9cc8 aurel32
        tcg_gen_brcondi_i64(cond, tmp, lit, l1);
641 01ff9cc8 aurel32
    else
642 dfaa8583 aurel32
        tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
643 01ff9cc8 aurel32
644 01ff9cc8 aurel32
    tcg_gen_movi_i64(cpu_ir[rc], 0);
645 01ff9cc8 aurel32
    tcg_gen_br(l2);
646 01ff9cc8 aurel32
    gen_set_label(l1);
647 01ff9cc8 aurel32
    tcg_gen_movi_i64(cpu_ir[rc], 1);
648 01ff9cc8 aurel32
    gen_set_label(l2);
649 01ff9cc8 aurel32
}
650 01ff9cc8 aurel32
651 f071b4d3 j_mayer
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
652 4c9649a9 j_mayer
{
653 4c9649a9 j_mayer
    uint32_t palcode;
654 4c9649a9 j_mayer
    int32_t disp21, disp16, disp12;
655 4c9649a9 j_mayer
    uint16_t fn11, fn16;
656 4c9649a9 j_mayer
    uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
657 adf3c8b6 aurel32
    uint8_t lit;
658 4c9649a9 j_mayer
    int ret;
659 4c9649a9 j_mayer
660 4c9649a9 j_mayer
    /* Decode all instruction fields */
661 4c9649a9 j_mayer
    opc = insn >> 26;
662 4c9649a9 j_mayer
    ra = (insn >> 21) & 0x1F;
663 4c9649a9 j_mayer
    rb = (insn >> 16) & 0x1F;
664 4c9649a9 j_mayer
    rc = insn & 0x1F;
665 4c9649a9 j_mayer
    sbz = (insn >> 13) & 0x07;
666 4c9649a9 j_mayer
    islit = (insn >> 12) & 1;
667 dfaa8583 aurel32
    if (rb == 31 && !islit) {
668 dfaa8583 aurel32
        islit = 1;
669 dfaa8583 aurel32
        lit = 0;
670 dfaa8583 aurel32
    } else
671 dfaa8583 aurel32
        lit = (insn >> 13) & 0xFF;
672 4c9649a9 j_mayer
    palcode = insn & 0x03FFFFFF;
673 4c9649a9 j_mayer
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
674 4c9649a9 j_mayer
    disp16 = (int16_t)(insn & 0x0000FFFF);
675 4c9649a9 j_mayer
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
676 4c9649a9 j_mayer
    fn16 = insn & 0x0000FFFF;
677 4c9649a9 j_mayer
    fn11 = (insn >> 5) & 0x000007FF;
678 4c9649a9 j_mayer
    fpfn = fn11 & 0x3F;
679 4c9649a9 j_mayer
    fn7 = (insn >> 5) & 0x0000007F;
680 4c9649a9 j_mayer
    fn2 = (insn >> 5) & 0x00000003;
681 4c9649a9 j_mayer
    ret = 0;
682 d12d51d5 aliguori
    LOG_DISAS("opc %02x ra %d rb %d rc %d disp16 %04x\n",
683 d12d51d5 aliguori
              opc, ra, rb, rc, disp16);
684 4c9649a9 j_mayer
    switch (opc) {
685 4c9649a9 j_mayer
    case 0x00:
686 4c9649a9 j_mayer
        /* CALL_PAL */
687 4c9649a9 j_mayer
        if (palcode >= 0x80 && palcode < 0xC0) {
688 4c9649a9 j_mayer
            /* Unprivileged PAL call */
689 31a877f2 aurel32
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x3F) << 6), 0);
690 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
691 4c9649a9 j_mayer
        } else if (palcode < 0x40) {
692 4c9649a9 j_mayer
            /* Privileged PAL code */
693 4c9649a9 j_mayer
            if (ctx->mem_idx & 1)
694 4c9649a9 j_mayer
                goto invalid_opc;
695 4c9649a9 j_mayer
            else
696 e79ab941 aurel32
                gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x3F) << 6), 0);
697 4c9649a9 j_mayer
#endif
698 4c9649a9 j_mayer
        } else {
699 4c9649a9 j_mayer
            /* Invalid PAL call */
700 4c9649a9 j_mayer
            goto invalid_opc;
701 4c9649a9 j_mayer
        }
702 4c9649a9 j_mayer
        ret = 3;
703 4c9649a9 j_mayer
        break;
704 4c9649a9 j_mayer
    case 0x01:
705 4c9649a9 j_mayer
        /* OPC01 */
706 4c9649a9 j_mayer
        goto invalid_opc;
707 4c9649a9 j_mayer
    case 0x02:
708 4c9649a9 j_mayer
        /* OPC02 */
709 4c9649a9 j_mayer
        goto invalid_opc;
710 4c9649a9 j_mayer
    case 0x03:
711 4c9649a9 j_mayer
        /* OPC03 */
712 4c9649a9 j_mayer
        goto invalid_opc;
713 4c9649a9 j_mayer
    case 0x04:
714 4c9649a9 j_mayer
        /* OPC04 */
715 4c9649a9 j_mayer
        goto invalid_opc;
716 4c9649a9 j_mayer
    case 0x05:
717 4c9649a9 j_mayer
        /* OPC05 */
718 4c9649a9 j_mayer
        goto invalid_opc;
719 4c9649a9 j_mayer
    case 0x06:
720 4c9649a9 j_mayer
        /* OPC06 */
721 4c9649a9 j_mayer
        goto invalid_opc;
722 4c9649a9 j_mayer
    case 0x07:
723 4c9649a9 j_mayer
        /* OPC07 */
724 4c9649a9 j_mayer
        goto invalid_opc;
725 4c9649a9 j_mayer
    case 0x08:
726 4c9649a9 j_mayer
        /* LDA */
727 1ef4ef4e aurel32
        if (likely(ra != 31)) {
728 496cb5b9 aurel32
            if (rb != 31)
729 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
730 3761035f aurel32
            else
731 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16);
732 496cb5b9 aurel32
        }
733 4c9649a9 j_mayer
        break;
734 4c9649a9 j_mayer
    case 0x09:
735 4c9649a9 j_mayer
        /* LDAH */
736 1ef4ef4e aurel32
        if (likely(ra != 31)) {
737 496cb5b9 aurel32
            if (rb != 31)
738 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
739 3761035f aurel32
            else
740 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
741 496cb5b9 aurel32
        }
742 4c9649a9 j_mayer
        break;
743 4c9649a9 j_mayer
    case 0x0A:
744 4c9649a9 j_mayer
        /* LDBU */
745 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
746 4c9649a9 j_mayer
            goto invalid_opc;
747 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld8u, ra, rb, disp16, 0, 0);
748 4c9649a9 j_mayer
        break;
749 4c9649a9 j_mayer
    case 0x0B:
750 4c9649a9 j_mayer
        /* LDQ_U */
751 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 1);
752 4c9649a9 j_mayer
        break;
753 4c9649a9 j_mayer
    case 0x0C:
754 4c9649a9 j_mayer
        /* LDWU */
755 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
756 4c9649a9 j_mayer
            goto invalid_opc;
757 577d5e7f aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld16u, ra, rb, disp16, 0, 0);
758 4c9649a9 j_mayer
        break;
759 4c9649a9 j_mayer
    case 0x0D:
760 4c9649a9 j_mayer
        /* STW */
761 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st16, ra, rb, disp16, 0, 0, 0);
762 4c9649a9 j_mayer
        break;
763 4c9649a9 j_mayer
    case 0x0E:
764 4c9649a9 j_mayer
        /* STB */
765 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st8, ra, rb, disp16, 0, 0, 0);
766 4c9649a9 j_mayer
        break;
767 4c9649a9 j_mayer
    case 0x0F:
768 4c9649a9 j_mayer
        /* STQ_U */
769 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 1, 0);
770 4c9649a9 j_mayer
        break;
771 4c9649a9 j_mayer
    case 0x10:
772 4c9649a9 j_mayer
        switch (fn7) {
773 4c9649a9 j_mayer
        case 0x00:
774 4c9649a9 j_mayer
            /* ADDL */
775 30c7183b aurel32
            if (likely(rc != 31)) {
776 30c7183b aurel32
                if (ra != 31) {
777 30c7183b aurel32
                    if (islit) {
778 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
779 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
780 dfaa8583 aurel32
                    } else {
781 30c7183b aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
782 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
783 dfaa8583 aurel32
                    }
784 30c7183b aurel32
                } else {
785 30c7183b aurel32
                    if (islit)
786 dfaa8583 aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
787 30c7183b aurel32
                    else
788 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
789 30c7183b aurel32
                }
790 30c7183b aurel32
            }
791 4c9649a9 j_mayer
            break;
792 4c9649a9 j_mayer
        case 0x02:
793 4c9649a9 j_mayer
            /* S4ADDL */
794 30c7183b aurel32
            if (likely(rc != 31)) {
795 30c7183b aurel32
                if (ra != 31) {
796 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
797 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
798 dfaa8583 aurel32
                    if (islit)
799 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
800 dfaa8583 aurel32
                    else
801 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
802 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
803 dfaa8583 aurel32
                    tcg_temp_free(tmp);
804 30c7183b aurel32
                } else {
805 30c7183b aurel32
                    if (islit)
806 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
807 30c7183b aurel32
                    else
808 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
809 30c7183b aurel32
                }
810 30c7183b aurel32
            }
811 4c9649a9 j_mayer
            break;
812 4c9649a9 j_mayer
        case 0x09:
813 4c9649a9 j_mayer
            /* SUBL */
814 30c7183b aurel32
            if (likely(rc != 31)) {
815 30c7183b aurel32
                if (ra != 31) {
816 dfaa8583 aurel32
                    if (islit)
817 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
818 dfaa8583 aurel32
                    else
819 30c7183b aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
820 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
821 30c7183b aurel32
                } else {
822 30c7183b aurel32
                    if (islit)
823 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
824 dfaa8583 aurel32
                    else {
825 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
826 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
827 30c7183b aurel32
                }
828 30c7183b aurel32
            }
829 4c9649a9 j_mayer
            break;
830 4c9649a9 j_mayer
        case 0x0B:
831 4c9649a9 j_mayer
            /* S4SUBL */
832 30c7183b aurel32
            if (likely(rc != 31)) {
833 30c7183b aurel32
                if (ra != 31) {
834 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
835 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
836 dfaa8583 aurel32
                    if (islit)
837 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
838 dfaa8583 aurel32
                    else
839 dfaa8583 aurel32
                        tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
840 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
841 dfaa8583 aurel32
                    tcg_temp_free(tmp);
842 30c7183b aurel32
                } else {
843 30c7183b aurel32
                    if (islit)
844 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
845 dfaa8583 aurel32
                    else {
846 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
847 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
848 dfaa8583 aurel32
                    }
849 30c7183b aurel32
                }
850 30c7183b aurel32
            }
851 4c9649a9 j_mayer
            break;
852 4c9649a9 j_mayer
        case 0x0F:
853 4c9649a9 j_mayer
            /* CMPBGE */
854 a7812ae4 pbrook
            gen_cmpbge(ra, rb, rc, islit, lit);
855 4c9649a9 j_mayer
            break;
856 4c9649a9 j_mayer
        case 0x12:
857 4c9649a9 j_mayer
            /* S8ADDL */
858 30c7183b aurel32
            if (likely(rc != 31)) {
859 30c7183b aurel32
                if (ra != 31) {
860 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
861 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
862 dfaa8583 aurel32
                    if (islit)
863 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
864 dfaa8583 aurel32
                    else
865 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
866 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
867 dfaa8583 aurel32
                    tcg_temp_free(tmp);
868 30c7183b aurel32
                } else {
869 30c7183b aurel32
                    if (islit)
870 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
871 30c7183b aurel32
                    else
872 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
873 30c7183b aurel32
                }
874 30c7183b aurel32
            }
875 4c9649a9 j_mayer
            break;
876 4c9649a9 j_mayer
        case 0x1B:
877 4c9649a9 j_mayer
            /* S8SUBL */
878 30c7183b aurel32
            if (likely(rc != 31)) {
879 30c7183b aurel32
                if (ra != 31) {
880 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
881 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
882 dfaa8583 aurel32
                    if (islit)
883 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
884 dfaa8583 aurel32
                    else
885 dfaa8583 aurel32
                       tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
886 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
887 dfaa8583 aurel32
                    tcg_temp_free(tmp);
888 30c7183b aurel32
                } else {
889 30c7183b aurel32
                    if (islit)
890 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
891 dfaa8583 aurel32
                    else
892 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
893 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
894 dfaa8583 aurel32
                    }
895 30c7183b aurel32
                }
896 30c7183b aurel32
            }
897 4c9649a9 j_mayer
            break;
898 4c9649a9 j_mayer
        case 0x1D:
899 4c9649a9 j_mayer
            /* CMPULT */
900 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LTU, ra, rb, rc, islit, lit);
901 4c9649a9 j_mayer
            break;
902 4c9649a9 j_mayer
        case 0x20:
903 4c9649a9 j_mayer
            /* ADDQ */
904 30c7183b aurel32
            if (likely(rc != 31)) {
905 30c7183b aurel32
                if (ra != 31) {
906 30c7183b aurel32
                    if (islit)
907 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
908 30c7183b aurel32
                    else
909 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
910 30c7183b aurel32
                } else {
911 30c7183b aurel32
                    if (islit)
912 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
913 30c7183b aurel32
                    else
914 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
915 30c7183b aurel32
                }
916 30c7183b aurel32
            }
917 4c9649a9 j_mayer
            break;
918 4c9649a9 j_mayer
        case 0x22:
919 4c9649a9 j_mayer
            /* S4ADDQ */
920 30c7183b aurel32
            if (likely(rc != 31)) {
921 30c7183b aurel32
                if (ra != 31) {
922 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
923 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
924 dfaa8583 aurel32
                    if (islit)
925 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
926 dfaa8583 aurel32
                    else
927 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
928 dfaa8583 aurel32
                    tcg_temp_free(tmp);
929 30c7183b aurel32
                } else {
930 30c7183b aurel32
                    if (islit)
931 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
932 30c7183b aurel32
                    else
933 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
934 30c7183b aurel32
                }
935 30c7183b aurel32
            }
936 4c9649a9 j_mayer
            break;
937 4c9649a9 j_mayer
        case 0x29:
938 4c9649a9 j_mayer
            /* SUBQ */
939 30c7183b aurel32
            if (likely(rc != 31)) {
940 30c7183b aurel32
                if (ra != 31) {
941 30c7183b aurel32
                    if (islit)
942 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
943 30c7183b aurel32
                    else
944 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
945 30c7183b aurel32
                } else {
946 30c7183b aurel32
                    if (islit)
947 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
948 30c7183b aurel32
                    else
949 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
950 30c7183b aurel32
                }
951 30c7183b aurel32
            }
952 4c9649a9 j_mayer
            break;
953 4c9649a9 j_mayer
        case 0x2B:
954 4c9649a9 j_mayer
            /* S4SUBQ */
955 30c7183b aurel32
            if (likely(rc != 31)) {
956 30c7183b aurel32
                if (ra != 31) {
957 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
958 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
959 dfaa8583 aurel32
                    if (islit)
960 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
961 dfaa8583 aurel32
                    else
962 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
963 dfaa8583 aurel32
                    tcg_temp_free(tmp);
964 30c7183b aurel32
                } else {
965 30c7183b aurel32
                    if (islit)
966 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
967 30c7183b aurel32
                    else
968 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
969 30c7183b aurel32
                }
970 30c7183b aurel32
            }
971 4c9649a9 j_mayer
            break;
972 4c9649a9 j_mayer
        case 0x2D:
973 4c9649a9 j_mayer
            /* CMPEQ */
974 01ff9cc8 aurel32
            gen_cmp(TCG_COND_EQ, ra, rb, rc, islit, lit);
975 4c9649a9 j_mayer
            break;
976 4c9649a9 j_mayer
        case 0x32:
977 4c9649a9 j_mayer
            /* S8ADDQ */
978 30c7183b aurel32
            if (likely(rc != 31)) {
979 30c7183b aurel32
                if (ra != 31) {
980 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
981 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
982 dfaa8583 aurel32
                    if (islit)
983 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
984 dfaa8583 aurel32
                    else
985 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
986 dfaa8583 aurel32
                    tcg_temp_free(tmp);
987 30c7183b aurel32
                } else {
988 30c7183b aurel32
                    if (islit)
989 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
990 30c7183b aurel32
                    else
991 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
992 30c7183b aurel32
                }
993 30c7183b aurel32
            }
994 4c9649a9 j_mayer
            break;
995 4c9649a9 j_mayer
        case 0x3B:
996 4c9649a9 j_mayer
            /* S8SUBQ */
997 30c7183b aurel32
            if (likely(rc != 31)) {
998 30c7183b aurel32
                if (ra != 31) {
999 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1000 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1001 dfaa8583 aurel32
                    if (islit)
1002 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
1003 dfaa8583 aurel32
                    else
1004 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1005 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1006 30c7183b aurel32
                } else {
1007 30c7183b aurel32
                    if (islit)
1008 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1009 30c7183b aurel32
                    else
1010 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1011 30c7183b aurel32
                }
1012 30c7183b aurel32
            }
1013 4c9649a9 j_mayer
            break;
1014 4c9649a9 j_mayer
        case 0x3D:
1015 4c9649a9 j_mayer
            /* CMPULE */
1016 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LEU, ra, rb, rc, islit, lit);
1017 4c9649a9 j_mayer
            break;
1018 4c9649a9 j_mayer
        case 0x40:
1019 4c9649a9 j_mayer
            /* ADDL/V */
1020 a7812ae4 pbrook
            gen_addlv(ra, rb, rc, islit, lit);
1021 4c9649a9 j_mayer
            break;
1022 4c9649a9 j_mayer
        case 0x49:
1023 4c9649a9 j_mayer
            /* SUBL/V */
1024 a7812ae4 pbrook
            gen_sublv(ra, rb, rc, islit, lit);
1025 4c9649a9 j_mayer
            break;
1026 4c9649a9 j_mayer
        case 0x4D:
1027 4c9649a9 j_mayer
            /* CMPLT */
1028 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LT, ra, rb, rc, islit, lit);
1029 4c9649a9 j_mayer
            break;
1030 4c9649a9 j_mayer
        case 0x60:
1031 4c9649a9 j_mayer
            /* ADDQ/V */
1032 a7812ae4 pbrook
            gen_addqv(ra, rb, rc, islit, lit);
1033 4c9649a9 j_mayer
            break;
1034 4c9649a9 j_mayer
        case 0x69:
1035 4c9649a9 j_mayer
            /* SUBQ/V */
1036 a7812ae4 pbrook
            gen_subqv(ra, rb, rc, islit, lit);
1037 4c9649a9 j_mayer
            break;
1038 4c9649a9 j_mayer
        case 0x6D:
1039 4c9649a9 j_mayer
            /* CMPLE */
1040 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LE, ra, rb, rc, islit, lit);
1041 4c9649a9 j_mayer
            break;
1042 4c9649a9 j_mayer
        default:
1043 4c9649a9 j_mayer
            goto invalid_opc;
1044 4c9649a9 j_mayer
        }
1045 4c9649a9 j_mayer
        break;
1046 4c9649a9 j_mayer
    case 0x11:
1047 4c9649a9 j_mayer
        switch (fn7) {
1048 4c9649a9 j_mayer
        case 0x00:
1049 4c9649a9 j_mayer
            /* AND */
1050 30c7183b aurel32
            if (likely(rc != 31)) {
1051 dfaa8583 aurel32
                if (ra == 31)
1052 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1053 30c7183b aurel32
                else if (islit)
1054 30c7183b aurel32
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1055 30c7183b aurel32
                else
1056 30c7183b aurel32
                    tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1057 30c7183b aurel32
            }
1058 4c9649a9 j_mayer
            break;
1059 4c9649a9 j_mayer
        case 0x08:
1060 4c9649a9 j_mayer
            /* BIC */
1061 30c7183b aurel32
            if (likely(rc != 31)) {
1062 30c7183b aurel32
                if (ra != 31) {
1063 30c7183b aurel32
                    if (islit)
1064 30c7183b aurel32
                        tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1065 1b581c44 aurel32
                    else
1066 1b581c44 aurel32
                        tcg_gen_andc_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1067 30c7183b aurel32
                } else
1068 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1069 30c7183b aurel32
            }
1070 4c9649a9 j_mayer
            break;
1071 4c9649a9 j_mayer
        case 0x14:
1072 4c9649a9 j_mayer
            /* CMOVLBS */
1073 fe2b269a aurel32
            gen_cmov(TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
1074 4c9649a9 j_mayer
            break;
1075 4c9649a9 j_mayer
        case 0x16:
1076 4c9649a9 j_mayer
            /* CMOVLBC */
1077 fe2b269a aurel32
            gen_cmov(TCG_COND_NE, ra, rb, rc, islit, lit, 1);
1078 4c9649a9 j_mayer
            break;
1079 4c9649a9 j_mayer
        case 0x20:
1080 4c9649a9 j_mayer
            /* BIS */
1081 30c7183b aurel32
            if (likely(rc != 31)) {
1082 30c7183b aurel32
                if (ra != 31) {
1083 30c7183b aurel32
                    if (islit)
1084 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1085 8bb6e981 aurel32
                    else
1086 30c7183b aurel32
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1087 4c9649a9 j_mayer
                } else {
1088 30c7183b aurel32
                    if (islit)
1089 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1090 30c7183b aurel32
                    else
1091 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1092 4c9649a9 j_mayer
                }
1093 4c9649a9 j_mayer
            }
1094 4c9649a9 j_mayer
            break;
1095 4c9649a9 j_mayer
        case 0x24:
1096 4c9649a9 j_mayer
            /* CMOVEQ */
1097 fe2b269a aurel32
            gen_cmov(TCG_COND_NE, ra, rb, rc, islit, lit, 0);
1098 4c9649a9 j_mayer
            break;
1099 4c9649a9 j_mayer
        case 0x26:
1100 4c9649a9 j_mayer
            /* CMOVNE */
1101 fe2b269a aurel32
            gen_cmov(TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
1102 4c9649a9 j_mayer
            break;
1103 4c9649a9 j_mayer
        case 0x28:
1104 4c9649a9 j_mayer
            /* ORNOT */
1105 30c7183b aurel32
            if (likely(rc != 31)) {
1106 dfaa8583 aurel32
                if (ra != 31) {
1107 30c7183b aurel32
                    if (islit)
1108 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1109 1b581c44 aurel32
                    else
1110 1b581c44 aurel32
                        tcg_gen_orc_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1111 30c7183b aurel32
                } else {
1112 30c7183b aurel32
                    if (islit)
1113 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1114 30c7183b aurel32
                    else
1115 30c7183b aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1116 30c7183b aurel32
                }
1117 30c7183b aurel32
            }
1118 4c9649a9 j_mayer
            break;
1119 4c9649a9 j_mayer
        case 0x40:
1120 4c9649a9 j_mayer
            /* XOR */
1121 30c7183b aurel32
            if (likely(rc != 31)) {
1122 30c7183b aurel32
                if (ra != 31) {
1123 30c7183b aurel32
                    if (islit)
1124 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1125 30c7183b aurel32
                    else
1126 dfaa8583 aurel32
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1127 30c7183b aurel32
                } else {
1128 30c7183b aurel32
                    if (islit)
1129 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1130 30c7183b aurel32
                    else
1131 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1132 30c7183b aurel32
                }
1133 30c7183b aurel32
            }
1134 4c9649a9 j_mayer
            break;
1135 4c9649a9 j_mayer
        case 0x44:
1136 4c9649a9 j_mayer
            /* CMOVLT */
1137 fe2b269a aurel32
            gen_cmov(TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1138 4c9649a9 j_mayer
            break;
1139 4c9649a9 j_mayer
        case 0x46:
1140 4c9649a9 j_mayer
            /* CMOVGE */
1141 fe2b269a aurel32
            gen_cmov(TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1142 4c9649a9 j_mayer
            break;
1143 4c9649a9 j_mayer
        case 0x48:
1144 4c9649a9 j_mayer
            /* EQV */
1145 30c7183b aurel32
            if (likely(rc != 31)) {
1146 30c7183b aurel32
                if (ra != 31) {
1147 30c7183b aurel32
                    if (islit)
1148 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1149 1b581c44 aurel32
                    else
1150 1b581c44 aurel32
                        tcg_gen_eqv_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1151 30c7183b aurel32
                } else {
1152 30c7183b aurel32
                    if (islit)
1153 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1154 30c7183b aurel32
                    else
1155 dfaa8583 aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1156 30c7183b aurel32
                }
1157 30c7183b aurel32
            }
1158 4c9649a9 j_mayer
            break;
1159 4c9649a9 j_mayer
        case 0x61:
1160 4c9649a9 j_mayer
            /* AMASK */
1161 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1162 ae8ecd42 aurel32
                if (islit)
1163 1a1f7dbc aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], lit);
1164 ae8ecd42 aurel32
                else
1165 1a1f7dbc aurel32
                    tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1166 1a1f7dbc aurel32
                switch (ctx->env->implver) {
1167 1a1f7dbc aurel32
                case IMPLVER_2106x:
1168 1a1f7dbc aurel32
                    /* EV4, EV45, LCA, LCA45 & EV5 */
1169 1a1f7dbc aurel32
                    break;
1170 1a1f7dbc aurel32
                case IMPLVER_21164:
1171 1a1f7dbc aurel32
                case IMPLVER_21264:
1172 1a1f7dbc aurel32
                case IMPLVER_21364:
1173 1a1f7dbc aurel32
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[rc],
1174 1a1f7dbc aurel32
                                     ~(uint64_t)ctx->amask);
1175 1a1f7dbc aurel32
                    break;
1176 1a1f7dbc aurel32
                }
1177 ae8ecd42 aurel32
            }
1178 4c9649a9 j_mayer
            break;
1179 4c9649a9 j_mayer
        case 0x64:
1180 4c9649a9 j_mayer
            /* CMOVLE */
1181 fe2b269a aurel32
            gen_cmov(TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1182 4c9649a9 j_mayer
            break;
1183 4c9649a9 j_mayer
        case 0x66:
1184 4c9649a9 j_mayer
            /* CMOVGT */
1185 fe2b269a aurel32
            gen_cmov(TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1186 4c9649a9 j_mayer
            break;
1187 4c9649a9 j_mayer
        case 0x6C:
1188 4c9649a9 j_mayer
            /* IMPLVER */
1189 3761035f aurel32
            if (rc != 31)
1190 8579095b aurel32
                tcg_gen_movi_i64(cpu_ir[rc], ctx->env->implver);
1191 4c9649a9 j_mayer
            break;
1192 4c9649a9 j_mayer
        default:
1193 4c9649a9 j_mayer
            goto invalid_opc;
1194 4c9649a9 j_mayer
        }
1195 4c9649a9 j_mayer
        break;
1196 4c9649a9 j_mayer
    case 0x12:
1197 4c9649a9 j_mayer
        switch (fn7) {
1198 4c9649a9 j_mayer
        case 0x02:
1199 4c9649a9 j_mayer
            /* MSKBL */
1200 a7812ae4 pbrook
            gen_mskbl(ra, rb, rc, islit, lit);
1201 4c9649a9 j_mayer
            break;
1202 4c9649a9 j_mayer
        case 0x06:
1203 4c9649a9 j_mayer
            /* EXTBL */
1204 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1205 4c9649a9 j_mayer
            break;
1206 4c9649a9 j_mayer
        case 0x0B:
1207 4c9649a9 j_mayer
            /* INSBL */
1208 a7812ae4 pbrook
            gen_insbl(ra, rb, rc, islit, lit);
1209 4c9649a9 j_mayer
            break;
1210 4c9649a9 j_mayer
        case 0x12:
1211 4c9649a9 j_mayer
            /* MSKWL */
1212 a7812ae4 pbrook
            gen_mskwl(ra, rb, rc, islit, lit);
1213 4c9649a9 j_mayer
            break;
1214 4c9649a9 j_mayer
        case 0x16:
1215 4c9649a9 j_mayer
            /* EXTWL */
1216 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1217 4c9649a9 j_mayer
            break;
1218 4c9649a9 j_mayer
        case 0x1B:
1219 4c9649a9 j_mayer
            /* INSWL */
1220 a7812ae4 pbrook
            gen_inswl(ra, rb, rc, islit, lit);
1221 4c9649a9 j_mayer
            break;
1222 4c9649a9 j_mayer
        case 0x22:
1223 4c9649a9 j_mayer
            /* MSKLL */
1224 a7812ae4 pbrook
            gen_mskll(ra, rb, rc, islit, lit);
1225 4c9649a9 j_mayer
            break;
1226 4c9649a9 j_mayer
        case 0x26:
1227 4c9649a9 j_mayer
            /* EXTLL */
1228 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1229 4c9649a9 j_mayer
            break;
1230 4c9649a9 j_mayer
        case 0x2B:
1231 4c9649a9 j_mayer
            /* INSLL */
1232 a7812ae4 pbrook
            gen_insll(ra, rb, rc, islit, lit);
1233 4c9649a9 j_mayer
            break;
1234 4c9649a9 j_mayer
        case 0x30:
1235 4c9649a9 j_mayer
            /* ZAP */
1236 a7812ae4 pbrook
            gen_zap(ra, rb, rc, islit, lit);
1237 4c9649a9 j_mayer
            break;
1238 4c9649a9 j_mayer
        case 0x31:
1239 4c9649a9 j_mayer
            /* ZAPNOT */
1240 a7812ae4 pbrook
            gen_zapnot(ra, rb, rc, islit, lit);
1241 4c9649a9 j_mayer
            break;
1242 4c9649a9 j_mayer
        case 0x32:
1243 4c9649a9 j_mayer
            /* MSKQL */
1244 a7812ae4 pbrook
            gen_mskql(ra, rb, rc, islit, lit);
1245 4c9649a9 j_mayer
            break;
1246 4c9649a9 j_mayer
        case 0x34:
1247 4c9649a9 j_mayer
            /* SRL */
1248 30c7183b aurel32
            if (likely(rc != 31)) {
1249 30c7183b aurel32
                if (ra != 31) {
1250 30c7183b aurel32
                    if (islit)
1251 30c7183b aurel32
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1252 dfaa8583 aurel32
                    else {
1253 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1254 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1255 30c7183b aurel32
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1256 30c7183b aurel32
                        tcg_temp_free(shift);
1257 dfaa8583 aurel32
                    }
1258 30c7183b aurel32
                } else
1259 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1260 30c7183b aurel32
            }
1261 4c9649a9 j_mayer
            break;
1262 4c9649a9 j_mayer
        case 0x36:
1263 4c9649a9 j_mayer
            /* EXTQL */
1264 b3249f63 aurel32
            gen_ext_l(NULL, ra, rb, rc, islit, lit);
1265 4c9649a9 j_mayer
            break;
1266 4c9649a9 j_mayer
        case 0x39:
1267 4c9649a9 j_mayer
            /* SLL */
1268 30c7183b aurel32
            if (likely(rc != 31)) {
1269 30c7183b aurel32
                if (ra != 31) {
1270 30c7183b aurel32
                    if (islit)
1271 30c7183b aurel32
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1272 dfaa8583 aurel32
                    else {
1273 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1274 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1275 30c7183b aurel32
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1276 30c7183b aurel32
                        tcg_temp_free(shift);
1277 dfaa8583 aurel32
                    }
1278 30c7183b aurel32
                } else
1279 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1280 30c7183b aurel32
            }
1281 4c9649a9 j_mayer
            break;
1282 4c9649a9 j_mayer
        case 0x3B:
1283 4c9649a9 j_mayer
            /* INSQL */
1284 a7812ae4 pbrook
            gen_insql(ra, rb, rc, islit, lit);
1285 4c9649a9 j_mayer
            break;
1286 4c9649a9 j_mayer
        case 0x3C:
1287 4c9649a9 j_mayer
            /* SRA */
1288 30c7183b aurel32
            if (likely(rc != 31)) {
1289 30c7183b aurel32
                if (ra != 31) {
1290 30c7183b aurel32
                    if (islit)
1291 30c7183b aurel32
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1292 dfaa8583 aurel32
                    else {
1293 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1294 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1295 30c7183b aurel32
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1296 30c7183b aurel32
                        tcg_temp_free(shift);
1297 dfaa8583 aurel32
                    }
1298 30c7183b aurel32
                } else
1299 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1300 30c7183b aurel32
            }
1301 4c9649a9 j_mayer
            break;
1302 4c9649a9 j_mayer
        case 0x52:
1303 4c9649a9 j_mayer
            /* MSKWH */
1304 a7812ae4 pbrook
            gen_mskwh(ra, rb, rc, islit, lit);
1305 4c9649a9 j_mayer
            break;
1306 4c9649a9 j_mayer
        case 0x57:
1307 4c9649a9 j_mayer
            /* INSWH */
1308 a7812ae4 pbrook
            gen_inswh(ra, rb, rc, islit, lit);
1309 4c9649a9 j_mayer
            break;
1310 4c9649a9 j_mayer
        case 0x5A:
1311 4c9649a9 j_mayer
            /* EXTWH */
1312 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1313 4c9649a9 j_mayer
            break;
1314 4c9649a9 j_mayer
        case 0x62:
1315 4c9649a9 j_mayer
            /* MSKLH */
1316 a7812ae4 pbrook
            gen_msklh(ra, rb, rc, islit, lit);
1317 4c9649a9 j_mayer
            break;
1318 4c9649a9 j_mayer
        case 0x67:
1319 4c9649a9 j_mayer
            /* INSLH */
1320 a7812ae4 pbrook
            gen_inslh(ra, rb, rc, islit, lit);
1321 4c9649a9 j_mayer
            break;
1322 4c9649a9 j_mayer
        case 0x6A:
1323 4c9649a9 j_mayer
            /* EXTLH */
1324 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1325 4c9649a9 j_mayer
            break;
1326 4c9649a9 j_mayer
        case 0x72:
1327 4c9649a9 j_mayer
            /* MSKQH */
1328 a7812ae4 pbrook
            gen_mskqh(ra, rb, rc, islit, lit);
1329 4c9649a9 j_mayer
            break;
1330 4c9649a9 j_mayer
        case 0x77:
1331 4c9649a9 j_mayer
            /* INSQH */
1332 a7812ae4 pbrook
            gen_insqh(ra, rb, rc, islit, lit);
1333 4c9649a9 j_mayer
            break;
1334 4c9649a9 j_mayer
        case 0x7A:
1335 4c9649a9 j_mayer
            /* EXTQH */
1336 b3249f63 aurel32
            gen_ext_h(NULL, ra, rb, rc, islit, lit);
1337 4c9649a9 j_mayer
            break;
1338 4c9649a9 j_mayer
        default:
1339 4c9649a9 j_mayer
            goto invalid_opc;
1340 4c9649a9 j_mayer
        }
1341 4c9649a9 j_mayer
        break;
1342 4c9649a9 j_mayer
    case 0x13:
1343 4c9649a9 j_mayer
        switch (fn7) {
1344 4c9649a9 j_mayer
        case 0x00:
1345 4c9649a9 j_mayer
            /* MULL */
1346 30c7183b aurel32
            if (likely(rc != 31)) {
1347 dfaa8583 aurel32
                if (ra == 31)
1348 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1349 30c7183b aurel32
                else {
1350 30c7183b aurel32
                    if (islit)
1351 30c7183b aurel32
                        tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1352 30c7183b aurel32
                    else
1353 30c7183b aurel32
                        tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1354 30c7183b aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1355 30c7183b aurel32
                }
1356 30c7183b aurel32
            }
1357 4c9649a9 j_mayer
            break;
1358 4c9649a9 j_mayer
        case 0x20:
1359 4c9649a9 j_mayer
            /* MULQ */
1360 30c7183b aurel32
            if (likely(rc != 31)) {
1361 dfaa8583 aurel32
                if (ra == 31)
1362 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1363 30c7183b aurel32
                else if (islit)
1364 30c7183b aurel32
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1365 30c7183b aurel32
                else
1366 30c7183b aurel32
                    tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1367 30c7183b aurel32
            }
1368 4c9649a9 j_mayer
            break;
1369 4c9649a9 j_mayer
        case 0x30:
1370 4c9649a9 j_mayer
            /* UMULH */
1371 a7812ae4 pbrook
            gen_umulh(ra, rb, rc, islit, lit);
1372 4c9649a9 j_mayer
            break;
1373 4c9649a9 j_mayer
        case 0x40:
1374 4c9649a9 j_mayer
            /* MULL/V */
1375 a7812ae4 pbrook
            gen_mullv(ra, rb, rc, islit, lit);
1376 4c9649a9 j_mayer
            break;
1377 4c9649a9 j_mayer
        case 0x60:
1378 4c9649a9 j_mayer
            /* MULQ/V */
1379 a7812ae4 pbrook
            gen_mulqv(ra, rb, rc, islit, lit);
1380 4c9649a9 j_mayer
            break;
1381 4c9649a9 j_mayer
        default:
1382 4c9649a9 j_mayer
            goto invalid_opc;
1383 4c9649a9 j_mayer
        }
1384 4c9649a9 j_mayer
        break;
1385 4c9649a9 j_mayer
    case 0x14:
1386 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1387 4c9649a9 j_mayer
        case 0x04:
1388 4c9649a9 j_mayer
            /* ITOFS */
1389 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1390 4c9649a9 j_mayer
                goto invalid_opc;
1391 f18cd223 aurel32
            if (likely(rc != 31)) {
1392 f18cd223 aurel32
                if (ra != 31) {
1393 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
1394 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
1395 a7812ae4 pbrook
                    gen_helper_memory_to_s(cpu_fir[rc], tmp);
1396 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
1397 f18cd223 aurel32
                } else
1398 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1399 f18cd223 aurel32
            }
1400 4c9649a9 j_mayer
            break;
1401 4c9649a9 j_mayer
        case 0x0A:
1402 4c9649a9 j_mayer
            /* SQRTF */
1403 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1404 4c9649a9 j_mayer
                goto invalid_opc;
1405 a7812ae4 pbrook
            gen_fsqrtf(rb, rc);
1406 4c9649a9 j_mayer
            break;
1407 4c9649a9 j_mayer
        case 0x0B:
1408 4c9649a9 j_mayer
            /* SQRTS */
1409 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1410 4c9649a9 j_mayer
                goto invalid_opc;
1411 a7812ae4 pbrook
            gen_fsqrts(rb, rc);
1412 4c9649a9 j_mayer
            break;
1413 4c9649a9 j_mayer
        case 0x14:
1414 4c9649a9 j_mayer
            /* ITOFF */
1415 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1416 4c9649a9 j_mayer
                goto invalid_opc;
1417 f18cd223 aurel32
            if (likely(rc != 31)) {
1418 f18cd223 aurel32
                if (ra != 31) {
1419 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
1420 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
1421 a7812ae4 pbrook
                    gen_helper_memory_to_f(cpu_fir[rc], tmp);
1422 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
1423 f18cd223 aurel32
                } else
1424 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1425 f18cd223 aurel32
            }
1426 4c9649a9 j_mayer
            break;
1427 4c9649a9 j_mayer
        case 0x24:
1428 4c9649a9 j_mayer
            /* ITOFT */
1429 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1430 4c9649a9 j_mayer
                goto invalid_opc;
1431 f18cd223 aurel32
            if (likely(rc != 31)) {
1432 f18cd223 aurel32
                if (ra != 31)
1433 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_fir[rc], cpu_ir[ra]);
1434 f18cd223 aurel32
                else
1435 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1436 f18cd223 aurel32
            }
1437 4c9649a9 j_mayer
            break;
1438 4c9649a9 j_mayer
        case 0x2A:
1439 4c9649a9 j_mayer
            /* SQRTG */
1440 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1441 4c9649a9 j_mayer
                goto invalid_opc;
1442 a7812ae4 pbrook
            gen_fsqrtg(rb, rc);
1443 4c9649a9 j_mayer
            break;
1444 4c9649a9 j_mayer
        case 0x02B:
1445 4c9649a9 j_mayer
            /* SQRTT */
1446 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1447 4c9649a9 j_mayer
                goto invalid_opc;
1448 a7812ae4 pbrook
            gen_fsqrtt(rb, rc);
1449 4c9649a9 j_mayer
            break;
1450 4c9649a9 j_mayer
        default:
1451 4c9649a9 j_mayer
            goto invalid_opc;
1452 4c9649a9 j_mayer
        }
1453 4c9649a9 j_mayer
        break;
1454 4c9649a9 j_mayer
    case 0x15:
1455 4c9649a9 j_mayer
        /* VAX floating point */
1456 4c9649a9 j_mayer
        /* XXX: rounding mode and trap are ignored (!) */
1457 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1458 4c9649a9 j_mayer
        case 0x00:
1459 4c9649a9 j_mayer
            /* ADDF */
1460 a7812ae4 pbrook
            gen_faddf(ra, rb, rc);
1461 4c9649a9 j_mayer
            break;
1462 4c9649a9 j_mayer
        case 0x01:
1463 4c9649a9 j_mayer
            /* SUBF */
1464 a7812ae4 pbrook
            gen_fsubf(ra, rb, rc);
1465 4c9649a9 j_mayer
            break;
1466 4c9649a9 j_mayer
        case 0x02:
1467 4c9649a9 j_mayer
            /* MULF */
1468 a7812ae4 pbrook
            gen_fmulf(ra, rb, rc);
1469 4c9649a9 j_mayer
            break;
1470 4c9649a9 j_mayer
        case 0x03:
1471 4c9649a9 j_mayer
            /* DIVF */
1472 a7812ae4 pbrook
            gen_fdivf(ra, rb, rc);
1473 4c9649a9 j_mayer
            break;
1474 4c9649a9 j_mayer
        case 0x1E:
1475 4c9649a9 j_mayer
            /* CVTDG */
1476 4c9649a9 j_mayer
#if 0 // TODO
1477 a7812ae4 pbrook
            gen_fcvtdg(rb, rc);
1478 4c9649a9 j_mayer
#else
1479 4c9649a9 j_mayer
            goto invalid_opc;
1480 4c9649a9 j_mayer
#endif
1481 4c9649a9 j_mayer
            break;
1482 4c9649a9 j_mayer
        case 0x20:
1483 4c9649a9 j_mayer
            /* ADDG */
1484 a7812ae4 pbrook
            gen_faddg(ra, rb, rc);
1485 4c9649a9 j_mayer
            break;
1486 4c9649a9 j_mayer
        case 0x21:
1487 4c9649a9 j_mayer
            /* SUBG */
1488 a7812ae4 pbrook
            gen_fsubg(ra, rb, rc);
1489 4c9649a9 j_mayer
            break;
1490 4c9649a9 j_mayer
        case 0x22:
1491 4c9649a9 j_mayer
            /* MULG */
1492 a7812ae4 pbrook
            gen_fmulg(ra, rb, rc);
1493 4c9649a9 j_mayer
            break;
1494 4c9649a9 j_mayer
        case 0x23:
1495 4c9649a9 j_mayer
            /* DIVG */
1496 a7812ae4 pbrook
            gen_fdivg(ra, rb, rc);
1497 4c9649a9 j_mayer
            break;
1498 4c9649a9 j_mayer
        case 0x25:
1499 4c9649a9 j_mayer
            /* CMPGEQ */
1500 a7812ae4 pbrook
            gen_fcmpgeq(ra, rb, rc);
1501 4c9649a9 j_mayer
            break;
1502 4c9649a9 j_mayer
        case 0x26:
1503 4c9649a9 j_mayer
            /* CMPGLT */
1504 a7812ae4 pbrook
            gen_fcmpglt(ra, rb, rc);
1505 4c9649a9 j_mayer
            break;
1506 4c9649a9 j_mayer
        case 0x27:
1507 4c9649a9 j_mayer
            /* CMPGLE */
1508 a7812ae4 pbrook
            gen_fcmpgle(ra, rb, rc);
1509 4c9649a9 j_mayer
            break;
1510 4c9649a9 j_mayer
        case 0x2C:
1511 4c9649a9 j_mayer
            /* CVTGF */
1512 a7812ae4 pbrook
            gen_fcvtgf(rb, rc);
1513 4c9649a9 j_mayer
            break;
1514 4c9649a9 j_mayer
        case 0x2D:
1515 4c9649a9 j_mayer
            /* CVTGD */
1516 4c9649a9 j_mayer
#if 0 // TODO
1517 a7812ae4 pbrook
            gen_fcvtgd(rb, rc);
1518 4c9649a9 j_mayer
#else
1519 4c9649a9 j_mayer
            goto invalid_opc;
1520 4c9649a9 j_mayer
#endif
1521 4c9649a9 j_mayer
            break;
1522 4c9649a9 j_mayer
        case 0x2F:
1523 4c9649a9 j_mayer
            /* CVTGQ */
1524 a7812ae4 pbrook
            gen_fcvtgq(rb, rc);
1525 4c9649a9 j_mayer
            break;
1526 4c9649a9 j_mayer
        case 0x3C:
1527 4c9649a9 j_mayer
            /* CVTQF */
1528 a7812ae4 pbrook
            gen_fcvtqf(rb, rc);
1529 4c9649a9 j_mayer
            break;
1530 4c9649a9 j_mayer
        case 0x3E:
1531 4c9649a9 j_mayer
            /* CVTQG */
1532 a7812ae4 pbrook
            gen_fcvtqg(rb, rc);
1533 4c9649a9 j_mayer
            break;
1534 4c9649a9 j_mayer
        default:
1535 4c9649a9 j_mayer
            goto invalid_opc;
1536 4c9649a9 j_mayer
        }
1537 4c9649a9 j_mayer
        break;
1538 4c9649a9 j_mayer
    case 0x16:
1539 4c9649a9 j_mayer
        /* IEEE floating-point */
1540 4c9649a9 j_mayer
        /* XXX: rounding mode and traps are ignored (!) */
1541 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1542 4c9649a9 j_mayer
        case 0x00:
1543 4c9649a9 j_mayer
            /* ADDS */
1544 a7812ae4 pbrook
            gen_fadds(ra, rb, rc);
1545 4c9649a9 j_mayer
            break;
1546 4c9649a9 j_mayer
        case 0x01:
1547 4c9649a9 j_mayer
            /* SUBS */
1548 a7812ae4 pbrook
            gen_fsubs(ra, rb, rc);
1549 4c9649a9 j_mayer
            break;
1550 4c9649a9 j_mayer
        case 0x02:
1551 4c9649a9 j_mayer
            /* MULS */
1552 a7812ae4 pbrook
            gen_fmuls(ra, rb, rc);
1553 4c9649a9 j_mayer
            break;
1554 4c9649a9 j_mayer
        case 0x03:
1555 4c9649a9 j_mayer
            /* DIVS */
1556 a7812ae4 pbrook
            gen_fdivs(ra, rb, rc);
1557 4c9649a9 j_mayer
            break;
1558 4c9649a9 j_mayer
        case 0x20:
1559 4c9649a9 j_mayer
            /* ADDT */
1560 a7812ae4 pbrook
            gen_faddt(ra, rb, rc);
1561 4c9649a9 j_mayer
            break;
1562 4c9649a9 j_mayer
        case 0x21:
1563 4c9649a9 j_mayer
            /* SUBT */
1564 a7812ae4 pbrook
            gen_fsubt(ra, rb, rc);
1565 4c9649a9 j_mayer
            break;
1566 4c9649a9 j_mayer
        case 0x22:
1567 4c9649a9 j_mayer
            /* MULT */
1568 a7812ae4 pbrook
            gen_fmult(ra, rb, rc);
1569 4c9649a9 j_mayer
            break;
1570 4c9649a9 j_mayer
        case 0x23:
1571 4c9649a9 j_mayer
            /* DIVT */
1572 a7812ae4 pbrook
            gen_fdivt(ra, rb, rc);
1573 4c9649a9 j_mayer
            break;
1574 4c9649a9 j_mayer
        case 0x24:
1575 4c9649a9 j_mayer
            /* CMPTUN */
1576 a7812ae4 pbrook
            gen_fcmptun(ra, rb, rc);
1577 4c9649a9 j_mayer
            break;
1578 4c9649a9 j_mayer
        case 0x25:
1579 4c9649a9 j_mayer
            /* CMPTEQ */
1580 a7812ae4 pbrook
            gen_fcmpteq(ra, rb, rc);
1581 4c9649a9 j_mayer
            break;
1582 4c9649a9 j_mayer
        case 0x26:
1583 4c9649a9 j_mayer
            /* CMPTLT */
1584 a7812ae4 pbrook
            gen_fcmptlt(ra, rb, rc);
1585 4c9649a9 j_mayer
            break;
1586 4c9649a9 j_mayer
        case 0x27:
1587 4c9649a9 j_mayer
            /* CMPTLE */
1588 a7812ae4 pbrook
            gen_fcmptle(ra, rb, rc);
1589 4c9649a9 j_mayer
            break;
1590 4c9649a9 j_mayer
        case 0x2C:
1591 4c9649a9 j_mayer
            /* XXX: incorrect */
1592 a74b4d2c aurel32
            if (fn11 == 0x2AC || fn11 == 0x6AC) {
1593 4c9649a9 j_mayer
                /* CVTST */
1594 a7812ae4 pbrook
                gen_fcvtst(rb, rc);
1595 4c9649a9 j_mayer
            } else {
1596 4c9649a9 j_mayer
                /* CVTTS */
1597 a7812ae4 pbrook
                gen_fcvtts(rb, rc);
1598 4c9649a9 j_mayer
            }
1599 4c9649a9 j_mayer
            break;
1600 4c9649a9 j_mayer
        case 0x2F:
1601 4c9649a9 j_mayer
            /* CVTTQ */
1602 a7812ae4 pbrook
            gen_fcvttq(rb, rc);
1603 4c9649a9 j_mayer
            break;
1604 4c9649a9 j_mayer
        case 0x3C:
1605 4c9649a9 j_mayer
            /* CVTQS */
1606 a7812ae4 pbrook
            gen_fcvtqs(rb, rc);
1607 4c9649a9 j_mayer
            break;
1608 4c9649a9 j_mayer
        case 0x3E:
1609 4c9649a9 j_mayer
            /* CVTQT */
1610 a7812ae4 pbrook
            gen_fcvtqt(rb, rc);
1611 4c9649a9 j_mayer
            break;
1612 4c9649a9 j_mayer
        default:
1613 4c9649a9 j_mayer
            goto invalid_opc;
1614 4c9649a9 j_mayer
        }
1615 4c9649a9 j_mayer
        break;
1616 4c9649a9 j_mayer
    case 0x17:
1617 4c9649a9 j_mayer
        switch (fn11) {
1618 4c9649a9 j_mayer
        case 0x010:
1619 4c9649a9 j_mayer
            /* CVTLQ */
1620 a7812ae4 pbrook
            gen_fcvtlq(rb, rc);
1621 4c9649a9 j_mayer
            break;
1622 4c9649a9 j_mayer
        case 0x020:
1623 f18cd223 aurel32
            if (likely(rc != 31)) {
1624 f18cd223 aurel32
                if (ra == rb)
1625 4c9649a9 j_mayer
                    /* FMOV */
1626 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[ra]);
1627 f18cd223 aurel32
                else
1628 f18cd223 aurel32
                    /* CPYS */
1629 a7812ae4 pbrook
                    gen_fcpys(ra, rb, rc);
1630 4c9649a9 j_mayer
            }
1631 4c9649a9 j_mayer
            break;
1632 4c9649a9 j_mayer
        case 0x021:
1633 4c9649a9 j_mayer
            /* CPYSN */
1634 a7812ae4 pbrook
            gen_fcpysn(ra, rb, rc);
1635 4c9649a9 j_mayer
            break;
1636 4c9649a9 j_mayer
        case 0x022:
1637 4c9649a9 j_mayer
            /* CPYSE */
1638 a7812ae4 pbrook
            gen_fcpyse(ra, rb, rc);
1639 4c9649a9 j_mayer
            break;
1640 4c9649a9 j_mayer
        case 0x024:
1641 4c9649a9 j_mayer
            /* MT_FPCR */
1642 f18cd223 aurel32
            if (likely(ra != 31))
1643 a7812ae4 pbrook
                gen_helper_store_fpcr(cpu_fir[ra]);
1644 f18cd223 aurel32
            else {
1645 f18cd223 aurel32
                TCGv tmp = tcg_const_i64(0);
1646 a7812ae4 pbrook
                gen_helper_store_fpcr(tmp);
1647 f18cd223 aurel32
                tcg_temp_free(tmp);
1648 f18cd223 aurel32
            }
1649 4c9649a9 j_mayer
            break;
1650 4c9649a9 j_mayer
        case 0x025:
1651 4c9649a9 j_mayer
            /* MF_FPCR */
1652 f18cd223 aurel32
            if (likely(ra != 31))
1653 a7812ae4 pbrook
                gen_helper_load_fpcr(cpu_fir[ra]);
1654 4c9649a9 j_mayer
            break;
1655 4c9649a9 j_mayer
        case 0x02A:
1656 4c9649a9 j_mayer
            /* FCMOVEQ */
1657 a7812ae4 pbrook
            gen_fcmpfeq(ra, rb, rc);
1658 4c9649a9 j_mayer
            break;
1659 4c9649a9 j_mayer
        case 0x02B:
1660 4c9649a9 j_mayer
            /* FCMOVNE */
1661 a7812ae4 pbrook
            gen_fcmpfne(ra, rb, rc);
1662 4c9649a9 j_mayer
            break;
1663 4c9649a9 j_mayer
        case 0x02C:
1664 4c9649a9 j_mayer
            /* FCMOVLT */
1665 a7812ae4 pbrook
            gen_fcmpflt(ra, rb, rc);
1666 4c9649a9 j_mayer
            break;
1667 4c9649a9 j_mayer
        case 0x02D:
1668 4c9649a9 j_mayer
            /* FCMOVGE */
1669 a7812ae4 pbrook
            gen_fcmpfge(ra, rb, rc);
1670 4c9649a9 j_mayer
            break;
1671 4c9649a9 j_mayer
        case 0x02E:
1672 4c9649a9 j_mayer
            /* FCMOVLE */
1673 a7812ae4 pbrook
            gen_fcmpfle(ra, rb, rc);
1674 4c9649a9 j_mayer
            break;
1675 4c9649a9 j_mayer
        case 0x02F:
1676 4c9649a9 j_mayer
            /* FCMOVGT */
1677 a7812ae4 pbrook
            gen_fcmpfgt(ra, rb, rc);
1678 4c9649a9 j_mayer
            break;
1679 4c9649a9 j_mayer
        case 0x030:
1680 4c9649a9 j_mayer
            /* CVTQL */
1681 a7812ae4 pbrook
            gen_fcvtql(rb, rc);
1682 4c9649a9 j_mayer
            break;
1683 4c9649a9 j_mayer
        case 0x130:
1684 4c9649a9 j_mayer
            /* CVTQL/V */
1685 a7812ae4 pbrook
            gen_fcvtqlv(rb, rc);
1686 4c9649a9 j_mayer
            break;
1687 4c9649a9 j_mayer
        case 0x530:
1688 4c9649a9 j_mayer
            /* CVTQL/SV */
1689 a7812ae4 pbrook
            gen_fcvtqlsv(rb, rc);
1690 4c9649a9 j_mayer
            break;
1691 4c9649a9 j_mayer
        default:
1692 4c9649a9 j_mayer
            goto invalid_opc;
1693 4c9649a9 j_mayer
        }
1694 4c9649a9 j_mayer
        break;
1695 4c9649a9 j_mayer
    case 0x18:
1696 4c9649a9 j_mayer
        switch ((uint16_t)disp16) {
1697 4c9649a9 j_mayer
        case 0x0000:
1698 4c9649a9 j_mayer
            /* TRAPB */
1699 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1700 4c9649a9 j_mayer
            ret = 2;
1701 4c9649a9 j_mayer
            break;
1702 4c9649a9 j_mayer
        case 0x0400:
1703 4c9649a9 j_mayer
            /* EXCB */
1704 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1705 4c9649a9 j_mayer
            ret = 2;
1706 4c9649a9 j_mayer
            break;
1707 4c9649a9 j_mayer
        case 0x4000:
1708 4c9649a9 j_mayer
            /* MB */
1709 4c9649a9 j_mayer
            /* No-op */
1710 4c9649a9 j_mayer
            break;
1711 4c9649a9 j_mayer
        case 0x4400:
1712 4c9649a9 j_mayer
            /* WMB */
1713 4c9649a9 j_mayer
            /* No-op */
1714 4c9649a9 j_mayer
            break;
1715 4c9649a9 j_mayer
        case 0x8000:
1716 4c9649a9 j_mayer
            /* FETCH */
1717 4c9649a9 j_mayer
            /* No-op */
1718 4c9649a9 j_mayer
            break;
1719 4c9649a9 j_mayer
        case 0xA000:
1720 4c9649a9 j_mayer
            /* FETCH_M */
1721 4c9649a9 j_mayer
            /* No-op */
1722 4c9649a9 j_mayer
            break;
1723 4c9649a9 j_mayer
        case 0xC000:
1724 4c9649a9 j_mayer
            /* RPCC */
1725 3761035f aurel32
            if (ra != 31)
1726 a7812ae4 pbrook
                gen_helper_load_pcc(cpu_ir[ra]);
1727 4c9649a9 j_mayer
            break;
1728 4c9649a9 j_mayer
        case 0xE000:
1729 4c9649a9 j_mayer
            /* RC */
1730 3761035f aurel32
            if (ra != 31)
1731 a7812ae4 pbrook
                gen_helper_rc(cpu_ir[ra]);
1732 4c9649a9 j_mayer
            break;
1733 4c9649a9 j_mayer
        case 0xE800:
1734 4c9649a9 j_mayer
            /* ECB */
1735 4c9649a9 j_mayer
            break;
1736 4c9649a9 j_mayer
        case 0xF000:
1737 4c9649a9 j_mayer
            /* RS */
1738 3761035f aurel32
            if (ra != 31)
1739 a7812ae4 pbrook
                gen_helper_rs(cpu_ir[ra]);
1740 4c9649a9 j_mayer
            break;
1741 4c9649a9 j_mayer
        case 0xF800:
1742 4c9649a9 j_mayer
            /* WH64 */
1743 4c9649a9 j_mayer
            /* No-op */
1744 4c9649a9 j_mayer
            break;
1745 4c9649a9 j_mayer
        default:
1746 4c9649a9 j_mayer
            goto invalid_opc;
1747 4c9649a9 j_mayer
        }
1748 4c9649a9 j_mayer
        break;
1749 4c9649a9 j_mayer
    case 0x19:
1750 4c9649a9 j_mayer
        /* HW_MFPR (PALcode) */
1751 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1752 4c9649a9 j_mayer
        goto invalid_opc;
1753 4c9649a9 j_mayer
#else
1754 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1755 4c9649a9 j_mayer
            goto invalid_opc;
1756 8bb6e981 aurel32
        if (ra != 31) {
1757 8bb6e981 aurel32
            TCGv tmp = tcg_const_i32(insn & 0xFF);
1758 a7812ae4 pbrook
            gen_helper_mfpr(cpu_ir[ra], tmp, cpu_ir[ra]);
1759 8bb6e981 aurel32
            tcg_temp_free(tmp);
1760 8bb6e981 aurel32
        }
1761 4c9649a9 j_mayer
        break;
1762 4c9649a9 j_mayer
#endif
1763 4c9649a9 j_mayer
    case 0x1A:
1764 3761035f aurel32
        if (rb != 31)
1765 3761035f aurel32
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1766 3761035f aurel32
        else
1767 3761035f aurel32
            tcg_gen_movi_i64(cpu_pc, 0);
1768 1304ca87 aurel32
        if (ra != 31)
1769 1304ca87 aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1770 4c9649a9 j_mayer
        /* Those four jumps only differ by the branch prediction hint */
1771 4c9649a9 j_mayer
        switch (fn2) {
1772 4c9649a9 j_mayer
        case 0x0:
1773 4c9649a9 j_mayer
            /* JMP */
1774 4c9649a9 j_mayer
            break;
1775 4c9649a9 j_mayer
        case 0x1:
1776 4c9649a9 j_mayer
            /* JSR */
1777 4c9649a9 j_mayer
            break;
1778 4c9649a9 j_mayer
        case 0x2:
1779 4c9649a9 j_mayer
            /* RET */
1780 4c9649a9 j_mayer
            break;
1781 4c9649a9 j_mayer
        case 0x3:
1782 4c9649a9 j_mayer
            /* JSR_COROUTINE */
1783 4c9649a9 j_mayer
            break;
1784 4c9649a9 j_mayer
        }
1785 4c9649a9 j_mayer
        ret = 1;
1786 4c9649a9 j_mayer
        break;
1787 4c9649a9 j_mayer
    case 0x1B:
1788 4c9649a9 j_mayer
        /* HW_LD (PALcode) */
1789 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1790 4c9649a9 j_mayer
        goto invalid_opc;
1791 4c9649a9 j_mayer
#else
1792 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1793 4c9649a9 j_mayer
            goto invalid_opc;
1794 8bb6e981 aurel32
        if (ra != 31) {
1795 a7812ae4 pbrook
            TCGv addr = tcg_temp_new();
1796 8bb6e981 aurel32
            if (rb != 31)
1797 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
1798 8bb6e981 aurel32
            else
1799 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
1800 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
1801 8bb6e981 aurel32
            case 0x0:
1802 b5d51029 aurel32
                /* Longword physical access (hw_ldl/p) */
1803 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1804 8bb6e981 aurel32
                break;
1805 8bb6e981 aurel32
            case 0x1:
1806 b5d51029 aurel32
                /* Quadword physical access (hw_ldq/p) */
1807 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1808 8bb6e981 aurel32
                break;
1809 8bb6e981 aurel32
            case 0x2:
1810 b5d51029 aurel32
                /* Longword physical access with lock (hw_ldl_l/p) */
1811 a7812ae4 pbrook
                gen_helper_ldl_l_raw(cpu_ir[ra], addr);
1812 8bb6e981 aurel32
                break;
1813 8bb6e981 aurel32
            case 0x3:
1814 b5d51029 aurel32
                /* Quadword physical access with lock (hw_ldq_l/p) */
1815 a7812ae4 pbrook
                gen_helper_ldq_l_raw(cpu_ir[ra], addr);
1816 8bb6e981 aurel32
                break;
1817 8bb6e981 aurel32
            case 0x4:
1818 b5d51029 aurel32
                /* Longword virtual PTE fetch (hw_ldl/v) */
1819 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
1820 8bb6e981 aurel32
                break;
1821 8bb6e981 aurel32
            case 0x5:
1822 b5d51029 aurel32
                /* Quadword virtual PTE fetch (hw_ldq/v) */
1823 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
1824 8bb6e981 aurel32
                break;
1825 8bb6e981 aurel32
            case 0x6:
1826 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
1827 b5d51029 aurel32
                goto invalid_opc;
1828 8bb6e981 aurel32
            case 0x7:
1829 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
1830 b5d51029 aurel32
                goto invalid_opc;
1831 8bb6e981 aurel32
            case 0x8:
1832 b5d51029 aurel32
                /* Longword virtual access (hw_ldl) */
1833 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1834 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1835 8bb6e981 aurel32
                break;
1836 8bb6e981 aurel32
            case 0x9:
1837 b5d51029 aurel32
                /* Quadword virtual access (hw_ldq) */
1838 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1839 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1840 8bb6e981 aurel32
                break;
1841 8bb6e981 aurel32
            case 0xA:
1842 b5d51029 aurel32
                /* Longword virtual access with protection check (hw_ldl/w) */
1843 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
1844 8bb6e981 aurel32
                break;
1845 8bb6e981 aurel32
            case 0xB:
1846 b5d51029 aurel32
                /* Quadword virtual access with protection check (hw_ldq/w) */
1847 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
1848 8bb6e981 aurel32
                break;
1849 8bb6e981 aurel32
            case 0xC:
1850 b5d51029 aurel32
                /* Longword virtual access with alt access mode (hw_ldl/a)*/
1851 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1852 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1853 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1854 a7812ae4 pbrook
                gen_helper_restore_mode();
1855 8bb6e981 aurel32
                break;
1856 8bb6e981 aurel32
            case 0xD:
1857 b5d51029 aurel32
                /* Quadword virtual access with alt access mode (hw_ldq/a) */
1858 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1859 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1860 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1861 a7812ae4 pbrook
                gen_helper_restore_mode();
1862 8bb6e981 aurel32
                break;
1863 8bb6e981 aurel32
            case 0xE:
1864 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode and
1865 b5d51029 aurel32
                 * protection checks (hw_ldl/wa)
1866 8bb6e981 aurel32
                 */
1867 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1868 a7812ae4 pbrook
                gen_helper_ldl_data(cpu_ir[ra], addr);
1869 a7812ae4 pbrook
                gen_helper_restore_mode();
1870 8bb6e981 aurel32
                break;
1871 8bb6e981 aurel32
            case 0xF:
1872 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode and
1873 b5d51029 aurel32
                 * protection checks (hw_ldq/wa)
1874 8bb6e981 aurel32
                 */
1875 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1876 a7812ae4 pbrook
                gen_helper_ldq_data(cpu_ir[ra], addr);
1877 a7812ae4 pbrook
                gen_helper_restore_mode();
1878 8bb6e981 aurel32
                break;
1879 8bb6e981 aurel32
            }
1880 8bb6e981 aurel32
            tcg_temp_free(addr);
1881 4c9649a9 j_mayer
        }
1882 4c9649a9 j_mayer
        break;
1883 4c9649a9 j_mayer
#endif
1884 4c9649a9 j_mayer
    case 0x1C:
1885 4c9649a9 j_mayer
        switch (fn7) {
1886 4c9649a9 j_mayer
        case 0x00:
1887 4c9649a9 j_mayer
            /* SEXTB */
1888 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1889 4c9649a9 j_mayer
                goto invalid_opc;
1890 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1891 ae8ecd42 aurel32
                if (islit)
1892 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1893 ae8ecd42 aurel32
                else
1894 dfaa8583 aurel32
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1895 ae8ecd42 aurel32
            }
1896 4c9649a9 j_mayer
            break;
1897 4c9649a9 j_mayer
        case 0x01:
1898 4c9649a9 j_mayer
            /* SEXTW */
1899 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1900 4c9649a9 j_mayer
                goto invalid_opc;
1901 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1902 ae8ecd42 aurel32
                if (islit)
1903 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1904 ae8ecd42 aurel32
                else
1905 dfaa8583 aurel32
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1906 ae8ecd42 aurel32
            }
1907 4c9649a9 j_mayer
            break;
1908 4c9649a9 j_mayer
        case 0x30:
1909 4c9649a9 j_mayer
            /* CTPOP */
1910 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1911 4c9649a9 j_mayer
                goto invalid_opc;
1912 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1913 ae8ecd42 aurel32
                if (islit)
1914 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1915 ae8ecd42 aurel32
                else
1916 a7812ae4 pbrook
                    gen_helper_ctpop(cpu_ir[rc], cpu_ir[rb]);
1917 ae8ecd42 aurel32
            }
1918 4c9649a9 j_mayer
            break;
1919 4c9649a9 j_mayer
        case 0x31:
1920 4c9649a9 j_mayer
            /* PERR */
1921 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1922 4c9649a9 j_mayer
                goto invalid_opc;
1923 4c9649a9 j_mayer
            /* XXX: TODO */
1924 4c9649a9 j_mayer
            goto invalid_opc;
1925 4c9649a9 j_mayer
            break;
1926 4c9649a9 j_mayer
        case 0x32:
1927 4c9649a9 j_mayer
            /* CTLZ */
1928 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1929 4c9649a9 j_mayer
                goto invalid_opc;
1930 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1931 ae8ecd42 aurel32
                if (islit)
1932 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1933 ae8ecd42 aurel32
                else
1934 a7812ae4 pbrook
                    gen_helper_ctlz(cpu_ir[rc], cpu_ir[rb]);
1935 ae8ecd42 aurel32
            }
1936 4c9649a9 j_mayer
            break;
1937 4c9649a9 j_mayer
        case 0x33:
1938 4c9649a9 j_mayer
            /* CTTZ */
1939 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1940 4c9649a9 j_mayer
                goto invalid_opc;
1941 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1942 ae8ecd42 aurel32
                if (islit)
1943 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1944 ae8ecd42 aurel32
                else
1945 a7812ae4 pbrook
                    gen_helper_cttz(cpu_ir[rc], cpu_ir[rb]);
1946 ae8ecd42 aurel32
            }
1947 4c9649a9 j_mayer
            break;
1948 4c9649a9 j_mayer
        case 0x34:
1949 4c9649a9 j_mayer
            /* UNPKBW */
1950 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1951 4c9649a9 j_mayer
                goto invalid_opc;
1952 4c9649a9 j_mayer
            /* XXX: TODO */
1953 4c9649a9 j_mayer
            goto invalid_opc;
1954 4c9649a9 j_mayer
            break;
1955 4c9649a9 j_mayer
        case 0x35:
1956 4c9649a9 j_mayer
            /* UNPKWL */
1957 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1958 4c9649a9 j_mayer
                goto invalid_opc;
1959 4c9649a9 j_mayer
            /* XXX: TODO */
1960 4c9649a9 j_mayer
            goto invalid_opc;
1961 4c9649a9 j_mayer
            break;
1962 4c9649a9 j_mayer
        case 0x36:
1963 4c9649a9 j_mayer
            /* PKWB */
1964 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1965 4c9649a9 j_mayer
                goto invalid_opc;
1966 4c9649a9 j_mayer
            /* XXX: TODO */
1967 4c9649a9 j_mayer
            goto invalid_opc;
1968 4c9649a9 j_mayer
            break;
1969 4c9649a9 j_mayer
        case 0x37:
1970 4c9649a9 j_mayer
            /* PKLB */
1971 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1972 4c9649a9 j_mayer
                goto invalid_opc;
1973 4c9649a9 j_mayer
            /* XXX: TODO */
1974 4c9649a9 j_mayer
            goto invalid_opc;
1975 4c9649a9 j_mayer
            break;
1976 4c9649a9 j_mayer
        case 0x38:
1977 4c9649a9 j_mayer
            /* MINSB8 */
1978 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1979 4c9649a9 j_mayer
                goto invalid_opc;
1980 4c9649a9 j_mayer
            /* XXX: TODO */
1981 4c9649a9 j_mayer
            goto invalid_opc;
1982 4c9649a9 j_mayer
            break;
1983 4c9649a9 j_mayer
        case 0x39:
1984 4c9649a9 j_mayer
            /* MINSW4 */
1985 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1986 4c9649a9 j_mayer
                goto invalid_opc;
1987 4c9649a9 j_mayer
            /* XXX: TODO */
1988 4c9649a9 j_mayer
            goto invalid_opc;
1989 4c9649a9 j_mayer
            break;
1990 4c9649a9 j_mayer
        case 0x3A:
1991 4c9649a9 j_mayer
            /* MINUB8 */
1992 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1993 4c9649a9 j_mayer
                goto invalid_opc;
1994 4c9649a9 j_mayer
            /* XXX: TODO */
1995 4c9649a9 j_mayer
            goto invalid_opc;
1996 4c9649a9 j_mayer
            break;
1997 4c9649a9 j_mayer
        case 0x3B:
1998 4c9649a9 j_mayer
            /* MINUW4 */
1999 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2000 4c9649a9 j_mayer
                goto invalid_opc;
2001 4c9649a9 j_mayer
            /* XXX: TODO */
2002 4c9649a9 j_mayer
            goto invalid_opc;
2003 4c9649a9 j_mayer
            break;
2004 4c9649a9 j_mayer
        case 0x3C:
2005 4c9649a9 j_mayer
            /* MAXUB8 */
2006 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2007 4c9649a9 j_mayer
                goto invalid_opc;
2008 4c9649a9 j_mayer
            /* XXX: TODO */
2009 4c9649a9 j_mayer
            goto invalid_opc;
2010 4c9649a9 j_mayer
            break;
2011 4c9649a9 j_mayer
        case 0x3D:
2012 4c9649a9 j_mayer
            /* MAXUW4 */
2013 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2014 4c9649a9 j_mayer
                goto invalid_opc;
2015 4c9649a9 j_mayer
            /* XXX: TODO */
2016 4c9649a9 j_mayer
            goto invalid_opc;
2017 4c9649a9 j_mayer
            break;
2018 4c9649a9 j_mayer
        case 0x3E:
2019 4c9649a9 j_mayer
            /* MAXSB8 */
2020 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2021 4c9649a9 j_mayer
                goto invalid_opc;
2022 4c9649a9 j_mayer
            /* XXX: TODO */
2023 4c9649a9 j_mayer
            goto invalid_opc;
2024 4c9649a9 j_mayer
            break;
2025 4c9649a9 j_mayer
        case 0x3F:
2026 4c9649a9 j_mayer
            /* MAXSW4 */
2027 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2028 4c9649a9 j_mayer
                goto invalid_opc;
2029 4c9649a9 j_mayer
            /* XXX: TODO */
2030 4c9649a9 j_mayer
            goto invalid_opc;
2031 4c9649a9 j_mayer
            break;
2032 4c9649a9 j_mayer
        case 0x70:
2033 4c9649a9 j_mayer
            /* FTOIT */
2034 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2035 4c9649a9 j_mayer
                goto invalid_opc;
2036 f18cd223 aurel32
            if (likely(rc != 31)) {
2037 f18cd223 aurel32
                if (ra != 31)
2038 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_ir[rc], cpu_fir[ra]);
2039 f18cd223 aurel32
                else
2040 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
2041 f18cd223 aurel32
            }
2042 4c9649a9 j_mayer
            break;
2043 4c9649a9 j_mayer
        case 0x78:
2044 4c9649a9 j_mayer
            /* FTOIS */
2045 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2046 4c9649a9 j_mayer
                goto invalid_opc;
2047 f18cd223 aurel32
            if (rc != 31) {
2048 a7812ae4 pbrook
                TCGv_i32 tmp1 = tcg_temp_new_i32();
2049 f18cd223 aurel32
                if (ra != 31)
2050 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, cpu_fir[ra]);
2051 f18cd223 aurel32
                else {
2052 f18cd223 aurel32
                    TCGv tmp2 = tcg_const_i64(0);
2053 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, tmp2);
2054 f18cd223 aurel32
                    tcg_temp_free(tmp2);
2055 f18cd223 aurel32
                }
2056 f18cd223 aurel32
                tcg_gen_ext_i32_i64(cpu_ir[rc], tmp1);
2057 a7812ae4 pbrook
                tcg_temp_free_i32(tmp1);
2058 f18cd223 aurel32
            }
2059 4c9649a9 j_mayer
            break;
2060 4c9649a9 j_mayer
        default:
2061 4c9649a9 j_mayer
            goto invalid_opc;
2062 4c9649a9 j_mayer
        }
2063 4c9649a9 j_mayer
        break;
2064 4c9649a9 j_mayer
    case 0x1D:
2065 4c9649a9 j_mayer
        /* HW_MTPR (PALcode) */
2066 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2067 4c9649a9 j_mayer
        goto invalid_opc;
2068 4c9649a9 j_mayer
#else
2069 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2070 4c9649a9 j_mayer
            goto invalid_opc;
2071 8bb6e981 aurel32
        else {
2072 8bb6e981 aurel32
            TCGv tmp1 = tcg_const_i32(insn & 0xFF);
2073 8bb6e981 aurel32
            if (ra != 31)
2074 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, cpu_ir[ra]);
2075 8bb6e981 aurel32
            else {
2076 8bb6e981 aurel32
                TCGv tmp2 = tcg_const_i64(0);
2077 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, tmp2);
2078 8bb6e981 aurel32
                tcg_temp_free(tmp2);
2079 8bb6e981 aurel32
            }
2080 8bb6e981 aurel32
            tcg_temp_free(tmp1);
2081 8bb6e981 aurel32
            ret = 2;
2082 8bb6e981 aurel32
        }
2083 4c9649a9 j_mayer
        break;
2084 4c9649a9 j_mayer
#endif
2085 4c9649a9 j_mayer
    case 0x1E:
2086 4c9649a9 j_mayer
        /* HW_REI (PALcode) */
2087 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2088 4c9649a9 j_mayer
        goto invalid_opc;
2089 4c9649a9 j_mayer
#else
2090 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2091 4c9649a9 j_mayer
            goto invalid_opc;
2092 4c9649a9 j_mayer
        if (rb == 31) {
2093 4c9649a9 j_mayer
            /* "Old" alpha */
2094 a7812ae4 pbrook
            gen_helper_hw_rei();
2095 4c9649a9 j_mayer
        } else {
2096 8bb6e981 aurel32
            TCGv tmp;
2097 8bb6e981 aurel32
2098 8bb6e981 aurel32
            if (ra != 31) {
2099 a7812ae4 pbrook
                tmp = tcg_temp_new();
2100 8bb6e981 aurel32
                tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51));
2101 8bb6e981 aurel32
            } else
2102 8bb6e981 aurel32
                tmp = tcg_const_i64(((int64_t)insn << 51) >> 51);
2103 a7812ae4 pbrook
            gen_helper_hw_ret(tmp);
2104 8bb6e981 aurel32
            tcg_temp_free(tmp);
2105 4c9649a9 j_mayer
        }
2106 4c9649a9 j_mayer
        ret = 2;
2107 4c9649a9 j_mayer
        break;
2108 4c9649a9 j_mayer
#endif
2109 4c9649a9 j_mayer
    case 0x1F:
2110 4c9649a9 j_mayer
        /* HW_ST (PALcode) */
2111 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2112 4c9649a9 j_mayer
        goto invalid_opc;
2113 4c9649a9 j_mayer
#else
2114 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2115 4c9649a9 j_mayer
            goto invalid_opc;
2116 8bb6e981 aurel32
        else {
2117 8bb6e981 aurel32
            TCGv addr, val;
2118 a7812ae4 pbrook
            addr = tcg_temp_new();
2119 8bb6e981 aurel32
            if (rb != 31)
2120 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
2121 8bb6e981 aurel32
            else
2122 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
2123 8bb6e981 aurel32
            if (ra != 31)
2124 8bb6e981 aurel32
                val = cpu_ir[ra];
2125 8bb6e981 aurel32
            else {
2126 a7812ae4 pbrook
                val = tcg_temp_new();
2127 8bb6e981 aurel32
                tcg_gen_movi_i64(val, 0);
2128 8bb6e981 aurel32
            }
2129 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
2130 8bb6e981 aurel32
            case 0x0:
2131 8bb6e981 aurel32
                /* Longword physical access */
2132 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2133 8bb6e981 aurel32
                break;
2134 8bb6e981 aurel32
            case 0x1:
2135 8bb6e981 aurel32
                /* Quadword physical access */
2136 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2137 8bb6e981 aurel32
                break;
2138 8bb6e981 aurel32
            case 0x2:
2139 8bb6e981 aurel32
                /* Longword physical access with lock */
2140 a7812ae4 pbrook
                gen_helper_stl_c_raw(val, val, addr);
2141 8bb6e981 aurel32
                break;
2142 8bb6e981 aurel32
            case 0x3:
2143 8bb6e981 aurel32
                /* Quadword physical access with lock */
2144 a7812ae4 pbrook
                gen_helper_stq_c_raw(val, val, addr);
2145 8bb6e981 aurel32
                break;
2146 8bb6e981 aurel32
            case 0x4:
2147 8bb6e981 aurel32
                /* Longword virtual access */
2148 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2149 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2150 8bb6e981 aurel32
                break;
2151 8bb6e981 aurel32
            case 0x5:
2152 8bb6e981 aurel32
                /* Quadword virtual access */
2153 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2154 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2155 8bb6e981 aurel32
                break;
2156 8bb6e981 aurel32
            case 0x6:
2157 8bb6e981 aurel32
                /* Invalid */
2158 8bb6e981 aurel32
                goto invalid_opc;
2159 8bb6e981 aurel32
            case 0x7:
2160 8bb6e981 aurel32
                /* Invalid */
2161 8bb6e981 aurel32
                goto invalid_opc;
2162 8bb6e981 aurel32
            case 0x8:
2163 8bb6e981 aurel32
                /* Invalid */
2164 8bb6e981 aurel32
                goto invalid_opc;
2165 8bb6e981 aurel32
            case 0x9:
2166 8bb6e981 aurel32
                /* Invalid */
2167 8bb6e981 aurel32
                goto invalid_opc;
2168 8bb6e981 aurel32
            case 0xA:
2169 8bb6e981 aurel32
                /* Invalid */
2170 8bb6e981 aurel32
                goto invalid_opc;
2171 8bb6e981 aurel32
            case 0xB:
2172 8bb6e981 aurel32
                /* Invalid */
2173 8bb6e981 aurel32
                goto invalid_opc;
2174 8bb6e981 aurel32
            case 0xC:
2175 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode */
2176 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2177 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2178 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2179 a7812ae4 pbrook
                gen_helper_restore_mode();
2180 8bb6e981 aurel32
                break;
2181 8bb6e981 aurel32
            case 0xD:
2182 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode */
2183 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2184 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2185 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2186 a7812ae4 pbrook
                gen_helper_restore_mode();
2187 8bb6e981 aurel32
                break;
2188 8bb6e981 aurel32
            case 0xE:
2189 8bb6e981 aurel32
                /* Invalid */
2190 8bb6e981 aurel32
                goto invalid_opc;
2191 8bb6e981 aurel32
            case 0xF:
2192 8bb6e981 aurel32
                /* Invalid */
2193 8bb6e981 aurel32
                goto invalid_opc;
2194 8bb6e981 aurel32
            }
2195 45d46ce8 aurel32
            if (ra == 31)
2196 8bb6e981 aurel32
                tcg_temp_free(val);
2197 8bb6e981 aurel32
            tcg_temp_free(addr);
2198 4c9649a9 j_mayer
        }
2199 4c9649a9 j_mayer
        break;
2200 4c9649a9 j_mayer
#endif
2201 4c9649a9 j_mayer
    case 0x20:
2202 4c9649a9 j_mayer
        /* LDF */
2203 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0);
2204 4c9649a9 j_mayer
        break;
2205 4c9649a9 j_mayer
    case 0x21:
2206 4c9649a9 j_mayer
        /* LDG */
2207 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0);
2208 4c9649a9 j_mayer
        break;
2209 4c9649a9 j_mayer
    case 0x22:
2210 4c9649a9 j_mayer
        /* LDS */
2211 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0);
2212 4c9649a9 j_mayer
        break;
2213 4c9649a9 j_mayer
    case 0x23:
2214 4c9649a9 j_mayer
        /* LDT */
2215 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0);
2216 4c9649a9 j_mayer
        break;
2217 4c9649a9 j_mayer
    case 0x24:
2218 4c9649a9 j_mayer
        /* STF */
2219 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0, 0);
2220 4c9649a9 j_mayer
        break;
2221 4c9649a9 j_mayer
    case 0x25:
2222 4c9649a9 j_mayer
        /* STG */
2223 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0, 0);
2224 4c9649a9 j_mayer
        break;
2225 4c9649a9 j_mayer
    case 0x26:
2226 4c9649a9 j_mayer
        /* STS */
2227 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0, 0);
2228 4c9649a9 j_mayer
        break;
2229 4c9649a9 j_mayer
    case 0x27:
2230 4c9649a9 j_mayer
        /* STT */
2231 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0, 0);
2232 4c9649a9 j_mayer
        break;
2233 4c9649a9 j_mayer
    case 0x28:
2234 4c9649a9 j_mayer
        /* LDL */
2235 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0, 0);
2236 4c9649a9 j_mayer
        break;
2237 4c9649a9 j_mayer
    case 0x29:
2238 4c9649a9 j_mayer
        /* LDQ */
2239 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 0);
2240 4c9649a9 j_mayer
        break;
2241 4c9649a9 j_mayer
    case 0x2A:
2242 4c9649a9 j_mayer
        /* LDL_L */
2243 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldl_l, ra, rb, disp16, 0, 0);
2244 4c9649a9 j_mayer
        break;
2245 4c9649a9 j_mayer
    case 0x2B:
2246 4c9649a9 j_mayer
        /* LDQ_L */
2247 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldq_l, ra, rb, disp16, 0, 0);
2248 4c9649a9 j_mayer
        break;
2249 4c9649a9 j_mayer
    case 0x2C:
2250 4c9649a9 j_mayer
        /* STL */
2251 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0, 0, 0);
2252 4c9649a9 j_mayer
        break;
2253 4c9649a9 j_mayer
    case 0x2D:
2254 4c9649a9 j_mayer
        /* STQ */
2255 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 0, 0);
2256 4c9649a9 j_mayer
        break;
2257 4c9649a9 j_mayer
    case 0x2E:
2258 4c9649a9 j_mayer
        /* STL_C */
2259 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stl_c, ra, rb, disp16, 0, 0, 1);
2260 4c9649a9 j_mayer
        break;
2261 4c9649a9 j_mayer
    case 0x2F:
2262 4c9649a9 j_mayer
        /* STQ_C */
2263 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stq_c, ra, rb, disp16, 0, 0, 1);
2264 4c9649a9 j_mayer
        break;
2265 4c9649a9 j_mayer
    case 0x30:
2266 4c9649a9 j_mayer
        /* BR */
2267 3761035f aurel32
        if (ra != 31)
2268 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2269 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2270 4c9649a9 j_mayer
        ret = 1;
2271 4c9649a9 j_mayer
        break;
2272 a7812ae4 pbrook
    case 0x31: /* FBEQ */
2273 a7812ae4 pbrook
    case 0x32: /* FBLT */
2274 a7812ae4 pbrook
    case 0x33: /* FBLE */
2275 a7812ae4 pbrook
        gen_fbcond(ctx, opc, ra, disp16);
2276 4c9649a9 j_mayer
        ret = 1;
2277 4c9649a9 j_mayer
        break;
2278 4c9649a9 j_mayer
    case 0x34:
2279 4c9649a9 j_mayer
        /* BSR */
2280 3761035f aurel32
        if (ra != 31)
2281 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2282 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2283 4c9649a9 j_mayer
        ret = 1;
2284 4c9649a9 j_mayer
        break;
2285 a7812ae4 pbrook
    case 0x35: /* FBNE */
2286 a7812ae4 pbrook
    case 0x36: /* FBGE */
2287 a7812ae4 pbrook
    case 0x37: /* FBGT */
2288 a7812ae4 pbrook
        gen_fbcond(ctx, opc, ra, disp16);
2289 4c9649a9 j_mayer
        ret = 1;
2290 4c9649a9 j_mayer
        break;
2291 4c9649a9 j_mayer
    case 0x38:
2292 4c9649a9 j_mayer
        /* BLBC */
2293 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 1);
2294 4c9649a9 j_mayer
        ret = 1;
2295 4c9649a9 j_mayer
        break;
2296 4c9649a9 j_mayer
    case 0x39:
2297 4c9649a9 j_mayer
        /* BEQ */
2298 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 0);
2299 4c9649a9 j_mayer
        ret = 1;
2300 4c9649a9 j_mayer
        break;
2301 4c9649a9 j_mayer
    case 0x3A:
2302 4c9649a9 j_mayer
        /* BLT */
2303 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LT, ra, disp21, 0);
2304 4c9649a9 j_mayer
        ret = 1;
2305 4c9649a9 j_mayer
        break;
2306 4c9649a9 j_mayer
    case 0x3B:
2307 4c9649a9 j_mayer
        /* BLE */
2308 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LE, ra, disp21, 0);
2309 4c9649a9 j_mayer
        ret = 1;
2310 4c9649a9 j_mayer
        break;
2311 4c9649a9 j_mayer
    case 0x3C:
2312 4c9649a9 j_mayer
        /* BLBS */
2313 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 1);
2314 4c9649a9 j_mayer
        ret = 1;
2315 4c9649a9 j_mayer
        break;
2316 4c9649a9 j_mayer
    case 0x3D:
2317 4c9649a9 j_mayer
        /* BNE */
2318 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 0);
2319 4c9649a9 j_mayer
        ret = 1;
2320 4c9649a9 j_mayer
        break;
2321 4c9649a9 j_mayer
    case 0x3E:
2322 4c9649a9 j_mayer
        /* BGE */
2323 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GE, ra, disp21, 0);
2324 4c9649a9 j_mayer
        ret = 1;
2325 4c9649a9 j_mayer
        break;
2326 4c9649a9 j_mayer
    case 0x3F:
2327 4c9649a9 j_mayer
        /* BGT */
2328 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GT, ra, disp21, 0);
2329 4c9649a9 j_mayer
        ret = 1;
2330 4c9649a9 j_mayer
        break;
2331 4c9649a9 j_mayer
    invalid_opc:
2332 4c9649a9 j_mayer
        gen_invalid(ctx);
2333 4c9649a9 j_mayer
        ret = 3;
2334 4c9649a9 j_mayer
        break;
2335 4c9649a9 j_mayer
    }
2336 4c9649a9 j_mayer
2337 4c9649a9 j_mayer
    return ret;
2338 4c9649a9 j_mayer
}
2339 4c9649a9 j_mayer
2340 2cfc5f17 ths
static always_inline void gen_intermediate_code_internal (CPUState *env,
2341 2cfc5f17 ths
                                                          TranslationBlock *tb,
2342 2cfc5f17 ths
                                                          int search_pc)
2343 4c9649a9 j_mayer
{
2344 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2345 4c9649a9 j_mayer
    static int insn_count;
2346 4c9649a9 j_mayer
#endif
2347 4c9649a9 j_mayer
    DisasContext ctx, *ctxp = &ctx;
2348 4c9649a9 j_mayer
    target_ulong pc_start;
2349 4c9649a9 j_mayer
    uint32_t insn;
2350 4c9649a9 j_mayer
    uint16_t *gen_opc_end;
2351 a1d1bb31 aliguori
    CPUBreakpoint *bp;
2352 4c9649a9 j_mayer
    int j, lj = -1;
2353 4c9649a9 j_mayer
    int ret;
2354 2e70f6ef pbrook
    int num_insns;
2355 2e70f6ef pbrook
    int max_insns;
2356 4c9649a9 j_mayer
2357 4c9649a9 j_mayer
    pc_start = tb->pc;
2358 4c9649a9 j_mayer
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2359 4c9649a9 j_mayer
    ctx.pc = pc_start;
2360 4c9649a9 j_mayer
    ctx.amask = env->amask;
2361 8579095b aurel32
    ctx.env = env;
2362 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2363 4c9649a9 j_mayer
    ctx.mem_idx = 0;
2364 4c9649a9 j_mayer
#else
2365 4c9649a9 j_mayer
    ctx.mem_idx = ((env->ps >> 3) & 3);
2366 4c9649a9 j_mayer
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2367 4c9649a9 j_mayer
#endif
2368 2e70f6ef pbrook
    num_insns = 0;
2369 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
2370 2e70f6ef pbrook
    if (max_insns == 0)
2371 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
2372 2e70f6ef pbrook
2373 2e70f6ef pbrook
    gen_icount_start();
2374 4c9649a9 j_mayer
    for (ret = 0; ret == 0;) {
2375 c0ce998e aliguori
        if (unlikely(!TAILQ_EMPTY(&env->breakpoints))) {
2376 c0ce998e aliguori
            TAILQ_FOREACH(bp, &env->breakpoints, entry) {
2377 a1d1bb31 aliguori
                if (bp->pc == ctx.pc) {
2378 4c9649a9 j_mayer
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2379 4c9649a9 j_mayer
                    break;
2380 4c9649a9 j_mayer
                }
2381 4c9649a9 j_mayer
            }
2382 4c9649a9 j_mayer
        }
2383 4c9649a9 j_mayer
        if (search_pc) {
2384 4c9649a9 j_mayer
            j = gen_opc_ptr - gen_opc_buf;
2385 4c9649a9 j_mayer
            if (lj < j) {
2386 4c9649a9 j_mayer
                lj++;
2387 4c9649a9 j_mayer
                while (lj < j)
2388 4c9649a9 j_mayer
                    gen_opc_instr_start[lj++] = 0;
2389 4c9649a9 j_mayer
            }
2390 ed1dda53 aurel32
            gen_opc_pc[lj] = ctx.pc;
2391 ed1dda53 aurel32
            gen_opc_instr_start[lj] = 1;
2392 ed1dda53 aurel32
            gen_opc_icount[lj] = num_insns;
2393 4c9649a9 j_mayer
        }
2394 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2395 2e70f6ef pbrook
            gen_io_start();
2396 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2397 4c9649a9 j_mayer
        insn_count++;
2398 d12d51d5 aliguori
        LOG_DISAS("pc " TARGET_FMT_lx " mem_idx %d\n",
2399 d12d51d5 aliguori
                  ctx.pc, ctx.mem_idx);
2400 4c9649a9 j_mayer
#endif
2401 4c9649a9 j_mayer
        insn = ldl_code(ctx.pc);
2402 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2403 4c9649a9 j_mayer
        insn_count++;
2404 d12d51d5 aliguori
        LOG_DISAS("opcode %08x %d\n", insn, insn_count);
2405 4c9649a9 j_mayer
#endif
2406 2e70f6ef pbrook
        num_insns++;
2407 4c9649a9 j_mayer
        ctx.pc += 4;
2408 4c9649a9 j_mayer
        ret = translate_one(ctxp, insn);
2409 4c9649a9 j_mayer
        if (ret != 0)
2410 4c9649a9 j_mayer
            break;
2411 4c9649a9 j_mayer
        /* if we reach a page boundary or are single stepping, stop
2412 4c9649a9 j_mayer
         * generation
2413 4c9649a9 j_mayer
         */
2414 19bf517b aurel32
        if (env->singlestep_enabled) {
2415 19bf517b aurel32
            gen_excp(&ctx, EXCP_DEBUG, 0);
2416 19bf517b aurel32
            break;
2417 1b530a6d aurel32
        }
2418 19bf517b aurel32
2419 8fcc55f9 aurel32
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
2420 8fcc55f9 aurel32
            break;
2421 8fcc55f9 aurel32
2422 8fcc55f9 aurel32
        if (gen_opc_ptr >= gen_opc_end)
2423 8fcc55f9 aurel32
            break;
2424 8fcc55f9 aurel32
2425 8fcc55f9 aurel32
        if (num_insns >= max_insns)
2426 8fcc55f9 aurel32
            break;
2427 8fcc55f9 aurel32
2428 1b530a6d aurel32
        if (singlestep) {
2429 1b530a6d aurel32
            break;
2430 1b530a6d aurel32
        }
2431 4c9649a9 j_mayer
    }
2432 4c9649a9 j_mayer
    if (ret != 1 && ret != 3) {
2433 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
2434 4c9649a9 j_mayer
    }
2435 4c9649a9 j_mayer
#if defined (DO_TB_FLUSH)
2436 a7812ae4 pbrook
    gen_helper_tb_flush();
2437 4c9649a9 j_mayer
#endif
2438 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
2439 2e70f6ef pbrook
        gen_io_end();
2440 4c9649a9 j_mayer
    /* Generate the return instruction */
2441 57fec1fe bellard
    tcg_gen_exit_tb(0);
2442 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
2443 4c9649a9 j_mayer
    *gen_opc_ptr = INDEX_op_end;
2444 4c9649a9 j_mayer
    if (search_pc) {
2445 4c9649a9 j_mayer
        j = gen_opc_ptr - gen_opc_buf;
2446 4c9649a9 j_mayer
        lj++;
2447 4c9649a9 j_mayer
        while (lj <= j)
2448 4c9649a9 j_mayer
            gen_opc_instr_start[lj++] = 0;
2449 4c9649a9 j_mayer
    } else {
2450 4c9649a9 j_mayer
        tb->size = ctx.pc - pc_start;
2451 2e70f6ef pbrook
        tb->icount = num_insns;
2452 4c9649a9 j_mayer
    }
2453 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2454 93fcfe39 aliguori
    log_cpu_state_mask(CPU_LOG_TB_CPU, env, 0);
2455 8fec2b8c aliguori
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
2456 93fcfe39 aliguori
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
2457 93fcfe39 aliguori
        log_target_disas(pc_start, ctx.pc - pc_start, 1);
2458 93fcfe39 aliguori
        qemu_log("\n");
2459 4c9649a9 j_mayer
    }
2460 4c9649a9 j_mayer
#endif
2461 4c9649a9 j_mayer
}
2462 4c9649a9 j_mayer
2463 2cfc5f17 ths
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2464 4c9649a9 j_mayer
{
2465 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 0);
2466 4c9649a9 j_mayer
}
2467 4c9649a9 j_mayer
2468 2cfc5f17 ths
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2469 4c9649a9 j_mayer
{
2470 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 1);
2471 4c9649a9 j_mayer
}
2472 4c9649a9 j_mayer
2473 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2474 4c9649a9 j_mayer
{
2475 4c9649a9 j_mayer
    CPUAlphaState *env;
2476 4c9649a9 j_mayer
    uint64_t hwpcb;
2477 4c9649a9 j_mayer
2478 4c9649a9 j_mayer
    env = qemu_mallocz(sizeof(CPUAlphaState));
2479 4c9649a9 j_mayer
    cpu_exec_init(env);
2480 2e70f6ef pbrook
    alpha_translate_init();
2481 4c9649a9 j_mayer
    tlb_flush(env, 1);
2482 4c9649a9 j_mayer
    /* XXX: should not be hardcoded */
2483 4c9649a9 j_mayer
    env->implver = IMPLVER_2106x;
2484 4c9649a9 j_mayer
    env->ps = 0x1F00;
2485 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2486 4c9649a9 j_mayer
    env->ps |= 1 << 3;
2487 4c9649a9 j_mayer
#endif
2488 4c9649a9 j_mayer
    pal_init(env);
2489 4c9649a9 j_mayer
    /* Initialize IPR */
2490 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
2491 4c9649a9 j_mayer
    env->ipr[IPR_ASN] = 0;
2492 4c9649a9 j_mayer
    env->ipr[IPR_ASTEN] = 0;
2493 4c9649a9 j_mayer
    env->ipr[IPR_ASTSR] = 0;
2494 4c9649a9 j_mayer
    env->ipr[IPR_DATFX] = 0;
2495 4c9649a9 j_mayer
    /* XXX: fix this */
2496 4c9649a9 j_mayer
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2497 4c9649a9 j_mayer
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2498 4c9649a9 j_mayer
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2499 4c9649a9 j_mayer
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2500 4c9649a9 j_mayer
    env->ipr[IPR_FEN] = 0;
2501 4c9649a9 j_mayer
    env->ipr[IPR_IPL] = 31;
2502 4c9649a9 j_mayer
    env->ipr[IPR_MCES] = 0;
2503 4c9649a9 j_mayer
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2504 4c9649a9 j_mayer
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2505 4c9649a9 j_mayer
    env->ipr[IPR_SISR] = 0;
2506 4c9649a9 j_mayer
    env->ipr[IPR_VIRBND] = -1ULL;
2507 4c9649a9 j_mayer
2508 4c9649a9 j_mayer
    return env;
2509 4c9649a9 j_mayer
}
2510 aaed909a bellard
2511 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2512 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
2513 d2856f1a aurel32
{
2514 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
2515 d2856f1a aurel32
}