Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 496cb5b9

History | View | Annotate | Download (59.1 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 496cb5b9 aurel32
#include "helper.h"
29 57fec1fe bellard
#include "tcg-op.h"
30 ca10f867 aurel32
#include "qemu-common.h"
31 4c9649a9 j_mayer
32 4c9649a9 j_mayer
#define DO_SINGLE_STEP
33 4c9649a9 j_mayer
#define GENERATE_NOP
34 4c9649a9 j_mayer
#define ALPHA_DEBUG_DISAS
35 4c9649a9 j_mayer
#define DO_TB_FLUSH
36 4c9649a9 j_mayer
37 4c9649a9 j_mayer
typedef struct DisasContext DisasContext;
38 4c9649a9 j_mayer
struct DisasContext {
39 4c9649a9 j_mayer
    uint64_t pc;
40 4c9649a9 j_mayer
    int mem_idx;
41 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
42 4c9649a9 j_mayer
    int pal_mode;
43 4c9649a9 j_mayer
#endif
44 4c9649a9 j_mayer
    uint32_t amask;
45 4c9649a9 j_mayer
};
46 4c9649a9 j_mayer
47 b2437bf2 pbrook
static TCGv cpu_env;
48 496cb5b9 aurel32
static TCGv cpu_ir[31];
49 496cb5b9 aurel32
static TCGv cpu_pc;
50 496cb5b9 aurel32
51 496cb5b9 aurel32
static char cpu_reg_names[5*31];
52 2e70f6ef pbrook
53 2e70f6ef pbrook
#include "gen-icount.h"
54 2e70f6ef pbrook
55 a5f1b965 blueswir1
static void alpha_translate_init(void)
56 2e70f6ef pbrook
{
57 496cb5b9 aurel32
    int i;
58 496cb5b9 aurel32
    char *p;
59 2e70f6ef pbrook
    static int done_init = 0;
60 496cb5b9 aurel32
61 2e70f6ef pbrook
    if (done_init)
62 2e70f6ef pbrook
        return;
63 496cb5b9 aurel32
64 2e70f6ef pbrook
    cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env");
65 496cb5b9 aurel32
66 496cb5b9 aurel32
    p = cpu_reg_names;
67 496cb5b9 aurel32
    for (i = 0; i < 31; i++) {
68 496cb5b9 aurel32
        sprintf(p, "ir%d", i);
69 496cb5b9 aurel32
        cpu_ir[i] = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
70 496cb5b9 aurel32
                                       offsetof(CPUState, ir[i]), p);
71 496cb5b9 aurel32
        p += 4;
72 496cb5b9 aurel32
    }
73 496cb5b9 aurel32
74 496cb5b9 aurel32
    cpu_pc = tcg_global_mem_new(TCG_TYPE_I64, TCG_AREG0,
75 496cb5b9 aurel32
                                offsetof(CPUState, pc), "pc");
76 496cb5b9 aurel32
77 496cb5b9 aurel32
    /* register helpers */
78 496cb5b9 aurel32
#undef DEF_HELPER
79 496cb5b9 aurel32
#define DEF_HELPER(ret, name, params) tcg_register_helper(name, #name);
80 496cb5b9 aurel32
#include "helper.h"
81 496cb5b9 aurel32
82 2e70f6ef pbrook
    done_init = 1;
83 2e70f6ef pbrook
}
84 2e70f6ef pbrook
85 f071b4d3 j_mayer
static always_inline void gen_op_nop (void)
86 4c9649a9 j_mayer
{
87 4c9649a9 j_mayer
#if defined(GENERATE_NOP)
88 4c9649a9 j_mayer
    gen_op_no_op();
89 4c9649a9 j_mayer
#endif
90 4c9649a9 j_mayer
}
91 4c9649a9 j_mayer
92 4c9649a9 j_mayer
#define GEN32(func, NAME) \
93 4c9649a9 j_mayer
static GenOpFunc *NAME ## _table [32] = {                                     \
94 4c9649a9 j_mayer
NAME ## 0, NAME ## 1, NAME ## 2, NAME ## 3,                                   \
95 4c9649a9 j_mayer
NAME ## 4, NAME ## 5, NAME ## 6, NAME ## 7,                                   \
96 4c9649a9 j_mayer
NAME ## 8, NAME ## 9, NAME ## 10, NAME ## 11,                                 \
97 4c9649a9 j_mayer
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
98 4c9649a9 j_mayer
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
99 4c9649a9 j_mayer
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
100 4c9649a9 j_mayer
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
101 4c9649a9 j_mayer
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
102 4c9649a9 j_mayer
};                                                                            \
103 f071b4d3 j_mayer
static always_inline void func (int n)                                        \
104 4c9649a9 j_mayer
{                                                                             \
105 4c9649a9 j_mayer
    NAME ## _table[n]();                                                      \
106 4c9649a9 j_mayer
}
107 4c9649a9 j_mayer
108 4c9649a9 j_mayer
/* IR moves */
109 4c9649a9 j_mayer
/* Special hacks for ir31 */
110 4c9649a9 j_mayer
#define gen_op_load_T0_ir31 gen_op_reset_T0
111 4c9649a9 j_mayer
#define gen_op_load_T1_ir31 gen_op_reset_T1
112 4c9649a9 j_mayer
#define gen_op_load_T2_ir31 gen_op_reset_T2
113 4c9649a9 j_mayer
#define gen_op_store_T0_ir31 gen_op_nop
114 4c9649a9 j_mayer
#define gen_op_store_T1_ir31 gen_op_nop
115 4c9649a9 j_mayer
#define gen_op_store_T2_ir31 gen_op_nop
116 4c9649a9 j_mayer
#define gen_op_cmov_ir31 gen_op_nop
117 4c9649a9 j_mayer
GEN32(gen_op_load_T0_ir, gen_op_load_T0_ir);
118 4c9649a9 j_mayer
GEN32(gen_op_load_T1_ir, gen_op_load_T1_ir);
119 4c9649a9 j_mayer
GEN32(gen_op_load_T2_ir, gen_op_load_T2_ir);
120 4c9649a9 j_mayer
GEN32(gen_op_store_T0_ir, gen_op_store_T0_ir);
121 4c9649a9 j_mayer
GEN32(gen_op_store_T1_ir, gen_op_store_T1_ir);
122 4c9649a9 j_mayer
GEN32(gen_op_store_T2_ir, gen_op_store_T2_ir);
123 4c9649a9 j_mayer
GEN32(gen_op_cmov_ir, gen_op_cmov_ir);
124 4c9649a9 j_mayer
125 f071b4d3 j_mayer
static always_inline void gen_load_ir (DisasContext *ctx, int irn, int Tn)
126 4c9649a9 j_mayer
{
127 4c9649a9 j_mayer
    switch (Tn) {
128 4c9649a9 j_mayer
    case 0:
129 4c9649a9 j_mayer
        gen_op_load_T0_ir(irn);
130 4c9649a9 j_mayer
        break;
131 4c9649a9 j_mayer
    case 1:
132 4c9649a9 j_mayer
        gen_op_load_T1_ir(irn);
133 4c9649a9 j_mayer
        break;
134 4c9649a9 j_mayer
    case 2:
135 4c9649a9 j_mayer
        gen_op_load_T2_ir(irn);
136 4c9649a9 j_mayer
        break;
137 4c9649a9 j_mayer
    }
138 4c9649a9 j_mayer
}
139 4c9649a9 j_mayer
140 f071b4d3 j_mayer
static always_inline void gen_store_ir (DisasContext *ctx, int irn, int Tn)
141 4c9649a9 j_mayer
{
142 4c9649a9 j_mayer
    switch (Tn) {
143 4c9649a9 j_mayer
    case 0:
144 4c9649a9 j_mayer
        gen_op_store_T0_ir(irn);
145 4c9649a9 j_mayer
        break;
146 4c9649a9 j_mayer
    case 1:
147 4c9649a9 j_mayer
        gen_op_store_T1_ir(irn);
148 4c9649a9 j_mayer
        break;
149 4c9649a9 j_mayer
    case 2:
150 4c9649a9 j_mayer
        gen_op_store_T2_ir(irn);
151 4c9649a9 j_mayer
        break;
152 4c9649a9 j_mayer
    }
153 4c9649a9 j_mayer
}
154 4c9649a9 j_mayer
155 496cb5b9 aurel32
static inline void get_ir (TCGv t, int reg)
156 496cb5b9 aurel32
{
157 496cb5b9 aurel32
    if (reg == 31)
158 496cb5b9 aurel32
        tcg_gen_movi_i64(t, 0);
159 496cb5b9 aurel32
    else
160 496cb5b9 aurel32
        tcg_gen_mov_i64(t, cpu_ir[reg]);
161 496cb5b9 aurel32
}
162 496cb5b9 aurel32
163 496cb5b9 aurel32
static inline void set_ir (TCGv t, int reg)
164 496cb5b9 aurel32
{
165 496cb5b9 aurel32
    if (reg != 31)
166 496cb5b9 aurel32
        tcg_gen_mov_i64(cpu_ir[reg], t);
167 496cb5b9 aurel32
}
168 496cb5b9 aurel32
169 4c9649a9 j_mayer
/* FIR moves */
170 4c9649a9 j_mayer
/* Special hacks for fir31 */
171 4c9649a9 j_mayer
#define gen_op_load_FT0_fir31 gen_op_reset_FT0
172 4c9649a9 j_mayer
#define gen_op_load_FT1_fir31 gen_op_reset_FT1
173 4c9649a9 j_mayer
#define gen_op_load_FT2_fir31 gen_op_reset_FT2
174 4c9649a9 j_mayer
#define gen_op_store_FT0_fir31 gen_op_nop
175 4c9649a9 j_mayer
#define gen_op_store_FT1_fir31 gen_op_nop
176 4c9649a9 j_mayer
#define gen_op_store_FT2_fir31 gen_op_nop
177 4c9649a9 j_mayer
#define gen_op_cmov_fir31 gen_op_nop
178 4c9649a9 j_mayer
GEN32(gen_op_load_FT0_fir, gen_op_load_FT0_fir);
179 4c9649a9 j_mayer
GEN32(gen_op_load_FT1_fir, gen_op_load_FT1_fir);
180 4c9649a9 j_mayer
GEN32(gen_op_load_FT2_fir, gen_op_load_FT2_fir);
181 4c9649a9 j_mayer
GEN32(gen_op_store_FT0_fir, gen_op_store_FT0_fir);
182 4c9649a9 j_mayer
GEN32(gen_op_store_FT1_fir, gen_op_store_FT1_fir);
183 4c9649a9 j_mayer
GEN32(gen_op_store_FT2_fir, gen_op_store_FT2_fir);
184 4c9649a9 j_mayer
GEN32(gen_op_cmov_fir, gen_op_cmov_fir);
185 4c9649a9 j_mayer
186 f071b4d3 j_mayer
static always_inline void gen_load_fir (DisasContext *ctx, int firn, int Tn)
187 4c9649a9 j_mayer
{
188 4c9649a9 j_mayer
    switch (Tn) {
189 4c9649a9 j_mayer
    case 0:
190 4c9649a9 j_mayer
        gen_op_load_FT0_fir(firn);
191 4c9649a9 j_mayer
        break;
192 4c9649a9 j_mayer
    case 1:
193 4c9649a9 j_mayer
        gen_op_load_FT1_fir(firn);
194 4c9649a9 j_mayer
        break;
195 4c9649a9 j_mayer
    case 2:
196 4c9649a9 j_mayer
        gen_op_load_FT2_fir(firn);
197 4c9649a9 j_mayer
        break;
198 4c9649a9 j_mayer
    }
199 4c9649a9 j_mayer
}
200 4c9649a9 j_mayer
201 f071b4d3 j_mayer
static always_inline void gen_store_fir (DisasContext *ctx, int firn, int Tn)
202 4c9649a9 j_mayer
{
203 4c9649a9 j_mayer
    switch (Tn) {
204 4c9649a9 j_mayer
    case 0:
205 4c9649a9 j_mayer
        gen_op_store_FT0_fir(firn);
206 4c9649a9 j_mayer
        break;
207 4c9649a9 j_mayer
    case 1:
208 4c9649a9 j_mayer
        gen_op_store_FT1_fir(firn);
209 4c9649a9 j_mayer
        break;
210 4c9649a9 j_mayer
    case 2:
211 4c9649a9 j_mayer
        gen_op_store_FT2_fir(firn);
212 4c9649a9 j_mayer
        break;
213 4c9649a9 j_mayer
    }
214 4c9649a9 j_mayer
}
215 4c9649a9 j_mayer
216 4c9649a9 j_mayer
/* Memory moves */
217 4c9649a9 j_mayer
#if defined(CONFIG_USER_ONLY)
218 4c9649a9 j_mayer
#define OP_LD_TABLE(width)                                                    \
219 4c9649a9 j_mayer
static GenOpFunc *gen_op_ld##width[] = {                                      \
220 4c9649a9 j_mayer
    &gen_op_ld##width##_raw,                                                  \
221 4c9649a9 j_mayer
}
222 4c9649a9 j_mayer
#define OP_ST_TABLE(width)                                                    \
223 4c9649a9 j_mayer
static GenOpFunc *gen_op_st##width[] = {                                      \
224 4c9649a9 j_mayer
    &gen_op_st##width##_raw,                                                  \
225 4c9649a9 j_mayer
}
226 4c9649a9 j_mayer
#else
227 4c9649a9 j_mayer
#define OP_LD_TABLE(width)                                                    \
228 4c9649a9 j_mayer
static GenOpFunc *gen_op_ld##width[] = {                                      \
229 4c9649a9 j_mayer
    &gen_op_ld##width##_kernel,                                               \
230 bb6f6792 j_mayer
    &gen_op_ld##width##_executive,                                            \
231 bb6f6792 j_mayer
    &gen_op_ld##width##_supervisor,                                           \
232 bb6f6792 j_mayer
    &gen_op_ld##width##_user,                                                 \
233 4c9649a9 j_mayer
}
234 4c9649a9 j_mayer
#define OP_ST_TABLE(width)                                                    \
235 4c9649a9 j_mayer
static GenOpFunc *gen_op_st##width[] = {                                      \
236 4c9649a9 j_mayer
    &gen_op_st##width##_kernel,                                               \
237 bb6f6792 j_mayer
    &gen_op_st##width##_executive,                                            \
238 bb6f6792 j_mayer
    &gen_op_st##width##_supervisor,                                           \
239 bb6f6792 j_mayer
    &gen_op_st##width##_user,                                                 \
240 4c9649a9 j_mayer
}
241 4c9649a9 j_mayer
#endif
242 4c9649a9 j_mayer
243 4c9649a9 j_mayer
#define GEN_LD(width)                                                         \
244 4c9649a9 j_mayer
OP_LD_TABLE(width);                                                           \
245 f071b4d3 j_mayer
static always_inline void gen_ld##width (DisasContext *ctx)                   \
246 4c9649a9 j_mayer
{                                                                             \
247 4c9649a9 j_mayer
    (*gen_op_ld##width[ctx->mem_idx])();                                      \
248 4c9649a9 j_mayer
}
249 4c9649a9 j_mayer
250 4c9649a9 j_mayer
#define GEN_ST(width)                                                         \
251 4c9649a9 j_mayer
OP_ST_TABLE(width);                                                           \
252 f071b4d3 j_mayer
static always_inline void gen_st##width (DisasContext *ctx)                   \
253 4c9649a9 j_mayer
{                                                                             \
254 4c9649a9 j_mayer
    (*gen_op_st##width[ctx->mem_idx])();                                      \
255 4c9649a9 j_mayer
}
256 4c9649a9 j_mayer
257 4c9649a9 j_mayer
GEN_LD(bu);
258 4c9649a9 j_mayer
GEN_ST(b);
259 4c9649a9 j_mayer
GEN_LD(wu);
260 4c9649a9 j_mayer
GEN_ST(w);
261 4c9649a9 j_mayer
GEN_LD(l);
262 4c9649a9 j_mayer
GEN_ST(l);
263 4c9649a9 j_mayer
GEN_LD(q);
264 4c9649a9 j_mayer
GEN_ST(q);
265 4c9649a9 j_mayer
GEN_LD(q_u);
266 4c9649a9 j_mayer
GEN_ST(q_u);
267 4c9649a9 j_mayer
GEN_LD(l_l);
268 4c9649a9 j_mayer
GEN_ST(l_c);
269 4c9649a9 j_mayer
GEN_LD(q_l);
270 4c9649a9 j_mayer
GEN_ST(q_c);
271 4c9649a9 j_mayer
272 08ab123c ths
#if 0 /* currently unused */
273 4c9649a9 j_mayer
GEN_LD(f);
274 4c9649a9 j_mayer
GEN_ST(f);
275 4c9649a9 j_mayer
GEN_LD(g);
276 4c9649a9 j_mayer
GEN_ST(g);
277 08ab123c ths
#endif /* 0 */
278 4c9649a9 j_mayer
GEN_LD(s);
279 4c9649a9 j_mayer
GEN_ST(s);
280 4c9649a9 j_mayer
GEN_LD(t);
281 4c9649a9 j_mayer
GEN_ST(t);
282 4c9649a9 j_mayer
283 4c9649a9 j_mayer
#if defined(__i386__) || defined(__x86_64__)
284 f071b4d3 j_mayer
static always_inline void gen_op_set_s16_T0 (int16_t imm)
285 4c9649a9 j_mayer
{
286 4c9649a9 j_mayer
    gen_op_set_s32_T0((int32_t)imm);
287 4c9649a9 j_mayer
}
288 4c9649a9 j_mayer
289 f071b4d3 j_mayer
static always_inline void gen_op_set_s16_T1 (int16_t imm)
290 4c9649a9 j_mayer
{
291 4c9649a9 j_mayer
    gen_op_set_s32_T1((int32_t)imm);
292 4c9649a9 j_mayer
}
293 4c9649a9 j_mayer
294 f071b4d3 j_mayer
static always_inline void gen_op_set_u16_T0 (uint16_t imm)
295 4c9649a9 j_mayer
{
296 4c9649a9 j_mayer
    gen_op_set_s32_T0((uint32_t)imm);
297 4c9649a9 j_mayer
}
298 4c9649a9 j_mayer
299 f071b4d3 j_mayer
static always_inline void gen_op_set_u16_T1 (uint16_t imm)
300 4c9649a9 j_mayer
{
301 4c9649a9 j_mayer
    gen_op_set_s32_T1((uint32_t)imm);
302 4c9649a9 j_mayer
}
303 4c9649a9 j_mayer
#endif
304 4c9649a9 j_mayer
305 f071b4d3 j_mayer
static always_inline void gen_set_sT0 (DisasContext *ctx, int64_t imm)
306 4c9649a9 j_mayer
{
307 4c9649a9 j_mayer
    int32_t imm32;
308 4c9649a9 j_mayer
    int16_t imm16;
309 4c9649a9 j_mayer
310 4c9649a9 j_mayer
    imm32 = imm;
311 4c9649a9 j_mayer
    if (imm32 == imm) {
312 4c9649a9 j_mayer
        imm16 = imm;
313 4c9649a9 j_mayer
        if (imm16 == imm) {
314 4c9649a9 j_mayer
            if (imm == 0) {
315 4c9649a9 j_mayer
                gen_op_reset_T0();
316 4c9649a9 j_mayer
            } else {
317 4c9649a9 j_mayer
                gen_op_set_s16_T0(imm16);
318 4c9649a9 j_mayer
            }
319 4c9649a9 j_mayer
        } else {
320 4c9649a9 j_mayer
            gen_op_set_s32_T0(imm32);
321 4c9649a9 j_mayer
        }
322 4c9649a9 j_mayer
    } else {
323 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
324 4c9649a9 j_mayer
        gen_op_set_64_T0(imm);
325 4c9649a9 j_mayer
#else
326 4c9649a9 j_mayer
        gen_op_set_64_T0(imm >> 32, imm);
327 4c9649a9 j_mayer
#endif
328 4c9649a9 j_mayer
    }
329 4c9649a9 j_mayer
}
330 4c9649a9 j_mayer
331 f071b4d3 j_mayer
static always_inline void gen_set_sT1 (DisasContext *ctx, int64_t imm)
332 4c9649a9 j_mayer
{
333 4c9649a9 j_mayer
    int32_t imm32;
334 4c9649a9 j_mayer
    int16_t imm16;
335 4c9649a9 j_mayer
336 4c9649a9 j_mayer
    imm32 = imm;
337 4c9649a9 j_mayer
    if (imm32 == imm) {
338 4c9649a9 j_mayer
        imm16 = imm;
339 4c9649a9 j_mayer
        if (imm16 == imm) {
340 4c9649a9 j_mayer
            if (imm == 0) {
341 4c9649a9 j_mayer
                gen_op_reset_T1();
342 4c9649a9 j_mayer
            } else {
343 4c9649a9 j_mayer
                gen_op_set_s16_T1(imm16);
344 4c9649a9 j_mayer
            }
345 4c9649a9 j_mayer
        } else {
346 4c9649a9 j_mayer
            gen_op_set_s32_T1(imm32);
347 4c9649a9 j_mayer
        }
348 4c9649a9 j_mayer
    } else {
349 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
350 4c9649a9 j_mayer
        gen_op_set_64_T1(imm);
351 4c9649a9 j_mayer
#else
352 4c9649a9 j_mayer
        gen_op_set_64_T1(imm >> 32, imm);
353 4c9649a9 j_mayer
#endif
354 4c9649a9 j_mayer
    }
355 4c9649a9 j_mayer
}
356 4c9649a9 j_mayer
357 f071b4d3 j_mayer
static always_inline void gen_set_uT0 (DisasContext *ctx, uint64_t imm)
358 4c9649a9 j_mayer
{
359 4c9649a9 j_mayer
    if (!(imm >> 32)) {
360 4c9649a9 j_mayer
        if ((!imm >> 16)) {
361 4c9649a9 j_mayer
            if (imm == 0)
362 4c9649a9 j_mayer
                gen_op_reset_T0();
363 4c9649a9 j_mayer
            else
364 4c9649a9 j_mayer
                gen_op_set_u16_T0(imm);
365 4c9649a9 j_mayer
        } else {
366 4c9649a9 j_mayer
            gen_op_set_u32_T0(imm);
367 4c9649a9 j_mayer
        }
368 4c9649a9 j_mayer
    } else {
369 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
370 4c9649a9 j_mayer
        gen_op_set_64_T0(imm);
371 4c9649a9 j_mayer
#else
372 4c9649a9 j_mayer
        gen_op_set_64_T0(imm >> 32, imm);
373 4c9649a9 j_mayer
#endif
374 4c9649a9 j_mayer
    }
375 4c9649a9 j_mayer
}
376 4c9649a9 j_mayer
377 f071b4d3 j_mayer
static always_inline void gen_set_uT1 (DisasContext *ctx, uint64_t imm)
378 4c9649a9 j_mayer
{
379 4c9649a9 j_mayer
    if (!(imm >> 32)) {
380 4c9649a9 j_mayer
        if ((!imm >> 16)) {
381 4c9649a9 j_mayer
            if (imm == 0)
382 4c9649a9 j_mayer
                gen_op_reset_T1();
383 4c9649a9 j_mayer
            else
384 4c9649a9 j_mayer
                gen_op_set_u16_T1(imm);
385 4c9649a9 j_mayer
        } else {
386 4c9649a9 j_mayer
            gen_op_set_u32_T1(imm);
387 4c9649a9 j_mayer
        }
388 4c9649a9 j_mayer
    } else {
389 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
390 4c9649a9 j_mayer
        gen_op_set_64_T1(imm);
391 4c9649a9 j_mayer
#else
392 4c9649a9 j_mayer
        gen_op_set_64_T1(imm >> 32, imm);
393 4c9649a9 j_mayer
#endif
394 4c9649a9 j_mayer
    }
395 4c9649a9 j_mayer
}
396 4c9649a9 j_mayer
397 f071b4d3 j_mayer
static always_inline void _gen_op_bcond (DisasContext *ctx)
398 4c9649a9 j_mayer
{
399 4c9649a9 j_mayer
#if 0 // Qemu does not know how to do this...
400 4c9649a9 j_mayer
    gen_op_bcond(ctx->pc);
401 4c9649a9 j_mayer
#else
402 4c9649a9 j_mayer
    gen_op_bcond(ctx->pc >> 32, ctx->pc);
403 4c9649a9 j_mayer
#endif
404 4c9649a9 j_mayer
}
405 4c9649a9 j_mayer
406 f071b4d3 j_mayer
static always_inline void gen_excp (DisasContext *ctx,
407 f071b4d3 j_mayer
                                    int exception, int error_code)
408 4c9649a9 j_mayer
{
409 496cb5b9 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
410 4c9649a9 j_mayer
    gen_op_excp(exception, error_code);
411 4c9649a9 j_mayer
}
412 4c9649a9 j_mayer
413 f071b4d3 j_mayer
static always_inline void gen_invalid (DisasContext *ctx)
414 4c9649a9 j_mayer
{
415 4c9649a9 j_mayer
    gen_excp(ctx, EXCP_OPCDEC, 0);
416 4c9649a9 j_mayer
}
417 4c9649a9 j_mayer
418 f071b4d3 j_mayer
static always_inline void gen_load_mem (DisasContext *ctx,
419 f071b4d3 j_mayer
                                        void (*gen_load_op)(DisasContext *ctx),
420 f071b4d3 j_mayer
                                        int ra, int rb, int32_t disp16,
421 f071b4d3 j_mayer
                                        int clear)
422 4c9649a9 j_mayer
{
423 4c9649a9 j_mayer
    if (ra == 31 && disp16 == 0) {
424 4c9649a9 j_mayer
        /* UNOP */
425 4c9649a9 j_mayer
        gen_op_nop();
426 4c9649a9 j_mayer
    } else {
427 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
428 4c9649a9 j_mayer
        if (disp16 != 0) {
429 4c9649a9 j_mayer
            gen_set_sT1(ctx, disp16);
430 4c9649a9 j_mayer
            gen_op_addq();
431 4c9649a9 j_mayer
        }
432 4c9649a9 j_mayer
        if (clear)
433 4c9649a9 j_mayer
            gen_op_n7();
434 4c9649a9 j_mayer
        (*gen_load_op)(ctx);
435 4c9649a9 j_mayer
        gen_store_ir(ctx, ra, 1);
436 4c9649a9 j_mayer
    }
437 4c9649a9 j_mayer
}
438 4c9649a9 j_mayer
439 f071b4d3 j_mayer
static always_inline void gen_store_mem (DisasContext *ctx,
440 f071b4d3 j_mayer
                                         void (*gen_store_op)(DisasContext *ctx),
441 f071b4d3 j_mayer
                                         int ra, int rb, int32_t disp16,
442 f071b4d3 j_mayer
                                         int clear)
443 4c9649a9 j_mayer
{
444 4c9649a9 j_mayer
    gen_load_ir(ctx, rb, 0);
445 4c9649a9 j_mayer
    if (disp16 != 0) {
446 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp16);
447 4c9649a9 j_mayer
        gen_op_addq();
448 4c9649a9 j_mayer
    }
449 4c9649a9 j_mayer
    if (clear)
450 4c9649a9 j_mayer
        gen_op_n7();
451 4c9649a9 j_mayer
    gen_load_ir(ctx, ra, 1);
452 4c9649a9 j_mayer
    (*gen_store_op)(ctx);
453 4c9649a9 j_mayer
}
454 4c9649a9 j_mayer
455 f071b4d3 j_mayer
static always_inline void gen_load_fmem (DisasContext *ctx,
456 f071b4d3 j_mayer
                                         void (*gen_load_fop)(DisasContext *ctx),
457 f071b4d3 j_mayer
                                         int ra, int rb, int32_t disp16)
458 4c9649a9 j_mayer
{
459 4c9649a9 j_mayer
    gen_load_ir(ctx, rb, 0);
460 4c9649a9 j_mayer
    if (disp16 != 0) {
461 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp16);
462 4c9649a9 j_mayer
        gen_op_addq();
463 4c9649a9 j_mayer
    }
464 4c9649a9 j_mayer
    (*gen_load_fop)(ctx);
465 4c9649a9 j_mayer
    gen_store_fir(ctx, ra, 1);
466 4c9649a9 j_mayer
}
467 4c9649a9 j_mayer
468 f071b4d3 j_mayer
static always_inline void gen_store_fmem (DisasContext *ctx,
469 f071b4d3 j_mayer
                                          void (*gen_store_fop)(DisasContext *ctx),
470 f071b4d3 j_mayer
                                          int ra, int rb, int32_t disp16)
471 4c9649a9 j_mayer
{
472 4c9649a9 j_mayer
    gen_load_ir(ctx, rb, 0);
473 4c9649a9 j_mayer
    if (disp16 != 0) {
474 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp16);
475 4c9649a9 j_mayer
        gen_op_addq();
476 4c9649a9 j_mayer
    }
477 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 1);
478 4c9649a9 j_mayer
    (*gen_store_fop)(ctx);
479 4c9649a9 j_mayer
}
480 4c9649a9 j_mayer
481 f071b4d3 j_mayer
static always_inline void gen_bcond (DisasContext *ctx,
482 f071b4d3 j_mayer
                                     void (*gen_test_op)(void),
483 f071b4d3 j_mayer
                                     int ra, int32_t disp16)
484 4c9649a9 j_mayer
{
485 4c9649a9 j_mayer
    if (disp16 != 0) {
486 4c9649a9 j_mayer
        gen_set_uT0(ctx, ctx->pc);
487 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp16 << 2);
488 4c9649a9 j_mayer
        gen_op_addq1();
489 4c9649a9 j_mayer
    } else {
490 4c9649a9 j_mayer
        gen_set_uT1(ctx, ctx->pc);
491 4c9649a9 j_mayer
    }
492 4c9649a9 j_mayer
    gen_load_ir(ctx, ra, 0);
493 4c9649a9 j_mayer
    (*gen_test_op)();
494 4c9649a9 j_mayer
    _gen_op_bcond(ctx);
495 4c9649a9 j_mayer
}
496 4c9649a9 j_mayer
497 f071b4d3 j_mayer
static always_inline void gen_fbcond (DisasContext *ctx,
498 f071b4d3 j_mayer
                                      void (*gen_test_op)(void),
499 f071b4d3 j_mayer
                                      int ra, int32_t disp16)
500 4c9649a9 j_mayer
{
501 4c9649a9 j_mayer
    if (disp16 != 0) {
502 4c9649a9 j_mayer
        gen_set_uT0(ctx, ctx->pc);
503 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp16 << 2);
504 4c9649a9 j_mayer
        gen_op_addq1();
505 4c9649a9 j_mayer
    } else {
506 4c9649a9 j_mayer
        gen_set_uT1(ctx, ctx->pc);
507 4c9649a9 j_mayer
    }
508 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
509 4c9649a9 j_mayer
    (*gen_test_op)();
510 4c9649a9 j_mayer
    _gen_op_bcond(ctx);
511 4c9649a9 j_mayer
}
512 4c9649a9 j_mayer
513 f071b4d3 j_mayer
static always_inline void gen_arith2 (DisasContext *ctx,
514 f071b4d3 j_mayer
                                      void (*gen_arith_op)(void),
515 f071b4d3 j_mayer
                                      int rb, int rc, int islit, int8_t lit)
516 4c9649a9 j_mayer
{
517 4c9649a9 j_mayer
    if (islit)
518 4c9649a9 j_mayer
        gen_set_sT0(ctx, lit);
519 4c9649a9 j_mayer
    else
520 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
521 4c9649a9 j_mayer
    (*gen_arith_op)();
522 4c9649a9 j_mayer
    gen_store_ir(ctx, rc, 0);
523 4c9649a9 j_mayer
}
524 4c9649a9 j_mayer
525 f071b4d3 j_mayer
static always_inline void gen_arith3 (DisasContext *ctx,
526 f071b4d3 j_mayer
                                      void (*gen_arith_op)(void),
527 f071b4d3 j_mayer
                                      int ra, int rb, int rc,
528 f071b4d3 j_mayer
                                      int islit, int8_t lit)
529 4c9649a9 j_mayer
{
530 4c9649a9 j_mayer
    gen_load_ir(ctx, ra, 0);
531 4c9649a9 j_mayer
    if (islit)
532 4c9649a9 j_mayer
        gen_set_sT1(ctx, lit);
533 4c9649a9 j_mayer
    else
534 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 1);
535 4c9649a9 j_mayer
    (*gen_arith_op)();
536 4c9649a9 j_mayer
    gen_store_ir(ctx, rc, 0);
537 4c9649a9 j_mayer
}
538 4c9649a9 j_mayer
539 f071b4d3 j_mayer
static always_inline void gen_cmov (DisasContext *ctx,
540 f071b4d3 j_mayer
                                    void (*gen_test_op)(void),
541 f071b4d3 j_mayer
                                    int ra, int rb, int rc,
542 f071b4d3 j_mayer
                                    int islit, int8_t lit)
543 4c9649a9 j_mayer
{
544 4c9649a9 j_mayer
    gen_load_ir(ctx, ra, 1);
545 4c9649a9 j_mayer
    if (islit)
546 4c9649a9 j_mayer
        gen_set_sT0(ctx, lit);
547 4c9649a9 j_mayer
    else
548 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
549 4c9649a9 j_mayer
    (*gen_test_op)();
550 4c9649a9 j_mayer
    gen_op_cmov_ir(rc);
551 4c9649a9 j_mayer
}
552 4c9649a9 j_mayer
553 f071b4d3 j_mayer
static always_inline void gen_farith2 (DisasContext *ctx,
554 f071b4d3 j_mayer
                                       void (*gen_arith_fop)(void),
555 f071b4d3 j_mayer
                                       int rb, int rc)
556 4c9649a9 j_mayer
{
557 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 0);
558 4c9649a9 j_mayer
    (*gen_arith_fop)();
559 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
560 4c9649a9 j_mayer
}
561 4c9649a9 j_mayer
562 f071b4d3 j_mayer
static always_inline void gen_farith3 (DisasContext *ctx,
563 f071b4d3 j_mayer
                                       void (*gen_arith_fop)(void),
564 f071b4d3 j_mayer
                                       int ra, int rb, int rc)
565 4c9649a9 j_mayer
{
566 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
567 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 1);
568 4c9649a9 j_mayer
    (*gen_arith_fop)();
569 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
570 4c9649a9 j_mayer
}
571 4c9649a9 j_mayer
572 f071b4d3 j_mayer
static always_inline void gen_fcmov (DisasContext *ctx,
573 f071b4d3 j_mayer
                                     void (*gen_test_fop)(void),
574 f071b4d3 j_mayer
                                     int ra, int rb, int rc)
575 4c9649a9 j_mayer
{
576 4c9649a9 j_mayer
    gen_load_fir(ctx, ra, 0);
577 4c9649a9 j_mayer
    gen_load_fir(ctx, rb, 1);
578 4c9649a9 j_mayer
    (*gen_test_fop)();
579 4c9649a9 j_mayer
    gen_op_cmov_fir(rc);
580 4c9649a9 j_mayer
}
581 4c9649a9 j_mayer
582 f071b4d3 j_mayer
static always_inline void gen_fti (DisasContext *ctx,
583 f071b4d3 j_mayer
                                   void (*gen_move_fop)(void),
584 f071b4d3 j_mayer
                                   int ra, int rc)
585 4c9649a9 j_mayer
{
586 4c9649a9 j_mayer
    gen_load_fir(ctx, rc, 0);
587 4c9649a9 j_mayer
    (*gen_move_fop)();
588 4c9649a9 j_mayer
    gen_store_ir(ctx, ra, 0);
589 4c9649a9 j_mayer
}
590 4c9649a9 j_mayer
591 f071b4d3 j_mayer
static always_inline void gen_itf (DisasContext *ctx,
592 f071b4d3 j_mayer
                                   void (*gen_move_fop)(void),
593 f071b4d3 j_mayer
                                   int ra, int rc)
594 4c9649a9 j_mayer
{
595 4c9649a9 j_mayer
    gen_load_ir(ctx, ra, 0);
596 4c9649a9 j_mayer
    (*gen_move_fop)();
597 4c9649a9 j_mayer
    gen_store_fir(ctx, rc, 0);
598 4c9649a9 j_mayer
}
599 4c9649a9 j_mayer
600 f071b4d3 j_mayer
static always_inline void gen_s4addl (void)
601 4c9649a9 j_mayer
{
602 4c9649a9 j_mayer
    gen_op_s4();
603 4c9649a9 j_mayer
    gen_op_addl();
604 5fafdf24 ths
}
605 4c9649a9 j_mayer
606 f071b4d3 j_mayer
static always_inline void gen_s4subl (void)
607 4c9649a9 j_mayer
{
608 4c9649a9 j_mayer
    gen_op_s4();
609 4c9649a9 j_mayer
    gen_op_subl();
610 5fafdf24 ths
}
611 4c9649a9 j_mayer
612 f071b4d3 j_mayer
static always_inline void gen_s8addl (void)
613 4c9649a9 j_mayer
{
614 4c9649a9 j_mayer
    gen_op_s8();
615 4c9649a9 j_mayer
    gen_op_addl();
616 5fafdf24 ths
}
617 4c9649a9 j_mayer
618 f071b4d3 j_mayer
static always_inline void gen_s8subl (void)
619 4c9649a9 j_mayer
{
620 4c9649a9 j_mayer
    gen_op_s8();
621 4c9649a9 j_mayer
    gen_op_subl();
622 5fafdf24 ths
}
623 4c9649a9 j_mayer
624 f071b4d3 j_mayer
static always_inline void gen_s4addq (void)
625 4c9649a9 j_mayer
{
626 4c9649a9 j_mayer
    gen_op_s4();
627 4c9649a9 j_mayer
    gen_op_addq();
628 5fafdf24 ths
}
629 4c9649a9 j_mayer
630 f071b4d3 j_mayer
static always_inline void gen_s4subq (void)
631 4c9649a9 j_mayer
{
632 4c9649a9 j_mayer
    gen_op_s4();
633 4c9649a9 j_mayer
    gen_op_subq();
634 5fafdf24 ths
}
635 4c9649a9 j_mayer
636 f071b4d3 j_mayer
static always_inline void gen_s8addq (void)
637 4c9649a9 j_mayer
{
638 4c9649a9 j_mayer
    gen_op_s8();
639 4c9649a9 j_mayer
    gen_op_addq();
640 5fafdf24 ths
}
641 4c9649a9 j_mayer
642 f071b4d3 j_mayer
static always_inline void gen_s8subq (void)
643 4c9649a9 j_mayer
{
644 4c9649a9 j_mayer
    gen_op_s8();
645 4c9649a9 j_mayer
    gen_op_subq();
646 5fafdf24 ths
}
647 4c9649a9 j_mayer
648 f071b4d3 j_mayer
static always_inline void gen_amask (void)
649 4c9649a9 j_mayer
{
650 4c9649a9 j_mayer
    gen_op_load_amask();
651 4c9649a9 j_mayer
    gen_op_bic();
652 4c9649a9 j_mayer
}
653 4c9649a9 j_mayer
654 f071b4d3 j_mayer
static always_inline int translate_one (DisasContext *ctx, uint32_t insn)
655 4c9649a9 j_mayer
{
656 4c9649a9 j_mayer
    uint32_t palcode;
657 4c9649a9 j_mayer
    int32_t disp21, disp16, disp12;
658 4c9649a9 j_mayer
    uint16_t fn11, fn16;
659 4c9649a9 j_mayer
    uint8_t opc, ra, rb, rc, sbz, fpfn, fn7, fn2, islit;
660 4c9649a9 j_mayer
    int8_t lit;
661 4c9649a9 j_mayer
    int ret;
662 4c9649a9 j_mayer
663 4c9649a9 j_mayer
    /* Decode all instruction fields */
664 4c9649a9 j_mayer
    opc = insn >> 26;
665 4c9649a9 j_mayer
    ra = (insn >> 21) & 0x1F;
666 4c9649a9 j_mayer
    rb = (insn >> 16) & 0x1F;
667 4c9649a9 j_mayer
    rc = insn & 0x1F;
668 4c9649a9 j_mayer
    sbz = (insn >> 13) & 0x07;
669 4c9649a9 j_mayer
    islit = (insn >> 12) & 1;
670 4c9649a9 j_mayer
    lit = (insn >> 13) & 0xFF;
671 4c9649a9 j_mayer
    palcode = insn & 0x03FFFFFF;
672 4c9649a9 j_mayer
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
673 4c9649a9 j_mayer
    disp16 = (int16_t)(insn & 0x0000FFFF);
674 4c9649a9 j_mayer
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
675 4c9649a9 j_mayer
    fn16 = insn & 0x0000FFFF;
676 4c9649a9 j_mayer
    fn11 = (insn >> 5) & 0x000007FF;
677 4c9649a9 j_mayer
    fpfn = fn11 & 0x3F;
678 4c9649a9 j_mayer
    fn7 = (insn >> 5) & 0x0000007F;
679 4c9649a9 j_mayer
    fn2 = (insn >> 5) & 0x00000003;
680 4c9649a9 j_mayer
    ret = 0;
681 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
682 4c9649a9 j_mayer
    if (logfile != NULL) {
683 4c9649a9 j_mayer
        fprintf(logfile, "opc %02x ra %d rb %d rc %d disp16 %04x\n",
684 4c9649a9 j_mayer
                opc, ra, rb, rc, disp16);
685 4c9649a9 j_mayer
    }
686 4c9649a9 j_mayer
#endif
687 4c9649a9 j_mayer
    switch (opc) {
688 4c9649a9 j_mayer
    case 0x00:
689 4c9649a9 j_mayer
        /* CALL_PAL */
690 4c9649a9 j_mayer
        if (palcode >= 0x80 && palcode < 0xC0) {
691 4c9649a9 j_mayer
            /* Unprivileged PAL call */
692 4c9649a9 j_mayer
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x1F) << 6), 0);
693 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
694 4c9649a9 j_mayer
        } else if (palcode < 0x40) {
695 4c9649a9 j_mayer
            /* Privileged PAL code */
696 4c9649a9 j_mayer
            if (ctx->mem_idx & 1)
697 4c9649a9 j_mayer
                goto invalid_opc;
698 4c9649a9 j_mayer
            else
699 4c9649a9 j_mayer
                gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x1F) << 6), 0);
700 4c9649a9 j_mayer
#endif
701 4c9649a9 j_mayer
        } else {
702 4c9649a9 j_mayer
            /* Invalid PAL call */
703 4c9649a9 j_mayer
            goto invalid_opc;
704 4c9649a9 j_mayer
        }
705 4c9649a9 j_mayer
        ret = 3;
706 4c9649a9 j_mayer
        break;
707 4c9649a9 j_mayer
    case 0x01:
708 4c9649a9 j_mayer
        /* OPC01 */
709 4c9649a9 j_mayer
        goto invalid_opc;
710 4c9649a9 j_mayer
    case 0x02:
711 4c9649a9 j_mayer
        /* OPC02 */
712 4c9649a9 j_mayer
        goto invalid_opc;
713 4c9649a9 j_mayer
    case 0x03:
714 4c9649a9 j_mayer
        /* OPC03 */
715 4c9649a9 j_mayer
        goto invalid_opc;
716 4c9649a9 j_mayer
    case 0x04:
717 4c9649a9 j_mayer
        /* OPC04 */
718 4c9649a9 j_mayer
        goto invalid_opc;
719 4c9649a9 j_mayer
    case 0x05:
720 4c9649a9 j_mayer
        /* OPC05 */
721 4c9649a9 j_mayer
        goto invalid_opc;
722 4c9649a9 j_mayer
    case 0x06:
723 4c9649a9 j_mayer
        /* OPC06 */
724 4c9649a9 j_mayer
        goto invalid_opc;
725 4c9649a9 j_mayer
    case 0x07:
726 4c9649a9 j_mayer
        /* OPC07 */
727 4c9649a9 j_mayer
        goto invalid_opc;
728 4c9649a9 j_mayer
    case 0x08:
729 4c9649a9 j_mayer
        /* LDA */
730 496cb5b9 aurel32
        {
731 496cb5b9 aurel32
            TCGv v = tcg_const_i64(disp16);
732 496cb5b9 aurel32
            if (rb != 31)
733 496cb5b9 aurel32
                tcg_gen_add_i64(v, cpu_ir[rb], v);
734 496cb5b9 aurel32
            set_ir(v, ra);
735 496cb5b9 aurel32
            tcg_temp_free(v);
736 496cb5b9 aurel32
        }
737 4c9649a9 j_mayer
        break;
738 4c9649a9 j_mayer
    case 0x09:
739 4c9649a9 j_mayer
        /* LDAH */
740 496cb5b9 aurel32
        {
741 496cb5b9 aurel32
            TCGv v = tcg_const_i64(disp16 << 16);
742 496cb5b9 aurel32
            if (rb != 31)
743 496cb5b9 aurel32
                tcg_gen_add_i64(v, cpu_ir[rb], v);
744 496cb5b9 aurel32
            set_ir(v, ra);
745 496cb5b9 aurel32
            tcg_temp_free(v);
746 496cb5b9 aurel32
        }
747 4c9649a9 j_mayer
        break;
748 4c9649a9 j_mayer
    case 0x0A:
749 4c9649a9 j_mayer
        /* LDBU */
750 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
751 4c9649a9 j_mayer
            goto invalid_opc;
752 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldbu, ra, rb, disp16, 0);
753 4c9649a9 j_mayer
        break;
754 4c9649a9 j_mayer
    case 0x0B:
755 4c9649a9 j_mayer
        /* LDQ_U */
756 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq_u, ra, rb, disp16, 1);
757 4c9649a9 j_mayer
        break;
758 4c9649a9 j_mayer
    case 0x0C:
759 4c9649a9 j_mayer
        /* LDWU */
760 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
761 4c9649a9 j_mayer
            goto invalid_opc;
762 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldwu, ra, rb, disp16, 0);
763 4c9649a9 j_mayer
        break;
764 4c9649a9 j_mayer
    case 0x0D:
765 4c9649a9 j_mayer
        /* STW */
766 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
767 4c9649a9 j_mayer
            goto invalid_opc;
768 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stw, ra, rb, disp16, 0);
769 4c9649a9 j_mayer
        break;
770 4c9649a9 j_mayer
    case 0x0E:
771 4c9649a9 j_mayer
        /* STB */
772 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
773 4c9649a9 j_mayer
            goto invalid_opc;
774 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stb, ra, rb, disp16, 0);
775 4c9649a9 j_mayer
        break;
776 4c9649a9 j_mayer
    case 0x0F:
777 4c9649a9 j_mayer
        /* STQ_U */
778 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq_u, ra, rb, disp16, 1);
779 4c9649a9 j_mayer
        break;
780 4c9649a9 j_mayer
    case 0x10:
781 4c9649a9 j_mayer
        switch (fn7) {
782 4c9649a9 j_mayer
        case 0x00:
783 4c9649a9 j_mayer
            /* ADDL */
784 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addl, ra, rb, rc, islit, lit);
785 4c9649a9 j_mayer
            break;
786 4c9649a9 j_mayer
        case 0x02:
787 4c9649a9 j_mayer
            /* S4ADDL */
788 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s4addl, ra, rb, rc, islit, lit);
789 4c9649a9 j_mayer
            break;
790 4c9649a9 j_mayer
        case 0x09:
791 4c9649a9 j_mayer
            /* SUBL */
792 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_subl, ra, rb, rc, islit, lit);
793 4c9649a9 j_mayer
            break;
794 4c9649a9 j_mayer
        case 0x0B:
795 4c9649a9 j_mayer
            /* S4SUBL */
796 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s4subl, ra, rb, rc, islit, lit);
797 4c9649a9 j_mayer
            break;
798 4c9649a9 j_mayer
        case 0x0F:
799 4c9649a9 j_mayer
            /* CMPBGE */
800 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmpbge, ra, rb, rc, islit, lit);
801 4c9649a9 j_mayer
            break;
802 4c9649a9 j_mayer
        case 0x12:
803 4c9649a9 j_mayer
            /* S8ADDL */
804 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s8addl, ra, rb, rc, islit, lit);
805 4c9649a9 j_mayer
            break;
806 4c9649a9 j_mayer
        case 0x1B:
807 4c9649a9 j_mayer
            /* S8SUBL */
808 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s8subl, ra, rb, rc, islit, lit);
809 4c9649a9 j_mayer
            break;
810 4c9649a9 j_mayer
        case 0x1D:
811 4c9649a9 j_mayer
            /* CMPULT */
812 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmpult, ra, rb, rc, islit, lit);
813 4c9649a9 j_mayer
            break;
814 4c9649a9 j_mayer
        case 0x20:
815 4c9649a9 j_mayer
            /* ADDQ */
816 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addq, ra, rb, rc, islit, lit);
817 4c9649a9 j_mayer
            break;
818 4c9649a9 j_mayer
        case 0x22:
819 4c9649a9 j_mayer
            /* S4ADDQ */
820 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s4addq, ra, rb, rc, islit, lit);
821 4c9649a9 j_mayer
            break;
822 4c9649a9 j_mayer
        case 0x29:
823 4c9649a9 j_mayer
            /* SUBQ */
824 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_subq, ra, rb, rc, islit, lit);
825 4c9649a9 j_mayer
            break;
826 4c9649a9 j_mayer
        case 0x2B:
827 4c9649a9 j_mayer
            /* S4SUBQ */
828 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s4subq, ra, rb, rc, islit, lit);
829 4c9649a9 j_mayer
            break;
830 4c9649a9 j_mayer
        case 0x2D:
831 4c9649a9 j_mayer
            /* CMPEQ */
832 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmpeq, ra, rb, rc, islit, lit);
833 4c9649a9 j_mayer
            break;
834 4c9649a9 j_mayer
        case 0x32:
835 4c9649a9 j_mayer
            /* S8ADDQ */
836 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s8addq, ra, rb, rc, islit, lit);
837 4c9649a9 j_mayer
            break;
838 4c9649a9 j_mayer
        case 0x3B:
839 4c9649a9 j_mayer
            /* S8SUBQ */
840 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_s8subq, ra, rb, rc, islit, lit);
841 4c9649a9 j_mayer
            break;
842 4c9649a9 j_mayer
        case 0x3D:
843 4c9649a9 j_mayer
            /* CMPULE */
844 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmpule, ra, rb, rc, islit, lit);
845 4c9649a9 j_mayer
            break;
846 4c9649a9 j_mayer
        case 0x40:
847 4c9649a9 j_mayer
            /* ADDL/V */
848 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addlv, ra, rb, rc, islit, lit);
849 4c9649a9 j_mayer
            break;
850 4c9649a9 j_mayer
        case 0x49:
851 4c9649a9 j_mayer
            /* SUBL/V */
852 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_sublv, ra, rb, rc, islit, lit);
853 4c9649a9 j_mayer
            break;
854 4c9649a9 j_mayer
        case 0x4D:
855 4c9649a9 j_mayer
            /* CMPLT */
856 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmplt, ra, rb, rc, islit, lit);
857 4c9649a9 j_mayer
            break;
858 4c9649a9 j_mayer
        case 0x60:
859 4c9649a9 j_mayer
            /* ADDQ/V */
860 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_addqv, ra, rb, rc, islit, lit);
861 4c9649a9 j_mayer
            break;
862 4c9649a9 j_mayer
        case 0x69:
863 4c9649a9 j_mayer
            /* SUBQ/V */
864 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_subqv, ra, rb, rc, islit, lit);
865 4c9649a9 j_mayer
            break;
866 4c9649a9 j_mayer
        case 0x6D:
867 4c9649a9 j_mayer
            /* CMPLE */
868 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_cmple, ra, rb, rc, islit, lit);
869 4c9649a9 j_mayer
            break;
870 4c9649a9 j_mayer
        default:
871 4c9649a9 j_mayer
            goto invalid_opc;
872 4c9649a9 j_mayer
        }
873 4c9649a9 j_mayer
        break;
874 4c9649a9 j_mayer
    case 0x11:
875 4c9649a9 j_mayer
        switch (fn7) {
876 4c9649a9 j_mayer
        case 0x00:
877 4c9649a9 j_mayer
            /* AND */
878 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_and, ra, rb, rc, islit, lit);
879 4c9649a9 j_mayer
            break;
880 4c9649a9 j_mayer
        case 0x08:
881 4c9649a9 j_mayer
            /* BIC */
882 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_bic, ra, rb, rc, islit, lit);
883 4c9649a9 j_mayer
            break;
884 4c9649a9 j_mayer
        case 0x14:
885 4c9649a9 j_mayer
            /* CMOVLBS */
886 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmplbs, ra, rb, rc, islit, lit);
887 4c9649a9 j_mayer
            break;
888 4c9649a9 j_mayer
        case 0x16:
889 4c9649a9 j_mayer
            /* CMOVLBC */
890 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmplbc, ra, rb, rc, islit, lit);
891 4c9649a9 j_mayer
            break;
892 4c9649a9 j_mayer
        case 0x20:
893 4c9649a9 j_mayer
            /* BIS */
894 4c9649a9 j_mayer
            if (ra == rb || ra == 31 || rb == 31) {
895 4c9649a9 j_mayer
                if (ra == 31 && rc == 31) {
896 4c9649a9 j_mayer
                    /* NOP */
897 4c9649a9 j_mayer
                    gen_op_nop();
898 4c9649a9 j_mayer
                } else {
899 4c9649a9 j_mayer
                    /* MOV */
900 4c9649a9 j_mayer
                    gen_load_ir(ctx, rb, 0);
901 4c9649a9 j_mayer
                    gen_store_ir(ctx, rc, 0);
902 4c9649a9 j_mayer
                }
903 4c9649a9 j_mayer
            } else {
904 4c9649a9 j_mayer
                gen_arith3(ctx, &gen_op_bis, ra, rb, rc, islit, lit);
905 4c9649a9 j_mayer
            }
906 4c9649a9 j_mayer
            break;
907 4c9649a9 j_mayer
        case 0x24:
908 4c9649a9 j_mayer
            /* CMOVEQ */
909 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmpeqz, ra, rb, rc, islit, lit);
910 4c9649a9 j_mayer
            break;
911 4c9649a9 j_mayer
        case 0x26:
912 4c9649a9 j_mayer
            /* CMOVNE */
913 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmpnez, ra, rb, rc, islit, lit);
914 4c9649a9 j_mayer
            break;
915 4c9649a9 j_mayer
        case 0x28:
916 4c9649a9 j_mayer
            /* ORNOT */
917 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_ornot, ra, rb, rc, islit, lit);
918 4c9649a9 j_mayer
            break;
919 4c9649a9 j_mayer
        case 0x40:
920 4c9649a9 j_mayer
            /* XOR */
921 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_xor, ra, rb, rc, islit, lit);
922 4c9649a9 j_mayer
            break;
923 4c9649a9 j_mayer
        case 0x44:
924 4c9649a9 j_mayer
            /* CMOVLT */
925 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmpltz, ra, rb, rc, islit, lit);
926 4c9649a9 j_mayer
            break;
927 4c9649a9 j_mayer
        case 0x46:
928 4c9649a9 j_mayer
            /* CMOVGE */
929 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmpgez, ra, rb, rc, islit, lit);
930 4c9649a9 j_mayer
            break;
931 4c9649a9 j_mayer
        case 0x48:
932 4c9649a9 j_mayer
            /* EQV */
933 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_eqv, ra, rb, rc, islit, lit);
934 4c9649a9 j_mayer
            break;
935 4c9649a9 j_mayer
        case 0x61:
936 4c9649a9 j_mayer
            /* AMASK */
937 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_amask, rb, rc, islit, lit);
938 4c9649a9 j_mayer
            break;
939 4c9649a9 j_mayer
        case 0x64:
940 4c9649a9 j_mayer
            /* CMOVLE */
941 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmplez, ra, rb, rc, islit, lit);
942 4c9649a9 j_mayer
            break;
943 4c9649a9 j_mayer
        case 0x66:
944 4c9649a9 j_mayer
            /* CMOVGT */
945 4c9649a9 j_mayer
            gen_cmov(ctx, &gen_op_cmpgtz, ra, rb, rc, islit, lit);
946 4c9649a9 j_mayer
            break;
947 4c9649a9 j_mayer
        case 0x6C:
948 4c9649a9 j_mayer
            /* IMPLVER */
949 4c9649a9 j_mayer
            gen_op_load_implver();
950 4c9649a9 j_mayer
            gen_store_ir(ctx, rc, 0);
951 4c9649a9 j_mayer
            break;
952 4c9649a9 j_mayer
        default:
953 4c9649a9 j_mayer
            goto invalid_opc;
954 4c9649a9 j_mayer
        }
955 4c9649a9 j_mayer
        break;
956 4c9649a9 j_mayer
    case 0x12:
957 4c9649a9 j_mayer
        switch (fn7) {
958 4c9649a9 j_mayer
        case 0x02:
959 4c9649a9 j_mayer
            /* MSKBL */
960 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskbl, ra, rb, rc, islit, lit);
961 4c9649a9 j_mayer
            break;
962 4c9649a9 j_mayer
        case 0x06:
963 4c9649a9 j_mayer
            /* EXTBL */
964 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extbl, ra, rb, rc, islit, lit);
965 4c9649a9 j_mayer
            break;
966 4c9649a9 j_mayer
        case 0x0B:
967 4c9649a9 j_mayer
            /* INSBL */
968 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_insbl, ra, rb, rc, islit, lit);
969 4c9649a9 j_mayer
            break;
970 4c9649a9 j_mayer
        case 0x12:
971 4c9649a9 j_mayer
            /* MSKWL */
972 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskwl, ra, rb, rc, islit, lit);
973 4c9649a9 j_mayer
            break;
974 4c9649a9 j_mayer
        case 0x16:
975 4c9649a9 j_mayer
            /* EXTWL */
976 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extwl, ra, rb, rc, islit, lit);
977 4c9649a9 j_mayer
            break;
978 4c9649a9 j_mayer
        case 0x1B:
979 4c9649a9 j_mayer
            /* INSWL */
980 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_inswl, ra, rb, rc, islit, lit);
981 4c9649a9 j_mayer
            break;
982 4c9649a9 j_mayer
        case 0x22:
983 4c9649a9 j_mayer
            /* MSKLL */
984 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskll, ra, rb, rc, islit, lit);
985 4c9649a9 j_mayer
            break;
986 4c9649a9 j_mayer
        case 0x26:
987 4c9649a9 j_mayer
            /* EXTLL */
988 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extll, ra, rb, rc, islit, lit);
989 4c9649a9 j_mayer
            break;
990 4c9649a9 j_mayer
        case 0x2B:
991 4c9649a9 j_mayer
            /* INSLL */
992 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_insll, ra, rb, rc, islit, lit);
993 4c9649a9 j_mayer
            break;
994 4c9649a9 j_mayer
        case 0x30:
995 4c9649a9 j_mayer
            /* ZAP */
996 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_zap, ra, rb, rc, islit, lit);
997 4c9649a9 j_mayer
            break;
998 4c9649a9 j_mayer
        case 0x31:
999 4c9649a9 j_mayer
            /* ZAPNOT */
1000 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_zapnot, ra, rb, rc, islit, lit);
1001 4c9649a9 j_mayer
            break;
1002 4c9649a9 j_mayer
        case 0x32:
1003 4c9649a9 j_mayer
            /* MSKQL */
1004 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskql, ra, rb, rc, islit, lit);
1005 4c9649a9 j_mayer
            break;
1006 4c9649a9 j_mayer
        case 0x34:
1007 4c9649a9 j_mayer
            /* SRL */
1008 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_srl, ra, rb, rc, islit, lit);
1009 4c9649a9 j_mayer
            break;
1010 4c9649a9 j_mayer
        case 0x36:
1011 4c9649a9 j_mayer
            /* EXTQL */
1012 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extql, ra, rb, rc, islit, lit);
1013 4c9649a9 j_mayer
            break;
1014 4c9649a9 j_mayer
        case 0x39:
1015 4c9649a9 j_mayer
            /* SLL */
1016 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_sll, ra, rb, rc, islit, lit);
1017 4c9649a9 j_mayer
            break;
1018 4c9649a9 j_mayer
        case 0x3B:
1019 4c9649a9 j_mayer
            /* INSQL */
1020 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_insql, ra, rb, rc, islit, lit);
1021 4c9649a9 j_mayer
            break;
1022 4c9649a9 j_mayer
        case 0x3C:
1023 4c9649a9 j_mayer
            /* SRA */
1024 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_sra, ra, rb, rc, islit, lit);
1025 4c9649a9 j_mayer
            break;
1026 4c9649a9 j_mayer
        case 0x52:
1027 4c9649a9 j_mayer
            /* MSKWH */
1028 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskwh, ra, rb, rc, islit, lit);
1029 4c9649a9 j_mayer
            break;
1030 4c9649a9 j_mayer
        case 0x57:
1031 4c9649a9 j_mayer
            /* INSWH */
1032 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_inswh, ra, rb, rc, islit, lit);
1033 4c9649a9 j_mayer
            break;
1034 4c9649a9 j_mayer
        case 0x5A:
1035 4c9649a9 j_mayer
            /* EXTWH */
1036 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extwh, ra, rb, rc, islit, lit);
1037 4c9649a9 j_mayer
            break;
1038 4c9649a9 j_mayer
        case 0x62:
1039 4c9649a9 j_mayer
            /* MSKLH */
1040 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_msklh, ra, rb, rc, islit, lit);
1041 4c9649a9 j_mayer
            break;
1042 4c9649a9 j_mayer
        case 0x67:
1043 4c9649a9 j_mayer
            /* INSLH */
1044 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_inslh, ra, rb, rc, islit, lit);
1045 4c9649a9 j_mayer
            break;
1046 4c9649a9 j_mayer
        case 0x6A:
1047 4c9649a9 j_mayer
            /* EXTLH */
1048 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extlh, ra, rb, rc, islit, lit);
1049 4c9649a9 j_mayer
            break;
1050 4c9649a9 j_mayer
        case 0x72:
1051 4c9649a9 j_mayer
            /* MSKQH */
1052 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mskqh, ra, rb, rc, islit, lit);
1053 4c9649a9 j_mayer
            break;
1054 4c9649a9 j_mayer
        case 0x77:
1055 4c9649a9 j_mayer
            /* INSQH */
1056 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_insqh, ra, rb, rc, islit, lit);
1057 4c9649a9 j_mayer
            break;
1058 4c9649a9 j_mayer
        case 0x7A:
1059 4c9649a9 j_mayer
            /* EXTQH */
1060 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_extqh, ra, rb, rc, islit, lit);
1061 4c9649a9 j_mayer
            break;
1062 4c9649a9 j_mayer
        default:
1063 4c9649a9 j_mayer
            goto invalid_opc;
1064 4c9649a9 j_mayer
        }
1065 4c9649a9 j_mayer
        break;
1066 4c9649a9 j_mayer
    case 0x13:
1067 4c9649a9 j_mayer
        switch (fn7) {
1068 4c9649a9 j_mayer
        case 0x00:
1069 4c9649a9 j_mayer
            /* MULL */
1070 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mull, ra, rb, rc, islit, lit);
1071 4c9649a9 j_mayer
            break;
1072 4c9649a9 j_mayer
        case 0x20:
1073 4c9649a9 j_mayer
            /* MULQ */
1074 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mulq, ra, rb, rc, islit, lit);
1075 4c9649a9 j_mayer
            break;
1076 4c9649a9 j_mayer
        case 0x30:
1077 4c9649a9 j_mayer
            /* UMULH */
1078 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_umulh, ra, rb, rc, islit, lit);
1079 4c9649a9 j_mayer
            break;
1080 4c9649a9 j_mayer
        case 0x40:
1081 4c9649a9 j_mayer
            /* MULL/V */
1082 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mullv, ra, rb, rc, islit, lit);
1083 4c9649a9 j_mayer
            break;
1084 4c9649a9 j_mayer
        case 0x60:
1085 4c9649a9 j_mayer
            /* MULQ/V */
1086 4c9649a9 j_mayer
            gen_arith3(ctx, &gen_op_mulqv, ra, rb, rc, islit, lit);
1087 4c9649a9 j_mayer
            break;
1088 4c9649a9 j_mayer
        default:
1089 4c9649a9 j_mayer
            goto invalid_opc;
1090 4c9649a9 j_mayer
        }
1091 4c9649a9 j_mayer
        break;
1092 4c9649a9 j_mayer
    case 0x14:
1093 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1094 4c9649a9 j_mayer
        case 0x04:
1095 4c9649a9 j_mayer
            /* ITOFS */
1096 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1097 4c9649a9 j_mayer
                goto invalid_opc;
1098 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itofs, ra, rc);
1099 4c9649a9 j_mayer
            break;
1100 4c9649a9 j_mayer
        case 0x0A:
1101 4c9649a9 j_mayer
            /* SQRTF */
1102 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1103 4c9649a9 j_mayer
                goto invalid_opc;
1104 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtf, rb, rc);
1105 4c9649a9 j_mayer
            break;
1106 4c9649a9 j_mayer
        case 0x0B:
1107 4c9649a9 j_mayer
            /* SQRTS */
1108 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1109 4c9649a9 j_mayer
                goto invalid_opc;
1110 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrts, rb, rc);
1111 4c9649a9 j_mayer
            break;
1112 4c9649a9 j_mayer
        case 0x14:
1113 4c9649a9 j_mayer
            /* ITOFF */
1114 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1115 4c9649a9 j_mayer
                goto invalid_opc;
1116 4c9649a9 j_mayer
#if 0 // TODO
1117 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itoff, ra, rc);
1118 4c9649a9 j_mayer
#else
1119 4c9649a9 j_mayer
            goto invalid_opc;
1120 4c9649a9 j_mayer
#endif
1121 4c9649a9 j_mayer
            break;
1122 4c9649a9 j_mayer
        case 0x24:
1123 4c9649a9 j_mayer
            /* ITOFT */
1124 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1125 4c9649a9 j_mayer
                goto invalid_opc;
1126 4c9649a9 j_mayer
            gen_itf(ctx, &gen_op_itoft, ra, rc);
1127 4c9649a9 j_mayer
            break;
1128 4c9649a9 j_mayer
        case 0x2A:
1129 4c9649a9 j_mayer
            /* SQRTG */
1130 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1131 4c9649a9 j_mayer
                goto invalid_opc;
1132 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtg, rb, rc);
1133 4c9649a9 j_mayer
            break;
1134 4c9649a9 j_mayer
        case 0x02B:
1135 4c9649a9 j_mayer
            /* SQRTT */
1136 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1137 4c9649a9 j_mayer
                goto invalid_opc;
1138 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_sqrtt, rb, rc);
1139 4c9649a9 j_mayer
            break;
1140 4c9649a9 j_mayer
        default:
1141 4c9649a9 j_mayer
            goto invalid_opc;
1142 4c9649a9 j_mayer
        }
1143 4c9649a9 j_mayer
        break;
1144 4c9649a9 j_mayer
    case 0x15:
1145 4c9649a9 j_mayer
        /* VAX floating point */
1146 4c9649a9 j_mayer
        /* XXX: rounding mode and trap are ignored (!) */
1147 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1148 4c9649a9 j_mayer
        case 0x00:
1149 4c9649a9 j_mayer
            /* ADDF */
1150 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addf, ra, rb, rc);
1151 4c9649a9 j_mayer
            break;
1152 4c9649a9 j_mayer
        case 0x01:
1153 4c9649a9 j_mayer
            /* SUBF */
1154 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subf, ra, rb, rc);
1155 4c9649a9 j_mayer
            break;
1156 4c9649a9 j_mayer
        case 0x02:
1157 4c9649a9 j_mayer
            /* MULF */
1158 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mulf, ra, rb, rc);
1159 4c9649a9 j_mayer
            break;
1160 4c9649a9 j_mayer
        case 0x03:
1161 4c9649a9 j_mayer
            /* DIVF */
1162 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divf, ra, rb, rc);
1163 4c9649a9 j_mayer
            break;
1164 4c9649a9 j_mayer
        case 0x1E:
1165 4c9649a9 j_mayer
            /* CVTDG */
1166 4c9649a9 j_mayer
#if 0 // TODO
1167 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtdg, rb, rc);
1168 4c9649a9 j_mayer
#else
1169 4c9649a9 j_mayer
            goto invalid_opc;
1170 4c9649a9 j_mayer
#endif
1171 4c9649a9 j_mayer
            break;
1172 4c9649a9 j_mayer
        case 0x20:
1173 4c9649a9 j_mayer
            /* ADDG */
1174 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addg, ra, rb, rc);
1175 4c9649a9 j_mayer
            break;
1176 4c9649a9 j_mayer
        case 0x21:
1177 4c9649a9 j_mayer
            /* SUBG */
1178 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subg, ra, rb, rc);
1179 4c9649a9 j_mayer
            break;
1180 4c9649a9 j_mayer
        case 0x22:
1181 4c9649a9 j_mayer
            /* MULG */
1182 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mulg, ra, rb, rc);
1183 4c9649a9 j_mayer
            break;
1184 4c9649a9 j_mayer
        case 0x23:
1185 4c9649a9 j_mayer
            /* DIVG */
1186 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divg, ra, rb, rc);
1187 4c9649a9 j_mayer
            break;
1188 4c9649a9 j_mayer
        case 0x25:
1189 4c9649a9 j_mayer
            /* CMPGEQ */
1190 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpgeq, ra, rb, rc);
1191 4c9649a9 j_mayer
            break;
1192 4c9649a9 j_mayer
        case 0x26:
1193 4c9649a9 j_mayer
            /* CMPGLT */
1194 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpglt, ra, rb, rc);
1195 4c9649a9 j_mayer
            break;
1196 4c9649a9 j_mayer
        case 0x27:
1197 4c9649a9 j_mayer
            /* CMPGLE */
1198 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpgle, ra, rb, rc);
1199 4c9649a9 j_mayer
            break;
1200 4c9649a9 j_mayer
        case 0x2C:
1201 4c9649a9 j_mayer
            /* CVTGF */
1202 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgf, rb, rc);
1203 4c9649a9 j_mayer
            break;
1204 4c9649a9 j_mayer
        case 0x2D:
1205 4c9649a9 j_mayer
            /* CVTGD */
1206 4c9649a9 j_mayer
#if 0 // TODO
1207 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgd, rb, rc);
1208 4c9649a9 j_mayer
#else
1209 4c9649a9 j_mayer
            goto invalid_opc;
1210 4c9649a9 j_mayer
#endif
1211 4c9649a9 j_mayer
            break;
1212 4c9649a9 j_mayer
        case 0x2F:
1213 4c9649a9 j_mayer
            /* CVTGQ */
1214 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtgq, rb, rc);
1215 4c9649a9 j_mayer
            break;
1216 4c9649a9 j_mayer
        case 0x3C:
1217 4c9649a9 j_mayer
            /* CVTQF */
1218 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqf, rb, rc);
1219 4c9649a9 j_mayer
            break;
1220 4c9649a9 j_mayer
        case 0x3E:
1221 4c9649a9 j_mayer
            /* CVTQG */
1222 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqg, rb, rc);
1223 4c9649a9 j_mayer
            break;
1224 4c9649a9 j_mayer
        default:
1225 4c9649a9 j_mayer
            goto invalid_opc;
1226 4c9649a9 j_mayer
        }
1227 4c9649a9 j_mayer
        break;
1228 4c9649a9 j_mayer
    case 0x16:
1229 4c9649a9 j_mayer
        /* IEEE floating-point */
1230 4c9649a9 j_mayer
        /* XXX: rounding mode and traps are ignored (!) */
1231 4c9649a9 j_mayer
        switch (fpfn) { /* f11 & 0x3F */
1232 4c9649a9 j_mayer
        case 0x00:
1233 4c9649a9 j_mayer
            /* ADDS */
1234 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_adds, ra, rb, rc);
1235 4c9649a9 j_mayer
            break;
1236 4c9649a9 j_mayer
        case 0x01:
1237 4c9649a9 j_mayer
            /* SUBS */
1238 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subs, ra, rb, rc);
1239 4c9649a9 j_mayer
            break;
1240 4c9649a9 j_mayer
        case 0x02:
1241 4c9649a9 j_mayer
            /* MULS */
1242 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_muls, ra, rb, rc);
1243 4c9649a9 j_mayer
            break;
1244 4c9649a9 j_mayer
        case 0x03:
1245 4c9649a9 j_mayer
            /* DIVS */
1246 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divs, ra, rb, rc);
1247 4c9649a9 j_mayer
            break;
1248 4c9649a9 j_mayer
        case 0x20:
1249 4c9649a9 j_mayer
            /* ADDT */
1250 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_addt, ra, rb, rc);
1251 4c9649a9 j_mayer
            break;
1252 4c9649a9 j_mayer
        case 0x21:
1253 4c9649a9 j_mayer
            /* SUBT */
1254 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_subt, ra, rb, rc);
1255 4c9649a9 j_mayer
            break;
1256 4c9649a9 j_mayer
        case 0x22:
1257 4c9649a9 j_mayer
            /* MULT */
1258 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_mult, ra, rb, rc);
1259 4c9649a9 j_mayer
            break;
1260 4c9649a9 j_mayer
        case 0x23:
1261 4c9649a9 j_mayer
            /* DIVT */
1262 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_divt, ra, rb, rc);
1263 4c9649a9 j_mayer
            break;
1264 4c9649a9 j_mayer
        case 0x24:
1265 4c9649a9 j_mayer
            /* CMPTUN */
1266 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptun, ra, rb, rc);
1267 4c9649a9 j_mayer
            break;
1268 4c9649a9 j_mayer
        case 0x25:
1269 4c9649a9 j_mayer
            /* CMPTEQ */
1270 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmpteq, ra, rb, rc);
1271 4c9649a9 j_mayer
            break;
1272 4c9649a9 j_mayer
        case 0x26:
1273 4c9649a9 j_mayer
            /* CMPTLT */
1274 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptlt, ra, rb, rc);
1275 4c9649a9 j_mayer
            break;
1276 4c9649a9 j_mayer
        case 0x27:
1277 4c9649a9 j_mayer
            /* CMPTLE */
1278 4c9649a9 j_mayer
            gen_farith3(ctx, &gen_op_cmptle, ra, rb, rc);
1279 4c9649a9 j_mayer
            break;
1280 4c9649a9 j_mayer
        case 0x2C:
1281 4c9649a9 j_mayer
            /* XXX: incorrect */
1282 4c9649a9 j_mayer
            if (fn11 == 0x2AC) {
1283 4c9649a9 j_mayer
                /* CVTST */
1284 4c9649a9 j_mayer
                gen_farith2(ctx, &gen_op_cvtst, rb, rc);
1285 4c9649a9 j_mayer
            } else {
1286 4c9649a9 j_mayer
                /* CVTTS */
1287 4c9649a9 j_mayer
                gen_farith2(ctx, &gen_op_cvtts, rb, rc);
1288 4c9649a9 j_mayer
            }
1289 4c9649a9 j_mayer
            break;
1290 4c9649a9 j_mayer
        case 0x2F:
1291 4c9649a9 j_mayer
            /* CVTTQ */
1292 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvttq, rb, rc);
1293 4c9649a9 j_mayer
            break;
1294 4c9649a9 j_mayer
        case 0x3C:
1295 4c9649a9 j_mayer
            /* CVTQS */
1296 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqs, rb, rc);
1297 4c9649a9 j_mayer
            break;
1298 4c9649a9 j_mayer
        case 0x3E:
1299 4c9649a9 j_mayer
            /* CVTQT */
1300 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqt, rb, rc);
1301 4c9649a9 j_mayer
            break;
1302 4c9649a9 j_mayer
        default:
1303 4c9649a9 j_mayer
            goto invalid_opc;
1304 4c9649a9 j_mayer
        }
1305 4c9649a9 j_mayer
        break;
1306 4c9649a9 j_mayer
    case 0x17:
1307 4c9649a9 j_mayer
        switch (fn11) {
1308 4c9649a9 j_mayer
        case 0x010:
1309 4c9649a9 j_mayer
            /* CVTLQ */
1310 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtlq, rb, rc);
1311 4c9649a9 j_mayer
            break;
1312 4c9649a9 j_mayer
        case 0x020:
1313 4c9649a9 j_mayer
            /* CPYS */
1314 4c9649a9 j_mayer
            if (ra == rb) {
1315 4c9649a9 j_mayer
                if (ra == 31 && rc == 31) {
1316 4c9649a9 j_mayer
                    /* FNOP */
1317 4c9649a9 j_mayer
                    gen_op_nop();
1318 4c9649a9 j_mayer
                } else {
1319 4c9649a9 j_mayer
                    /* FMOV */
1320 4c9649a9 j_mayer
                    gen_load_fir(ctx, rb, 0);
1321 4c9649a9 j_mayer
                    gen_store_fir(ctx, rc, 0);
1322 4c9649a9 j_mayer
                }
1323 4c9649a9 j_mayer
            } else {
1324 4c9649a9 j_mayer
                gen_farith3(ctx, &gen_op_cpys, ra, rb, rc);
1325 4c9649a9 j_mayer
            }
1326 4c9649a9 j_mayer
            break;
1327 4c9649a9 j_mayer
        case 0x021:
1328 4c9649a9 j_mayer
            /* CPYSN */
1329 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cpysn, rb, rc);
1330 4c9649a9 j_mayer
            break;
1331 4c9649a9 j_mayer
        case 0x022:
1332 4c9649a9 j_mayer
            /* CPYSE */
1333 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cpyse, rb, rc);
1334 4c9649a9 j_mayer
            break;
1335 4c9649a9 j_mayer
        case 0x024:
1336 4c9649a9 j_mayer
            /* MT_FPCR */
1337 4c9649a9 j_mayer
            gen_load_fir(ctx, ra, 0);
1338 4c9649a9 j_mayer
            gen_op_store_fpcr();
1339 4c9649a9 j_mayer
            break;
1340 4c9649a9 j_mayer
        case 0x025:
1341 4c9649a9 j_mayer
            /* MF_FPCR */
1342 4c9649a9 j_mayer
            gen_op_load_fpcr();
1343 4c9649a9 j_mayer
            gen_store_fir(ctx, ra, 0);
1344 4c9649a9 j_mayer
            break;
1345 4c9649a9 j_mayer
        case 0x02A:
1346 4c9649a9 j_mayer
            /* FCMOVEQ */
1347 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfeq, ra, rb, rc);
1348 4c9649a9 j_mayer
            break;
1349 4c9649a9 j_mayer
        case 0x02B:
1350 4c9649a9 j_mayer
            /* FCMOVNE */
1351 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfne, ra, rb, rc);
1352 4c9649a9 j_mayer
            break;
1353 4c9649a9 j_mayer
        case 0x02C:
1354 4c9649a9 j_mayer
            /* FCMOVLT */
1355 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpflt, ra, rb, rc);
1356 4c9649a9 j_mayer
            break;
1357 4c9649a9 j_mayer
        case 0x02D:
1358 4c9649a9 j_mayer
            /* FCMOVGE */
1359 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfge, ra, rb, rc);
1360 4c9649a9 j_mayer
            break;
1361 4c9649a9 j_mayer
        case 0x02E:
1362 4c9649a9 j_mayer
            /* FCMOVLE */
1363 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfle, ra, rb, rc);
1364 4c9649a9 j_mayer
            break;
1365 4c9649a9 j_mayer
        case 0x02F:
1366 4c9649a9 j_mayer
            /* FCMOVGT */
1367 4c9649a9 j_mayer
            gen_fcmov(ctx, &gen_op_cmpfgt, ra, rb, rc);
1368 4c9649a9 j_mayer
            break;
1369 4c9649a9 j_mayer
        case 0x030:
1370 4c9649a9 j_mayer
            /* CVTQL */
1371 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtql, rb, rc);
1372 4c9649a9 j_mayer
            break;
1373 4c9649a9 j_mayer
        case 0x130:
1374 4c9649a9 j_mayer
            /* CVTQL/V */
1375 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqlv, rb, rc);
1376 4c9649a9 j_mayer
            break;
1377 4c9649a9 j_mayer
        case 0x530:
1378 4c9649a9 j_mayer
            /* CVTQL/SV */
1379 4c9649a9 j_mayer
            gen_farith2(ctx, &gen_op_cvtqlsv, rb, rc);
1380 4c9649a9 j_mayer
            break;
1381 4c9649a9 j_mayer
        default:
1382 4c9649a9 j_mayer
            goto invalid_opc;
1383 4c9649a9 j_mayer
        }
1384 4c9649a9 j_mayer
        break;
1385 4c9649a9 j_mayer
    case 0x18:
1386 4c9649a9 j_mayer
        switch ((uint16_t)disp16) {
1387 4c9649a9 j_mayer
        case 0x0000:
1388 4c9649a9 j_mayer
            /* TRAPB */
1389 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1390 4c9649a9 j_mayer
            ret = 2;
1391 4c9649a9 j_mayer
            break;
1392 4c9649a9 j_mayer
        case 0x0400:
1393 4c9649a9 j_mayer
            /* EXCB */
1394 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
1395 4c9649a9 j_mayer
            ret = 2;
1396 4c9649a9 j_mayer
            break;
1397 4c9649a9 j_mayer
        case 0x4000:
1398 4c9649a9 j_mayer
            /* MB */
1399 4c9649a9 j_mayer
            /* No-op */
1400 4c9649a9 j_mayer
            break;
1401 4c9649a9 j_mayer
        case 0x4400:
1402 4c9649a9 j_mayer
            /* WMB */
1403 4c9649a9 j_mayer
            /* No-op */
1404 4c9649a9 j_mayer
            break;
1405 4c9649a9 j_mayer
        case 0x8000:
1406 4c9649a9 j_mayer
            /* FETCH */
1407 4c9649a9 j_mayer
            /* No-op */
1408 4c9649a9 j_mayer
            break;
1409 4c9649a9 j_mayer
        case 0xA000:
1410 4c9649a9 j_mayer
            /* FETCH_M */
1411 4c9649a9 j_mayer
            /* No-op */
1412 4c9649a9 j_mayer
            break;
1413 4c9649a9 j_mayer
        case 0xC000:
1414 4c9649a9 j_mayer
            /* RPCC */
1415 4c9649a9 j_mayer
            gen_op_load_pcc();
1416 4c9649a9 j_mayer
            gen_store_ir(ctx, ra, 0);
1417 4c9649a9 j_mayer
            break;
1418 4c9649a9 j_mayer
        case 0xE000:
1419 4c9649a9 j_mayer
            /* RC */
1420 4c9649a9 j_mayer
            gen_op_load_irf();
1421 4c9649a9 j_mayer
            gen_store_ir(ctx, ra, 0);
1422 4c9649a9 j_mayer
            gen_op_clear_irf();
1423 4c9649a9 j_mayer
            break;
1424 4c9649a9 j_mayer
        case 0xE800:
1425 4c9649a9 j_mayer
            /* ECB */
1426 4c9649a9 j_mayer
            /* XXX: TODO: evict tb cache at address rb */
1427 4c9649a9 j_mayer
#if 0
1428 4c9649a9 j_mayer
            ret = 2;
1429 4c9649a9 j_mayer
#else
1430 4c9649a9 j_mayer
            goto invalid_opc;
1431 4c9649a9 j_mayer
#endif
1432 4c9649a9 j_mayer
            break;
1433 4c9649a9 j_mayer
        case 0xF000:
1434 4c9649a9 j_mayer
            /* RS */
1435 4c9649a9 j_mayer
            gen_op_load_irf();
1436 4c9649a9 j_mayer
            gen_store_ir(ctx, ra, 0);
1437 4c9649a9 j_mayer
            gen_op_set_irf();
1438 4c9649a9 j_mayer
            break;
1439 4c9649a9 j_mayer
        case 0xF800:
1440 4c9649a9 j_mayer
            /* WH64 */
1441 4c9649a9 j_mayer
            /* No-op */
1442 4c9649a9 j_mayer
            break;
1443 4c9649a9 j_mayer
        default:
1444 4c9649a9 j_mayer
            goto invalid_opc;
1445 4c9649a9 j_mayer
        }
1446 4c9649a9 j_mayer
        break;
1447 4c9649a9 j_mayer
    case 0x19:
1448 4c9649a9 j_mayer
        /* HW_MFPR (PALcode) */
1449 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1450 4c9649a9 j_mayer
        goto invalid_opc;
1451 4c9649a9 j_mayer
#else
1452 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1453 4c9649a9 j_mayer
            goto invalid_opc;
1454 4c9649a9 j_mayer
        gen_op_mfpr(insn & 0xFF);
1455 4c9649a9 j_mayer
        gen_store_ir(ctx, ra, 0);
1456 4c9649a9 j_mayer
        break;
1457 4c9649a9 j_mayer
#endif
1458 4c9649a9 j_mayer
    case 0x1A:
1459 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
1460 4c9649a9 j_mayer
        if (ra != 31) {
1461 4c9649a9 j_mayer
            gen_set_uT1(ctx, ctx->pc);
1462 4c9649a9 j_mayer
            gen_store_ir(ctx, ra, 1);
1463 4c9649a9 j_mayer
        }
1464 4c9649a9 j_mayer
        gen_op_branch();
1465 4c9649a9 j_mayer
        /* Those four jumps only differ by the branch prediction hint */
1466 4c9649a9 j_mayer
        switch (fn2) {
1467 4c9649a9 j_mayer
        case 0x0:
1468 4c9649a9 j_mayer
            /* JMP */
1469 4c9649a9 j_mayer
            break;
1470 4c9649a9 j_mayer
        case 0x1:
1471 4c9649a9 j_mayer
            /* JSR */
1472 4c9649a9 j_mayer
            break;
1473 4c9649a9 j_mayer
        case 0x2:
1474 4c9649a9 j_mayer
            /* RET */
1475 4c9649a9 j_mayer
            break;
1476 4c9649a9 j_mayer
        case 0x3:
1477 4c9649a9 j_mayer
            /* JSR_COROUTINE */
1478 4c9649a9 j_mayer
            break;
1479 4c9649a9 j_mayer
        }
1480 4c9649a9 j_mayer
        ret = 1;
1481 4c9649a9 j_mayer
        break;
1482 4c9649a9 j_mayer
    case 0x1B:
1483 4c9649a9 j_mayer
        /* HW_LD (PALcode) */
1484 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1485 4c9649a9 j_mayer
        goto invalid_opc;
1486 4c9649a9 j_mayer
#else
1487 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1488 4c9649a9 j_mayer
            goto invalid_opc;
1489 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
1490 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp12);
1491 4c9649a9 j_mayer
        gen_op_addq();
1492 4c9649a9 j_mayer
        switch ((insn >> 12) & 0xF) {
1493 4c9649a9 j_mayer
        case 0x0:
1494 4c9649a9 j_mayer
            /* Longword physical access */
1495 4c9649a9 j_mayer
            gen_op_ldl_raw();
1496 4c9649a9 j_mayer
            break;
1497 4c9649a9 j_mayer
        case 0x1:
1498 4c9649a9 j_mayer
            /* Quadword physical access */
1499 4c9649a9 j_mayer
            gen_op_ldq_raw();
1500 4c9649a9 j_mayer
            break;
1501 4c9649a9 j_mayer
        case 0x2:
1502 4c9649a9 j_mayer
            /* Longword physical access with lock */
1503 4c9649a9 j_mayer
            gen_op_ldl_l_raw();
1504 4c9649a9 j_mayer
            break;
1505 4c9649a9 j_mayer
        case 0x3:
1506 4c9649a9 j_mayer
            /* Quadword physical access with lock */
1507 4c9649a9 j_mayer
            gen_op_ldq_l_raw();
1508 4c9649a9 j_mayer
            break;
1509 4c9649a9 j_mayer
        case 0x4:
1510 4c9649a9 j_mayer
            /* Longword virtual PTE fetch */
1511 4c9649a9 j_mayer
            gen_op_ldl_kernel();
1512 4c9649a9 j_mayer
            break;
1513 4c9649a9 j_mayer
        case 0x5:
1514 4c9649a9 j_mayer
            /* Quadword virtual PTE fetch */
1515 4c9649a9 j_mayer
            gen_op_ldq_kernel();
1516 4c9649a9 j_mayer
            break;
1517 4c9649a9 j_mayer
        case 0x6:
1518 4c9649a9 j_mayer
            /* Invalid */
1519 4c9649a9 j_mayer
            goto invalid_opc;
1520 4c9649a9 j_mayer
        case 0x7:
1521 4c9649a9 j_mayer
            /* Invalid */
1522 4c9649a9 j_mayer
            goto invalid_opc;
1523 4c9649a9 j_mayer
        case 0x8:
1524 4c9649a9 j_mayer
            /* Longword virtual access */
1525 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1526 4c9649a9 j_mayer
            gen_op_ldl_raw();
1527 4c9649a9 j_mayer
            break;
1528 4c9649a9 j_mayer
        case 0x9:
1529 4c9649a9 j_mayer
            /* Quadword virtual access */
1530 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1531 4c9649a9 j_mayer
            gen_op_ldq_raw();
1532 4c9649a9 j_mayer
            break;
1533 4c9649a9 j_mayer
        case 0xA:
1534 4c9649a9 j_mayer
            /* Longword virtual access with protection check */
1535 4c9649a9 j_mayer
            gen_ldl(ctx);
1536 4c9649a9 j_mayer
            break;
1537 4c9649a9 j_mayer
        case 0xB:
1538 4c9649a9 j_mayer
            /* Quadword virtual access with protection check */
1539 4c9649a9 j_mayer
            gen_ldq(ctx);
1540 4c9649a9 j_mayer
            break;
1541 4c9649a9 j_mayer
        case 0xC:
1542 4c9649a9 j_mayer
            /* Longword virtual access with altenate access mode */
1543 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1544 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1545 4c9649a9 j_mayer
            gen_op_ldl_raw();
1546 4c9649a9 j_mayer
            gen_op_restore_mode();
1547 4c9649a9 j_mayer
            break;
1548 4c9649a9 j_mayer
        case 0xD:
1549 4c9649a9 j_mayer
            /* Quadword virtual access with altenate access mode */
1550 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1551 4c9649a9 j_mayer
            gen_op_ld_phys_to_virt();
1552 4c9649a9 j_mayer
            gen_op_ldq_raw();
1553 4c9649a9 j_mayer
            gen_op_restore_mode();
1554 4c9649a9 j_mayer
            break;
1555 4c9649a9 j_mayer
        case 0xE:
1556 4c9649a9 j_mayer
            /* Longword virtual access with alternate access mode and
1557 4c9649a9 j_mayer
             * protection checks
1558 4c9649a9 j_mayer
             */
1559 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1560 4c9649a9 j_mayer
            gen_op_ldl_data();
1561 4c9649a9 j_mayer
            gen_op_restore_mode();
1562 4c9649a9 j_mayer
            break;
1563 4c9649a9 j_mayer
        case 0xF:
1564 4c9649a9 j_mayer
            /* Quadword virtual access with alternate access mode and
1565 4c9649a9 j_mayer
             * protection checks
1566 4c9649a9 j_mayer
             */
1567 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1568 4c9649a9 j_mayer
            gen_op_ldq_data();
1569 4c9649a9 j_mayer
            gen_op_restore_mode();
1570 4c9649a9 j_mayer
            break;
1571 4c9649a9 j_mayer
        }
1572 4c9649a9 j_mayer
        gen_store_ir(ctx, ra, 1);
1573 4c9649a9 j_mayer
        break;
1574 4c9649a9 j_mayer
#endif
1575 4c9649a9 j_mayer
    case 0x1C:
1576 4c9649a9 j_mayer
        switch (fn7) {
1577 4c9649a9 j_mayer
        case 0x00:
1578 4c9649a9 j_mayer
            /* SEXTB */
1579 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1580 4c9649a9 j_mayer
                goto invalid_opc;
1581 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_op_sextb, rb, rc, islit, lit);
1582 4c9649a9 j_mayer
            break;
1583 4c9649a9 j_mayer
        case 0x01:
1584 4c9649a9 j_mayer
            /* SEXTW */
1585 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
1586 4c9649a9 j_mayer
                goto invalid_opc;
1587 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_op_sextw, rb, rc, islit, lit);
1588 4c9649a9 j_mayer
            break;
1589 4c9649a9 j_mayer
        case 0x30:
1590 4c9649a9 j_mayer
            /* CTPOP */
1591 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1592 4c9649a9 j_mayer
                goto invalid_opc;
1593 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_op_ctpop, rb, rc, 0, 0);
1594 4c9649a9 j_mayer
            break;
1595 4c9649a9 j_mayer
        case 0x31:
1596 4c9649a9 j_mayer
            /* PERR */
1597 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1598 4c9649a9 j_mayer
                goto invalid_opc;
1599 4c9649a9 j_mayer
            /* XXX: TODO */
1600 4c9649a9 j_mayer
            goto invalid_opc;
1601 4c9649a9 j_mayer
            break;
1602 4c9649a9 j_mayer
        case 0x32:
1603 4c9649a9 j_mayer
            /* CTLZ */
1604 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1605 4c9649a9 j_mayer
                goto invalid_opc;
1606 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_op_ctlz, rb, rc, 0, 0);
1607 4c9649a9 j_mayer
            break;
1608 4c9649a9 j_mayer
        case 0x33:
1609 4c9649a9 j_mayer
            /* CTTZ */
1610 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
1611 4c9649a9 j_mayer
                goto invalid_opc;
1612 4c9649a9 j_mayer
            gen_arith2(ctx, &gen_op_cttz, rb, rc, 0, 0);
1613 4c9649a9 j_mayer
            break;
1614 4c9649a9 j_mayer
        case 0x34:
1615 4c9649a9 j_mayer
            /* UNPKBW */
1616 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1617 4c9649a9 j_mayer
                goto invalid_opc;
1618 4c9649a9 j_mayer
            /* XXX: TODO */
1619 4c9649a9 j_mayer
            goto invalid_opc;
1620 4c9649a9 j_mayer
            break;
1621 4c9649a9 j_mayer
        case 0x35:
1622 4c9649a9 j_mayer
            /* UNPKWL */
1623 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1624 4c9649a9 j_mayer
                goto invalid_opc;
1625 4c9649a9 j_mayer
            /* XXX: TODO */
1626 4c9649a9 j_mayer
            goto invalid_opc;
1627 4c9649a9 j_mayer
            break;
1628 4c9649a9 j_mayer
        case 0x36:
1629 4c9649a9 j_mayer
            /* PKWB */
1630 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1631 4c9649a9 j_mayer
                goto invalid_opc;
1632 4c9649a9 j_mayer
            /* XXX: TODO */
1633 4c9649a9 j_mayer
            goto invalid_opc;
1634 4c9649a9 j_mayer
            break;
1635 4c9649a9 j_mayer
        case 0x37:
1636 4c9649a9 j_mayer
            /* PKLB */
1637 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1638 4c9649a9 j_mayer
                goto invalid_opc;
1639 4c9649a9 j_mayer
            /* XXX: TODO */
1640 4c9649a9 j_mayer
            goto invalid_opc;
1641 4c9649a9 j_mayer
            break;
1642 4c9649a9 j_mayer
        case 0x38:
1643 4c9649a9 j_mayer
            /* MINSB8 */
1644 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1645 4c9649a9 j_mayer
                goto invalid_opc;
1646 4c9649a9 j_mayer
            /* XXX: TODO */
1647 4c9649a9 j_mayer
            goto invalid_opc;
1648 4c9649a9 j_mayer
            break;
1649 4c9649a9 j_mayer
        case 0x39:
1650 4c9649a9 j_mayer
            /* MINSW4 */
1651 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1652 4c9649a9 j_mayer
                goto invalid_opc;
1653 4c9649a9 j_mayer
            /* XXX: TODO */
1654 4c9649a9 j_mayer
            goto invalid_opc;
1655 4c9649a9 j_mayer
            break;
1656 4c9649a9 j_mayer
        case 0x3A:
1657 4c9649a9 j_mayer
            /* MINUB8 */
1658 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1659 4c9649a9 j_mayer
                goto invalid_opc;
1660 4c9649a9 j_mayer
            /* XXX: TODO */
1661 4c9649a9 j_mayer
            goto invalid_opc;
1662 4c9649a9 j_mayer
            break;
1663 4c9649a9 j_mayer
        case 0x3B:
1664 4c9649a9 j_mayer
            /* MINUW4 */
1665 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1666 4c9649a9 j_mayer
                goto invalid_opc;
1667 4c9649a9 j_mayer
            /* XXX: TODO */
1668 4c9649a9 j_mayer
            goto invalid_opc;
1669 4c9649a9 j_mayer
            break;
1670 4c9649a9 j_mayer
        case 0x3C:
1671 4c9649a9 j_mayer
            /* MAXUB8 */
1672 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1673 4c9649a9 j_mayer
                goto invalid_opc;
1674 4c9649a9 j_mayer
            /* XXX: TODO */
1675 4c9649a9 j_mayer
            goto invalid_opc;
1676 4c9649a9 j_mayer
            break;
1677 4c9649a9 j_mayer
        case 0x3D:
1678 4c9649a9 j_mayer
            /* MAXUW4 */
1679 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1680 4c9649a9 j_mayer
                goto invalid_opc;
1681 4c9649a9 j_mayer
            /* XXX: TODO */
1682 4c9649a9 j_mayer
            goto invalid_opc;
1683 4c9649a9 j_mayer
            break;
1684 4c9649a9 j_mayer
        case 0x3E:
1685 4c9649a9 j_mayer
            /* MAXSB8 */
1686 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1687 4c9649a9 j_mayer
                goto invalid_opc;
1688 4c9649a9 j_mayer
            /* XXX: TODO */
1689 4c9649a9 j_mayer
            goto invalid_opc;
1690 4c9649a9 j_mayer
            break;
1691 4c9649a9 j_mayer
        case 0x3F:
1692 4c9649a9 j_mayer
            /* MAXSW4 */
1693 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
1694 4c9649a9 j_mayer
                goto invalid_opc;
1695 4c9649a9 j_mayer
            /* XXX: TODO */
1696 4c9649a9 j_mayer
            goto invalid_opc;
1697 4c9649a9 j_mayer
            break;
1698 4c9649a9 j_mayer
        case 0x70:
1699 4c9649a9 j_mayer
            /* FTOIT */
1700 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1701 4c9649a9 j_mayer
                goto invalid_opc;
1702 4c9649a9 j_mayer
            gen_fti(ctx, &gen_op_ftoit, ra, rb);
1703 4c9649a9 j_mayer
            break;
1704 4c9649a9 j_mayer
        case 0x78:
1705 4c9649a9 j_mayer
            /* FTOIS */
1706 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1707 4c9649a9 j_mayer
                goto invalid_opc;
1708 4c9649a9 j_mayer
            gen_fti(ctx, &gen_op_ftois, ra, rb);
1709 4c9649a9 j_mayer
            break;
1710 4c9649a9 j_mayer
        default:
1711 4c9649a9 j_mayer
            goto invalid_opc;
1712 4c9649a9 j_mayer
        }
1713 4c9649a9 j_mayer
        break;
1714 4c9649a9 j_mayer
    case 0x1D:
1715 4c9649a9 j_mayer
        /* HW_MTPR (PALcode) */
1716 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1717 4c9649a9 j_mayer
        goto invalid_opc;
1718 4c9649a9 j_mayer
#else
1719 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1720 4c9649a9 j_mayer
            goto invalid_opc;
1721 4c9649a9 j_mayer
        gen_load_ir(ctx, ra, 0);
1722 4c9649a9 j_mayer
        gen_op_mtpr(insn & 0xFF);
1723 4c9649a9 j_mayer
        ret = 2;
1724 4c9649a9 j_mayer
        break;
1725 4c9649a9 j_mayer
#endif
1726 4c9649a9 j_mayer
    case 0x1E:
1727 4c9649a9 j_mayer
        /* HW_REI (PALcode) */
1728 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1729 4c9649a9 j_mayer
        goto invalid_opc;
1730 4c9649a9 j_mayer
#else
1731 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1732 4c9649a9 j_mayer
            goto invalid_opc;
1733 4c9649a9 j_mayer
        if (rb == 31) {
1734 4c9649a9 j_mayer
            /* "Old" alpha */
1735 4c9649a9 j_mayer
            gen_op_hw_rei();
1736 4c9649a9 j_mayer
        } else {
1737 4c9649a9 j_mayer
            gen_load_ir(ctx, rb, 0);
1738 4c9649a9 j_mayer
            gen_set_uT1(ctx, (((int64_t)insn << 51) >> 51));
1739 4c9649a9 j_mayer
            gen_op_addq();
1740 4c9649a9 j_mayer
            gen_op_hw_ret();
1741 4c9649a9 j_mayer
        }
1742 4c9649a9 j_mayer
        ret = 2;
1743 4c9649a9 j_mayer
        break;
1744 4c9649a9 j_mayer
#endif
1745 4c9649a9 j_mayer
    case 0x1F:
1746 4c9649a9 j_mayer
        /* HW_ST (PALcode) */
1747 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
1748 4c9649a9 j_mayer
        goto invalid_opc;
1749 4c9649a9 j_mayer
#else
1750 4c9649a9 j_mayer
        if (!ctx->pal_mode)
1751 4c9649a9 j_mayer
            goto invalid_opc;
1752 4c9649a9 j_mayer
        gen_load_ir(ctx, rb, 0);
1753 4c9649a9 j_mayer
        gen_set_sT1(ctx, disp12);
1754 4c9649a9 j_mayer
        gen_op_addq();
1755 4c9649a9 j_mayer
        gen_load_ir(ctx, ra, 1);
1756 4c9649a9 j_mayer
        switch ((insn >> 12) & 0xF) {
1757 4c9649a9 j_mayer
        case 0x0:
1758 4c9649a9 j_mayer
            /* Longword physical access */
1759 4c9649a9 j_mayer
            gen_op_stl_raw();
1760 4c9649a9 j_mayer
            break;
1761 4c9649a9 j_mayer
        case 0x1:
1762 4c9649a9 j_mayer
            /* Quadword physical access */
1763 4c9649a9 j_mayer
            gen_op_stq_raw();
1764 4c9649a9 j_mayer
            break;
1765 4c9649a9 j_mayer
        case 0x2:
1766 4c9649a9 j_mayer
            /* Longword physical access with lock */
1767 4c9649a9 j_mayer
            gen_op_stl_c_raw();
1768 4c9649a9 j_mayer
            break;
1769 4c9649a9 j_mayer
        case 0x3:
1770 4c9649a9 j_mayer
            /* Quadword physical access with lock */
1771 4c9649a9 j_mayer
            gen_op_stq_c_raw();
1772 4c9649a9 j_mayer
            break;
1773 4c9649a9 j_mayer
        case 0x4:
1774 4c9649a9 j_mayer
            /* Longword virtual access */
1775 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
1776 4c9649a9 j_mayer
            gen_op_stl_raw();
1777 4c9649a9 j_mayer
            break;
1778 4c9649a9 j_mayer
        case 0x5:
1779 4c9649a9 j_mayer
            /* Quadword virtual access */
1780 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
1781 4c9649a9 j_mayer
            gen_op_stq_raw();
1782 4c9649a9 j_mayer
            break;
1783 4c9649a9 j_mayer
        case 0x6:
1784 4c9649a9 j_mayer
            /* Invalid */
1785 4c9649a9 j_mayer
            goto invalid_opc;
1786 4c9649a9 j_mayer
        case 0x7:
1787 4c9649a9 j_mayer
            /* Invalid */
1788 4c9649a9 j_mayer
            goto invalid_opc;
1789 4c9649a9 j_mayer
        case 0x8:
1790 4c9649a9 j_mayer
            /* Invalid */
1791 4c9649a9 j_mayer
            goto invalid_opc;
1792 4c9649a9 j_mayer
        case 0x9:
1793 4c9649a9 j_mayer
            /* Invalid */
1794 4c9649a9 j_mayer
            goto invalid_opc;
1795 4c9649a9 j_mayer
        case 0xA:
1796 4c9649a9 j_mayer
            /* Invalid */
1797 4c9649a9 j_mayer
            goto invalid_opc;
1798 4c9649a9 j_mayer
        case 0xB:
1799 4c9649a9 j_mayer
            /* Invalid */
1800 4c9649a9 j_mayer
            goto invalid_opc;
1801 4c9649a9 j_mayer
        case 0xC:
1802 4c9649a9 j_mayer
            /* Longword virtual access with alternate access mode */
1803 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1804 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
1805 4c9649a9 j_mayer
            gen_op_ldl_raw();
1806 4c9649a9 j_mayer
            gen_op_restore_mode();
1807 4c9649a9 j_mayer
            break;
1808 4c9649a9 j_mayer
        case 0xD:
1809 4c9649a9 j_mayer
            /* Quadword virtual access with alternate access mode */
1810 4c9649a9 j_mayer
            gen_op_set_alt_mode();
1811 4c9649a9 j_mayer
            gen_op_st_phys_to_virt();
1812 4c9649a9 j_mayer
            gen_op_ldq_raw();
1813 4c9649a9 j_mayer
            gen_op_restore_mode();
1814 4c9649a9 j_mayer
            break;
1815 4c9649a9 j_mayer
        case 0xE:
1816 4c9649a9 j_mayer
            /* Invalid */
1817 4c9649a9 j_mayer
            goto invalid_opc;
1818 4c9649a9 j_mayer
        case 0xF:
1819 4c9649a9 j_mayer
            /* Invalid */
1820 4c9649a9 j_mayer
            goto invalid_opc;
1821 4c9649a9 j_mayer
        }
1822 4c9649a9 j_mayer
        ret = 2;
1823 4c9649a9 j_mayer
        break;
1824 4c9649a9 j_mayer
#endif
1825 4c9649a9 j_mayer
    case 0x20:
1826 4c9649a9 j_mayer
        /* LDF */
1827 4c9649a9 j_mayer
#if 0 // TODO
1828 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldf, ra, rb, disp16);
1829 4c9649a9 j_mayer
#else
1830 4c9649a9 j_mayer
        goto invalid_opc;
1831 4c9649a9 j_mayer
#endif
1832 4c9649a9 j_mayer
        break;
1833 4c9649a9 j_mayer
    case 0x21:
1834 4c9649a9 j_mayer
        /* LDG */
1835 4c9649a9 j_mayer
#if 0 // TODO
1836 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldg, ra, rb, disp16);
1837 4c9649a9 j_mayer
#else
1838 4c9649a9 j_mayer
        goto invalid_opc;
1839 4c9649a9 j_mayer
#endif
1840 4c9649a9 j_mayer
        break;
1841 4c9649a9 j_mayer
    case 0x22:
1842 4c9649a9 j_mayer
        /* LDS */
1843 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_lds, ra, rb, disp16);
1844 4c9649a9 j_mayer
        break;
1845 4c9649a9 j_mayer
    case 0x23:
1846 4c9649a9 j_mayer
        /* LDT */
1847 4c9649a9 j_mayer
        gen_load_fmem(ctx, &gen_ldt, ra, rb, disp16);
1848 4c9649a9 j_mayer
        break;
1849 4c9649a9 j_mayer
    case 0x24:
1850 4c9649a9 j_mayer
        /* STF */
1851 4c9649a9 j_mayer
#if 0 // TODO
1852 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stf, ra, rb, disp16);
1853 4c9649a9 j_mayer
#else
1854 4c9649a9 j_mayer
        goto invalid_opc;
1855 4c9649a9 j_mayer
#endif
1856 4c9649a9 j_mayer
        break;
1857 4c9649a9 j_mayer
    case 0x25:
1858 4c9649a9 j_mayer
        /* STG */
1859 4c9649a9 j_mayer
#if 0 // TODO
1860 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stg, ra, rb, disp16);
1861 4c9649a9 j_mayer
#else
1862 4c9649a9 j_mayer
        goto invalid_opc;
1863 4c9649a9 j_mayer
#endif
1864 4c9649a9 j_mayer
        break;
1865 4c9649a9 j_mayer
    case 0x26:
1866 4c9649a9 j_mayer
        /* STS */
1867 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_sts, ra, rb, disp16);
1868 4c9649a9 j_mayer
        break;
1869 4c9649a9 j_mayer
    case 0x27:
1870 4c9649a9 j_mayer
        /* STT */
1871 4c9649a9 j_mayer
        gen_store_fmem(ctx, &gen_stt, ra, rb, disp16);
1872 4c9649a9 j_mayer
        break;
1873 4c9649a9 j_mayer
    case 0x28:
1874 4c9649a9 j_mayer
        /* LDL */
1875 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldl, ra, rb, disp16, 0);
1876 4c9649a9 j_mayer
        break;
1877 4c9649a9 j_mayer
    case 0x29:
1878 4c9649a9 j_mayer
        /* LDQ */
1879 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq, ra, rb, disp16, 0);
1880 4c9649a9 j_mayer
        break;
1881 4c9649a9 j_mayer
    case 0x2A:
1882 4c9649a9 j_mayer
        /* LDL_L */
1883 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldl_l, ra, rb, disp16, 0);
1884 4c9649a9 j_mayer
        break;
1885 4c9649a9 j_mayer
    case 0x2B:
1886 4c9649a9 j_mayer
        /* LDQ_L */
1887 4c9649a9 j_mayer
        gen_load_mem(ctx, &gen_ldq_l, ra, rb, disp16, 0);
1888 4c9649a9 j_mayer
        break;
1889 4c9649a9 j_mayer
    case 0x2C:
1890 4c9649a9 j_mayer
        /* STL */
1891 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stl, ra, rb, disp16, 0);
1892 4c9649a9 j_mayer
        break;
1893 4c9649a9 j_mayer
    case 0x2D:
1894 4c9649a9 j_mayer
        /* STQ */
1895 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq, ra, rb, disp16, 0);
1896 4c9649a9 j_mayer
        break;
1897 4c9649a9 j_mayer
    case 0x2E:
1898 4c9649a9 j_mayer
        /* STL_C */
1899 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stl_c, ra, rb, disp16, 0);
1900 4c9649a9 j_mayer
        break;
1901 4c9649a9 j_mayer
    case 0x2F:
1902 4c9649a9 j_mayer
        /* STQ_C */
1903 4c9649a9 j_mayer
        gen_store_mem(ctx, &gen_stq_c, ra, rb, disp16, 0);
1904 4c9649a9 j_mayer
        break;
1905 4c9649a9 j_mayer
    case 0x30:
1906 4c9649a9 j_mayer
        /* BR */
1907 496cb5b9 aurel32
        if (ra != 31) {
1908 496cb5b9 aurel32
            TCGv t = tcg_const_i64(ctx->pc);
1909 496cb5b9 aurel32
            set_ir(t, ra);
1910 496cb5b9 aurel32
            tcg_temp_free(t);
1911 4c9649a9 j_mayer
        }
1912 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (disp21 << 2));
1913 4c9649a9 j_mayer
        ret = 1;
1914 4c9649a9 j_mayer
        break;
1915 4c9649a9 j_mayer
    case 0x31:
1916 4c9649a9 j_mayer
        /* FBEQ */
1917 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfeq, ra, disp16);
1918 4c9649a9 j_mayer
        ret = 1;
1919 4c9649a9 j_mayer
        break;
1920 4c9649a9 j_mayer
    case 0x32:
1921 4c9649a9 j_mayer
        /* FBLT */
1922 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpflt, ra, disp16);
1923 4c9649a9 j_mayer
        ret = 1;
1924 4c9649a9 j_mayer
        break;
1925 4c9649a9 j_mayer
    case 0x33:
1926 4c9649a9 j_mayer
        /* FBLE */
1927 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfle, ra, disp16);
1928 4c9649a9 j_mayer
        ret = 1;
1929 4c9649a9 j_mayer
        break;
1930 4c9649a9 j_mayer
    case 0x34:
1931 4c9649a9 j_mayer
        /* BSR */
1932 4c9649a9 j_mayer
        gen_set_uT0(ctx, ctx->pc);
1933 4c9649a9 j_mayer
        gen_store_ir(ctx, ra, 0);
1934 4c9649a9 j_mayer
        if (disp21 != 0) {
1935 4c9649a9 j_mayer
            gen_set_sT1(ctx, disp21 << 2);
1936 4c9649a9 j_mayer
            gen_op_addq();
1937 4c9649a9 j_mayer
        }
1938 4c9649a9 j_mayer
        gen_op_branch();
1939 4c9649a9 j_mayer
        ret = 1;
1940 4c9649a9 j_mayer
        break;
1941 4c9649a9 j_mayer
    case 0x35:
1942 4c9649a9 j_mayer
        /* FBNE */
1943 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfne, ra, disp16);
1944 4c9649a9 j_mayer
        ret = 1;
1945 4c9649a9 j_mayer
        break;
1946 4c9649a9 j_mayer
    case 0x36:
1947 4c9649a9 j_mayer
        /* FBGE */
1948 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfge, ra, disp16);
1949 4c9649a9 j_mayer
        ret = 1;
1950 4c9649a9 j_mayer
        break;
1951 4c9649a9 j_mayer
    case 0x37:
1952 4c9649a9 j_mayer
        /* FBGT */
1953 4c9649a9 j_mayer
        gen_fbcond(ctx, &gen_op_cmpfgt, ra, disp16);
1954 4c9649a9 j_mayer
        ret = 1;
1955 4c9649a9 j_mayer
        break;
1956 4c9649a9 j_mayer
    case 0x38:
1957 4c9649a9 j_mayer
        /* BLBC */
1958 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmplbc, ra, disp16);
1959 4c9649a9 j_mayer
        ret = 1;
1960 4c9649a9 j_mayer
        break;
1961 4c9649a9 j_mayer
    case 0x39:
1962 4c9649a9 j_mayer
        /* BEQ */
1963 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmpeqz, ra, disp16);
1964 4c9649a9 j_mayer
        ret = 1;
1965 4c9649a9 j_mayer
        break;
1966 4c9649a9 j_mayer
    case 0x3A:
1967 4c9649a9 j_mayer
        /* BLT */
1968 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmpltz, ra, disp16);
1969 4c9649a9 j_mayer
        ret = 1;
1970 4c9649a9 j_mayer
        break;
1971 4c9649a9 j_mayer
    case 0x3B:
1972 4c9649a9 j_mayer
        /* BLE */
1973 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmplez, ra, disp16);
1974 4c9649a9 j_mayer
        ret = 1;
1975 4c9649a9 j_mayer
        break;
1976 4c9649a9 j_mayer
    case 0x3C:
1977 4c9649a9 j_mayer
        /* BLBS */
1978 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmplbs, ra, disp16);
1979 4c9649a9 j_mayer
        ret = 1;
1980 4c9649a9 j_mayer
        break;
1981 4c9649a9 j_mayer
    case 0x3D:
1982 4c9649a9 j_mayer
        /* BNE */
1983 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmpnez, ra, disp16);
1984 4c9649a9 j_mayer
        ret = 1;
1985 4c9649a9 j_mayer
        break;
1986 4c9649a9 j_mayer
    case 0x3E:
1987 4c9649a9 j_mayer
        /* BGE */
1988 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmpgez, ra, disp16);
1989 4c9649a9 j_mayer
        ret = 1;
1990 4c9649a9 j_mayer
        break;
1991 4c9649a9 j_mayer
    case 0x3F:
1992 4c9649a9 j_mayer
        /* BGT */
1993 4c9649a9 j_mayer
        gen_bcond(ctx, &gen_op_cmpgtz, ra, disp16);
1994 4c9649a9 j_mayer
        ret = 1;
1995 4c9649a9 j_mayer
        break;
1996 4c9649a9 j_mayer
    invalid_opc:
1997 4c9649a9 j_mayer
        gen_invalid(ctx);
1998 4c9649a9 j_mayer
        ret = 3;
1999 4c9649a9 j_mayer
        break;
2000 4c9649a9 j_mayer
    }
2001 4c9649a9 j_mayer
2002 4c9649a9 j_mayer
    return ret;
2003 4c9649a9 j_mayer
}
2004 4c9649a9 j_mayer
2005 2cfc5f17 ths
static always_inline void gen_intermediate_code_internal (CPUState *env,
2006 2cfc5f17 ths
                                                          TranslationBlock *tb,
2007 2cfc5f17 ths
                                                          int search_pc)
2008 4c9649a9 j_mayer
{
2009 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2010 4c9649a9 j_mayer
    static int insn_count;
2011 4c9649a9 j_mayer
#endif
2012 4c9649a9 j_mayer
    DisasContext ctx, *ctxp = &ctx;
2013 4c9649a9 j_mayer
    target_ulong pc_start;
2014 4c9649a9 j_mayer
    uint32_t insn;
2015 4c9649a9 j_mayer
    uint16_t *gen_opc_end;
2016 4c9649a9 j_mayer
    int j, lj = -1;
2017 4c9649a9 j_mayer
    int ret;
2018 2e70f6ef pbrook
    int num_insns;
2019 2e70f6ef pbrook
    int max_insns;
2020 4c9649a9 j_mayer
2021 4c9649a9 j_mayer
    pc_start = tb->pc;
2022 4c9649a9 j_mayer
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2023 4c9649a9 j_mayer
    ctx.pc = pc_start;
2024 4c9649a9 j_mayer
    ctx.amask = env->amask;
2025 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2026 4c9649a9 j_mayer
    ctx.mem_idx = 0;
2027 4c9649a9 j_mayer
#else
2028 4c9649a9 j_mayer
    ctx.mem_idx = ((env->ps >> 3) & 3);
2029 4c9649a9 j_mayer
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2030 4c9649a9 j_mayer
#endif
2031 2e70f6ef pbrook
    num_insns = 0;
2032 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
2033 2e70f6ef pbrook
    if (max_insns == 0)
2034 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
2035 2e70f6ef pbrook
2036 2e70f6ef pbrook
    gen_icount_start();
2037 4c9649a9 j_mayer
    for (ret = 0; ret == 0;) {
2038 4c9649a9 j_mayer
        if (env->nb_breakpoints > 0) {
2039 4c9649a9 j_mayer
            for(j = 0; j < env->nb_breakpoints; j++) {
2040 4c9649a9 j_mayer
                if (env->breakpoints[j] == ctx.pc) {
2041 4c9649a9 j_mayer
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2042 4c9649a9 j_mayer
                    break;
2043 4c9649a9 j_mayer
                }
2044 4c9649a9 j_mayer
            }
2045 4c9649a9 j_mayer
        }
2046 4c9649a9 j_mayer
        if (search_pc) {
2047 4c9649a9 j_mayer
            j = gen_opc_ptr - gen_opc_buf;
2048 4c9649a9 j_mayer
            if (lj < j) {
2049 4c9649a9 j_mayer
                lj++;
2050 4c9649a9 j_mayer
                while (lj < j)
2051 4c9649a9 j_mayer
                    gen_opc_instr_start[lj++] = 0;
2052 4c9649a9 j_mayer
                gen_opc_pc[lj] = ctx.pc;
2053 4c9649a9 j_mayer
                gen_opc_instr_start[lj] = 1;
2054 2e70f6ef pbrook
                gen_opc_icount[lj] = num_insns;
2055 4c9649a9 j_mayer
            }
2056 4c9649a9 j_mayer
        }
2057 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
2058 2e70f6ef pbrook
            gen_io_start();
2059 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2060 4c9649a9 j_mayer
        insn_count++;
2061 4c9649a9 j_mayer
        if (logfile != NULL) {
2062 e96efcfc j_mayer
            fprintf(logfile, "pc " TARGET_FMT_lx " mem_idx %d\n",
2063 e96efcfc j_mayer
                    ctx.pc, ctx.mem_idx);
2064 4c9649a9 j_mayer
        }
2065 4c9649a9 j_mayer
#endif
2066 4c9649a9 j_mayer
        insn = ldl_code(ctx.pc);
2067 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2068 4c9649a9 j_mayer
        insn_count++;
2069 4c9649a9 j_mayer
        if (logfile != NULL) {
2070 4c9649a9 j_mayer
            fprintf(logfile, "opcode %08x %d\n", insn, insn_count);
2071 4c9649a9 j_mayer
        }
2072 4c9649a9 j_mayer
#endif
2073 2e70f6ef pbrook
        num_insns++;
2074 4c9649a9 j_mayer
        ctx.pc += 4;
2075 4c9649a9 j_mayer
        ret = translate_one(ctxp, insn);
2076 4c9649a9 j_mayer
        if (ret != 0)
2077 4c9649a9 j_mayer
            break;
2078 4c9649a9 j_mayer
        /* if we reach a page boundary or are single stepping, stop
2079 4c9649a9 j_mayer
         * generation
2080 4c9649a9 j_mayer
         */
2081 4c9649a9 j_mayer
        if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) ||
2082 2e70f6ef pbrook
            (env->singlestep_enabled) ||
2083 2e70f6ef pbrook
            num_insns >= max_insns) {
2084 4c9649a9 j_mayer
            break;
2085 4c9649a9 j_mayer
        }
2086 4c9649a9 j_mayer
#if defined (DO_SINGLE_STEP)
2087 4c9649a9 j_mayer
        break;
2088 4c9649a9 j_mayer
#endif
2089 4c9649a9 j_mayer
    }
2090 4c9649a9 j_mayer
    if (ret != 1 && ret != 3) {
2091 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
2092 4c9649a9 j_mayer
    }
2093 4c9649a9 j_mayer
#if defined (DO_TB_FLUSH)
2094 496cb5b9 aurel32
    tcg_gen_helper_0_0(helper_tb_flush);
2095 4c9649a9 j_mayer
#endif
2096 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
2097 2e70f6ef pbrook
        gen_io_end();
2098 4c9649a9 j_mayer
    /* Generate the return instruction */
2099 57fec1fe bellard
    tcg_gen_exit_tb(0);
2100 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
2101 4c9649a9 j_mayer
    *gen_opc_ptr = INDEX_op_end;
2102 4c9649a9 j_mayer
    if (search_pc) {
2103 4c9649a9 j_mayer
        j = gen_opc_ptr - gen_opc_buf;
2104 4c9649a9 j_mayer
        lj++;
2105 4c9649a9 j_mayer
        while (lj <= j)
2106 4c9649a9 j_mayer
            gen_opc_instr_start[lj++] = 0;
2107 4c9649a9 j_mayer
    } else {
2108 4c9649a9 j_mayer
        tb->size = ctx.pc - pc_start;
2109 2e70f6ef pbrook
        tb->icount = num_insns;
2110 4c9649a9 j_mayer
    }
2111 4c9649a9 j_mayer
#if defined ALPHA_DEBUG_DISAS
2112 4c9649a9 j_mayer
    if (loglevel & CPU_LOG_TB_CPU) {
2113 4c9649a9 j_mayer
        cpu_dump_state(env, logfile, fprintf, 0);
2114 4c9649a9 j_mayer
    }
2115 4c9649a9 j_mayer
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2116 4c9649a9 j_mayer
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
2117 4c9649a9 j_mayer
        target_disas(logfile, pc_start, ctx.pc - pc_start, 1);
2118 4c9649a9 j_mayer
        fprintf(logfile, "\n");
2119 4c9649a9 j_mayer
    }
2120 4c9649a9 j_mayer
#endif
2121 4c9649a9 j_mayer
}
2122 4c9649a9 j_mayer
2123 2cfc5f17 ths
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
2124 4c9649a9 j_mayer
{
2125 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 0);
2126 4c9649a9 j_mayer
}
2127 4c9649a9 j_mayer
2128 2cfc5f17 ths
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
2129 4c9649a9 j_mayer
{
2130 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 1);
2131 4c9649a9 j_mayer
}
2132 4c9649a9 j_mayer
2133 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
2134 4c9649a9 j_mayer
{
2135 4c9649a9 j_mayer
    CPUAlphaState *env;
2136 4c9649a9 j_mayer
    uint64_t hwpcb;
2137 4c9649a9 j_mayer
2138 4c9649a9 j_mayer
    env = qemu_mallocz(sizeof(CPUAlphaState));
2139 4c9649a9 j_mayer
    if (!env)
2140 4c9649a9 j_mayer
        return NULL;
2141 4c9649a9 j_mayer
    cpu_exec_init(env);
2142 2e70f6ef pbrook
    alpha_translate_init();
2143 4c9649a9 j_mayer
    tlb_flush(env, 1);
2144 4c9649a9 j_mayer
    /* XXX: should not be hardcoded */
2145 4c9649a9 j_mayer
    env->implver = IMPLVER_2106x;
2146 4c9649a9 j_mayer
    env->ps = 0x1F00;
2147 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2148 4c9649a9 j_mayer
    env->ps |= 1 << 3;
2149 4c9649a9 j_mayer
#endif
2150 4c9649a9 j_mayer
    pal_init(env);
2151 4c9649a9 j_mayer
    /* Initialize IPR */
2152 4c9649a9 j_mayer
    hwpcb = env->ipr[IPR_PCBB];
2153 4c9649a9 j_mayer
    env->ipr[IPR_ASN] = 0;
2154 4c9649a9 j_mayer
    env->ipr[IPR_ASTEN] = 0;
2155 4c9649a9 j_mayer
    env->ipr[IPR_ASTSR] = 0;
2156 4c9649a9 j_mayer
    env->ipr[IPR_DATFX] = 0;
2157 4c9649a9 j_mayer
    /* XXX: fix this */
2158 4c9649a9 j_mayer
    //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
2159 4c9649a9 j_mayer
    //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
2160 4c9649a9 j_mayer
    //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
2161 4c9649a9 j_mayer
    //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
2162 4c9649a9 j_mayer
    env->ipr[IPR_FEN] = 0;
2163 4c9649a9 j_mayer
    env->ipr[IPR_IPL] = 31;
2164 4c9649a9 j_mayer
    env->ipr[IPR_MCES] = 0;
2165 4c9649a9 j_mayer
    env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
2166 4c9649a9 j_mayer
    //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
2167 4c9649a9 j_mayer
    env->ipr[IPR_SISR] = 0;
2168 4c9649a9 j_mayer
    env->ipr[IPR_VIRBND] = -1ULL;
2169 4c9649a9 j_mayer
2170 4c9649a9 j_mayer
    return env;
2171 4c9649a9 j_mayer
}
2172 aaed909a bellard
2173 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
2174 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
2175 d2856f1a aurel32
{
2176 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
2177 d2856f1a aurel32
}