Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 8579095b

History | View | Annotate | Download (74.9 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 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
1164 ae8ecd42 aurel32
                else
1165 a7812ae4 pbrook
                    gen_helper_amask(cpu_ir[rc], cpu_ir[rb]);
1166 ae8ecd42 aurel32
            }
1167 4c9649a9 j_mayer
            break;
1168 4c9649a9 j_mayer
        case 0x64:
1169 4c9649a9 j_mayer
            /* CMOVLE */
1170 fe2b269a aurel32
            gen_cmov(TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1171 4c9649a9 j_mayer
            break;
1172 4c9649a9 j_mayer
        case 0x66:
1173 4c9649a9 j_mayer
            /* CMOVGT */
1174 fe2b269a aurel32
            gen_cmov(TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1175 4c9649a9 j_mayer
            break;
1176 4c9649a9 j_mayer
        case 0x6C:
1177 4c9649a9 j_mayer
            /* IMPLVER */
1178 3761035f aurel32
            if (rc != 31)
1179 8579095b aurel32
                tcg_gen_movi_i64(cpu_ir[rc], ctx->env->implver);
1180 4c9649a9 j_mayer
            break;
1181 4c9649a9 j_mayer
        default:
1182 4c9649a9 j_mayer
            goto invalid_opc;
1183 4c9649a9 j_mayer
        }
1184 4c9649a9 j_mayer
        break;
1185 4c9649a9 j_mayer
    case 0x12:
1186 4c9649a9 j_mayer
        switch (fn7) {
1187 4c9649a9 j_mayer
        case 0x02:
1188 4c9649a9 j_mayer
            /* MSKBL */
1189 a7812ae4 pbrook
            gen_mskbl(ra, rb, rc, islit, lit);
1190 4c9649a9 j_mayer
            break;
1191 4c9649a9 j_mayer
        case 0x06:
1192 4c9649a9 j_mayer
            /* EXTBL */
1193 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1194 4c9649a9 j_mayer
            break;
1195 4c9649a9 j_mayer
        case 0x0B:
1196 4c9649a9 j_mayer
            /* INSBL */
1197 a7812ae4 pbrook
            gen_insbl(ra, rb, rc, islit, lit);
1198 4c9649a9 j_mayer
            break;
1199 4c9649a9 j_mayer
        case 0x12:
1200 4c9649a9 j_mayer
            /* MSKWL */
1201 a7812ae4 pbrook
            gen_mskwl(ra, rb, rc, islit, lit);
1202 4c9649a9 j_mayer
            break;
1203 4c9649a9 j_mayer
        case 0x16:
1204 4c9649a9 j_mayer
            /* EXTWL */
1205 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1206 4c9649a9 j_mayer
            break;
1207 4c9649a9 j_mayer
        case 0x1B:
1208 4c9649a9 j_mayer
            /* INSWL */
1209 a7812ae4 pbrook
            gen_inswl(ra, rb, rc, islit, lit);
1210 4c9649a9 j_mayer
            break;
1211 4c9649a9 j_mayer
        case 0x22:
1212 4c9649a9 j_mayer
            /* MSKLL */
1213 a7812ae4 pbrook
            gen_mskll(ra, rb, rc, islit, lit);
1214 4c9649a9 j_mayer
            break;
1215 4c9649a9 j_mayer
        case 0x26:
1216 4c9649a9 j_mayer
            /* EXTLL */
1217 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1218 4c9649a9 j_mayer
            break;
1219 4c9649a9 j_mayer
        case 0x2B:
1220 4c9649a9 j_mayer
            /* INSLL */
1221 a7812ae4 pbrook
            gen_insll(ra, rb, rc, islit, lit);
1222 4c9649a9 j_mayer
            break;
1223 4c9649a9 j_mayer
        case 0x30:
1224 4c9649a9 j_mayer
            /* ZAP */
1225 a7812ae4 pbrook
            gen_zap(ra, rb, rc, islit, lit);
1226 4c9649a9 j_mayer
            break;
1227 4c9649a9 j_mayer
        case 0x31:
1228 4c9649a9 j_mayer
            /* ZAPNOT */
1229 a7812ae4 pbrook
            gen_zapnot(ra, rb, rc, islit, lit);
1230 4c9649a9 j_mayer
            break;
1231 4c9649a9 j_mayer
        case 0x32:
1232 4c9649a9 j_mayer
            /* MSKQL */
1233 a7812ae4 pbrook
            gen_mskql(ra, rb, rc, islit, lit);
1234 4c9649a9 j_mayer
            break;
1235 4c9649a9 j_mayer
        case 0x34:
1236 4c9649a9 j_mayer
            /* SRL */
1237 30c7183b aurel32
            if (likely(rc != 31)) {
1238 30c7183b aurel32
                if (ra != 31) {
1239 30c7183b aurel32
                    if (islit)
1240 30c7183b aurel32
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1241 dfaa8583 aurel32
                    else {
1242 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1243 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1244 30c7183b aurel32
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1245 30c7183b aurel32
                        tcg_temp_free(shift);
1246 dfaa8583 aurel32
                    }
1247 30c7183b aurel32
                } else
1248 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1249 30c7183b aurel32
            }
1250 4c9649a9 j_mayer
            break;
1251 4c9649a9 j_mayer
        case 0x36:
1252 4c9649a9 j_mayer
            /* EXTQL */
1253 b3249f63 aurel32
            gen_ext_l(NULL, ra, rb, rc, islit, lit);
1254 4c9649a9 j_mayer
            break;
1255 4c9649a9 j_mayer
        case 0x39:
1256 4c9649a9 j_mayer
            /* SLL */
1257 30c7183b aurel32
            if (likely(rc != 31)) {
1258 30c7183b aurel32
                if (ra != 31) {
1259 30c7183b aurel32
                    if (islit)
1260 30c7183b aurel32
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1261 dfaa8583 aurel32
                    else {
1262 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1263 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1264 30c7183b aurel32
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1265 30c7183b aurel32
                        tcg_temp_free(shift);
1266 dfaa8583 aurel32
                    }
1267 30c7183b aurel32
                } else
1268 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1269 30c7183b aurel32
            }
1270 4c9649a9 j_mayer
            break;
1271 4c9649a9 j_mayer
        case 0x3B:
1272 4c9649a9 j_mayer
            /* INSQL */
1273 a7812ae4 pbrook
            gen_insql(ra, rb, rc, islit, lit);
1274 4c9649a9 j_mayer
            break;
1275 4c9649a9 j_mayer
        case 0x3C:
1276 4c9649a9 j_mayer
            /* SRA */
1277 30c7183b aurel32
            if (likely(rc != 31)) {
1278 30c7183b aurel32
                if (ra != 31) {
1279 30c7183b aurel32
                    if (islit)
1280 30c7183b aurel32
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1281 dfaa8583 aurel32
                    else {
1282 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1283 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1284 30c7183b aurel32
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1285 30c7183b aurel32
                        tcg_temp_free(shift);
1286 dfaa8583 aurel32
                    }
1287 30c7183b aurel32
                } else
1288 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1289 30c7183b aurel32
            }
1290 4c9649a9 j_mayer
            break;
1291 4c9649a9 j_mayer
        case 0x52:
1292 4c9649a9 j_mayer
            /* MSKWH */
1293 a7812ae4 pbrook
            gen_mskwh(ra, rb, rc, islit, lit);
1294 4c9649a9 j_mayer
            break;
1295 4c9649a9 j_mayer
        case 0x57:
1296 4c9649a9 j_mayer
            /* INSWH */
1297 a7812ae4 pbrook
            gen_inswh(ra, rb, rc, islit, lit);
1298 4c9649a9 j_mayer
            break;
1299 4c9649a9 j_mayer
        case 0x5A:
1300 4c9649a9 j_mayer
            /* EXTWH */
1301 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1302 4c9649a9 j_mayer
            break;
1303 4c9649a9 j_mayer
        case 0x62:
1304 4c9649a9 j_mayer
            /* MSKLH */
1305 a7812ae4 pbrook
            gen_msklh(ra, rb, rc, islit, lit);
1306 4c9649a9 j_mayer
            break;
1307 4c9649a9 j_mayer
        case 0x67:
1308 4c9649a9 j_mayer
            /* INSLH */
1309 a7812ae4 pbrook
            gen_inslh(ra, rb, rc, islit, lit);
1310 4c9649a9 j_mayer
            break;
1311 4c9649a9 j_mayer
        case 0x6A:
1312 4c9649a9 j_mayer
            /* EXTLH */
1313 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1314 4c9649a9 j_mayer
            break;
1315 4c9649a9 j_mayer
        case 0x72:
1316 4c9649a9 j_mayer
            /* MSKQH */
1317 a7812ae4 pbrook
            gen_mskqh(ra, rb, rc, islit, lit);
1318 4c9649a9 j_mayer
            break;
1319 4c9649a9 j_mayer
        case 0x77:
1320 4c9649a9 j_mayer
            /* INSQH */
1321 a7812ae4 pbrook
            gen_insqh(ra, rb, rc, islit, lit);
1322 4c9649a9 j_mayer
            break;
1323 4c9649a9 j_mayer
        case 0x7A:
1324 4c9649a9 j_mayer
            /* EXTQH */
1325 b3249f63 aurel32
            gen_ext_h(NULL, ra, rb, rc, islit, lit);
1326 4c9649a9 j_mayer
            break;
1327 4c9649a9 j_mayer
        default:
1328 4c9649a9 j_mayer
            goto invalid_opc;
1329 4c9649a9 j_mayer
        }
1330 4c9649a9 j_mayer
        break;
1331 4c9649a9 j_mayer
    case 0x13:
1332 4c9649a9 j_mayer
        switch (fn7) {
1333 4c9649a9 j_mayer
        case 0x00:
1334 4c9649a9 j_mayer
            /* MULL */
1335 30c7183b aurel32
            if (likely(rc != 31)) {
1336 dfaa8583 aurel32
                if (ra == 31)
1337 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1338 30c7183b aurel32
                else {
1339 30c7183b aurel32
                    if (islit)
1340 30c7183b aurel32
                        tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1341 30c7183b aurel32
                    else
1342 30c7183b aurel32
                        tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1343 30c7183b aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1344 30c7183b aurel32
                }
1345 30c7183b aurel32
            }
1346 4c9649a9 j_mayer
            break;
1347 4c9649a9 j_mayer
        case 0x20:
1348 4c9649a9 j_mayer
            /* MULQ */
1349 30c7183b aurel32
            if (likely(rc != 31)) {
1350 dfaa8583 aurel32
                if (ra == 31)
1351 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1352 30c7183b aurel32
                else if (islit)
1353 30c7183b aurel32
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1354 30c7183b aurel32
                else
1355 30c7183b aurel32
                    tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1356 30c7183b aurel32
            }
1357 4c9649a9 j_mayer
            break;
1358 4c9649a9 j_mayer
        case 0x30:
1359 4c9649a9 j_mayer
            /* UMULH */
1360 a7812ae4 pbrook
            gen_umulh(ra, rb, rc, islit, lit);
1361 4c9649a9 j_mayer
            break;
1362 4c9649a9 j_mayer
        case 0x40:
1363 4c9649a9 j_mayer
            /* MULL/V */
1364 a7812ae4 pbrook
            gen_mullv(ra, rb, rc, islit, lit);
1365 4c9649a9 j_mayer
            break;
1366 4c9649a9 j_mayer
        case 0x60:
1367 4c9649a9 j_mayer
            /* MULQ/V */
1368 a7812ae4 pbrook
            gen_mulqv(ra, rb, rc, islit, lit);
1369 4c9649a9 j_mayer
            break;
1370 4c9649a9 j_mayer
        default:
1371 4c9649a9 j_mayer
            goto invalid_opc;
1372 4c9649a9 j_mayer
        }
1373 4c9649a9 j_mayer
        break;
1374 4c9649a9 j_mayer
    case 0x14:
1375 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1376 4c9649a9 j_mayer
        case 0x04:
1377 4c9649a9 j_mayer
            /* ITOFS */
1378 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1379 4c9649a9 j_mayer
                goto invalid_opc;
1380 f18cd223 aurel32
            if (likely(rc != 31)) {
1381 f18cd223 aurel32
                if (ra != 31) {
1382 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
1383 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
1384 a7812ae4 pbrook
                    gen_helper_memory_to_s(cpu_fir[rc], tmp);
1385 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
1386 f18cd223 aurel32
                } else
1387 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1388 f18cd223 aurel32
            }
1389 4c9649a9 j_mayer
            break;
1390 4c9649a9 j_mayer
        case 0x0A:
1391 4c9649a9 j_mayer
            /* SQRTF */
1392 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1393 4c9649a9 j_mayer
                goto invalid_opc;
1394 a7812ae4 pbrook
            gen_fsqrtf(rb, rc);
1395 4c9649a9 j_mayer
            break;
1396 4c9649a9 j_mayer
        case 0x0B:
1397 4c9649a9 j_mayer
            /* SQRTS */
1398 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1399 4c9649a9 j_mayer
                goto invalid_opc;
1400 a7812ae4 pbrook
            gen_fsqrts(rb, rc);
1401 4c9649a9 j_mayer
            break;
1402 4c9649a9 j_mayer
        case 0x14:
1403 4c9649a9 j_mayer
            /* ITOFF */
1404 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1405 4c9649a9 j_mayer
                goto invalid_opc;
1406 f18cd223 aurel32
            if (likely(rc != 31)) {
1407 f18cd223 aurel32
                if (ra != 31) {
1408 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
1409 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
1410 a7812ae4 pbrook
                    gen_helper_memory_to_f(cpu_fir[rc], tmp);
1411 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
1412 f18cd223 aurel32
                } else
1413 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1414 f18cd223 aurel32
            }
1415 4c9649a9 j_mayer
            break;
1416 4c9649a9 j_mayer
        case 0x24:
1417 4c9649a9 j_mayer
            /* ITOFT */
1418 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1419 4c9649a9 j_mayer
                goto invalid_opc;
1420 f18cd223 aurel32
            if (likely(rc != 31)) {
1421 f18cd223 aurel32
                if (ra != 31)
1422 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_fir[rc], cpu_ir[ra]);
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 0x2A:
1428 4c9649a9 j_mayer
            /* SQRTG */
1429 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1430 4c9649a9 j_mayer
                goto invalid_opc;
1431 a7812ae4 pbrook
            gen_fsqrtg(rb, rc);
1432 4c9649a9 j_mayer
            break;
1433 4c9649a9 j_mayer
        case 0x02B:
1434 4c9649a9 j_mayer
            /* SQRTT */
1435 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1436 4c9649a9 j_mayer
                goto invalid_opc;
1437 a7812ae4 pbrook
            gen_fsqrtt(rb, rc);
1438 4c9649a9 j_mayer
            break;
1439 4c9649a9 j_mayer
        default:
1440 4c9649a9 j_mayer
            goto invalid_opc;
1441 4c9649a9 j_mayer
        }
1442 4c9649a9 j_mayer
        break;
1443 4c9649a9 j_mayer
    case 0x15:
1444 4c9649a9 j_mayer
        /* VAX floating point */
1445 4c9649a9 j_mayer
        /* XXX: rounding mode and trap are ignored (!) */
1446 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1447 4c9649a9 j_mayer
        case 0x00:
1448 4c9649a9 j_mayer
            /* ADDF */
1449 a7812ae4 pbrook
            gen_faddf(ra, rb, rc);
1450 4c9649a9 j_mayer
            break;
1451 4c9649a9 j_mayer
        case 0x01:
1452 4c9649a9 j_mayer
            /* SUBF */
1453 a7812ae4 pbrook
            gen_fsubf(ra, rb, rc);
1454 4c9649a9 j_mayer
            break;
1455 4c9649a9 j_mayer
        case 0x02:
1456 4c9649a9 j_mayer
            /* MULF */
1457 a7812ae4 pbrook
            gen_fmulf(ra, rb, rc);
1458 4c9649a9 j_mayer
            break;
1459 4c9649a9 j_mayer
        case 0x03:
1460 4c9649a9 j_mayer
            /* DIVF */
1461 a7812ae4 pbrook
            gen_fdivf(ra, rb, rc);
1462 4c9649a9 j_mayer
            break;
1463 4c9649a9 j_mayer
        case 0x1E:
1464 4c9649a9 j_mayer
            /* CVTDG */
1465 4c9649a9 j_mayer
#if 0 // TODO
1466 a7812ae4 pbrook
            gen_fcvtdg(rb, rc);
1467 4c9649a9 j_mayer
#else
1468 4c9649a9 j_mayer
            goto invalid_opc;
1469 4c9649a9 j_mayer
#endif
1470 4c9649a9 j_mayer
            break;
1471 4c9649a9 j_mayer
        case 0x20:
1472 4c9649a9 j_mayer
            /* ADDG */
1473 a7812ae4 pbrook
            gen_faddg(ra, rb, rc);
1474 4c9649a9 j_mayer
            break;
1475 4c9649a9 j_mayer
        case 0x21:
1476 4c9649a9 j_mayer
            /* SUBG */
1477 a7812ae4 pbrook
            gen_fsubg(ra, rb, rc);
1478 4c9649a9 j_mayer
            break;
1479 4c9649a9 j_mayer
        case 0x22:
1480 4c9649a9 j_mayer
            /* MULG */
1481 a7812ae4 pbrook
            gen_fmulg(ra, rb, rc);
1482 4c9649a9 j_mayer
            break;
1483 4c9649a9 j_mayer
        case 0x23:
1484 4c9649a9 j_mayer
            /* DIVG */
1485 a7812ae4 pbrook
            gen_fdivg(ra, rb, rc);
1486 4c9649a9 j_mayer
            break;
1487 4c9649a9 j_mayer
        case 0x25:
1488 4c9649a9 j_mayer
            /* CMPGEQ */
1489 a7812ae4 pbrook
            gen_fcmpgeq(ra, rb, rc);
1490 4c9649a9 j_mayer
            break;
1491 4c9649a9 j_mayer
        case 0x26:
1492 4c9649a9 j_mayer
            /* CMPGLT */
1493 a7812ae4 pbrook
            gen_fcmpglt(ra, rb, rc);
1494 4c9649a9 j_mayer
            break;
1495 4c9649a9 j_mayer
        case 0x27:
1496 4c9649a9 j_mayer
            /* CMPGLE */
1497 a7812ae4 pbrook
            gen_fcmpgle(ra, rb, rc);
1498 4c9649a9 j_mayer
            break;
1499 4c9649a9 j_mayer
        case 0x2C:
1500 4c9649a9 j_mayer
            /* CVTGF */
1501 a7812ae4 pbrook
            gen_fcvtgf(rb, rc);
1502 4c9649a9 j_mayer
            break;
1503 4c9649a9 j_mayer
        case 0x2D:
1504 4c9649a9 j_mayer
            /* CVTGD */
1505 4c9649a9 j_mayer
#if 0 // TODO
1506 a7812ae4 pbrook
            gen_fcvtgd(rb, rc);
1507 4c9649a9 j_mayer
#else
1508 4c9649a9 j_mayer
            goto invalid_opc;
1509 4c9649a9 j_mayer
#endif
1510 4c9649a9 j_mayer
            break;
1511 4c9649a9 j_mayer
        case 0x2F:
1512 4c9649a9 j_mayer
            /* CVTGQ */
1513 a7812ae4 pbrook
            gen_fcvtgq(rb, rc);
1514 4c9649a9 j_mayer
            break;
1515 4c9649a9 j_mayer
        case 0x3C:
1516 4c9649a9 j_mayer
            /* CVTQF */
1517 a7812ae4 pbrook
            gen_fcvtqf(rb, rc);
1518 4c9649a9 j_mayer
            break;
1519 4c9649a9 j_mayer
        case 0x3E:
1520 4c9649a9 j_mayer
            /* CVTQG */
1521 a7812ae4 pbrook
            gen_fcvtqg(rb, rc);
1522 4c9649a9 j_mayer
            break;
1523 4c9649a9 j_mayer
        default:
1524 4c9649a9 j_mayer
            goto invalid_opc;
1525 4c9649a9 j_mayer
        }
1526 4c9649a9 j_mayer
        break;
1527 4c9649a9 j_mayer
    case 0x16:
1528 4c9649a9 j_mayer
        /* IEEE floating-point */
1529 4c9649a9 j_mayer
        /* XXX: rounding mode and traps are ignored (!) */
1530 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1531 4c9649a9 j_mayer
        case 0x00:
1532 4c9649a9 j_mayer
            /* ADDS */
1533 a7812ae4 pbrook
            gen_fadds(ra, rb, rc);
1534 4c9649a9 j_mayer
            break;
1535 4c9649a9 j_mayer
        case 0x01:
1536 4c9649a9 j_mayer
            /* SUBS */
1537 a7812ae4 pbrook
            gen_fsubs(ra, rb, rc);
1538 4c9649a9 j_mayer
            break;
1539 4c9649a9 j_mayer
        case 0x02:
1540 4c9649a9 j_mayer
            /* MULS */
1541 a7812ae4 pbrook
            gen_fmuls(ra, rb, rc);
1542 4c9649a9 j_mayer
            break;
1543 4c9649a9 j_mayer
        case 0x03:
1544 4c9649a9 j_mayer
            /* DIVS */
1545 a7812ae4 pbrook
            gen_fdivs(ra, rb, rc);
1546 4c9649a9 j_mayer
            break;
1547 4c9649a9 j_mayer
        case 0x20:
1548 4c9649a9 j_mayer
            /* ADDT */
1549 a7812ae4 pbrook
            gen_faddt(ra, rb, rc);
1550 4c9649a9 j_mayer
            break;
1551 4c9649a9 j_mayer
        case 0x21:
1552 4c9649a9 j_mayer
            /* SUBT */
1553 a7812ae4 pbrook
            gen_fsubt(ra, rb, rc);
1554 4c9649a9 j_mayer
            break;
1555 4c9649a9 j_mayer
        case 0x22:
1556 4c9649a9 j_mayer
            /* MULT */
1557 a7812ae4 pbrook
            gen_fmult(ra, rb, rc);
1558 4c9649a9 j_mayer
            break;
1559 4c9649a9 j_mayer
        case 0x23:
1560 4c9649a9 j_mayer
            /* DIVT */
1561 a7812ae4 pbrook
            gen_fdivt(ra, rb, rc);
1562 4c9649a9 j_mayer
            break;
1563 4c9649a9 j_mayer
        case 0x24:
1564 4c9649a9 j_mayer
            /* CMPTUN */
1565 a7812ae4 pbrook
            gen_fcmptun(ra, rb, rc);
1566 4c9649a9 j_mayer
            break;
1567 4c9649a9 j_mayer
        case 0x25:
1568 4c9649a9 j_mayer
            /* CMPTEQ */
1569 a7812ae4 pbrook
            gen_fcmpteq(ra, rb, rc);
1570 4c9649a9 j_mayer
            break;
1571 4c9649a9 j_mayer
        case 0x26:
1572 4c9649a9 j_mayer
            /* CMPTLT */
1573 a7812ae4 pbrook
            gen_fcmptlt(ra, rb, rc);
1574 4c9649a9 j_mayer
            break;
1575 4c9649a9 j_mayer
        case 0x27:
1576 4c9649a9 j_mayer
            /* CMPTLE */
1577 a7812ae4 pbrook
            gen_fcmptle(ra, rb, rc);
1578 4c9649a9 j_mayer
            break;
1579 4c9649a9 j_mayer
        case 0x2C:
1580 4c9649a9 j_mayer
            /* XXX: incorrect */
1581 a74b4d2c aurel32
            if (fn11 == 0x2AC || fn11 == 0x6AC) {
1582 4c9649a9 j_mayer
                /* CVTST */
1583 a7812ae4 pbrook
                gen_fcvtst(rb, rc);
1584 4c9649a9 j_mayer
            } else {
1585 4c9649a9 j_mayer
                /* CVTTS */
1586 a7812ae4 pbrook
                gen_fcvtts(rb, rc);
1587 4c9649a9 j_mayer
            }
1588 4c9649a9 j_mayer
            break;
1589 4c9649a9 j_mayer
        case 0x2F:
1590 4c9649a9 j_mayer
            /* CVTTQ */
1591 a7812ae4 pbrook
            gen_fcvttq(rb, rc);
1592 4c9649a9 j_mayer
            break;
1593 4c9649a9 j_mayer
        case 0x3C:
1594 4c9649a9 j_mayer
            /* CVTQS */
1595 a7812ae4 pbrook
            gen_fcvtqs(rb, rc);
1596 4c9649a9 j_mayer
            break;
1597 4c9649a9 j_mayer
        case 0x3E:
1598 4c9649a9 j_mayer
            /* CVTQT */
1599 a7812ae4 pbrook
            gen_fcvtqt(rb, rc);
1600 4c9649a9 j_mayer
            break;
1601 4c9649a9 j_mayer
        default:
1602 4c9649a9 j_mayer
            goto invalid_opc;
1603 4c9649a9 j_mayer
        }
1604 4c9649a9 j_mayer
        break;
1605 4c9649a9 j_mayer
    case 0x17:
1606 4c9649a9 j_mayer
        switch (fn11) {
1607 4c9649a9 j_mayer
        case 0x010:
1608 4c9649a9 j_mayer
            /* CVTLQ */
1609 a7812ae4 pbrook
            gen_fcvtlq(rb, rc);
1610 4c9649a9 j_mayer
            break;
1611 4c9649a9 j_mayer
        case 0x020:
1612 f18cd223 aurel32
            if (likely(rc != 31)) {
1613 f18cd223 aurel32
                if (ra == rb)
1614 4c9649a9 j_mayer
                    /* FMOV */
1615 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[ra]);
1616 f18cd223 aurel32
                else
1617 f18cd223 aurel32
                    /* CPYS */
1618 a7812ae4 pbrook
                    gen_fcpys(ra, rb, rc);
1619 4c9649a9 j_mayer
            }
1620 4c9649a9 j_mayer
            break;
1621 4c9649a9 j_mayer
        case 0x021:
1622 4c9649a9 j_mayer
            /* CPYSN */
1623 a7812ae4 pbrook
            gen_fcpysn(ra, rb, rc);
1624 4c9649a9 j_mayer
            break;
1625 4c9649a9 j_mayer
        case 0x022:
1626 4c9649a9 j_mayer
            /* CPYSE */
1627 a7812ae4 pbrook
            gen_fcpyse(ra, rb, rc);
1628 4c9649a9 j_mayer
            break;
1629 4c9649a9 j_mayer
        case 0x024:
1630 4c9649a9 j_mayer
            /* MT_FPCR */
1631 f18cd223 aurel32
            if (likely(ra != 31))
1632 a7812ae4 pbrook
                gen_helper_store_fpcr(cpu_fir[ra]);
1633 f18cd223 aurel32
            else {
1634 f18cd223 aurel32
                TCGv tmp = tcg_const_i64(0);
1635 a7812ae4 pbrook
                gen_helper_store_fpcr(tmp);
1636 f18cd223 aurel32
                tcg_temp_free(tmp);
1637 f18cd223 aurel32
            }
1638 4c9649a9 j_mayer
            break;
1639 4c9649a9 j_mayer
        case 0x025:
1640 4c9649a9 j_mayer
            /* MF_FPCR */
1641 f18cd223 aurel32
            if (likely(ra != 31))
1642 a7812ae4 pbrook
                gen_helper_load_fpcr(cpu_fir[ra]);
1643 4c9649a9 j_mayer
            break;
1644 4c9649a9 j_mayer
        case 0x02A:
1645 4c9649a9 j_mayer
            /* FCMOVEQ */
1646 a7812ae4 pbrook
            gen_fcmpfeq(ra, rb, rc);
1647 4c9649a9 j_mayer
            break;
1648 4c9649a9 j_mayer
        case 0x02B:
1649 4c9649a9 j_mayer
            /* FCMOVNE */
1650 a7812ae4 pbrook
            gen_fcmpfne(ra, rb, rc);
1651 4c9649a9 j_mayer
            break;
1652 4c9649a9 j_mayer
        case 0x02C:
1653 4c9649a9 j_mayer
            /* FCMOVLT */
1654 a7812ae4 pbrook
            gen_fcmpflt(ra, rb, rc);
1655 4c9649a9 j_mayer
            break;
1656 4c9649a9 j_mayer
        case 0x02D:
1657 4c9649a9 j_mayer
            /* FCMOVGE */
1658 a7812ae4 pbrook
            gen_fcmpfge(ra, rb, rc);
1659 4c9649a9 j_mayer
            break;
1660 4c9649a9 j_mayer
        case 0x02E:
1661 4c9649a9 j_mayer
            /* FCMOVLE */
1662 a7812ae4 pbrook
            gen_fcmpfle(ra, rb, rc);
1663 4c9649a9 j_mayer
            break;
1664 4c9649a9 j_mayer
        case 0x02F:
1665 4c9649a9 j_mayer
            /* FCMOVGT */
1666 a7812ae4 pbrook
            gen_fcmpfgt(ra, rb, rc);
1667 4c9649a9 j_mayer
            break;
1668 4c9649a9 j_mayer
        case 0x030:
1669 4c9649a9 j_mayer
            /* CVTQL */
1670 a7812ae4 pbrook
            gen_fcvtql(rb, rc);
1671 4c9649a9 j_mayer
            break;
1672 4c9649a9 j_mayer
        case 0x130:
1673 4c9649a9 j_mayer
            /* CVTQL/V */
1674 a7812ae4 pbrook
            gen_fcvtqlv(rb, rc);
1675 4c9649a9 j_mayer
            break;
1676 4c9649a9 j_mayer
        case 0x530:
1677 4c9649a9 j_mayer
            /* CVTQL/SV */
1678 a7812ae4 pbrook
            gen_fcvtqlsv(rb, rc);
1679 4c9649a9 j_mayer
            break;
1680 4c9649a9 j_mayer
        default:
1681 4c9649a9 j_mayer
            goto invalid_opc;
1682 4c9649a9 j_mayer
        }
1683 4c9649a9 j_mayer
        break;
1684 4c9649a9 j_mayer
    case 0x18:
1685 4c9649a9 j_mayer
        switch ((uint16_t)disp16) {
1686 4c9649a9 j_mayer
        case 0x0000:
1687 4c9649a9 j_mayer
            /* TRAPB */
1688 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1689 4c9649a9 j_mayer
            ret = 2;
1690 4c9649a9 j_mayer
            break;
1691 4c9649a9 j_mayer
        case 0x0400:
1692 4c9649a9 j_mayer
            /* EXCB */
1693 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1694 4c9649a9 j_mayer
            ret = 2;
1695 4c9649a9 j_mayer
            break;
1696 4c9649a9 j_mayer
        case 0x4000:
1697 4c9649a9 j_mayer
            /* MB */
1698 4c9649a9 j_mayer
            /* No-op */
1699 4c9649a9 j_mayer
            break;
1700 4c9649a9 j_mayer
        case 0x4400:
1701 4c9649a9 j_mayer
            /* WMB */
1702 4c9649a9 j_mayer
            /* No-op */
1703 4c9649a9 j_mayer
            break;
1704 4c9649a9 j_mayer
        case 0x8000:
1705 4c9649a9 j_mayer
            /* FETCH */
1706 4c9649a9 j_mayer
            /* No-op */
1707 4c9649a9 j_mayer
            break;
1708 4c9649a9 j_mayer
        case 0xA000:
1709 4c9649a9 j_mayer
            /* FETCH_M */
1710 4c9649a9 j_mayer
            /* No-op */
1711 4c9649a9 j_mayer
            break;
1712 4c9649a9 j_mayer
        case 0xC000:
1713 4c9649a9 j_mayer
            /* RPCC */
1714 3761035f aurel32
            if (ra != 31)
1715 a7812ae4 pbrook
                gen_helper_load_pcc(cpu_ir[ra]);
1716 4c9649a9 j_mayer
            break;
1717 4c9649a9 j_mayer
        case 0xE000:
1718 4c9649a9 j_mayer
            /* RC */
1719 3761035f aurel32
            if (ra != 31)
1720 a7812ae4 pbrook
                gen_helper_rc(cpu_ir[ra]);
1721 4c9649a9 j_mayer
            break;
1722 4c9649a9 j_mayer
        case 0xE800:
1723 4c9649a9 j_mayer
            /* ECB */
1724 4c9649a9 j_mayer
            /* XXX: TODO: evict tb cache at address rb */
1725 4c9649a9 j_mayer
#if 0
1726 4c9649a9 j_mayer
            ret = 2;
1727 4c9649a9 j_mayer
#else
1728 4c9649a9 j_mayer
            goto invalid_opc;
1729 4c9649a9 j_mayer
#endif
1730 4c9649a9 j_mayer
            break;
1731 4c9649a9 j_mayer
        case 0xF000:
1732 4c9649a9 j_mayer
            /* RS */
1733 3761035f aurel32
            if (ra != 31)
1734 a7812ae4 pbrook
                gen_helper_rs(cpu_ir[ra]);
1735 4c9649a9 j_mayer
            break;
1736 4c9649a9 j_mayer
        case 0xF800:
1737 4c9649a9 j_mayer
            /* WH64 */
1738 4c9649a9 j_mayer
            /* No-op */
1739 4c9649a9 j_mayer
            break;
1740 4c9649a9 j_mayer
        default:
1741 4c9649a9 j_mayer
            goto invalid_opc;
1742 4c9649a9 j_mayer
        }
1743 4c9649a9 j_mayer
        break;
1744 4c9649a9 j_mayer
    case 0x19:
1745 4c9649a9 j_mayer
        /* HW_MFPR (PALcode) */
1746 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1747 4c9649a9 j_mayer
        goto invalid_opc;
1748 4c9649a9 j_mayer
#else
1749 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1750 4c9649a9 j_mayer
            goto invalid_opc;
1751 8bb6e981 aurel32
        if (ra != 31) {
1752 8bb6e981 aurel32
            TCGv tmp = tcg_const_i32(insn & 0xFF);
1753 a7812ae4 pbrook
            gen_helper_mfpr(cpu_ir[ra], tmp, cpu_ir[ra]);
1754 8bb6e981 aurel32
            tcg_temp_free(tmp);
1755 8bb6e981 aurel32
        }
1756 4c9649a9 j_mayer
        break;
1757 4c9649a9 j_mayer
#endif
1758 4c9649a9 j_mayer
    case 0x1A:
1759 3761035f aurel32
        if (rb != 31)
1760 3761035f aurel32
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1761 3761035f aurel32
        else
1762 3761035f aurel32
            tcg_gen_movi_i64(cpu_pc, 0);
1763 1304ca87 aurel32
        if (ra != 31)
1764 1304ca87 aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1765 4c9649a9 j_mayer
        /* Those four jumps only differ by the branch prediction hint */
1766 4c9649a9 j_mayer
        switch (fn2) {
1767 4c9649a9 j_mayer
        case 0x0:
1768 4c9649a9 j_mayer
            /* JMP */
1769 4c9649a9 j_mayer
            break;
1770 4c9649a9 j_mayer
        case 0x1:
1771 4c9649a9 j_mayer
            /* JSR */
1772 4c9649a9 j_mayer
            break;
1773 4c9649a9 j_mayer
        case 0x2:
1774 4c9649a9 j_mayer
            /* RET */
1775 4c9649a9 j_mayer
            break;
1776 4c9649a9 j_mayer
        case 0x3:
1777 4c9649a9 j_mayer
            /* JSR_COROUTINE */
1778 4c9649a9 j_mayer
            break;
1779 4c9649a9 j_mayer
        }
1780 4c9649a9 j_mayer
        ret = 1;
1781 4c9649a9 j_mayer
        break;
1782 4c9649a9 j_mayer
    case 0x1B:
1783 4c9649a9 j_mayer
        /* HW_LD (PALcode) */
1784 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1785 4c9649a9 j_mayer
        goto invalid_opc;
1786 4c9649a9 j_mayer
#else
1787 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1788 4c9649a9 j_mayer
            goto invalid_opc;
1789 8bb6e981 aurel32
        if (ra != 31) {
1790 a7812ae4 pbrook
            TCGv addr = tcg_temp_new();
1791 8bb6e981 aurel32
            if (rb != 31)
1792 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
1793 8bb6e981 aurel32
            else
1794 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
1795 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
1796 8bb6e981 aurel32
            case 0x0:
1797 b5d51029 aurel32
                /* Longword physical access (hw_ldl/p) */
1798 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1799 8bb6e981 aurel32
                break;
1800 8bb6e981 aurel32
            case 0x1:
1801 b5d51029 aurel32
                /* Quadword physical access (hw_ldq/p) */
1802 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1803 8bb6e981 aurel32
                break;
1804 8bb6e981 aurel32
            case 0x2:
1805 b5d51029 aurel32
                /* Longword physical access with lock (hw_ldl_l/p) */
1806 a7812ae4 pbrook
                gen_helper_ldl_l_raw(cpu_ir[ra], addr);
1807 8bb6e981 aurel32
                break;
1808 8bb6e981 aurel32
            case 0x3:
1809 b5d51029 aurel32
                /* Quadword physical access with lock (hw_ldq_l/p) */
1810 a7812ae4 pbrook
                gen_helper_ldq_l_raw(cpu_ir[ra], addr);
1811 8bb6e981 aurel32
                break;
1812 8bb6e981 aurel32
            case 0x4:
1813 b5d51029 aurel32
                /* Longword virtual PTE fetch (hw_ldl/v) */
1814 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
1815 8bb6e981 aurel32
                break;
1816 8bb6e981 aurel32
            case 0x5:
1817 b5d51029 aurel32
                /* Quadword virtual PTE fetch (hw_ldq/v) */
1818 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
1819 8bb6e981 aurel32
                break;
1820 8bb6e981 aurel32
            case 0x6:
1821 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
1822 b5d51029 aurel32
                goto invalid_opc;
1823 8bb6e981 aurel32
            case 0x7:
1824 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
1825 b5d51029 aurel32
                goto invalid_opc;
1826 8bb6e981 aurel32
            case 0x8:
1827 b5d51029 aurel32
                /* Longword virtual access (hw_ldl) */
1828 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1829 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1830 8bb6e981 aurel32
                break;
1831 8bb6e981 aurel32
            case 0x9:
1832 b5d51029 aurel32
                /* Quadword virtual access (hw_ldq) */
1833 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1834 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1835 8bb6e981 aurel32
                break;
1836 8bb6e981 aurel32
            case 0xA:
1837 b5d51029 aurel32
                /* Longword virtual access with protection check (hw_ldl/w) */
1838 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
1839 8bb6e981 aurel32
                break;
1840 8bb6e981 aurel32
            case 0xB:
1841 b5d51029 aurel32
                /* Quadword virtual access with protection check (hw_ldq/w) */
1842 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
1843 8bb6e981 aurel32
                break;
1844 8bb6e981 aurel32
            case 0xC:
1845 b5d51029 aurel32
                /* Longword virtual access with alt access mode (hw_ldl/a)*/
1846 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1847 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1848 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
1849 a7812ae4 pbrook
                gen_helper_restore_mode();
1850 8bb6e981 aurel32
                break;
1851 8bb6e981 aurel32
            case 0xD:
1852 b5d51029 aurel32
                /* Quadword virtual access with alt access mode (hw_ldq/a) */
1853 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1854 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
1855 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
1856 a7812ae4 pbrook
                gen_helper_restore_mode();
1857 8bb6e981 aurel32
                break;
1858 8bb6e981 aurel32
            case 0xE:
1859 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode and
1860 b5d51029 aurel32
                 * protection checks (hw_ldl/wa)
1861 8bb6e981 aurel32
                 */
1862 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1863 a7812ae4 pbrook
                gen_helper_ldl_data(cpu_ir[ra], addr);
1864 a7812ae4 pbrook
                gen_helper_restore_mode();
1865 8bb6e981 aurel32
                break;
1866 8bb6e981 aurel32
            case 0xF:
1867 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode and
1868 b5d51029 aurel32
                 * protection checks (hw_ldq/wa)
1869 8bb6e981 aurel32
                 */
1870 a7812ae4 pbrook
                gen_helper_set_alt_mode();
1871 a7812ae4 pbrook
                gen_helper_ldq_data(cpu_ir[ra], addr);
1872 a7812ae4 pbrook
                gen_helper_restore_mode();
1873 8bb6e981 aurel32
                break;
1874 8bb6e981 aurel32
            }
1875 8bb6e981 aurel32
            tcg_temp_free(addr);
1876 4c9649a9 j_mayer
        }
1877 4c9649a9 j_mayer
        break;
1878 4c9649a9 j_mayer
#endif
1879 4c9649a9 j_mayer
    case 0x1C:
1880 4c9649a9 j_mayer
        switch (fn7) {
1881 4c9649a9 j_mayer
        case 0x00:
1882 4c9649a9 j_mayer
            /* SEXTB */
1883 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1884 4c9649a9 j_mayer
                goto invalid_opc;
1885 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1886 ae8ecd42 aurel32
                if (islit)
1887 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1888 ae8ecd42 aurel32
                else
1889 dfaa8583 aurel32
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1890 ae8ecd42 aurel32
            }
1891 4c9649a9 j_mayer
            break;
1892 4c9649a9 j_mayer
        case 0x01:
1893 4c9649a9 j_mayer
            /* SEXTW */
1894 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1895 4c9649a9 j_mayer
                goto invalid_opc;
1896 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1897 ae8ecd42 aurel32
                if (islit)
1898 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1899 ae8ecd42 aurel32
                else
1900 dfaa8583 aurel32
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1901 ae8ecd42 aurel32
            }
1902 4c9649a9 j_mayer
            break;
1903 4c9649a9 j_mayer
        case 0x30:
1904 4c9649a9 j_mayer
            /* CTPOP */
1905 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1906 4c9649a9 j_mayer
                goto invalid_opc;
1907 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1908 ae8ecd42 aurel32
                if (islit)
1909 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1910 ae8ecd42 aurel32
                else
1911 a7812ae4 pbrook
                    gen_helper_ctpop(cpu_ir[rc], cpu_ir[rb]);
1912 ae8ecd42 aurel32
            }
1913 4c9649a9 j_mayer
            break;
1914 4c9649a9 j_mayer
        case 0x31:
1915 4c9649a9 j_mayer
            /* PERR */
1916 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1917 4c9649a9 j_mayer
                goto invalid_opc;
1918 4c9649a9 j_mayer
            /* XXX: TODO */
1919 4c9649a9 j_mayer
            goto invalid_opc;
1920 4c9649a9 j_mayer
            break;
1921 4c9649a9 j_mayer
        case 0x32:
1922 4c9649a9 j_mayer
            /* CTLZ */
1923 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1924 4c9649a9 j_mayer
                goto invalid_opc;
1925 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1926 ae8ecd42 aurel32
                if (islit)
1927 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1928 ae8ecd42 aurel32
                else
1929 a7812ae4 pbrook
                    gen_helper_ctlz(cpu_ir[rc], cpu_ir[rb]);
1930 ae8ecd42 aurel32
            }
1931 4c9649a9 j_mayer
            break;
1932 4c9649a9 j_mayer
        case 0x33:
1933 4c9649a9 j_mayer
            /* CTTZ */
1934 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1935 4c9649a9 j_mayer
                goto invalid_opc;
1936 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1937 ae8ecd42 aurel32
                if (islit)
1938 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1939 ae8ecd42 aurel32
                else
1940 a7812ae4 pbrook
                    gen_helper_cttz(cpu_ir[rc], cpu_ir[rb]);
1941 ae8ecd42 aurel32
            }
1942 4c9649a9 j_mayer
            break;
1943 4c9649a9 j_mayer
        case 0x34:
1944 4c9649a9 j_mayer
            /* UNPKBW */
1945 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1946 4c9649a9 j_mayer
                goto invalid_opc;
1947 4c9649a9 j_mayer
            /* XXX: TODO */
1948 4c9649a9 j_mayer
            goto invalid_opc;
1949 4c9649a9 j_mayer
            break;
1950 4c9649a9 j_mayer
        case 0x35:
1951 4c9649a9 j_mayer
            /* UNPKWL */
1952 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1953 4c9649a9 j_mayer
                goto invalid_opc;
1954 4c9649a9 j_mayer
            /* XXX: TODO */
1955 4c9649a9 j_mayer
            goto invalid_opc;
1956 4c9649a9 j_mayer
            break;
1957 4c9649a9 j_mayer
        case 0x36:
1958 4c9649a9 j_mayer
            /* PKWB */
1959 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1960 4c9649a9 j_mayer
                goto invalid_opc;
1961 4c9649a9 j_mayer
            /* XXX: TODO */
1962 4c9649a9 j_mayer
            goto invalid_opc;
1963 4c9649a9 j_mayer
            break;
1964 4c9649a9 j_mayer
        case 0x37:
1965 4c9649a9 j_mayer
            /* PKLB */
1966 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1967 4c9649a9 j_mayer
                goto invalid_opc;
1968 4c9649a9 j_mayer
            /* XXX: TODO */
1969 4c9649a9 j_mayer
            goto invalid_opc;
1970 4c9649a9 j_mayer
            break;
1971 4c9649a9 j_mayer
        case 0x38:
1972 4c9649a9 j_mayer
            /* MINSB8 */
1973 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1974 4c9649a9 j_mayer
                goto invalid_opc;
1975 4c9649a9 j_mayer
            /* XXX: TODO */
1976 4c9649a9 j_mayer
            goto invalid_opc;
1977 4c9649a9 j_mayer
            break;
1978 4c9649a9 j_mayer
        case 0x39:
1979 4c9649a9 j_mayer
            /* MINSW4 */
1980 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1981 4c9649a9 j_mayer
                goto invalid_opc;
1982 4c9649a9 j_mayer
            /* XXX: TODO */
1983 4c9649a9 j_mayer
            goto invalid_opc;
1984 4c9649a9 j_mayer
            break;
1985 4c9649a9 j_mayer
        case 0x3A:
1986 4c9649a9 j_mayer
            /* MINUB8 */
1987 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1988 4c9649a9 j_mayer
                goto invalid_opc;
1989 4c9649a9 j_mayer
            /* XXX: TODO */
1990 4c9649a9 j_mayer
            goto invalid_opc;
1991 4c9649a9 j_mayer
            break;
1992 4c9649a9 j_mayer
        case 0x3B:
1993 4c9649a9 j_mayer
            /* MINUW4 */
1994 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1995 4c9649a9 j_mayer
                goto invalid_opc;
1996 4c9649a9 j_mayer
            /* XXX: TODO */
1997 4c9649a9 j_mayer
            goto invalid_opc;
1998 4c9649a9 j_mayer
            break;
1999 4c9649a9 j_mayer
        case 0x3C:
2000 4c9649a9 j_mayer
            /* MAXUB8 */
2001 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2002 4c9649a9 j_mayer
                goto invalid_opc;
2003 4c9649a9 j_mayer
            /* XXX: TODO */
2004 4c9649a9 j_mayer
            goto invalid_opc;
2005 4c9649a9 j_mayer
            break;
2006 4c9649a9 j_mayer
        case 0x3D:
2007 4c9649a9 j_mayer
            /* MAXUW4 */
2008 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2009 4c9649a9 j_mayer
                goto invalid_opc;
2010 4c9649a9 j_mayer
            /* XXX: TODO */
2011 4c9649a9 j_mayer
            goto invalid_opc;
2012 4c9649a9 j_mayer
            break;
2013 4c9649a9 j_mayer
        case 0x3E:
2014 4c9649a9 j_mayer
            /* MAXSB8 */
2015 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2016 4c9649a9 j_mayer
                goto invalid_opc;
2017 4c9649a9 j_mayer
            /* XXX: TODO */
2018 4c9649a9 j_mayer
            goto invalid_opc;
2019 4c9649a9 j_mayer
            break;
2020 4c9649a9 j_mayer
        case 0x3F:
2021 4c9649a9 j_mayer
            /* MAXSW4 */
2022 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2023 4c9649a9 j_mayer
                goto invalid_opc;
2024 4c9649a9 j_mayer
            /* XXX: TODO */
2025 4c9649a9 j_mayer
            goto invalid_opc;
2026 4c9649a9 j_mayer
            break;
2027 4c9649a9 j_mayer
        case 0x70:
2028 4c9649a9 j_mayer
            /* FTOIT */
2029 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2030 4c9649a9 j_mayer
                goto invalid_opc;
2031 f18cd223 aurel32
            if (likely(rc != 31)) {
2032 f18cd223 aurel32
                if (ra != 31)
2033 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_ir[rc], cpu_fir[ra]);
2034 f18cd223 aurel32
                else
2035 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
2036 f18cd223 aurel32
            }
2037 4c9649a9 j_mayer
            break;
2038 4c9649a9 j_mayer
        case 0x78:
2039 4c9649a9 j_mayer
            /* FTOIS */
2040 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2041 4c9649a9 j_mayer
                goto invalid_opc;
2042 f18cd223 aurel32
            if (rc != 31) {
2043 a7812ae4 pbrook
                TCGv_i32 tmp1 = tcg_temp_new_i32();
2044 f18cd223 aurel32
                if (ra != 31)
2045 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, cpu_fir[ra]);
2046 f18cd223 aurel32
                else {
2047 f18cd223 aurel32
                    TCGv tmp2 = tcg_const_i64(0);
2048 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, tmp2);
2049 f18cd223 aurel32
                    tcg_temp_free(tmp2);
2050 f18cd223 aurel32
                }
2051 f18cd223 aurel32
                tcg_gen_ext_i32_i64(cpu_ir[rc], tmp1);
2052 a7812ae4 pbrook
                tcg_temp_free_i32(tmp1);
2053 f18cd223 aurel32
            }
2054 4c9649a9 j_mayer
            break;
2055 4c9649a9 j_mayer
        default:
2056 4c9649a9 j_mayer
            goto invalid_opc;
2057 4c9649a9 j_mayer
        }
2058 4c9649a9 j_mayer
        break;
2059 4c9649a9 j_mayer
    case 0x1D:
2060 4c9649a9 j_mayer
        /* HW_MTPR (PALcode) */
2061 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2062 4c9649a9 j_mayer
        goto invalid_opc;
2063 4c9649a9 j_mayer
#else
2064 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2065 4c9649a9 j_mayer
            goto invalid_opc;
2066 8bb6e981 aurel32
        else {
2067 8bb6e981 aurel32
            TCGv tmp1 = tcg_const_i32(insn & 0xFF);
2068 8bb6e981 aurel32
            if (ra != 31)
2069 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, cpu_ir[ra]);
2070 8bb6e981 aurel32
            else {
2071 8bb6e981 aurel32
                TCGv tmp2 = tcg_const_i64(0);
2072 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, tmp2);
2073 8bb6e981 aurel32
                tcg_temp_free(tmp2);
2074 8bb6e981 aurel32
            }
2075 8bb6e981 aurel32
            tcg_temp_free(tmp1);
2076 8bb6e981 aurel32
            ret = 2;
2077 8bb6e981 aurel32
        }
2078 4c9649a9 j_mayer
        break;
2079 4c9649a9 j_mayer
#endif
2080 4c9649a9 j_mayer
    case 0x1E:
2081 4c9649a9 j_mayer
        /* HW_REI (PALcode) */
2082 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2083 4c9649a9 j_mayer
        goto invalid_opc;
2084 4c9649a9 j_mayer
#else
2085 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2086 4c9649a9 j_mayer
            goto invalid_opc;
2087 4c9649a9 j_mayer
        if (rb == 31) {
2088 4c9649a9 j_mayer
            /* "Old" alpha */
2089 a7812ae4 pbrook
            gen_helper_hw_rei();
2090 4c9649a9 j_mayer
        } else {
2091 8bb6e981 aurel32
            TCGv tmp;
2092 8bb6e981 aurel32
2093 8bb6e981 aurel32
            if (ra != 31) {
2094 a7812ae4 pbrook
                tmp = tcg_temp_new();
2095 8bb6e981 aurel32
                tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51));
2096 8bb6e981 aurel32
            } else
2097 8bb6e981 aurel32
                tmp = tcg_const_i64(((int64_t)insn << 51) >> 51);
2098 a7812ae4 pbrook
            gen_helper_hw_ret(tmp);
2099 8bb6e981 aurel32
            tcg_temp_free(tmp);
2100 4c9649a9 j_mayer
        }
2101 4c9649a9 j_mayer
        ret = 2;
2102 4c9649a9 j_mayer
        break;
2103 4c9649a9 j_mayer
#endif
2104 4c9649a9 j_mayer
    case 0x1F:
2105 4c9649a9 j_mayer
        /* HW_ST (PALcode) */
2106 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2107 4c9649a9 j_mayer
        goto invalid_opc;
2108 4c9649a9 j_mayer
#else
2109 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2110 4c9649a9 j_mayer
            goto invalid_opc;
2111 8bb6e981 aurel32
        else {
2112 8bb6e981 aurel32
            TCGv addr, val;
2113 a7812ae4 pbrook
            addr = tcg_temp_new();
2114 8bb6e981 aurel32
            if (rb != 31)
2115 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
2116 8bb6e981 aurel32
            else
2117 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
2118 8bb6e981 aurel32
            if (ra != 31)
2119 8bb6e981 aurel32
                val = cpu_ir[ra];
2120 8bb6e981 aurel32
            else {
2121 a7812ae4 pbrook
                val = tcg_temp_new();
2122 8bb6e981 aurel32
                tcg_gen_movi_i64(val, 0);
2123 8bb6e981 aurel32
            }
2124 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
2125 8bb6e981 aurel32
            case 0x0:
2126 8bb6e981 aurel32
                /* Longword physical access */
2127 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2128 8bb6e981 aurel32
                break;
2129 8bb6e981 aurel32
            case 0x1:
2130 8bb6e981 aurel32
                /* Quadword physical access */
2131 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2132 8bb6e981 aurel32
                break;
2133 8bb6e981 aurel32
            case 0x2:
2134 8bb6e981 aurel32
                /* Longword physical access with lock */
2135 a7812ae4 pbrook
                gen_helper_stl_c_raw(val, val, addr);
2136 8bb6e981 aurel32
                break;
2137 8bb6e981 aurel32
            case 0x3:
2138 8bb6e981 aurel32
                /* Quadword physical access with lock */
2139 a7812ae4 pbrook
                gen_helper_stq_c_raw(val, val, addr);
2140 8bb6e981 aurel32
                break;
2141 8bb6e981 aurel32
            case 0x4:
2142 8bb6e981 aurel32
                /* Longword virtual access */
2143 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2144 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2145 8bb6e981 aurel32
                break;
2146 8bb6e981 aurel32
            case 0x5:
2147 8bb6e981 aurel32
                /* Quadword virtual access */
2148 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2149 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2150 8bb6e981 aurel32
                break;
2151 8bb6e981 aurel32
            case 0x6:
2152 8bb6e981 aurel32
                /* Invalid */
2153 8bb6e981 aurel32
                goto invalid_opc;
2154 8bb6e981 aurel32
            case 0x7:
2155 8bb6e981 aurel32
                /* Invalid */
2156 8bb6e981 aurel32
                goto invalid_opc;
2157 8bb6e981 aurel32
            case 0x8:
2158 8bb6e981 aurel32
                /* Invalid */
2159 8bb6e981 aurel32
                goto invalid_opc;
2160 8bb6e981 aurel32
            case 0x9:
2161 8bb6e981 aurel32
                /* Invalid */
2162 8bb6e981 aurel32
                goto invalid_opc;
2163 8bb6e981 aurel32
            case 0xA:
2164 8bb6e981 aurel32
                /* Invalid */
2165 8bb6e981 aurel32
                goto invalid_opc;
2166 8bb6e981 aurel32
            case 0xB:
2167 8bb6e981 aurel32
                /* Invalid */
2168 8bb6e981 aurel32
                goto invalid_opc;
2169 8bb6e981 aurel32
            case 0xC:
2170 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode */
2171 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2172 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2173 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2174 a7812ae4 pbrook
                gen_helper_restore_mode();
2175 8bb6e981 aurel32
                break;
2176 8bb6e981 aurel32
            case 0xD:
2177 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode */
2178 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2179 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2180 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2181 a7812ae4 pbrook
                gen_helper_restore_mode();
2182 8bb6e981 aurel32
                break;
2183 8bb6e981 aurel32
            case 0xE:
2184 8bb6e981 aurel32
                /* Invalid */
2185 8bb6e981 aurel32
                goto invalid_opc;
2186 8bb6e981 aurel32
            case 0xF:
2187 8bb6e981 aurel32
                /* Invalid */
2188 8bb6e981 aurel32
                goto invalid_opc;
2189 8bb6e981 aurel32
            }
2190 45d46ce8 aurel32
            if (ra == 31)
2191 8bb6e981 aurel32
                tcg_temp_free(val);
2192 8bb6e981 aurel32
            tcg_temp_free(addr);
2193 4c9649a9 j_mayer
        }
2194 4c9649a9 j_mayer
        break;
2195 4c9649a9 j_mayer
#endif
2196 4c9649a9 j_mayer
    case 0x20:
2197 4c9649a9 j_mayer
        /* LDF */
2198 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0);
2199 4c9649a9 j_mayer
        break;
2200 4c9649a9 j_mayer
    case 0x21:
2201 4c9649a9 j_mayer
        /* LDG */
2202 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0);
2203 4c9649a9 j_mayer
        break;
2204 4c9649a9 j_mayer
    case 0x22:
2205 4c9649a9 j_mayer
        /* LDS */
2206 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0);
2207 4c9649a9 j_mayer
        break;
2208 4c9649a9 j_mayer
    case 0x23:
2209 4c9649a9 j_mayer
        /* LDT */
2210 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0);
2211 4c9649a9 j_mayer
        break;
2212 4c9649a9 j_mayer
    case 0x24:
2213 4c9649a9 j_mayer
        /* STF */
2214 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0, 0);
2215 4c9649a9 j_mayer
        break;
2216 4c9649a9 j_mayer
    case 0x25:
2217 4c9649a9 j_mayer
        /* STG */
2218 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0, 0);
2219 4c9649a9 j_mayer
        break;
2220 4c9649a9 j_mayer
    case 0x26:
2221 4c9649a9 j_mayer
        /* STS */
2222 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0, 0);
2223 4c9649a9 j_mayer
        break;
2224 4c9649a9 j_mayer
    case 0x27:
2225 4c9649a9 j_mayer
        /* STT */
2226 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0, 0);
2227 4c9649a9 j_mayer
        break;
2228 4c9649a9 j_mayer
    case 0x28:
2229 4c9649a9 j_mayer
        /* LDL */
2230 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0, 0);
2231 4c9649a9 j_mayer
        break;
2232 4c9649a9 j_mayer
    case 0x29:
2233 4c9649a9 j_mayer
        /* LDQ */
2234 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 0);
2235 4c9649a9 j_mayer
        break;
2236 4c9649a9 j_mayer
    case 0x2A:
2237 4c9649a9 j_mayer
        /* LDL_L */
2238 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldl_l, ra, rb, disp16, 0, 0);
2239 4c9649a9 j_mayer
        break;
2240 4c9649a9 j_mayer
    case 0x2B:
2241 4c9649a9 j_mayer
        /* LDQ_L */
2242 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldq_l, ra, rb, disp16, 0, 0);
2243 4c9649a9 j_mayer
        break;
2244 4c9649a9 j_mayer
    case 0x2C:
2245 4c9649a9 j_mayer
        /* STL */
2246 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0, 0, 0);
2247 4c9649a9 j_mayer
        break;
2248 4c9649a9 j_mayer
    case 0x2D:
2249 4c9649a9 j_mayer
        /* STQ */
2250 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 0, 0);
2251 4c9649a9 j_mayer
        break;
2252 4c9649a9 j_mayer
    case 0x2E:
2253 4c9649a9 j_mayer
        /* STL_C */
2254 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stl_c, ra, rb, disp16, 0, 0, 1);
2255 4c9649a9 j_mayer
        break;
2256 4c9649a9 j_mayer
    case 0x2F:
2257 4c9649a9 j_mayer
        /* STQ_C */
2258 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stq_c, ra, rb, disp16, 0, 0, 1);
2259 4c9649a9 j_mayer
        break;
2260 4c9649a9 j_mayer
    case 0x30:
2261 4c9649a9 j_mayer
        /* BR */
2262 3761035f aurel32
        if (ra != 31)
2263 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2264 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2265 4c9649a9 j_mayer
        ret = 1;
2266 4c9649a9 j_mayer
        break;
2267 a7812ae4 pbrook
    case 0x31: /* FBEQ */
2268 a7812ae4 pbrook
    case 0x32: /* FBLT */
2269 a7812ae4 pbrook
    case 0x33: /* FBLE */
2270 a7812ae4 pbrook
        gen_fbcond(ctx, opc, ra, disp16);
2271 4c9649a9 j_mayer
        ret = 1;
2272 4c9649a9 j_mayer
        break;
2273 4c9649a9 j_mayer
    case 0x34:
2274 4c9649a9 j_mayer
        /* BSR */
2275 3761035f aurel32
        if (ra != 31)
2276 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2277 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2278 4c9649a9 j_mayer
        ret = 1;
2279 4c9649a9 j_mayer
        break;
2280 a7812ae4 pbrook
    case 0x35: /* FBNE */
2281 a7812ae4 pbrook
    case 0x36: /* FBGE */
2282 a7812ae4 pbrook
    case 0x37: /* FBGT */
2283 a7812ae4 pbrook
        gen_fbcond(ctx, opc, ra, disp16);
2284 4c9649a9 j_mayer
        ret = 1;
2285 4c9649a9 j_mayer
        break;
2286 4c9649a9 j_mayer
    case 0x38:
2287 4c9649a9 j_mayer
        /* BLBC */
2288 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 1);
2289 4c9649a9 j_mayer
        ret = 1;
2290 4c9649a9 j_mayer
        break;
2291 4c9649a9 j_mayer
    case 0x39:
2292 4c9649a9 j_mayer
        /* BEQ */
2293 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 0);
2294 4c9649a9 j_mayer
        ret = 1;
2295 4c9649a9 j_mayer
        break;
2296 4c9649a9 j_mayer
    case 0x3A:
2297 4c9649a9 j_mayer
        /* BLT */
2298 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LT, ra, disp21, 0);
2299 4c9649a9 j_mayer
        ret = 1;
2300 4c9649a9 j_mayer
        break;
2301 4c9649a9 j_mayer
    case 0x3B:
2302 4c9649a9 j_mayer
        /* BLE */
2303 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LE, ra, disp21, 0);
2304 4c9649a9 j_mayer
        ret = 1;
2305 4c9649a9 j_mayer
        break;
2306 4c9649a9 j_mayer
    case 0x3C:
2307 4c9649a9 j_mayer
        /* BLBS */
2308 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 1);
2309 4c9649a9 j_mayer
        ret = 1;
2310 4c9649a9 j_mayer
        break;
2311 4c9649a9 j_mayer
    case 0x3D:
2312 4c9649a9 j_mayer
        /* BNE */
2313 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 0);
2314 4c9649a9 j_mayer
        ret = 1;
2315 4c9649a9 j_mayer
        break;
2316 4c9649a9 j_mayer
    case 0x3E:
2317 4c9649a9 j_mayer
        /* BGE */
2318 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GE, ra, disp21, 0);
2319 4c9649a9 j_mayer
        ret = 1;
2320 4c9649a9 j_mayer
        break;
2321 4c9649a9 j_mayer
    case 0x3F:
2322 4c9649a9 j_mayer
        /* BGT */
2323 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GT, ra, disp21, 0);
2324 4c9649a9 j_mayer
        ret = 1;
2325 4c9649a9 j_mayer
        break;
2326 4c9649a9 j_mayer
    invalid_opc:
2327 4c9649a9 j_mayer
        gen_invalid(ctx);
2328 4c9649a9 j_mayer
        ret = 3;
2329 4c9649a9 j_mayer
        break;
2330 4c9649a9 j_mayer
    }
2331 4c9649a9 j_mayer
2332 4c9649a9 j_mayer
    return ret;
2333 4c9649a9 j_mayer
}
2334 4c9649a9 j_mayer
2335 2cfc5f17 ths
static always_inline void gen_intermediate_code_internal (CPUState *env,
2336 2cfc5f17 ths
                                                          TranslationBlock *tb,
2337 2cfc5f17 ths
                                                          int search_pc)
2338 4c9649a9 j_mayer
{
2339 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2340 4c9649a9 j_mayer
    static int insn_count;
2341 4c9649a9 j_mayer
#endif
2342 4c9649a9 j_mayer
    DisasContext ctx, *ctxp = &ctx;
2343 4c9649a9 j_mayer
    target_ulong pc_start;
2344 4c9649a9 j_mayer
    uint32_t insn;
2345 4c9649a9 j_mayer
    uint16_t *gen_opc_end;
2346 a1d1bb31 aliguori
    CPUBreakpoint *bp;
2347 4c9649a9 j_mayer
    int j, lj = -1;
2348 4c9649a9 j_mayer
    int ret;
2349 2e70f6ef pbrook
    int num_insns;
2350 2e70f6ef pbrook
    int max_insns;
2351 4c9649a9 j_mayer
2352 4c9649a9 j_mayer
    pc_start = tb->pc;
2353 4c9649a9 j_mayer
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2354 4c9649a9 j_mayer
    ctx.pc = pc_start;
2355 4c9649a9 j_mayer
    ctx.amask = env->amask;
2356 8579095b aurel32
    ctx.env = env;
2357 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2358 4c9649a9 j_mayer
    ctx.mem_idx = 0;
2359 4c9649a9 j_mayer
#else
2360 4c9649a9 j_mayer
    ctx.mem_idx = ((env->ps >> 3) & 3);
2361 4c9649a9 j_mayer
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2362 4c9649a9 j_mayer
#endif
2363 2e70f6ef pbrook
    num_insns = 0;
2364 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
2365 2e70f6ef pbrook
    if (max_insns == 0)
2366 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
2367 2e70f6ef pbrook
2368 2e70f6ef pbrook
    gen_icount_start();
2369 4c9649a9 j_mayer
    for (ret = 0; ret == 0;) {
2370 c0ce998e aliguori
        if (unlikely(!TAILQ_EMPTY(&env->breakpoints))) {
2371 c0ce998e aliguori
            TAILQ_FOREACH(bp, &env->breakpoints, entry) {
2372 a1d1bb31 aliguori
                if (bp->pc == ctx.pc) {
2373 4c9649a9 j_mayer
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2374 4c9649a9 j_mayer
                    break;
2375 4c9649a9 j_mayer
                }
2376 4c9649a9 j_mayer
            }
2377 4c9649a9 j_mayer
        }
2378 4c9649a9 j_mayer
        if (search_pc) {
2379 4c9649a9 j_mayer
            j = gen_opc_ptr - gen_opc_buf;
2380 4c9649a9 j_mayer
            if (lj < j) {
2381 4c9649a9 j_mayer
                lj++;
2382 4c9649a9 j_mayer
                while (lj < j)
2383 4c9649a9 j_mayer
                    gen_opc_instr_start[lj++] = 0;
2384 4c9649a9 j_mayer
            }
2385 ed1dda53 aurel32
            gen_opc_pc[lj] = ctx.pc;
2386 ed1dda53 aurel32
            gen_opc_instr_start[lj] = 1;
2387 ed1dda53 aurel32
            gen_opc_icount[lj] = num_insns;
2388 4c9649a9 j_mayer
        }
2389 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2390 2e70f6ef pbrook
            gen_io_start();
2391 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2392 4c9649a9 j_mayer
        insn_count++;
2393 d12d51d5 aliguori
        LOG_DISAS("pc " TARGET_FMT_lx " mem_idx %d\n",
2394 d12d51d5 aliguori
                  ctx.pc, ctx.mem_idx);
2395 4c9649a9 j_mayer
#endif
2396 4c9649a9 j_mayer
        insn = ldl_code(ctx.pc);
2397 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2398 4c9649a9 j_mayer
        insn_count++;
2399 d12d51d5 aliguori
        LOG_DISAS("opcode %08x %d\n", insn, insn_count);
2400 4c9649a9 j_mayer
#endif
2401 2e70f6ef pbrook
        num_insns++;
2402 4c9649a9 j_mayer
        ctx.pc += 4;
2403 4c9649a9 j_mayer
        ret = translate_one(ctxp, insn);
2404 4c9649a9 j_mayer
        if (ret != 0)
2405 4c9649a9 j_mayer
            break;
2406 4c9649a9 j_mayer
        /* if we reach a page boundary or are single stepping, stop
2407 4c9649a9 j_mayer
         * generation
2408 4c9649a9 j_mayer
         */
2409 19bf517b aurel32
        if (env->singlestep_enabled) {
2410 19bf517b aurel32
            gen_excp(&ctx, EXCP_DEBUG, 0);
2411 19bf517b aurel32
            break;
2412 1b530a6d aurel32
        }
2413 19bf517b aurel32
2414 8fcc55f9 aurel32
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
2415 8fcc55f9 aurel32
            break;
2416 8fcc55f9 aurel32
2417 8fcc55f9 aurel32
        if (gen_opc_ptr >= gen_opc_end)
2418 8fcc55f9 aurel32
            break;
2419 8fcc55f9 aurel32
2420 8fcc55f9 aurel32
        if (num_insns >= max_insns)
2421 8fcc55f9 aurel32
            break;
2422 8fcc55f9 aurel32
2423 1b530a6d aurel32
        if (singlestep) {
2424 1b530a6d aurel32
            break;
2425 1b530a6d aurel32
        }
2426 4c9649a9 j_mayer
    }
2427 4c9649a9 j_mayer
    if (ret != 1 && ret != 3) {
2428 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
2429 4c9649a9 j_mayer
    }
2430 4c9649a9 j_mayer
#if defined (DO_TB_FLUSH)
2431 a7812ae4 pbrook
    gen_helper_tb_flush();
2432 4c9649a9 j_mayer
#endif
2433 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
2434 2e70f6ef pbrook
        gen_io_end();
2435 4c9649a9 j_mayer
    /* Generate the return instruction */
2436 57fec1fe bellard
    tcg_gen_exit_tb(0);
2437 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
2438 4c9649a9 j_mayer
    *gen_opc_ptr = INDEX_op_end;
2439 4c9649a9 j_mayer
    if (search_pc) {
2440 4c9649a9 j_mayer
        j = gen_opc_ptr - gen_opc_buf;
2441 4c9649a9 j_mayer
        lj++;
2442 4c9649a9 j_mayer
        while (lj <= j)
2443 4c9649a9 j_mayer
            gen_opc_instr_start[lj++] = 0;
2444 4c9649a9 j_mayer
    } else {
2445 4c9649a9 j_mayer
        tb->size = ctx.pc - pc_start;
2446 2e70f6ef pbrook
        tb->icount = num_insns;
2447 4c9649a9 j_mayer
    }
2448 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2449 93fcfe39 aliguori
    log_cpu_state_mask(CPU_LOG_TB_CPU, env, 0);
2450 8fec2b8c aliguori
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
2451 93fcfe39 aliguori
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
2452 93fcfe39 aliguori
        log_target_disas(pc_start, ctx.pc - pc_start, 1);
2453 93fcfe39 aliguori
        qemu_log("\n");
2454 4c9649a9 j_mayer
    }
2455 4c9649a9 j_mayer
#endif
2456 4c9649a9 j_mayer
}
2457 4c9649a9 j_mayer
2458 2cfc5f17 ths
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2459 4c9649a9 j_mayer
{
2460 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 0);
2461 4c9649a9 j_mayer
}
2462 4c9649a9 j_mayer
2463 2cfc5f17 ths
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2464 4c9649a9 j_mayer
{
2465 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 1);
2466 4c9649a9 j_mayer
}
2467 4c9649a9 j_mayer
2468 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2469 4c9649a9 j_mayer
{
2470 4c9649a9 j_mayer
    CPUAlphaState *env;
2471 4c9649a9 j_mayer
    uint64_t hwpcb;
2472 4c9649a9 j_mayer
2473 4c9649a9 j_mayer
    env = qemu_mallocz(sizeof(CPUAlphaState));
2474 4c9649a9 j_mayer
    cpu_exec_init(env);
2475 2e70f6ef pbrook
    alpha_translate_init();
2476 4c9649a9 j_mayer
    tlb_flush(env, 1);
2477 4c9649a9 j_mayer
    /* XXX: should not be hardcoded */
2478 4c9649a9 j_mayer
    env->implver = IMPLVER_2106x;
2479 4c9649a9 j_mayer
    env->ps = 0x1F00;
2480 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2481 4c9649a9 j_mayer
    env->ps |= 1 << 3;
2482 4c9649a9 j_mayer
#endif
2483 4c9649a9 j_mayer
    pal_init(env);
2484 4c9649a9 j_mayer
    /* Initialize IPR */
2485 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
2486 4c9649a9 j_mayer
    env->ipr[IPR_ASN] = 0;
2487 4c9649a9 j_mayer
    env->ipr[IPR_ASTEN] = 0;
2488 4c9649a9 j_mayer
    env->ipr[IPR_ASTSR] = 0;
2489 4c9649a9 j_mayer
    env->ipr[IPR_DATFX] = 0;
2490 4c9649a9 j_mayer
    /* XXX: fix this */
2491 4c9649a9 j_mayer
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2492 4c9649a9 j_mayer
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2493 4c9649a9 j_mayer
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2494 4c9649a9 j_mayer
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2495 4c9649a9 j_mayer
    env->ipr[IPR_FEN] = 0;
2496 4c9649a9 j_mayer
    env->ipr[IPR_IPL] = 31;
2497 4c9649a9 j_mayer
    env->ipr[IPR_MCES] = 0;
2498 4c9649a9 j_mayer
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2499 4c9649a9 j_mayer
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2500 4c9649a9 j_mayer
    env->ipr[IPR_SISR] = 0;
2501 4c9649a9 j_mayer
    env->ipr[IPR_VIRBND] = -1ULL;
2502 4c9649a9 j_mayer
2503 4c9649a9 j_mayer
    return env;
2504 4c9649a9 j_mayer
}
2505 aaed909a bellard
2506 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2507 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
2508 d2856f1a aurel32
{
2509 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
2510 d2856f1a aurel32
}