Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ dfaa8583

History | View | Annotate | Download (72.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 4c9649a9 j_mayer
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 496cb5b9 aurel32
#include "helper.h"
30 57fec1fe bellard
#include "tcg-op.h"
31 ca10f867 aurel32
#include "qemu-common.h"
32 4c9649a9 j_mayer
33 4c9649a9 j_mayer
#define DO_SINGLE_STEP
34 4c9649a9 j_mayer
#define GENERATE_NOP
35 4c9649a9 j_mayer
#define ALPHA_DEBUG_DISAS
36 4c9649a9 j_mayer
#define DO_TB_FLUSH
37 4c9649a9 j_mayer
38 4c9649a9 j_mayer
typedef struct DisasContext DisasContext;
39 4c9649a9 j_mayer
struct DisasContext {
40 4c9649a9 j_mayer
    uint64_t pc;
41 4c9649a9 j_mayer
    int mem_idx;
42 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
43 4c9649a9 j_mayer
    int pal_mode;
44 4c9649a9 j_mayer
#endif
45 4c9649a9 j_mayer
    uint32_t amask;
46 4c9649a9 j_mayer
};
47 4c9649a9 j_mayer
48 3761035f aurel32
/* global register indexes */
49 b2437bf2 pbrook
static TCGv cpu_env;
50 496cb5b9 aurel32
static TCGv cpu_ir[31];
51 496cb5b9 aurel32
static TCGv cpu_pc;
52 496cb5b9 aurel32
53 3761035f aurel32
/* dyngen register indexes */
54 3761035f aurel32
static TCGv cpu_T[3];
55 3761035f aurel32
56 3761035f aurel32
/* register names */
57 6ba8dcd7 aurel32
static char cpu_reg_names[10*4+21*5];
58 2e70f6ef pbrook
59 2e70f6ef pbrook
#include "gen-icount.h"
60 2e70f6ef pbrook
61 a5f1b965 blueswir1
static void alpha_translate_init(void)
62 2e70f6ef pbrook
{
63 496cb5b9 aurel32
    int i;
64 496cb5b9 aurel32
    char *p;
65 2e70f6ef pbrook
    static int done_init = 0;
66 496cb5b9 aurel32
67 2e70f6ef pbrook
    if (done_init)
68 2e70f6ef pbrook
        return;
69 496cb5b9 aurel32
70 2e70f6ef pbrook
    cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
71 496cb5b9 aurel32
72 3761035f aurel32
#if TARGET_LONG_BITS > HOST_LONG_BITS
73 3761035f aurel32
    cpu_T[0] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
74 3761035f aurel32
                                  offsetof(CPUState, t0), "T0");
75 3761035f aurel32
    cpu_T[1] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
76 3761035f aurel32
                                  offsetof(CPUState, t1), "T1");
77 3761035f aurel32
    cpu_T[2] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
78 3761035f aurel32
                                  offsetof(CPUState, t2), "T2");
79 3761035f aurel32
#else
80 3761035f aurel32
    cpu_T[0] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG1, "T0");
81 3761035f aurel32
    cpu_T[1] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG2, "T1");
82 3761035f aurel32
    cpu_T[2] = tcg_global_reg_new(TCG_TYPE_I64, TCG_AREG3, "T2");
83 3761035f aurel32
#endif
84 3761035f aurel32
85 496cb5b9 aurel32
    p = cpu_reg_names;
86 496cb5b9 aurel32
    for (i = 0; i < 31; i++) {
87 496cb5b9 aurel32
        sprintf(p, "ir%d", i);
88 496cb5b9 aurel32
        cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
89 496cb5b9 aurel32
                                       offsetof(CPUState, ir[i]), p);
90 6ba8dcd7 aurel32
        p += (i < 10) ? 4 : 5;
91 496cb5b9 aurel32
    }
92 496cb5b9 aurel32
93 496cb5b9 aurel32
    cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
94 496cb5b9 aurel32
                                offsetof(CPUState, pc), "pc");
95 496cb5b9 aurel32
96 496cb5b9 aurel32
    /* register helpers */
97 496cb5b9 aurel32
#undef DEF_HELPER
98 496cb5b9 aurel32
#define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
99 496cb5b9 aurel32
#include "helper.h"
100 496cb5b9 aurel32
101 2e70f6ef pbrook
    done_init = 1;
102 2e70f6ef pbrook
}
103 2e70f6ef pbrook
104 f071b4d3 j_mayer
static always_inline void gen_op_nop (void)
105 4c9649a9 j_mayer
{
106 4c9649a9 j_mayer
#if defined(GENERATE_NOP)
107 4c9649a9 j_mayer
    gen_op_no_op();
108 4c9649a9 j_mayer
#endif
109 4c9649a9 j_mayer
}
110 4c9649a9 j_mayer
111 4c9649a9 j_mayer
#define GEN32(func, NAME) \
112 4c9649a9 j_mayer
static GenOpFunc *NAME ## _table [32] = {                                     \
113 4c9649a9 j_mayer
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
114 4c9649a9 j_mayer
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
115 4c9649a9 j_mayer
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
116 4c9649a9 j_mayer
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
117 4c9649a9 j_mayer
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
118 4c9649a9 j_mayer
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
119 4c9649a9 j_mayer
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
120 4c9649a9 j_mayer
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
121 4c9649a9 j_mayer
};                                                                            \
122 f071b4d3 j_mayer
static always_inline void func (int n)                                        \
123 4c9649a9 j_mayer
{                                                                             \
124 4c9649a9 j_mayer
    NAME ## _table[n]();                                                      \
125 4c9649a9 j_mayer
}
126 4c9649a9 j_mayer
127 4c9649a9 j_mayer
/* FIR moves */
128 4c9649a9 j_mayer
/* Special hacks for fir31 */
129 4c9649a9 j_mayer
#define gen_op_load_FT0_fir31 gen_op_reset_FT0
130 4c9649a9 j_mayer
#define gen_op_load_FT1_fir31 gen_op_reset_FT1
131 4c9649a9 j_mayer
#define gen_op_load_FT2_fir31 gen_op_reset_FT2
132 4c9649a9 j_mayer
#define gen_op_store_FT0_fir31 gen_op_nop
133 4c9649a9 j_mayer
#define gen_op_store_FT1_fir31 gen_op_nop
134 4c9649a9 j_mayer
#define gen_op_store_FT2_fir31 gen_op_nop
135 4c9649a9 j_mayer
#define gen_op_cmov_fir31 gen_op_nop
136 4c9649a9 j_mayer
GEN32(gen_op_load_FT0_fir, gen_op_load_FT0_fir);
137 4c9649a9 j_mayer
GEN32(gen_op_load_FT1_fir, gen_op_load_FT1_fir);
138 4c9649a9 j_mayer
GEN32(gen_op_load_FT2_fir, gen_op_load_FT2_fir);
139 4c9649a9 j_mayer
GEN32(gen_op_store_FT0_fir, gen_op_store_FT0_fir);
140 4c9649a9 j_mayer
GEN32(gen_op_store_FT1_fir, gen_op_store_FT1_fir);
141 4c9649a9 j_mayer
GEN32(gen_op_store_FT2_fir, gen_op_store_FT2_fir);
142 4c9649a9 j_mayer
GEN32(gen_op_cmov_fir, gen_op_cmov_fir);
143 4c9649a9 j_mayer
144 f071b4d3 j_mayer
static always_inline void gen_load_fir (DisasContext *ctx, int firn, int Tn)
145 4c9649a9 j_mayer
{
146 4c9649a9 j_mayer
    switch (Tn) {
147 4c9649a9 j_mayer
    case 0:
148 4c9649a9 j_mayer
        gen_op_load_FT0_fir(firn);
149 4c9649a9 j_mayer
        break;
150 4c9649a9 j_mayer
    case 1:
151 4c9649a9 j_mayer
        gen_op_load_FT1_fir(firn);
152 4c9649a9 j_mayer
        break;
153 4c9649a9 j_mayer
    case 2:
154 4c9649a9 j_mayer
        gen_op_load_FT2_fir(firn);
155 4c9649a9 j_mayer
        break;
156 4c9649a9 j_mayer
    }
157 4c9649a9 j_mayer
}
158 4c9649a9 j_mayer
159 f071b4d3 j_mayer
static always_inline void gen_store_fir (DisasContext *ctx, int firn, int Tn)
160 4c9649a9 j_mayer
{
161 4c9649a9 j_mayer
    switch (Tn) {
162 4c9649a9 j_mayer
    case 0:
163 4c9649a9 j_mayer
        gen_op_store_FT0_fir(firn);
164 4c9649a9 j_mayer
        break;
165 4c9649a9 j_mayer
    case 1:
166 4c9649a9 j_mayer
        gen_op_store_FT1_fir(firn);
167 4c9649a9 j_mayer
        break;
168 4c9649a9 j_mayer
    case 2:
169 4c9649a9 j_mayer
        gen_op_store_FT2_fir(firn);
170 4c9649a9 j_mayer
        break;
171 4c9649a9 j_mayer
    }
172 4c9649a9 j_mayer
}
173 4c9649a9 j_mayer
174 4c9649a9 j_mayer
/* Memory moves */
175 4c9649a9 j_mayer
#if defined(CONFIG_USER_ONLY)
176 4c9649a9 j_mayer
#define OP_LD_TABLE(width)                                                    \
177 4c9649a9 j_mayer
static GenOpFunc *gen_op_ld##width[] = {                                      \
178 4c9649a9 j_mayer
    &gen_op_ld##width##_raw,                                                  \
179 4c9649a9 j_mayer
}
180 4c9649a9 j_mayer
#define OP_ST_TABLE(width)                                                    \
181 4c9649a9 j_mayer
static GenOpFunc *gen_op_st##width[] = {                                      \
182 4c9649a9 j_mayer
    &gen_op_st##width##_raw,                                                  \
183 4c9649a9 j_mayer
}
184 4c9649a9 j_mayer
#else
185 4c9649a9 j_mayer
#define OP_LD_TABLE(width)                                                    \
186 4c9649a9 j_mayer
static GenOpFunc *gen_op_ld##width[] = {                                      \
187 4c9649a9 j_mayer
    &gen_op_ld##width##_kernel,                                               \
188 bb6f6792 j_mayer
    &gen_op_ld##width##_executive,                                            \
189 bb6f6792 j_mayer
    &gen_op_ld##width##_supervisor,                                           \
190 bb6f6792 j_mayer
    &gen_op_ld##width##_user,                                                 \
191 4c9649a9 j_mayer
}
192 4c9649a9 j_mayer
#define OP_ST_TABLE(width)                                                    \
193 4c9649a9 j_mayer
static GenOpFunc *gen_op_st##width[] = {                                      \
194 4c9649a9 j_mayer
    &gen_op_st##width##_kernel,                                               \
195 bb6f6792 j_mayer
    &gen_op_st##width##_executive,                                            \
196 bb6f6792 j_mayer
    &gen_op_st##width##_supervisor,                                           \
197 bb6f6792 j_mayer
    &gen_op_st##width##_user,                                                 \
198 4c9649a9 j_mayer
}
199 4c9649a9 j_mayer
#endif
200 4c9649a9 j_mayer
201 4c9649a9 j_mayer
#define GEN_LD(width)                                                         \
202 4c9649a9 j_mayer
OP_LD_TABLE(width);                                                           \
203 f071b4d3 j_mayer
static always_inline void gen_ld##width (DisasContext *ctx)                   \
204 4c9649a9 j_mayer
{                                                                             \
205 4c9649a9 j_mayer
    (*gen_op_ld##width[ctx->mem_idx])();                                      \
206 4c9649a9 j_mayer
}
207 4c9649a9 j_mayer
208 4c9649a9 j_mayer
#define GEN_ST(width)                                                         \
209 4c9649a9 j_mayer
OP_ST_TABLE(width);                                                           \
210 f071b4d3 j_mayer
static always_inline void gen_st##width (DisasContext *ctx)                   \
211 4c9649a9 j_mayer
{                                                                             \
212 4c9649a9 j_mayer
    (*gen_op_st##width[ctx->mem_idx])();                                      \
213 4c9649a9 j_mayer
}
214 4c9649a9 j_mayer
215 4c9649a9 j_mayer
GEN_LD(bu);
216 4c9649a9 j_mayer
GEN_ST(b);
217 4c9649a9 j_mayer
GEN_LD(wu);
218 4c9649a9 j_mayer
GEN_ST(w);
219 4c9649a9 j_mayer
GEN_LD(l);
220 4c9649a9 j_mayer
GEN_ST(l);
221 4c9649a9 j_mayer
GEN_LD(q);
222 4c9649a9 j_mayer
GEN_ST(q);
223 4c9649a9 j_mayer
GEN_LD(q_u);
224 4c9649a9 j_mayer
GEN_ST(q_u);
225 4c9649a9 j_mayer
GEN_LD(l_l);
226 4c9649a9 j_mayer
GEN_ST(l_c);
227 4c9649a9 j_mayer
GEN_LD(q_l);
228 4c9649a9 j_mayer
GEN_ST(q_c);
229 4c9649a9 j_mayer
230 08ab123c ths
#if 0 /* currently unused */
231 4c9649a9 j_mayer
GEN_LD(f);
232 4c9649a9 j_mayer
GEN_ST(f);
233 4c9649a9 j_mayer
GEN_LD(g);
234 4c9649a9 j_mayer
GEN_ST(g);
235 08ab123c ths
#endif /* 0 */
236 4c9649a9 j_mayer
GEN_LD(s);
237 4c9649a9 j_mayer
GEN_ST(s);
238 4c9649a9 j_mayer
GEN_LD(t);
239 4c9649a9 j_mayer
GEN_ST(t);
240 4c9649a9 j_mayer
241 f071b4d3 j_mayer
static always_inline void _gen_op_bcond (DisasContext *ctx)
242 4c9649a9 j_mayer
{
243 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
244 4c9649a9 j_mayer
    gen_op_bcond(ctx->pc);
245 4c9649a9 j_mayer
#else
246 4c9649a9 j_mayer
    gen_op_bcond(ctx->pc >> 32, ctx->pc);
247 4c9649a9 j_mayer
#endif
248 4c9649a9 j_mayer
}
249 4c9649a9 j_mayer
250 f071b4d3 j_mayer
static always_inline void gen_excp (DisasContext *ctx,
251 f071b4d3 j_mayer
                                    int exception, int error_code)
252 4c9649a9 j_mayer
{
253 6ad02592 aurel32
    TCGv tmp1, tmp2;
254 6ad02592 aurel32
255 496cb5b9 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
256 6ad02592 aurel32
    tmp1 = tcg_const_i32(exception);
257 6ad02592 aurel32
    tmp2 = tcg_const_i32(error_code);
258 6ad02592 aurel32
    tcg_gen_helper_0_2(helper_excp, tmp1, tmp2);
259 6ad02592 aurel32
    tcg_temp_free(tmp2);
260 6ad02592 aurel32
    tcg_temp_free(tmp1);
261 4c9649a9 j_mayer
}
262 4c9649a9 j_mayer
263 f071b4d3 j_mayer
static always_inline void gen_invalid (DisasContext *ctx)
264 4c9649a9 j_mayer
{
265 4c9649a9 j_mayer
    gen_excp(ctx, EXCP_OPCDEC, 0);
266 4c9649a9 j_mayer
}
267 4c9649a9 j_mayer
268 f071b4d3 j_mayer
static always_inline void gen_load_mem (DisasContext *ctx,
269 f071b4d3 j_mayer
                                        void (*gen_load_op)(DisasContext *ctx),
270 f071b4d3 j_mayer
                                        int ra, int rb, int32_t disp16,
271 f071b4d3 j_mayer
                                        int clear)
272 4c9649a9 j_mayer
{
273 4c9649a9 j_mayer
    if (ra == 31 && disp16 == 0) {
274 4c9649a9 j_mayer
        /* UNOP */
275 4c9649a9 j_mayer
        gen_op_nop();
276 4c9649a9 j_mayer
    } else {
277 3761035f aurel32
        if (rb != 31)
278 4f821e17 aurel32
            tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
279 3761035f aurel32
        else
280 4f821e17 aurel32
            tcg_gen_movi_i64(cpu_T[0], disp16);
281 4c9649a9 j_mayer
        if (clear)
282 4f821e17 aurel32
            tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7);
283 4c9649a9 j_mayer
        (*gen_load_op)(ctx);
284 3761035f aurel32
        if (ra != 31)
285 3761035f aurel32
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
286 4c9649a9 j_mayer
    }
287 4c9649a9 j_mayer
}
288 4c9649a9 j_mayer
289 f071b4d3 j_mayer
static always_inline void gen_store_mem (DisasContext *ctx,
290 f071b4d3 j_mayer
                                         void (*gen_store_op)(DisasContext *ctx),
291 f071b4d3 j_mayer
                                         int ra, int rb, int32_t disp16,
292 f071b4d3 j_mayer
                                         int clear)
293 4c9649a9 j_mayer
{
294 3761035f aurel32
    if (rb != 31)
295 4f821e17 aurel32
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
296 3761035f aurel32
    else
297 4f821e17 aurel32
        tcg_gen_movi_i64(cpu_T[0], disp16);
298 4c9649a9 j_mayer
    if (clear)
299 4f821e17 aurel32
        tcg_gen_andi_i64(cpu_T[0], cpu_T[0], ~0x7);
300 3761035f aurel32
    if (ra != 31)
301 3761035f aurel32
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
302 3761035f aurel32
    else
303 3761035f aurel32
        tcg_gen_movi_i64(cpu_T[1], 0);
304 4c9649a9 j_mayer
    (*gen_store_op)(ctx);
305 4c9649a9 j_mayer
}
306 4c9649a9 j_mayer
307 f071b4d3 j_mayer
static always_inline void gen_load_fmem (DisasContext *ctx,
308 f071b4d3 j_mayer
                                         void (*gen_load_fop)(DisasContext *ctx),
309 f071b4d3 j_mayer
                                         int ra, int rb, int32_t disp16)
310 4c9649a9 j_mayer
{
311 3761035f aurel32
    if (rb != 31)
312 4f821e17 aurel32
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
313 3761035f aurel32
    else
314 4f821e17 aurel32
        tcg_gen_movi_i64(cpu_T[0], disp16);
315 4c9649a9 j_mayer
    (*gen_load_fop)(ctx);
316 4c9649a9 j_mayer
    gen_store_fir(ctx, ra, 1);
317 4c9649a9 j_mayer
}
318 4c9649a9 j_mayer
319 f071b4d3 j_mayer
static always_inline void gen_store_fmem (DisasContext *ctx,
320 f071b4d3 j_mayer
                                          void (*gen_store_fop)(DisasContext *ctx),
321 f071b4d3 j_mayer
                                          int ra, int rb, int32_t disp16)
322 4c9649a9 j_mayer
{
323 3761035f aurel32
    if (rb != 31)
324 4f821e17 aurel32
        tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp16);
325 3761035f aurel32
    else
326 4f821e17 aurel32
        tcg_gen_movi_i64(cpu_T[0], disp16);
327 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 1);
328 4c9649a9 j_mayer
    (*gen_store_fop)(ctx);
329 4c9649a9 j_mayer
}
330 4c9649a9 j_mayer
331 f071b4d3 j_mayer
static always_inline void gen_bcond (DisasContext *ctx,
332 9c29504e aurel32
                                     TCGCond cond,
333 9c29504e aurel32
                                     int ra, int32_t disp16, int mask)
334 4c9649a9 j_mayer
{
335 9c29504e aurel32
    int l1, l2;
336 9c29504e aurel32
337 9c29504e aurel32
    l1 = gen_new_label();
338 9c29504e aurel32
    l2 = gen_new_label();
339 9c29504e aurel32
    if (likely(ra != 31)) {
340 9c29504e aurel32
        if (mask) {
341 9c29504e aurel32
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
342 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
343 9c29504e aurel32
            tcg_gen_brcondi_i64(cond, tmp, 0, l1);
344 9c29504e aurel32
            tcg_temp_free(tmp);
345 9c29504e aurel32
        } else
346 9c29504e aurel32
            tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, l1);
347 9c29504e aurel32
    } else {
348 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
349 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
350 9c29504e aurel32
        tcg_gen_brcondi_i64(cond, tmp, 0, l1);
351 9c29504e aurel32
        tcg_temp_free(tmp);
352 9c29504e aurel32
    }
353 9c29504e aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
354 9c29504e aurel32
    tcg_gen_br(l2);
355 9c29504e aurel32
    gen_set_label(l1);
356 9c29504e aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp16 << 2));
357 9c29504e aurel32
    gen_set_label(l2);
358 4c9649a9 j_mayer
}
359 4c9649a9 j_mayer
360 f071b4d3 j_mayer
static always_inline void gen_fbcond (DisasContext *ctx,
361 f071b4d3 j_mayer
                                      void (*gen_test_op)(void),
362 f071b4d3 j_mayer
                                      int ra, int32_t disp16)
363 4c9649a9 j_mayer
{
364 4f821e17 aurel32
    tcg_gen_movi_i64(cpu_T[1], ctx->pc + (int64_t)(disp16 << 2));
365 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
366 4c9649a9 j_mayer
    (*gen_test_op)();
367 4c9649a9 j_mayer
    _gen_op_bcond(ctx);
368 4c9649a9 j_mayer
}
369 4c9649a9 j_mayer
370 f071b4d3 j_mayer
static always_inline void gen_arith3 (DisasContext *ctx,
371 f071b4d3 j_mayer
                                      void (*gen_arith_op)(void),
372 f071b4d3 j_mayer
                                      int ra, int rb, int rc,
373 9e85e9bd aurel32
                                      int islit, uint8_t lit)
374 4c9649a9 j_mayer
{
375 3761035f aurel32
    if (ra != 31)
376 3761035f aurel32
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
377 3761035f aurel32
    else
378 3761035f aurel32
        tcg_gen_movi_i64(cpu_T[0], 0);
379 4c9649a9 j_mayer
    if (islit)
380 3761035f aurel32
        tcg_gen_movi_i64(cpu_T[1], lit);
381 4c9649a9 j_mayer
    else
382 dfaa8583 aurel32
        tcg_gen_mov_i64(cpu_T[1], cpu_ir[rb]);
383 4c9649a9 j_mayer
    (*gen_arith_op)();
384 3761035f aurel32
    if (rc != 31)
385 3761035f aurel32
        tcg_gen_mov_i64(cpu_ir[rc], cpu_T[0]);
386 4c9649a9 j_mayer
}
387 4c9649a9 j_mayer
388 f071b4d3 j_mayer
static always_inline void gen_cmov (DisasContext *ctx,
389 9c29504e aurel32
                                    TCGCond inv_cond,
390 f071b4d3 j_mayer
                                    int ra, int rb, int rc,
391 adf3c8b6 aurel32
                                    int islit, uint8_t lit, int mask)
392 4c9649a9 j_mayer
{
393 9c29504e aurel32
    int l1;
394 9c29504e aurel32
395 9c29504e aurel32
    if (unlikely(rc == 31))
396 9c29504e aurel32
        return;
397 9c29504e aurel32
398 9c29504e aurel32
    l1 = gen_new_label();
399 9c29504e aurel32
400 9c29504e aurel32
    if (ra != 31) {
401 9c29504e aurel32
        if (mask) {
402 9c29504e aurel32
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
403 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
404 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
405 9c29504e aurel32
            tcg_temp_free(tmp);
406 9c29504e aurel32
        } else
407 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
408 9c29504e aurel32
    } else {
409 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
410 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
411 9c29504e aurel32
        tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
412 9c29504e aurel32
        tcg_temp_free(tmp);
413 9c29504e aurel32
    }
414 9c29504e aurel32
415 4c9649a9 j_mayer
    if (islit)
416 9c29504e aurel32
        tcg_gen_movi_i64(cpu_ir[rc], lit);
417 4c9649a9 j_mayer
    else
418 dfaa8583 aurel32
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
419 9c29504e aurel32
    gen_set_label(l1);
420 4c9649a9 j_mayer
}
421 4c9649a9 j_mayer
422 f071b4d3 j_mayer
static always_inline void gen_farith2 (DisasContext *ctx,
423 f071b4d3 j_mayer
                                       void (*gen_arith_fop)(void),
424 f071b4d3 j_mayer
                                       int rb, int rc)
425 4c9649a9 j_mayer
{
426 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 0);
427 4c9649a9 j_mayer
    (*gen_arith_fop)();
428 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
429 4c9649a9 j_mayer
}
430 4c9649a9 j_mayer
431 f071b4d3 j_mayer
static always_inline void gen_farith3 (DisasContext *ctx,
432 f071b4d3 j_mayer
                                       void (*gen_arith_fop)(void),
433 f071b4d3 j_mayer
                                       int ra, int rb, int rc)
434 4c9649a9 j_mayer
{
435 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
436 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 1);
437 4c9649a9 j_mayer
    (*gen_arith_fop)();
438 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
439 4c9649a9 j_mayer
}
440 4c9649a9 j_mayer
441 f071b4d3 j_mayer
static always_inline void gen_fcmov (DisasContext *ctx,
442 f071b4d3 j_mayer
                                     void (*gen_test_fop)(void),
443 f071b4d3 j_mayer
                                     int ra, int rb, int rc)
444 4c9649a9 j_mayer
{
445 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
446 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 1);
447 4c9649a9 j_mayer
    (*gen_test_fop)();
448 4c9649a9 j_mayer
    gen_op_cmov_fir(rc);
449 4c9649a9 j_mayer
}
450 4c9649a9 j_mayer
451 f071b4d3 j_mayer
static always_inline void gen_fti (DisasContext *ctx,
452 f071b4d3 j_mayer
                                   void (*gen_move_fop)(void),
453 f071b4d3 j_mayer
                                   int ra, int rc)
454 4c9649a9 j_mayer
{
455 4c9649a9 j_mayer
    gen_load_fir(ctx, rc, 0);
456 4c9649a9 j_mayer
    (*gen_move_fop)();
457 3761035f aurel32
    if (ra != 31)
458 3761035f aurel32
        tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
459 4c9649a9 j_mayer
}
460 4c9649a9 j_mayer
461 f071b4d3 j_mayer
static always_inline void gen_itf (DisasContext *ctx,
462 f071b4d3 j_mayer
                                   void (*gen_move_fop)(void),
463 f071b4d3 j_mayer
                                   int ra, int rc)
464 4c9649a9 j_mayer
{
465 3761035f aurel32
    if (ra != 31)
466 3761035f aurel32
        tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
467 3761035f aurel32
    else
468 3761035f aurel32
        tcg_gen_movi_i64(cpu_T[0], 0);
469 4c9649a9 j_mayer
    (*gen_move_fop)();
470 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
471 4c9649a9 j_mayer
}
472 4c9649a9 j_mayer
473 b3249f63 aurel32
/* EXTWH, EXTWH, EXTLH, EXTQH */
474 b3249f63 aurel32
static always_inline void gen_ext_h(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
475 b3249f63 aurel32
                                    int ra, int rb, int rc,
476 adf3c8b6 aurel32
                                    int islit, uint8_t lit)
477 b3249f63 aurel32
{
478 b3249f63 aurel32
    if (unlikely(rc == 31))
479 b3249f63 aurel32
        return;
480 b3249f63 aurel32
481 b3249f63 aurel32
    if (ra != 31) {
482 dfaa8583 aurel32
        if (islit) {
483 dfaa8583 aurel32
            if (lit != 0)
484 dfaa8583 aurel32
                tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], 64 - ((lit & 7) * 8));
485 dfaa8583 aurel32
            else
486 dfaa8583 aurel32
                tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[ra]);
487 dfaa8583 aurel32
        } else {
488 b3249f63 aurel32
            TCGv tmp1, tmp2;
489 b3249f63 aurel32
            tmp1 = tcg_temp_new(TCG_TYPE_I64);
490 b3249f63 aurel32
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
491 b3249f63 aurel32
            tcg_gen_shli_i64(tmp1, tmp1, 3);
492 b3249f63 aurel32
            tmp2 = tcg_const_i64(64);
493 b3249f63 aurel32
            tcg_gen_sub_i64(tmp1, tmp2, tmp1);
494 b3249f63 aurel32
            tcg_temp_free(tmp2);
495 dfaa8583 aurel32
            tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
496 b3249f63 aurel32
            tcg_temp_free(tmp1);
497 dfaa8583 aurel32
        }
498 dfaa8583 aurel32
        if (tcg_gen_ext_i64)
499 dfaa8583 aurel32
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
500 b3249f63 aurel32
    } else
501 b3249f63 aurel32
        tcg_gen_movi_i64(cpu_ir[rc], 0);
502 b3249f63 aurel32
}
503 b3249f63 aurel32
504 b3249f63 aurel32
/* EXTBL, EXTWL, EXTWL, EXTLL, EXTQL */
505 b3249f63 aurel32
static always_inline void gen_ext_l(void (*tcg_gen_ext_i64)(TCGv t0, TCGv t1),
506 b3249f63 aurel32
                                    int ra, int rb, int rc,
507 adf3c8b6 aurel32
                                    int islit, uint8_t lit)
508 b3249f63 aurel32
{
509 b3249f63 aurel32
    if (unlikely(rc == 31))
510 b3249f63 aurel32
        return;
511 b3249f63 aurel32
512 b3249f63 aurel32
    if (ra != 31) {
513 dfaa8583 aurel32
        if (islit) {
514 dfaa8583 aurel32
                tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
515 dfaa8583 aurel32
        } else {
516 b3249f63 aurel32
            TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
517 b3249f63 aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
518 b3249f63 aurel32
            tcg_gen_shli_i64(tmp, tmp, 3);
519 dfaa8583 aurel32
            tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
520 b3249f63 aurel32
            tcg_temp_free(tmp);
521 dfaa8583 aurel32
        }
522 dfaa8583 aurel32
        if (tcg_gen_ext_i64)
523 dfaa8583 aurel32
            tcg_gen_ext_i64(cpu_ir[rc], cpu_ir[rc]);
524 b3249f63 aurel32
    } else
525 b3249f63 aurel32
        tcg_gen_movi_i64(cpu_ir[rc], 0);
526 b3249f63 aurel32
}
527 b3249f63 aurel32
528 b3249f63 aurel32
/* Code to call byte manipulation helpers, used by:
529 b3249f63 aurel32
   INSWH, INSLH, INSQH, INSBL, INSWL, INSLL, INSQL,
530 b3249f63 aurel32
   MSKWH, MSKLH, MSKQH, MSKBL, MSKWL, MSKLL, MSKQL,
531 b3249f63 aurel32
   ZAP, ZAPNOT
532 b3249f63 aurel32

533 b3249f63 aurel32
   WARNING: it assumes that when ra31 is used, the result is 0.
534 b3249f63 aurel32
*/
535 b3249f63 aurel32
static always_inline void gen_byte_manipulation(void *helper,
536 b3249f63 aurel32
                                                int ra, int rb, int rc,
537 b3249f63 aurel32
                                                int islit, uint8_t lit)
538 b3249f63 aurel32
{
539 b3249f63 aurel32
    if (unlikely(rc == 31))
540 b3249f63 aurel32
        return;
541 b3249f63 aurel32
542 b3249f63 aurel32
    if (ra != 31) {
543 dfaa8583 aurel32
        if (islit) {
544 dfaa8583 aurel32
            TCGv tmp = tcg_const_i64(lit);
545 b3249f63 aurel32
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], tmp);
546 b3249f63 aurel32
            tcg_temp_free(tmp);
547 b3249f63 aurel32
        } else
548 b3249f63 aurel32
            tcg_gen_helper_1_2(helper, cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
549 b3249f63 aurel32
    } else
550 b3249f63 aurel32
        tcg_gen_movi_i64(cpu_ir[rc], 0);
551 b3249f63 aurel32
}
552 b3249f63 aurel32
553 01ff9cc8 aurel32
static always_inline void gen_cmp(TCGCond cond,
554 01ff9cc8 aurel32
                                  int ra, int rb, int rc,
555 01ff9cc8 aurel32
                                  int islit, int8_t lit)
556 01ff9cc8 aurel32
{
557 01ff9cc8 aurel32
    int l1, l2;
558 01ff9cc8 aurel32
    TCGv tmp;
559 01ff9cc8 aurel32
560 01ff9cc8 aurel32
    if (unlikely(rc == 31))
561 01ff9cc8 aurel32
    return;
562 01ff9cc8 aurel32
563 01ff9cc8 aurel32
    l1 = gen_new_label();
564 01ff9cc8 aurel32
    l2 = gen_new_label();
565 01ff9cc8 aurel32
566 01ff9cc8 aurel32
    if (ra != 31) {
567 01ff9cc8 aurel32
        tmp = tcg_temp_new(TCG_TYPE_I64);
568 01ff9cc8 aurel32
        tcg_gen_mov_i64(tmp, cpu_ir[ra]);
569 01ff9cc8 aurel32
    } else
570 01ff9cc8 aurel32
        tmp = tcg_const_i64(0);
571 01ff9cc8 aurel32
    if (islit)
572 01ff9cc8 aurel32
        tcg_gen_brcondi_i64(cond, tmp, lit, l1);
573 01ff9cc8 aurel32
    else
574 dfaa8583 aurel32
        tcg_gen_brcond_i64(cond, tmp, cpu_ir[rb], l1);
575 01ff9cc8 aurel32
576 01ff9cc8 aurel32
    tcg_gen_movi_i64(cpu_ir[rc], 0);
577 01ff9cc8 aurel32
    tcg_gen_br(l2);
578 01ff9cc8 aurel32
    gen_set_label(l1);
579 01ff9cc8 aurel32
    tcg_gen_movi_i64(cpu_ir[rc], 1);
580 01ff9cc8 aurel32
    gen_set_label(l2);
581 01ff9cc8 aurel32
}
582 01ff9cc8 aurel32
583 f071b4d3 j_mayer
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
584 4c9649a9 j_mayer
{
585 4c9649a9 j_mayer
    uint32_t palcode;
586 4c9649a9 j_mayer
    int32_t disp21, disp16, disp12;
587 4c9649a9 j_mayer
    uint16_t fn11, fn16;
588 4c9649a9 j_mayer
    uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
589 adf3c8b6 aurel32
    uint8_t lit;
590 4c9649a9 j_mayer
    int ret;
591 4c9649a9 j_mayer
592 4c9649a9 j_mayer
    /* Decode all instruction fields */
593 4c9649a9 j_mayer
    opc = insn >> 26;
594 4c9649a9 j_mayer
    ra = (insn >> 21) & 0x1F;
595 4c9649a9 j_mayer
    rb = (insn >> 16) & 0x1F;
596 4c9649a9 j_mayer
    rc = insn & 0x1F;
597 4c9649a9 j_mayer
    sbz = (insn >> 13) & 0x07;
598 4c9649a9 j_mayer
    islit = (insn >> 12) & 1;
599 dfaa8583 aurel32
    if (rb == 31 && !islit) {
600 dfaa8583 aurel32
        islit = 1;
601 dfaa8583 aurel32
        lit = 0;
602 dfaa8583 aurel32
    } else
603 dfaa8583 aurel32
        lit = (insn >> 13) & 0xFF;
604 4c9649a9 j_mayer
    palcode = insn & 0x03FFFFFF;
605 4c9649a9 j_mayer
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
606 4c9649a9 j_mayer
    disp16 = (int16_t)(insn & 0x0000FFFF);
607 4c9649a9 j_mayer
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
608 4c9649a9 j_mayer
    fn16 = insn & 0x0000FFFF;
609 4c9649a9 j_mayer
    fn11 = (insn >> 5) & 0x000007FF;
610 4c9649a9 j_mayer
    fpfn = fn11 & 0x3F;
611 4c9649a9 j_mayer
    fn7 = (insn >> 5) & 0x0000007F;
612 4c9649a9 j_mayer
    fn2 = (insn >> 5) & 0x00000003;
613 4c9649a9 j_mayer
    ret = 0;
614 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
615 4c9649a9 j_mayer
    if (logfile != NULL) {
616 4c9649a9 j_mayer
        fprintf(logfile, "opc %02x ra %d rb %d rc %d disp16 %04x\n",
617 4c9649a9 j_mayer
                opc, ra, rb, rc, disp16);
618 4c9649a9 j_mayer
    }
619 4c9649a9 j_mayer
#endif
620 4c9649a9 j_mayer
    switch (opc) {
621 4c9649a9 j_mayer
    case 0x00:
622 4c9649a9 j_mayer
        /* CALL_PAL */
623 4c9649a9 j_mayer
        if (palcode >= 0x80 && palcode < 0xC0) {
624 4c9649a9 j_mayer
            /* Unprivileged PAL call */
625 4c9649a9 j_mayer
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x1F) << 6), 0);
626 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
627 4c9649a9 j_mayer
        } else if (palcode < 0x40) {
628 4c9649a9 j_mayer
            /* Privileged PAL code */
629 4c9649a9 j_mayer
            if (ctx->mem_idx & 1)
630 4c9649a9 j_mayer
                goto invalid_opc;
631 4c9649a9 j_mayer
            else
632 4c9649a9 j_mayer
                gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x1F) << 6), 0);
633 4c9649a9 j_mayer
#endif
634 4c9649a9 j_mayer
        } else {
635 4c9649a9 j_mayer
            /* Invalid PAL call */
636 4c9649a9 j_mayer
            goto invalid_opc;
637 4c9649a9 j_mayer
        }
638 4c9649a9 j_mayer
        ret = 3;
639 4c9649a9 j_mayer
        break;
640 4c9649a9 j_mayer
    case 0x01:
641 4c9649a9 j_mayer
        /* OPC01 */
642 4c9649a9 j_mayer
        goto invalid_opc;
643 4c9649a9 j_mayer
    case 0x02:
644 4c9649a9 j_mayer
        /* OPC02 */
645 4c9649a9 j_mayer
        goto invalid_opc;
646 4c9649a9 j_mayer
    case 0x03:
647 4c9649a9 j_mayer
        /* OPC03 */
648 4c9649a9 j_mayer
        goto invalid_opc;
649 4c9649a9 j_mayer
    case 0x04:
650 4c9649a9 j_mayer
        /* OPC04 */
651 4c9649a9 j_mayer
        goto invalid_opc;
652 4c9649a9 j_mayer
    case 0x05:
653 4c9649a9 j_mayer
        /* OPC05 */
654 4c9649a9 j_mayer
        goto invalid_opc;
655 4c9649a9 j_mayer
    case 0x06:
656 4c9649a9 j_mayer
        /* OPC06 */
657 4c9649a9 j_mayer
        goto invalid_opc;
658 4c9649a9 j_mayer
    case 0x07:
659 4c9649a9 j_mayer
        /* OPC07 */
660 4c9649a9 j_mayer
        goto invalid_opc;
661 4c9649a9 j_mayer
    case 0x08:
662 4c9649a9 j_mayer
        /* LDA */
663 1ef4ef4e aurel32
        if (likely(ra != 31)) {
664 496cb5b9 aurel32
            if (rb != 31)
665 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
666 3761035f aurel32
            else
667 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16);
668 496cb5b9 aurel32
        }
669 4c9649a9 j_mayer
        break;
670 4c9649a9 j_mayer
    case 0x09:
671 4c9649a9 j_mayer
        /* LDAH */
672 1ef4ef4e aurel32
        if (likely(ra != 31)) {
673 496cb5b9 aurel32
            if (rb != 31)
674 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
675 3761035f aurel32
            else
676 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
677 496cb5b9 aurel32
        }
678 4c9649a9 j_mayer
        break;
679 4c9649a9 j_mayer
    case 0x0A:
680 4c9649a9 j_mayer
        /* LDBU */
681 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
682 4c9649a9 j_mayer
            goto invalid_opc;
683 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldbu, ra, rb, disp16, 0);
684 4c9649a9 j_mayer
        break;
685 4c9649a9 j_mayer
    case 0x0B:
686 4c9649a9 j_mayer
        /* LDQ_U */
687 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq_u, ra, rb, disp16, 1);
688 4c9649a9 j_mayer
        break;
689 4c9649a9 j_mayer
    case 0x0C:
690 4c9649a9 j_mayer
        /* LDWU */
691 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
692 4c9649a9 j_mayer
            goto invalid_opc;
693 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldwu, ra, rb, disp16, 0);
694 4c9649a9 j_mayer
        break;
695 4c9649a9 j_mayer
    case 0x0D:
696 4c9649a9 j_mayer
        /* STW */
697 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
698 4c9649a9 j_mayer
            goto invalid_opc;
699 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stw, ra, rb, disp16, 0);
700 4c9649a9 j_mayer
        break;
701 4c9649a9 j_mayer
    case 0x0E:
702 4c9649a9 j_mayer
        /* STB */
703 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
704 4c9649a9 j_mayer
            goto invalid_opc;
705 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stb, ra, rb, disp16, 0);
706 4c9649a9 j_mayer
        break;
707 4c9649a9 j_mayer
    case 0x0F:
708 4c9649a9 j_mayer
        /* STQ_U */
709 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq_u, ra, rb, disp16, 1);
710 4c9649a9 j_mayer
        break;
711 4c9649a9 j_mayer
    case 0x10:
712 4c9649a9 j_mayer
        switch (fn7) {
713 4c9649a9 j_mayer
        case 0x00:
714 4c9649a9 j_mayer
            /* ADDL */
715 30c7183b aurel32
            if (likely(rc != 31)) {
716 30c7183b aurel32
                if (ra != 31) {
717 30c7183b aurel32
                    if (islit) {
718 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
719 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
720 dfaa8583 aurel32
                    } else {
721 30c7183b aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
722 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
723 dfaa8583 aurel32
                    }
724 30c7183b aurel32
                } else {
725 30c7183b aurel32
                    if (islit)
726 dfaa8583 aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
727 30c7183b aurel32
                    else
728 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
729 30c7183b aurel32
                }
730 30c7183b aurel32
            }
731 4c9649a9 j_mayer
            break;
732 4c9649a9 j_mayer
        case 0x02:
733 4c9649a9 j_mayer
            /* S4ADDL */
734 30c7183b aurel32
            if (likely(rc != 31)) {
735 30c7183b aurel32
                if (ra != 31) {
736 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
737 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
738 dfaa8583 aurel32
                    if (islit)
739 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
740 dfaa8583 aurel32
                    else
741 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
742 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
743 dfaa8583 aurel32
                    tcg_temp_free(tmp);
744 30c7183b aurel32
                } else {
745 30c7183b aurel32
                    if (islit)
746 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
747 30c7183b aurel32
                    else
748 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
749 30c7183b aurel32
                }
750 30c7183b aurel32
            }
751 4c9649a9 j_mayer
            break;
752 4c9649a9 j_mayer
        case 0x09:
753 4c9649a9 j_mayer
            /* SUBL */
754 30c7183b aurel32
            if (likely(rc != 31)) {
755 30c7183b aurel32
                if (ra != 31) {
756 dfaa8583 aurel32
                    if (islit)
757 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
758 dfaa8583 aurel32
                    else
759 30c7183b aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
760 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
761 30c7183b aurel32
                } else {
762 30c7183b aurel32
                    if (islit)
763 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
764 dfaa8583 aurel32
                    else {
765 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
766 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
767 30c7183b aurel32
                }
768 30c7183b aurel32
            }
769 4c9649a9 j_mayer
            break;
770 4c9649a9 j_mayer
        case 0x0B:
771 4c9649a9 j_mayer
            /* S4SUBL */
772 30c7183b aurel32
            if (likely(rc != 31)) {
773 30c7183b aurel32
                if (ra != 31) {
774 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
775 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
776 dfaa8583 aurel32
                    if (islit)
777 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
778 dfaa8583 aurel32
                    else
779 dfaa8583 aurel32
                        tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
780 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
781 dfaa8583 aurel32
                    tcg_temp_free(tmp);
782 30c7183b aurel32
                } else {
783 30c7183b aurel32
                    if (islit)
784 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
785 dfaa8583 aurel32
                    else {
786 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
787 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
788 dfaa8583 aurel32
                    }
789 30c7183b aurel32
                }
790 30c7183b aurel32
            }
791 4c9649a9 j_mayer
            break;
792 4c9649a9 j_mayer
        case 0x0F:
793 4c9649a9 j_mayer
            /* CMPBGE */
794 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmpbge, ra, rb, rc, islit, lit);
795 4c9649a9 j_mayer
            break;
796 4c9649a9 j_mayer
        case 0x12:
797 4c9649a9 j_mayer
            /* S8ADDL */
798 30c7183b aurel32
            if (likely(rc != 31)) {
799 30c7183b aurel32
                if (ra != 31) {
800 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
801 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
802 dfaa8583 aurel32
                    if (islit)
803 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
804 dfaa8583 aurel32
                    else
805 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
806 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
807 dfaa8583 aurel32
                    tcg_temp_free(tmp);
808 30c7183b aurel32
                } else {
809 30c7183b aurel32
                    if (islit)
810 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
811 30c7183b aurel32
                    else
812 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
813 30c7183b aurel32
                }
814 30c7183b aurel32
            }
815 4c9649a9 j_mayer
            break;
816 4c9649a9 j_mayer
        case 0x1B:
817 4c9649a9 j_mayer
            /* S8SUBL */
818 30c7183b aurel32
            if (likely(rc != 31)) {
819 30c7183b aurel32
                if (ra != 31) {
820 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
821 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
822 dfaa8583 aurel32
                    if (islit)
823 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
824 dfaa8583 aurel32
                    else
825 dfaa8583 aurel32
                       tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
826 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
827 dfaa8583 aurel32
                    tcg_temp_free(tmp);
828 30c7183b aurel32
                } else {
829 30c7183b aurel32
                    if (islit)
830 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
831 dfaa8583 aurel32
                    else
832 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
833 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
834 dfaa8583 aurel32
                    }
835 30c7183b aurel32
                }
836 30c7183b aurel32
            }
837 4c9649a9 j_mayer
            break;
838 4c9649a9 j_mayer
        case 0x1D:
839 4c9649a9 j_mayer
            /* CMPULT */
840 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LTU, ra, rb, rc, islit, lit);
841 4c9649a9 j_mayer
            break;
842 4c9649a9 j_mayer
        case 0x20:
843 4c9649a9 j_mayer
            /* ADDQ */
844 30c7183b aurel32
            if (likely(rc != 31)) {
845 30c7183b aurel32
                if (ra != 31) {
846 30c7183b aurel32
                    if (islit)
847 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
848 30c7183b aurel32
                    else
849 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
850 30c7183b aurel32
                } else {
851 30c7183b aurel32
                    if (islit)
852 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
853 30c7183b aurel32
                    else
854 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
855 30c7183b aurel32
                }
856 30c7183b aurel32
            }
857 4c9649a9 j_mayer
            break;
858 4c9649a9 j_mayer
        case 0x22:
859 4c9649a9 j_mayer
            /* S4ADDQ */
860 30c7183b aurel32
            if (likely(rc != 31)) {
861 30c7183b aurel32
                if (ra != 31) {
862 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
863 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
864 dfaa8583 aurel32
                    if (islit)
865 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
866 dfaa8583 aurel32
                    else
867 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
868 dfaa8583 aurel32
                    tcg_temp_free(tmp);
869 30c7183b aurel32
                } else {
870 30c7183b aurel32
                    if (islit)
871 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
872 30c7183b aurel32
                    else
873 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
874 30c7183b aurel32
                }
875 30c7183b aurel32
            }
876 4c9649a9 j_mayer
            break;
877 4c9649a9 j_mayer
        case 0x29:
878 4c9649a9 j_mayer
            /* SUBQ */
879 30c7183b aurel32
            if (likely(rc != 31)) {
880 30c7183b aurel32
                if (ra != 31) {
881 30c7183b aurel32
                    if (islit)
882 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
883 30c7183b aurel32
                    else
884 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
885 30c7183b aurel32
                } else {
886 30c7183b aurel32
                    if (islit)
887 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
888 30c7183b aurel32
                    else
889 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
890 30c7183b aurel32
                }
891 30c7183b aurel32
            }
892 4c9649a9 j_mayer
            break;
893 4c9649a9 j_mayer
        case 0x2B:
894 4c9649a9 j_mayer
            /* S4SUBQ */
895 30c7183b aurel32
            if (likely(rc != 31)) {
896 30c7183b aurel32
                if (ra != 31) {
897 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
898 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
899 dfaa8583 aurel32
                    if (islit)
900 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
901 dfaa8583 aurel32
                    else
902 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
903 dfaa8583 aurel32
                    tcg_temp_free(tmp);
904 30c7183b aurel32
                } else {
905 30c7183b aurel32
                    if (islit)
906 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
907 30c7183b aurel32
                    else
908 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
909 30c7183b aurel32
                }
910 30c7183b aurel32
            }
911 4c9649a9 j_mayer
            break;
912 4c9649a9 j_mayer
        case 0x2D:
913 4c9649a9 j_mayer
            /* CMPEQ */
914 01ff9cc8 aurel32
            gen_cmp(TCG_COND_EQ, ra, rb, rc, islit, lit);
915 4c9649a9 j_mayer
            break;
916 4c9649a9 j_mayer
        case 0x32:
917 4c9649a9 j_mayer
            /* S8ADDQ */
918 30c7183b aurel32
            if (likely(rc != 31)) {
919 30c7183b aurel32
                if (ra != 31) {
920 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
921 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
922 dfaa8583 aurel32
                    if (islit)
923 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
924 dfaa8583 aurel32
                    else
925 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
926 dfaa8583 aurel32
                    tcg_temp_free(tmp);
927 30c7183b aurel32
                } else {
928 30c7183b aurel32
                    if (islit)
929 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
930 30c7183b aurel32
                    else
931 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
932 30c7183b aurel32
                }
933 30c7183b aurel32
            }
934 4c9649a9 j_mayer
            break;
935 4c9649a9 j_mayer
        case 0x3B:
936 4c9649a9 j_mayer
            /* S8SUBQ */
937 30c7183b aurel32
            if (likely(rc != 31)) {
938 30c7183b aurel32
                if (ra != 31) {
939 dfaa8583 aurel32
                    TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
940 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
941 dfaa8583 aurel32
                    if (islit)
942 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
943 dfaa8583 aurel32
                    else
944 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
945 dfaa8583 aurel32
                    tcg_temp_free(tmp);
946 30c7183b aurel32
                } else {
947 30c7183b aurel32
                    if (islit)
948 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
949 30c7183b aurel32
                    else
950 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
951 30c7183b aurel32
                }
952 30c7183b aurel32
            }
953 4c9649a9 j_mayer
            break;
954 4c9649a9 j_mayer
        case 0x3D:
955 4c9649a9 j_mayer
            /* CMPULE */
956 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LEU, ra, rb, rc, islit, lit);
957 4c9649a9 j_mayer
            break;
958 4c9649a9 j_mayer
        case 0x40:
959 4c9649a9 j_mayer
            /* ADDL/V */
960 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addlv, ra, rb, rc, islit, lit);
961 4c9649a9 j_mayer
            break;
962 4c9649a9 j_mayer
        case 0x49:
963 4c9649a9 j_mayer
            /* SUBL/V */
964 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_sublv, ra, rb, rc, islit, lit);
965 4c9649a9 j_mayer
            break;
966 4c9649a9 j_mayer
        case 0x4D:
967 4c9649a9 j_mayer
            /* CMPLT */
968 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LT, ra, rb, rc, islit, lit);
969 4c9649a9 j_mayer
            break;
970 4c9649a9 j_mayer
        case 0x60:
971 4c9649a9 j_mayer
            /* ADDQ/V */
972 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addqv, ra, rb, rc, islit, lit);
973 4c9649a9 j_mayer
            break;
974 4c9649a9 j_mayer
        case 0x69:
975 4c9649a9 j_mayer
            /* SUBQ/V */
976 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_subqv, ra, rb, rc, islit, lit);
977 4c9649a9 j_mayer
            break;
978 4c9649a9 j_mayer
        case 0x6D:
979 4c9649a9 j_mayer
            /* CMPLE */
980 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LE, ra, rb, rc, islit, lit);
981 4c9649a9 j_mayer
            break;
982 4c9649a9 j_mayer
        default:
983 4c9649a9 j_mayer
            goto invalid_opc;
984 4c9649a9 j_mayer
        }
985 4c9649a9 j_mayer
        break;
986 4c9649a9 j_mayer
    case 0x11:
987 4c9649a9 j_mayer
        switch (fn7) {
988 4c9649a9 j_mayer
        case 0x00:
989 4c9649a9 j_mayer
            /* AND */
990 30c7183b aurel32
            if (likely(rc != 31)) {
991 dfaa8583 aurel32
                if (ra == 31)
992 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
993 30c7183b aurel32
                else if (islit)
994 30c7183b aurel32
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
995 30c7183b aurel32
                else
996 30c7183b aurel32
                    tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
997 30c7183b aurel32
            }
998 4c9649a9 j_mayer
            break;
999 4c9649a9 j_mayer
        case 0x08:
1000 4c9649a9 j_mayer
            /* BIC */
1001 30c7183b aurel32
            if (likely(rc != 31)) {
1002 30c7183b aurel32
                if (ra != 31) {
1003 30c7183b aurel32
                    if (islit)
1004 30c7183b aurel32
                        tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1005 dfaa8583 aurel32
                    else {
1006 30c7183b aurel32
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1007 30c7183b aurel32
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1008 30c7183b aurel32
                        tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1009 30c7183b aurel32
                        tcg_temp_free(tmp);
1010 dfaa8583 aurel32
                    }
1011 30c7183b aurel32
                } else
1012 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1013 30c7183b aurel32
            }
1014 4c9649a9 j_mayer
            break;
1015 4c9649a9 j_mayer
        case 0x14:
1016 4c9649a9 j_mayer
            /* CMOVLBS */
1017 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
1018 4c9649a9 j_mayer
            break;
1019 4c9649a9 j_mayer
        case 0x16:
1020 4c9649a9 j_mayer
            /* CMOVLBC */
1021 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 1);
1022 4c9649a9 j_mayer
            break;
1023 4c9649a9 j_mayer
        case 0x20:
1024 4c9649a9 j_mayer
            /* BIS */
1025 30c7183b aurel32
            if (likely(rc != 31)) {
1026 30c7183b aurel32
                if (ra != 31) {
1027 30c7183b aurel32
                    if (islit)
1028 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1029 dfaa8583 aurel32
                    else
1030 30c7183b aurel32
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1031 4c9649a9 j_mayer
                } else {
1032 30c7183b aurel32
                    if (islit)
1033 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1034 30c7183b aurel32
                    else
1035 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1036 4c9649a9 j_mayer
                }
1037 4c9649a9 j_mayer
            }
1038 4c9649a9 j_mayer
            break;
1039 4c9649a9 j_mayer
        case 0x24:
1040 4c9649a9 j_mayer
            /* CMOVEQ */
1041 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_NE, ra, rb, rc, islit, lit, 0);
1042 4c9649a9 j_mayer
            break;
1043 4c9649a9 j_mayer
        case 0x26:
1044 4c9649a9 j_mayer
            /* CMOVNE */
1045 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
1046 4c9649a9 j_mayer
            break;
1047 4c9649a9 j_mayer
        case 0x28:
1048 4c9649a9 j_mayer
            /* ORNOT */
1049 30c7183b aurel32
            if (likely(rc != 31)) {
1050 dfaa8583 aurel32
                if (ra != 31) {
1051 30c7183b aurel32
                    if (islit)
1052 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1053 30c7183b aurel32
                    else {
1054 30c7183b aurel32
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1055 30c7183b aurel32
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1056 30c7183b aurel32
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1057 30c7183b aurel32
                        tcg_temp_free(tmp);
1058 30c7183b aurel32
                    }
1059 30c7183b aurel32
                } else {
1060 30c7183b aurel32
                    if (islit)
1061 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1062 30c7183b aurel32
                    else
1063 30c7183b aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1064 30c7183b aurel32
                }
1065 30c7183b aurel32
            }
1066 4c9649a9 j_mayer
            break;
1067 4c9649a9 j_mayer
        case 0x40:
1068 4c9649a9 j_mayer
            /* XOR */
1069 30c7183b aurel32
            if (likely(rc != 31)) {
1070 30c7183b aurel32
                if (ra != 31) {
1071 30c7183b aurel32
                    if (islit)
1072 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1073 30c7183b aurel32
                    else
1074 dfaa8583 aurel32
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1075 30c7183b aurel32
                } else {
1076 30c7183b aurel32
                    if (islit)
1077 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1078 30c7183b aurel32
                    else
1079 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1080 30c7183b aurel32
                }
1081 30c7183b aurel32
            }
1082 4c9649a9 j_mayer
            break;
1083 4c9649a9 j_mayer
        case 0x44:
1084 4c9649a9 j_mayer
            /* CMOVLT */
1085 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1086 4c9649a9 j_mayer
            break;
1087 4c9649a9 j_mayer
        case 0x46:
1088 4c9649a9 j_mayer
            /* CMOVGE */
1089 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1090 4c9649a9 j_mayer
            break;
1091 4c9649a9 j_mayer
        case 0x48:
1092 4c9649a9 j_mayer
            /* EQV */
1093 30c7183b aurel32
            if (likely(rc != 31)) {
1094 30c7183b aurel32
                if (ra != 31) {
1095 30c7183b aurel32
                    if (islit)
1096 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1097 dfaa8583 aurel32
                    else {
1098 30c7183b aurel32
                        TCGv tmp = tcg_temp_new(TCG_TYPE_I64);
1099 30c7183b aurel32
                        tcg_gen_not_i64(tmp, cpu_ir[rb]);
1100 30c7183b aurel32
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1101 30c7183b aurel32
                        tcg_temp_free(tmp);
1102 dfaa8583 aurel32
                    }
1103 30c7183b aurel32
                } else {
1104 30c7183b aurel32
                    if (islit)
1105 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1106 30c7183b aurel32
                    else
1107 dfaa8583 aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1108 30c7183b aurel32
                }
1109 30c7183b aurel32
            }
1110 4c9649a9 j_mayer
            break;
1111 4c9649a9 j_mayer
        case 0x61:
1112 4c9649a9 j_mayer
            /* AMASK */
1113 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1114 ae8ecd42 aurel32
                if (islit)
1115 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], helper_amask(lit));
1116 ae8ecd42 aurel32
                else
1117 dfaa8583 aurel32
                    tcg_gen_helper_1_1(helper_amask, cpu_ir[rc], cpu_ir[rb]);
1118 ae8ecd42 aurel32
            }
1119 4c9649a9 j_mayer
            break;
1120 4c9649a9 j_mayer
        case 0x64:
1121 4c9649a9 j_mayer
            /* CMOVLE */
1122 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1123 4c9649a9 j_mayer
            break;
1124 4c9649a9 j_mayer
        case 0x66:
1125 4c9649a9 j_mayer
            /* CMOVGT */
1126 9c29504e aurel32
            gen_cmov(ctx, TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1127 4c9649a9 j_mayer
            break;
1128 4c9649a9 j_mayer
        case 0x6C:
1129 4c9649a9 j_mayer
            /* IMPLVER */
1130 3761035f aurel32
            if (rc != 31)
1131 6ad02592 aurel32
                tcg_gen_helper_1_0(helper_load_implver, cpu_ir[rc]);
1132 4c9649a9 j_mayer
            break;
1133 4c9649a9 j_mayer
        default:
1134 4c9649a9 j_mayer
            goto invalid_opc;
1135 4c9649a9 j_mayer
        }
1136 4c9649a9 j_mayer
        break;
1137 4c9649a9 j_mayer
    case 0x12:
1138 4c9649a9 j_mayer
        switch (fn7) {
1139 4c9649a9 j_mayer
        case 0x02:
1140 4c9649a9 j_mayer
            /* MSKBL */
1141 b3249f63 aurel32
            gen_byte_manipulation(helper_mskbl, ra, rb, rc, islit, lit);
1142 4c9649a9 j_mayer
            break;
1143 4c9649a9 j_mayer
        case 0x06:
1144 4c9649a9 j_mayer
            /* EXTBL */
1145 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext8u_i64, ra, rb, rc, islit, lit);
1146 4c9649a9 j_mayer
            break;
1147 4c9649a9 j_mayer
        case 0x0B:
1148 4c9649a9 j_mayer
            /* INSBL */
1149 b3249f63 aurel32
            gen_byte_manipulation(helper_insbl, ra, rb, rc, islit, lit);
1150 4c9649a9 j_mayer
            break;
1151 4c9649a9 j_mayer
        case 0x12:
1152 4c9649a9 j_mayer
            /* MSKWL */
1153 b3249f63 aurel32
            gen_byte_manipulation(helper_mskwl, ra, rb, rc, islit, lit);
1154 4c9649a9 j_mayer
            break;
1155 4c9649a9 j_mayer
        case 0x16:
1156 4c9649a9 j_mayer
            /* EXTWL */
1157 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1158 4c9649a9 j_mayer
            break;
1159 4c9649a9 j_mayer
        case 0x1B:
1160 4c9649a9 j_mayer
            /* INSWL */
1161 b3249f63 aurel32
            gen_byte_manipulation(helper_inswl, ra, rb, rc, islit, lit);
1162 4c9649a9 j_mayer
            break;
1163 4c9649a9 j_mayer
        case 0x22:
1164 4c9649a9 j_mayer
            /* MSKLL */
1165 b3249f63 aurel32
            gen_byte_manipulation(helper_mskll, ra, rb, rc, islit, lit);
1166 4c9649a9 j_mayer
            break;
1167 4c9649a9 j_mayer
        case 0x26:
1168 4c9649a9 j_mayer
            /* EXTLL */
1169 b3249f63 aurel32
            gen_ext_l(&tcg_gen_ext32u_i64, ra, rb, rc, islit, lit);
1170 4c9649a9 j_mayer
            break;
1171 4c9649a9 j_mayer
        case 0x2B:
1172 4c9649a9 j_mayer
            /* INSLL */
1173 b3249f63 aurel32
            gen_byte_manipulation(helper_insll, ra, rb, rc, islit, lit);
1174 4c9649a9 j_mayer
            break;
1175 4c9649a9 j_mayer
        case 0x30:
1176 4c9649a9 j_mayer
            /* ZAP */
1177 b3249f63 aurel32
            gen_byte_manipulation(helper_zap, ra, rb, rc, islit, lit);
1178 4c9649a9 j_mayer
            break;
1179 4c9649a9 j_mayer
        case 0x31:
1180 4c9649a9 j_mayer
            /* ZAPNOT */
1181 b3249f63 aurel32
            gen_byte_manipulation(helper_zapnot, ra, rb, rc, islit, lit);
1182 4c9649a9 j_mayer
            break;
1183 4c9649a9 j_mayer
        case 0x32:
1184 4c9649a9 j_mayer
            /* MSKQL */
1185 b3249f63 aurel32
            gen_byte_manipulation(helper_mskql, ra, rb, rc, islit, lit);
1186 4c9649a9 j_mayer
            break;
1187 4c9649a9 j_mayer
        case 0x34:
1188 4c9649a9 j_mayer
            /* SRL */
1189 30c7183b aurel32
            if (likely(rc != 31)) {
1190 30c7183b aurel32
                if (ra != 31) {
1191 30c7183b aurel32
                    if (islit)
1192 30c7183b aurel32
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1193 dfaa8583 aurel32
                    else {
1194 30c7183b aurel32
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1195 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1196 30c7183b aurel32
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1197 30c7183b aurel32
                        tcg_temp_free(shift);
1198 dfaa8583 aurel32
                    }
1199 30c7183b aurel32
                } else
1200 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1201 30c7183b aurel32
            }
1202 4c9649a9 j_mayer
            break;
1203 4c9649a9 j_mayer
        case 0x36:
1204 4c9649a9 j_mayer
            /* EXTQL */
1205 b3249f63 aurel32
            gen_ext_l(NULL, ra, rb, rc, islit, lit);
1206 4c9649a9 j_mayer
            break;
1207 4c9649a9 j_mayer
        case 0x39:
1208 4c9649a9 j_mayer
            /* SLL */
1209 30c7183b aurel32
            if (likely(rc != 31)) {
1210 30c7183b aurel32
                if (ra != 31) {
1211 30c7183b aurel32
                    if (islit)
1212 30c7183b aurel32
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1213 dfaa8583 aurel32
                    else {
1214 30c7183b aurel32
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1215 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1216 30c7183b aurel32
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1217 30c7183b aurel32
                        tcg_temp_free(shift);
1218 dfaa8583 aurel32
                    }
1219 30c7183b aurel32
                } else
1220 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1221 30c7183b aurel32
            }
1222 4c9649a9 j_mayer
            break;
1223 4c9649a9 j_mayer
        case 0x3B:
1224 4c9649a9 j_mayer
            /* INSQL */
1225 b3249f63 aurel32
            gen_byte_manipulation(helper_insql, ra, rb, rc, islit, lit);
1226 4c9649a9 j_mayer
            break;
1227 4c9649a9 j_mayer
        case 0x3C:
1228 4c9649a9 j_mayer
            /* SRA */
1229 30c7183b aurel32
            if (likely(rc != 31)) {
1230 30c7183b aurel32
                if (ra != 31) {
1231 30c7183b aurel32
                    if (islit)
1232 30c7183b aurel32
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1233 dfaa8583 aurel32
                    else {
1234 30c7183b aurel32
                        TCGv shift = tcg_temp_new(TCG_TYPE_I64);
1235 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1236 30c7183b aurel32
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1237 30c7183b aurel32
                        tcg_temp_free(shift);
1238 dfaa8583 aurel32
                    }
1239 30c7183b aurel32
                } else
1240 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1241 30c7183b aurel32
            }
1242 4c9649a9 j_mayer
            break;
1243 4c9649a9 j_mayer
        case 0x52:
1244 4c9649a9 j_mayer
            /* MSKWH */
1245 b3249f63 aurel32
            gen_byte_manipulation(helper_mskwh, ra, rb, rc, islit, lit);
1246 4c9649a9 j_mayer
            break;
1247 4c9649a9 j_mayer
        case 0x57:
1248 4c9649a9 j_mayer
            /* INSWH */
1249 b3249f63 aurel32
            gen_byte_manipulation(helper_inswh, ra, rb, rc, islit, lit);
1250 4c9649a9 j_mayer
            break;
1251 4c9649a9 j_mayer
        case 0x5A:
1252 4c9649a9 j_mayer
            /* EXTWH */
1253 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1254 4c9649a9 j_mayer
            break;
1255 4c9649a9 j_mayer
        case 0x62:
1256 4c9649a9 j_mayer
            /* MSKLH */
1257 b3249f63 aurel32
            gen_byte_manipulation(helper_msklh, ra, rb, rc, islit, lit);
1258 4c9649a9 j_mayer
            break;
1259 4c9649a9 j_mayer
        case 0x67:
1260 4c9649a9 j_mayer
            /* INSLH */
1261 b3249f63 aurel32
            gen_byte_manipulation(helper_inslh, ra, rb, rc, islit, lit);
1262 4c9649a9 j_mayer
            break;
1263 4c9649a9 j_mayer
        case 0x6A:
1264 4c9649a9 j_mayer
            /* EXTLH */
1265 b3249f63 aurel32
            gen_ext_h(&tcg_gen_ext16u_i64, ra, rb, rc, islit, lit);
1266 4c9649a9 j_mayer
            break;
1267 4c9649a9 j_mayer
        case 0x72:
1268 4c9649a9 j_mayer
            /* MSKQH */
1269 b3249f63 aurel32
            gen_byte_manipulation(helper_mskqh, ra, rb, rc, islit, lit);
1270 4c9649a9 j_mayer
            break;
1271 4c9649a9 j_mayer
        case 0x77:
1272 4c9649a9 j_mayer
            /* INSQH */
1273 b3249f63 aurel32
            gen_byte_manipulation(helper_insqh, ra, rb, rc, islit, lit);
1274 4c9649a9 j_mayer
            break;
1275 4c9649a9 j_mayer
        case 0x7A:
1276 4c9649a9 j_mayer
            /* EXTQH */
1277 b3249f63 aurel32
            gen_ext_h(NULL, ra, rb, rc, islit, lit);
1278 4c9649a9 j_mayer
            break;
1279 4c9649a9 j_mayer
        default:
1280 4c9649a9 j_mayer
            goto invalid_opc;
1281 4c9649a9 j_mayer
        }
1282 4c9649a9 j_mayer
        break;
1283 4c9649a9 j_mayer
    case 0x13:
1284 4c9649a9 j_mayer
        switch (fn7) {
1285 4c9649a9 j_mayer
        case 0x00:
1286 4c9649a9 j_mayer
            /* MULL */
1287 30c7183b aurel32
            if (likely(rc != 31)) {
1288 dfaa8583 aurel32
                if (ra == 31)
1289 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1290 30c7183b aurel32
                else {
1291 30c7183b aurel32
                    if (islit)
1292 30c7183b aurel32
                        tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1293 30c7183b aurel32
                    else
1294 30c7183b aurel32
                        tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1295 30c7183b aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1296 30c7183b aurel32
                }
1297 30c7183b aurel32
            }
1298 4c9649a9 j_mayer
            break;
1299 4c9649a9 j_mayer
        case 0x20:
1300 4c9649a9 j_mayer
            /* MULQ */
1301 30c7183b aurel32
            if (likely(rc != 31)) {
1302 dfaa8583 aurel32
                if (ra == 31)
1303 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1304 30c7183b aurel32
                else if (islit)
1305 30c7183b aurel32
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1306 30c7183b aurel32
                else
1307 30c7183b aurel32
                    tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1308 30c7183b aurel32
            }
1309 4c9649a9 j_mayer
            break;
1310 4c9649a9 j_mayer
        case 0x30:
1311 4c9649a9 j_mayer
            /* UMULH */
1312 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_umulh, ra, rb, rc, islit, lit);
1313 4c9649a9 j_mayer
            break;
1314 4c9649a9 j_mayer
        case 0x40:
1315 4c9649a9 j_mayer
            /* MULL/V */
1316 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mullv, ra, rb, rc, islit, lit);
1317 4c9649a9 j_mayer
            break;
1318 4c9649a9 j_mayer
        case 0x60:
1319 4c9649a9 j_mayer
            /* MULQ/V */
1320 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mulqv, ra, rb, rc, islit, lit);
1321 4c9649a9 j_mayer
            break;
1322 4c9649a9 j_mayer
        default:
1323 4c9649a9 j_mayer
            goto invalid_opc;
1324 4c9649a9 j_mayer
        }
1325 4c9649a9 j_mayer
        break;
1326 4c9649a9 j_mayer
    case 0x14:
1327 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1328 4c9649a9 j_mayer
        case 0x04:
1329 4c9649a9 j_mayer
            /* ITOFS */
1330 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1331 4c9649a9 j_mayer
                goto invalid_opc;
1332 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itofs, ra, rc);
1333 4c9649a9 j_mayer
            break;
1334 4c9649a9 j_mayer
        case 0x0A:
1335 4c9649a9 j_mayer
            /* SQRTF */
1336 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1337 4c9649a9 j_mayer
                goto invalid_opc;
1338 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtf, rb, rc);
1339 4c9649a9 j_mayer
            break;
1340 4c9649a9 j_mayer
        case 0x0B:
1341 4c9649a9 j_mayer
            /* SQRTS */
1342 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1343 4c9649a9 j_mayer
                goto invalid_opc;
1344 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrts, rb, rc);
1345 4c9649a9 j_mayer
            break;
1346 4c9649a9 j_mayer
        case 0x14:
1347 4c9649a9 j_mayer
            /* ITOFF */
1348 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1349 4c9649a9 j_mayer
                goto invalid_opc;
1350 4c9649a9 j_mayer
#if 0 // TODO
1351 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itoff, ra, rc);
1352 4c9649a9 j_mayer
#else
1353 4c9649a9 j_mayer
            goto invalid_opc;
1354 4c9649a9 j_mayer
#endif
1355 4c9649a9 j_mayer
            break;
1356 4c9649a9 j_mayer
        case 0x24:
1357 4c9649a9 j_mayer
            /* ITOFT */
1358 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1359 4c9649a9 j_mayer
                goto invalid_opc;
1360 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itoft, ra, rc);
1361 4c9649a9 j_mayer
            break;
1362 4c9649a9 j_mayer
        case 0x2A:
1363 4c9649a9 j_mayer
            /* SQRTG */
1364 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1365 4c9649a9 j_mayer
                goto invalid_opc;
1366 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtg, rb, rc);
1367 4c9649a9 j_mayer
            break;
1368 4c9649a9 j_mayer
        case 0x02B:
1369 4c9649a9 j_mayer
            /* SQRTT */
1370 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1371 4c9649a9 j_mayer
                goto invalid_opc;
1372 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtt, rb, rc);
1373 4c9649a9 j_mayer
            break;
1374 4c9649a9 j_mayer
        default:
1375 4c9649a9 j_mayer
            goto invalid_opc;
1376 4c9649a9 j_mayer
        }
1377 4c9649a9 j_mayer
        break;
1378 4c9649a9 j_mayer
    case 0x15:
1379 4c9649a9 j_mayer
        /* VAX floating point */
1380 4c9649a9 j_mayer
        /* XXX: rounding mode and trap are ignored (!) */
1381 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1382 4c9649a9 j_mayer
        case 0x00:
1383 4c9649a9 j_mayer
            /* ADDF */
1384 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addf, ra, rb, rc);
1385 4c9649a9 j_mayer
            break;
1386 4c9649a9 j_mayer
        case 0x01:
1387 4c9649a9 j_mayer
            /* SUBF */
1388 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subf, ra, rb, rc);
1389 4c9649a9 j_mayer
            break;
1390 4c9649a9 j_mayer
        case 0x02:
1391 4c9649a9 j_mayer
            /* MULF */
1392 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mulf, ra, rb, rc);
1393 4c9649a9 j_mayer
            break;
1394 4c9649a9 j_mayer
        case 0x03:
1395 4c9649a9 j_mayer
            /* DIVF */
1396 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divf, ra, rb, rc);
1397 4c9649a9 j_mayer
            break;
1398 4c9649a9 j_mayer
        case 0x1E:
1399 4c9649a9 j_mayer
            /* CVTDG */
1400 4c9649a9 j_mayer
#if 0 // TODO
1401 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtdg, rb, rc);
1402 4c9649a9 j_mayer
#else
1403 4c9649a9 j_mayer
            goto invalid_opc;
1404 4c9649a9 j_mayer
#endif
1405 4c9649a9 j_mayer
            break;
1406 4c9649a9 j_mayer
        case 0x20:
1407 4c9649a9 j_mayer
            /* ADDG */
1408 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addg, ra, rb, rc);
1409 4c9649a9 j_mayer
            break;
1410 4c9649a9 j_mayer
        case 0x21:
1411 4c9649a9 j_mayer
            /* SUBG */
1412 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subg, ra, rb, rc);
1413 4c9649a9 j_mayer
            break;
1414 4c9649a9 j_mayer
        case 0x22:
1415 4c9649a9 j_mayer
            /* MULG */
1416 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mulg, ra, rb, rc);
1417 4c9649a9 j_mayer
            break;
1418 4c9649a9 j_mayer
        case 0x23:
1419 4c9649a9 j_mayer
            /* DIVG */
1420 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divg, ra, rb, rc);
1421 4c9649a9 j_mayer
            break;
1422 4c9649a9 j_mayer
        case 0x25:
1423 4c9649a9 j_mayer
            /* CMPGEQ */
1424 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpgeq, ra, rb, rc);
1425 4c9649a9 j_mayer
            break;
1426 4c9649a9 j_mayer
        case 0x26:
1427 4c9649a9 j_mayer
            /* CMPGLT */
1428 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpglt, ra, rb, rc);
1429 4c9649a9 j_mayer
            break;
1430 4c9649a9 j_mayer
        case 0x27:
1431 4c9649a9 j_mayer
            /* CMPGLE */
1432 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpgle, ra, rb, rc);
1433 4c9649a9 j_mayer
            break;
1434 4c9649a9 j_mayer
        case 0x2C:
1435 4c9649a9 j_mayer
            /* CVTGF */
1436 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgf, rb, rc);
1437 4c9649a9 j_mayer
            break;
1438 4c9649a9 j_mayer
        case 0x2D:
1439 4c9649a9 j_mayer
            /* CVTGD */
1440 4c9649a9 j_mayer
#if 0 // TODO
1441 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgd, rb, rc);
1442 4c9649a9 j_mayer
#else
1443 4c9649a9 j_mayer
            goto invalid_opc;
1444 4c9649a9 j_mayer
#endif
1445 4c9649a9 j_mayer
            break;
1446 4c9649a9 j_mayer
        case 0x2F:
1447 4c9649a9 j_mayer
            /* CVTGQ */
1448 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgq, rb, rc);
1449 4c9649a9 j_mayer
            break;
1450 4c9649a9 j_mayer
        case 0x3C:
1451 4c9649a9 j_mayer
            /* CVTQF */
1452 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqf, rb, rc);
1453 4c9649a9 j_mayer
            break;
1454 4c9649a9 j_mayer
        case 0x3E:
1455 4c9649a9 j_mayer
            /* CVTQG */
1456 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqg, rb, rc);
1457 4c9649a9 j_mayer
            break;
1458 4c9649a9 j_mayer
        default:
1459 4c9649a9 j_mayer
            goto invalid_opc;
1460 4c9649a9 j_mayer
        }
1461 4c9649a9 j_mayer
        break;
1462 4c9649a9 j_mayer
    case 0x16:
1463 4c9649a9 j_mayer
        /* IEEE floating-point */
1464 4c9649a9 j_mayer
        /* XXX: rounding mode and traps are ignored (!) */
1465 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1466 4c9649a9 j_mayer
        case 0x00:
1467 4c9649a9 j_mayer
            /* ADDS */
1468 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_adds, ra, rb, rc);
1469 4c9649a9 j_mayer
            break;
1470 4c9649a9 j_mayer
        case 0x01:
1471 4c9649a9 j_mayer
            /* SUBS */
1472 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subs, ra, rb, rc);
1473 4c9649a9 j_mayer
            break;
1474 4c9649a9 j_mayer
        case 0x02:
1475 4c9649a9 j_mayer
            /* MULS */
1476 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_muls, ra, rb, rc);
1477 4c9649a9 j_mayer
            break;
1478 4c9649a9 j_mayer
        case 0x03:
1479 4c9649a9 j_mayer
            /* DIVS */
1480 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divs, ra, rb, rc);
1481 4c9649a9 j_mayer
            break;
1482 4c9649a9 j_mayer
        case 0x20:
1483 4c9649a9 j_mayer
            /* ADDT */
1484 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addt, ra, rb, rc);
1485 4c9649a9 j_mayer
            break;
1486 4c9649a9 j_mayer
        case 0x21:
1487 4c9649a9 j_mayer
            /* SUBT */
1488 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subt, ra, rb, rc);
1489 4c9649a9 j_mayer
            break;
1490 4c9649a9 j_mayer
        case 0x22:
1491 4c9649a9 j_mayer
            /* MULT */
1492 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mult, ra, rb, rc);
1493 4c9649a9 j_mayer
            break;
1494 4c9649a9 j_mayer
        case 0x23:
1495 4c9649a9 j_mayer
            /* DIVT */
1496 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divt, ra, rb, rc);
1497 4c9649a9 j_mayer
            break;
1498 4c9649a9 j_mayer
        case 0x24:
1499 4c9649a9 j_mayer
            /* CMPTUN */
1500 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptun, ra, rb, rc);
1501 4c9649a9 j_mayer
            break;
1502 4c9649a9 j_mayer
        case 0x25:
1503 4c9649a9 j_mayer
            /* CMPTEQ */
1504 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpteq, ra, rb, rc);
1505 4c9649a9 j_mayer
            break;
1506 4c9649a9 j_mayer
        case 0x26:
1507 4c9649a9 j_mayer
            /* CMPTLT */
1508 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptlt, ra, rb, rc);
1509 4c9649a9 j_mayer
            break;
1510 4c9649a9 j_mayer
        case 0x27:
1511 4c9649a9 j_mayer
            /* CMPTLE */
1512 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptle, ra, rb, rc);
1513 4c9649a9 j_mayer
            break;
1514 4c9649a9 j_mayer
        case 0x2C:
1515 4c9649a9 j_mayer
            /* XXX: incorrect */
1516 4c9649a9 j_mayer
            if (fn11 == 0x2AC) {
1517 4c9649a9 j_mayer
                /* CVTST */
1518 4c9649a9 j_mayer
                gen_farith2(ctx, &gen_op_cvtst, rb, rc);
1519 4c9649a9 j_mayer
            } else {
1520 4c9649a9 j_mayer
                /* CVTTS */
1521 4c9649a9 j_mayer
                gen_farith2(ctx, &gen_op_cvtts, rb, rc);
1522 4c9649a9 j_mayer
            }
1523 4c9649a9 j_mayer
            break;
1524 4c9649a9 j_mayer
        case 0x2F:
1525 4c9649a9 j_mayer
            /* CVTTQ */
1526 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvttq, rb, rc);
1527 4c9649a9 j_mayer
            break;
1528 4c9649a9 j_mayer
        case 0x3C:
1529 4c9649a9 j_mayer
            /* CVTQS */
1530 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqs, rb, rc);
1531 4c9649a9 j_mayer
            break;
1532 4c9649a9 j_mayer
        case 0x3E:
1533 4c9649a9 j_mayer
            /* CVTQT */
1534 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqt, rb, rc);
1535 4c9649a9 j_mayer
            break;
1536 4c9649a9 j_mayer
        default:
1537 4c9649a9 j_mayer
            goto invalid_opc;
1538 4c9649a9 j_mayer
        }
1539 4c9649a9 j_mayer
        break;
1540 4c9649a9 j_mayer
    case 0x17:
1541 4c9649a9 j_mayer
        switch (fn11) {
1542 4c9649a9 j_mayer
        case 0x010:
1543 4c9649a9 j_mayer
            /* CVTLQ */
1544 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtlq, rb, rc);
1545 4c9649a9 j_mayer
            break;
1546 4c9649a9 j_mayer
        case 0x020:
1547 4c9649a9 j_mayer
            /* CPYS */
1548 4c9649a9 j_mayer
            if (ra == rb) {
1549 4c9649a9 j_mayer
                if (ra == 31 && rc == 31) {
1550 4c9649a9 j_mayer
                    /* FNOP */
1551 4c9649a9 j_mayer
                    gen_op_nop();
1552 4c9649a9 j_mayer
                } else {
1553 4c9649a9 j_mayer
                    /* FMOV */
1554 4c9649a9 j_mayer
                    gen_load_fir(ctx, rb, 0);
1555 4c9649a9 j_mayer
                    gen_store_fir(ctx, rc, 0);
1556 4c9649a9 j_mayer
                }
1557 4c9649a9 j_mayer
            } else {
1558 4c9649a9 j_mayer
                gen_farith3(ctx, &gen_op_cpys, ra, rb, rc);
1559 4c9649a9 j_mayer
            }
1560 4c9649a9 j_mayer
            break;
1561 4c9649a9 j_mayer
        case 0x021:
1562 4c9649a9 j_mayer
            /* CPYSN */
1563 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cpysn, rb, rc);
1564 4c9649a9 j_mayer
            break;
1565 4c9649a9 j_mayer
        case 0x022:
1566 4c9649a9 j_mayer
            /* CPYSE */
1567 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cpyse, rb, rc);
1568 4c9649a9 j_mayer
            break;
1569 4c9649a9 j_mayer
        case 0x024:
1570 4c9649a9 j_mayer
            /* MT_FPCR */
1571 4c9649a9 j_mayer
            gen_load_fir(ctx, ra, 0);
1572 4c9649a9 j_mayer
            gen_op_store_fpcr();
1573 4c9649a9 j_mayer
            break;
1574 4c9649a9 j_mayer
        case 0x025:
1575 4c9649a9 j_mayer
            /* MF_FPCR */
1576 4c9649a9 j_mayer
            gen_op_load_fpcr();
1577 4c9649a9 j_mayer
            gen_store_fir(ctx, ra, 0);
1578 4c9649a9 j_mayer
            break;
1579 4c9649a9 j_mayer
        case 0x02A:
1580 4c9649a9 j_mayer
            /* FCMOVEQ */
1581 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfeq, ra, rb, rc);
1582 4c9649a9 j_mayer
            break;
1583 4c9649a9 j_mayer
        case 0x02B:
1584 4c9649a9 j_mayer
            /* FCMOVNE */
1585 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfne, ra, rb, rc);
1586 4c9649a9 j_mayer
            break;
1587 4c9649a9 j_mayer
        case 0x02C:
1588 4c9649a9 j_mayer
            /* FCMOVLT */
1589 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpflt, ra, rb, rc);
1590 4c9649a9 j_mayer
            break;
1591 4c9649a9 j_mayer
        case 0x02D:
1592 4c9649a9 j_mayer
            /* FCMOVGE */
1593 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfge, ra, rb, rc);
1594 4c9649a9 j_mayer
            break;
1595 4c9649a9 j_mayer
        case 0x02E:
1596 4c9649a9 j_mayer
            /* FCMOVLE */
1597 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfle, ra, rb, rc);
1598 4c9649a9 j_mayer
            break;
1599 4c9649a9 j_mayer
        case 0x02F:
1600 4c9649a9 j_mayer
            /* FCMOVGT */
1601 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfgt, ra, rb, rc);
1602 4c9649a9 j_mayer
            break;
1603 4c9649a9 j_mayer
        case 0x030:
1604 4c9649a9 j_mayer
            /* CVTQL */
1605 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtql, rb, rc);
1606 4c9649a9 j_mayer
            break;
1607 4c9649a9 j_mayer
        case 0x130:
1608 4c9649a9 j_mayer
            /* CVTQL/V */
1609 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqlv, rb, rc);
1610 4c9649a9 j_mayer
            break;
1611 4c9649a9 j_mayer
        case 0x530:
1612 4c9649a9 j_mayer
            /* CVTQL/SV */
1613 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqlsv, rb, rc);
1614 4c9649a9 j_mayer
            break;
1615 4c9649a9 j_mayer
        default:
1616 4c9649a9 j_mayer
            goto invalid_opc;
1617 4c9649a9 j_mayer
        }
1618 4c9649a9 j_mayer
        break;
1619 4c9649a9 j_mayer
    case 0x18:
1620 4c9649a9 j_mayer
        switch ((uint16_t)disp16) {
1621 4c9649a9 j_mayer
        case 0x0000:
1622 4c9649a9 j_mayer
            /* TRAPB */
1623 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1624 4c9649a9 j_mayer
            ret = 2;
1625 4c9649a9 j_mayer
            break;
1626 4c9649a9 j_mayer
        case 0x0400:
1627 4c9649a9 j_mayer
            /* EXCB */
1628 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1629 4c9649a9 j_mayer
            ret = 2;
1630 4c9649a9 j_mayer
            break;
1631 4c9649a9 j_mayer
        case 0x4000:
1632 4c9649a9 j_mayer
            /* MB */
1633 4c9649a9 j_mayer
            /* No-op */
1634 4c9649a9 j_mayer
            break;
1635 4c9649a9 j_mayer
        case 0x4400:
1636 4c9649a9 j_mayer
            /* WMB */
1637 4c9649a9 j_mayer
            /* No-op */
1638 4c9649a9 j_mayer
            break;
1639 4c9649a9 j_mayer
        case 0x8000:
1640 4c9649a9 j_mayer
            /* FETCH */
1641 4c9649a9 j_mayer
            /* No-op */
1642 4c9649a9 j_mayer
            break;
1643 4c9649a9 j_mayer
        case 0xA000:
1644 4c9649a9 j_mayer
            /* FETCH_M */
1645 4c9649a9 j_mayer
            /* No-op */
1646 4c9649a9 j_mayer
            break;
1647 4c9649a9 j_mayer
        case 0xC000:
1648 4c9649a9 j_mayer
            /* RPCC */
1649 3761035f aurel32
            if (ra != 31)
1650 6ad02592 aurel32
                tcg_gen_helper_1_0(helper_load_pcc, cpu_ir[ra]);
1651 4c9649a9 j_mayer
            break;
1652 4c9649a9 j_mayer
        case 0xE000:
1653 4c9649a9 j_mayer
            /* RC */
1654 3761035f aurel32
            if (ra != 31)
1655 6ad02592 aurel32
                tcg_gen_helper_1_0(helper_rc, cpu_ir[ra]);
1656 4c9649a9 j_mayer
            break;
1657 4c9649a9 j_mayer
        case 0xE800:
1658 4c9649a9 j_mayer
            /* ECB */
1659 4c9649a9 j_mayer
            /* XXX: TODO: evict tb cache at address rb */
1660 4c9649a9 j_mayer
#if 0
1661 4c9649a9 j_mayer
            ret = 2;
1662 4c9649a9 j_mayer
#else
1663 4c9649a9 j_mayer
            goto invalid_opc;
1664 4c9649a9 j_mayer
#endif
1665 4c9649a9 j_mayer
            break;
1666 4c9649a9 j_mayer
        case 0xF000:
1667 4c9649a9 j_mayer
            /* RS */
1668 3761035f aurel32
            if (ra != 31)
1669 6ad02592 aurel32
                tcg_gen_helper_1_0(helper_rs, cpu_ir[ra]);
1670 4c9649a9 j_mayer
            break;
1671 4c9649a9 j_mayer
        case 0xF800:
1672 4c9649a9 j_mayer
            /* WH64 */
1673 4c9649a9 j_mayer
            /* No-op */
1674 4c9649a9 j_mayer
            break;
1675 4c9649a9 j_mayer
        default:
1676 4c9649a9 j_mayer
            goto invalid_opc;
1677 4c9649a9 j_mayer
        }
1678 4c9649a9 j_mayer
        break;
1679 4c9649a9 j_mayer
    case 0x19:
1680 4c9649a9 j_mayer
        /* HW_MFPR (PALcode) */
1681 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1682 4c9649a9 j_mayer
        goto invalid_opc;
1683 4c9649a9 j_mayer
#else
1684 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1685 4c9649a9 j_mayer
            goto invalid_opc;
1686 4c9649a9 j_mayer
        gen_op_mfpr(insn & 0xFF);
1687 3761035f aurel32
        if (ra != 31)
1688 3761035f aurel32
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[0]);
1689 4c9649a9 j_mayer
        break;
1690 4c9649a9 j_mayer
#endif
1691 4c9649a9 j_mayer
    case 0x1A:
1692 3761035f aurel32
        if (ra != 31)
1693 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
1694 3761035f aurel32
        if (rb != 31)
1695 3761035f aurel32
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
1696 3761035f aurel32
        else
1697 3761035f aurel32
            tcg_gen_movi_i64(cpu_pc, 0);
1698 4c9649a9 j_mayer
        /* Those four jumps only differ by the branch prediction hint */
1699 4c9649a9 j_mayer
        switch (fn2) {
1700 4c9649a9 j_mayer
        case 0x0:
1701 4c9649a9 j_mayer
            /* JMP */
1702 4c9649a9 j_mayer
            break;
1703 4c9649a9 j_mayer
        case 0x1:
1704 4c9649a9 j_mayer
            /* JSR */
1705 4c9649a9 j_mayer
            break;
1706 4c9649a9 j_mayer
        case 0x2:
1707 4c9649a9 j_mayer
            /* RET */
1708 4c9649a9 j_mayer
            break;
1709 4c9649a9 j_mayer
        case 0x3:
1710 4c9649a9 j_mayer
            /* JSR_COROUTINE */
1711 4c9649a9 j_mayer
            break;
1712 4c9649a9 j_mayer
        }
1713 4c9649a9 j_mayer
        ret = 1;
1714 4c9649a9 j_mayer
        break;
1715 4c9649a9 j_mayer
    case 0x1B:
1716 4c9649a9 j_mayer
        /* HW_LD (PALcode) */
1717 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1718 4c9649a9 j_mayer
        goto invalid_opc;
1719 4c9649a9 j_mayer
#else
1720 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1721 4c9649a9 j_mayer
            goto invalid_opc;
1722 3761035f aurel32
        if (rb != 31)
1723 3761035f aurel32
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
1724 3761035f aurel32
        else
1725 3761035f aurel32
            tcg_gen_movi_i64(cpu_T[0], 0);
1726 3761035f aurel32
        tcg_gen_movi_i64(cpu_T[1], disp12);
1727 4f821e17 aurel32
        tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
1728 4c9649a9 j_mayer
        switch ((insn >> 12) & 0xF) {
1729 4c9649a9 j_mayer
        case 0x0:
1730 4c9649a9 j_mayer
            /* Longword physical access */
1731 4c9649a9 j_mayer
            gen_op_ldl_raw();
1732 4c9649a9 j_mayer
            break;
1733 4c9649a9 j_mayer
        case 0x1:
1734 4c9649a9 j_mayer
            /* Quadword physical access */
1735 4c9649a9 j_mayer
            gen_op_ldq_raw();
1736 4c9649a9 j_mayer
            break;
1737 4c9649a9 j_mayer
        case 0x2:
1738 4c9649a9 j_mayer
            /* Longword physical access with lock */
1739 4c9649a9 j_mayer
            gen_op_ldl_l_raw();
1740 4c9649a9 j_mayer
            break;
1741 4c9649a9 j_mayer
        case 0x3:
1742 4c9649a9 j_mayer
            /* Quadword physical access with lock */
1743 4c9649a9 j_mayer
            gen_op_ldq_l_raw();
1744 4c9649a9 j_mayer
            break;
1745 4c9649a9 j_mayer
        case 0x4:
1746 4c9649a9 j_mayer
            /* Longword virtual PTE fetch */
1747 4c9649a9 j_mayer
            gen_op_ldl_kernel();
1748 4c9649a9 j_mayer
            break;
1749 4c9649a9 j_mayer
        case 0x5:
1750 4c9649a9 j_mayer
            /* Quadword virtual PTE fetch */
1751 4c9649a9 j_mayer
            gen_op_ldq_kernel();
1752 4c9649a9 j_mayer
            break;
1753 4c9649a9 j_mayer
        case 0x6:
1754 4c9649a9 j_mayer
            /* Invalid */
1755 4c9649a9 j_mayer
            goto invalid_opc;
1756 4c9649a9 j_mayer
        case 0x7:
1757 4c9649a9 j_mayer
            /* Invalid */
1758 4c9649a9 j_mayer
            goto invalid_opc;
1759 4c9649a9 j_mayer
        case 0x8:
1760 4c9649a9 j_mayer
            /* Longword virtual access */
1761 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1762 4c9649a9 j_mayer
            gen_op_ldl_raw();
1763 4c9649a9 j_mayer
            break;
1764 4c9649a9 j_mayer
        case 0x9:
1765 4c9649a9 j_mayer
            /* Quadword virtual access */
1766 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1767 4c9649a9 j_mayer
            gen_op_ldq_raw();
1768 4c9649a9 j_mayer
            break;
1769 4c9649a9 j_mayer
        case 0xA:
1770 4c9649a9 j_mayer
            /* Longword virtual access with protection check */
1771 4c9649a9 j_mayer
            gen_ldl(ctx);
1772 4c9649a9 j_mayer
            break;
1773 4c9649a9 j_mayer
        case 0xB:
1774 4c9649a9 j_mayer
            /* Quadword virtual access with protection check */
1775 4c9649a9 j_mayer
            gen_ldq(ctx);
1776 4c9649a9 j_mayer
            break;
1777 4c9649a9 j_mayer
        case 0xC:
1778 4c9649a9 j_mayer
            /* Longword virtual access with altenate access mode */
1779 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1780 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1781 4c9649a9 j_mayer
            gen_op_ldl_raw();
1782 4c9649a9 j_mayer
            gen_op_restore_mode();
1783 4c9649a9 j_mayer
            break;
1784 4c9649a9 j_mayer
        case 0xD:
1785 4c9649a9 j_mayer
            /* Quadword virtual access with altenate access mode */
1786 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1787 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1788 4c9649a9 j_mayer
            gen_op_ldq_raw();
1789 4c9649a9 j_mayer
            gen_op_restore_mode();
1790 4c9649a9 j_mayer
            break;
1791 4c9649a9 j_mayer
        case 0xE:
1792 4c9649a9 j_mayer
            /* Longword virtual access with alternate access mode and
1793 4c9649a9 j_mayer
             * protection checks
1794 4c9649a9 j_mayer
             */
1795 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1796 4c9649a9 j_mayer
            gen_op_ldl_data();
1797 4c9649a9 j_mayer
            gen_op_restore_mode();
1798 4c9649a9 j_mayer
            break;
1799 4c9649a9 j_mayer
        case 0xF:
1800 4c9649a9 j_mayer
            /* Quadword virtual access with alternate access mode and
1801 4c9649a9 j_mayer
             * protection checks
1802 4c9649a9 j_mayer
             */
1803 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1804 4c9649a9 j_mayer
            gen_op_ldq_data();
1805 4c9649a9 j_mayer
            gen_op_restore_mode();
1806 4c9649a9 j_mayer
            break;
1807 4c9649a9 j_mayer
        }
1808 3761035f aurel32
        if (ra != 31)
1809 3761035f aurel32
            tcg_gen_mov_i64(cpu_ir[ra], cpu_T[1]);
1810 4c9649a9 j_mayer
        break;
1811 4c9649a9 j_mayer
#endif
1812 4c9649a9 j_mayer
    case 0x1C:
1813 4c9649a9 j_mayer
        switch (fn7) {
1814 4c9649a9 j_mayer
        case 0x00:
1815 4c9649a9 j_mayer
            /* SEXTB */
1816 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1817 4c9649a9 j_mayer
                goto invalid_opc;
1818 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1819 ae8ecd42 aurel32
                if (islit)
1820 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
1821 ae8ecd42 aurel32
                else
1822 dfaa8583 aurel32
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
1823 ae8ecd42 aurel32
            }
1824 4c9649a9 j_mayer
            break;
1825 4c9649a9 j_mayer
        case 0x01:
1826 4c9649a9 j_mayer
            /* SEXTW */
1827 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1828 4c9649a9 j_mayer
                goto invalid_opc;
1829 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1830 ae8ecd42 aurel32
                if (islit)
1831 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
1832 ae8ecd42 aurel32
                else
1833 dfaa8583 aurel32
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
1834 ae8ecd42 aurel32
            }
1835 4c9649a9 j_mayer
            break;
1836 4c9649a9 j_mayer
        case 0x30:
1837 4c9649a9 j_mayer
            /* CTPOP */
1838 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1839 4c9649a9 j_mayer
                goto invalid_opc;
1840 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1841 ae8ecd42 aurel32
                if (islit)
1842 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
1843 ae8ecd42 aurel32
                else
1844 dfaa8583 aurel32
                    tcg_gen_helper_1_1(helper_ctpop, cpu_ir[rc], cpu_ir[rb]);
1845 ae8ecd42 aurel32
            }
1846 4c9649a9 j_mayer
            break;
1847 4c9649a9 j_mayer
        case 0x31:
1848 4c9649a9 j_mayer
            /* PERR */
1849 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1850 4c9649a9 j_mayer
                goto invalid_opc;
1851 4c9649a9 j_mayer
            /* XXX: TODO */
1852 4c9649a9 j_mayer
            goto invalid_opc;
1853 4c9649a9 j_mayer
            break;
1854 4c9649a9 j_mayer
        case 0x32:
1855 4c9649a9 j_mayer
            /* CTLZ */
1856 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1857 4c9649a9 j_mayer
                goto invalid_opc;
1858 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1859 ae8ecd42 aurel32
                if (islit)
1860 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
1861 ae8ecd42 aurel32
                else
1862 dfaa8583 aurel32
                    tcg_gen_helper_1_1(helper_ctlz, cpu_ir[rc], cpu_ir[rb]);
1863 ae8ecd42 aurel32
            }
1864 4c9649a9 j_mayer
            break;
1865 4c9649a9 j_mayer
        case 0x33:
1866 4c9649a9 j_mayer
            /* CTTZ */
1867 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1868 4c9649a9 j_mayer
                goto invalid_opc;
1869 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1870 ae8ecd42 aurel32
                if (islit)
1871 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
1872 ae8ecd42 aurel32
                else
1873 dfaa8583 aurel32
                    tcg_gen_helper_1_1(helper_cttz, cpu_ir[rc], cpu_ir[rb]);
1874 ae8ecd42 aurel32
            }
1875 4c9649a9 j_mayer
            break;
1876 4c9649a9 j_mayer
        case 0x34:
1877 4c9649a9 j_mayer
            /* UNPKBW */
1878 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1879 4c9649a9 j_mayer
                goto invalid_opc;
1880 4c9649a9 j_mayer
            /* XXX: TODO */
1881 4c9649a9 j_mayer
            goto invalid_opc;
1882 4c9649a9 j_mayer
            break;
1883 4c9649a9 j_mayer
        case 0x35:
1884 4c9649a9 j_mayer
            /* UNPKWL */
1885 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1886 4c9649a9 j_mayer
                goto invalid_opc;
1887 4c9649a9 j_mayer
            /* XXX: TODO */
1888 4c9649a9 j_mayer
            goto invalid_opc;
1889 4c9649a9 j_mayer
            break;
1890 4c9649a9 j_mayer
        case 0x36:
1891 4c9649a9 j_mayer
            /* PKWB */
1892 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1893 4c9649a9 j_mayer
                goto invalid_opc;
1894 4c9649a9 j_mayer
            /* XXX: TODO */
1895 4c9649a9 j_mayer
            goto invalid_opc;
1896 4c9649a9 j_mayer
            break;
1897 4c9649a9 j_mayer
        case 0x37:
1898 4c9649a9 j_mayer
            /* PKLB */
1899 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1900 4c9649a9 j_mayer
                goto invalid_opc;
1901 4c9649a9 j_mayer
            /* XXX: TODO */
1902 4c9649a9 j_mayer
            goto invalid_opc;
1903 4c9649a9 j_mayer
            break;
1904 4c9649a9 j_mayer
        case 0x38:
1905 4c9649a9 j_mayer
            /* MINSB8 */
1906 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1907 4c9649a9 j_mayer
                goto invalid_opc;
1908 4c9649a9 j_mayer
            /* XXX: TODO */
1909 4c9649a9 j_mayer
            goto invalid_opc;
1910 4c9649a9 j_mayer
            break;
1911 4c9649a9 j_mayer
        case 0x39:
1912 4c9649a9 j_mayer
            /* MINSW4 */
1913 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1914 4c9649a9 j_mayer
                goto invalid_opc;
1915 4c9649a9 j_mayer
            /* XXX: TODO */
1916 4c9649a9 j_mayer
            goto invalid_opc;
1917 4c9649a9 j_mayer
            break;
1918 4c9649a9 j_mayer
        case 0x3A:
1919 4c9649a9 j_mayer
            /* MINUB8 */
1920 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1921 4c9649a9 j_mayer
                goto invalid_opc;
1922 4c9649a9 j_mayer
            /* XXX: TODO */
1923 4c9649a9 j_mayer
            goto invalid_opc;
1924 4c9649a9 j_mayer
            break;
1925 4c9649a9 j_mayer
        case 0x3B:
1926 4c9649a9 j_mayer
            /* MINUW4 */
1927 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1928 4c9649a9 j_mayer
                goto invalid_opc;
1929 4c9649a9 j_mayer
            /* XXX: TODO */
1930 4c9649a9 j_mayer
            goto invalid_opc;
1931 4c9649a9 j_mayer
            break;
1932 4c9649a9 j_mayer
        case 0x3C:
1933 4c9649a9 j_mayer
            /* MAXUB8 */
1934 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1935 4c9649a9 j_mayer
                goto invalid_opc;
1936 4c9649a9 j_mayer
            /* XXX: TODO */
1937 4c9649a9 j_mayer
            goto invalid_opc;
1938 4c9649a9 j_mayer
            break;
1939 4c9649a9 j_mayer
        case 0x3D:
1940 4c9649a9 j_mayer
            /* MAXUW4 */
1941 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1942 4c9649a9 j_mayer
                goto invalid_opc;
1943 4c9649a9 j_mayer
            /* XXX: TODO */
1944 4c9649a9 j_mayer
            goto invalid_opc;
1945 4c9649a9 j_mayer
            break;
1946 4c9649a9 j_mayer
        case 0x3E:
1947 4c9649a9 j_mayer
            /* MAXSB8 */
1948 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1949 4c9649a9 j_mayer
                goto invalid_opc;
1950 4c9649a9 j_mayer
            /* XXX: TODO */
1951 4c9649a9 j_mayer
            goto invalid_opc;
1952 4c9649a9 j_mayer
            break;
1953 4c9649a9 j_mayer
        case 0x3F:
1954 4c9649a9 j_mayer
            /* MAXSW4 */
1955 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1956 4c9649a9 j_mayer
                goto invalid_opc;
1957 4c9649a9 j_mayer
            /* XXX: TODO */
1958 4c9649a9 j_mayer
            goto invalid_opc;
1959 4c9649a9 j_mayer
            break;
1960 4c9649a9 j_mayer
        case 0x70:
1961 4c9649a9 j_mayer
            /* FTOIT */
1962 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1963 4c9649a9 j_mayer
                goto invalid_opc;
1964 4c9649a9 j_mayer
            gen_fti(ctx, &gen_op_ftoit, ra, rb);
1965 4c9649a9 j_mayer
            break;
1966 4c9649a9 j_mayer
        case 0x78:
1967 4c9649a9 j_mayer
            /* FTOIS */
1968 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1969 4c9649a9 j_mayer
                goto invalid_opc;
1970 4c9649a9 j_mayer
            gen_fti(ctx, &gen_op_ftois, ra, rb);
1971 4c9649a9 j_mayer
            break;
1972 4c9649a9 j_mayer
        default:
1973 4c9649a9 j_mayer
            goto invalid_opc;
1974 4c9649a9 j_mayer
        }
1975 4c9649a9 j_mayer
        break;
1976 4c9649a9 j_mayer
    case 0x1D:
1977 4c9649a9 j_mayer
        /* HW_MTPR (PALcode) */
1978 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1979 4c9649a9 j_mayer
        goto invalid_opc;
1980 4c9649a9 j_mayer
#else
1981 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1982 4c9649a9 j_mayer
            goto invalid_opc;
1983 3761035f aurel32
        if (ra != 31)
1984 3761035f aurel32
            tcg_gen_mov_i64(cpu_T[0], cpu_ir[ra]);
1985 3761035f aurel32
        else
1986 3761035f aurel32
            tcg_gen_movi_i64(cpu_T[0], 0);
1987 4c9649a9 j_mayer
        gen_op_mtpr(insn & 0xFF);
1988 4c9649a9 j_mayer
        ret = 2;
1989 4c9649a9 j_mayer
        break;
1990 4c9649a9 j_mayer
#endif
1991 4c9649a9 j_mayer
    case 0x1E:
1992 4c9649a9 j_mayer
        /* HW_REI (PALcode) */
1993 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1994 4c9649a9 j_mayer
        goto invalid_opc;
1995 4c9649a9 j_mayer
#else
1996 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1997 4c9649a9 j_mayer
            goto invalid_opc;
1998 4c9649a9 j_mayer
        if (rb == 31) {
1999 4c9649a9 j_mayer
            /* "Old" alpha */
2000 4c9649a9 j_mayer
            gen_op_hw_rei();
2001 4c9649a9 j_mayer
        } else {
2002 3761035f aurel32
            if (ra != 31)
2003 3761035f aurel32
                tcg_gen_mov_i64(cpu_T[0], cpu_ir[rb]);
2004 3761035f aurel32
            else
2005 3761035f aurel32
                tcg_gen_movi_i64(cpu_T[0], 0);
2006 3761035f aurel32
            tcg_gen_movi_i64(cpu_T[1], (((int64_t)insn << 51) >> 51));
2007 4f821e17 aurel32
            tcg_gen_add_i64(cpu_T[0], cpu_T[0], cpu_T[1]);
2008 4c9649a9 j_mayer
            gen_op_hw_ret();
2009 4c9649a9 j_mayer
        }
2010 4c9649a9 j_mayer
        ret = 2;
2011 4c9649a9 j_mayer
        break;
2012 4c9649a9 j_mayer
#endif
2013 4c9649a9 j_mayer
    case 0x1F:
2014 4c9649a9 j_mayer
        /* HW_ST (PALcode) */
2015 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2016 4c9649a9 j_mayer
        goto invalid_opc;
2017 4c9649a9 j_mayer
#else
2018 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2019 4c9649a9 j_mayer
            goto invalid_opc;
2020 3761035f aurel32
        if (ra != 31)
2021 4f821e17 aurel32
            tcg_gen_addi_i64(cpu_T[0], cpu_ir[rb], disp12);
2022 3761035f aurel32
        else
2023 4f821e17 aurel32
            tcg_gen_movi_i64(cpu_T[0], disp12);
2024 3761035f aurel32
        if (ra != 31)
2025 3761035f aurel32
            tcg_gen_mov_i64(cpu_T[1], cpu_ir[ra]);
2026 3761035f aurel32
        else
2027 3761035f aurel32
            tcg_gen_movi_i64(cpu_T[1], 0);
2028 4c9649a9 j_mayer
        switch ((insn >> 12) & 0xF) {
2029 4c9649a9 j_mayer
        case 0x0:
2030 4c9649a9 j_mayer
            /* Longword physical access */
2031 4c9649a9 j_mayer
            gen_op_stl_raw();
2032 4c9649a9 j_mayer
            break;
2033 4c9649a9 j_mayer
        case 0x1:
2034 4c9649a9 j_mayer
            /* Quadword physical access */
2035 4c9649a9 j_mayer
            gen_op_stq_raw();
2036 4c9649a9 j_mayer
            break;
2037 4c9649a9 j_mayer
        case 0x2:
2038 4c9649a9 j_mayer
            /* Longword physical access with lock */
2039 4c9649a9 j_mayer
            gen_op_stl_c_raw();
2040 4c9649a9 j_mayer
            break;
2041 4c9649a9 j_mayer
        case 0x3:
2042 4c9649a9 j_mayer
            /* Quadword physical access with lock */
2043 4c9649a9 j_mayer
            gen_op_stq_c_raw();
2044 4c9649a9 j_mayer
            break;
2045 4c9649a9 j_mayer
        case 0x4:
2046 4c9649a9 j_mayer
            /* Longword virtual access */
2047 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
2048 4c9649a9 j_mayer
            gen_op_stl_raw();
2049 4c9649a9 j_mayer
            break;
2050 4c9649a9 j_mayer
        case 0x5:
2051 4c9649a9 j_mayer
            /* Quadword virtual access */
2052 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
2053 4c9649a9 j_mayer
            gen_op_stq_raw();
2054 4c9649a9 j_mayer
            break;
2055 4c9649a9 j_mayer
        case 0x6:
2056 4c9649a9 j_mayer
            /* Invalid */
2057 4c9649a9 j_mayer
            goto invalid_opc;
2058 4c9649a9 j_mayer
        case 0x7:
2059 4c9649a9 j_mayer
            /* Invalid */
2060 4c9649a9 j_mayer
            goto invalid_opc;
2061 4c9649a9 j_mayer
        case 0x8:
2062 4c9649a9 j_mayer
            /* Invalid */
2063 4c9649a9 j_mayer
            goto invalid_opc;
2064 4c9649a9 j_mayer
        case 0x9:
2065 4c9649a9 j_mayer
            /* Invalid */
2066 4c9649a9 j_mayer
            goto invalid_opc;
2067 4c9649a9 j_mayer
        case 0xA:
2068 4c9649a9 j_mayer
            /* Invalid */
2069 4c9649a9 j_mayer
            goto invalid_opc;
2070 4c9649a9 j_mayer
        case 0xB:
2071 4c9649a9 j_mayer
            /* Invalid */
2072 4c9649a9 j_mayer
            goto invalid_opc;
2073 4c9649a9 j_mayer
        case 0xC:
2074 4c9649a9 j_mayer
            /* Longword virtual access with alternate access mode */
2075 4c9649a9 j_mayer
            gen_op_set_alt_mode();
2076 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
2077 4c9649a9 j_mayer
            gen_op_ldl_raw();
2078 4c9649a9 j_mayer
            gen_op_restore_mode();
2079 4c9649a9 j_mayer
            break;
2080 4c9649a9 j_mayer
        case 0xD:
2081 4c9649a9 j_mayer
            /* Quadword virtual access with alternate access mode */
2082 4c9649a9 j_mayer
            gen_op_set_alt_mode();
2083 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
2084 4c9649a9 j_mayer
            gen_op_ldq_raw();
2085 4c9649a9 j_mayer
            gen_op_restore_mode();
2086 4c9649a9 j_mayer
            break;
2087 4c9649a9 j_mayer
        case 0xE:
2088 4c9649a9 j_mayer
            /* Invalid */
2089 4c9649a9 j_mayer
            goto invalid_opc;
2090 4c9649a9 j_mayer
        case 0xF:
2091 4c9649a9 j_mayer
            /* Invalid */
2092 4c9649a9 j_mayer
            goto invalid_opc;
2093 4c9649a9 j_mayer
        }
2094 4c9649a9 j_mayer
        ret = 2;
2095 4c9649a9 j_mayer
        break;
2096 4c9649a9 j_mayer
#endif
2097 4c9649a9 j_mayer
    case 0x20:
2098 4c9649a9 j_mayer
        /* LDF */
2099 4c9649a9 j_mayer
#if 0 // TODO
2100 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldf, ra, rb, disp16);
2101 4c9649a9 j_mayer
#else
2102 4c9649a9 j_mayer
        goto invalid_opc;
2103 4c9649a9 j_mayer
#endif
2104 4c9649a9 j_mayer
        break;
2105 4c9649a9 j_mayer
    case 0x21:
2106 4c9649a9 j_mayer
        /* LDG */
2107 4c9649a9 j_mayer
#if 0 // TODO
2108 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldg, ra, rb, disp16);
2109 4c9649a9 j_mayer
#else
2110 4c9649a9 j_mayer
        goto invalid_opc;
2111 4c9649a9 j_mayer
#endif
2112 4c9649a9 j_mayer
        break;
2113 4c9649a9 j_mayer
    case 0x22:
2114 4c9649a9 j_mayer
        /* LDS */
2115 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_lds, ra, rb, disp16);
2116 4c9649a9 j_mayer
        break;
2117 4c9649a9 j_mayer
    case 0x23:
2118 4c9649a9 j_mayer
        /* LDT */
2119 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldt, ra, rb, disp16);
2120 4c9649a9 j_mayer
        break;
2121 4c9649a9 j_mayer
    case 0x24:
2122 4c9649a9 j_mayer
        /* STF */
2123 4c9649a9 j_mayer
#if 0 // TODO
2124 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stf, ra, rb, disp16);
2125 4c9649a9 j_mayer
#else
2126 4c9649a9 j_mayer
        goto invalid_opc;
2127 4c9649a9 j_mayer
#endif
2128 4c9649a9 j_mayer
        break;
2129 4c9649a9 j_mayer
    case 0x25:
2130 4c9649a9 j_mayer
        /* STG */
2131 4c9649a9 j_mayer
#if 0 // TODO
2132 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stg, ra, rb, disp16);
2133 4c9649a9 j_mayer
#else
2134 4c9649a9 j_mayer
        goto invalid_opc;
2135 4c9649a9 j_mayer
#endif
2136 4c9649a9 j_mayer
        break;
2137 4c9649a9 j_mayer
    case 0x26:
2138 4c9649a9 j_mayer
        /* STS */
2139 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_sts, ra, rb, disp16);
2140 4c9649a9 j_mayer
        break;
2141 4c9649a9 j_mayer
    case 0x27:
2142 4c9649a9 j_mayer
        /* STT */
2143 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stt, ra, rb, disp16);
2144 4c9649a9 j_mayer
        break;
2145 4c9649a9 j_mayer
    case 0x28:
2146 4c9649a9 j_mayer
        /* LDL */
2147 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldl, ra, rb, disp16, 0);
2148 4c9649a9 j_mayer
        break;
2149 4c9649a9 j_mayer
    case 0x29:
2150 4c9649a9 j_mayer
        /* LDQ */
2151 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq, ra, rb, disp16, 0);
2152 4c9649a9 j_mayer
        break;
2153 4c9649a9 j_mayer
    case 0x2A:
2154 4c9649a9 j_mayer
        /* LDL_L */
2155 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldl_l, ra, rb, disp16, 0);
2156 4c9649a9 j_mayer
        break;
2157 4c9649a9 j_mayer
    case 0x2B:
2158 4c9649a9 j_mayer
        /* LDQ_L */
2159 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq_l, ra, rb, disp16, 0);
2160 4c9649a9 j_mayer
        break;
2161 4c9649a9 j_mayer
    case 0x2C:
2162 4c9649a9 j_mayer
        /* STL */
2163 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stl, ra, rb, disp16, 0);
2164 4c9649a9 j_mayer
        break;
2165 4c9649a9 j_mayer
    case 0x2D:
2166 4c9649a9 j_mayer
        /* STQ */
2167 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq, ra, rb, disp16, 0);
2168 4c9649a9 j_mayer
        break;
2169 4c9649a9 j_mayer
    case 0x2E:
2170 4c9649a9 j_mayer
        /* STL_C */
2171 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stl_c, ra, rb, disp16, 0);
2172 4c9649a9 j_mayer
        break;
2173 4c9649a9 j_mayer
    case 0x2F:
2174 4c9649a9 j_mayer
        /* STQ_C */
2175 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq_c, ra, rb, disp16, 0);
2176 4c9649a9 j_mayer
        break;
2177 4c9649a9 j_mayer
    case 0x30:
2178 4c9649a9 j_mayer
        /* BR */
2179 3761035f aurel32
        if (ra != 31)
2180 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2181 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2182 4c9649a9 j_mayer
        ret = 1;
2183 4c9649a9 j_mayer
        break;
2184 4c9649a9 j_mayer
    case 0x31:
2185 4c9649a9 j_mayer
        /* FBEQ */
2186 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfeq, ra, disp16);
2187 4c9649a9 j_mayer
        ret = 1;
2188 4c9649a9 j_mayer
        break;
2189 4c9649a9 j_mayer
    case 0x32:
2190 4c9649a9 j_mayer
        /* FBLT */
2191 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpflt, ra, disp16);
2192 4c9649a9 j_mayer
        ret = 1;
2193 4c9649a9 j_mayer
        break;
2194 4c9649a9 j_mayer
    case 0x33:
2195 4c9649a9 j_mayer
        /* FBLE */
2196 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfle, ra, disp16);
2197 4c9649a9 j_mayer
        ret = 1;
2198 4c9649a9 j_mayer
        break;
2199 4c9649a9 j_mayer
    case 0x34:
2200 4c9649a9 j_mayer
        /* BSR */
2201 3761035f aurel32
        if (ra != 31)
2202 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2203 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2204 4c9649a9 j_mayer
        ret = 1;
2205 4c9649a9 j_mayer
        break;
2206 4c9649a9 j_mayer
    case 0x35:
2207 4c9649a9 j_mayer
        /* FBNE */
2208 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfne, ra, disp16);
2209 4c9649a9 j_mayer
        ret = 1;
2210 4c9649a9 j_mayer
        break;
2211 4c9649a9 j_mayer
    case 0x36:
2212 4c9649a9 j_mayer
        /* FBGE */
2213 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfge, ra, disp16);
2214 4c9649a9 j_mayer
        ret = 1;
2215 4c9649a9 j_mayer
        break;
2216 4c9649a9 j_mayer
    case 0x37:
2217 4c9649a9 j_mayer
        /* FBGT */
2218 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfgt, ra, disp16);
2219 4c9649a9 j_mayer
        ret = 1;
2220 4c9649a9 j_mayer
        break;
2221 4c9649a9 j_mayer
    case 0x38:
2222 4c9649a9 j_mayer
        /* BLBC */
2223 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 1);
2224 4c9649a9 j_mayer
        ret = 1;
2225 4c9649a9 j_mayer
        break;
2226 4c9649a9 j_mayer
    case 0x39:
2227 4c9649a9 j_mayer
        /* BEQ */
2228 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp16, 0);
2229 4c9649a9 j_mayer
        ret = 1;
2230 4c9649a9 j_mayer
        break;
2231 4c9649a9 j_mayer
    case 0x3A:
2232 4c9649a9 j_mayer
        /* BLT */
2233 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_LT, ra, disp16, 0);
2234 4c9649a9 j_mayer
        ret = 1;
2235 4c9649a9 j_mayer
        break;
2236 4c9649a9 j_mayer
    case 0x3B:
2237 4c9649a9 j_mayer
        /* BLE */
2238 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_LE, ra, disp16, 0);
2239 4c9649a9 j_mayer
        ret = 1;
2240 4c9649a9 j_mayer
        break;
2241 4c9649a9 j_mayer
    case 0x3C:
2242 4c9649a9 j_mayer
        /* BLBS */
2243 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 1);
2244 4c9649a9 j_mayer
        ret = 1;
2245 4c9649a9 j_mayer
        break;
2246 4c9649a9 j_mayer
    case 0x3D:
2247 4c9649a9 j_mayer
        /* BNE */
2248 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp16, 0);
2249 4c9649a9 j_mayer
        ret = 1;
2250 4c9649a9 j_mayer
        break;
2251 4c9649a9 j_mayer
    case 0x3E:
2252 4c9649a9 j_mayer
        /* BGE */
2253 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_GE, ra, disp16, 0);
2254 4c9649a9 j_mayer
        ret = 1;
2255 4c9649a9 j_mayer
        break;
2256 4c9649a9 j_mayer
    case 0x3F:
2257 4c9649a9 j_mayer
        /* BGT */
2258 9c29504e aurel32
        gen_bcond(ctx, TCG_COND_GT, ra, disp16, 0);
2259 4c9649a9 j_mayer
        ret = 1;
2260 4c9649a9 j_mayer
        break;
2261 4c9649a9 j_mayer
    invalid_opc:
2262 4c9649a9 j_mayer
        gen_invalid(ctx);
2263 4c9649a9 j_mayer
        ret = 3;
2264 4c9649a9 j_mayer
        break;
2265 4c9649a9 j_mayer
    }
2266 4c9649a9 j_mayer
2267 4c9649a9 j_mayer
    return ret;
2268 4c9649a9 j_mayer
}
2269 4c9649a9 j_mayer
2270 2cfc5f17 ths
static always_inline void gen_intermediate_code_internal (CPUState *env,
2271 2cfc5f17 ths
                                                          TranslationBlock *tb,
2272 2cfc5f17 ths
                                                          int search_pc)
2273 4c9649a9 j_mayer
{
2274 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2275 4c9649a9 j_mayer
    static int insn_count;
2276 4c9649a9 j_mayer
#endif
2277 4c9649a9 j_mayer
    DisasContext ctx, *ctxp = &ctx;
2278 4c9649a9 j_mayer
    target_ulong pc_start;
2279 4c9649a9 j_mayer
    uint32_t insn;
2280 4c9649a9 j_mayer
    uint16_t *gen_opc_end;
2281 4c9649a9 j_mayer
    int j, lj = -1;
2282 4c9649a9 j_mayer
    int ret;
2283 2e70f6ef pbrook
    int num_insns;
2284 2e70f6ef pbrook
    int max_insns;
2285 4c9649a9 j_mayer
2286 4c9649a9 j_mayer
    pc_start = tb->pc;
2287 4c9649a9 j_mayer
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2288 4c9649a9 j_mayer
    ctx.pc = pc_start;
2289 4c9649a9 j_mayer
    ctx.amask = env->amask;
2290 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2291 4c9649a9 j_mayer
    ctx.mem_idx = 0;
2292 4c9649a9 j_mayer
#else
2293 4c9649a9 j_mayer
    ctx.mem_idx = ((env->ps >> 3) & 3);
2294 4c9649a9 j_mayer
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2295 4c9649a9 j_mayer
#endif
2296 2e70f6ef pbrook
    num_insns = 0;
2297 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
2298 2e70f6ef pbrook
    if (max_insns == 0)
2299 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
2300 2e70f6ef pbrook
2301 2e70f6ef pbrook
    gen_icount_start();
2302 4c9649a9 j_mayer
    for (ret = 0; ret == 0;) {
2303 4c9649a9 j_mayer
        if (env->nb_breakpoints > 0) {
2304 4c9649a9 j_mayer
            for(j = 0; j < env->nb_breakpoints; j++) {
2305 4c9649a9 j_mayer
                if (env->breakpoints[j] == ctx.pc) {
2306 4c9649a9 j_mayer
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2307 4c9649a9 j_mayer
                    break;
2308 4c9649a9 j_mayer
                }
2309 4c9649a9 j_mayer
            }
2310 4c9649a9 j_mayer
        }
2311 4c9649a9 j_mayer
        if (search_pc) {
2312 4c9649a9 j_mayer
            j = gen_opc_ptr - gen_opc_buf;
2313 4c9649a9 j_mayer
            if (lj < j) {
2314 4c9649a9 j_mayer
                lj++;
2315 4c9649a9 j_mayer
                while (lj < j)
2316 4c9649a9 j_mayer
                    gen_opc_instr_start[lj++] = 0;
2317 4c9649a9 j_mayer
                gen_opc_pc[lj] = ctx.pc;
2318 4c9649a9 j_mayer
                gen_opc_instr_start[lj] = 1;
2319 2e70f6ef pbrook
                gen_opc_icount[lj] = num_insns;
2320 4c9649a9 j_mayer
            }
2321 4c9649a9 j_mayer
        }
2322 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2323 2e70f6ef pbrook
            gen_io_start();
2324 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2325 4c9649a9 j_mayer
        insn_count++;
2326 4c9649a9 j_mayer
        if (logfile != NULL) {
2327 e96efcfc j_mayer
            fprintf(logfile, "pc " TARGET_FMT_lx " mem_idx %d\n",
2328 e96efcfc j_mayer
                    ctx.pc, ctx.mem_idx);
2329 4c9649a9 j_mayer
        }
2330 4c9649a9 j_mayer
#endif
2331 4c9649a9 j_mayer
        insn = ldl_code(ctx.pc);
2332 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2333 4c9649a9 j_mayer
        insn_count++;
2334 4c9649a9 j_mayer
        if (logfile != NULL) {
2335 4c9649a9 j_mayer
            fprintf(logfile, "opcode %08x %d\n", insn, insn_count);
2336 4c9649a9 j_mayer
        }
2337 4c9649a9 j_mayer
#endif
2338 2e70f6ef pbrook
        num_insns++;
2339 4c9649a9 j_mayer
        ctx.pc += 4;
2340 4c9649a9 j_mayer
        ret = translate_one(ctxp, insn);
2341 4c9649a9 j_mayer
        if (ret != 0)
2342 4c9649a9 j_mayer
            break;
2343 4c9649a9 j_mayer
        /* if we reach a page boundary or are single stepping, stop
2344 4c9649a9 j_mayer
         * generation
2345 4c9649a9 j_mayer
         */
2346 4c9649a9 j_mayer
        if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) ||
2347 2e70f6ef pbrook
            (env->singlestep_enabled) ||
2348 2e70f6ef pbrook
            num_insns >= max_insns) {
2349 4c9649a9 j_mayer
            break;
2350 4c9649a9 j_mayer
        }
2351 4c9649a9 j_mayer
#if defined (DO_SINGLE_STEP)
2352 4c9649a9 j_mayer
        break;
2353 4c9649a9 j_mayer
#endif
2354 4c9649a9 j_mayer
    }
2355 4c9649a9 j_mayer
    if (ret != 1 && ret != 3) {
2356 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
2357 4c9649a9 j_mayer
    }
2358 4c9649a9 j_mayer
#if defined (DO_TB_FLUSH)
2359 496cb5b9 aurel32
    tcg_gen_helper_0_0(helper_tb_flush);
2360 4c9649a9 j_mayer
#endif
2361 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
2362 2e70f6ef pbrook
        gen_io_end();
2363 4c9649a9 j_mayer
    /* Generate the return instruction */
2364 57fec1fe bellard
    tcg_gen_exit_tb(0);
2365 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
2366 4c9649a9 j_mayer
    *gen_opc_ptr = INDEX_op_end;
2367 4c9649a9 j_mayer
    if (search_pc) {
2368 4c9649a9 j_mayer
        j = gen_opc_ptr - gen_opc_buf;
2369 4c9649a9 j_mayer
        lj++;
2370 4c9649a9 j_mayer
        while (lj <= j)
2371 4c9649a9 j_mayer
            gen_opc_instr_start[lj++] = 0;
2372 4c9649a9 j_mayer
    } else {
2373 4c9649a9 j_mayer
        tb->size = ctx.pc - pc_start;
2374 2e70f6ef pbrook
        tb->icount = num_insns;
2375 4c9649a9 j_mayer
    }
2376 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2377 4c9649a9 j_mayer
    if (loglevel & CPU_LOG_TB_CPU) {
2378 4c9649a9 j_mayer
        cpu_dump_state(env, logfile, fprintf, 0);
2379 4c9649a9 j_mayer
    }
2380 4c9649a9 j_mayer
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2381 4c9649a9 j_mayer
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
2382 4c9649a9 j_mayer
        target_disas(logfile, pc_start, ctx.pc - pc_start, 1);
2383 4c9649a9 j_mayer
        fprintf(logfile, "\n");
2384 4c9649a9 j_mayer
    }
2385 4c9649a9 j_mayer
#endif
2386 4c9649a9 j_mayer
}
2387 4c9649a9 j_mayer
2388 2cfc5f17 ths
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2389 4c9649a9 j_mayer
{
2390 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 0);
2391 4c9649a9 j_mayer
}
2392 4c9649a9 j_mayer
2393 2cfc5f17 ths
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2394 4c9649a9 j_mayer
{
2395 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 1);
2396 4c9649a9 j_mayer
}
2397 4c9649a9 j_mayer
2398 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2399 4c9649a9 j_mayer
{
2400 4c9649a9 j_mayer
    CPUAlphaState *env;
2401 4c9649a9 j_mayer
    uint64_t hwpcb;
2402 4c9649a9 j_mayer
2403 4c9649a9 j_mayer
    env = qemu_mallocz(sizeof(CPUAlphaState));
2404 4c9649a9 j_mayer
    if (!env)
2405 4c9649a9 j_mayer
        return NULL;
2406 4c9649a9 j_mayer
    cpu_exec_init(env);
2407 2e70f6ef pbrook
    alpha_translate_init();
2408 4c9649a9 j_mayer
    tlb_flush(env, 1);
2409 4c9649a9 j_mayer
    /* XXX: should not be hardcoded */
2410 4c9649a9 j_mayer
    env->implver = IMPLVER_2106x;
2411 4c9649a9 j_mayer
    env->ps = 0x1F00;
2412 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2413 4c9649a9 j_mayer
    env->ps |= 1 << 3;
2414 4c9649a9 j_mayer
#endif
2415 4c9649a9 j_mayer
    pal_init(env);
2416 4c9649a9 j_mayer
    /* Initialize IPR */
2417 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
2418 4c9649a9 j_mayer
    env->ipr[IPR_ASN] = 0;
2419 4c9649a9 j_mayer
    env->ipr[IPR_ASTEN] = 0;
2420 4c9649a9 j_mayer
    env->ipr[IPR_ASTSR] = 0;
2421 4c9649a9 j_mayer
    env->ipr[IPR_DATFX] = 0;
2422 4c9649a9 j_mayer
    /* XXX: fix this */
2423 4c9649a9 j_mayer
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2424 4c9649a9 j_mayer
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2425 4c9649a9 j_mayer
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2426 4c9649a9 j_mayer
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2427 4c9649a9 j_mayer
    env->ipr[IPR_FEN] = 0;
2428 4c9649a9 j_mayer
    env->ipr[IPR_IPL] = 31;
2429 4c9649a9 j_mayer
    env->ipr[IPR_MCES] = 0;
2430 4c9649a9 j_mayer
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2431 4c9649a9 j_mayer
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2432 4c9649a9 j_mayer
    env->ipr[IPR_SISR] = 0;
2433 4c9649a9 j_mayer
    env->ipr[IPR_VIRBND] = -1ULL;
2434 4c9649a9 j_mayer
2435 4c9649a9 j_mayer
    return env;
2436 4c9649a9 j_mayer
}
2437 aaed909a bellard
2438 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2439 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
2440 d2856f1a aurel32
{
2441 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
2442 d2856f1a aurel32
}