Statistics
| Branch: | Revision:

root / target-alpha / translate.c @ 6f06f178

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