Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 060718c1

History | View | Annotate | Download (94.5 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 8167ee88 Blue Swirl
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 4c9649a9 j_mayer
 */
19 4c9649a9 j_mayer
20 4c9649a9 j_mayer
#include <stdint.h>
21 4c9649a9 j_mayer
#include <stdlib.h>
22 4c9649a9 j_mayer
#include <stdio.h>
23 4c9649a9 j_mayer
24 4c9649a9 j_mayer
#include "cpu.h"
25 4c9649a9 j_mayer
#include "exec-all.h"
26 4c9649a9 j_mayer
#include "disas.h"
27 ae8ecd42 aurel32
#include "host-utils.h"
28 57fec1fe bellard
#include "tcg-op.h"
29 ca10f867 aurel32
#include "qemu-common.h"
30 4c9649a9 j_mayer
31 a7812ae4 pbrook
#include "helper.h"
32 a7812ae4 pbrook
#define GEN_HELPER 1
33 a7812ae4 pbrook
#include "helper.h"
34 a7812ae4 pbrook
35 19188121 Richard Henderson
#undef ALPHA_DEBUG_DISAS
36 f24518b5 Richard Henderson
#define CONFIG_SOFTFLOAT_INLINE
37 d12d51d5 aliguori
38 d12d51d5 aliguori
#ifdef ALPHA_DEBUG_DISAS
39 806991da Richard Henderson
#  define LOG_DISAS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__)
40 d12d51d5 aliguori
#else
41 d12d51d5 aliguori
#  define LOG_DISAS(...) do { } while (0)
42 d12d51d5 aliguori
#endif
43 d12d51d5 aliguori
44 4c9649a9 j_mayer
typedef struct DisasContext DisasContext;
45 4c9649a9 j_mayer
struct DisasContext {
46 4c9649a9 j_mayer
    uint64_t pc;
47 4c9649a9 j_mayer
    int mem_idx;
48 4c9649a9 j_mayer
#if !defined (CONFIG_USER_ONLY)
49 4c9649a9 j_mayer
    int pal_mode;
50 4c9649a9 j_mayer
#endif
51 8579095b aurel32
    CPUAlphaState *env;
52 4c9649a9 j_mayer
    uint32_t amask;
53 f24518b5 Richard Henderson
54 f24518b5 Richard Henderson
    /* Current rounding mode for this TB.  */
55 f24518b5 Richard Henderson
    int tb_rm;
56 f24518b5 Richard Henderson
    /* Current flush-to-zero setting for this TB.  */
57 f24518b5 Richard Henderson
    int tb_ftz;
58 4c9649a9 j_mayer
};
59 4c9649a9 j_mayer
60 3761035f aurel32
/* global register indexes */
61 a7812ae4 pbrook
static TCGv_ptr cpu_env;
62 496cb5b9 aurel32
static TCGv cpu_ir[31];
63 f18cd223 aurel32
static TCGv cpu_fir[31];
64 496cb5b9 aurel32
static TCGv cpu_pc;
65 f4ed8679 aurel32
static TCGv cpu_lock;
66 ab471ade Richard Henderson
#ifdef CONFIG_USER_ONLY
67 ab471ade Richard Henderson
static TCGv cpu_uniq;
68 ab471ade Richard Henderson
#endif
69 496cb5b9 aurel32
70 3761035f aurel32
/* register names */
71 f18cd223 aurel32
static char cpu_reg_names[10*4+21*5 + 10*5+21*6];
72 2e70f6ef pbrook
73 2e70f6ef pbrook
#include "gen-icount.h"
74 2e70f6ef pbrook
75 a5f1b965 blueswir1
static void alpha_translate_init(void)
76 2e70f6ef pbrook
{
77 496cb5b9 aurel32
    int i;
78 496cb5b9 aurel32
    char *p;
79 2e70f6ef pbrook
    static int done_init = 0;
80 496cb5b9 aurel32
81 2e70f6ef pbrook
    if (done_init)
82 2e70f6ef pbrook
        return;
83 496cb5b9 aurel32
84 a7812ae4 pbrook
    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
85 496cb5b9 aurel32
86 496cb5b9 aurel32
    p = cpu_reg_names;
87 496cb5b9 aurel32
    for (i = 0; i < 31; i++) {
88 496cb5b9 aurel32
        sprintf(p, "ir%d", i);
89 a7812ae4 pbrook
        cpu_ir[i] = tcg_global_mem_new_i64(TCG_AREG0,
90 a7812ae4 pbrook
                                           offsetof(CPUState, ir[i]), p);
91 6ba8dcd7 aurel32
        p += (i < 10) ? 4 : 5;
92 f18cd223 aurel32
93 f18cd223 aurel32
        sprintf(p, "fir%d", i);
94 a7812ae4 pbrook
        cpu_fir[i] = tcg_global_mem_new_i64(TCG_AREG0,
95 a7812ae4 pbrook
                                            offsetof(CPUState, fir[i]), p);
96 f18cd223 aurel32
        p += (i < 10) ? 5 : 6;
97 496cb5b9 aurel32
    }
98 496cb5b9 aurel32
99 a7812ae4 pbrook
    cpu_pc = tcg_global_mem_new_i64(TCG_AREG0,
100 a7812ae4 pbrook
                                    offsetof(CPUState, pc), "pc");
101 496cb5b9 aurel32
102 a7812ae4 pbrook
    cpu_lock = tcg_global_mem_new_i64(TCG_AREG0,
103 a7812ae4 pbrook
                                      offsetof(CPUState, lock), "lock");
104 f4ed8679 aurel32
105 ab471ade Richard Henderson
#ifdef CONFIG_USER_ONLY
106 ab471ade Richard Henderson
    cpu_uniq = tcg_global_mem_new_i64(TCG_AREG0,
107 ab471ade Richard Henderson
                                      offsetof(CPUState, unique), "uniq");
108 ab471ade Richard Henderson
#endif
109 ab471ade Richard Henderson
110 496cb5b9 aurel32
    /* register helpers */
111 a7812ae4 pbrook
#define GEN_HELPER 2
112 496cb5b9 aurel32
#include "helper.h"
113 496cb5b9 aurel32
114 2e70f6ef pbrook
    done_init = 1;
115 2e70f6ef pbrook
}
116 2e70f6ef pbrook
117 636aa200 Blue Swirl
static inline void gen_excp(DisasContext *ctx, int exception, int error_code)
118 4c9649a9 j_mayer
{
119 a7812ae4 pbrook
    TCGv_i32 tmp1, tmp2;
120 6ad02592 aurel32
121 496cb5b9 aurel32
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
122 6ad02592 aurel32
    tmp1 = tcg_const_i32(exception);
123 6ad02592 aurel32
    tmp2 = tcg_const_i32(error_code);
124 a7812ae4 pbrook
    gen_helper_excp(tmp1, tmp2);
125 a7812ae4 pbrook
    tcg_temp_free_i32(tmp2);
126 a7812ae4 pbrook
    tcg_temp_free_i32(tmp1);
127 4c9649a9 j_mayer
}
128 4c9649a9 j_mayer
129 636aa200 Blue Swirl
static inline void gen_invalid(DisasContext *ctx)
130 4c9649a9 j_mayer
{
131 4c9649a9 j_mayer
    gen_excp(ctx, EXCP_OPCDEC, 0);
132 4c9649a9 j_mayer
}
133 4c9649a9 j_mayer
134 636aa200 Blue Swirl
static inline void gen_qemu_ldf(TCGv t0, TCGv t1, int flags)
135 f18cd223 aurel32
{
136 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
137 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
138 f18cd223 aurel32
    tcg_gen_qemu_ld32u(tmp, t1, flags);
139 a7812ae4 pbrook
    tcg_gen_trunc_i64_i32(tmp32, tmp);
140 a7812ae4 pbrook
    gen_helper_memory_to_f(t0, tmp32);
141 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
142 f18cd223 aurel32
    tcg_temp_free(tmp);
143 f18cd223 aurel32
}
144 f18cd223 aurel32
145 636aa200 Blue Swirl
static inline void gen_qemu_ldg(TCGv t0, TCGv t1, int flags)
146 f18cd223 aurel32
{
147 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
148 f18cd223 aurel32
    tcg_gen_qemu_ld64(tmp, t1, flags);
149 a7812ae4 pbrook
    gen_helper_memory_to_g(t0, tmp);
150 f18cd223 aurel32
    tcg_temp_free(tmp);
151 f18cd223 aurel32
}
152 f18cd223 aurel32
153 636aa200 Blue Swirl
static inline void gen_qemu_lds(TCGv t0, TCGv t1, int flags)
154 f18cd223 aurel32
{
155 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
156 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
157 f18cd223 aurel32
    tcg_gen_qemu_ld32u(tmp, t1, flags);
158 a7812ae4 pbrook
    tcg_gen_trunc_i64_i32(tmp32, tmp);
159 a7812ae4 pbrook
    gen_helper_memory_to_s(t0, tmp32);
160 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
161 f18cd223 aurel32
    tcg_temp_free(tmp);
162 f18cd223 aurel32
}
163 f18cd223 aurel32
164 636aa200 Blue Swirl
static inline void gen_qemu_ldl_l(TCGv t0, TCGv t1, int flags)
165 f4ed8679 aurel32
{
166 f4ed8679 aurel32
    tcg_gen_mov_i64(cpu_lock, t1);
167 f4ed8679 aurel32
    tcg_gen_qemu_ld32s(t0, t1, flags);
168 f4ed8679 aurel32
}
169 f4ed8679 aurel32
170 636aa200 Blue Swirl
static inline void gen_qemu_ldq_l(TCGv t0, TCGv t1, int flags)
171 f4ed8679 aurel32
{
172 f4ed8679 aurel32
    tcg_gen_mov_i64(cpu_lock, t1);
173 f4ed8679 aurel32
    tcg_gen_qemu_ld64(t0, t1, flags);
174 f4ed8679 aurel32
}
175 f4ed8679 aurel32
176 636aa200 Blue Swirl
static inline void gen_load_mem(DisasContext *ctx,
177 636aa200 Blue Swirl
                                void (*tcg_gen_qemu_load)(TCGv t0, TCGv t1,
178 636aa200 Blue Swirl
                                                          int flags),
179 636aa200 Blue Swirl
                                int ra, int rb, int32_t disp16, int fp,
180 636aa200 Blue Swirl
                                int clear)
181 023d8ca2 aurel32
{
182 023d8ca2 aurel32
    TCGv addr;
183 023d8ca2 aurel32
184 023d8ca2 aurel32
    if (unlikely(ra == 31))
185 023d8ca2 aurel32
        return;
186 023d8ca2 aurel32
187 a7812ae4 pbrook
    addr = tcg_temp_new();
188 023d8ca2 aurel32
    if (rb != 31) {
189 023d8ca2 aurel32
        tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
190 023d8ca2 aurel32
        if (clear)
191 023d8ca2 aurel32
            tcg_gen_andi_i64(addr, addr, ~0x7);
192 023d8ca2 aurel32
    } else {
193 023d8ca2 aurel32
        if (clear)
194 023d8ca2 aurel32
            disp16 &= ~0x7;
195 023d8ca2 aurel32
        tcg_gen_movi_i64(addr, disp16);
196 023d8ca2 aurel32
    }
197 f18cd223 aurel32
    if (fp)
198 f18cd223 aurel32
        tcg_gen_qemu_load(cpu_fir[ra], addr, ctx->mem_idx);
199 f18cd223 aurel32
    else
200 f18cd223 aurel32
        tcg_gen_qemu_load(cpu_ir[ra], addr, ctx->mem_idx);
201 023d8ca2 aurel32
    tcg_temp_free(addr);
202 023d8ca2 aurel32
}
203 023d8ca2 aurel32
204 636aa200 Blue Swirl
static inline void gen_qemu_stf(TCGv t0, TCGv t1, int flags)
205 f18cd223 aurel32
{
206 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
207 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
208 a7812ae4 pbrook
    gen_helper_f_to_memory(tmp32, t0);
209 a7812ae4 pbrook
    tcg_gen_extu_i32_i64(tmp, tmp32);
210 f18cd223 aurel32
    tcg_gen_qemu_st32(tmp, t1, flags);
211 f18cd223 aurel32
    tcg_temp_free(tmp);
212 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
213 f18cd223 aurel32
}
214 f18cd223 aurel32
215 636aa200 Blue Swirl
static inline void gen_qemu_stg(TCGv t0, TCGv t1, int flags)
216 f18cd223 aurel32
{
217 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
218 a7812ae4 pbrook
    gen_helper_g_to_memory(tmp, t0);
219 f18cd223 aurel32
    tcg_gen_qemu_st64(tmp, t1, flags);
220 f18cd223 aurel32
    tcg_temp_free(tmp);
221 f18cd223 aurel32
}
222 f18cd223 aurel32
223 636aa200 Blue Swirl
static inline void gen_qemu_sts(TCGv t0, TCGv t1, int flags)
224 f18cd223 aurel32
{
225 a7812ae4 pbrook
    TCGv_i32 tmp32 = tcg_temp_new_i32();
226 a7812ae4 pbrook
    TCGv tmp = tcg_temp_new();
227 a7812ae4 pbrook
    gen_helper_s_to_memory(tmp32, t0);
228 a7812ae4 pbrook
    tcg_gen_extu_i32_i64(tmp, tmp32);
229 f18cd223 aurel32
    tcg_gen_qemu_st32(tmp, t1, flags);
230 f18cd223 aurel32
    tcg_temp_free(tmp);
231 a7812ae4 pbrook
    tcg_temp_free_i32(tmp32);
232 f18cd223 aurel32
}
233 f18cd223 aurel32
234 636aa200 Blue Swirl
static inline void gen_qemu_stl_c(TCGv t0, TCGv t1, int flags)
235 f4ed8679 aurel32
{
236 f4ed8679 aurel32
    int l1, l2;
237 f4ed8679 aurel32
238 f4ed8679 aurel32
    l1 = gen_new_label();
239 f4ed8679 aurel32
    l2 = gen_new_label();
240 f4ed8679 aurel32
    tcg_gen_brcond_i64(TCG_COND_NE, cpu_lock, t1, l1);
241 f4ed8679 aurel32
    tcg_gen_qemu_st32(t0, t1, flags);
242 6223246a aurel32
    tcg_gen_movi_i64(t0, 1);
243 f4ed8679 aurel32
    tcg_gen_br(l2);
244 f4ed8679 aurel32
    gen_set_label(l1);
245 6223246a aurel32
    tcg_gen_movi_i64(t0, 0);
246 f4ed8679 aurel32
    gen_set_label(l2);
247 f4ed8679 aurel32
    tcg_gen_movi_i64(cpu_lock, -1);
248 f4ed8679 aurel32
}
249 f4ed8679 aurel32
250 636aa200 Blue Swirl
static inline void gen_qemu_stq_c(TCGv t0, TCGv t1, int flags)
251 f4ed8679 aurel32
{
252 f4ed8679 aurel32
    int l1, l2;
253 f4ed8679 aurel32
254 f4ed8679 aurel32
    l1 = gen_new_label();
255 f4ed8679 aurel32
    l2 = gen_new_label();
256 f4ed8679 aurel32
    tcg_gen_brcond_i64(TCG_COND_NE, cpu_lock, t1, l1);
257 f4ed8679 aurel32
    tcg_gen_qemu_st64(t0, t1, flags);
258 6223246a aurel32
    tcg_gen_movi_i64(t0, 1);
259 f4ed8679 aurel32
    tcg_gen_br(l2);
260 f4ed8679 aurel32
    gen_set_label(l1);
261 6223246a aurel32
    tcg_gen_movi_i64(t0, 0);
262 f4ed8679 aurel32
    gen_set_label(l2);
263 f4ed8679 aurel32
    tcg_gen_movi_i64(cpu_lock, -1);
264 f4ed8679 aurel32
}
265 f4ed8679 aurel32
266 636aa200 Blue Swirl
static inline void gen_store_mem(DisasContext *ctx,
267 636aa200 Blue Swirl
                                 void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1,
268 636aa200 Blue Swirl
                                                            int flags),
269 636aa200 Blue Swirl
                                 int ra, int rb, int32_t disp16, int fp,
270 636aa200 Blue Swirl
                                 int clear, int local)
271 023d8ca2 aurel32
{
272 9cd38c23 aurel32
    TCGv addr;
273 57a92c8e aurel32
    if (local)
274 a7812ae4 pbrook
        addr = tcg_temp_local_new();
275 57a92c8e aurel32
    else
276 a7812ae4 pbrook
        addr = tcg_temp_new();
277 023d8ca2 aurel32
    if (rb != 31) {
278 023d8ca2 aurel32
        tcg_gen_addi_i64(addr, cpu_ir[rb], disp16);
279 023d8ca2 aurel32
        if (clear)
280 023d8ca2 aurel32
            tcg_gen_andi_i64(addr, addr, ~0x7);
281 023d8ca2 aurel32
    } else {
282 023d8ca2 aurel32
        if (clear)
283 023d8ca2 aurel32
            disp16 &= ~0x7;
284 023d8ca2 aurel32
        tcg_gen_movi_i64(addr, disp16);
285 023d8ca2 aurel32
    }
286 f18cd223 aurel32
    if (ra != 31) {
287 f18cd223 aurel32
        if (fp)
288 f18cd223 aurel32
            tcg_gen_qemu_store(cpu_fir[ra], addr, ctx->mem_idx);
289 f18cd223 aurel32
        else
290 f18cd223 aurel32
            tcg_gen_qemu_store(cpu_ir[ra], addr, ctx->mem_idx);
291 f18cd223 aurel32
    } else {
292 57a92c8e aurel32
        TCGv zero;
293 57a92c8e aurel32
        if (local)
294 57a92c8e aurel32
            zero = tcg_const_local_i64(0);
295 57a92c8e aurel32
        else
296 57a92c8e aurel32
            zero = tcg_const_i64(0);
297 023d8ca2 aurel32
        tcg_gen_qemu_store(zero, addr, ctx->mem_idx);
298 023d8ca2 aurel32
        tcg_temp_free(zero);
299 023d8ca2 aurel32
    }
300 023d8ca2 aurel32
    tcg_temp_free(addr);
301 023d8ca2 aurel32
}
302 023d8ca2 aurel32
303 dbb30fe6 Richard Henderson
static void gen_bcond_pcload(DisasContext *ctx, int32_t disp, int lab_true)
304 4c9649a9 j_mayer
{
305 dbb30fe6 Richard Henderson
    int lab_over = gen_new_label();
306 dbb30fe6 Richard Henderson
307 dbb30fe6 Richard Henderson
    tcg_gen_movi_i64(cpu_pc, ctx->pc);
308 dbb30fe6 Richard Henderson
    tcg_gen_br(lab_over);
309 dbb30fe6 Richard Henderson
    gen_set_label(lab_true);
310 dbb30fe6 Richard Henderson
    tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp << 2));
311 dbb30fe6 Richard Henderson
    gen_set_label(lab_over);
312 dbb30fe6 Richard Henderson
}
313 dbb30fe6 Richard Henderson
314 dbb30fe6 Richard Henderson
static void gen_bcond(DisasContext *ctx, TCGCond cond, int ra,
315 dbb30fe6 Richard Henderson
                      int32_t disp, int mask)
316 dbb30fe6 Richard Henderson
{
317 dbb30fe6 Richard Henderson
    int lab_true = gen_new_label();
318 9c29504e aurel32
319 9c29504e aurel32
    if (likely(ra != 31)) {
320 9c29504e aurel32
        if (mask) {
321 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
322 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
323 dbb30fe6 Richard Henderson
            tcg_gen_brcondi_i64(cond, tmp, 0, lab_true);
324 9c29504e aurel32
            tcg_temp_free(tmp);
325 dbb30fe6 Richard Henderson
        } else {
326 dbb30fe6 Richard Henderson
            tcg_gen_brcondi_i64(cond, cpu_ir[ra], 0, lab_true);
327 dbb30fe6 Richard Henderson
        }
328 9c29504e aurel32
    } else {
329 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
330 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
331 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(cond, tmp, 0, lab_true);
332 9c29504e aurel32
        tcg_temp_free(tmp);
333 9c29504e aurel32
    }
334 dbb30fe6 Richard Henderson
    gen_bcond_pcload(ctx, disp, lab_true);
335 4c9649a9 j_mayer
}
336 4c9649a9 j_mayer
337 dbb30fe6 Richard Henderson
/* Generate a forward TCG branch to LAB_TRUE if RA cmp 0.0.
338 dbb30fe6 Richard Henderson
   This is complicated by the fact that -0.0 compares the same as +0.0.  */
339 dbb30fe6 Richard Henderson
340 dbb30fe6 Richard Henderson
static void gen_fbcond_internal(TCGCond cond, TCGv src, int lab_true)
341 4c9649a9 j_mayer
{
342 dbb30fe6 Richard Henderson
    int lab_false = -1;
343 dbb30fe6 Richard Henderson
    uint64_t mzero = 1ull << 63;
344 f18cd223 aurel32
    TCGv tmp;
345 f18cd223 aurel32
346 dbb30fe6 Richard Henderson
    switch (cond) {
347 dbb30fe6 Richard Henderson
    case TCG_COND_LE:
348 dbb30fe6 Richard Henderson
    case TCG_COND_GT:
349 dbb30fe6 Richard Henderson
        /* For <= or >, the -0.0 value directly compares the way we want.  */
350 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(cond, src, 0, lab_true);
351 a7812ae4 pbrook
        break;
352 dbb30fe6 Richard Henderson
353 dbb30fe6 Richard Henderson
    case TCG_COND_EQ:
354 dbb30fe6 Richard Henderson
    case TCG_COND_NE:
355 dbb30fe6 Richard Henderson
        /* For == or !=, we can simply mask off the sign bit and compare.  */
356 dbb30fe6 Richard Henderson
        /* ??? Assume that the temporary is reclaimed at the branch.  */
357 dbb30fe6 Richard Henderson
        tmp = tcg_temp_new();
358 dbb30fe6 Richard Henderson
        tcg_gen_andi_i64(tmp, src, mzero - 1);
359 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(cond, tmp, 0, lab_true);
360 a7812ae4 pbrook
        break;
361 dbb30fe6 Richard Henderson
362 dbb30fe6 Richard Henderson
    case TCG_COND_GE:
363 dbb30fe6 Richard Henderson
        /* For >=, emit two branches to the destination.  */
364 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(cond, src, 0, lab_true);
365 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(TCG_COND_EQ, src, mzero, lab_true);
366 a7812ae4 pbrook
        break;
367 dbb30fe6 Richard Henderson
368 dbb30fe6 Richard Henderson
    case TCG_COND_LT:
369 dbb30fe6 Richard Henderson
        /* For <, first filter out -0.0 to what will be the fallthru.  */
370 dbb30fe6 Richard Henderson
        lab_false = gen_new_label();
371 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(TCG_COND_EQ, src, mzero, lab_false);
372 dbb30fe6 Richard Henderson
        tcg_gen_brcondi_i64(cond, src, 0, lab_true);
373 dbb30fe6 Richard Henderson
        gen_set_label(lab_false);
374 a7812ae4 pbrook
        break;
375 dbb30fe6 Richard Henderson
376 a7812ae4 pbrook
    default:
377 a7812ae4 pbrook
        abort();
378 f18cd223 aurel32
    }
379 dbb30fe6 Richard Henderson
}
380 dbb30fe6 Richard Henderson
381 dbb30fe6 Richard Henderson
static void gen_fbcond(DisasContext *ctx, TCGCond cond, int ra, int32_t disp)
382 dbb30fe6 Richard Henderson
{
383 dbb30fe6 Richard Henderson
    int lab_true;
384 dbb30fe6 Richard Henderson
385 dbb30fe6 Richard Henderson
    if (unlikely(ra == 31)) {
386 dbb30fe6 Richard Henderson
        /* Very uncommon case, but easier to optimize it to an integer
387 dbb30fe6 Richard Henderson
           comparison than continuing with the floating point comparison.  */
388 dbb30fe6 Richard Henderson
        gen_bcond(ctx, cond, ra, disp, 0);
389 dbb30fe6 Richard Henderson
        return;
390 dbb30fe6 Richard Henderson
    }
391 dbb30fe6 Richard Henderson
392 dbb30fe6 Richard Henderson
    lab_true = gen_new_label();
393 dbb30fe6 Richard Henderson
    gen_fbcond_internal(cond, cpu_fir[ra], lab_true);
394 dbb30fe6 Richard Henderson
    gen_bcond_pcload(ctx, disp, lab_true);
395 4c9649a9 j_mayer
}
396 4c9649a9 j_mayer
397 bbe1dab4 Richard Henderson
static void gen_cmov(TCGCond cond, int ra, int rb, int rc,
398 bbe1dab4 Richard Henderson
                     int islit, uint8_t lit, int mask)
399 4c9649a9 j_mayer
{
400 bbe1dab4 Richard Henderson
    TCGCond inv_cond = tcg_invert_cond(cond);
401 9c29504e aurel32
    int l1;
402 9c29504e aurel32
403 9c29504e aurel32
    if (unlikely(rc == 31))
404 9c29504e aurel32
        return;
405 9c29504e aurel32
406 9c29504e aurel32
    l1 = gen_new_label();
407 9c29504e aurel32
408 9c29504e aurel32
    if (ra != 31) {
409 9c29504e aurel32
        if (mask) {
410 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
411 9c29504e aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[ra], 1);
412 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
413 9c29504e aurel32
            tcg_temp_free(tmp);
414 9c29504e aurel32
        } else
415 9c29504e aurel32
            tcg_gen_brcondi_i64(inv_cond, cpu_ir[ra], 0, l1);
416 9c29504e aurel32
    } else {
417 9c29504e aurel32
        /* Very uncommon case - Do not bother to optimize.  */
418 9c29504e aurel32
        TCGv tmp = tcg_const_i64(0);
419 9c29504e aurel32
        tcg_gen_brcondi_i64(inv_cond, tmp, 0, l1);
420 9c29504e aurel32
        tcg_temp_free(tmp);
421 9c29504e aurel32
    }
422 9c29504e aurel32
423 4c9649a9 j_mayer
    if (islit)
424 9c29504e aurel32
        tcg_gen_movi_i64(cpu_ir[rc], lit);
425 4c9649a9 j_mayer
    else
426 dfaa8583 aurel32
        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
427 9c29504e aurel32
    gen_set_label(l1);
428 4c9649a9 j_mayer
}
429 4c9649a9 j_mayer
430 bbe1dab4 Richard Henderson
static void gen_fcmov(TCGCond cond, int ra, int rb, int rc)
431 dbb30fe6 Richard Henderson
{
432 dbb30fe6 Richard Henderson
    TCGv va = cpu_fir[ra];
433 dbb30fe6 Richard Henderson
    int l1;
434 dbb30fe6 Richard Henderson
435 dbb30fe6 Richard Henderson
    if (unlikely(rc == 31))
436 dbb30fe6 Richard Henderson
        return;
437 dbb30fe6 Richard Henderson
    if (unlikely(ra == 31)) {
438 dbb30fe6 Richard Henderson
        /* ??? Assume that the temporary is reclaimed at the branch.  */
439 dbb30fe6 Richard Henderson
        va = tcg_const_i64(0);
440 dbb30fe6 Richard Henderson
    }
441 dbb30fe6 Richard Henderson
442 dbb30fe6 Richard Henderson
    l1 = gen_new_label();
443 bbe1dab4 Richard Henderson
    gen_fbcond_internal(tcg_invert_cond(cond), va, l1);
444 dbb30fe6 Richard Henderson
445 dbb30fe6 Richard Henderson
    if (rb != 31)
446 dbb30fe6 Richard Henderson
        tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[rb]);
447 dbb30fe6 Richard Henderson
    else
448 dbb30fe6 Richard Henderson
        tcg_gen_movi_i64(cpu_fir[rc], 0);
449 dbb30fe6 Richard Henderson
    gen_set_label(l1);
450 dbb30fe6 Richard Henderson
}
451 dbb30fe6 Richard Henderson
452 f24518b5 Richard Henderson
#define QUAL_RM_N       0x080   /* Round mode nearest even */
453 f24518b5 Richard Henderson
#define QUAL_RM_C       0x000   /* Round mode chopped */
454 f24518b5 Richard Henderson
#define QUAL_RM_M       0x040   /* Round mode minus infinity */
455 f24518b5 Richard Henderson
#define QUAL_RM_D       0x0c0   /* Round mode dynamic */
456 f24518b5 Richard Henderson
#define QUAL_RM_MASK    0x0c0
457 f24518b5 Richard Henderson
458 f24518b5 Richard Henderson
#define QUAL_U          0x100   /* Underflow enable (fp output) */
459 f24518b5 Richard Henderson
#define QUAL_V          0x100   /* Overflow enable (int output) */
460 f24518b5 Richard Henderson
#define QUAL_S          0x400   /* Software completion enable */
461 f24518b5 Richard Henderson
#define QUAL_I          0x200   /* Inexact detection enable */
462 f24518b5 Richard Henderson
463 f24518b5 Richard Henderson
static void gen_qual_roundmode(DisasContext *ctx, int fn11)
464 f24518b5 Richard Henderson
{
465 f24518b5 Richard Henderson
    TCGv_i32 tmp;
466 f24518b5 Richard Henderson
467 f24518b5 Richard Henderson
    fn11 &= QUAL_RM_MASK;
468 f24518b5 Richard Henderson
    if (fn11 == ctx->tb_rm) {
469 f24518b5 Richard Henderson
        return;
470 f24518b5 Richard Henderson
    }
471 f24518b5 Richard Henderson
    ctx->tb_rm = fn11;
472 f24518b5 Richard Henderson
473 f24518b5 Richard Henderson
    tmp = tcg_temp_new_i32();
474 f24518b5 Richard Henderson
    switch (fn11) {
475 f24518b5 Richard Henderson
    case QUAL_RM_N:
476 f24518b5 Richard Henderson
        tcg_gen_movi_i32(tmp, float_round_nearest_even);
477 f24518b5 Richard Henderson
        break;
478 f24518b5 Richard Henderson
    case QUAL_RM_C:
479 f24518b5 Richard Henderson
        tcg_gen_movi_i32(tmp, float_round_to_zero);
480 f24518b5 Richard Henderson
        break;
481 f24518b5 Richard Henderson
    case QUAL_RM_M:
482 f24518b5 Richard Henderson
        tcg_gen_movi_i32(tmp, float_round_down);
483 f24518b5 Richard Henderson
        break;
484 f24518b5 Richard Henderson
    case QUAL_RM_D:
485 f24518b5 Richard Henderson
        tcg_gen_ld8u_i32(tmp, cpu_env, offsetof(CPUState, fpcr_dyn_round));
486 f24518b5 Richard Henderson
        break;
487 f24518b5 Richard Henderson
    }
488 f24518b5 Richard Henderson
489 f24518b5 Richard Henderson
#if defined(CONFIG_SOFTFLOAT_INLINE)
490 f24518b5 Richard Henderson
    /* ??? The "softfloat.h" interface is to call set_float_rounding_mode.
491 f24518b5 Richard Henderson
       With CONFIG_SOFTFLOAT that expands to an out-of-line call that just
492 f24518b5 Richard Henderson
       sets the one field.  */
493 f24518b5 Richard Henderson
    tcg_gen_st8_i32(tmp, cpu_env,
494 f24518b5 Richard Henderson
                    offsetof(CPUState, fp_status.float_rounding_mode));
495 f24518b5 Richard Henderson
#else
496 f24518b5 Richard Henderson
    gen_helper_setroundmode(tmp);
497 f24518b5 Richard Henderson
#endif
498 f24518b5 Richard Henderson
499 f24518b5 Richard Henderson
    tcg_temp_free_i32(tmp);
500 f24518b5 Richard Henderson
}
501 f24518b5 Richard Henderson
502 f24518b5 Richard Henderson
static void gen_qual_flushzero(DisasContext *ctx, int fn11)
503 f24518b5 Richard Henderson
{
504 f24518b5 Richard Henderson
    TCGv_i32 tmp;
505 f24518b5 Richard Henderson
506 f24518b5 Richard Henderson
    fn11 &= QUAL_U;
507 f24518b5 Richard Henderson
    if (fn11 == ctx->tb_ftz) {
508 f24518b5 Richard Henderson
        return;
509 f24518b5 Richard Henderson
    }
510 f24518b5 Richard Henderson
    ctx->tb_ftz = fn11;
511 f24518b5 Richard Henderson
512 f24518b5 Richard Henderson
    tmp = tcg_temp_new_i32();
513 f24518b5 Richard Henderson
    if (fn11) {
514 f24518b5 Richard Henderson
        /* Underflow is enabled, use the FPCR setting.  */
515 f24518b5 Richard Henderson
        tcg_gen_ld8u_i32(tmp, cpu_env, offsetof(CPUState, fpcr_flush_to_zero));
516 f24518b5 Richard Henderson
    } else {
517 f24518b5 Richard Henderson
        /* Underflow is disabled, force flush-to-zero.  */
518 f24518b5 Richard Henderson
        tcg_gen_movi_i32(tmp, 1);
519 f24518b5 Richard Henderson
    }
520 f24518b5 Richard Henderson
521 f24518b5 Richard Henderson
#if defined(CONFIG_SOFTFLOAT_INLINE)
522 f24518b5 Richard Henderson
    tcg_gen_st8_i32(tmp, cpu_env,
523 f24518b5 Richard Henderson
                    offsetof(CPUState, fp_status.flush_to_zero));
524 f24518b5 Richard Henderson
#else
525 f24518b5 Richard Henderson
    gen_helper_setflushzero(tmp);
526 f24518b5 Richard Henderson
#endif
527 f24518b5 Richard Henderson
528 f24518b5 Richard Henderson
    tcg_temp_free_i32(tmp);
529 f24518b5 Richard Henderson
}
530 f24518b5 Richard Henderson
531 f24518b5 Richard Henderson
static TCGv gen_ieee_input(int reg, int fn11, int is_cmp)
532 f24518b5 Richard Henderson
{
533 f24518b5 Richard Henderson
    TCGv val = tcg_temp_new();
534 f24518b5 Richard Henderson
    if (reg == 31) {
535 f24518b5 Richard Henderson
        tcg_gen_movi_i64(val, 0);
536 f24518b5 Richard Henderson
    } else if (fn11 & QUAL_S) {
537 f24518b5 Richard Henderson
        gen_helper_ieee_input_s(val, cpu_fir[reg]);
538 f24518b5 Richard Henderson
    } else if (is_cmp) {
539 f24518b5 Richard Henderson
        gen_helper_ieee_input_cmp(val, cpu_fir[reg]);
540 f24518b5 Richard Henderson
    } else {
541 f24518b5 Richard Henderson
        gen_helper_ieee_input(val, cpu_fir[reg]);
542 f24518b5 Richard Henderson
    }
543 f24518b5 Richard Henderson
    return val;
544 f24518b5 Richard Henderson
}
545 f24518b5 Richard Henderson
546 f24518b5 Richard Henderson
static void gen_fp_exc_clear(void)
547 f24518b5 Richard Henderson
{
548 f24518b5 Richard Henderson
#if defined(CONFIG_SOFTFLOAT_INLINE)
549 f24518b5 Richard Henderson
    TCGv_i32 zero = tcg_const_i32(0);
550 f24518b5 Richard Henderson
    tcg_gen_st8_i32(zero, cpu_env,
551 f24518b5 Richard Henderson
                    offsetof(CPUState, fp_status.float_exception_flags));
552 f24518b5 Richard Henderson
    tcg_temp_free_i32(zero);
553 f24518b5 Richard Henderson
#else
554 f24518b5 Richard Henderson
    gen_helper_fp_exc_clear();
555 f24518b5 Richard Henderson
#endif
556 f24518b5 Richard Henderson
}
557 f24518b5 Richard Henderson
558 f24518b5 Richard Henderson
static void gen_fp_exc_raise_ignore(int rc, int fn11, int ignore)
559 f24518b5 Richard Henderson
{
560 f24518b5 Richard Henderson
    /* ??? We ought to be able to do something with imprecise exceptions.
561 f24518b5 Richard Henderson
       E.g. notice we're still in the trap shadow of something within the
562 f24518b5 Richard Henderson
       TB and do not generate the code to signal the exception; end the TB
563 f24518b5 Richard Henderson
       when an exception is forced to arrive, either by consumption of a
564 f24518b5 Richard Henderson
       register value or TRAPB or EXCB.  */
565 f24518b5 Richard Henderson
    TCGv_i32 exc = tcg_temp_new_i32();
566 f24518b5 Richard Henderson
    TCGv_i32 reg;
567 f24518b5 Richard Henderson
568 f24518b5 Richard Henderson
#if defined(CONFIG_SOFTFLOAT_INLINE)
569 f24518b5 Richard Henderson
    tcg_gen_ld8u_i32(exc, cpu_env,
570 f24518b5 Richard Henderson
                     offsetof(CPUState, fp_status.float_exception_flags));
571 f24518b5 Richard Henderson
#else
572 f24518b5 Richard Henderson
    gen_helper_fp_exc_get(exc);
573 f24518b5 Richard Henderson
#endif
574 f24518b5 Richard Henderson
575 f24518b5 Richard Henderson
    if (ignore) {
576 f24518b5 Richard Henderson
        tcg_gen_andi_i32(exc, exc, ~ignore);
577 f24518b5 Richard Henderson
    }
578 f24518b5 Richard Henderson
579 f24518b5 Richard Henderson
    /* ??? Pass in the regno of the destination so that the helper can
580 f24518b5 Richard Henderson
       set EXC_MASK, which contains a bitmask of destination registers
581 f24518b5 Richard Henderson
       that have caused arithmetic traps.  A simple userspace emulation
582 f24518b5 Richard Henderson
       does not require this.  We do need it for a guest kernel's entArith,
583 f24518b5 Richard Henderson
       or if we were to do something clever with imprecise exceptions.  */
584 f24518b5 Richard Henderson
    reg = tcg_const_i32(rc + 32);
585 f24518b5 Richard Henderson
586 f24518b5 Richard Henderson
    if (fn11 & QUAL_S) {
587 f24518b5 Richard Henderson
        gen_helper_fp_exc_raise_s(exc, reg);
588 f24518b5 Richard Henderson
    } else {
589 f24518b5 Richard Henderson
        gen_helper_fp_exc_raise(exc, reg);
590 f24518b5 Richard Henderson
    }
591 f24518b5 Richard Henderson
592 f24518b5 Richard Henderson
    tcg_temp_free_i32(reg);
593 f24518b5 Richard Henderson
    tcg_temp_free_i32(exc);
594 f24518b5 Richard Henderson
}
595 f24518b5 Richard Henderson
596 f24518b5 Richard Henderson
static inline void gen_fp_exc_raise(int rc, int fn11)
597 f24518b5 Richard Henderson
{
598 f24518b5 Richard Henderson
    gen_fp_exc_raise_ignore(rc, fn11, fn11 & QUAL_I ? 0 : float_flag_inexact);
599 4c9649a9 j_mayer
}
600 f24518b5 Richard Henderson
601 735cf45f Richard Henderson
static void gen_fcvtql(int rb, int rc)
602 735cf45f Richard Henderson
{
603 735cf45f Richard Henderson
    if (unlikely(rc == 31)) {
604 735cf45f Richard Henderson
        return;
605 735cf45f Richard Henderson
    }
606 735cf45f Richard Henderson
    if (unlikely(rb == 31)) {
607 735cf45f Richard Henderson
        tcg_gen_movi_i64(cpu_fir[rc], 0);
608 735cf45f Richard Henderson
    } else {
609 735cf45f Richard Henderson
        TCGv tmp = tcg_temp_new();
610 735cf45f Richard Henderson
611 735cf45f Richard Henderson
        tcg_gen_andi_i64(tmp, cpu_fir[rb], 0xC0000000);
612 735cf45f Richard Henderson
        tcg_gen_andi_i64(cpu_fir[rc], cpu_fir[rb], 0x3FFFFFFF);
613 735cf45f Richard Henderson
        tcg_gen_shli_i64(tmp, tmp, 32);
614 735cf45f Richard Henderson
        tcg_gen_shli_i64(cpu_fir[rc], cpu_fir[rc], 29);
615 735cf45f Richard Henderson
        tcg_gen_or_i64(cpu_fir[rc], cpu_fir[rc], tmp);
616 735cf45f Richard Henderson
617 735cf45f Richard Henderson
        tcg_temp_free(tmp);
618 735cf45f Richard Henderson
    }
619 735cf45f Richard Henderson
}
620 735cf45f Richard Henderson
621 735cf45f Richard Henderson
static void gen_fcvtql_v(DisasContext *ctx, int rb, int rc)
622 735cf45f Richard Henderson
{
623 735cf45f Richard Henderson
    if (rb != 31) {
624 735cf45f Richard Henderson
        int lab = gen_new_label();
625 735cf45f Richard Henderson
        TCGv tmp = tcg_temp_new();
626 735cf45f Richard Henderson
627 735cf45f Richard Henderson
        tcg_gen_ext32s_i64(tmp, cpu_fir[rb]);
628 735cf45f Richard Henderson
        tcg_gen_brcond_i64(TCG_COND_EQ, tmp, cpu_fir[rb], lab);
629 735cf45f Richard Henderson
        gen_excp(ctx, EXCP_ARITH, EXC_M_IOV);
630 735cf45f Richard Henderson
631 735cf45f Richard Henderson
        gen_set_label(lab);
632 735cf45f Richard Henderson
    }
633 735cf45f Richard Henderson
    gen_fcvtql(rb, rc);
634 735cf45f Richard Henderson
}
635 735cf45f Richard Henderson
636 f24518b5 Richard Henderson
#define FARITH2(name)                                   \
637 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(int rb, int rc)    \
638 f24518b5 Richard Henderson
{                                                       \
639 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {                           \
640 f24518b5 Richard Henderson
        return;                                         \
641 f24518b5 Richard Henderson
    }                                                   \
642 f24518b5 Richard Henderson
    if (rb != 31) {                                     \
643 f24518b5 Richard Henderson
        gen_helper_ ## name (cpu_fir[rc], cpu_fir[rb]); \
644 f24518b5 Richard Henderson
    } else {                                                \
645 f24518b5 Richard Henderson
        TCGv tmp = tcg_const_i64(0);                    \
646 f24518b5 Richard Henderson
        gen_helper_ ## name (cpu_fir[rc], tmp);         \
647 f24518b5 Richard Henderson
        tcg_temp_free(tmp);                             \
648 f24518b5 Richard Henderson
    }                                                   \
649 f24518b5 Richard Henderson
}
650 f24518b5 Richard Henderson
FARITH2(cvtlq)
651 f24518b5 Richard Henderson
652 f24518b5 Richard Henderson
/* ??? VAX instruction qualifiers ignored.  */
653 a7812ae4 pbrook
FARITH2(sqrtf)
654 a7812ae4 pbrook
FARITH2(sqrtg)
655 a7812ae4 pbrook
FARITH2(cvtgf)
656 a7812ae4 pbrook
FARITH2(cvtgq)
657 a7812ae4 pbrook
FARITH2(cvtqf)
658 a7812ae4 pbrook
FARITH2(cvtqg)
659 f24518b5 Richard Henderson
660 f24518b5 Richard Henderson
static void gen_ieee_arith2(DisasContext *ctx, void (*helper)(TCGv, TCGv),
661 f24518b5 Richard Henderson
                            int rb, int rc, int fn11)
662 f24518b5 Richard Henderson
{
663 f24518b5 Richard Henderson
    TCGv vb;
664 f24518b5 Richard Henderson
665 f24518b5 Richard Henderson
    /* ??? This is wrong: the instruction is not a nop, it still may
666 f24518b5 Richard Henderson
       raise exceptions.  */
667 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {
668 f24518b5 Richard Henderson
        return;
669 f24518b5 Richard Henderson
    }
670 f24518b5 Richard Henderson
671 f24518b5 Richard Henderson
    gen_qual_roundmode(ctx, fn11);
672 f24518b5 Richard Henderson
    gen_qual_flushzero(ctx, fn11);
673 f24518b5 Richard Henderson
    gen_fp_exc_clear();
674 f24518b5 Richard Henderson
675 f24518b5 Richard Henderson
    vb = gen_ieee_input(rb, fn11, 0);
676 f24518b5 Richard Henderson
    helper(cpu_fir[rc], vb);
677 f24518b5 Richard Henderson
    tcg_temp_free(vb);
678 f24518b5 Richard Henderson
679 f24518b5 Richard Henderson
    gen_fp_exc_raise(rc, fn11);
680 f24518b5 Richard Henderson
}
681 f24518b5 Richard Henderson
682 f24518b5 Richard Henderson
#define IEEE_ARITH2(name)                                       \
683 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(DisasContext *ctx,         \
684 f24518b5 Richard Henderson
                                     int rb, int rc, int fn11)  \
685 f24518b5 Richard Henderson
{                                                               \
686 f24518b5 Richard Henderson
    gen_ieee_arith2(ctx, gen_helper_##name, rb, rc, fn11);      \
687 f24518b5 Richard Henderson
}
688 f24518b5 Richard Henderson
IEEE_ARITH2(sqrts)
689 f24518b5 Richard Henderson
IEEE_ARITH2(sqrtt)
690 f24518b5 Richard Henderson
IEEE_ARITH2(cvtst)
691 f24518b5 Richard Henderson
IEEE_ARITH2(cvtts)
692 f24518b5 Richard Henderson
693 f24518b5 Richard Henderson
static void gen_fcvttq(DisasContext *ctx, int rb, int rc, int fn11)
694 f24518b5 Richard Henderson
{
695 f24518b5 Richard Henderson
    TCGv vb;
696 f24518b5 Richard Henderson
    int ignore = 0;
697 f24518b5 Richard Henderson
698 f24518b5 Richard Henderson
    /* ??? This is wrong: the instruction is not a nop, it still may
699 f24518b5 Richard Henderson
       raise exceptions.  */
700 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {
701 f24518b5 Richard Henderson
        return;
702 f24518b5 Richard Henderson
    }
703 f24518b5 Richard Henderson
704 f24518b5 Richard Henderson
    /* No need to set flushzero, since we have an integer output.  */
705 f24518b5 Richard Henderson
    gen_fp_exc_clear();
706 f24518b5 Richard Henderson
    vb = gen_ieee_input(rb, fn11, 0);
707 f24518b5 Richard Henderson
708 f24518b5 Richard Henderson
    /* Almost all integer conversions use cropped rounding, and most
709 f24518b5 Richard Henderson
       also do not have integer overflow enabled.  Special case that.  */
710 f24518b5 Richard Henderson
    switch (fn11) {
711 f24518b5 Richard Henderson
    case QUAL_RM_C:
712 f24518b5 Richard Henderson
        gen_helper_cvttq_c(cpu_fir[rc], vb);
713 f24518b5 Richard Henderson
        break;
714 f24518b5 Richard Henderson
    case QUAL_V | QUAL_RM_C:
715 f24518b5 Richard Henderson
    case QUAL_S | QUAL_V | QUAL_RM_C:
716 f24518b5 Richard Henderson
        ignore = float_flag_inexact;
717 f24518b5 Richard Henderson
        /* FALLTHRU */
718 f24518b5 Richard Henderson
    case QUAL_S | QUAL_V | QUAL_I | QUAL_RM_C:
719 f24518b5 Richard Henderson
        gen_helper_cvttq_svic(cpu_fir[rc], vb);
720 f24518b5 Richard Henderson
        break;
721 f24518b5 Richard Henderson
    default:
722 f24518b5 Richard Henderson
        gen_qual_roundmode(ctx, fn11);
723 f24518b5 Richard Henderson
        gen_helper_cvttq(cpu_fir[rc], vb);
724 f24518b5 Richard Henderson
        ignore |= (fn11 & QUAL_V ? 0 : float_flag_overflow);
725 f24518b5 Richard Henderson
        ignore |= (fn11 & QUAL_I ? 0 : float_flag_inexact);
726 f24518b5 Richard Henderson
        break;
727 f24518b5 Richard Henderson
    }
728 f24518b5 Richard Henderson
    tcg_temp_free(vb);
729 f24518b5 Richard Henderson
730 f24518b5 Richard Henderson
    gen_fp_exc_raise_ignore(rc, fn11, ignore);
731 4c9649a9 j_mayer
}
732 4c9649a9 j_mayer
733 f24518b5 Richard Henderson
static void gen_ieee_intcvt(DisasContext *ctx, void (*helper)(TCGv, TCGv),
734 f24518b5 Richard Henderson
                            int rb, int rc, int fn11)
735 f24518b5 Richard Henderson
{
736 f24518b5 Richard Henderson
    TCGv vb;
737 f24518b5 Richard Henderson
738 f24518b5 Richard Henderson
    /* ??? This is wrong: the instruction is not a nop, it still may
739 f24518b5 Richard Henderson
       raise exceptions.  */
740 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {
741 f24518b5 Richard Henderson
        return;
742 f24518b5 Richard Henderson
    }
743 f24518b5 Richard Henderson
744 f24518b5 Richard Henderson
    gen_qual_roundmode(ctx, fn11);
745 f24518b5 Richard Henderson
746 f24518b5 Richard Henderson
    if (rb == 31) {
747 f24518b5 Richard Henderson
        vb = tcg_const_i64(0);
748 f24518b5 Richard Henderson
    } else {
749 f24518b5 Richard Henderson
        vb = cpu_fir[rb];
750 f24518b5 Richard Henderson
    }
751 f24518b5 Richard Henderson
752 f24518b5 Richard Henderson
    /* The only exception that can be raised by integer conversion
753 f24518b5 Richard Henderson
       is inexact.  Thus we only need to worry about exceptions when
754 f24518b5 Richard Henderson
       inexact handling is requested.  */
755 f24518b5 Richard Henderson
    if (fn11 & QUAL_I) {
756 f24518b5 Richard Henderson
        gen_fp_exc_clear();
757 f24518b5 Richard Henderson
        helper(cpu_fir[rc], vb);
758 f24518b5 Richard Henderson
        gen_fp_exc_raise(rc, fn11);
759 f24518b5 Richard Henderson
    } else {
760 f24518b5 Richard Henderson
        helper(cpu_fir[rc], vb);
761 f24518b5 Richard Henderson
    }
762 f24518b5 Richard Henderson
763 f24518b5 Richard Henderson
    if (rb == 31) {
764 f24518b5 Richard Henderson
        tcg_temp_free(vb);
765 f24518b5 Richard Henderson
    }
766 f24518b5 Richard Henderson
}
767 f24518b5 Richard Henderson
768 f24518b5 Richard Henderson
#define IEEE_INTCVT(name)                                       \
769 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(DisasContext *ctx,         \
770 f24518b5 Richard Henderson
                                     int rb, int rc, int fn11)  \
771 f24518b5 Richard Henderson
{                                                               \
772 f24518b5 Richard Henderson
    gen_ieee_intcvt(ctx, gen_helper_##name, rb, rc, fn11);      \
773 f24518b5 Richard Henderson
}
774 f24518b5 Richard Henderson
IEEE_INTCVT(cvtqs)
775 f24518b5 Richard Henderson
IEEE_INTCVT(cvtqt)
776 f24518b5 Richard Henderson
777 f24518b5 Richard Henderson
#define FARITH3(name)                                           \
778 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(int ra, int rb, int rc)    \
779 f24518b5 Richard Henderson
{                                                               \
780 f24518b5 Richard Henderson
    TCGv va, vb;                                                \
781 f24518b5 Richard Henderson
                                                                \
782 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {                                   \
783 f24518b5 Richard Henderson
        return;                                                 \
784 f24518b5 Richard Henderson
    }                                                           \
785 f24518b5 Richard Henderson
    if (ra == 31) {                                             \
786 f24518b5 Richard Henderson
        va = tcg_const_i64(0);                                  \
787 f24518b5 Richard Henderson
    } else {                                                    \
788 f24518b5 Richard Henderson
        va = cpu_fir[ra];                                       \
789 f24518b5 Richard Henderson
    }                                                           \
790 f24518b5 Richard Henderson
    if (rb == 31) {                                             \
791 f24518b5 Richard Henderson
        vb = tcg_const_i64(0);                                  \
792 f24518b5 Richard Henderson
    } else {                                                    \
793 f24518b5 Richard Henderson
        vb = cpu_fir[rb];                                       \
794 f24518b5 Richard Henderson
    }                                                           \
795 f24518b5 Richard Henderson
                                                                \
796 f24518b5 Richard Henderson
    gen_helper_ ## name (cpu_fir[rc], va, vb);                  \
797 f24518b5 Richard Henderson
                                                                \
798 f24518b5 Richard Henderson
    if (ra == 31) {                                             \
799 f24518b5 Richard Henderson
        tcg_temp_free(va);                                      \
800 f24518b5 Richard Henderson
    }                                                           \
801 f24518b5 Richard Henderson
    if (rb == 31) {                                             \
802 f24518b5 Richard Henderson
        tcg_temp_free(vb);                                      \
803 f24518b5 Richard Henderson
    }                                                           \
804 f24518b5 Richard Henderson
}
805 f24518b5 Richard Henderson
/* ??? Ought to expand these inline; simple masking operations.  */
806 f24518b5 Richard Henderson
FARITH3(cpys)
807 f24518b5 Richard Henderson
FARITH3(cpysn)
808 f24518b5 Richard Henderson
FARITH3(cpyse)
809 f24518b5 Richard Henderson
810 f24518b5 Richard Henderson
/* ??? VAX instruction qualifiers ignored.  */
811 a7812ae4 pbrook
FARITH3(addf)
812 a7812ae4 pbrook
FARITH3(subf)
813 a7812ae4 pbrook
FARITH3(mulf)
814 a7812ae4 pbrook
FARITH3(divf)
815 a7812ae4 pbrook
FARITH3(addg)
816 a7812ae4 pbrook
FARITH3(subg)
817 a7812ae4 pbrook
FARITH3(mulg)
818 a7812ae4 pbrook
FARITH3(divg)
819 a7812ae4 pbrook
FARITH3(cmpgeq)
820 a7812ae4 pbrook
FARITH3(cmpglt)
821 a7812ae4 pbrook
FARITH3(cmpgle)
822 f24518b5 Richard Henderson
823 f24518b5 Richard Henderson
static void gen_ieee_arith3(DisasContext *ctx,
824 f24518b5 Richard Henderson
                            void (*helper)(TCGv, TCGv, TCGv),
825 f24518b5 Richard Henderson
                            int ra, int rb, int rc, int fn11)
826 f24518b5 Richard Henderson
{
827 f24518b5 Richard Henderson
    TCGv va, vb;
828 f24518b5 Richard Henderson
829 f24518b5 Richard Henderson
    /* ??? This is wrong: the instruction is not a nop, it still may
830 f24518b5 Richard Henderson
       raise exceptions.  */
831 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {
832 f24518b5 Richard Henderson
        return;
833 f24518b5 Richard Henderson
    }
834 f24518b5 Richard Henderson
835 f24518b5 Richard Henderson
    gen_qual_roundmode(ctx, fn11);
836 f24518b5 Richard Henderson
    gen_qual_flushzero(ctx, fn11);
837 f24518b5 Richard Henderson
    gen_fp_exc_clear();
838 f24518b5 Richard Henderson
839 f24518b5 Richard Henderson
    va = gen_ieee_input(ra, fn11, 0);
840 f24518b5 Richard Henderson
    vb = gen_ieee_input(rb, fn11, 0);
841 f24518b5 Richard Henderson
    helper(cpu_fir[rc], va, vb);
842 f24518b5 Richard Henderson
    tcg_temp_free(va);
843 f24518b5 Richard Henderson
    tcg_temp_free(vb);
844 f24518b5 Richard Henderson
845 f24518b5 Richard Henderson
    gen_fp_exc_raise(rc, fn11);
846 f24518b5 Richard Henderson
}
847 f24518b5 Richard Henderson
848 f24518b5 Richard Henderson
#define IEEE_ARITH3(name)                                               \
849 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(DisasContext *ctx,                 \
850 f24518b5 Richard Henderson
                                     int ra, int rb, int rc, int fn11)  \
851 f24518b5 Richard Henderson
{                                                                       \
852 f24518b5 Richard Henderson
    gen_ieee_arith3(ctx, gen_helper_##name, ra, rb, rc, fn11);          \
853 f24518b5 Richard Henderson
}
854 f24518b5 Richard Henderson
IEEE_ARITH3(adds)
855 f24518b5 Richard Henderson
IEEE_ARITH3(subs)
856 f24518b5 Richard Henderson
IEEE_ARITH3(muls)
857 f24518b5 Richard Henderson
IEEE_ARITH3(divs)
858 f24518b5 Richard Henderson
IEEE_ARITH3(addt)
859 f24518b5 Richard Henderson
IEEE_ARITH3(subt)
860 f24518b5 Richard Henderson
IEEE_ARITH3(mult)
861 f24518b5 Richard Henderson
IEEE_ARITH3(divt)
862 f24518b5 Richard Henderson
863 f24518b5 Richard Henderson
static void gen_ieee_compare(DisasContext *ctx,
864 f24518b5 Richard Henderson
                             void (*helper)(TCGv, TCGv, TCGv),
865 f24518b5 Richard Henderson
                             int ra, int rb, int rc, int fn11)
866 f24518b5 Richard Henderson
{
867 f24518b5 Richard Henderson
    TCGv va, vb;
868 f24518b5 Richard Henderson
869 f24518b5 Richard Henderson
    /* ??? This is wrong: the instruction is not a nop, it still may
870 f24518b5 Richard Henderson
       raise exceptions.  */
871 f24518b5 Richard Henderson
    if (unlikely(rc == 31)) {
872 f24518b5 Richard Henderson
        return;
873 f24518b5 Richard Henderson
    }
874 f24518b5 Richard Henderson
875 f24518b5 Richard Henderson
    gen_fp_exc_clear();
876 f24518b5 Richard Henderson
877 f24518b5 Richard Henderson
    va = gen_ieee_input(ra, fn11, 1);
878 f24518b5 Richard Henderson
    vb = gen_ieee_input(rb, fn11, 1);
879 f24518b5 Richard Henderson
    helper(cpu_fir[rc], va, vb);
880 f24518b5 Richard Henderson
    tcg_temp_free(va);
881 f24518b5 Richard Henderson
    tcg_temp_free(vb);
882 f24518b5 Richard Henderson
883 f24518b5 Richard Henderson
    gen_fp_exc_raise(rc, fn11);
884 f24518b5 Richard Henderson
}
885 f24518b5 Richard Henderson
886 f24518b5 Richard Henderson
#define IEEE_CMP3(name)                                                 \
887 f24518b5 Richard Henderson
static inline void glue(gen_f, name)(DisasContext *ctx,                 \
888 f24518b5 Richard Henderson
                                     int ra, int rb, int rc, int fn11)  \
889 f24518b5 Richard Henderson
{                                                                       \
890 f24518b5 Richard Henderson
    gen_ieee_compare(ctx, gen_helper_##name, ra, rb, rc, fn11);         \
891 f24518b5 Richard Henderson
}
892 f24518b5 Richard Henderson
IEEE_CMP3(cmptun)
893 f24518b5 Richard Henderson
IEEE_CMP3(cmpteq)
894 f24518b5 Richard Henderson
IEEE_CMP3(cmptlt)
895 f24518b5 Richard Henderson
IEEE_CMP3(cmptle)
896 a7812ae4 pbrook
897 248c42f3 Richard Henderson
static inline uint64_t zapnot_mask(uint8_t lit)
898 248c42f3 Richard Henderson
{
899 248c42f3 Richard Henderson
    uint64_t mask = 0;
900 248c42f3 Richard Henderson
    int i;
901 248c42f3 Richard Henderson
902 248c42f3 Richard Henderson
    for (i = 0; i < 8; ++i) {
903 248c42f3 Richard Henderson
        if ((lit >> i) & 1)
904 248c42f3 Richard Henderson
            mask |= 0xffull << (i * 8);
905 248c42f3 Richard Henderson
    }
906 248c42f3 Richard Henderson
    return mask;
907 248c42f3 Richard Henderson
}
908 248c42f3 Richard Henderson
909 87d98f95 Richard Henderson
/* Implement zapnot with an immediate operand, which expands to some
910 87d98f95 Richard Henderson
   form of immediate AND.  This is a basic building block in the
911 87d98f95 Richard Henderson
   definition of many of the other byte manipulation instructions.  */
912 248c42f3 Richard Henderson
static void gen_zapnoti(TCGv dest, TCGv src, uint8_t lit)
913 87d98f95 Richard Henderson
{
914 87d98f95 Richard Henderson
    switch (lit) {
915 87d98f95 Richard Henderson
    case 0x00:
916 248c42f3 Richard Henderson
        tcg_gen_movi_i64(dest, 0);
917 87d98f95 Richard Henderson
        break;
918 87d98f95 Richard Henderson
    case 0x01:
919 248c42f3 Richard Henderson
        tcg_gen_ext8u_i64(dest, src);
920 87d98f95 Richard Henderson
        break;
921 87d98f95 Richard Henderson
    case 0x03:
922 248c42f3 Richard Henderson
        tcg_gen_ext16u_i64(dest, src);
923 87d98f95 Richard Henderson
        break;
924 87d98f95 Richard Henderson
    case 0x0f:
925 248c42f3 Richard Henderson
        tcg_gen_ext32u_i64(dest, src);
926 87d98f95 Richard Henderson
        break;
927 87d98f95 Richard Henderson
    case 0xff:
928 248c42f3 Richard Henderson
        tcg_gen_mov_i64(dest, src);
929 87d98f95 Richard Henderson
        break;
930 87d98f95 Richard Henderson
    default:
931 248c42f3 Richard Henderson
        tcg_gen_andi_i64 (dest, src, zapnot_mask (lit));
932 87d98f95 Richard Henderson
        break;
933 87d98f95 Richard Henderson
    }
934 87d98f95 Richard Henderson
}
935 87d98f95 Richard Henderson
936 87d98f95 Richard Henderson
static inline void gen_zapnot(int ra, int rb, int rc, int islit, uint8_t lit)
937 87d98f95 Richard Henderson
{
938 87d98f95 Richard Henderson
    if (unlikely(rc == 31))
939 87d98f95 Richard Henderson
        return;
940 87d98f95 Richard Henderson
    else if (unlikely(ra == 31))
941 87d98f95 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
942 87d98f95 Richard Henderson
    else if (islit)
943 248c42f3 Richard Henderson
        gen_zapnoti(cpu_ir[rc], cpu_ir[ra], lit);
944 87d98f95 Richard Henderson
    else
945 87d98f95 Richard Henderson
        gen_helper_zapnot (cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
946 87d98f95 Richard Henderson
}
947 87d98f95 Richard Henderson
948 87d98f95 Richard Henderson
static inline void gen_zap(int ra, int rb, int rc, int islit, uint8_t lit)
949 87d98f95 Richard Henderson
{
950 87d98f95 Richard Henderson
    if (unlikely(rc == 31))
951 87d98f95 Richard Henderson
        return;
952 87d98f95 Richard Henderson
    else if (unlikely(ra == 31))
953 87d98f95 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
954 87d98f95 Richard Henderson
    else if (islit)
955 248c42f3 Richard Henderson
        gen_zapnoti(cpu_ir[rc], cpu_ir[ra], ~lit);
956 87d98f95 Richard Henderson
    else
957 87d98f95 Richard Henderson
        gen_helper_zap (cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
958 87d98f95 Richard Henderson
}
959 87d98f95 Richard Henderson
960 87d98f95 Richard Henderson
961 248c42f3 Richard Henderson
/* EXTWH, EXTLH, EXTQH */
962 ffec44f1 Richard Henderson
static void gen_ext_h(int ra, int rb, int rc, int islit,
963 ffec44f1 Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
964 b3249f63 aurel32
{
965 b3249f63 aurel32
    if (unlikely(rc == 31))
966 b3249f63 aurel32
        return;
967 377a43b6 Richard Henderson
    else if (unlikely(ra == 31))
968 377a43b6 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
969 377a43b6 Richard Henderson
    else {
970 dfaa8583 aurel32
        if (islit) {
971 377a43b6 Richard Henderson
            lit = (64 - (lit & 7) * 8) & 0x3f;
972 377a43b6 Richard Henderson
            tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit);
973 fe2b269a aurel32
        } else {
974 377a43b6 Richard Henderson
            TCGv tmp1 = tcg_temp_new();
975 b3249f63 aurel32
            tcg_gen_andi_i64(tmp1, cpu_ir[rb], 7);
976 b3249f63 aurel32
            tcg_gen_shli_i64(tmp1, tmp1, 3);
977 dbf95805 Vince Weaver
            tcg_gen_neg_i64(tmp1, tmp1);
978 dbf95805 Vince Weaver
            tcg_gen_andi_i64(tmp1, tmp1, 0x3f);
979 dfaa8583 aurel32
            tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], tmp1);
980 b3249f63 aurel32
            tcg_temp_free(tmp1);
981 dfaa8583 aurel32
        }
982 248c42f3 Richard Henderson
        gen_zapnoti(cpu_ir[rc], cpu_ir[rc], byte_mask);
983 377a43b6 Richard Henderson
    }
984 b3249f63 aurel32
}
985 b3249f63 aurel32
986 248c42f3 Richard Henderson
/* EXTBL, EXTWL, EXTLL, EXTQL */
987 ffec44f1 Richard Henderson
static void gen_ext_l(int ra, int rb, int rc, int islit,
988 ffec44f1 Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
989 b3249f63 aurel32
{
990 b3249f63 aurel32
    if (unlikely(rc == 31))
991 b3249f63 aurel32
        return;
992 377a43b6 Richard Henderson
    else if (unlikely(ra == 31))
993 377a43b6 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
994 377a43b6 Richard Henderson
    else {
995 dfaa8583 aurel32
        if (islit) {
996 377a43b6 Richard Henderson
            tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], (lit & 7) * 8);
997 dfaa8583 aurel32
        } else {
998 a7812ae4 pbrook
            TCGv tmp = tcg_temp_new();
999 b3249f63 aurel32
            tcg_gen_andi_i64(tmp, cpu_ir[rb], 7);
1000 b3249f63 aurel32
            tcg_gen_shli_i64(tmp, tmp, 3);
1001 dfaa8583 aurel32
            tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], tmp);
1002 b3249f63 aurel32
            tcg_temp_free(tmp);
1003 fe2b269a aurel32
        }
1004 248c42f3 Richard Henderson
        gen_zapnoti(cpu_ir[rc], cpu_ir[rc], byte_mask);
1005 248c42f3 Richard Henderson
    }
1006 248c42f3 Richard Henderson
}
1007 248c42f3 Richard Henderson
1008 50eb6e5c Richard Henderson
/* INSWH, INSLH, INSQH */
1009 50eb6e5c Richard Henderson
static void gen_ins_h(int ra, int rb, int rc, int islit,
1010 50eb6e5c Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
1011 50eb6e5c Richard Henderson
{
1012 50eb6e5c Richard Henderson
    if (unlikely(rc == 31))
1013 50eb6e5c Richard Henderson
        return;
1014 50eb6e5c Richard Henderson
    else if (unlikely(ra == 31) || (islit && (lit & 7) == 0))
1015 50eb6e5c Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
1016 50eb6e5c Richard Henderson
    else {
1017 50eb6e5c Richard Henderson
        TCGv tmp = tcg_temp_new();
1018 50eb6e5c Richard Henderson
1019 50eb6e5c Richard Henderson
        /* The instruction description has us left-shift the byte mask
1020 50eb6e5c Richard Henderson
           and extract bits <15:8> and apply that zap at the end.  This
1021 50eb6e5c Richard Henderson
           is equivalent to simply performing the zap first and shifting
1022 50eb6e5c Richard Henderson
           afterward.  */
1023 50eb6e5c Richard Henderson
        gen_zapnoti (tmp, cpu_ir[ra], byte_mask);
1024 50eb6e5c Richard Henderson
1025 50eb6e5c Richard Henderson
        if (islit) {
1026 50eb6e5c Richard Henderson
            /* Note that we have handled the lit==0 case above.  */
1027 50eb6e5c Richard Henderson
            tcg_gen_shri_i64 (cpu_ir[rc], tmp, 64 - (lit & 7) * 8);
1028 50eb6e5c Richard Henderson
        } else {
1029 50eb6e5c Richard Henderson
            TCGv shift = tcg_temp_new();
1030 50eb6e5c Richard Henderson
1031 50eb6e5c Richard Henderson
            /* If (B & 7) == 0, we need to shift by 64 and leave a zero.
1032 50eb6e5c Richard Henderson
               Do this portably by splitting the shift into two parts:
1033 50eb6e5c Richard Henderson
               shift_count-1 and 1.  Arrange for the -1 by using
1034 50eb6e5c Richard Henderson
               ones-complement instead of twos-complement in the negation:
1035 50eb6e5c Richard Henderson
               ~((B & 7) * 8) & 63.  */
1036 50eb6e5c Richard Henderson
1037 50eb6e5c Richard Henderson
            tcg_gen_andi_i64(shift, cpu_ir[rb], 7);
1038 50eb6e5c Richard Henderson
            tcg_gen_shli_i64(shift, shift, 3);
1039 50eb6e5c Richard Henderson
            tcg_gen_not_i64(shift, shift);
1040 50eb6e5c Richard Henderson
            tcg_gen_andi_i64(shift, shift, 0x3f);
1041 50eb6e5c Richard Henderson
1042 50eb6e5c Richard Henderson
            tcg_gen_shr_i64(cpu_ir[rc], tmp, shift);
1043 50eb6e5c Richard Henderson
            tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[rc], 1);
1044 50eb6e5c Richard Henderson
            tcg_temp_free(shift);
1045 50eb6e5c Richard Henderson
        }
1046 50eb6e5c Richard Henderson
        tcg_temp_free(tmp);
1047 50eb6e5c Richard Henderson
    }
1048 50eb6e5c Richard Henderson
}
1049 50eb6e5c Richard Henderson
1050 248c42f3 Richard Henderson
/* INSBL, INSWL, INSLL, INSQL */
1051 ffec44f1 Richard Henderson
static void gen_ins_l(int ra, int rb, int rc, int islit,
1052 ffec44f1 Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
1053 248c42f3 Richard Henderson
{
1054 248c42f3 Richard Henderson
    if (unlikely(rc == 31))
1055 248c42f3 Richard Henderson
        return;
1056 248c42f3 Richard Henderson
    else if (unlikely(ra == 31))
1057 248c42f3 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
1058 248c42f3 Richard Henderson
    else {
1059 248c42f3 Richard Henderson
        TCGv tmp = tcg_temp_new();
1060 248c42f3 Richard Henderson
1061 248c42f3 Richard Henderson
        /* The instruction description has us left-shift the byte mask
1062 248c42f3 Richard Henderson
           the same number of byte slots as the data and apply the zap
1063 248c42f3 Richard Henderson
           at the end.  This is equivalent to simply performing the zap
1064 248c42f3 Richard Henderson
           first and shifting afterward.  */
1065 248c42f3 Richard Henderson
        gen_zapnoti (tmp, cpu_ir[ra], byte_mask);
1066 248c42f3 Richard Henderson
1067 248c42f3 Richard Henderson
        if (islit) {
1068 248c42f3 Richard Henderson
            tcg_gen_shli_i64(cpu_ir[rc], tmp, (lit & 7) * 8);
1069 248c42f3 Richard Henderson
        } else {
1070 248c42f3 Richard Henderson
            TCGv shift = tcg_temp_new();
1071 248c42f3 Richard Henderson
            tcg_gen_andi_i64(shift, cpu_ir[rb], 7);
1072 248c42f3 Richard Henderson
            tcg_gen_shli_i64(shift, shift, 3);
1073 248c42f3 Richard Henderson
            tcg_gen_shl_i64(cpu_ir[rc], tmp, shift);
1074 248c42f3 Richard Henderson
            tcg_temp_free(shift);
1075 248c42f3 Richard Henderson
        }
1076 248c42f3 Richard Henderson
        tcg_temp_free(tmp);
1077 377a43b6 Richard Henderson
    }
1078 b3249f63 aurel32
}
1079 b3249f63 aurel32
1080 ffec44f1 Richard Henderson
/* MSKWH, MSKLH, MSKQH */
1081 ffec44f1 Richard Henderson
static void gen_msk_h(int ra, int rb, int rc, int islit,
1082 ffec44f1 Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
1083 ffec44f1 Richard Henderson
{
1084 ffec44f1 Richard Henderson
    if (unlikely(rc == 31))
1085 ffec44f1 Richard Henderson
        return;
1086 ffec44f1 Richard Henderson
    else if (unlikely(ra == 31))
1087 ffec44f1 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
1088 ffec44f1 Richard Henderson
    else if (islit) {
1089 ffec44f1 Richard Henderson
        gen_zapnoti (cpu_ir[rc], cpu_ir[ra], ~((byte_mask << (lit & 7)) >> 8));
1090 ffec44f1 Richard Henderson
    } else {
1091 ffec44f1 Richard Henderson
        TCGv shift = tcg_temp_new();
1092 ffec44f1 Richard Henderson
        TCGv mask = tcg_temp_new();
1093 ffec44f1 Richard Henderson
1094 ffec44f1 Richard Henderson
        /* The instruction description is as above, where the byte_mask
1095 ffec44f1 Richard Henderson
           is shifted left, and then we extract bits <15:8>.  This can be
1096 ffec44f1 Richard Henderson
           emulated with a right-shift on the expanded byte mask.  This
1097 ffec44f1 Richard Henderson
           requires extra care because for an input <2:0> == 0 we need a
1098 ffec44f1 Richard Henderson
           shift of 64 bits in order to generate a zero.  This is done by
1099 ffec44f1 Richard Henderson
           splitting the shift into two parts, the variable shift - 1
1100 ffec44f1 Richard Henderson
           followed by a constant 1 shift.  The code we expand below is
1101 ffec44f1 Richard Henderson
           equivalent to ~((B & 7) * 8) & 63.  */
1102 ffec44f1 Richard Henderson
1103 ffec44f1 Richard Henderson
        tcg_gen_andi_i64(shift, cpu_ir[rb], 7);
1104 ffec44f1 Richard Henderson
        tcg_gen_shli_i64(shift, shift, 3);
1105 ffec44f1 Richard Henderson
        tcg_gen_not_i64(shift, shift);
1106 ffec44f1 Richard Henderson
        tcg_gen_andi_i64(shift, shift, 0x3f);
1107 ffec44f1 Richard Henderson
        tcg_gen_movi_i64(mask, zapnot_mask (byte_mask));
1108 ffec44f1 Richard Henderson
        tcg_gen_shr_i64(mask, mask, shift);
1109 ffec44f1 Richard Henderson
        tcg_gen_shri_i64(mask, mask, 1);
1110 ffec44f1 Richard Henderson
1111 ffec44f1 Richard Henderson
        tcg_gen_andc_i64(cpu_ir[rc], cpu_ir[ra], mask);
1112 ffec44f1 Richard Henderson
1113 ffec44f1 Richard Henderson
        tcg_temp_free(mask);
1114 ffec44f1 Richard Henderson
        tcg_temp_free(shift);
1115 ffec44f1 Richard Henderson
    }
1116 ffec44f1 Richard Henderson
}
1117 ffec44f1 Richard Henderson
1118 14ab1634 Richard Henderson
/* MSKBL, MSKWL, MSKLL, MSKQL */
1119 ffec44f1 Richard Henderson
static void gen_msk_l(int ra, int rb, int rc, int islit,
1120 ffec44f1 Richard Henderson
                      uint8_t lit, uint8_t byte_mask)
1121 14ab1634 Richard Henderson
{
1122 14ab1634 Richard Henderson
    if (unlikely(rc == 31))
1123 14ab1634 Richard Henderson
        return;
1124 14ab1634 Richard Henderson
    else if (unlikely(ra == 31))
1125 14ab1634 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);
1126 14ab1634 Richard Henderson
    else if (islit) {
1127 14ab1634 Richard Henderson
        gen_zapnoti (cpu_ir[rc], cpu_ir[ra], ~(byte_mask << (lit & 7)));
1128 14ab1634 Richard Henderson
    } else {
1129 14ab1634 Richard Henderson
        TCGv shift = tcg_temp_new();
1130 14ab1634 Richard Henderson
        TCGv mask = tcg_temp_new();
1131 14ab1634 Richard Henderson
1132 14ab1634 Richard Henderson
        tcg_gen_andi_i64(shift, cpu_ir[rb], 7);
1133 14ab1634 Richard Henderson
        tcg_gen_shli_i64(shift, shift, 3);
1134 14ab1634 Richard Henderson
        tcg_gen_movi_i64(mask, zapnot_mask (byte_mask));
1135 14ab1634 Richard Henderson
        tcg_gen_shl_i64(mask, mask, shift);
1136 14ab1634 Richard Henderson
1137 14ab1634 Richard Henderson
        tcg_gen_andc_i64(cpu_ir[rc], cpu_ir[ra], mask);
1138 14ab1634 Richard Henderson
1139 14ab1634 Richard Henderson
        tcg_temp_free(mask);
1140 14ab1634 Richard Henderson
        tcg_temp_free(shift);
1141 14ab1634 Richard Henderson
    }
1142 14ab1634 Richard Henderson
}
1143 14ab1634 Richard Henderson
1144 04acd307 aurel32
/* Code to call arith3 helpers */
1145 a7812ae4 pbrook
#define ARITH3(name)                                                  \
1146 636aa200 Blue Swirl
static inline void glue(gen_, name)(int ra, int rb, int rc, int islit,\
1147 636aa200 Blue Swirl
                                    uint8_t lit)                      \
1148 a7812ae4 pbrook
{                                                                     \
1149 a7812ae4 pbrook
    if (unlikely(rc == 31))                                           \
1150 a7812ae4 pbrook
        return;                                                       \
1151 a7812ae4 pbrook
                                                                      \
1152 a7812ae4 pbrook
    if (ra != 31) {                                                   \
1153 a7812ae4 pbrook
        if (islit) {                                                  \
1154 a7812ae4 pbrook
            TCGv tmp = tcg_const_i64(lit);                            \
1155 a7812ae4 pbrook
            gen_helper_ ## name(cpu_ir[rc], cpu_ir[ra], tmp);         \
1156 a7812ae4 pbrook
            tcg_temp_free(tmp);                                       \
1157 a7812ae4 pbrook
        } else                                                        \
1158 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]); \
1159 a7812ae4 pbrook
    } else {                                                          \
1160 a7812ae4 pbrook
        TCGv tmp1 = tcg_const_i64(0);                                 \
1161 a7812ae4 pbrook
        if (islit) {                                                  \
1162 a7812ae4 pbrook
            TCGv tmp2 = tcg_const_i64(lit);                           \
1163 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], tmp1, tmp2);             \
1164 a7812ae4 pbrook
            tcg_temp_free(tmp2);                                      \
1165 a7812ae4 pbrook
        } else                                                        \
1166 a7812ae4 pbrook
            gen_helper_ ## name (cpu_ir[rc], tmp1, cpu_ir[rb]);       \
1167 a7812ae4 pbrook
        tcg_temp_free(tmp1);                                          \
1168 a7812ae4 pbrook
    }                                                                 \
1169 b3249f63 aurel32
}
1170 a7812ae4 pbrook
ARITH3(cmpbge)
1171 a7812ae4 pbrook
ARITH3(addlv)
1172 a7812ae4 pbrook
ARITH3(sublv)
1173 a7812ae4 pbrook
ARITH3(addqv)
1174 a7812ae4 pbrook
ARITH3(subqv)
1175 a7812ae4 pbrook
ARITH3(umulh)
1176 a7812ae4 pbrook
ARITH3(mullv)
1177 a7812ae4 pbrook
ARITH3(mulqv)
1178 13e4df99 Richard Henderson
ARITH3(minub8)
1179 13e4df99 Richard Henderson
ARITH3(minsb8)
1180 13e4df99 Richard Henderson
ARITH3(minuw4)
1181 13e4df99 Richard Henderson
ARITH3(minsw4)
1182 13e4df99 Richard Henderson
ARITH3(maxub8)
1183 13e4df99 Richard Henderson
ARITH3(maxsb8)
1184 13e4df99 Richard Henderson
ARITH3(maxuw4)
1185 13e4df99 Richard Henderson
ARITH3(maxsw4)
1186 13e4df99 Richard Henderson
ARITH3(perr)
1187 13e4df99 Richard Henderson
1188 13e4df99 Richard Henderson
#define MVIOP2(name)                                    \
1189 13e4df99 Richard Henderson
static inline void glue(gen_, name)(int rb, int rc)     \
1190 13e4df99 Richard Henderson
{                                                       \
1191 13e4df99 Richard Henderson
    if (unlikely(rc == 31))                             \
1192 13e4df99 Richard Henderson
        return;                                         \
1193 13e4df99 Richard Henderson
    if (unlikely(rb == 31))                             \
1194 13e4df99 Richard Henderson
        tcg_gen_movi_i64(cpu_ir[rc], 0);                \
1195 13e4df99 Richard Henderson
    else                                                \
1196 13e4df99 Richard Henderson
        gen_helper_ ## name (cpu_ir[rc], cpu_ir[rb]);   \
1197 13e4df99 Richard Henderson
}
1198 13e4df99 Richard Henderson
MVIOP2(pklb)
1199 13e4df99 Richard Henderson
MVIOP2(pkwb)
1200 13e4df99 Richard Henderson
MVIOP2(unpkbl)
1201 13e4df99 Richard Henderson
MVIOP2(unpkbw)
1202 b3249f63 aurel32
1203 9e05960f Richard Henderson
static void gen_cmp(TCGCond cond, int ra, int rb, int rc,
1204 9e05960f Richard Henderson
                    int islit, uint8_t lit)
1205 01ff9cc8 aurel32
{
1206 9e05960f Richard Henderson
    TCGv va, vb;
1207 01ff9cc8 aurel32
1208 9e05960f Richard Henderson
    if (unlikely(rc == 31)) {
1209 13e4df99 Richard Henderson
        return;
1210 9e05960f Richard Henderson
    }
1211 01ff9cc8 aurel32
1212 9e05960f Richard Henderson
    if (ra == 31) {
1213 9e05960f Richard Henderson
        va = tcg_const_i64(0);
1214 9e05960f Richard Henderson
    } else {
1215 9e05960f Richard Henderson
        va = cpu_ir[ra];
1216 9e05960f Richard Henderson
    }
1217 9e05960f Richard Henderson
    if (islit) {
1218 9e05960f Richard Henderson
        vb = tcg_const_i64(lit);
1219 9e05960f Richard Henderson
    } else {
1220 9e05960f Richard Henderson
        vb = cpu_ir[rb];
1221 9e05960f Richard Henderson
    }
1222 01ff9cc8 aurel32
1223 9e05960f Richard Henderson
    tcg_gen_setcond_i64(cond, cpu_ir[rc], va, vb);
1224 01ff9cc8 aurel32
1225 9e05960f Richard Henderson
    if (ra == 31) {
1226 9e05960f Richard Henderson
        tcg_temp_free(va);
1227 9e05960f Richard Henderson
    }
1228 9e05960f Richard Henderson
    if (islit) {
1229 9e05960f Richard Henderson
        tcg_temp_free(vb);
1230 9e05960f Richard Henderson
    }
1231 01ff9cc8 aurel32
}
1232 01ff9cc8 aurel32
1233 636aa200 Blue Swirl
static inline int translate_one(DisasContext *ctx, uint32_t insn)
1234 4c9649a9 j_mayer
{
1235 4c9649a9 j_mayer
    uint32_t palcode;
1236 4c9649a9 j_mayer
    int32_t disp21, disp16, disp12;
1237 f88fe4e3 Blue Swirl
    uint16_t fn11;
1238 f88fe4e3 Blue Swirl
    uint8_t opc, ra, rb, rc, fpfn, fn7, fn2, islit, real_islit;
1239 adf3c8b6 aurel32
    uint8_t lit;
1240 4c9649a9 j_mayer
    int ret;
1241 4c9649a9 j_mayer
1242 4c9649a9 j_mayer
    /* Decode all instruction fields */
1243 4c9649a9 j_mayer
    opc = insn >> 26;
1244 4c9649a9 j_mayer
    ra = (insn >> 21) & 0x1F;
1245 4c9649a9 j_mayer
    rb = (insn >> 16) & 0x1F;
1246 4c9649a9 j_mayer
    rc = insn & 0x1F;
1247 13e4df99 Richard Henderson
    real_islit = islit = (insn >> 12) & 1;
1248 dfaa8583 aurel32
    if (rb == 31 && !islit) {
1249 dfaa8583 aurel32
        islit = 1;
1250 dfaa8583 aurel32
        lit = 0;
1251 dfaa8583 aurel32
    } else
1252 dfaa8583 aurel32
        lit = (insn >> 13) & 0xFF;
1253 4c9649a9 j_mayer
    palcode = insn & 0x03FFFFFF;
1254 4c9649a9 j_mayer
    disp21 = ((int32_t)((insn & 0x001FFFFF) << 11)) >> 11;
1255 4c9649a9 j_mayer
    disp16 = (int16_t)(insn & 0x0000FFFF);
1256 4c9649a9 j_mayer
    disp12 = (int32_t)((insn & 0x00000FFF) << 20) >> 20;
1257 4c9649a9 j_mayer
    fn11 = (insn >> 5) & 0x000007FF;
1258 4c9649a9 j_mayer
    fpfn = fn11 & 0x3F;
1259 4c9649a9 j_mayer
    fn7 = (insn >> 5) & 0x0000007F;
1260 4c9649a9 j_mayer
    fn2 = (insn >> 5) & 0x00000003;
1261 4c9649a9 j_mayer
    ret = 0;
1262 806991da Richard Henderson
    LOG_DISAS("opc %02x ra %2d rb %2d rc %2d disp16 %6d\n",
1263 d12d51d5 aliguori
              opc, ra, rb, rc, disp16);
1264 806991da Richard Henderson
1265 4c9649a9 j_mayer
    switch (opc) {
1266 4c9649a9 j_mayer
    case 0x00:
1267 4c9649a9 j_mayer
        /* CALL_PAL */
1268 ab471ade Richard Henderson
#ifdef CONFIG_USER_ONLY
1269 ab471ade Richard Henderson
        if (palcode == 0x9E) {
1270 ab471ade Richard Henderson
            /* RDUNIQUE */
1271 ab471ade Richard Henderson
            tcg_gen_mov_i64(cpu_ir[IR_V0], cpu_uniq);
1272 ab471ade Richard Henderson
            break;
1273 ab471ade Richard Henderson
        } else if (palcode == 0x9F) {
1274 ab471ade Richard Henderson
            /* WRUNIQUE */
1275 ab471ade Richard Henderson
            tcg_gen_mov_i64(cpu_uniq, cpu_ir[IR_A0]);
1276 ab471ade Richard Henderson
            break;
1277 ab471ade Richard Henderson
        }
1278 ab471ade Richard Henderson
#endif
1279 4c9649a9 j_mayer
        if (palcode >= 0x80 && palcode < 0xC0) {
1280 4c9649a9 j_mayer
            /* Unprivileged PAL call */
1281 31a877f2 aurel32
            gen_excp(ctx, EXCP_CALL_PAL + ((palcode & 0x3F) << 6), 0);
1282 ab471ade Richard Henderson
            ret = 3;
1283 ab471ade Richard Henderson
            break;
1284 ab471ade Richard Henderson
        }
1285 ab471ade Richard Henderson
#ifndef CONFIG_USER_ONLY
1286 ab471ade Richard Henderson
        if (palcode < 0x40) {
1287 4c9649a9 j_mayer
            /* Privileged PAL code */
1288 4c9649a9 j_mayer
            if (ctx->mem_idx & 1)
1289 4c9649a9 j_mayer
                goto invalid_opc;
1290 ab471ade Richard Henderson
            gen_excp(ctx, EXCP_CALL_PALP + ((palcode & 0x3F) << 6), 0);
1291 4c9649a9 j_mayer
        }
1292 ab471ade Richard Henderson
#endif
1293 ab471ade Richard Henderson
        /* Invalid PAL call */
1294 ab471ade Richard Henderson
        goto invalid_opc;
1295 4c9649a9 j_mayer
    case 0x01:
1296 4c9649a9 j_mayer
        /* OPC01 */
1297 4c9649a9 j_mayer
        goto invalid_opc;
1298 4c9649a9 j_mayer
    case 0x02:
1299 4c9649a9 j_mayer
        /* OPC02 */
1300 4c9649a9 j_mayer
        goto invalid_opc;
1301 4c9649a9 j_mayer
    case 0x03:
1302 4c9649a9 j_mayer
        /* OPC03 */
1303 4c9649a9 j_mayer
        goto invalid_opc;
1304 4c9649a9 j_mayer
    case 0x04:
1305 4c9649a9 j_mayer
        /* OPC04 */
1306 4c9649a9 j_mayer
        goto invalid_opc;
1307 4c9649a9 j_mayer
    case 0x05:
1308 4c9649a9 j_mayer
        /* OPC05 */
1309 4c9649a9 j_mayer
        goto invalid_opc;
1310 4c9649a9 j_mayer
    case 0x06:
1311 4c9649a9 j_mayer
        /* OPC06 */
1312 4c9649a9 j_mayer
        goto invalid_opc;
1313 4c9649a9 j_mayer
    case 0x07:
1314 4c9649a9 j_mayer
        /* OPC07 */
1315 4c9649a9 j_mayer
        goto invalid_opc;
1316 4c9649a9 j_mayer
    case 0x08:
1317 4c9649a9 j_mayer
        /* LDA */
1318 1ef4ef4e aurel32
        if (likely(ra != 31)) {
1319 496cb5b9 aurel32
            if (rb != 31)
1320 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16);
1321 3761035f aurel32
            else
1322 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16);
1323 496cb5b9 aurel32
        }
1324 4c9649a9 j_mayer
        break;
1325 4c9649a9 j_mayer
    case 0x09:
1326 4c9649a9 j_mayer
        /* LDAH */
1327 1ef4ef4e aurel32
        if (likely(ra != 31)) {
1328 496cb5b9 aurel32
            if (rb != 31)
1329 3761035f aurel32
                tcg_gen_addi_i64(cpu_ir[ra], cpu_ir[rb], disp16 << 16);
1330 3761035f aurel32
            else
1331 3761035f aurel32
                tcg_gen_movi_i64(cpu_ir[ra], disp16 << 16);
1332 496cb5b9 aurel32
        }
1333 4c9649a9 j_mayer
        break;
1334 4c9649a9 j_mayer
    case 0x0A:
1335 4c9649a9 j_mayer
        /* LDBU */
1336 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
1337 4c9649a9 j_mayer
            goto invalid_opc;
1338 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld8u, ra, rb, disp16, 0, 0);
1339 4c9649a9 j_mayer
        break;
1340 4c9649a9 j_mayer
    case 0x0B:
1341 4c9649a9 j_mayer
        /* LDQ_U */
1342 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 1);
1343 4c9649a9 j_mayer
        break;
1344 4c9649a9 j_mayer
    case 0x0C:
1345 4c9649a9 j_mayer
        /* LDWU */
1346 4c9649a9 j_mayer
        if (!(ctx->amask & AMASK_BWX))
1347 4c9649a9 j_mayer
            goto invalid_opc;
1348 577d5e7f aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld16u, ra, rb, disp16, 0, 0);
1349 4c9649a9 j_mayer
        break;
1350 4c9649a9 j_mayer
    case 0x0D:
1351 4c9649a9 j_mayer
        /* STW */
1352 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st16, ra, rb, disp16, 0, 0, 0);
1353 4c9649a9 j_mayer
        break;
1354 4c9649a9 j_mayer
    case 0x0E:
1355 4c9649a9 j_mayer
        /* STB */
1356 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st8, ra, rb, disp16, 0, 0, 0);
1357 4c9649a9 j_mayer
        break;
1358 4c9649a9 j_mayer
    case 0x0F:
1359 4c9649a9 j_mayer
        /* STQ_U */
1360 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 1, 0);
1361 4c9649a9 j_mayer
        break;
1362 4c9649a9 j_mayer
    case 0x10:
1363 4c9649a9 j_mayer
        switch (fn7) {
1364 4c9649a9 j_mayer
        case 0x00:
1365 4c9649a9 j_mayer
            /* ADDL */
1366 30c7183b aurel32
            if (likely(rc != 31)) {
1367 30c7183b aurel32
                if (ra != 31) {
1368 30c7183b aurel32
                    if (islit) {
1369 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1370 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1371 dfaa8583 aurel32
                    } else {
1372 30c7183b aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1373 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1374 dfaa8583 aurel32
                    }
1375 30c7183b aurel32
                } else {
1376 30c7183b aurel32
                    if (islit)
1377 dfaa8583 aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1378 30c7183b aurel32
                    else
1379 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
1380 30c7183b aurel32
                }
1381 30c7183b aurel32
            }
1382 4c9649a9 j_mayer
            break;
1383 4c9649a9 j_mayer
        case 0x02:
1384 4c9649a9 j_mayer
            /* S4ADDL */
1385 30c7183b aurel32
            if (likely(rc != 31)) {
1386 30c7183b aurel32
                if (ra != 31) {
1387 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1388 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
1389 dfaa8583 aurel32
                    if (islit)
1390 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
1391 dfaa8583 aurel32
                    else
1392 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
1393 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
1394 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1395 30c7183b aurel32
                } else {
1396 30c7183b aurel32
                    if (islit)
1397 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1398 30c7183b aurel32
                    else
1399 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
1400 30c7183b aurel32
                }
1401 30c7183b aurel32
            }
1402 4c9649a9 j_mayer
            break;
1403 4c9649a9 j_mayer
        case 0x09:
1404 4c9649a9 j_mayer
            /* SUBL */
1405 30c7183b aurel32
            if (likely(rc != 31)) {
1406 30c7183b aurel32
                if (ra != 31) {
1407 dfaa8583 aurel32
                    if (islit)
1408 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1409 dfaa8583 aurel32
                    else
1410 30c7183b aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1411 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1412 30c7183b aurel32
                } else {
1413 30c7183b aurel32
                    if (islit)
1414 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1415 dfaa8583 aurel32
                    else {
1416 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1417 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1418 30c7183b aurel32
                }
1419 30c7183b aurel32
            }
1420 4c9649a9 j_mayer
            break;
1421 4c9649a9 j_mayer
        case 0x0B:
1422 4c9649a9 j_mayer
            /* S4SUBL */
1423 30c7183b aurel32
            if (likely(rc != 31)) {
1424 30c7183b aurel32
                if (ra != 31) {
1425 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1426 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
1427 dfaa8583 aurel32
                    if (islit)
1428 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
1429 dfaa8583 aurel32
                    else
1430 dfaa8583 aurel32
                        tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
1431 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
1432 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1433 30c7183b aurel32
                } else {
1434 30c7183b aurel32
                    if (islit)
1435 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1436 dfaa8583 aurel32
                    else {
1437 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1438 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1439 dfaa8583 aurel32
                    }
1440 30c7183b aurel32
                }
1441 30c7183b aurel32
            }
1442 4c9649a9 j_mayer
            break;
1443 4c9649a9 j_mayer
        case 0x0F:
1444 4c9649a9 j_mayer
            /* CMPBGE */
1445 a7812ae4 pbrook
            gen_cmpbge(ra, rb, rc, islit, lit);
1446 4c9649a9 j_mayer
            break;
1447 4c9649a9 j_mayer
        case 0x12:
1448 4c9649a9 j_mayer
            /* S8ADDL */
1449 30c7183b aurel32
            if (likely(rc != 31)) {
1450 30c7183b aurel32
                if (ra != 31) {
1451 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1452 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1453 dfaa8583 aurel32
                    if (islit)
1454 dfaa8583 aurel32
                        tcg_gen_addi_i64(tmp, tmp, lit);
1455 dfaa8583 aurel32
                    else
1456 dfaa8583 aurel32
                        tcg_gen_add_i64(tmp, tmp, cpu_ir[rb]);
1457 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
1458 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1459 30c7183b aurel32
                } else {
1460 30c7183b aurel32
                    if (islit)
1461 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1462 30c7183b aurel32
                    else
1463 dfaa8583 aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rb]);
1464 30c7183b aurel32
                }
1465 30c7183b aurel32
            }
1466 4c9649a9 j_mayer
            break;
1467 4c9649a9 j_mayer
        case 0x1B:
1468 4c9649a9 j_mayer
            /* S8SUBL */
1469 30c7183b aurel32
            if (likely(rc != 31)) {
1470 30c7183b aurel32
                if (ra != 31) {
1471 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1472 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1473 dfaa8583 aurel32
                    if (islit)
1474 dfaa8583 aurel32
                        tcg_gen_subi_i64(tmp, tmp, lit);
1475 dfaa8583 aurel32
                    else
1476 dfaa8583 aurel32
                       tcg_gen_sub_i64(tmp, tmp, cpu_ir[rb]);
1477 dfaa8583 aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], tmp);
1478 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1479 30c7183b aurel32
                } else {
1480 30c7183b aurel32
                    if (islit)
1481 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1482 dfaa8583 aurel32
                    else
1483 30c7183b aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1484 30c7183b aurel32
                        tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1485 dfaa8583 aurel32
                    }
1486 30c7183b aurel32
                }
1487 30c7183b aurel32
            }
1488 4c9649a9 j_mayer
            break;
1489 4c9649a9 j_mayer
        case 0x1D:
1490 4c9649a9 j_mayer
            /* CMPULT */
1491 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LTU, ra, rb, rc, islit, lit);
1492 4c9649a9 j_mayer
            break;
1493 4c9649a9 j_mayer
        case 0x20:
1494 4c9649a9 j_mayer
            /* ADDQ */
1495 30c7183b aurel32
            if (likely(rc != 31)) {
1496 30c7183b aurel32
                if (ra != 31) {
1497 30c7183b aurel32
                    if (islit)
1498 30c7183b aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1499 30c7183b aurel32
                    else
1500 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1501 30c7183b aurel32
                } else {
1502 30c7183b aurel32
                    if (islit)
1503 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1504 30c7183b aurel32
                    else
1505 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1506 30c7183b aurel32
                }
1507 30c7183b aurel32
            }
1508 4c9649a9 j_mayer
            break;
1509 4c9649a9 j_mayer
        case 0x22:
1510 4c9649a9 j_mayer
            /* S4ADDQ */
1511 30c7183b aurel32
            if (likely(rc != 31)) {
1512 30c7183b aurel32
                if (ra != 31) {
1513 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1514 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
1515 dfaa8583 aurel32
                    if (islit)
1516 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
1517 dfaa8583 aurel32
                    else
1518 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1519 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1520 30c7183b aurel32
                } else {
1521 30c7183b aurel32
                    if (islit)
1522 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1523 30c7183b aurel32
                    else
1524 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1525 30c7183b aurel32
                }
1526 30c7183b aurel32
            }
1527 4c9649a9 j_mayer
            break;
1528 4c9649a9 j_mayer
        case 0x29:
1529 4c9649a9 j_mayer
            /* SUBQ */
1530 30c7183b aurel32
            if (likely(rc != 31)) {
1531 30c7183b aurel32
                if (ra != 31) {
1532 30c7183b aurel32
                    if (islit)
1533 30c7183b aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1534 30c7183b aurel32
                    else
1535 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1536 30c7183b aurel32
                } else {
1537 30c7183b aurel32
                    if (islit)
1538 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1539 30c7183b aurel32
                    else
1540 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1541 30c7183b aurel32
                }
1542 30c7183b aurel32
            }
1543 4c9649a9 j_mayer
            break;
1544 4c9649a9 j_mayer
        case 0x2B:
1545 4c9649a9 j_mayer
            /* S4SUBQ */
1546 30c7183b aurel32
            if (likely(rc != 31)) {
1547 30c7183b aurel32
                if (ra != 31) {
1548 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1549 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 2);
1550 dfaa8583 aurel32
                    if (islit)
1551 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
1552 dfaa8583 aurel32
                    else
1553 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1554 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1555 30c7183b aurel32
                } else {
1556 30c7183b aurel32
                    if (islit)
1557 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1558 30c7183b aurel32
                    else
1559 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1560 30c7183b aurel32
                }
1561 30c7183b aurel32
            }
1562 4c9649a9 j_mayer
            break;
1563 4c9649a9 j_mayer
        case 0x2D:
1564 4c9649a9 j_mayer
            /* CMPEQ */
1565 01ff9cc8 aurel32
            gen_cmp(TCG_COND_EQ, ra, rb, rc, islit, lit);
1566 4c9649a9 j_mayer
            break;
1567 4c9649a9 j_mayer
        case 0x32:
1568 4c9649a9 j_mayer
            /* S8ADDQ */
1569 30c7183b aurel32
            if (likely(rc != 31)) {
1570 30c7183b aurel32
                if (ra != 31) {
1571 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1572 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1573 dfaa8583 aurel32
                    if (islit)
1574 dfaa8583 aurel32
                        tcg_gen_addi_i64(cpu_ir[rc], tmp, lit);
1575 dfaa8583 aurel32
                    else
1576 dfaa8583 aurel32
                        tcg_gen_add_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1577 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1578 30c7183b aurel32
                } else {
1579 30c7183b aurel32
                    if (islit)
1580 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1581 30c7183b aurel32
                    else
1582 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1583 30c7183b aurel32
                }
1584 30c7183b aurel32
            }
1585 4c9649a9 j_mayer
            break;
1586 4c9649a9 j_mayer
        case 0x3B:
1587 4c9649a9 j_mayer
            /* S8SUBQ */
1588 30c7183b aurel32
            if (likely(rc != 31)) {
1589 30c7183b aurel32
                if (ra != 31) {
1590 a7812ae4 pbrook
                    TCGv tmp = tcg_temp_new();
1591 dfaa8583 aurel32
                    tcg_gen_shli_i64(tmp, cpu_ir[ra], 3);
1592 dfaa8583 aurel32
                    if (islit)
1593 dfaa8583 aurel32
                        tcg_gen_subi_i64(cpu_ir[rc], tmp, lit);
1594 dfaa8583 aurel32
                    else
1595 dfaa8583 aurel32
                        tcg_gen_sub_i64(cpu_ir[rc], tmp, cpu_ir[rb]);
1596 dfaa8583 aurel32
                    tcg_temp_free(tmp);
1597 30c7183b aurel32
                } else {
1598 30c7183b aurel32
                    if (islit)
1599 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], -lit);
1600 30c7183b aurel32
                    else
1601 dfaa8583 aurel32
                        tcg_gen_neg_i64(cpu_ir[rc], cpu_ir[rb]);
1602 30c7183b aurel32
                }
1603 30c7183b aurel32
            }
1604 4c9649a9 j_mayer
            break;
1605 4c9649a9 j_mayer
        case 0x3D:
1606 4c9649a9 j_mayer
            /* CMPULE */
1607 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LEU, ra, rb, rc, islit, lit);
1608 4c9649a9 j_mayer
            break;
1609 4c9649a9 j_mayer
        case 0x40:
1610 4c9649a9 j_mayer
            /* ADDL/V */
1611 a7812ae4 pbrook
            gen_addlv(ra, rb, rc, islit, lit);
1612 4c9649a9 j_mayer
            break;
1613 4c9649a9 j_mayer
        case 0x49:
1614 4c9649a9 j_mayer
            /* SUBL/V */
1615 a7812ae4 pbrook
            gen_sublv(ra, rb, rc, islit, lit);
1616 4c9649a9 j_mayer
            break;
1617 4c9649a9 j_mayer
        case 0x4D:
1618 4c9649a9 j_mayer
            /* CMPLT */
1619 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LT, ra, rb, rc, islit, lit);
1620 4c9649a9 j_mayer
            break;
1621 4c9649a9 j_mayer
        case 0x60:
1622 4c9649a9 j_mayer
            /* ADDQ/V */
1623 a7812ae4 pbrook
            gen_addqv(ra, rb, rc, islit, lit);
1624 4c9649a9 j_mayer
            break;
1625 4c9649a9 j_mayer
        case 0x69:
1626 4c9649a9 j_mayer
            /* SUBQ/V */
1627 a7812ae4 pbrook
            gen_subqv(ra, rb, rc, islit, lit);
1628 4c9649a9 j_mayer
            break;
1629 4c9649a9 j_mayer
        case 0x6D:
1630 4c9649a9 j_mayer
            /* CMPLE */
1631 01ff9cc8 aurel32
            gen_cmp(TCG_COND_LE, ra, rb, rc, islit, lit);
1632 4c9649a9 j_mayer
            break;
1633 4c9649a9 j_mayer
        default:
1634 4c9649a9 j_mayer
            goto invalid_opc;
1635 4c9649a9 j_mayer
        }
1636 4c9649a9 j_mayer
        break;
1637 4c9649a9 j_mayer
    case 0x11:
1638 4c9649a9 j_mayer
        switch (fn7) {
1639 4c9649a9 j_mayer
        case 0x00:
1640 4c9649a9 j_mayer
            /* AND */
1641 30c7183b aurel32
            if (likely(rc != 31)) {
1642 dfaa8583 aurel32
                if (ra == 31)
1643 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1644 30c7183b aurel32
                else if (islit)
1645 30c7183b aurel32
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], lit);
1646 30c7183b aurel32
                else
1647 30c7183b aurel32
                    tcg_gen_and_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1648 30c7183b aurel32
            }
1649 4c9649a9 j_mayer
            break;
1650 4c9649a9 j_mayer
        case 0x08:
1651 4c9649a9 j_mayer
            /* BIC */
1652 30c7183b aurel32
            if (likely(rc != 31)) {
1653 30c7183b aurel32
                if (ra != 31) {
1654 30c7183b aurel32
                    if (islit)
1655 30c7183b aurel32
                        tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1656 1b581c44 aurel32
                    else
1657 1b581c44 aurel32
                        tcg_gen_andc_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1658 30c7183b aurel32
                } else
1659 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1660 30c7183b aurel32
            }
1661 4c9649a9 j_mayer
            break;
1662 4c9649a9 j_mayer
        case 0x14:
1663 4c9649a9 j_mayer
            /* CMOVLBS */
1664 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_NE, ra, rb, rc, islit, lit, 1);
1665 4c9649a9 j_mayer
            break;
1666 4c9649a9 j_mayer
        case 0x16:
1667 4c9649a9 j_mayer
            /* CMOVLBC */
1668 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_EQ, ra, rb, rc, islit, lit, 1);
1669 4c9649a9 j_mayer
            break;
1670 4c9649a9 j_mayer
        case 0x20:
1671 4c9649a9 j_mayer
            /* BIS */
1672 30c7183b aurel32
            if (likely(rc != 31)) {
1673 30c7183b aurel32
                if (ra != 31) {
1674 30c7183b aurel32
                    if (islit)
1675 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1676 8bb6e981 aurel32
                    else
1677 30c7183b aurel32
                        tcg_gen_or_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1678 4c9649a9 j_mayer
                } else {
1679 30c7183b aurel32
                    if (islit)
1680 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1681 30c7183b aurel32
                    else
1682 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1683 4c9649a9 j_mayer
                }
1684 4c9649a9 j_mayer
            }
1685 4c9649a9 j_mayer
            break;
1686 4c9649a9 j_mayer
        case 0x24:
1687 4c9649a9 j_mayer
            /* CMOVEQ */
1688 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_EQ, ra, rb, rc, islit, lit, 0);
1689 4c9649a9 j_mayer
            break;
1690 4c9649a9 j_mayer
        case 0x26:
1691 4c9649a9 j_mayer
            /* CMOVNE */
1692 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_NE, ra, rb, rc, islit, lit, 0);
1693 4c9649a9 j_mayer
            break;
1694 4c9649a9 j_mayer
        case 0x28:
1695 4c9649a9 j_mayer
            /* ORNOT */
1696 30c7183b aurel32
            if (likely(rc != 31)) {
1697 dfaa8583 aurel32
                if (ra != 31) {
1698 30c7183b aurel32
                    if (islit)
1699 30c7183b aurel32
                        tcg_gen_ori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1700 1b581c44 aurel32
                    else
1701 1b581c44 aurel32
                        tcg_gen_orc_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1702 30c7183b aurel32
                } else {
1703 30c7183b aurel32
                    if (islit)
1704 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1705 30c7183b aurel32
                    else
1706 30c7183b aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1707 30c7183b aurel32
                }
1708 30c7183b aurel32
            }
1709 4c9649a9 j_mayer
            break;
1710 4c9649a9 j_mayer
        case 0x40:
1711 4c9649a9 j_mayer
            /* XOR */
1712 30c7183b aurel32
            if (likely(rc != 31)) {
1713 30c7183b aurel32
                if (ra != 31) {
1714 30c7183b aurel32
                    if (islit)
1715 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], lit);
1716 30c7183b aurel32
                    else
1717 dfaa8583 aurel32
                        tcg_gen_xor_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1718 30c7183b aurel32
                } else {
1719 30c7183b aurel32
                    if (islit)
1720 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], lit);
1721 30c7183b aurel32
                    else
1722 dfaa8583 aurel32
                        tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1723 30c7183b aurel32
                }
1724 30c7183b aurel32
            }
1725 4c9649a9 j_mayer
            break;
1726 4c9649a9 j_mayer
        case 0x44:
1727 4c9649a9 j_mayer
            /* CMOVLT */
1728 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_LT, ra, rb, rc, islit, lit, 0);
1729 4c9649a9 j_mayer
            break;
1730 4c9649a9 j_mayer
        case 0x46:
1731 4c9649a9 j_mayer
            /* CMOVGE */
1732 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_GE, ra, rb, rc, islit, lit, 0);
1733 4c9649a9 j_mayer
            break;
1734 4c9649a9 j_mayer
        case 0x48:
1735 4c9649a9 j_mayer
            /* EQV */
1736 30c7183b aurel32
            if (likely(rc != 31)) {
1737 30c7183b aurel32
                if (ra != 31) {
1738 30c7183b aurel32
                    if (islit)
1739 30c7183b aurel32
                        tcg_gen_xori_i64(cpu_ir[rc], cpu_ir[ra], ~lit);
1740 1b581c44 aurel32
                    else
1741 1b581c44 aurel32
                        tcg_gen_eqv_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1742 30c7183b aurel32
                } else {
1743 30c7183b aurel32
                    if (islit)
1744 30c7183b aurel32
                        tcg_gen_movi_i64(cpu_ir[rc], ~lit);
1745 30c7183b aurel32
                    else
1746 dfaa8583 aurel32
                        tcg_gen_not_i64(cpu_ir[rc], cpu_ir[rb]);
1747 30c7183b aurel32
                }
1748 30c7183b aurel32
            }
1749 4c9649a9 j_mayer
            break;
1750 4c9649a9 j_mayer
        case 0x61:
1751 4c9649a9 j_mayer
            /* AMASK */
1752 ae8ecd42 aurel32
            if (likely(rc != 31)) {
1753 ae8ecd42 aurel32
                if (islit)
1754 1a1f7dbc aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], lit);
1755 ae8ecd42 aurel32
                else
1756 1a1f7dbc aurel32
                    tcg_gen_mov_i64(cpu_ir[rc], cpu_ir[rb]);
1757 1a1f7dbc aurel32
                switch (ctx->env->implver) {
1758 1a1f7dbc aurel32
                case IMPLVER_2106x:
1759 1a1f7dbc aurel32
                    /* EV4, EV45, LCA, LCA45 & EV5 */
1760 1a1f7dbc aurel32
                    break;
1761 1a1f7dbc aurel32
                case IMPLVER_21164:
1762 1a1f7dbc aurel32
                case IMPLVER_21264:
1763 1a1f7dbc aurel32
                case IMPLVER_21364:
1764 1a1f7dbc aurel32
                    tcg_gen_andi_i64(cpu_ir[rc], cpu_ir[rc],
1765 1a1f7dbc aurel32
                                     ~(uint64_t)ctx->amask);
1766 1a1f7dbc aurel32
                    break;
1767 1a1f7dbc aurel32
                }
1768 ae8ecd42 aurel32
            }
1769 4c9649a9 j_mayer
            break;
1770 4c9649a9 j_mayer
        case 0x64:
1771 4c9649a9 j_mayer
            /* CMOVLE */
1772 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_LE, ra, rb, rc, islit, lit, 0);
1773 4c9649a9 j_mayer
            break;
1774 4c9649a9 j_mayer
        case 0x66:
1775 4c9649a9 j_mayer
            /* CMOVGT */
1776 bbe1dab4 Richard Henderson
            gen_cmov(TCG_COND_GT, ra, rb, rc, islit, lit, 0);
1777 4c9649a9 j_mayer
            break;
1778 4c9649a9 j_mayer
        case 0x6C:
1779 4c9649a9 j_mayer
            /* IMPLVER */
1780 3761035f aurel32
            if (rc != 31)
1781 8579095b aurel32
                tcg_gen_movi_i64(cpu_ir[rc], ctx->env->implver);
1782 4c9649a9 j_mayer
            break;
1783 4c9649a9 j_mayer
        default:
1784 4c9649a9 j_mayer
            goto invalid_opc;
1785 4c9649a9 j_mayer
        }
1786 4c9649a9 j_mayer
        break;
1787 4c9649a9 j_mayer
    case 0x12:
1788 4c9649a9 j_mayer
        switch (fn7) {
1789 4c9649a9 j_mayer
        case 0x02:
1790 4c9649a9 j_mayer
            /* MSKBL */
1791 14ab1634 Richard Henderson
            gen_msk_l(ra, rb, rc, islit, lit, 0x01);
1792 4c9649a9 j_mayer
            break;
1793 4c9649a9 j_mayer
        case 0x06:
1794 4c9649a9 j_mayer
            /* EXTBL */
1795 377a43b6 Richard Henderson
            gen_ext_l(ra, rb, rc, islit, lit, 0x01);
1796 4c9649a9 j_mayer
            break;
1797 4c9649a9 j_mayer
        case 0x0B:
1798 4c9649a9 j_mayer
            /* INSBL */
1799 248c42f3 Richard Henderson
            gen_ins_l(ra, rb, rc, islit, lit, 0x01);
1800 4c9649a9 j_mayer
            break;
1801 4c9649a9 j_mayer
        case 0x12:
1802 4c9649a9 j_mayer
            /* MSKWL */
1803 14ab1634 Richard Henderson
            gen_msk_l(ra, rb, rc, islit, lit, 0x03);
1804 4c9649a9 j_mayer
            break;
1805 4c9649a9 j_mayer
        case 0x16:
1806 4c9649a9 j_mayer
            /* EXTWL */
1807 377a43b6 Richard Henderson
            gen_ext_l(ra, rb, rc, islit, lit, 0x03);
1808 4c9649a9 j_mayer
            break;
1809 4c9649a9 j_mayer
        case 0x1B:
1810 4c9649a9 j_mayer
            /* INSWL */
1811 248c42f3 Richard Henderson
            gen_ins_l(ra, rb, rc, islit, lit, 0x03);
1812 4c9649a9 j_mayer
            break;
1813 4c9649a9 j_mayer
        case 0x22:
1814 4c9649a9 j_mayer
            /* MSKLL */
1815 14ab1634 Richard Henderson
            gen_msk_l(ra, rb, rc, islit, lit, 0x0f);
1816 4c9649a9 j_mayer
            break;
1817 4c9649a9 j_mayer
        case 0x26:
1818 4c9649a9 j_mayer
            /* EXTLL */
1819 377a43b6 Richard Henderson
            gen_ext_l(ra, rb, rc, islit, lit, 0x0f);
1820 4c9649a9 j_mayer
            break;
1821 4c9649a9 j_mayer
        case 0x2B:
1822 4c9649a9 j_mayer
            /* INSLL */
1823 248c42f3 Richard Henderson
            gen_ins_l(ra, rb, rc, islit, lit, 0x0f);
1824 4c9649a9 j_mayer
            break;
1825 4c9649a9 j_mayer
        case 0x30:
1826 4c9649a9 j_mayer
            /* ZAP */
1827 a7812ae4 pbrook
            gen_zap(ra, rb, rc, islit, lit);
1828 4c9649a9 j_mayer
            break;
1829 4c9649a9 j_mayer
        case 0x31:
1830 4c9649a9 j_mayer
            /* ZAPNOT */
1831 a7812ae4 pbrook
            gen_zapnot(ra, rb, rc, islit, lit);
1832 4c9649a9 j_mayer
            break;
1833 4c9649a9 j_mayer
        case 0x32:
1834 4c9649a9 j_mayer
            /* MSKQL */
1835 14ab1634 Richard Henderson
            gen_msk_l(ra, rb, rc, islit, lit, 0xff);
1836 4c9649a9 j_mayer
            break;
1837 4c9649a9 j_mayer
        case 0x34:
1838 4c9649a9 j_mayer
            /* SRL */
1839 30c7183b aurel32
            if (likely(rc != 31)) {
1840 30c7183b aurel32
                if (ra != 31) {
1841 30c7183b aurel32
                    if (islit)
1842 30c7183b aurel32
                        tcg_gen_shri_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1843 dfaa8583 aurel32
                    else {
1844 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1845 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1846 30c7183b aurel32
                        tcg_gen_shr_i64(cpu_ir[rc], cpu_ir[ra], shift);
1847 30c7183b aurel32
                        tcg_temp_free(shift);
1848 dfaa8583 aurel32
                    }
1849 30c7183b aurel32
                } else
1850 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1851 30c7183b aurel32
            }
1852 4c9649a9 j_mayer
            break;
1853 4c9649a9 j_mayer
        case 0x36:
1854 4c9649a9 j_mayer
            /* EXTQL */
1855 377a43b6 Richard Henderson
            gen_ext_l(ra, rb, rc, islit, lit, 0xff);
1856 4c9649a9 j_mayer
            break;
1857 4c9649a9 j_mayer
        case 0x39:
1858 4c9649a9 j_mayer
            /* SLL */
1859 30c7183b aurel32
            if (likely(rc != 31)) {
1860 30c7183b aurel32
                if (ra != 31) {
1861 30c7183b aurel32
                    if (islit)
1862 30c7183b aurel32
                        tcg_gen_shli_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1863 dfaa8583 aurel32
                    else {
1864 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1865 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1866 30c7183b aurel32
                        tcg_gen_shl_i64(cpu_ir[rc], cpu_ir[ra], shift);
1867 30c7183b aurel32
                        tcg_temp_free(shift);
1868 dfaa8583 aurel32
                    }
1869 30c7183b aurel32
                } else
1870 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1871 30c7183b aurel32
            }
1872 4c9649a9 j_mayer
            break;
1873 4c9649a9 j_mayer
        case 0x3B:
1874 4c9649a9 j_mayer
            /* INSQL */
1875 248c42f3 Richard Henderson
            gen_ins_l(ra, rb, rc, islit, lit, 0xff);
1876 4c9649a9 j_mayer
            break;
1877 4c9649a9 j_mayer
        case 0x3C:
1878 4c9649a9 j_mayer
            /* SRA */
1879 30c7183b aurel32
            if (likely(rc != 31)) {
1880 30c7183b aurel32
                if (ra != 31) {
1881 30c7183b aurel32
                    if (islit)
1882 30c7183b aurel32
                        tcg_gen_sari_i64(cpu_ir[rc], cpu_ir[ra], lit & 0x3f);
1883 dfaa8583 aurel32
                    else {
1884 a7812ae4 pbrook
                        TCGv shift = tcg_temp_new();
1885 30c7183b aurel32
                        tcg_gen_andi_i64(shift, cpu_ir[rb], 0x3f);
1886 30c7183b aurel32
                        tcg_gen_sar_i64(cpu_ir[rc], cpu_ir[ra], shift);
1887 30c7183b aurel32
                        tcg_temp_free(shift);
1888 dfaa8583 aurel32
                    }
1889 30c7183b aurel32
                } else
1890 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1891 30c7183b aurel32
            }
1892 4c9649a9 j_mayer
            break;
1893 4c9649a9 j_mayer
        case 0x52:
1894 4c9649a9 j_mayer
            /* MSKWH */
1895 ffec44f1 Richard Henderson
            gen_msk_h(ra, rb, rc, islit, lit, 0x03);
1896 4c9649a9 j_mayer
            break;
1897 4c9649a9 j_mayer
        case 0x57:
1898 4c9649a9 j_mayer
            /* INSWH */
1899 50eb6e5c Richard Henderson
            gen_ins_h(ra, rb, rc, islit, lit, 0x03);
1900 4c9649a9 j_mayer
            break;
1901 4c9649a9 j_mayer
        case 0x5A:
1902 4c9649a9 j_mayer
            /* EXTWH */
1903 377a43b6 Richard Henderson
            gen_ext_h(ra, rb, rc, islit, lit, 0x03);
1904 4c9649a9 j_mayer
            break;
1905 4c9649a9 j_mayer
        case 0x62:
1906 4c9649a9 j_mayer
            /* MSKLH */
1907 ffec44f1 Richard Henderson
            gen_msk_h(ra, rb, rc, islit, lit, 0x0f);
1908 4c9649a9 j_mayer
            break;
1909 4c9649a9 j_mayer
        case 0x67:
1910 4c9649a9 j_mayer
            /* INSLH */
1911 50eb6e5c Richard Henderson
            gen_ins_h(ra, rb, rc, islit, lit, 0x0f);
1912 4c9649a9 j_mayer
            break;
1913 4c9649a9 j_mayer
        case 0x6A:
1914 4c9649a9 j_mayer
            /* EXTLH */
1915 377a43b6 Richard Henderson
            gen_ext_h(ra, rb, rc, islit, lit, 0x0f);
1916 4c9649a9 j_mayer
            break;
1917 4c9649a9 j_mayer
        case 0x72:
1918 4c9649a9 j_mayer
            /* MSKQH */
1919 ffec44f1 Richard Henderson
            gen_msk_h(ra, rb, rc, islit, lit, 0xff);
1920 4c9649a9 j_mayer
            break;
1921 4c9649a9 j_mayer
        case 0x77:
1922 4c9649a9 j_mayer
            /* INSQH */
1923 50eb6e5c Richard Henderson
            gen_ins_h(ra, rb, rc, islit, lit, 0xff);
1924 4c9649a9 j_mayer
            break;
1925 4c9649a9 j_mayer
        case 0x7A:
1926 4c9649a9 j_mayer
            /* EXTQH */
1927 377a43b6 Richard Henderson
            gen_ext_h(ra, rb, rc, islit, lit, 0xff);
1928 4c9649a9 j_mayer
            break;
1929 4c9649a9 j_mayer
        default:
1930 4c9649a9 j_mayer
            goto invalid_opc;
1931 4c9649a9 j_mayer
        }
1932 4c9649a9 j_mayer
        break;
1933 4c9649a9 j_mayer
    case 0x13:
1934 4c9649a9 j_mayer
        switch (fn7) {
1935 4c9649a9 j_mayer
        case 0x00:
1936 4c9649a9 j_mayer
            /* MULL */
1937 30c7183b aurel32
            if (likely(rc != 31)) {
1938 dfaa8583 aurel32
                if (ra == 31)
1939 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1940 30c7183b aurel32
                else {
1941 30c7183b aurel32
                    if (islit)
1942 30c7183b aurel32
                        tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1943 30c7183b aurel32
                    else
1944 30c7183b aurel32
                        tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1945 30c7183b aurel32
                    tcg_gen_ext32s_i64(cpu_ir[rc], cpu_ir[rc]);
1946 30c7183b aurel32
                }
1947 30c7183b aurel32
            }
1948 4c9649a9 j_mayer
            break;
1949 4c9649a9 j_mayer
        case 0x20:
1950 4c9649a9 j_mayer
            /* MULQ */
1951 30c7183b aurel32
            if (likely(rc != 31)) {
1952 dfaa8583 aurel32
                if (ra == 31)
1953 30c7183b aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
1954 30c7183b aurel32
                else if (islit)
1955 30c7183b aurel32
                    tcg_gen_muli_i64(cpu_ir[rc], cpu_ir[ra], lit);
1956 30c7183b aurel32
                else
1957 30c7183b aurel32
                    tcg_gen_mul_i64(cpu_ir[rc], cpu_ir[ra], cpu_ir[rb]);
1958 30c7183b aurel32
            }
1959 4c9649a9 j_mayer
            break;
1960 4c9649a9 j_mayer
        case 0x30:
1961 4c9649a9 j_mayer
            /* UMULH */
1962 a7812ae4 pbrook
            gen_umulh(ra, rb, rc, islit, lit);
1963 4c9649a9 j_mayer
            break;
1964 4c9649a9 j_mayer
        case 0x40:
1965 4c9649a9 j_mayer
            /* MULL/V */
1966 a7812ae4 pbrook
            gen_mullv(ra, rb, rc, islit, lit);
1967 4c9649a9 j_mayer
            break;
1968 4c9649a9 j_mayer
        case 0x60:
1969 4c9649a9 j_mayer
            /* MULQ/V */
1970 a7812ae4 pbrook
            gen_mulqv(ra, rb, rc, islit, lit);
1971 4c9649a9 j_mayer
            break;
1972 4c9649a9 j_mayer
        default:
1973 4c9649a9 j_mayer
            goto invalid_opc;
1974 4c9649a9 j_mayer
        }
1975 4c9649a9 j_mayer
        break;
1976 4c9649a9 j_mayer
    case 0x14:
1977 f24518b5 Richard Henderson
        switch (fpfn) { /* fn11 & 0x3F */
1978 4c9649a9 j_mayer
        case 0x04:
1979 4c9649a9 j_mayer
            /* ITOFS */
1980 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1981 4c9649a9 j_mayer
                goto invalid_opc;
1982 f18cd223 aurel32
            if (likely(rc != 31)) {
1983 f18cd223 aurel32
                if (ra != 31) {
1984 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
1985 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
1986 a7812ae4 pbrook
                    gen_helper_memory_to_s(cpu_fir[rc], tmp);
1987 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
1988 f18cd223 aurel32
                } else
1989 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
1990 f18cd223 aurel32
            }
1991 4c9649a9 j_mayer
            break;
1992 4c9649a9 j_mayer
        case 0x0A:
1993 4c9649a9 j_mayer
            /* SQRTF */
1994 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
1995 4c9649a9 j_mayer
                goto invalid_opc;
1996 a7812ae4 pbrook
            gen_fsqrtf(rb, rc);
1997 4c9649a9 j_mayer
            break;
1998 4c9649a9 j_mayer
        case 0x0B:
1999 4c9649a9 j_mayer
            /* SQRTS */
2000 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2001 4c9649a9 j_mayer
                goto invalid_opc;
2002 f24518b5 Richard Henderson
            gen_fsqrts(ctx, rb, rc, fn11);
2003 4c9649a9 j_mayer
            break;
2004 4c9649a9 j_mayer
        case 0x14:
2005 4c9649a9 j_mayer
            /* ITOFF */
2006 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2007 4c9649a9 j_mayer
                goto invalid_opc;
2008 f18cd223 aurel32
            if (likely(rc != 31)) {
2009 f18cd223 aurel32
                if (ra != 31) {
2010 a7812ae4 pbrook
                    TCGv_i32 tmp = tcg_temp_new_i32();
2011 f18cd223 aurel32
                    tcg_gen_trunc_i64_i32(tmp, cpu_ir[ra]);
2012 a7812ae4 pbrook
                    gen_helper_memory_to_f(cpu_fir[rc], tmp);
2013 a7812ae4 pbrook
                    tcg_temp_free_i32(tmp);
2014 f18cd223 aurel32
                } else
2015 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
2016 f18cd223 aurel32
            }
2017 4c9649a9 j_mayer
            break;
2018 4c9649a9 j_mayer
        case 0x24:
2019 4c9649a9 j_mayer
            /* ITOFT */
2020 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2021 4c9649a9 j_mayer
                goto invalid_opc;
2022 f18cd223 aurel32
            if (likely(rc != 31)) {
2023 f18cd223 aurel32
                if (ra != 31)
2024 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_fir[rc], cpu_ir[ra]);
2025 f18cd223 aurel32
                else
2026 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_fir[rc], 0);
2027 f18cd223 aurel32
            }
2028 4c9649a9 j_mayer
            break;
2029 4c9649a9 j_mayer
        case 0x2A:
2030 4c9649a9 j_mayer
            /* SQRTG */
2031 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2032 4c9649a9 j_mayer
                goto invalid_opc;
2033 a7812ae4 pbrook
            gen_fsqrtg(rb, rc);
2034 4c9649a9 j_mayer
            break;
2035 4c9649a9 j_mayer
        case 0x02B:
2036 4c9649a9 j_mayer
            /* SQRTT */
2037 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2038 4c9649a9 j_mayer
                goto invalid_opc;
2039 f24518b5 Richard Henderson
            gen_fsqrtt(ctx, rb, rc, fn11);
2040 4c9649a9 j_mayer
            break;
2041 4c9649a9 j_mayer
        default:
2042 4c9649a9 j_mayer
            goto invalid_opc;
2043 4c9649a9 j_mayer
        }
2044 4c9649a9 j_mayer
        break;
2045 4c9649a9 j_mayer
    case 0x15:
2046 4c9649a9 j_mayer
        /* VAX floating point */
2047 4c9649a9 j_mayer
        /* XXX: rounding mode and trap are ignored (!) */
2048 f24518b5 Richard Henderson
        switch (fpfn) { /* fn11 & 0x3F */
2049 4c9649a9 j_mayer
        case 0x00:
2050 4c9649a9 j_mayer
            /* ADDF */
2051 a7812ae4 pbrook
            gen_faddf(ra, rb, rc);
2052 4c9649a9 j_mayer
            break;
2053 4c9649a9 j_mayer
        case 0x01:
2054 4c9649a9 j_mayer
            /* SUBF */
2055 a7812ae4 pbrook
            gen_fsubf(ra, rb, rc);
2056 4c9649a9 j_mayer
            break;
2057 4c9649a9 j_mayer
        case 0x02:
2058 4c9649a9 j_mayer
            /* MULF */
2059 a7812ae4 pbrook
            gen_fmulf(ra, rb, rc);
2060 4c9649a9 j_mayer
            break;
2061 4c9649a9 j_mayer
        case 0x03:
2062 4c9649a9 j_mayer
            /* DIVF */
2063 a7812ae4 pbrook
            gen_fdivf(ra, rb, rc);
2064 4c9649a9 j_mayer
            break;
2065 4c9649a9 j_mayer
        case 0x1E:
2066 4c9649a9 j_mayer
            /* CVTDG */
2067 4c9649a9 j_mayer
#if 0 // TODO
2068 a7812ae4 pbrook
            gen_fcvtdg(rb, rc);
2069 4c9649a9 j_mayer
#else
2070 4c9649a9 j_mayer
            goto invalid_opc;
2071 4c9649a9 j_mayer
#endif
2072 4c9649a9 j_mayer
            break;
2073 4c9649a9 j_mayer
        case 0x20:
2074 4c9649a9 j_mayer
            /* ADDG */
2075 a7812ae4 pbrook
            gen_faddg(ra, rb, rc);
2076 4c9649a9 j_mayer
            break;
2077 4c9649a9 j_mayer
        case 0x21:
2078 4c9649a9 j_mayer
            /* SUBG */
2079 a7812ae4 pbrook
            gen_fsubg(ra, rb, rc);
2080 4c9649a9 j_mayer
            break;
2081 4c9649a9 j_mayer
        case 0x22:
2082 4c9649a9 j_mayer
            /* MULG */
2083 a7812ae4 pbrook
            gen_fmulg(ra, rb, rc);
2084 4c9649a9 j_mayer
            break;
2085 4c9649a9 j_mayer
        case 0x23:
2086 4c9649a9 j_mayer
            /* DIVG */
2087 a7812ae4 pbrook
            gen_fdivg(ra, rb, rc);
2088 4c9649a9 j_mayer
            break;
2089 4c9649a9 j_mayer
        case 0x25:
2090 4c9649a9 j_mayer
            /* CMPGEQ */
2091 a7812ae4 pbrook
            gen_fcmpgeq(ra, rb, rc);
2092 4c9649a9 j_mayer
            break;
2093 4c9649a9 j_mayer
        case 0x26:
2094 4c9649a9 j_mayer
            /* CMPGLT */
2095 a7812ae4 pbrook
            gen_fcmpglt(ra, rb, rc);
2096 4c9649a9 j_mayer
            break;
2097 4c9649a9 j_mayer
        case 0x27:
2098 4c9649a9 j_mayer
            /* CMPGLE */
2099 a7812ae4 pbrook
            gen_fcmpgle(ra, rb, rc);
2100 4c9649a9 j_mayer
            break;
2101 4c9649a9 j_mayer
        case 0x2C:
2102 4c9649a9 j_mayer
            /* CVTGF */
2103 a7812ae4 pbrook
            gen_fcvtgf(rb, rc);
2104 4c9649a9 j_mayer
            break;
2105 4c9649a9 j_mayer
        case 0x2D:
2106 4c9649a9 j_mayer
            /* CVTGD */
2107 4c9649a9 j_mayer
#if 0 // TODO
2108 a7812ae4 pbrook
            gen_fcvtgd(rb, rc);
2109 4c9649a9 j_mayer
#else
2110 4c9649a9 j_mayer
            goto invalid_opc;
2111 4c9649a9 j_mayer
#endif
2112 4c9649a9 j_mayer
            break;
2113 4c9649a9 j_mayer
        case 0x2F:
2114 4c9649a9 j_mayer
            /* CVTGQ */
2115 a7812ae4 pbrook
            gen_fcvtgq(rb, rc);
2116 4c9649a9 j_mayer
            break;
2117 4c9649a9 j_mayer
        case 0x3C:
2118 4c9649a9 j_mayer
            /* CVTQF */
2119 a7812ae4 pbrook
            gen_fcvtqf(rb, rc);
2120 4c9649a9 j_mayer
            break;
2121 4c9649a9 j_mayer
        case 0x3E:
2122 4c9649a9 j_mayer
            /* CVTQG */
2123 a7812ae4 pbrook
            gen_fcvtqg(rb, rc);
2124 4c9649a9 j_mayer
            break;
2125 4c9649a9 j_mayer
        default:
2126 4c9649a9 j_mayer
            goto invalid_opc;
2127 4c9649a9 j_mayer
        }
2128 4c9649a9 j_mayer
        break;
2129 4c9649a9 j_mayer
    case 0x16:
2130 4c9649a9 j_mayer
        /* IEEE floating-point */
2131 f24518b5 Richard Henderson
        switch (fpfn) { /* fn11 & 0x3F */
2132 4c9649a9 j_mayer
        case 0x00:
2133 4c9649a9 j_mayer
            /* ADDS */
2134 f24518b5 Richard Henderson
            gen_fadds(ctx, ra, rb, rc, fn11);
2135 4c9649a9 j_mayer
            break;
2136 4c9649a9 j_mayer
        case 0x01:
2137 4c9649a9 j_mayer
            /* SUBS */
2138 f24518b5 Richard Henderson
            gen_fsubs(ctx, ra, rb, rc, fn11);
2139 4c9649a9 j_mayer
            break;
2140 4c9649a9 j_mayer
        case 0x02:
2141 4c9649a9 j_mayer
            /* MULS */
2142 f24518b5 Richard Henderson
            gen_fmuls(ctx, ra, rb, rc, fn11);
2143 4c9649a9 j_mayer
            break;
2144 4c9649a9 j_mayer
        case 0x03:
2145 4c9649a9 j_mayer
            /* DIVS */
2146 f24518b5 Richard Henderson
            gen_fdivs(ctx, ra, rb, rc, fn11);
2147 4c9649a9 j_mayer
            break;
2148 4c9649a9 j_mayer
        case 0x20:
2149 4c9649a9 j_mayer
            /* ADDT */
2150 f24518b5 Richard Henderson
            gen_faddt(ctx, ra, rb, rc, fn11);
2151 4c9649a9 j_mayer
            break;
2152 4c9649a9 j_mayer
        case 0x21:
2153 4c9649a9 j_mayer
            /* SUBT */
2154 f24518b5 Richard Henderson
            gen_fsubt(ctx, ra, rb, rc, fn11);
2155 4c9649a9 j_mayer
            break;
2156 4c9649a9 j_mayer
        case 0x22:
2157 4c9649a9 j_mayer
            /* MULT */
2158 f24518b5 Richard Henderson
            gen_fmult(ctx, ra, rb, rc, fn11);
2159 4c9649a9 j_mayer
            break;
2160 4c9649a9 j_mayer
        case 0x23:
2161 4c9649a9 j_mayer
            /* DIVT */
2162 f24518b5 Richard Henderson
            gen_fdivt(ctx, ra, rb, rc, fn11);
2163 4c9649a9 j_mayer
            break;
2164 4c9649a9 j_mayer
        case 0x24:
2165 4c9649a9 j_mayer
            /* CMPTUN */
2166 f24518b5 Richard Henderson
            gen_fcmptun(ctx, ra, rb, rc, fn11);
2167 4c9649a9 j_mayer
            break;
2168 4c9649a9 j_mayer
        case 0x25:
2169 4c9649a9 j_mayer
            /* CMPTEQ */
2170 f24518b5 Richard Henderson
            gen_fcmpteq(ctx, ra, rb, rc, fn11);
2171 4c9649a9 j_mayer
            break;
2172 4c9649a9 j_mayer
        case 0x26:
2173 4c9649a9 j_mayer
            /* CMPTLT */
2174 f24518b5 Richard Henderson
            gen_fcmptlt(ctx, ra, rb, rc, fn11);
2175 4c9649a9 j_mayer
            break;
2176 4c9649a9 j_mayer
        case 0x27:
2177 4c9649a9 j_mayer
            /* CMPTLE */
2178 f24518b5 Richard Henderson
            gen_fcmptle(ctx, ra, rb, rc, fn11);
2179 4c9649a9 j_mayer
            break;
2180 4c9649a9 j_mayer
        case 0x2C:
2181 a74b4d2c aurel32
            if (fn11 == 0x2AC || fn11 == 0x6AC) {
2182 4c9649a9 j_mayer
                /* CVTST */
2183 f24518b5 Richard Henderson
                gen_fcvtst(ctx, rb, rc, fn11);
2184 4c9649a9 j_mayer
            } else {
2185 4c9649a9 j_mayer
                /* CVTTS */
2186 f24518b5 Richard Henderson
                gen_fcvtts(ctx, rb, rc, fn11);
2187 4c9649a9 j_mayer
            }
2188 4c9649a9 j_mayer
            break;
2189 4c9649a9 j_mayer
        case 0x2F:
2190 4c9649a9 j_mayer
            /* CVTTQ */
2191 f24518b5 Richard Henderson
            gen_fcvttq(ctx, rb, rc, fn11);
2192 4c9649a9 j_mayer
            break;
2193 4c9649a9 j_mayer
        case 0x3C:
2194 4c9649a9 j_mayer
            /* CVTQS */
2195 f24518b5 Richard Henderson
            gen_fcvtqs(ctx, rb, rc, fn11);
2196 4c9649a9 j_mayer
            break;
2197 4c9649a9 j_mayer
        case 0x3E:
2198 4c9649a9 j_mayer
            /* CVTQT */
2199 f24518b5 Richard Henderson
            gen_fcvtqt(ctx, rb, rc, fn11);
2200 4c9649a9 j_mayer
            break;
2201 4c9649a9 j_mayer
        default:
2202 4c9649a9 j_mayer
            goto invalid_opc;
2203 4c9649a9 j_mayer
        }
2204 4c9649a9 j_mayer
        break;
2205 4c9649a9 j_mayer
    case 0x17:
2206 4c9649a9 j_mayer
        switch (fn11) {
2207 4c9649a9 j_mayer
        case 0x010:
2208 4c9649a9 j_mayer
            /* CVTLQ */
2209 a7812ae4 pbrook
            gen_fcvtlq(rb, rc);
2210 4c9649a9 j_mayer
            break;
2211 4c9649a9 j_mayer
        case 0x020:
2212 f18cd223 aurel32
            if (likely(rc != 31)) {
2213 a06d48d9 Richard Henderson
                if (ra == rb) {
2214 4c9649a9 j_mayer
                    /* FMOV */
2215 a06d48d9 Richard Henderson
                    if (ra == 31)
2216 a06d48d9 Richard Henderson
                        tcg_gen_movi_i64(cpu_fir[rc], 0);
2217 a06d48d9 Richard Henderson
                    else
2218 a06d48d9 Richard Henderson
                        tcg_gen_mov_i64(cpu_fir[rc], cpu_fir[ra]);
2219 a06d48d9 Richard Henderson
                } else {
2220 f18cd223 aurel32
                    /* CPYS */
2221 a7812ae4 pbrook
                    gen_fcpys(ra, rb, rc);
2222 a06d48d9 Richard Henderson
                }
2223 4c9649a9 j_mayer
            }
2224 4c9649a9 j_mayer
            break;
2225 4c9649a9 j_mayer
        case 0x021:
2226 4c9649a9 j_mayer
            /* CPYSN */
2227 a7812ae4 pbrook
            gen_fcpysn(ra, rb, rc);
2228 4c9649a9 j_mayer
            break;
2229 4c9649a9 j_mayer
        case 0x022:
2230 4c9649a9 j_mayer
            /* CPYSE */
2231 a7812ae4 pbrook
            gen_fcpyse(ra, rb, rc);
2232 4c9649a9 j_mayer
            break;
2233 4c9649a9 j_mayer
        case 0x024:
2234 4c9649a9 j_mayer
            /* MT_FPCR */
2235 f18cd223 aurel32
            if (likely(ra != 31))
2236 a7812ae4 pbrook
                gen_helper_store_fpcr(cpu_fir[ra]);
2237 f18cd223 aurel32
            else {
2238 f18cd223 aurel32
                TCGv tmp = tcg_const_i64(0);
2239 a7812ae4 pbrook
                gen_helper_store_fpcr(tmp);
2240 f18cd223 aurel32
                tcg_temp_free(tmp);
2241 f18cd223 aurel32
            }
2242 4c9649a9 j_mayer
            break;
2243 4c9649a9 j_mayer
        case 0x025:
2244 4c9649a9 j_mayer
            /* MF_FPCR */
2245 f18cd223 aurel32
            if (likely(ra != 31))
2246 a7812ae4 pbrook
                gen_helper_load_fpcr(cpu_fir[ra]);
2247 4c9649a9 j_mayer
            break;
2248 4c9649a9 j_mayer
        case 0x02A:
2249 4c9649a9 j_mayer
            /* FCMOVEQ */
2250 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_EQ, ra, rb, rc);
2251 4c9649a9 j_mayer
            break;
2252 4c9649a9 j_mayer
        case 0x02B:
2253 4c9649a9 j_mayer
            /* FCMOVNE */
2254 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_NE, ra, rb, rc);
2255 4c9649a9 j_mayer
            break;
2256 4c9649a9 j_mayer
        case 0x02C:
2257 4c9649a9 j_mayer
            /* FCMOVLT */
2258 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_LT, ra, rb, rc);
2259 4c9649a9 j_mayer
            break;
2260 4c9649a9 j_mayer
        case 0x02D:
2261 4c9649a9 j_mayer
            /* FCMOVGE */
2262 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_GE, ra, rb, rc);
2263 4c9649a9 j_mayer
            break;
2264 4c9649a9 j_mayer
        case 0x02E:
2265 4c9649a9 j_mayer
            /* FCMOVLE */
2266 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_LE, ra, rb, rc);
2267 4c9649a9 j_mayer
            break;
2268 4c9649a9 j_mayer
        case 0x02F:
2269 4c9649a9 j_mayer
            /* FCMOVGT */
2270 bbe1dab4 Richard Henderson
            gen_fcmov(TCG_COND_GT, ra, rb, rc);
2271 4c9649a9 j_mayer
            break;
2272 4c9649a9 j_mayer
        case 0x030:
2273 4c9649a9 j_mayer
            /* CVTQL */
2274 a7812ae4 pbrook
            gen_fcvtql(rb, rc);
2275 4c9649a9 j_mayer
            break;
2276 4c9649a9 j_mayer
        case 0x130:
2277 4c9649a9 j_mayer
            /* CVTQL/V */
2278 4c9649a9 j_mayer
        case 0x530:
2279 4c9649a9 j_mayer
            /* CVTQL/SV */
2280 735cf45f Richard Henderson
            /* ??? I'm pretty sure there's nothing that /sv needs to do that
2281 735cf45f Richard Henderson
               /v doesn't do.  The only thing I can think is that /sv is a
2282 735cf45f Richard Henderson
               valid instruction merely for completeness in the ISA.  */
2283 735cf45f Richard Henderson
            gen_fcvtql_v(ctx, rb, rc);
2284 4c9649a9 j_mayer
            break;
2285 4c9649a9 j_mayer
        default:
2286 4c9649a9 j_mayer
            goto invalid_opc;
2287 4c9649a9 j_mayer
        }
2288 4c9649a9 j_mayer
        break;
2289 4c9649a9 j_mayer
    case 0x18:
2290 4c9649a9 j_mayer
        switch ((uint16_t)disp16) {
2291 4c9649a9 j_mayer
        case 0x0000:
2292 4c9649a9 j_mayer
            /* TRAPB */
2293 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
2294 4c9649a9 j_mayer
            ret = 2;
2295 4c9649a9 j_mayer
            break;
2296 4c9649a9 j_mayer
        case 0x0400:
2297 4c9649a9 j_mayer
            /* EXCB */
2298 4c9649a9 j_mayer
            /* No-op. Just exit from the current tb */
2299 4c9649a9 j_mayer
            ret = 2;
2300 4c9649a9 j_mayer
            break;
2301 4c9649a9 j_mayer
        case 0x4000:
2302 4c9649a9 j_mayer
            /* MB */
2303 4c9649a9 j_mayer
            /* No-op */
2304 4c9649a9 j_mayer
            break;
2305 4c9649a9 j_mayer
        case 0x4400:
2306 4c9649a9 j_mayer
            /* WMB */
2307 4c9649a9 j_mayer
            /* No-op */
2308 4c9649a9 j_mayer
            break;
2309 4c9649a9 j_mayer
        case 0x8000:
2310 4c9649a9 j_mayer
            /* FETCH */
2311 4c9649a9 j_mayer
            /* No-op */
2312 4c9649a9 j_mayer
            break;
2313 4c9649a9 j_mayer
        case 0xA000:
2314 4c9649a9 j_mayer
            /* FETCH_M */
2315 4c9649a9 j_mayer
            /* No-op */
2316 4c9649a9 j_mayer
            break;
2317 4c9649a9 j_mayer
        case 0xC000:
2318 4c9649a9 j_mayer
            /* RPCC */
2319 3761035f aurel32
            if (ra != 31)
2320 a7812ae4 pbrook
                gen_helper_load_pcc(cpu_ir[ra]);
2321 4c9649a9 j_mayer
            break;
2322 4c9649a9 j_mayer
        case 0xE000:
2323 4c9649a9 j_mayer
            /* RC */
2324 3761035f aurel32
            if (ra != 31)
2325 a7812ae4 pbrook
                gen_helper_rc(cpu_ir[ra]);
2326 4c9649a9 j_mayer
            break;
2327 4c9649a9 j_mayer
        case 0xE800:
2328 4c9649a9 j_mayer
            /* ECB */
2329 4c9649a9 j_mayer
            break;
2330 4c9649a9 j_mayer
        case 0xF000:
2331 4c9649a9 j_mayer
            /* RS */
2332 3761035f aurel32
            if (ra != 31)
2333 a7812ae4 pbrook
                gen_helper_rs(cpu_ir[ra]);
2334 4c9649a9 j_mayer
            break;
2335 4c9649a9 j_mayer
        case 0xF800:
2336 4c9649a9 j_mayer
            /* WH64 */
2337 4c9649a9 j_mayer
            /* No-op */
2338 4c9649a9 j_mayer
            break;
2339 4c9649a9 j_mayer
        default:
2340 4c9649a9 j_mayer
            goto invalid_opc;
2341 4c9649a9 j_mayer
        }
2342 4c9649a9 j_mayer
        break;
2343 4c9649a9 j_mayer
    case 0x19:
2344 4c9649a9 j_mayer
        /* HW_MFPR (PALcode) */
2345 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2346 4c9649a9 j_mayer
        goto invalid_opc;
2347 4c9649a9 j_mayer
#else
2348 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2349 4c9649a9 j_mayer
            goto invalid_opc;
2350 8bb6e981 aurel32
        if (ra != 31) {
2351 8bb6e981 aurel32
            TCGv tmp = tcg_const_i32(insn & 0xFF);
2352 a7812ae4 pbrook
            gen_helper_mfpr(cpu_ir[ra], tmp, cpu_ir[ra]);
2353 8bb6e981 aurel32
            tcg_temp_free(tmp);
2354 8bb6e981 aurel32
        }
2355 4c9649a9 j_mayer
        break;
2356 4c9649a9 j_mayer
#endif
2357 4c9649a9 j_mayer
    case 0x1A:
2358 3761035f aurel32
        if (rb != 31)
2359 3761035f aurel32
            tcg_gen_andi_i64(cpu_pc, cpu_ir[rb], ~3);
2360 3761035f aurel32
        else
2361 3761035f aurel32
            tcg_gen_movi_i64(cpu_pc, 0);
2362 1304ca87 aurel32
        if (ra != 31)
2363 1304ca87 aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2364 4c9649a9 j_mayer
        /* Those four jumps only differ by the branch prediction hint */
2365 4c9649a9 j_mayer
        switch (fn2) {
2366 4c9649a9 j_mayer
        case 0x0:
2367 4c9649a9 j_mayer
            /* JMP */
2368 4c9649a9 j_mayer
            break;
2369 4c9649a9 j_mayer
        case 0x1:
2370 4c9649a9 j_mayer
            /* JSR */
2371 4c9649a9 j_mayer
            break;
2372 4c9649a9 j_mayer
        case 0x2:
2373 4c9649a9 j_mayer
            /* RET */
2374 4c9649a9 j_mayer
            break;
2375 4c9649a9 j_mayer
        case 0x3:
2376 4c9649a9 j_mayer
            /* JSR_COROUTINE */
2377 4c9649a9 j_mayer
            break;
2378 4c9649a9 j_mayer
        }
2379 4c9649a9 j_mayer
        ret = 1;
2380 4c9649a9 j_mayer
        break;
2381 4c9649a9 j_mayer
    case 0x1B:
2382 4c9649a9 j_mayer
        /* HW_LD (PALcode) */
2383 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2384 4c9649a9 j_mayer
        goto invalid_opc;
2385 4c9649a9 j_mayer
#else
2386 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2387 4c9649a9 j_mayer
            goto invalid_opc;
2388 8bb6e981 aurel32
        if (ra != 31) {
2389 a7812ae4 pbrook
            TCGv addr = tcg_temp_new();
2390 8bb6e981 aurel32
            if (rb != 31)
2391 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
2392 8bb6e981 aurel32
            else
2393 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
2394 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
2395 8bb6e981 aurel32
            case 0x0:
2396 b5d51029 aurel32
                /* Longword physical access (hw_ldl/p) */
2397 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
2398 8bb6e981 aurel32
                break;
2399 8bb6e981 aurel32
            case 0x1:
2400 b5d51029 aurel32
                /* Quadword physical access (hw_ldq/p) */
2401 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
2402 8bb6e981 aurel32
                break;
2403 8bb6e981 aurel32
            case 0x2:
2404 b5d51029 aurel32
                /* Longword physical access with lock (hw_ldl_l/p) */
2405 a7812ae4 pbrook
                gen_helper_ldl_l_raw(cpu_ir[ra], addr);
2406 8bb6e981 aurel32
                break;
2407 8bb6e981 aurel32
            case 0x3:
2408 b5d51029 aurel32
                /* Quadword physical access with lock (hw_ldq_l/p) */
2409 a7812ae4 pbrook
                gen_helper_ldq_l_raw(cpu_ir[ra], addr);
2410 8bb6e981 aurel32
                break;
2411 8bb6e981 aurel32
            case 0x4:
2412 b5d51029 aurel32
                /* Longword virtual PTE fetch (hw_ldl/v) */
2413 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
2414 8bb6e981 aurel32
                break;
2415 8bb6e981 aurel32
            case 0x5:
2416 b5d51029 aurel32
                /* Quadword virtual PTE fetch (hw_ldq/v) */
2417 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
2418 8bb6e981 aurel32
                break;
2419 8bb6e981 aurel32
            case 0x6:
2420 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
2421 b5d51029 aurel32
                goto invalid_opc;
2422 8bb6e981 aurel32
            case 0x7:
2423 8bb6e981 aurel32
                /* Incpu_ir[ra]id */
2424 b5d51029 aurel32
                goto invalid_opc;
2425 8bb6e981 aurel32
            case 0x8:
2426 b5d51029 aurel32
                /* Longword virtual access (hw_ldl) */
2427 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2428 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
2429 8bb6e981 aurel32
                break;
2430 8bb6e981 aurel32
            case 0x9:
2431 b5d51029 aurel32
                /* Quadword virtual access (hw_ldq) */
2432 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2433 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
2434 8bb6e981 aurel32
                break;
2435 8bb6e981 aurel32
            case 0xA:
2436 b5d51029 aurel32
                /* Longword virtual access with protection check (hw_ldl/w) */
2437 b5d51029 aurel32
                tcg_gen_qemu_ld32s(cpu_ir[ra], addr, 0);
2438 8bb6e981 aurel32
                break;
2439 8bb6e981 aurel32
            case 0xB:
2440 b5d51029 aurel32
                /* Quadword virtual access with protection check (hw_ldq/w) */
2441 b5d51029 aurel32
                tcg_gen_qemu_ld64(cpu_ir[ra], addr, 0);
2442 8bb6e981 aurel32
                break;
2443 8bb6e981 aurel32
            case 0xC:
2444 b5d51029 aurel32
                /* Longword virtual access with alt access mode (hw_ldl/a)*/
2445 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2446 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2447 a7812ae4 pbrook
                gen_helper_ldl_raw(cpu_ir[ra], addr);
2448 a7812ae4 pbrook
                gen_helper_restore_mode();
2449 8bb6e981 aurel32
                break;
2450 8bb6e981 aurel32
            case 0xD:
2451 b5d51029 aurel32
                /* Quadword virtual access with alt access mode (hw_ldq/a) */
2452 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2453 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2454 a7812ae4 pbrook
                gen_helper_ldq_raw(cpu_ir[ra], addr);
2455 a7812ae4 pbrook
                gen_helper_restore_mode();
2456 8bb6e981 aurel32
                break;
2457 8bb6e981 aurel32
            case 0xE:
2458 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode and
2459 b5d51029 aurel32
                 * protection checks (hw_ldl/wa)
2460 8bb6e981 aurel32
                 */
2461 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2462 a7812ae4 pbrook
                gen_helper_ldl_data(cpu_ir[ra], addr);
2463 a7812ae4 pbrook
                gen_helper_restore_mode();
2464 8bb6e981 aurel32
                break;
2465 8bb6e981 aurel32
            case 0xF:
2466 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode and
2467 b5d51029 aurel32
                 * protection checks (hw_ldq/wa)
2468 8bb6e981 aurel32
                 */
2469 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2470 a7812ae4 pbrook
                gen_helper_ldq_data(cpu_ir[ra], addr);
2471 a7812ae4 pbrook
                gen_helper_restore_mode();
2472 8bb6e981 aurel32
                break;
2473 8bb6e981 aurel32
            }
2474 8bb6e981 aurel32
            tcg_temp_free(addr);
2475 4c9649a9 j_mayer
        }
2476 4c9649a9 j_mayer
        break;
2477 4c9649a9 j_mayer
#endif
2478 4c9649a9 j_mayer
    case 0x1C:
2479 4c9649a9 j_mayer
        switch (fn7) {
2480 4c9649a9 j_mayer
        case 0x00:
2481 4c9649a9 j_mayer
            /* SEXTB */
2482 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
2483 4c9649a9 j_mayer
                goto invalid_opc;
2484 ae8ecd42 aurel32
            if (likely(rc != 31)) {
2485 ae8ecd42 aurel32
                if (islit)
2486 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int8_t)lit));
2487 ae8ecd42 aurel32
                else
2488 dfaa8583 aurel32
                    tcg_gen_ext8s_i64(cpu_ir[rc], cpu_ir[rb]);
2489 ae8ecd42 aurel32
            }
2490 4c9649a9 j_mayer
            break;
2491 4c9649a9 j_mayer
        case 0x01:
2492 4c9649a9 j_mayer
            /* SEXTW */
2493 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_BWX))
2494 4c9649a9 j_mayer
                goto invalid_opc;
2495 ae8ecd42 aurel32
            if (likely(rc != 31)) {
2496 ae8ecd42 aurel32
                if (islit)
2497 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], (int64_t)((int16_t)lit));
2498 ae8ecd42 aurel32
                else
2499 dfaa8583 aurel32
                    tcg_gen_ext16s_i64(cpu_ir[rc], cpu_ir[rb]);
2500 ae8ecd42 aurel32
            }
2501 4c9649a9 j_mayer
            break;
2502 4c9649a9 j_mayer
        case 0x30:
2503 4c9649a9 j_mayer
            /* CTPOP */
2504 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
2505 4c9649a9 j_mayer
                goto invalid_opc;
2506 ae8ecd42 aurel32
            if (likely(rc != 31)) {
2507 ae8ecd42 aurel32
                if (islit)
2508 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctpop64(lit));
2509 ae8ecd42 aurel32
                else
2510 a7812ae4 pbrook
                    gen_helper_ctpop(cpu_ir[rc], cpu_ir[rb]);
2511 ae8ecd42 aurel32
            }
2512 4c9649a9 j_mayer
            break;
2513 4c9649a9 j_mayer
        case 0x31:
2514 4c9649a9 j_mayer
            /* PERR */
2515 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2516 4c9649a9 j_mayer
                goto invalid_opc;
2517 13e4df99 Richard Henderson
            gen_perr(ra, rb, rc, islit, lit);
2518 4c9649a9 j_mayer
            break;
2519 4c9649a9 j_mayer
        case 0x32:
2520 4c9649a9 j_mayer
            /* CTLZ */
2521 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
2522 4c9649a9 j_mayer
                goto invalid_opc;
2523 ae8ecd42 aurel32
            if (likely(rc != 31)) {
2524 ae8ecd42 aurel32
                if (islit)
2525 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], clz64(lit));
2526 ae8ecd42 aurel32
                else
2527 a7812ae4 pbrook
                    gen_helper_ctlz(cpu_ir[rc], cpu_ir[rb]);
2528 ae8ecd42 aurel32
            }
2529 4c9649a9 j_mayer
            break;
2530 4c9649a9 j_mayer
        case 0x33:
2531 4c9649a9 j_mayer
            /* CTTZ */
2532 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_CIX))
2533 4c9649a9 j_mayer
                goto invalid_opc;
2534 ae8ecd42 aurel32
            if (likely(rc != 31)) {
2535 ae8ecd42 aurel32
                if (islit)
2536 ae8ecd42 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], ctz64(lit));
2537 ae8ecd42 aurel32
                else
2538 a7812ae4 pbrook
                    gen_helper_cttz(cpu_ir[rc], cpu_ir[rb]);
2539 ae8ecd42 aurel32
            }
2540 4c9649a9 j_mayer
            break;
2541 4c9649a9 j_mayer
        case 0x34:
2542 4c9649a9 j_mayer
            /* UNPKBW */
2543 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2544 4c9649a9 j_mayer
                goto invalid_opc;
2545 13e4df99 Richard Henderson
            if (real_islit || ra != 31)
2546 13e4df99 Richard Henderson
                goto invalid_opc;
2547 13e4df99 Richard Henderson
            gen_unpkbw (rb, rc);
2548 4c9649a9 j_mayer
            break;
2549 4c9649a9 j_mayer
        case 0x35:
2550 13e4df99 Richard Henderson
            /* UNPKBL */
2551 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2552 4c9649a9 j_mayer
                goto invalid_opc;
2553 13e4df99 Richard Henderson
            if (real_islit || ra != 31)
2554 13e4df99 Richard Henderson
                goto invalid_opc;
2555 13e4df99 Richard Henderson
            gen_unpkbl (rb, rc);
2556 4c9649a9 j_mayer
            break;
2557 4c9649a9 j_mayer
        case 0x36:
2558 4c9649a9 j_mayer
            /* PKWB */
2559 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2560 4c9649a9 j_mayer
                goto invalid_opc;
2561 13e4df99 Richard Henderson
            if (real_islit || ra != 31)
2562 13e4df99 Richard Henderson
                goto invalid_opc;
2563 13e4df99 Richard Henderson
            gen_pkwb (rb, rc);
2564 4c9649a9 j_mayer
            break;
2565 4c9649a9 j_mayer
        case 0x37:
2566 4c9649a9 j_mayer
            /* PKLB */
2567 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2568 4c9649a9 j_mayer
                goto invalid_opc;
2569 13e4df99 Richard Henderson
            if (real_islit || ra != 31)
2570 13e4df99 Richard Henderson
                goto invalid_opc;
2571 13e4df99 Richard Henderson
            gen_pklb (rb, rc);
2572 4c9649a9 j_mayer
            break;
2573 4c9649a9 j_mayer
        case 0x38:
2574 4c9649a9 j_mayer
            /* MINSB8 */
2575 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2576 4c9649a9 j_mayer
                goto invalid_opc;
2577 13e4df99 Richard Henderson
            gen_minsb8 (ra, rb, rc, islit, lit);
2578 4c9649a9 j_mayer
            break;
2579 4c9649a9 j_mayer
        case 0x39:
2580 4c9649a9 j_mayer
            /* MINSW4 */
2581 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2582 4c9649a9 j_mayer
                goto invalid_opc;
2583 13e4df99 Richard Henderson
            gen_minsw4 (ra, rb, rc, islit, lit);
2584 4c9649a9 j_mayer
            break;
2585 4c9649a9 j_mayer
        case 0x3A:
2586 4c9649a9 j_mayer
            /* MINUB8 */
2587 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2588 4c9649a9 j_mayer
                goto invalid_opc;
2589 13e4df99 Richard Henderson
            gen_minub8 (ra, rb, rc, islit, lit);
2590 4c9649a9 j_mayer
            break;
2591 4c9649a9 j_mayer
        case 0x3B:
2592 4c9649a9 j_mayer
            /* MINUW4 */
2593 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2594 4c9649a9 j_mayer
                goto invalid_opc;
2595 13e4df99 Richard Henderson
            gen_minuw4 (ra, rb, rc, islit, lit);
2596 4c9649a9 j_mayer
            break;
2597 4c9649a9 j_mayer
        case 0x3C:
2598 4c9649a9 j_mayer
            /* MAXUB8 */
2599 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2600 4c9649a9 j_mayer
                goto invalid_opc;
2601 13e4df99 Richard Henderson
            gen_maxub8 (ra, rb, rc, islit, lit);
2602 4c9649a9 j_mayer
            break;
2603 4c9649a9 j_mayer
        case 0x3D:
2604 4c9649a9 j_mayer
            /* MAXUW4 */
2605 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2606 4c9649a9 j_mayer
                goto invalid_opc;
2607 13e4df99 Richard Henderson
            gen_maxuw4 (ra, rb, rc, islit, lit);
2608 4c9649a9 j_mayer
            break;
2609 4c9649a9 j_mayer
        case 0x3E:
2610 4c9649a9 j_mayer
            /* MAXSB8 */
2611 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2612 4c9649a9 j_mayer
                goto invalid_opc;
2613 13e4df99 Richard Henderson
            gen_maxsb8 (ra, rb, rc, islit, lit);
2614 4c9649a9 j_mayer
            break;
2615 4c9649a9 j_mayer
        case 0x3F:
2616 4c9649a9 j_mayer
            /* MAXSW4 */
2617 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_MVI))
2618 4c9649a9 j_mayer
                goto invalid_opc;
2619 13e4df99 Richard Henderson
            gen_maxsw4 (ra, rb, rc, islit, lit);
2620 4c9649a9 j_mayer
            break;
2621 4c9649a9 j_mayer
        case 0x70:
2622 4c9649a9 j_mayer
            /* FTOIT */
2623 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2624 4c9649a9 j_mayer
                goto invalid_opc;
2625 f18cd223 aurel32
            if (likely(rc != 31)) {
2626 f18cd223 aurel32
                if (ra != 31)
2627 f18cd223 aurel32
                    tcg_gen_mov_i64(cpu_ir[rc], cpu_fir[ra]);
2628 f18cd223 aurel32
                else
2629 f18cd223 aurel32
                    tcg_gen_movi_i64(cpu_ir[rc], 0);
2630 f18cd223 aurel32
            }
2631 4c9649a9 j_mayer
            break;
2632 4c9649a9 j_mayer
        case 0x78:
2633 4c9649a9 j_mayer
            /* FTOIS */
2634 4c9649a9 j_mayer
            if (!(ctx->amask & AMASK_FIX))
2635 4c9649a9 j_mayer
                goto invalid_opc;
2636 f18cd223 aurel32
            if (rc != 31) {
2637 a7812ae4 pbrook
                TCGv_i32 tmp1 = tcg_temp_new_i32();
2638 f18cd223 aurel32
                if (ra != 31)
2639 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, cpu_fir[ra]);
2640 f18cd223 aurel32
                else {
2641 f18cd223 aurel32
                    TCGv tmp2 = tcg_const_i64(0);
2642 a7812ae4 pbrook
                    gen_helper_s_to_memory(tmp1, tmp2);
2643 f18cd223 aurel32
                    tcg_temp_free(tmp2);
2644 f18cd223 aurel32
                }
2645 f18cd223 aurel32
                tcg_gen_ext_i32_i64(cpu_ir[rc], tmp1);
2646 a7812ae4 pbrook
                tcg_temp_free_i32(tmp1);
2647 f18cd223 aurel32
            }
2648 4c9649a9 j_mayer
            break;
2649 4c9649a9 j_mayer
        default:
2650 4c9649a9 j_mayer
            goto invalid_opc;
2651 4c9649a9 j_mayer
        }
2652 4c9649a9 j_mayer
        break;
2653 4c9649a9 j_mayer
    case 0x1D:
2654 4c9649a9 j_mayer
        /* HW_MTPR (PALcode) */
2655 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2656 4c9649a9 j_mayer
        goto invalid_opc;
2657 4c9649a9 j_mayer
#else
2658 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2659 4c9649a9 j_mayer
            goto invalid_opc;
2660 8bb6e981 aurel32
        else {
2661 8bb6e981 aurel32
            TCGv tmp1 = tcg_const_i32(insn & 0xFF);
2662 8bb6e981 aurel32
            if (ra != 31)
2663 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, cpu_ir[ra]);
2664 8bb6e981 aurel32
            else {
2665 8bb6e981 aurel32
                TCGv tmp2 = tcg_const_i64(0);
2666 a7812ae4 pbrook
                gen_helper_mtpr(tmp1, tmp2);
2667 8bb6e981 aurel32
                tcg_temp_free(tmp2);
2668 8bb6e981 aurel32
            }
2669 8bb6e981 aurel32
            tcg_temp_free(tmp1);
2670 8bb6e981 aurel32
            ret = 2;
2671 8bb6e981 aurel32
        }
2672 4c9649a9 j_mayer
        break;
2673 4c9649a9 j_mayer
#endif
2674 4c9649a9 j_mayer
    case 0x1E:
2675 4c9649a9 j_mayer
        /* HW_REI (PALcode) */
2676 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2677 4c9649a9 j_mayer
        goto invalid_opc;
2678 4c9649a9 j_mayer
#else
2679 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2680 4c9649a9 j_mayer
            goto invalid_opc;
2681 4c9649a9 j_mayer
        if (rb == 31) {
2682 4c9649a9 j_mayer
            /* "Old" alpha */
2683 a7812ae4 pbrook
            gen_helper_hw_rei();
2684 4c9649a9 j_mayer
        } else {
2685 8bb6e981 aurel32
            TCGv tmp;
2686 8bb6e981 aurel32
2687 8bb6e981 aurel32
            if (ra != 31) {
2688 a7812ae4 pbrook
                tmp = tcg_temp_new();
2689 8bb6e981 aurel32
                tcg_gen_addi_i64(tmp, cpu_ir[rb], (((int64_t)insn << 51) >> 51));
2690 8bb6e981 aurel32
            } else
2691 8bb6e981 aurel32
                tmp = tcg_const_i64(((int64_t)insn << 51) >> 51);
2692 a7812ae4 pbrook
            gen_helper_hw_ret(tmp);
2693 8bb6e981 aurel32
            tcg_temp_free(tmp);
2694 4c9649a9 j_mayer
        }
2695 4c9649a9 j_mayer
        ret = 2;
2696 4c9649a9 j_mayer
        break;
2697 4c9649a9 j_mayer
#endif
2698 4c9649a9 j_mayer
    case 0x1F:
2699 4c9649a9 j_mayer
        /* HW_ST (PALcode) */
2700 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2701 4c9649a9 j_mayer
        goto invalid_opc;
2702 4c9649a9 j_mayer
#else
2703 4c9649a9 j_mayer
        if (!ctx->pal_mode)
2704 4c9649a9 j_mayer
            goto invalid_opc;
2705 8bb6e981 aurel32
        else {
2706 8bb6e981 aurel32
            TCGv addr, val;
2707 a7812ae4 pbrook
            addr = tcg_temp_new();
2708 8bb6e981 aurel32
            if (rb != 31)
2709 8bb6e981 aurel32
                tcg_gen_addi_i64(addr, cpu_ir[rb], disp12);
2710 8bb6e981 aurel32
            else
2711 8bb6e981 aurel32
                tcg_gen_movi_i64(addr, disp12);
2712 8bb6e981 aurel32
            if (ra != 31)
2713 8bb6e981 aurel32
                val = cpu_ir[ra];
2714 8bb6e981 aurel32
            else {
2715 a7812ae4 pbrook
                val = tcg_temp_new();
2716 8bb6e981 aurel32
                tcg_gen_movi_i64(val, 0);
2717 8bb6e981 aurel32
            }
2718 8bb6e981 aurel32
            switch ((insn >> 12) & 0xF) {
2719 8bb6e981 aurel32
            case 0x0:
2720 8bb6e981 aurel32
                /* Longword physical access */
2721 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2722 8bb6e981 aurel32
                break;
2723 8bb6e981 aurel32
            case 0x1:
2724 8bb6e981 aurel32
                /* Quadword physical access */
2725 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2726 8bb6e981 aurel32
                break;
2727 8bb6e981 aurel32
            case 0x2:
2728 8bb6e981 aurel32
                /* Longword physical access with lock */
2729 a7812ae4 pbrook
                gen_helper_stl_c_raw(val, val, addr);
2730 8bb6e981 aurel32
                break;
2731 8bb6e981 aurel32
            case 0x3:
2732 8bb6e981 aurel32
                /* Quadword physical access with lock */
2733 a7812ae4 pbrook
                gen_helper_stq_c_raw(val, val, addr);
2734 8bb6e981 aurel32
                break;
2735 8bb6e981 aurel32
            case 0x4:
2736 8bb6e981 aurel32
                /* Longword virtual access */
2737 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2738 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2739 8bb6e981 aurel32
                break;
2740 8bb6e981 aurel32
            case 0x5:
2741 8bb6e981 aurel32
                /* Quadword virtual access */
2742 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2743 a7812ae4 pbrook
                gen_helper_stq_raw(val, addr);
2744 8bb6e981 aurel32
                break;
2745 8bb6e981 aurel32
            case 0x6:
2746 8bb6e981 aurel32
                /* Invalid */
2747 8bb6e981 aurel32
                goto invalid_opc;
2748 8bb6e981 aurel32
            case 0x7:
2749 8bb6e981 aurel32
                /* Invalid */
2750 8bb6e981 aurel32
                goto invalid_opc;
2751 8bb6e981 aurel32
            case 0x8:
2752 8bb6e981 aurel32
                /* Invalid */
2753 8bb6e981 aurel32
                goto invalid_opc;
2754 8bb6e981 aurel32
            case 0x9:
2755 8bb6e981 aurel32
                /* Invalid */
2756 8bb6e981 aurel32
                goto invalid_opc;
2757 8bb6e981 aurel32
            case 0xA:
2758 8bb6e981 aurel32
                /* Invalid */
2759 8bb6e981 aurel32
                goto invalid_opc;
2760 8bb6e981 aurel32
            case 0xB:
2761 8bb6e981 aurel32
                /* Invalid */
2762 8bb6e981 aurel32
                goto invalid_opc;
2763 8bb6e981 aurel32
            case 0xC:
2764 8bb6e981 aurel32
                /* Longword virtual access with alternate access mode */
2765 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2766 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2767 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2768 a7812ae4 pbrook
                gen_helper_restore_mode();
2769 8bb6e981 aurel32
                break;
2770 8bb6e981 aurel32
            case 0xD:
2771 8bb6e981 aurel32
                /* Quadword virtual access with alternate access mode */
2772 a7812ae4 pbrook
                gen_helper_set_alt_mode();
2773 a7812ae4 pbrook
                gen_helper_st_virt_to_phys(addr, addr);
2774 a7812ae4 pbrook
                gen_helper_stl_raw(val, addr);
2775 a7812ae4 pbrook
                gen_helper_restore_mode();
2776 8bb6e981 aurel32
                break;
2777 8bb6e981 aurel32
            case 0xE:
2778 8bb6e981 aurel32
                /* Invalid */
2779 8bb6e981 aurel32
                goto invalid_opc;
2780 8bb6e981 aurel32
            case 0xF:
2781 8bb6e981 aurel32
                /* Invalid */
2782 8bb6e981 aurel32
                goto invalid_opc;
2783 8bb6e981 aurel32
            }
2784 45d46ce8 aurel32
            if (ra == 31)
2785 8bb6e981 aurel32
                tcg_temp_free(val);
2786 8bb6e981 aurel32
            tcg_temp_free(addr);
2787 4c9649a9 j_mayer
        }
2788 4c9649a9 j_mayer
        break;
2789 4c9649a9 j_mayer
#endif
2790 4c9649a9 j_mayer
    case 0x20:
2791 4c9649a9 j_mayer
        /* LDF */
2792 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0);
2793 4c9649a9 j_mayer
        break;
2794 4c9649a9 j_mayer
    case 0x21:
2795 4c9649a9 j_mayer
        /* LDG */
2796 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0);
2797 4c9649a9 j_mayer
        break;
2798 4c9649a9 j_mayer
    case 0x22:
2799 4c9649a9 j_mayer
        /* LDS */
2800 f18cd223 aurel32
        gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0);
2801 4c9649a9 j_mayer
        break;
2802 4c9649a9 j_mayer
    case 0x23:
2803 4c9649a9 j_mayer
        /* LDT */
2804 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0);
2805 4c9649a9 j_mayer
        break;
2806 4c9649a9 j_mayer
    case 0x24:
2807 4c9649a9 j_mayer
        /* STF */
2808 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0, 0);
2809 4c9649a9 j_mayer
        break;
2810 4c9649a9 j_mayer
    case 0x25:
2811 4c9649a9 j_mayer
        /* STG */
2812 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0, 0);
2813 4c9649a9 j_mayer
        break;
2814 4c9649a9 j_mayer
    case 0x26:
2815 4c9649a9 j_mayer
        /* STS */
2816 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0, 0);
2817 4c9649a9 j_mayer
        break;
2818 4c9649a9 j_mayer
    case 0x27:
2819 4c9649a9 j_mayer
        /* STT */
2820 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0, 0);
2821 4c9649a9 j_mayer
        break;
2822 4c9649a9 j_mayer
    case 0x28:
2823 4c9649a9 j_mayer
        /* LDL */
2824 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0, 0);
2825 4c9649a9 j_mayer
        break;
2826 4c9649a9 j_mayer
    case 0x29:
2827 4c9649a9 j_mayer
        /* LDQ */
2828 f18cd223 aurel32
        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 0);
2829 4c9649a9 j_mayer
        break;
2830 4c9649a9 j_mayer
    case 0x2A:
2831 4c9649a9 j_mayer
        /* LDL_L */
2832 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldl_l, ra, rb, disp16, 0, 0);
2833 4c9649a9 j_mayer
        break;
2834 4c9649a9 j_mayer
    case 0x2B:
2835 4c9649a9 j_mayer
        /* LDQ_L */
2836 f4ed8679 aurel32
        gen_load_mem(ctx, &gen_qemu_ldq_l, ra, rb, disp16, 0, 0);
2837 4c9649a9 j_mayer
        break;
2838 4c9649a9 j_mayer
    case 0x2C:
2839 4c9649a9 j_mayer
        /* STL */
2840 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0, 0, 0);
2841 4c9649a9 j_mayer
        break;
2842 4c9649a9 j_mayer
    case 0x2D:
2843 4c9649a9 j_mayer
        /* STQ */
2844 57a92c8e aurel32
        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 0, 0);
2845 4c9649a9 j_mayer
        break;
2846 4c9649a9 j_mayer
    case 0x2E:
2847 4c9649a9 j_mayer
        /* STL_C */
2848 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stl_c, ra, rb, disp16, 0, 0, 1);
2849 4c9649a9 j_mayer
        break;
2850 4c9649a9 j_mayer
    case 0x2F:
2851 4c9649a9 j_mayer
        /* STQ_C */
2852 57a92c8e aurel32
        gen_store_mem(ctx, &gen_qemu_stq_c, ra, rb, disp16, 0, 0, 1);
2853 4c9649a9 j_mayer
        break;
2854 4c9649a9 j_mayer
    case 0x30:
2855 4c9649a9 j_mayer
        /* BR */
2856 3761035f aurel32
        if (ra != 31)
2857 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2858 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2859 4c9649a9 j_mayer
        ret = 1;
2860 4c9649a9 j_mayer
        break;
2861 a7812ae4 pbrook
    case 0x31: /* FBEQ */
2862 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_EQ, ra, disp21);
2863 dbb30fe6 Richard Henderson
        ret = 1;
2864 dbb30fe6 Richard Henderson
        break;
2865 a7812ae4 pbrook
    case 0x32: /* FBLT */
2866 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_LT, ra, disp21);
2867 dbb30fe6 Richard Henderson
        ret = 1;
2868 dbb30fe6 Richard Henderson
        break;
2869 a7812ae4 pbrook
    case 0x33: /* FBLE */
2870 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_LE, ra, disp21);
2871 4c9649a9 j_mayer
        ret = 1;
2872 4c9649a9 j_mayer
        break;
2873 4c9649a9 j_mayer
    case 0x34:
2874 4c9649a9 j_mayer
        /* BSR */
2875 3761035f aurel32
        if (ra != 31)
2876 3761035f aurel32
            tcg_gen_movi_i64(cpu_ir[ra], ctx->pc);
2877 3761035f aurel32
        tcg_gen_movi_i64(cpu_pc, ctx->pc + (int64_t)(disp21 << 2));
2878 4c9649a9 j_mayer
        ret = 1;
2879 4c9649a9 j_mayer
        break;
2880 a7812ae4 pbrook
    case 0x35: /* FBNE */
2881 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_NE, ra, disp21);
2882 dbb30fe6 Richard Henderson
        ret = 1;
2883 dbb30fe6 Richard Henderson
        break;
2884 a7812ae4 pbrook
    case 0x36: /* FBGE */
2885 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_GE, ra, disp21);
2886 dbb30fe6 Richard Henderson
        ret = 1;
2887 dbb30fe6 Richard Henderson
        break;
2888 a7812ae4 pbrook
    case 0x37: /* FBGT */
2889 dbb30fe6 Richard Henderson
        gen_fbcond(ctx, TCG_COND_GT, ra, disp21);
2890 4c9649a9 j_mayer
        ret = 1;
2891 4c9649a9 j_mayer
        break;
2892 4c9649a9 j_mayer
    case 0x38:
2893 4c9649a9 j_mayer
        /* BLBC */
2894 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 1);
2895 4c9649a9 j_mayer
        ret = 1;
2896 4c9649a9 j_mayer
        break;
2897 4c9649a9 j_mayer
    case 0x39:
2898 4c9649a9 j_mayer
        /* BEQ */
2899 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 0);
2900 4c9649a9 j_mayer
        ret = 1;
2901 4c9649a9 j_mayer
        break;
2902 4c9649a9 j_mayer
    case 0x3A:
2903 4c9649a9 j_mayer
        /* BLT */
2904 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LT, ra, disp21, 0);
2905 4c9649a9 j_mayer
        ret = 1;
2906 4c9649a9 j_mayer
        break;
2907 4c9649a9 j_mayer
    case 0x3B:
2908 4c9649a9 j_mayer
        /* BLE */
2909 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_LE, ra, disp21, 0);
2910 4c9649a9 j_mayer
        ret = 1;
2911 4c9649a9 j_mayer
        break;
2912 4c9649a9 j_mayer
    case 0x3C:
2913 4c9649a9 j_mayer
        /* BLBS */
2914 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 1);
2915 4c9649a9 j_mayer
        ret = 1;
2916 4c9649a9 j_mayer
        break;
2917 4c9649a9 j_mayer
    case 0x3D:
2918 4c9649a9 j_mayer
        /* BNE */
2919 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_NE, ra, disp21, 0);
2920 4c9649a9 j_mayer
        ret = 1;
2921 4c9649a9 j_mayer
        break;
2922 4c9649a9 j_mayer
    case 0x3E:
2923 4c9649a9 j_mayer
        /* BGE */
2924 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GE, ra, disp21, 0);
2925 4c9649a9 j_mayer
        ret = 1;
2926 4c9649a9 j_mayer
        break;
2927 4c9649a9 j_mayer
    case 0x3F:
2928 4c9649a9 j_mayer
        /* BGT */
2929 a1516744 aurel32
        gen_bcond(ctx, TCG_COND_GT, ra, disp21, 0);
2930 4c9649a9 j_mayer
        ret = 1;
2931 4c9649a9 j_mayer
        break;
2932 4c9649a9 j_mayer
    invalid_opc:
2933 4c9649a9 j_mayer
        gen_invalid(ctx);
2934 4c9649a9 j_mayer
        ret = 3;
2935 4c9649a9 j_mayer
        break;
2936 4c9649a9 j_mayer
    }
2937 4c9649a9 j_mayer
2938 4c9649a9 j_mayer
    return ret;
2939 4c9649a9 j_mayer
}
2940 4c9649a9 j_mayer
2941 636aa200 Blue Swirl
static inline void gen_intermediate_code_internal(CPUState *env,
2942 636aa200 Blue Swirl
                                                  TranslationBlock *tb,
2943 636aa200 Blue Swirl
                                                  int search_pc)
2944 4c9649a9 j_mayer
{
2945 4c9649a9 j_mayer
    DisasContext ctx, *ctxp = &ctx;
2946 4c9649a9 j_mayer
    target_ulong pc_start;
2947 4c9649a9 j_mayer
    uint32_t insn;
2948 4c9649a9 j_mayer
    uint16_t *gen_opc_end;
2949 a1d1bb31 aliguori
    CPUBreakpoint *bp;
2950 4c9649a9 j_mayer
    int j, lj = -1;
2951 4c9649a9 j_mayer
    int ret;
2952 2e70f6ef pbrook
    int num_insns;
2953 2e70f6ef pbrook
    int max_insns;
2954 4c9649a9 j_mayer
2955 4c9649a9 j_mayer
    pc_start = tb->pc;
2956 4c9649a9 j_mayer
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
2957 4c9649a9 j_mayer
    ctx.pc = pc_start;
2958 4c9649a9 j_mayer
    ctx.amask = env->amask;
2959 8579095b aurel32
    ctx.env = env;
2960 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
2961 4c9649a9 j_mayer
    ctx.mem_idx = 0;
2962 4c9649a9 j_mayer
#else
2963 4c9649a9 j_mayer
    ctx.mem_idx = ((env->ps >> 3) & 3);
2964 4c9649a9 j_mayer
    ctx.pal_mode = env->ipr[IPR_EXC_ADDR] & 1;
2965 4c9649a9 j_mayer
#endif
2966 f24518b5 Richard Henderson
2967 f24518b5 Richard Henderson
    /* ??? Every TB begins with unset rounding mode, to be initialized on
2968 f24518b5 Richard Henderson
       the first fp insn of the TB.  Alternately we could define a proper
2969 f24518b5 Richard Henderson
       default for every TB (e.g. QUAL_RM_N or QUAL_RM_D) and make sure
2970 f24518b5 Richard Henderson
       to reset the FP_STATUS to that default at the end of any TB that
2971 f24518b5 Richard Henderson
       changes the default.  We could even (gasp) dynamiclly figure out
2972 f24518b5 Richard Henderson
       what default would be most efficient given the running program.  */
2973 f24518b5 Richard Henderson
    ctx.tb_rm = -1;
2974 f24518b5 Richard Henderson
    /* Similarly for flush-to-zero.  */
2975 f24518b5 Richard Henderson
    ctx.tb_ftz = -1;
2976 f24518b5 Richard Henderson
2977 2e70f6ef pbrook
    num_insns = 0;
2978 2e70f6ef pbrook
    max_insns = tb->cflags & CF_COUNT_MASK;
2979 2e70f6ef pbrook
    if (max_insns == 0)
2980 2e70f6ef pbrook
        max_insns = CF_COUNT_MASK;
2981 2e70f6ef pbrook
2982 2e70f6ef pbrook
    gen_icount_start();
2983 4c9649a9 j_mayer
    for (ret = 0; ret == 0;) {
2984 72cf2d4f Blue Swirl
        if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
2985 72cf2d4f Blue Swirl
            QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
2986 a1d1bb31 aliguori
                if (bp->pc == ctx.pc) {
2987 4c9649a9 j_mayer
                    gen_excp(&ctx, EXCP_DEBUG, 0);
2988 4c9649a9 j_mayer
                    break;
2989 4c9649a9 j_mayer
                }
2990 4c9649a9 j_mayer
            }
2991 4c9649a9 j_mayer
        }
2992 4c9649a9 j_mayer
        if (search_pc) {
2993 4c9649a9 j_mayer
            j = gen_opc_ptr - gen_opc_buf;
2994 4c9649a9 j_mayer
            if (lj < j) {
2995 4c9649a9 j_mayer
                lj++;
2996 4c9649a9 j_mayer
                while (lj < j)
2997 4c9649a9 j_mayer
                    gen_opc_instr_start[lj++] = 0;
2998 4c9649a9 j_mayer
            }
2999 ed1dda53 aurel32
            gen_opc_pc[lj] = ctx.pc;
3000 ed1dda53 aurel32
            gen_opc_instr_start[lj] = 1;
3001 ed1dda53 aurel32
            gen_opc_icount[lj] = num_insns;
3002 4c9649a9 j_mayer
        }
3003 2e70f6ef pbrook
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
3004 2e70f6ef pbrook
            gen_io_start();
3005 4c9649a9 j_mayer
        insn = ldl_code(ctx.pc);
3006 2e70f6ef pbrook
        num_insns++;
3007 c4b3be39 Richard Henderson
3008 c4b3be39 Richard Henderson
        if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP))) {
3009 c4b3be39 Richard Henderson
            tcg_gen_debug_insn_start(ctx.pc);
3010 c4b3be39 Richard Henderson
        }
3011 c4b3be39 Richard Henderson
3012 4c9649a9 j_mayer
        ctx.pc += 4;
3013 4c9649a9 j_mayer
        ret = translate_one(ctxp, insn);
3014 4c9649a9 j_mayer
        if (ret != 0)
3015 4c9649a9 j_mayer
            break;
3016 4c9649a9 j_mayer
        /* if we reach a page boundary or are single stepping, stop
3017 4c9649a9 j_mayer
         * generation
3018 4c9649a9 j_mayer
         */
3019 19bf517b aurel32
        if (env->singlestep_enabled) {
3020 19bf517b aurel32
            gen_excp(&ctx, EXCP_DEBUG, 0);
3021 19bf517b aurel32
            break;
3022 1b530a6d aurel32
        }
3023 19bf517b aurel32
3024 8fcc55f9 aurel32
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
3025 8fcc55f9 aurel32
            break;
3026 8fcc55f9 aurel32
3027 8fcc55f9 aurel32
        if (gen_opc_ptr >= gen_opc_end)
3028 8fcc55f9 aurel32
            break;
3029 8fcc55f9 aurel32
3030 8fcc55f9 aurel32
        if (num_insns >= max_insns)
3031 8fcc55f9 aurel32
            break;
3032 8fcc55f9 aurel32
3033 1b530a6d aurel32
        if (singlestep) {
3034 1b530a6d aurel32
            break;
3035 1b530a6d aurel32
        }
3036 4c9649a9 j_mayer
    }
3037 4c9649a9 j_mayer
    if (ret != 1 && ret != 3) {
3038 496cb5b9 aurel32
        tcg_gen_movi_i64(cpu_pc, ctx.pc);
3039 4c9649a9 j_mayer
    }
3040 2e70f6ef pbrook
    if (tb->cflags & CF_LAST_IO)
3041 2e70f6ef pbrook
        gen_io_end();
3042 4c9649a9 j_mayer
    /* Generate the return instruction */
3043 57fec1fe bellard
    tcg_gen_exit_tb(0);
3044 2e70f6ef pbrook
    gen_icount_end(tb, num_insns);
3045 4c9649a9 j_mayer
    *gen_opc_ptr = INDEX_op_end;
3046 4c9649a9 j_mayer
    if (search_pc) {
3047 4c9649a9 j_mayer
        j = gen_opc_ptr - gen_opc_buf;
3048 4c9649a9 j_mayer
        lj++;
3049 4c9649a9 j_mayer
        while (lj <= j)
3050 4c9649a9 j_mayer
            gen_opc_instr_start[lj++] = 0;
3051 4c9649a9 j_mayer
    } else {
3052 4c9649a9 j_mayer
        tb->size = ctx.pc - pc_start;
3053 2e70f6ef pbrook
        tb->icount = num_insns;
3054 4c9649a9 j_mayer
    }
3055 806991da Richard Henderson
#ifdef DEBUG_DISAS
3056 8fec2b8c aliguori
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
3057 93fcfe39 aliguori
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
3058 93fcfe39 aliguori
        log_target_disas(pc_start, ctx.pc - pc_start, 1);
3059 93fcfe39 aliguori
        qemu_log("\n");
3060 4c9649a9 j_mayer
    }
3061 4c9649a9 j_mayer
#endif
3062 4c9649a9 j_mayer
}
3063 4c9649a9 j_mayer
3064 2cfc5f17 ths
void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
3065 4c9649a9 j_mayer
{
3066 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 0);
3067 4c9649a9 j_mayer
}
3068 4c9649a9 j_mayer
3069 2cfc5f17 ths
void gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
3070 4c9649a9 j_mayer
{
3071 2cfc5f17 ths
    gen_intermediate_code_internal(env, tb, 1);
3072 4c9649a9 j_mayer
}
3073 4c9649a9 j_mayer
3074 a964acc6 Richard Henderson
struct cpu_def_t {
3075 a964acc6 Richard Henderson
    const char *name;
3076 a964acc6 Richard Henderson
    int implver, amask;
3077 a964acc6 Richard Henderson
};
3078 a964acc6 Richard Henderson
3079 a964acc6 Richard Henderson
static const struct cpu_def_t cpu_defs[] = {
3080 a964acc6 Richard Henderson
    { "ev4",   IMPLVER_2106x, 0 },
3081 a964acc6 Richard Henderson
    { "ev5",   IMPLVER_21164, 0 },
3082 a964acc6 Richard Henderson
    { "ev56",  IMPLVER_21164, AMASK_BWX },
3083 a964acc6 Richard Henderson
    { "pca56", IMPLVER_21164, AMASK_BWX | AMASK_MVI },
3084 a964acc6 Richard Henderson
    { "ev6",   IMPLVER_21264, AMASK_BWX | AMASK_FIX | AMASK_MVI | AMASK_TRAP },
3085 a964acc6 Richard Henderson
    { "ev67",  IMPLVER_21264, (AMASK_BWX | AMASK_FIX | AMASK_CIX
3086 a964acc6 Richard Henderson
                               | AMASK_MVI | AMASK_TRAP | AMASK_PREFETCH), },
3087 a964acc6 Richard Henderson
    { "ev68",  IMPLVER_21264, (AMASK_BWX | AMASK_FIX | AMASK_CIX
3088 a964acc6 Richard Henderson
                               | AMASK_MVI | AMASK_TRAP | AMASK_PREFETCH), },
3089 a964acc6 Richard Henderson
    { "21064", IMPLVER_2106x, 0 },
3090 a964acc6 Richard Henderson
    { "21164", IMPLVER_21164, 0 },
3091 a964acc6 Richard Henderson
    { "21164a", IMPLVER_21164, AMASK_BWX },
3092 a964acc6 Richard Henderson
    { "21164pc", IMPLVER_21164, AMASK_BWX | AMASK_MVI },
3093 a964acc6 Richard Henderson
    { "21264", IMPLVER_21264, AMASK_BWX | AMASK_FIX | AMASK_MVI | AMASK_TRAP },
3094 a964acc6 Richard Henderson
    { "21264a", IMPLVER_21264, (AMASK_BWX | AMASK_FIX | AMASK_CIX
3095 a964acc6 Richard Henderson
                                | AMASK_MVI | AMASK_TRAP | AMASK_PREFETCH), }
3096 a964acc6 Richard Henderson
};
3097 a964acc6 Richard Henderson
3098 aaed909a bellard
CPUAlphaState * cpu_alpha_init (const char *cpu_model)
3099 4c9649a9 j_mayer
{
3100 4c9649a9 j_mayer
    CPUAlphaState *env;
3101 a964acc6 Richard Henderson
    int implver, amask, i, max;
3102 4c9649a9 j_mayer
3103 4c9649a9 j_mayer
    env = qemu_mallocz(sizeof(CPUAlphaState));
3104 4c9649a9 j_mayer
    cpu_exec_init(env);
3105 2e70f6ef pbrook
    alpha_translate_init();
3106 4c9649a9 j_mayer
    tlb_flush(env, 1);
3107 a964acc6 Richard Henderson
3108 a964acc6 Richard Henderson
    /* Default to ev67; no reason not to emulate insns by default.  */
3109 a964acc6 Richard Henderson
    implver = IMPLVER_21264;
3110 a964acc6 Richard Henderson
    amask = (AMASK_BWX | AMASK_FIX | AMASK_CIX | AMASK_MVI
3111 a964acc6 Richard Henderson
             | AMASK_TRAP | AMASK_PREFETCH);
3112 a964acc6 Richard Henderson
3113 a964acc6 Richard Henderson
    max = ARRAY_SIZE(cpu_defs);
3114 a964acc6 Richard Henderson
    for (i = 0; i < max; i++) {
3115 a964acc6 Richard Henderson
        if (strcmp (cpu_model, cpu_defs[i].name) == 0) {
3116 a964acc6 Richard Henderson
            implver = cpu_defs[i].implver;
3117 a964acc6 Richard Henderson
            amask = cpu_defs[i].amask;
3118 a964acc6 Richard Henderson
            break;
3119 a964acc6 Richard Henderson
        }
3120 a964acc6 Richard Henderson
    }
3121 a964acc6 Richard Henderson
    env->implver = implver;
3122 a964acc6 Richard Henderson
    env->amask = amask;
3123 a964acc6 Richard Henderson
3124 4c9649a9 j_mayer
    env->ps = 0x1F00;
3125 4c9649a9 j_mayer
#if defined (CONFIG_USER_ONLY)
3126 4c9649a9 j_mayer
    env->ps |= 1 << 3;
3127 2edd07ef Richard Henderson
    cpu_alpha_store_fpcr(env, (FPCR_INVD | FPCR_DZED | FPCR_OVFD
3128 2edd07ef Richard Henderson
                               | FPCR_UNFD | FPCR_INED | FPCR_DNOD));
3129 6049f4f8 Richard Henderson
#else
3130 4c9649a9 j_mayer
    pal_init(env);
3131 6049f4f8 Richard Henderson
#endif
3132 dad081ee Richard Henderson
3133 4c9649a9 j_mayer
    /* Initialize IPR */
3134 dad081ee Richard Henderson
#if defined (CONFIG_USER_ONLY)
3135 dad081ee Richard Henderson
    env->ipr[IPR_EXC_ADDR] = 0;
3136 dad081ee Richard Henderson
    env->ipr[IPR_EXC_SUM] = 0;
3137 dad081ee Richard Henderson
    env->ipr[IPR_EXC_MASK] = 0;
3138 dad081ee Richard Henderson
#else
3139 dad081ee Richard Henderson
    {
3140 f88fe4e3 Blue Swirl
        // uint64_t hwpcb;
3141 f88fe4e3 Blue Swirl
        // hwpcb = env->ipr[IPR_PCBB];
3142 dad081ee Richard Henderson
        env->ipr[IPR_ASN] = 0;
3143 dad081ee Richard Henderson
        env->ipr[IPR_ASTEN] = 0;
3144 dad081ee Richard Henderson
        env->ipr[IPR_ASTSR] = 0;
3145 dad081ee Richard Henderson
        env->ipr[IPR_DATFX] = 0;
3146 dad081ee Richard Henderson
        /* XXX: fix this */
3147 dad081ee Richard Henderson
        //    env->ipr[IPR_ESP] = ldq_raw(hwpcb + 8);
3148 dad081ee Richard Henderson
        //    env->ipr[IPR_KSP] = ldq_raw(hwpcb + 0);
3149 dad081ee Richard Henderson
        //    env->ipr[IPR_SSP] = ldq_raw(hwpcb + 16);
3150 dad081ee Richard Henderson
        //    env->ipr[IPR_USP] = ldq_raw(hwpcb + 24);
3151 dad081ee Richard Henderson
        env->ipr[IPR_FEN] = 0;
3152 dad081ee Richard Henderson
        env->ipr[IPR_IPL] = 31;
3153 dad081ee Richard Henderson
        env->ipr[IPR_MCES] = 0;
3154 dad081ee Richard Henderson
        env->ipr[IPR_PERFMON] = 0; /* Implementation specific */
3155 dad081ee Richard Henderson
        //    env->ipr[IPR_PTBR] = ldq_raw(hwpcb + 32);
3156 dad081ee Richard Henderson
        env->ipr[IPR_SISR] = 0;
3157 dad081ee Richard Henderson
        env->ipr[IPR_VIRBND] = -1ULL;
3158 dad081ee Richard Henderson
    }
3159 dad081ee Richard Henderson
#endif
3160 4c9649a9 j_mayer
3161 0bf46a40 aliguori
    qemu_init_vcpu(env);
3162 4c9649a9 j_mayer
    return env;
3163 4c9649a9 j_mayer
}
3164 aaed909a bellard
3165 d2856f1a aurel32
void gen_pc_load(CPUState *env, TranslationBlock *tb,
3166 d2856f1a aurel32
                unsigned long searched_pc, int pc_pos, void *puc)
3167 d2856f1a aurel32
{
3168 d2856f1a aurel32
    env->pc = gen_opc_pc[pc_pos];
3169 d2856f1a aurel32
}