cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

translate.c (88882B)


      1/*
      2 *  Alpha emulation cpu translation for qemu.
      3 *
      4 *  Copyright (c) 2007 Jocelyn Mayer
      5 *
      6 * This library is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * This library is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
     18 */
     19
     20#include "qemu/osdep.h"
     21#include "cpu.h"
     22#include "sysemu/cpus.h"
     23#include "sysemu/cpu-timers.h"
     24#include "disas/disas.h"
     25#include "qemu/host-utils.h"
     26#include "exec/exec-all.h"
     27#include "tcg/tcg-op.h"
     28#include "exec/cpu_ldst.h"
     29#include "exec/helper-proto.h"
     30#include "exec/helper-gen.h"
     31#include "exec/translator.h"
     32#include "exec/log.h"
     33
     34
     35#undef ALPHA_DEBUG_DISAS
     36#define CONFIG_SOFTFLOAT_INLINE
     37
     38#ifdef ALPHA_DEBUG_DISAS
     39#  define LOG_DISAS(...) qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__)
     40#else
     41#  define LOG_DISAS(...) do { } while (0)
     42#endif
     43
     44typedef struct DisasContext DisasContext;
     45struct DisasContext {
     46    DisasContextBase base;
     47
     48#ifndef CONFIG_USER_ONLY
     49    uint64_t palbr;
     50#endif
     51    uint32_t tbflags;
     52    int mem_idx;
     53
     54    /* implver and amask values for this CPU.  */
     55    int implver;
     56    int amask;
     57
     58    /* Current rounding mode for this TB.  */
     59    int tb_rm;
     60    /* Current flush-to-zero setting for this TB.  */
     61    int tb_ftz;
     62
     63    /* The set of registers active in the current context.  */
     64    TCGv *ir;
     65
     66    /* Temporaries for $31 and $f31 as source and destination.  */
     67    TCGv zero;
     68    TCGv sink;
     69};
     70
     71/* Target-specific return values from translate_one, indicating the
     72   state of the TB.  Note that DISAS_NEXT indicates that we are not
     73   exiting the TB.  */
     74#define DISAS_PC_UPDATED_NOCHAIN  DISAS_TARGET_0
     75#define DISAS_PC_UPDATED          DISAS_TARGET_1
     76#define DISAS_PC_STALE            DISAS_TARGET_2
     77
     78/* global register indexes */
     79static TCGv cpu_std_ir[31];
     80static TCGv cpu_fir[31];
     81static TCGv cpu_pc;
     82static TCGv cpu_lock_addr;
     83static TCGv cpu_lock_value;
     84
     85#ifndef CONFIG_USER_ONLY
     86static TCGv cpu_pal_ir[31];
     87#endif
     88
     89#include "exec/gen-icount.h"
     90
     91void alpha_translate_init(void)
     92{
     93#define DEF_VAR(V)  { &cpu_##V, #V, offsetof(CPUAlphaState, V) }
     94
     95    typedef struct { TCGv *var; const char *name; int ofs; } GlobalVar;
     96    static const GlobalVar vars[] = {
     97        DEF_VAR(pc),
     98        DEF_VAR(lock_addr),
     99        DEF_VAR(lock_value),
    100    };
    101
    102#undef DEF_VAR
    103
    104    /* Use the symbolic register names that match the disassembler.  */
    105    static const char greg_names[31][4] = {
    106        "v0", "t0", "t1", "t2", "t3", "t4", "t5", "t6",
    107        "t7", "s0", "s1", "s2", "s3", "s4", "s5", "fp",
    108        "a0", "a1", "a2", "a3", "a4", "a5", "t8", "t9",
    109        "t10", "t11", "ra", "t12", "at", "gp", "sp"
    110    };
    111    static const char freg_names[31][4] = {
    112        "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
    113        "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
    114        "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
    115        "f24", "f25", "f26", "f27", "f28", "f29", "f30"
    116    };
    117#ifndef CONFIG_USER_ONLY
    118    static const char shadow_names[8][8] = {
    119        "pal_t7", "pal_s0", "pal_s1", "pal_s2",
    120        "pal_s3", "pal_s4", "pal_s5", "pal_t11"
    121    };
    122#endif
    123
    124    int i;
    125
    126    for (i = 0; i < 31; i++) {
    127        cpu_std_ir[i] = tcg_global_mem_new_i64(cpu_env,
    128                                               offsetof(CPUAlphaState, ir[i]),
    129                                               greg_names[i]);
    130    }
    131
    132    for (i = 0; i < 31; i++) {
    133        cpu_fir[i] = tcg_global_mem_new_i64(cpu_env,
    134                                            offsetof(CPUAlphaState, fir[i]),
    135                                            freg_names[i]);
    136    }
    137
    138#ifndef CONFIG_USER_ONLY
    139    memcpy(cpu_pal_ir, cpu_std_ir, sizeof(cpu_pal_ir));
    140    for (i = 0; i < 8; i++) {
    141        int r = (i == 7 ? 25 : i + 8);
    142        cpu_pal_ir[r] = tcg_global_mem_new_i64(cpu_env,
    143                                               offsetof(CPUAlphaState,
    144                                                        shadow[i]),
    145                                               shadow_names[i]);
    146    }
    147#endif
    148
    149    for (i = 0; i < ARRAY_SIZE(vars); ++i) {
    150        const GlobalVar *v = &vars[i];
    151        *v->var = tcg_global_mem_new_i64(cpu_env, v->ofs, v->name);
    152    }
    153}
    154
    155static TCGv load_zero(DisasContext *ctx)
    156{
    157    if (!ctx->zero) {
    158        ctx->zero = tcg_constant_i64(0);
    159    }
    160    return ctx->zero;
    161}
    162
    163static TCGv dest_sink(DisasContext *ctx)
    164{
    165    if (!ctx->sink) {
    166        ctx->sink = tcg_temp_new();
    167    }
    168    return ctx->sink;
    169}
    170
    171static void free_context_temps(DisasContext *ctx)
    172{
    173    if (ctx->sink) {
    174        tcg_gen_discard_i64(ctx->sink);
    175        tcg_temp_free(ctx->sink);
    176        ctx->sink = NULL;
    177    }
    178}
    179
    180static TCGv load_gpr(DisasContext *ctx, unsigned reg)
    181{
    182    if (likely(reg < 31)) {
    183        return ctx->ir[reg];
    184    } else {
    185        return load_zero(ctx);
    186    }
    187}
    188
    189static TCGv load_gpr_lit(DisasContext *ctx, unsigned reg,
    190                         uint8_t lit, bool islit)
    191{
    192    if (islit) {
    193        return tcg_constant_i64(lit);
    194    } else if (likely(reg < 31)) {
    195        return ctx->ir[reg];
    196    } else {
    197        return load_zero(ctx);
    198    }
    199}
    200
    201static TCGv dest_gpr(DisasContext *ctx, unsigned reg)
    202{
    203    if (likely(reg < 31)) {
    204        return ctx->ir[reg];
    205    } else {
    206        return dest_sink(ctx);
    207    }
    208}
    209
    210static TCGv load_fpr(DisasContext *ctx, unsigned reg)
    211{
    212    if (likely(reg < 31)) {
    213        return cpu_fir[reg];
    214    } else {
    215        return load_zero(ctx);
    216    }
    217}
    218
    219static TCGv dest_fpr(DisasContext *ctx, unsigned reg)
    220{
    221    if (likely(reg < 31)) {
    222        return cpu_fir[reg];
    223    } else {
    224        return dest_sink(ctx);
    225    }
    226}
    227
    228static int get_flag_ofs(unsigned shift)
    229{
    230    int ofs = offsetof(CPUAlphaState, flags);
    231#ifdef HOST_WORDS_BIGENDIAN
    232    ofs += 3 - (shift / 8);
    233#else
    234    ofs += shift / 8;
    235#endif
    236    return ofs;
    237}
    238
    239static void ld_flag_byte(TCGv val, unsigned shift)
    240{
    241    tcg_gen_ld8u_i64(val, cpu_env, get_flag_ofs(shift));
    242}
    243
    244static void st_flag_byte(TCGv val, unsigned shift)
    245{
    246    tcg_gen_st8_i64(val, cpu_env, get_flag_ofs(shift));
    247}
    248
    249static void gen_excp_1(int exception, int error_code)
    250{
    251    TCGv_i32 tmp1, tmp2;
    252
    253    tmp1 = tcg_constant_i32(exception);
    254    tmp2 = tcg_constant_i32(error_code);
    255    gen_helper_excp(cpu_env, tmp1, tmp2);
    256}
    257
    258static DisasJumpType gen_excp(DisasContext *ctx, int exception, int error_code)
    259{
    260    tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
    261    gen_excp_1(exception, error_code);
    262    return DISAS_NORETURN;
    263}
    264
    265static inline DisasJumpType gen_invalid(DisasContext *ctx)
    266{
    267    return gen_excp(ctx, EXCP_OPCDEC, 0);
    268}
    269
    270static inline void gen_qemu_ldf(TCGv t0, TCGv t1, int flags)
    271{
    272    TCGv_i32 tmp32 = tcg_temp_new_i32();
    273    tcg_gen_qemu_ld_i32(tmp32, t1, flags, MO_LEUL);
    274    gen_helper_memory_to_f(t0, tmp32);
    275    tcg_temp_free_i32(tmp32);
    276}
    277
    278static inline void gen_qemu_ldg(TCGv t0, TCGv t1, int flags)
    279{
    280    TCGv tmp = tcg_temp_new();
    281    tcg_gen_qemu_ld_i64(tmp, t1, flags, MO_LEQ);
    282    gen_helper_memory_to_g(t0, tmp);
    283    tcg_temp_free(tmp);
    284}
    285
    286static inline void gen_qemu_lds(TCGv t0, TCGv t1, int flags)
    287{
    288    TCGv_i32 tmp32 = tcg_temp_new_i32();
    289    tcg_gen_qemu_ld_i32(tmp32, t1, flags, MO_LEUL);
    290    gen_helper_memory_to_s(t0, tmp32);
    291    tcg_temp_free_i32(tmp32);
    292}
    293
    294static inline void gen_qemu_ldl_l(TCGv t0, TCGv t1, int flags)
    295{
    296    tcg_gen_qemu_ld_i64(t0, t1, flags, MO_LESL);
    297    tcg_gen_mov_i64(cpu_lock_addr, t1);
    298    tcg_gen_mov_i64(cpu_lock_value, t0);
    299}
    300
    301static inline void gen_qemu_ldq_l(TCGv t0, TCGv t1, int flags)
    302{
    303    tcg_gen_qemu_ld_i64(t0, t1, flags, MO_LEQ);
    304    tcg_gen_mov_i64(cpu_lock_addr, t1);
    305    tcg_gen_mov_i64(cpu_lock_value, t0);
    306}
    307
    308static inline void gen_load_mem(DisasContext *ctx,
    309                                void (*tcg_gen_qemu_load)(TCGv t0, TCGv t1,
    310                                                          int flags),
    311                                int ra, int rb, int32_t disp16, bool fp,
    312                                bool clear)
    313{
    314    TCGv tmp, addr, va;
    315
    316    /* LDQ_U with ra $31 is UNOP.  Other various loads are forms of
    317       prefetches, which we can treat as nops.  No worries about
    318       missed exceptions here.  */
    319    if (unlikely(ra == 31)) {
    320        return;
    321    }
    322
    323    tmp = tcg_temp_new();
    324    addr = load_gpr(ctx, rb);
    325
    326    if (disp16) {
    327        tcg_gen_addi_i64(tmp, addr, disp16);
    328        addr = tmp;
    329    }
    330    if (clear) {
    331        tcg_gen_andi_i64(tmp, addr, ~0x7);
    332        addr = tmp;
    333    }
    334
    335    va = (fp ? cpu_fir[ra] : ctx->ir[ra]);
    336    tcg_gen_qemu_load(va, addr, ctx->mem_idx);
    337
    338    tcg_temp_free(tmp);
    339}
    340
    341static inline void gen_qemu_stf(TCGv t0, TCGv t1, int flags)
    342{
    343    TCGv_i32 tmp32 = tcg_temp_new_i32();
    344    gen_helper_f_to_memory(tmp32, t0);
    345    tcg_gen_qemu_st_i32(tmp32, t1, flags, MO_LEUL);
    346    tcg_temp_free_i32(tmp32);
    347}
    348
    349static inline void gen_qemu_stg(TCGv t0, TCGv t1, int flags)
    350{
    351    TCGv tmp = tcg_temp_new();
    352    gen_helper_g_to_memory(tmp, t0);
    353    tcg_gen_qemu_st_i64(tmp, t1, flags, MO_LEQ);
    354    tcg_temp_free(tmp);
    355}
    356
    357static inline void gen_qemu_sts(TCGv t0, TCGv t1, int flags)
    358{
    359    TCGv_i32 tmp32 = tcg_temp_new_i32();
    360    gen_helper_s_to_memory(tmp32, t0);
    361    tcg_gen_qemu_st_i32(tmp32, t1, flags, MO_LEUL);
    362    tcg_temp_free_i32(tmp32);
    363}
    364
    365static inline void gen_store_mem(DisasContext *ctx,
    366                                 void (*tcg_gen_qemu_store)(TCGv t0, TCGv t1,
    367                                                            int flags),
    368                                 int ra, int rb, int32_t disp16, bool fp,
    369                                 bool clear)
    370{
    371    TCGv tmp, addr, va;
    372
    373    tmp = tcg_temp_new();
    374    addr = load_gpr(ctx, rb);
    375
    376    if (disp16) {
    377        tcg_gen_addi_i64(tmp, addr, disp16);
    378        addr = tmp;
    379    }
    380    if (clear) {
    381        tcg_gen_andi_i64(tmp, addr, ~0x7);
    382        addr = tmp;
    383    }
    384
    385    va = (fp ? load_fpr(ctx, ra) : load_gpr(ctx, ra));
    386    tcg_gen_qemu_store(va, addr, ctx->mem_idx);
    387
    388    tcg_temp_free(tmp);
    389}
    390
    391static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb,
    392                                           int32_t disp16, int mem_idx,
    393                                           MemOp op)
    394{
    395    TCGLabel *lab_fail, *lab_done;
    396    TCGv addr, val;
    397
    398    addr = tcg_temp_new_i64();
    399    tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16);
    400    free_context_temps(ctx);
    401
    402    lab_fail = gen_new_label();
    403    lab_done = gen_new_label();
    404    tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_lock_addr, lab_fail);
    405    tcg_temp_free_i64(addr);
    406
    407    val = tcg_temp_new_i64();
    408    tcg_gen_atomic_cmpxchg_i64(val, cpu_lock_addr, cpu_lock_value,
    409                               load_gpr(ctx, ra), mem_idx, op);
    410    free_context_temps(ctx);
    411
    412    if (ra != 31) {
    413        tcg_gen_setcond_i64(TCG_COND_EQ, ctx->ir[ra], val, cpu_lock_value);
    414    }
    415    tcg_temp_free_i64(val);
    416    tcg_gen_br(lab_done);
    417
    418    gen_set_label(lab_fail);
    419    if (ra != 31) {
    420        tcg_gen_movi_i64(ctx->ir[ra], 0);
    421    }
    422
    423    gen_set_label(lab_done);
    424    tcg_gen_movi_i64(cpu_lock_addr, -1);
    425    return DISAS_NEXT;
    426}
    427
    428static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
    429{
    430    return translator_use_goto_tb(&ctx->base, dest);
    431}
    432
    433static DisasJumpType gen_bdirect(DisasContext *ctx, int ra, int32_t disp)
    434{
    435    uint64_t dest = ctx->base.pc_next + (disp << 2);
    436
    437    if (ra != 31) {
    438        tcg_gen_movi_i64(ctx->ir[ra], ctx->base.pc_next);
    439    }
    440
    441    /* Notice branch-to-next; used to initialize RA with the PC.  */
    442    if (disp == 0) {
    443        return 0;
    444    } else if (use_goto_tb(ctx, dest)) {
    445        tcg_gen_goto_tb(0);
    446        tcg_gen_movi_i64(cpu_pc, dest);
    447        tcg_gen_exit_tb(ctx->base.tb, 0);
    448        return DISAS_NORETURN;
    449    } else {
    450        tcg_gen_movi_i64(cpu_pc, dest);
    451        return DISAS_PC_UPDATED;
    452    }
    453}
    454
    455static DisasJumpType gen_bcond_internal(DisasContext *ctx, TCGCond cond,
    456                                        TCGv cmp, int32_t disp)
    457{
    458    uint64_t dest = ctx->base.pc_next + (disp << 2);
    459    TCGLabel *lab_true = gen_new_label();
    460
    461    if (use_goto_tb(ctx, dest)) {
    462        tcg_gen_brcondi_i64(cond, cmp, 0, lab_true);
    463
    464        tcg_gen_goto_tb(0);
    465        tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
    466        tcg_gen_exit_tb(ctx->base.tb, 0);
    467
    468        gen_set_label(lab_true);
    469        tcg_gen_goto_tb(1);
    470        tcg_gen_movi_i64(cpu_pc, dest);
    471        tcg_gen_exit_tb(ctx->base.tb, 1);
    472
    473        return DISAS_NORETURN;
    474    } else {
    475        TCGv_i64 z = load_zero(ctx);
    476        TCGv_i64 d = tcg_constant_i64(dest);
    477        TCGv_i64 p = tcg_constant_i64(ctx->base.pc_next);
    478
    479        tcg_gen_movcond_i64(cond, cpu_pc, cmp, z, d, p);
    480        return DISAS_PC_UPDATED;
    481    }
    482}
    483
    484static DisasJumpType gen_bcond(DisasContext *ctx, TCGCond cond, int ra,
    485                               int32_t disp, int mask)
    486{
    487    if (mask) {
    488        TCGv tmp = tcg_temp_new();
    489        DisasJumpType ret;
    490
    491        tcg_gen_andi_i64(tmp, load_gpr(ctx, ra), 1);
    492        ret = gen_bcond_internal(ctx, cond, tmp, disp);
    493        tcg_temp_free(tmp);
    494        return ret;
    495    }
    496    return gen_bcond_internal(ctx, cond, load_gpr(ctx, ra), disp);
    497}
    498
    499/* Fold -0.0 for comparison with COND.  */
    500
    501static void gen_fold_mzero(TCGCond cond, TCGv dest, TCGv src)
    502{
    503    uint64_t mzero = 1ull << 63;
    504
    505    switch (cond) {
    506    case TCG_COND_LE:
    507    case TCG_COND_GT:
    508        /* For <= or >, the -0.0 value directly compares the way we want.  */
    509        tcg_gen_mov_i64(dest, src);
    510        break;
    511
    512    case TCG_COND_EQ:
    513    case TCG_COND_NE:
    514        /* For == or !=, we can simply mask off the sign bit and compare.  */
    515        tcg_gen_andi_i64(dest, src, mzero - 1);
    516        break;
    517
    518    case TCG_COND_GE:
    519    case TCG_COND_LT:
    520        /* For >= or <, map -0.0 to +0.0 via comparison and mask.  */
    521        tcg_gen_setcondi_i64(TCG_COND_NE, dest, src, mzero);
    522        tcg_gen_neg_i64(dest, dest);
    523        tcg_gen_and_i64(dest, dest, src);
    524        break;
    525
    526    default:
    527        abort();
    528    }
    529}
    530
    531static DisasJumpType gen_fbcond(DisasContext *ctx, TCGCond cond, int ra,
    532                                int32_t disp)
    533{
    534    TCGv cmp_tmp = tcg_temp_new();
    535    DisasJumpType ret;
    536
    537    gen_fold_mzero(cond, cmp_tmp, load_fpr(ctx, ra));
    538    ret = gen_bcond_internal(ctx, cond, cmp_tmp, disp);
    539    tcg_temp_free(cmp_tmp);
    540    return ret;
    541}
    542
    543static void gen_fcmov(DisasContext *ctx, TCGCond cond, int ra, int rb, int rc)
    544{
    545    TCGv_i64 va, vb, z;
    546
    547    z = load_zero(ctx);
    548    vb = load_fpr(ctx, rb);
    549    va = tcg_temp_new();
    550    gen_fold_mzero(cond, va, load_fpr(ctx, ra));
    551
    552    tcg_gen_movcond_i64(cond, dest_fpr(ctx, rc), va, z, vb, load_fpr(ctx, rc));
    553
    554    tcg_temp_free(va);
    555}
    556
    557#define QUAL_RM_N       0x080   /* Round mode nearest even */
    558#define QUAL_RM_C       0x000   /* Round mode chopped */
    559#define QUAL_RM_M       0x040   /* Round mode minus infinity */
    560#define QUAL_RM_D       0x0c0   /* Round mode dynamic */
    561#define QUAL_RM_MASK    0x0c0
    562
    563#define QUAL_U          0x100   /* Underflow enable (fp output) */
    564#define QUAL_V          0x100   /* Overflow enable (int output) */
    565#define QUAL_S          0x400   /* Software completion enable */
    566#define QUAL_I          0x200   /* Inexact detection enable */
    567
    568static void gen_qual_roundmode(DisasContext *ctx, int fn11)
    569{
    570    TCGv_i32 tmp;
    571
    572    fn11 &= QUAL_RM_MASK;
    573    if (fn11 == ctx->tb_rm) {
    574        return;
    575    }
    576    ctx->tb_rm = fn11;
    577
    578    tmp = tcg_temp_new_i32();
    579    switch (fn11) {
    580    case QUAL_RM_N:
    581        tcg_gen_movi_i32(tmp, float_round_nearest_even);
    582        break;
    583    case QUAL_RM_C:
    584        tcg_gen_movi_i32(tmp, float_round_to_zero);
    585        break;
    586    case QUAL_RM_M:
    587        tcg_gen_movi_i32(tmp, float_round_down);
    588        break;
    589    case QUAL_RM_D:
    590        tcg_gen_ld8u_i32(tmp, cpu_env,
    591                         offsetof(CPUAlphaState, fpcr_dyn_round));
    592        break;
    593    }
    594
    595#if defined(CONFIG_SOFTFLOAT_INLINE)
    596    /* ??? The "fpu/softfloat.h" interface is to call set_float_rounding_mode.
    597       With CONFIG_SOFTFLOAT that expands to an out-of-line call that just
    598       sets the one field.  */
    599    tcg_gen_st8_i32(tmp, cpu_env,
    600                    offsetof(CPUAlphaState, fp_status.float_rounding_mode));
    601#else
    602    gen_helper_setroundmode(tmp);
    603#endif
    604
    605    tcg_temp_free_i32(tmp);
    606}
    607
    608static void gen_qual_flushzero(DisasContext *ctx, int fn11)
    609{
    610    TCGv_i32 tmp;
    611
    612    fn11 &= QUAL_U;
    613    if (fn11 == ctx->tb_ftz) {
    614        return;
    615    }
    616    ctx->tb_ftz = fn11;
    617
    618    tmp = tcg_temp_new_i32();
    619    if (fn11) {
    620        /* Underflow is enabled, use the FPCR setting.  */
    621        tcg_gen_ld8u_i32(tmp, cpu_env,
    622                         offsetof(CPUAlphaState, fpcr_flush_to_zero));
    623    } else {
    624        /* Underflow is disabled, force flush-to-zero.  */
    625        tcg_gen_movi_i32(tmp, 1);
    626    }
    627
    628#if defined(CONFIG_SOFTFLOAT_INLINE)
    629    tcg_gen_st8_i32(tmp, cpu_env,
    630                    offsetof(CPUAlphaState, fp_status.flush_to_zero));
    631#else
    632    gen_helper_setflushzero(tmp);
    633#endif
    634
    635    tcg_temp_free_i32(tmp);
    636}
    637
    638static TCGv gen_ieee_input(DisasContext *ctx, int reg, int fn11, int is_cmp)
    639{
    640    TCGv val;
    641
    642    if (unlikely(reg == 31)) {
    643        val = load_zero(ctx);
    644    } else {
    645        val = cpu_fir[reg];
    646        if ((fn11 & QUAL_S) == 0) {
    647            if (is_cmp) {
    648                gen_helper_ieee_input_cmp(cpu_env, val);
    649            } else {
    650                gen_helper_ieee_input(cpu_env, val);
    651            }
    652        } else {
    653#ifndef CONFIG_USER_ONLY
    654            /* In system mode, raise exceptions for denormals like real
    655               hardware.  In user mode, proceed as if the OS completion
    656               handler is handling the denormal as per spec.  */
    657            gen_helper_ieee_input_s(cpu_env, val);
    658#endif
    659        }
    660    }
    661    return val;
    662}
    663
    664static void gen_fp_exc_raise(int rc, int fn11)
    665{
    666    /* ??? We ought to be able to do something with imprecise exceptions.
    667       E.g. notice we're still in the trap shadow of something within the
    668       TB and do not generate the code to signal the exception; end the TB
    669       when an exception is forced to arrive, either by consumption of a
    670       register value or TRAPB or EXCB.  */
    671    TCGv_i32 reg, ign;
    672    uint32_t ignore = 0;
    673
    674    if (!(fn11 & QUAL_U)) {
    675        /* Note that QUAL_U == QUAL_V, so ignore either.  */
    676        ignore |= FPCR_UNF | FPCR_IOV;
    677    }
    678    if (!(fn11 & QUAL_I)) {
    679        ignore |= FPCR_INE;
    680    }
    681    ign = tcg_constant_i32(ignore);
    682
    683    /* ??? Pass in the regno of the destination so that the helper can
    684       set EXC_MASK, which contains a bitmask of destination registers
    685       that have caused arithmetic traps.  A simple userspace emulation
    686       does not require this.  We do need it for a guest kernel's entArith,
    687       or if we were to do something clever with imprecise exceptions.  */
    688    reg = tcg_constant_i32(rc + 32);
    689    if (fn11 & QUAL_S) {
    690        gen_helper_fp_exc_raise_s(cpu_env, ign, reg);
    691    } else {
    692        gen_helper_fp_exc_raise(cpu_env, ign, reg);
    693    }
    694}
    695
    696static void gen_cvtlq(TCGv vc, TCGv vb)
    697{
    698    TCGv tmp = tcg_temp_new();
    699
    700    /* The arithmetic right shift here, plus the sign-extended mask below
    701       yields a sign-extended result without an explicit ext32s_i64.  */
    702    tcg_gen_shri_i64(tmp, vb, 29);
    703    tcg_gen_sari_i64(vc, vb, 32);
    704    tcg_gen_deposit_i64(vc, vc, tmp, 0, 30);
    705
    706    tcg_temp_free(tmp);
    707}
    708
    709static void gen_ieee_arith2(DisasContext *ctx,
    710                            void (*helper)(TCGv, TCGv_ptr, TCGv),
    711                            int rb, int rc, int fn11)
    712{
    713    TCGv vb;
    714
    715    gen_qual_roundmode(ctx, fn11);
    716    gen_qual_flushzero(ctx, fn11);
    717
    718    vb = gen_ieee_input(ctx, rb, fn11, 0);
    719    helper(dest_fpr(ctx, rc), cpu_env, vb);
    720
    721    gen_fp_exc_raise(rc, fn11);
    722}
    723
    724#define IEEE_ARITH2(name)                                       \
    725static inline void glue(gen_, name)(DisasContext *ctx,          \
    726                                    int rb, int rc, int fn11)   \
    727{                                                               \
    728    gen_ieee_arith2(ctx, gen_helper_##name, rb, rc, fn11);      \
    729}
    730IEEE_ARITH2(sqrts)
    731IEEE_ARITH2(sqrtt)
    732IEEE_ARITH2(cvtst)
    733IEEE_ARITH2(cvtts)
    734
    735static void gen_cvttq(DisasContext *ctx, int rb, int rc, int fn11)
    736{
    737    TCGv vb, vc;
    738
    739    /* No need to set flushzero, since we have an integer output.  */
    740    vb = gen_ieee_input(ctx, rb, fn11, 0);
    741    vc = dest_fpr(ctx, rc);
    742
    743    /* Almost all integer conversions use cropped rounding;
    744       special case that.  */
    745    if ((fn11 & QUAL_RM_MASK) == QUAL_RM_C) {
    746        gen_helper_cvttq_c(vc, cpu_env, vb);
    747    } else {
    748        gen_qual_roundmode(ctx, fn11);
    749        gen_helper_cvttq(vc, cpu_env, vb);
    750    }
    751    gen_fp_exc_raise(rc, fn11);
    752}
    753
    754static void gen_ieee_intcvt(DisasContext *ctx,
    755                            void (*helper)(TCGv, TCGv_ptr, TCGv),
    756                            int rb, int rc, int fn11)
    757{
    758    TCGv vb, vc;
    759
    760    gen_qual_roundmode(ctx, fn11);
    761    vb = load_fpr(ctx, rb);
    762    vc = dest_fpr(ctx, rc);
    763
    764    /* The only exception that can be raised by integer conversion
    765       is inexact.  Thus we only need to worry about exceptions when
    766       inexact handling is requested.  */
    767    if (fn11 & QUAL_I) {
    768        helper(vc, cpu_env, vb);
    769        gen_fp_exc_raise(rc, fn11);
    770    } else {
    771        helper(vc, cpu_env, vb);
    772    }
    773}
    774
    775#define IEEE_INTCVT(name)                                       \
    776static inline void glue(gen_, name)(DisasContext *ctx,          \
    777                                    int rb, int rc, int fn11)   \
    778{                                                               \
    779    gen_ieee_intcvt(ctx, gen_helper_##name, rb, rc, fn11);      \
    780}
    781IEEE_INTCVT(cvtqs)
    782IEEE_INTCVT(cvtqt)
    783
    784static void gen_cpy_mask(TCGv vc, TCGv va, TCGv vb, bool inv_a, uint64_t mask)
    785{
    786    TCGv vmask = tcg_constant_i64(mask);
    787    TCGv tmp = tcg_temp_new_i64();
    788
    789    if (inv_a) {
    790        tcg_gen_andc_i64(tmp, vmask, va);
    791    } else {
    792        tcg_gen_and_i64(tmp, va, vmask);
    793    }
    794
    795    tcg_gen_andc_i64(vc, vb, vmask);
    796    tcg_gen_or_i64(vc, vc, tmp);
    797
    798    tcg_temp_free(tmp);
    799}
    800
    801static void gen_ieee_arith3(DisasContext *ctx,
    802                            void (*helper)(TCGv, TCGv_ptr, TCGv, TCGv),
    803                            int ra, int rb, int rc, int fn11)
    804{
    805    TCGv va, vb, vc;
    806
    807    gen_qual_roundmode(ctx, fn11);
    808    gen_qual_flushzero(ctx, fn11);
    809
    810    va = gen_ieee_input(ctx, ra, fn11, 0);
    811    vb = gen_ieee_input(ctx, rb, fn11, 0);
    812    vc = dest_fpr(ctx, rc);
    813    helper(vc, cpu_env, va, vb);
    814
    815    gen_fp_exc_raise(rc, fn11);
    816}
    817
    818#define IEEE_ARITH3(name)                                               \
    819static inline void glue(gen_, name)(DisasContext *ctx,                  \
    820                                    int ra, int rb, int rc, int fn11)   \
    821{                                                                       \
    822    gen_ieee_arith3(ctx, gen_helper_##name, ra, rb, rc, fn11);          \
    823}
    824IEEE_ARITH3(adds)
    825IEEE_ARITH3(subs)
    826IEEE_ARITH3(muls)
    827IEEE_ARITH3(divs)
    828IEEE_ARITH3(addt)
    829IEEE_ARITH3(subt)
    830IEEE_ARITH3(mult)
    831IEEE_ARITH3(divt)
    832
    833static void gen_ieee_compare(DisasContext *ctx,
    834                             void (*helper)(TCGv, TCGv_ptr, TCGv, TCGv),
    835                             int ra, int rb, int rc, int fn11)
    836{
    837    TCGv va, vb, vc;
    838
    839    va = gen_ieee_input(ctx, ra, fn11, 1);
    840    vb = gen_ieee_input(ctx, rb, fn11, 1);
    841    vc = dest_fpr(ctx, rc);
    842    helper(vc, cpu_env, va, vb);
    843
    844    gen_fp_exc_raise(rc, fn11);
    845}
    846
    847#define IEEE_CMP3(name)                                                 \
    848static inline void glue(gen_, name)(DisasContext *ctx,                  \
    849                                    int ra, int rb, int rc, int fn11)   \
    850{                                                                       \
    851    gen_ieee_compare(ctx, gen_helper_##name, ra, rb, rc, fn11);         \
    852}
    853IEEE_CMP3(cmptun)
    854IEEE_CMP3(cmpteq)
    855IEEE_CMP3(cmptlt)
    856IEEE_CMP3(cmptle)
    857
    858static inline uint64_t zapnot_mask(uint8_t lit)
    859{
    860    uint64_t mask = 0;
    861    int i;
    862
    863    for (i = 0; i < 8; ++i) {
    864        if ((lit >> i) & 1) {
    865            mask |= 0xffull << (i * 8);
    866        }
    867    }
    868    return mask;
    869}
    870
    871/* Implement zapnot with an immediate operand, which expands to some
    872   form of immediate AND.  This is a basic building block in the
    873   definition of many of the other byte manipulation instructions.  */
    874static void gen_zapnoti(TCGv dest, TCGv src, uint8_t lit)
    875{
    876    switch (lit) {
    877    case 0x00:
    878        tcg_gen_movi_i64(dest, 0);
    879        break;
    880    case 0x01:
    881        tcg_gen_ext8u_i64(dest, src);
    882        break;
    883    case 0x03:
    884        tcg_gen_ext16u_i64(dest, src);
    885        break;
    886    case 0x0f:
    887        tcg_gen_ext32u_i64(dest, src);
    888        break;
    889    case 0xff:
    890        tcg_gen_mov_i64(dest, src);
    891        break;
    892    default:
    893        tcg_gen_andi_i64(dest, src, zapnot_mask(lit));
    894        break;
    895    }
    896}
    897
    898/* EXTWH, EXTLH, EXTQH */
    899static void gen_ext_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
    900                      uint8_t lit, uint8_t byte_mask)
    901{
    902    if (islit) {
    903        int pos = (64 - lit * 8) & 0x3f;
    904        int len = cto32(byte_mask) * 8;
    905        if (pos < len) {
    906            tcg_gen_deposit_z_i64(vc, va, pos, len - pos);
    907        } else {
    908            tcg_gen_movi_i64(vc, 0);
    909        }
    910    } else {
    911        TCGv tmp = tcg_temp_new();
    912        tcg_gen_shli_i64(tmp, load_gpr(ctx, rb), 3);
    913        tcg_gen_neg_i64(tmp, tmp);
    914        tcg_gen_andi_i64(tmp, tmp, 0x3f);
    915        tcg_gen_shl_i64(vc, va, tmp);
    916        tcg_temp_free(tmp);
    917    }
    918    gen_zapnoti(vc, vc, byte_mask);
    919}
    920
    921/* EXTBL, EXTWL, EXTLL, EXTQL */
    922static void gen_ext_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
    923                      uint8_t lit, uint8_t byte_mask)
    924{
    925    if (islit) {
    926        int pos = (lit & 7) * 8;
    927        int len = cto32(byte_mask) * 8;
    928        if (pos + len >= 64) {
    929            len = 64 - pos;
    930        }
    931        tcg_gen_extract_i64(vc, va, pos, len);
    932    } else {
    933        TCGv tmp = tcg_temp_new();
    934        tcg_gen_andi_i64(tmp, load_gpr(ctx, rb), 7);
    935        tcg_gen_shli_i64(tmp, tmp, 3);
    936        tcg_gen_shr_i64(vc, va, tmp);
    937        tcg_temp_free(tmp);
    938        gen_zapnoti(vc, vc, byte_mask);
    939    }
    940}
    941
    942/* INSWH, INSLH, INSQH */
    943static void gen_ins_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
    944                      uint8_t lit, uint8_t byte_mask)
    945{
    946    if (islit) {
    947        int pos = 64 - (lit & 7) * 8;
    948        int len = cto32(byte_mask) * 8;
    949        if (pos < len) {
    950            tcg_gen_extract_i64(vc, va, pos, len - pos);
    951        } else {
    952            tcg_gen_movi_i64(vc, 0);
    953        }
    954    } else {
    955        TCGv tmp = tcg_temp_new();
    956        TCGv shift = tcg_temp_new();
    957
    958        /* The instruction description has us left-shift the byte mask
    959           and extract bits <15:8> and apply that zap at the end.  This
    960           is equivalent to simply performing the zap first and shifting
    961           afterward.  */
    962        gen_zapnoti(tmp, va, byte_mask);
    963
    964        /* If (B & 7) == 0, we need to shift by 64 and leave a zero.  Do this
    965           portably by splitting the shift into two parts: shift_count-1 and 1.
    966           Arrange for the -1 by using ones-complement instead of
    967           twos-complement in the negation: ~(B * 8) & 63.  */
    968
    969        tcg_gen_shli_i64(shift, load_gpr(ctx, rb), 3);
    970        tcg_gen_not_i64(shift, shift);
    971        tcg_gen_andi_i64(shift, shift, 0x3f);
    972
    973        tcg_gen_shr_i64(vc, tmp, shift);
    974        tcg_gen_shri_i64(vc, vc, 1);
    975        tcg_temp_free(shift);
    976        tcg_temp_free(tmp);
    977    }
    978}
    979
    980/* INSBL, INSWL, INSLL, INSQL */
    981static void gen_ins_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
    982                      uint8_t lit, uint8_t byte_mask)
    983{
    984    if (islit) {
    985        int pos = (lit & 7) * 8;
    986        int len = cto32(byte_mask) * 8;
    987        if (pos + len > 64) {
    988            len = 64 - pos;
    989        }
    990        tcg_gen_deposit_z_i64(vc, va, pos, len);
    991    } else {
    992        TCGv tmp = tcg_temp_new();
    993        TCGv shift = tcg_temp_new();
    994
    995        /* The instruction description has us left-shift the byte mask
    996           and extract bits <15:8> and apply that zap at the end.  This
    997           is equivalent to simply performing the zap first and shifting
    998           afterward.  */
    999        gen_zapnoti(tmp, va, byte_mask);
   1000
   1001        tcg_gen_andi_i64(shift, load_gpr(ctx, rb), 7);
   1002        tcg_gen_shli_i64(shift, shift, 3);
   1003        tcg_gen_shl_i64(vc, tmp, shift);
   1004        tcg_temp_free(shift);
   1005        tcg_temp_free(tmp);
   1006    }
   1007}
   1008
   1009/* MSKWH, MSKLH, MSKQH */
   1010static void gen_msk_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
   1011                      uint8_t lit, uint8_t byte_mask)
   1012{
   1013    if (islit) {
   1014        gen_zapnoti(vc, va, ~((byte_mask << (lit & 7)) >> 8));
   1015    } else {
   1016        TCGv shift = tcg_temp_new();
   1017        TCGv mask = tcg_temp_new();
   1018
   1019        /* The instruction description is as above, where the byte_mask
   1020           is shifted left, and then we extract bits <15:8>.  This can be
   1021           emulated with a right-shift on the expanded byte mask.  This
   1022           requires extra care because for an input <2:0> == 0 we need a
   1023           shift of 64 bits in order to generate a zero.  This is done by
   1024           splitting the shift into two parts, the variable shift - 1
   1025           followed by a constant 1 shift.  The code we expand below is
   1026           equivalent to ~(B * 8) & 63.  */
   1027
   1028        tcg_gen_shli_i64(shift, load_gpr(ctx, rb), 3);
   1029        tcg_gen_not_i64(shift, shift);
   1030        tcg_gen_andi_i64(shift, shift, 0x3f);
   1031        tcg_gen_movi_i64(mask, zapnot_mask (byte_mask));
   1032        tcg_gen_shr_i64(mask, mask, shift);
   1033        tcg_gen_shri_i64(mask, mask, 1);
   1034
   1035        tcg_gen_andc_i64(vc, va, mask);
   1036
   1037        tcg_temp_free(mask);
   1038        tcg_temp_free(shift);
   1039    }
   1040}
   1041
   1042/* MSKBL, MSKWL, MSKLL, MSKQL */
   1043static void gen_msk_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit,
   1044                      uint8_t lit, uint8_t byte_mask)
   1045{
   1046    if (islit) {
   1047        gen_zapnoti(vc, va, ~(byte_mask << (lit & 7)));
   1048    } else {
   1049        TCGv shift = tcg_temp_new();
   1050        TCGv mask = tcg_temp_new();
   1051
   1052        tcg_gen_andi_i64(shift, load_gpr(ctx, rb), 7);
   1053        tcg_gen_shli_i64(shift, shift, 3);
   1054        tcg_gen_movi_i64(mask, zapnot_mask(byte_mask));
   1055        tcg_gen_shl_i64(mask, mask, shift);
   1056
   1057        tcg_gen_andc_i64(vc, va, mask);
   1058
   1059        tcg_temp_free(mask);
   1060        tcg_temp_free(shift);
   1061    }
   1062}
   1063
   1064static void gen_rx(DisasContext *ctx, int ra, int set)
   1065{
   1066    if (ra != 31) {
   1067        ld_flag_byte(ctx->ir[ra], ENV_FLAG_RX_SHIFT);
   1068    }
   1069
   1070    st_flag_byte(tcg_constant_i64(set), ENV_FLAG_RX_SHIFT);
   1071}
   1072
   1073static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode)
   1074{
   1075    /* We're emulating OSF/1 PALcode.  Many of these are trivial access
   1076       to internal cpu registers.  */
   1077
   1078    /* Unprivileged PAL call */
   1079    if (palcode >= 0x80 && palcode < 0xC0) {
   1080        switch (palcode) {
   1081        case 0x86:
   1082            /* IMB */
   1083            /* No-op inside QEMU.  */
   1084            break;
   1085        case 0x9E:
   1086            /* RDUNIQUE */
   1087            tcg_gen_ld_i64(ctx->ir[IR_V0], cpu_env,
   1088                           offsetof(CPUAlphaState, unique));
   1089            break;
   1090        case 0x9F:
   1091            /* WRUNIQUE */
   1092            tcg_gen_st_i64(ctx->ir[IR_A0], cpu_env,
   1093                           offsetof(CPUAlphaState, unique));
   1094            break;
   1095        default:
   1096            palcode &= 0xbf;
   1097            goto do_call_pal;
   1098        }
   1099        return DISAS_NEXT;
   1100    }
   1101
   1102#ifndef CONFIG_USER_ONLY
   1103    /* Privileged PAL code */
   1104    if (palcode < 0x40 && (ctx->tbflags & ENV_FLAG_PS_USER) == 0) {
   1105        switch (palcode) {
   1106        case 0x01:
   1107            /* CFLUSH */
   1108            /* No-op inside QEMU.  */
   1109            break;
   1110        case 0x02:
   1111            /* DRAINA */
   1112            /* No-op inside QEMU.  */
   1113            break;
   1114        case 0x2D:
   1115            /* WRVPTPTR */
   1116            tcg_gen_st_i64(ctx->ir[IR_A0], cpu_env,
   1117                           offsetof(CPUAlphaState, vptptr));
   1118            break;
   1119        case 0x31:
   1120            /* WRVAL */
   1121            tcg_gen_st_i64(ctx->ir[IR_A0], cpu_env,
   1122                           offsetof(CPUAlphaState, sysval));
   1123            break;
   1124        case 0x32:
   1125            /* RDVAL */
   1126            tcg_gen_ld_i64(ctx->ir[IR_V0], cpu_env,
   1127                           offsetof(CPUAlphaState, sysval));
   1128            break;
   1129
   1130        case 0x35:
   1131            /* SWPIPL */
   1132            /* Note that we already know we're in kernel mode, so we know
   1133               that PS only contains the 3 IPL bits.  */
   1134            ld_flag_byte(ctx->ir[IR_V0], ENV_FLAG_PS_SHIFT);
   1135
   1136            /* But make sure and store only the 3 IPL bits from the user.  */
   1137            {
   1138                TCGv tmp = tcg_temp_new();
   1139                tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK);
   1140                st_flag_byte(tmp, ENV_FLAG_PS_SHIFT);
   1141                tcg_temp_free(tmp);
   1142            }
   1143
   1144            /* Allow interrupts to be recognized right away.  */
   1145            tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
   1146            return DISAS_PC_UPDATED_NOCHAIN;
   1147
   1148        case 0x36:
   1149            /* RDPS */
   1150            ld_flag_byte(ctx->ir[IR_V0], ENV_FLAG_PS_SHIFT);
   1151            break;
   1152
   1153        case 0x38:
   1154            /* WRUSP */
   1155            tcg_gen_st_i64(ctx->ir[IR_A0], cpu_env,
   1156                           offsetof(CPUAlphaState, usp));
   1157            break;
   1158        case 0x3A:
   1159            /* RDUSP */
   1160            tcg_gen_ld_i64(ctx->ir[IR_V0], cpu_env,
   1161                           offsetof(CPUAlphaState, usp));
   1162            break;
   1163        case 0x3C:
   1164            /* WHAMI */
   1165            tcg_gen_ld32s_i64(ctx->ir[IR_V0], cpu_env,
   1166                -offsetof(AlphaCPU, env) + offsetof(CPUState, cpu_index));
   1167            break;
   1168
   1169        case 0x3E:
   1170            /* WTINT */
   1171            tcg_gen_st_i32(tcg_constant_i32(1), cpu_env,
   1172                           -offsetof(AlphaCPU, env) +
   1173                           offsetof(CPUState, halted));
   1174            tcg_gen_movi_i64(ctx->ir[IR_V0], 0);
   1175            return gen_excp(ctx, EXCP_HALTED, 0);
   1176
   1177        default:
   1178            palcode &= 0x3f;
   1179            goto do_call_pal;
   1180        }
   1181        return DISAS_NEXT;
   1182    }
   1183#endif
   1184    return gen_invalid(ctx);
   1185
   1186 do_call_pal:
   1187#ifdef CONFIG_USER_ONLY
   1188    return gen_excp(ctx, EXCP_CALL_PAL, palcode);
   1189#else
   1190    {
   1191        TCGv tmp = tcg_temp_new();
   1192        uint64_t exc_addr = ctx->base.pc_next;
   1193        uint64_t entry = ctx->palbr;
   1194
   1195        if (ctx->tbflags & ENV_FLAG_PAL_MODE) {
   1196            exc_addr |= 1;
   1197        } else {
   1198            tcg_gen_movi_i64(tmp, 1);
   1199            st_flag_byte(tmp, ENV_FLAG_PAL_SHIFT);
   1200        }
   1201
   1202        tcg_gen_movi_i64(tmp, exc_addr);
   1203        tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUAlphaState, exc_addr));
   1204        tcg_temp_free(tmp);
   1205
   1206        entry += (palcode & 0x80
   1207                  ? 0x2000 + (palcode - 0x80) * 64
   1208                  : 0x1000 + palcode * 64);
   1209
   1210        tcg_gen_movi_i64(cpu_pc, entry);
   1211        return DISAS_PC_UPDATED;
   1212    }
   1213#endif
   1214}
   1215
   1216#ifndef CONFIG_USER_ONLY
   1217
   1218#define PR_LONG         0x200000
   1219
   1220static int cpu_pr_data(int pr)
   1221{
   1222    switch (pr) {
   1223    case  2: return offsetof(CPUAlphaState, pcc_ofs) | PR_LONG;
   1224    case  3: return offsetof(CPUAlphaState, trap_arg0);
   1225    case  4: return offsetof(CPUAlphaState, trap_arg1);
   1226    case  5: return offsetof(CPUAlphaState, trap_arg2);
   1227    case  6: return offsetof(CPUAlphaState, exc_addr);
   1228    case  7: return offsetof(CPUAlphaState, palbr);
   1229    case  8: return offsetof(CPUAlphaState, ptbr);
   1230    case  9: return offsetof(CPUAlphaState, vptptr);
   1231    case 10: return offsetof(CPUAlphaState, unique);
   1232    case 11: return offsetof(CPUAlphaState, sysval);
   1233    case 12: return offsetof(CPUAlphaState, usp);
   1234
   1235    case 40 ... 63:
   1236        return offsetof(CPUAlphaState, scratch[pr - 40]);
   1237
   1238    case 251:
   1239        return offsetof(CPUAlphaState, alarm_expire);
   1240    }
   1241    return 0;
   1242}
   1243
   1244static DisasJumpType gen_mfpr(DisasContext *ctx, TCGv va, int regno)
   1245{
   1246    void (*helper)(TCGv);
   1247    int data;
   1248
   1249    switch (regno) {
   1250    case 32 ... 39:
   1251        /* Accessing the "non-shadow" general registers.  */
   1252        regno = regno == 39 ? 25 : regno - 32 + 8;
   1253        tcg_gen_mov_i64(va, cpu_std_ir[regno]);
   1254        break;
   1255
   1256    case 250: /* WALLTIME */
   1257        helper = gen_helper_get_walltime;
   1258        goto do_helper;
   1259    case 249: /* VMTIME */
   1260        helper = gen_helper_get_vmtime;
   1261    do_helper:
   1262        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
   1263            gen_io_start();
   1264            helper(va);
   1265            return DISAS_PC_STALE;
   1266        } else {
   1267            helper(va);
   1268        }
   1269        break;
   1270
   1271    case 0: /* PS */
   1272        ld_flag_byte(va, ENV_FLAG_PS_SHIFT);
   1273        break;
   1274    case 1: /* FEN */
   1275        ld_flag_byte(va, ENV_FLAG_FEN_SHIFT);
   1276        break;
   1277
   1278    default:
   1279        /* The basic registers are data only, and unknown registers
   1280           are read-zero, write-ignore.  */
   1281        data = cpu_pr_data(regno);
   1282        if (data == 0) {
   1283            tcg_gen_movi_i64(va, 0);
   1284        } else if (data & PR_LONG) {
   1285            tcg_gen_ld32s_i64(va, cpu_env, data & ~PR_LONG);
   1286        } else {
   1287            tcg_gen_ld_i64(va, cpu_env, data);
   1288        }
   1289        break;
   1290    }
   1291
   1292    return DISAS_NEXT;
   1293}
   1294
   1295static DisasJumpType gen_mtpr(DisasContext *ctx, TCGv vb, int regno)
   1296{
   1297    int data;
   1298    DisasJumpType ret = DISAS_NEXT;
   1299
   1300    switch (regno) {
   1301    case 255:
   1302        /* TBIA */
   1303        gen_helper_tbia(cpu_env);
   1304        break;
   1305
   1306    case 254:
   1307        /* TBIS */
   1308        gen_helper_tbis(cpu_env, vb);
   1309        break;
   1310
   1311    case 253:
   1312        /* WAIT */
   1313        tcg_gen_st_i32(tcg_constant_i32(1), cpu_env,
   1314                       -offsetof(AlphaCPU, env) + offsetof(CPUState, halted));
   1315        return gen_excp(ctx, EXCP_HALTED, 0);
   1316
   1317    case 252:
   1318        /* HALT */
   1319        gen_helper_halt(vb);
   1320        return DISAS_PC_STALE;
   1321
   1322    case 251:
   1323        /* ALARM */
   1324        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
   1325            gen_io_start();
   1326            ret = DISAS_PC_STALE;
   1327        }
   1328        gen_helper_set_alarm(cpu_env, vb);
   1329        break;
   1330
   1331    case 7:
   1332        /* PALBR */
   1333        tcg_gen_st_i64(vb, cpu_env, offsetof(CPUAlphaState, palbr));
   1334        /* Changing the PAL base register implies un-chaining all of the TBs
   1335           that ended with a CALL_PAL.  Since the base register usually only
   1336           changes during boot, flushing everything works well.  */
   1337        gen_helper_tb_flush(cpu_env);
   1338        return DISAS_PC_STALE;
   1339
   1340    case 32 ... 39:
   1341        /* Accessing the "non-shadow" general registers.  */
   1342        regno = regno == 39 ? 25 : regno - 32 + 8;
   1343        tcg_gen_mov_i64(cpu_std_ir[regno], vb);
   1344        break;
   1345
   1346    case 0: /* PS */
   1347        st_flag_byte(vb, ENV_FLAG_PS_SHIFT);
   1348        break;
   1349    case 1: /* FEN */
   1350        st_flag_byte(vb, ENV_FLAG_FEN_SHIFT);
   1351        break;
   1352
   1353    default:
   1354        /* The basic registers are data only, and unknown registers
   1355           are read-zero, write-ignore.  */
   1356        data = cpu_pr_data(regno);
   1357        if (data != 0) {
   1358            if (data & PR_LONG) {
   1359                tcg_gen_st32_i64(vb, cpu_env, data & ~PR_LONG);
   1360            } else {
   1361                tcg_gen_st_i64(vb, cpu_env, data);
   1362            }
   1363        }
   1364        break;
   1365    }
   1366
   1367    return ret;
   1368}
   1369#endif /* !USER_ONLY*/
   1370
   1371#define REQUIRE_NO_LIT                          \
   1372    do {                                        \
   1373        if (real_islit) {                       \
   1374            goto invalid_opc;                   \
   1375        }                                       \
   1376    } while (0)
   1377
   1378#define REQUIRE_AMASK(FLAG)                     \
   1379    do {                                        \
   1380        if ((ctx->amask & AMASK_##FLAG) == 0) { \
   1381            goto invalid_opc;                   \
   1382        }                                       \
   1383    } while (0)
   1384
   1385#define REQUIRE_TB_FLAG(FLAG)                   \
   1386    do {                                        \
   1387        if ((ctx->tbflags & (FLAG)) == 0) {     \
   1388            goto invalid_opc;                   \
   1389        }                                       \
   1390    } while (0)
   1391
   1392#define REQUIRE_REG_31(WHICH)                   \
   1393    do {                                        \
   1394        if (WHICH != 31) {                      \
   1395            goto invalid_opc;                   \
   1396        }                                       \
   1397    } while (0)
   1398
   1399#define REQUIRE_FEN                             \
   1400    do {                                        \
   1401        if (!(ctx->tbflags & ENV_FLAG_FEN)) {   \
   1402            goto raise_fen;                     \
   1403        }                                       \
   1404    } while (0)
   1405
   1406static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn)
   1407{
   1408    int32_t disp21, disp16, disp12 __attribute__((unused));
   1409    uint16_t fn11;
   1410    uint8_t opc, ra, rb, rc, fpfn, fn7, lit;
   1411    bool islit, real_islit;
   1412    TCGv va, vb, vc, tmp, tmp2;
   1413    TCGv_i32 t32;
   1414    DisasJumpType ret;
   1415
   1416    /* Decode all instruction fields */
   1417    opc = extract32(insn, 26, 6);
   1418    ra = extract32(insn, 21, 5);
   1419    rb = extract32(insn, 16, 5);
   1420    rc = extract32(insn, 0, 5);
   1421    real_islit = islit = extract32(insn, 12, 1);
   1422    lit = extract32(insn, 13, 8);
   1423
   1424    disp21 = sextract32(insn, 0, 21);
   1425    disp16 = sextract32(insn, 0, 16);
   1426    disp12 = sextract32(insn, 0, 12);
   1427
   1428    fn11 = extract32(insn, 5, 11);
   1429    fpfn = extract32(insn, 5, 6);
   1430    fn7 = extract32(insn, 5, 7);
   1431
   1432    if (rb == 31 && !islit) {
   1433        islit = true;
   1434        lit = 0;
   1435    }
   1436
   1437    ret = DISAS_NEXT;
   1438    switch (opc) {
   1439    case 0x00:
   1440        /* CALL_PAL */
   1441        ret = gen_call_pal(ctx, insn & 0x03ffffff);
   1442        break;
   1443    case 0x01:
   1444        /* OPC01 */
   1445        goto invalid_opc;
   1446    case 0x02:
   1447        /* OPC02 */
   1448        goto invalid_opc;
   1449    case 0x03:
   1450        /* OPC03 */
   1451        goto invalid_opc;
   1452    case 0x04:
   1453        /* OPC04 */
   1454        goto invalid_opc;
   1455    case 0x05:
   1456        /* OPC05 */
   1457        goto invalid_opc;
   1458    case 0x06:
   1459        /* OPC06 */
   1460        goto invalid_opc;
   1461    case 0x07:
   1462        /* OPC07 */
   1463        goto invalid_opc;
   1464
   1465    case 0x09:
   1466        /* LDAH */
   1467        disp16 = (uint32_t)disp16 << 16;
   1468        /* fall through */
   1469    case 0x08:
   1470        /* LDA */
   1471        va = dest_gpr(ctx, ra);
   1472        /* It's worth special-casing immediate loads.  */
   1473        if (rb == 31) {
   1474            tcg_gen_movi_i64(va, disp16);
   1475        } else {
   1476            tcg_gen_addi_i64(va, load_gpr(ctx, rb), disp16);
   1477        }
   1478        break;
   1479
   1480    case 0x0A:
   1481        /* LDBU */
   1482        REQUIRE_AMASK(BWX);
   1483        gen_load_mem(ctx, &tcg_gen_qemu_ld8u, ra, rb, disp16, 0, 0);
   1484        break;
   1485    case 0x0B:
   1486        /* LDQ_U */
   1487        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 1);
   1488        break;
   1489    case 0x0C:
   1490        /* LDWU */
   1491        REQUIRE_AMASK(BWX);
   1492        gen_load_mem(ctx, &tcg_gen_qemu_ld16u, ra, rb, disp16, 0, 0);
   1493        break;
   1494    case 0x0D:
   1495        /* STW */
   1496        REQUIRE_AMASK(BWX);
   1497        gen_store_mem(ctx, &tcg_gen_qemu_st16, ra, rb, disp16, 0, 0);
   1498        break;
   1499    case 0x0E:
   1500        /* STB */
   1501        REQUIRE_AMASK(BWX);
   1502        gen_store_mem(ctx, &tcg_gen_qemu_st8, ra, rb, disp16, 0, 0);
   1503        break;
   1504    case 0x0F:
   1505        /* STQ_U */
   1506        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 1);
   1507        break;
   1508
   1509    case 0x10:
   1510        vc = dest_gpr(ctx, rc);
   1511        vb = load_gpr_lit(ctx, rb, lit, islit);
   1512
   1513        if (ra == 31) {
   1514            if (fn7 == 0x00) {
   1515                /* Special case ADDL as SEXTL.  */
   1516                tcg_gen_ext32s_i64(vc, vb);
   1517                break;
   1518            }
   1519            if (fn7 == 0x29) {
   1520                /* Special case SUBQ as NEGQ.  */
   1521                tcg_gen_neg_i64(vc, vb);
   1522                break;
   1523            }
   1524        }
   1525
   1526        va = load_gpr(ctx, ra);
   1527        switch (fn7) {
   1528        case 0x00:
   1529            /* ADDL */
   1530            tcg_gen_add_i64(vc, va, vb);
   1531            tcg_gen_ext32s_i64(vc, vc);
   1532            break;
   1533        case 0x02:
   1534            /* S4ADDL */
   1535            tmp = tcg_temp_new();
   1536            tcg_gen_shli_i64(tmp, va, 2);
   1537            tcg_gen_add_i64(tmp, tmp, vb);
   1538            tcg_gen_ext32s_i64(vc, tmp);
   1539            tcg_temp_free(tmp);
   1540            break;
   1541        case 0x09:
   1542            /* SUBL */
   1543            tcg_gen_sub_i64(vc, va, vb);
   1544            tcg_gen_ext32s_i64(vc, vc);
   1545            break;
   1546        case 0x0B:
   1547            /* S4SUBL */
   1548            tmp = tcg_temp_new();
   1549            tcg_gen_shli_i64(tmp, va, 2);
   1550            tcg_gen_sub_i64(tmp, tmp, vb);
   1551            tcg_gen_ext32s_i64(vc, tmp);
   1552            tcg_temp_free(tmp);
   1553            break;
   1554        case 0x0F:
   1555            /* CMPBGE */
   1556            if (ra == 31) {
   1557                /* Special case 0 >= X as X == 0.  */
   1558                gen_helper_cmpbe0(vc, vb);
   1559            } else {
   1560                gen_helper_cmpbge(vc, va, vb);
   1561            }
   1562            break;
   1563        case 0x12:
   1564            /* S8ADDL */
   1565            tmp = tcg_temp_new();
   1566            tcg_gen_shli_i64(tmp, va, 3);
   1567            tcg_gen_add_i64(tmp, tmp, vb);
   1568            tcg_gen_ext32s_i64(vc, tmp);
   1569            tcg_temp_free(tmp);
   1570            break;
   1571        case 0x1B:
   1572            /* S8SUBL */
   1573            tmp = tcg_temp_new();
   1574            tcg_gen_shli_i64(tmp, va, 3);
   1575            tcg_gen_sub_i64(tmp, tmp, vb);
   1576            tcg_gen_ext32s_i64(vc, tmp);
   1577            tcg_temp_free(tmp);
   1578            break;
   1579        case 0x1D:
   1580            /* CMPULT */
   1581            tcg_gen_setcond_i64(TCG_COND_LTU, vc, va, vb);
   1582            break;
   1583        case 0x20:
   1584            /* ADDQ */
   1585            tcg_gen_add_i64(vc, va, vb);
   1586            break;
   1587        case 0x22:
   1588            /* S4ADDQ */
   1589            tmp = tcg_temp_new();
   1590            tcg_gen_shli_i64(tmp, va, 2);
   1591            tcg_gen_add_i64(vc, tmp, vb);
   1592            tcg_temp_free(tmp);
   1593            break;
   1594        case 0x29:
   1595            /* SUBQ */
   1596            tcg_gen_sub_i64(vc, va, vb);
   1597            break;
   1598        case 0x2B:
   1599            /* S4SUBQ */
   1600            tmp = tcg_temp_new();
   1601            tcg_gen_shli_i64(tmp, va, 2);
   1602            tcg_gen_sub_i64(vc, tmp, vb);
   1603            tcg_temp_free(tmp);
   1604            break;
   1605        case 0x2D:
   1606            /* CMPEQ */
   1607            tcg_gen_setcond_i64(TCG_COND_EQ, vc, va, vb);
   1608            break;
   1609        case 0x32:
   1610            /* S8ADDQ */
   1611            tmp = tcg_temp_new();
   1612            tcg_gen_shli_i64(tmp, va, 3);
   1613            tcg_gen_add_i64(vc, tmp, vb);
   1614            tcg_temp_free(tmp);
   1615            break;
   1616        case 0x3B:
   1617            /* S8SUBQ */
   1618            tmp = tcg_temp_new();
   1619            tcg_gen_shli_i64(tmp, va, 3);
   1620            tcg_gen_sub_i64(vc, tmp, vb);
   1621            tcg_temp_free(tmp);
   1622            break;
   1623        case 0x3D:
   1624            /* CMPULE */
   1625            tcg_gen_setcond_i64(TCG_COND_LEU, vc, va, vb);
   1626            break;
   1627        case 0x40:
   1628            /* ADDL/V */
   1629            tmp = tcg_temp_new();
   1630            tcg_gen_ext32s_i64(tmp, va);
   1631            tcg_gen_ext32s_i64(vc, vb);
   1632            tcg_gen_add_i64(tmp, tmp, vc);
   1633            tcg_gen_ext32s_i64(vc, tmp);
   1634            gen_helper_check_overflow(cpu_env, vc, tmp);
   1635            tcg_temp_free(tmp);
   1636            break;
   1637        case 0x49:
   1638            /* SUBL/V */
   1639            tmp = tcg_temp_new();
   1640            tcg_gen_ext32s_i64(tmp, va);
   1641            tcg_gen_ext32s_i64(vc, vb);
   1642            tcg_gen_sub_i64(tmp, tmp, vc);
   1643            tcg_gen_ext32s_i64(vc, tmp);
   1644            gen_helper_check_overflow(cpu_env, vc, tmp);
   1645            tcg_temp_free(tmp);
   1646            break;
   1647        case 0x4D:
   1648            /* CMPLT */
   1649            tcg_gen_setcond_i64(TCG_COND_LT, vc, va, vb);
   1650            break;
   1651        case 0x60:
   1652            /* ADDQ/V */
   1653            tmp = tcg_temp_new();
   1654            tmp2 = tcg_temp_new();
   1655            tcg_gen_eqv_i64(tmp, va, vb);
   1656            tcg_gen_mov_i64(tmp2, va);
   1657            tcg_gen_add_i64(vc, va, vb);
   1658            tcg_gen_xor_i64(tmp2, tmp2, vc);
   1659            tcg_gen_and_i64(tmp, tmp, tmp2);
   1660            tcg_gen_shri_i64(tmp, tmp, 63);
   1661            tcg_gen_movi_i64(tmp2, 0);
   1662            gen_helper_check_overflow(cpu_env, tmp, tmp2);
   1663            tcg_temp_free(tmp);
   1664            tcg_temp_free(tmp2);
   1665            break;
   1666        case 0x69:
   1667            /* SUBQ/V */
   1668            tmp = tcg_temp_new();
   1669            tmp2 = tcg_temp_new();
   1670            tcg_gen_xor_i64(tmp, va, vb);
   1671            tcg_gen_mov_i64(tmp2, va);
   1672            tcg_gen_sub_i64(vc, va, vb);
   1673            tcg_gen_xor_i64(tmp2, tmp2, vc);
   1674            tcg_gen_and_i64(tmp, tmp, tmp2);
   1675            tcg_gen_shri_i64(tmp, tmp, 63);
   1676            tcg_gen_movi_i64(tmp2, 0);
   1677            gen_helper_check_overflow(cpu_env, tmp, tmp2);
   1678            tcg_temp_free(tmp);
   1679            tcg_temp_free(tmp2);
   1680            break;
   1681        case 0x6D:
   1682            /* CMPLE */
   1683            tcg_gen_setcond_i64(TCG_COND_LE, vc, va, vb);
   1684            break;
   1685        default:
   1686            goto invalid_opc;
   1687        }
   1688        break;
   1689
   1690    case 0x11:
   1691        if (fn7 == 0x20) {
   1692            if (rc == 31) {
   1693                /* Special case BIS as NOP.  */
   1694                break;
   1695            }
   1696            if (ra == 31) {
   1697                /* Special case BIS as MOV.  */
   1698                vc = dest_gpr(ctx, rc);
   1699                if (islit) {
   1700                    tcg_gen_movi_i64(vc, lit);
   1701                } else {
   1702                    tcg_gen_mov_i64(vc, load_gpr(ctx, rb));
   1703                }
   1704                break;
   1705            }
   1706        }
   1707
   1708        vc = dest_gpr(ctx, rc);
   1709        vb = load_gpr_lit(ctx, rb, lit, islit);
   1710
   1711        if (fn7 == 0x28 && ra == 31) {
   1712            /* Special case ORNOT as NOT.  */
   1713            tcg_gen_not_i64(vc, vb);
   1714            break;
   1715        }
   1716
   1717        va = load_gpr(ctx, ra);
   1718        switch (fn7) {
   1719        case 0x00:
   1720            /* AND */
   1721            tcg_gen_and_i64(vc, va, vb);
   1722            break;
   1723        case 0x08:
   1724            /* BIC */
   1725            tcg_gen_andc_i64(vc, va, vb);
   1726            break;
   1727        case 0x14:
   1728            /* CMOVLBS */
   1729            tmp = tcg_temp_new();
   1730            tcg_gen_andi_i64(tmp, va, 1);
   1731            tcg_gen_movcond_i64(TCG_COND_NE, vc, tmp, load_zero(ctx),
   1732                                vb, load_gpr(ctx, rc));
   1733            tcg_temp_free(tmp);
   1734            break;
   1735        case 0x16:
   1736            /* CMOVLBC */
   1737            tmp = tcg_temp_new();
   1738            tcg_gen_andi_i64(tmp, va, 1);
   1739            tcg_gen_movcond_i64(TCG_COND_EQ, vc, tmp, load_zero(ctx),
   1740                                vb, load_gpr(ctx, rc));
   1741            tcg_temp_free(tmp);
   1742            break;
   1743        case 0x20:
   1744            /* BIS */
   1745            tcg_gen_or_i64(vc, va, vb);
   1746            break;
   1747        case 0x24:
   1748            /* CMOVEQ */
   1749            tcg_gen_movcond_i64(TCG_COND_EQ, vc, va, load_zero(ctx),
   1750                                vb, load_gpr(ctx, rc));
   1751            break;
   1752        case 0x26:
   1753            /* CMOVNE */
   1754            tcg_gen_movcond_i64(TCG_COND_NE, vc, va, load_zero(ctx),
   1755                                vb, load_gpr(ctx, rc));
   1756            break;
   1757        case 0x28:
   1758            /* ORNOT */
   1759            tcg_gen_orc_i64(vc, va, vb);
   1760            break;
   1761        case 0x40:
   1762            /* XOR */
   1763            tcg_gen_xor_i64(vc, va, vb);
   1764            break;
   1765        case 0x44:
   1766            /* CMOVLT */
   1767            tcg_gen_movcond_i64(TCG_COND_LT, vc, va, load_zero(ctx),
   1768                                vb, load_gpr(ctx, rc));
   1769            break;
   1770        case 0x46:
   1771            /* CMOVGE */
   1772            tcg_gen_movcond_i64(TCG_COND_GE, vc, va, load_zero(ctx),
   1773                                vb, load_gpr(ctx, rc));
   1774            break;
   1775        case 0x48:
   1776            /* EQV */
   1777            tcg_gen_eqv_i64(vc, va, vb);
   1778            break;
   1779        case 0x61:
   1780            /* AMASK */
   1781            REQUIRE_REG_31(ra);
   1782            tcg_gen_andi_i64(vc, vb, ~ctx->amask);
   1783            break;
   1784        case 0x64:
   1785            /* CMOVLE */
   1786            tcg_gen_movcond_i64(TCG_COND_LE, vc, va, load_zero(ctx),
   1787                                vb, load_gpr(ctx, rc));
   1788            break;
   1789        case 0x66:
   1790            /* CMOVGT */
   1791            tcg_gen_movcond_i64(TCG_COND_GT, vc, va, load_zero(ctx),
   1792                                vb, load_gpr(ctx, rc));
   1793            break;
   1794        case 0x6C:
   1795            /* IMPLVER */
   1796            REQUIRE_REG_31(ra);
   1797            tcg_gen_movi_i64(vc, ctx->implver);
   1798            break;
   1799        default:
   1800            goto invalid_opc;
   1801        }
   1802        break;
   1803
   1804    case 0x12:
   1805        vc = dest_gpr(ctx, rc);
   1806        va = load_gpr(ctx, ra);
   1807        switch (fn7) {
   1808        case 0x02:
   1809            /* MSKBL */
   1810            gen_msk_l(ctx, vc, va, rb, islit, lit, 0x01);
   1811            break;
   1812        case 0x06:
   1813            /* EXTBL */
   1814            gen_ext_l(ctx, vc, va, rb, islit, lit, 0x01);
   1815            break;
   1816        case 0x0B:
   1817            /* INSBL */
   1818            gen_ins_l(ctx, vc, va, rb, islit, lit, 0x01);
   1819            break;
   1820        case 0x12:
   1821            /* MSKWL */
   1822            gen_msk_l(ctx, vc, va, rb, islit, lit, 0x03);
   1823            break;
   1824        case 0x16:
   1825            /* EXTWL */
   1826            gen_ext_l(ctx, vc, va, rb, islit, lit, 0x03);
   1827            break;
   1828        case 0x1B:
   1829            /* INSWL */
   1830            gen_ins_l(ctx, vc, va, rb, islit, lit, 0x03);
   1831            break;
   1832        case 0x22:
   1833            /* MSKLL */
   1834            gen_msk_l(ctx, vc, va, rb, islit, lit, 0x0f);
   1835            break;
   1836        case 0x26:
   1837            /* EXTLL */
   1838            gen_ext_l(ctx, vc, va, rb, islit, lit, 0x0f);
   1839            break;
   1840        case 0x2B:
   1841            /* INSLL */
   1842            gen_ins_l(ctx, vc, va, rb, islit, lit, 0x0f);
   1843            break;
   1844        case 0x30:
   1845            /* ZAP */
   1846            if (islit) {
   1847                gen_zapnoti(vc, va, ~lit);
   1848            } else {
   1849                gen_helper_zap(vc, va, load_gpr(ctx, rb));
   1850            }
   1851            break;
   1852        case 0x31:
   1853            /* ZAPNOT */
   1854            if (islit) {
   1855                gen_zapnoti(vc, va, lit);
   1856            } else {
   1857                gen_helper_zapnot(vc, va, load_gpr(ctx, rb));
   1858            }
   1859            break;
   1860        case 0x32:
   1861            /* MSKQL */
   1862            gen_msk_l(ctx, vc, va, rb, islit, lit, 0xff);
   1863            break;
   1864        case 0x34:
   1865            /* SRL */
   1866            if (islit) {
   1867                tcg_gen_shri_i64(vc, va, lit & 0x3f);
   1868            } else {
   1869                tmp = tcg_temp_new();
   1870                vb = load_gpr(ctx, rb);
   1871                tcg_gen_andi_i64(tmp, vb, 0x3f);
   1872                tcg_gen_shr_i64(vc, va, tmp);
   1873                tcg_temp_free(tmp);
   1874            }
   1875            break;
   1876        case 0x36:
   1877            /* EXTQL */
   1878            gen_ext_l(ctx, vc, va, rb, islit, lit, 0xff);
   1879            break;
   1880        case 0x39:
   1881            /* SLL */
   1882            if (islit) {
   1883                tcg_gen_shli_i64(vc, va, lit & 0x3f);
   1884            } else {
   1885                tmp = tcg_temp_new();
   1886                vb = load_gpr(ctx, rb);
   1887                tcg_gen_andi_i64(tmp, vb, 0x3f);
   1888                tcg_gen_shl_i64(vc, va, tmp);
   1889                tcg_temp_free(tmp);
   1890            }
   1891            break;
   1892        case 0x3B:
   1893            /* INSQL */
   1894            gen_ins_l(ctx, vc, va, rb, islit, lit, 0xff);
   1895            break;
   1896        case 0x3C:
   1897            /* SRA */
   1898            if (islit) {
   1899                tcg_gen_sari_i64(vc, va, lit & 0x3f);
   1900            } else {
   1901                tmp = tcg_temp_new();
   1902                vb = load_gpr(ctx, rb);
   1903                tcg_gen_andi_i64(tmp, vb, 0x3f);
   1904                tcg_gen_sar_i64(vc, va, tmp);
   1905                tcg_temp_free(tmp);
   1906            }
   1907            break;
   1908        case 0x52:
   1909            /* MSKWH */
   1910            gen_msk_h(ctx, vc, va, rb, islit, lit, 0x03);
   1911            break;
   1912        case 0x57:
   1913            /* INSWH */
   1914            gen_ins_h(ctx, vc, va, rb, islit, lit, 0x03);
   1915            break;
   1916        case 0x5A:
   1917            /* EXTWH */
   1918            gen_ext_h(ctx, vc, va, rb, islit, lit, 0x03);
   1919            break;
   1920        case 0x62:
   1921            /* MSKLH */
   1922            gen_msk_h(ctx, vc, va, rb, islit, lit, 0x0f);
   1923            break;
   1924        case 0x67:
   1925            /* INSLH */
   1926            gen_ins_h(ctx, vc, va, rb, islit, lit, 0x0f);
   1927            break;
   1928        case 0x6A:
   1929            /* EXTLH */
   1930            gen_ext_h(ctx, vc, va, rb, islit, lit, 0x0f);
   1931            break;
   1932        case 0x72:
   1933            /* MSKQH */
   1934            gen_msk_h(ctx, vc, va, rb, islit, lit, 0xff);
   1935            break;
   1936        case 0x77:
   1937            /* INSQH */
   1938            gen_ins_h(ctx, vc, va, rb, islit, lit, 0xff);
   1939            break;
   1940        case 0x7A:
   1941            /* EXTQH */
   1942            gen_ext_h(ctx, vc, va, rb, islit, lit, 0xff);
   1943            break;
   1944        default:
   1945            goto invalid_opc;
   1946        }
   1947        break;
   1948
   1949    case 0x13:
   1950        vc = dest_gpr(ctx, rc);
   1951        vb = load_gpr_lit(ctx, rb, lit, islit);
   1952        va = load_gpr(ctx, ra);
   1953        switch (fn7) {
   1954        case 0x00:
   1955            /* MULL */
   1956            tcg_gen_mul_i64(vc, va, vb);
   1957            tcg_gen_ext32s_i64(vc, vc);
   1958            break;
   1959        case 0x20:
   1960            /* MULQ */
   1961            tcg_gen_mul_i64(vc, va, vb);
   1962            break;
   1963        case 0x30:
   1964            /* UMULH */
   1965            tmp = tcg_temp_new();
   1966            tcg_gen_mulu2_i64(tmp, vc, va, vb);
   1967            tcg_temp_free(tmp);
   1968            break;
   1969        case 0x40:
   1970            /* MULL/V */
   1971            tmp = tcg_temp_new();
   1972            tcg_gen_ext32s_i64(tmp, va);
   1973            tcg_gen_ext32s_i64(vc, vb);
   1974            tcg_gen_mul_i64(tmp, tmp, vc);
   1975            tcg_gen_ext32s_i64(vc, tmp);
   1976            gen_helper_check_overflow(cpu_env, vc, tmp);
   1977            tcg_temp_free(tmp);
   1978            break;
   1979        case 0x60:
   1980            /* MULQ/V */
   1981            tmp = tcg_temp_new();
   1982            tmp2 = tcg_temp_new();
   1983            tcg_gen_muls2_i64(vc, tmp, va, vb);
   1984            tcg_gen_sari_i64(tmp2, vc, 63);
   1985            gen_helper_check_overflow(cpu_env, tmp, tmp2);
   1986            tcg_temp_free(tmp);
   1987            tcg_temp_free(tmp2);
   1988            break;
   1989        default:
   1990            goto invalid_opc;
   1991        }
   1992        break;
   1993
   1994    case 0x14:
   1995        REQUIRE_AMASK(FIX);
   1996        vc = dest_fpr(ctx, rc);
   1997        switch (fpfn) { /* fn11 & 0x3F */
   1998        case 0x04:
   1999            /* ITOFS */
   2000            REQUIRE_REG_31(rb);
   2001            REQUIRE_FEN;
   2002            t32 = tcg_temp_new_i32();
   2003            va = load_gpr(ctx, ra);
   2004            tcg_gen_extrl_i64_i32(t32, va);
   2005            gen_helper_memory_to_s(vc, t32);
   2006            tcg_temp_free_i32(t32);
   2007            break;
   2008        case 0x0A:
   2009            /* SQRTF */
   2010            REQUIRE_REG_31(ra);
   2011            REQUIRE_FEN;
   2012            vb = load_fpr(ctx, rb);
   2013            gen_helper_sqrtf(vc, cpu_env, vb);
   2014            break;
   2015        case 0x0B:
   2016            /* SQRTS */
   2017            REQUIRE_REG_31(ra);
   2018            REQUIRE_FEN;
   2019            gen_sqrts(ctx, rb, rc, fn11);
   2020            break;
   2021        case 0x14:
   2022            /* ITOFF */
   2023            REQUIRE_REG_31(rb);
   2024            REQUIRE_FEN;
   2025            t32 = tcg_temp_new_i32();
   2026            va = load_gpr(ctx, ra);
   2027            tcg_gen_extrl_i64_i32(t32, va);
   2028            gen_helper_memory_to_f(vc, t32);
   2029            tcg_temp_free_i32(t32);
   2030            break;
   2031        case 0x24:
   2032            /* ITOFT */
   2033            REQUIRE_REG_31(rb);
   2034            REQUIRE_FEN;
   2035            va = load_gpr(ctx, ra);
   2036            tcg_gen_mov_i64(vc, va);
   2037            break;
   2038        case 0x2A:
   2039            /* SQRTG */
   2040            REQUIRE_REG_31(ra);
   2041            REQUIRE_FEN;
   2042            vb = load_fpr(ctx, rb);
   2043            gen_helper_sqrtg(vc, cpu_env, vb);
   2044            break;
   2045        case 0x02B:
   2046            /* SQRTT */
   2047            REQUIRE_REG_31(ra);
   2048            REQUIRE_FEN;
   2049            gen_sqrtt(ctx, rb, rc, fn11);
   2050            break;
   2051        default:
   2052            goto invalid_opc;
   2053        }
   2054        break;
   2055
   2056    case 0x15:
   2057        /* VAX floating point */
   2058        /* XXX: rounding mode and trap are ignored (!) */
   2059        vc = dest_fpr(ctx, rc);
   2060        vb = load_fpr(ctx, rb);
   2061        va = load_fpr(ctx, ra);
   2062        switch (fpfn) { /* fn11 & 0x3F */
   2063        case 0x00:
   2064            /* ADDF */
   2065            REQUIRE_FEN;
   2066            gen_helper_addf(vc, cpu_env, va, vb);
   2067            break;
   2068        case 0x01:
   2069            /* SUBF */
   2070            REQUIRE_FEN;
   2071            gen_helper_subf(vc, cpu_env, va, vb);
   2072            break;
   2073        case 0x02:
   2074            /* MULF */
   2075            REQUIRE_FEN;
   2076            gen_helper_mulf(vc, cpu_env, va, vb);
   2077            break;
   2078        case 0x03:
   2079            /* DIVF */
   2080            REQUIRE_FEN;
   2081            gen_helper_divf(vc, cpu_env, va, vb);
   2082            break;
   2083        case 0x1E:
   2084            /* CVTDG -- TODO */
   2085            REQUIRE_REG_31(ra);
   2086            goto invalid_opc;
   2087        case 0x20:
   2088            /* ADDG */
   2089            REQUIRE_FEN;
   2090            gen_helper_addg(vc, cpu_env, va, vb);
   2091            break;
   2092        case 0x21:
   2093            /* SUBG */
   2094            REQUIRE_FEN;
   2095            gen_helper_subg(vc, cpu_env, va, vb);
   2096            break;
   2097        case 0x22:
   2098            /* MULG */
   2099            REQUIRE_FEN;
   2100            gen_helper_mulg(vc, cpu_env, va, vb);
   2101            break;
   2102        case 0x23:
   2103            /* DIVG */
   2104            REQUIRE_FEN;
   2105            gen_helper_divg(vc, cpu_env, va, vb);
   2106            break;
   2107        case 0x25:
   2108            /* CMPGEQ */
   2109            REQUIRE_FEN;
   2110            gen_helper_cmpgeq(vc, cpu_env, va, vb);
   2111            break;
   2112        case 0x26:
   2113            /* CMPGLT */
   2114            REQUIRE_FEN;
   2115            gen_helper_cmpglt(vc, cpu_env, va, vb);
   2116            break;
   2117        case 0x27:
   2118            /* CMPGLE */
   2119            REQUIRE_FEN;
   2120            gen_helper_cmpgle(vc, cpu_env, va, vb);
   2121            break;
   2122        case 0x2C:
   2123            /* CVTGF */
   2124            REQUIRE_REG_31(ra);
   2125            REQUIRE_FEN;
   2126            gen_helper_cvtgf(vc, cpu_env, vb);
   2127            break;
   2128        case 0x2D:
   2129            /* CVTGD -- TODO */
   2130            REQUIRE_REG_31(ra);
   2131            goto invalid_opc;
   2132        case 0x2F:
   2133            /* CVTGQ */
   2134            REQUIRE_REG_31(ra);
   2135            REQUIRE_FEN;
   2136            gen_helper_cvtgq(vc, cpu_env, vb);
   2137            break;
   2138        case 0x3C:
   2139            /* CVTQF */
   2140            REQUIRE_REG_31(ra);
   2141            REQUIRE_FEN;
   2142            gen_helper_cvtqf(vc, cpu_env, vb);
   2143            break;
   2144        case 0x3E:
   2145            /* CVTQG */
   2146            REQUIRE_REG_31(ra);
   2147            REQUIRE_FEN;
   2148            gen_helper_cvtqg(vc, cpu_env, vb);
   2149            break;
   2150        default:
   2151            goto invalid_opc;
   2152        }
   2153        break;
   2154
   2155    case 0x16:
   2156        /* IEEE floating-point */
   2157        switch (fpfn) { /* fn11 & 0x3F */
   2158        case 0x00:
   2159            /* ADDS */
   2160            REQUIRE_FEN;
   2161            gen_adds(ctx, ra, rb, rc, fn11);
   2162            break;
   2163        case 0x01:
   2164            /* SUBS */
   2165            REQUIRE_FEN;
   2166            gen_subs(ctx, ra, rb, rc, fn11);
   2167            break;
   2168        case 0x02:
   2169            /* MULS */
   2170            REQUIRE_FEN;
   2171            gen_muls(ctx, ra, rb, rc, fn11);
   2172            break;
   2173        case 0x03:
   2174            /* DIVS */
   2175            REQUIRE_FEN;
   2176            gen_divs(ctx, ra, rb, rc, fn11);
   2177            break;
   2178        case 0x20:
   2179            /* ADDT */
   2180            REQUIRE_FEN;
   2181            gen_addt(ctx, ra, rb, rc, fn11);
   2182            break;
   2183        case 0x21:
   2184            /* SUBT */
   2185            REQUIRE_FEN;
   2186            gen_subt(ctx, ra, rb, rc, fn11);
   2187            break;
   2188        case 0x22:
   2189            /* MULT */
   2190            REQUIRE_FEN;
   2191            gen_mult(ctx, ra, rb, rc, fn11);
   2192            break;
   2193        case 0x23:
   2194            /* DIVT */
   2195            REQUIRE_FEN;
   2196            gen_divt(ctx, ra, rb, rc, fn11);
   2197            break;
   2198        case 0x24:
   2199            /* CMPTUN */
   2200            REQUIRE_FEN;
   2201            gen_cmptun(ctx, ra, rb, rc, fn11);
   2202            break;
   2203        case 0x25:
   2204            /* CMPTEQ */
   2205            REQUIRE_FEN;
   2206            gen_cmpteq(ctx, ra, rb, rc, fn11);
   2207            break;
   2208        case 0x26:
   2209            /* CMPTLT */
   2210            REQUIRE_FEN;
   2211            gen_cmptlt(ctx, ra, rb, rc, fn11);
   2212            break;
   2213        case 0x27:
   2214            /* CMPTLE */
   2215            REQUIRE_FEN;
   2216            gen_cmptle(ctx, ra, rb, rc, fn11);
   2217            break;
   2218        case 0x2C:
   2219            REQUIRE_REG_31(ra);
   2220            REQUIRE_FEN;
   2221            if (fn11 == 0x2AC || fn11 == 0x6AC) {
   2222                /* CVTST */
   2223                gen_cvtst(ctx, rb, rc, fn11);
   2224            } else {
   2225                /* CVTTS */
   2226                gen_cvtts(ctx, rb, rc, fn11);
   2227            }
   2228            break;
   2229        case 0x2F:
   2230            /* CVTTQ */
   2231            REQUIRE_REG_31(ra);
   2232            REQUIRE_FEN;
   2233            gen_cvttq(ctx, rb, rc, fn11);
   2234            break;
   2235        case 0x3C:
   2236            /* CVTQS */
   2237            REQUIRE_REG_31(ra);
   2238            REQUIRE_FEN;
   2239            gen_cvtqs(ctx, rb, rc, fn11);
   2240            break;
   2241        case 0x3E:
   2242            /* CVTQT */
   2243            REQUIRE_REG_31(ra);
   2244            REQUIRE_FEN;
   2245            gen_cvtqt(ctx, rb, rc, fn11);
   2246            break;
   2247        default:
   2248            goto invalid_opc;
   2249        }
   2250        break;
   2251
   2252    case 0x17:
   2253        switch (fn11) {
   2254        case 0x010:
   2255            /* CVTLQ */
   2256            REQUIRE_REG_31(ra);
   2257            REQUIRE_FEN;
   2258            vc = dest_fpr(ctx, rc);
   2259            vb = load_fpr(ctx, rb);
   2260            gen_cvtlq(vc, vb);
   2261            break;
   2262        case 0x020:
   2263            /* CPYS */
   2264            REQUIRE_FEN;
   2265            if (rc == 31) {
   2266                /* Special case CPYS as FNOP.  */
   2267            } else {
   2268                vc = dest_fpr(ctx, rc);
   2269                va = load_fpr(ctx, ra);
   2270                if (ra == rb) {
   2271                    /* Special case CPYS as FMOV.  */
   2272                    tcg_gen_mov_i64(vc, va);
   2273                } else {
   2274                    vb = load_fpr(ctx, rb);
   2275                    gen_cpy_mask(vc, va, vb, 0, 0x8000000000000000ULL);
   2276                }
   2277            }
   2278            break;
   2279        case 0x021:
   2280            /* CPYSN */
   2281            REQUIRE_FEN;
   2282            vc = dest_fpr(ctx, rc);
   2283            vb = load_fpr(ctx, rb);
   2284            va = load_fpr(ctx, ra);
   2285            gen_cpy_mask(vc, va, vb, 1, 0x8000000000000000ULL);
   2286            break;
   2287        case 0x022:
   2288            /* CPYSE */
   2289            REQUIRE_FEN;
   2290            vc = dest_fpr(ctx, rc);
   2291            vb = load_fpr(ctx, rb);
   2292            va = load_fpr(ctx, ra);
   2293            gen_cpy_mask(vc, va, vb, 0, 0xFFF0000000000000ULL);
   2294            break;
   2295        case 0x024:
   2296            /* MT_FPCR */
   2297            REQUIRE_FEN;
   2298            va = load_fpr(ctx, ra);
   2299            gen_helper_store_fpcr(cpu_env, va);
   2300            if (ctx->tb_rm == QUAL_RM_D) {
   2301                /* Re-do the copy of the rounding mode to fp_status
   2302                   the next time we use dynamic rounding.  */
   2303                ctx->tb_rm = -1;
   2304            }
   2305            break;
   2306        case 0x025:
   2307            /* MF_FPCR */
   2308            REQUIRE_FEN;
   2309            va = dest_fpr(ctx, ra);
   2310            gen_helper_load_fpcr(va, cpu_env);
   2311            break;
   2312        case 0x02A:
   2313            /* FCMOVEQ */
   2314            REQUIRE_FEN;
   2315            gen_fcmov(ctx, TCG_COND_EQ, ra, rb, rc);
   2316            break;
   2317        case 0x02B:
   2318            /* FCMOVNE */
   2319            REQUIRE_FEN;
   2320            gen_fcmov(ctx, TCG_COND_NE, ra, rb, rc);
   2321            break;
   2322        case 0x02C:
   2323            /* FCMOVLT */
   2324            REQUIRE_FEN;
   2325            gen_fcmov(ctx, TCG_COND_LT, ra, rb, rc);
   2326            break;
   2327        case 0x02D:
   2328            /* FCMOVGE */
   2329            REQUIRE_FEN;
   2330            gen_fcmov(ctx, TCG_COND_GE, ra, rb, rc);
   2331            break;
   2332        case 0x02E:
   2333            /* FCMOVLE */
   2334            REQUIRE_FEN;
   2335            gen_fcmov(ctx, TCG_COND_LE, ra, rb, rc);
   2336            break;
   2337        case 0x02F:
   2338            /* FCMOVGT */
   2339            REQUIRE_FEN;
   2340            gen_fcmov(ctx, TCG_COND_GT, ra, rb, rc);
   2341            break;
   2342        case 0x030: /* CVTQL */
   2343        case 0x130: /* CVTQL/V */
   2344        case 0x530: /* CVTQL/SV */
   2345            REQUIRE_REG_31(ra);
   2346            REQUIRE_FEN;
   2347            vc = dest_fpr(ctx, rc);
   2348            vb = load_fpr(ctx, rb);
   2349            gen_helper_cvtql(vc, cpu_env, vb);
   2350            gen_fp_exc_raise(rc, fn11);
   2351            break;
   2352        default:
   2353            goto invalid_opc;
   2354        }
   2355        break;
   2356
   2357    case 0x18:
   2358        switch ((uint16_t)disp16) {
   2359        case 0x0000:
   2360            /* TRAPB */
   2361            /* No-op.  */
   2362            break;
   2363        case 0x0400:
   2364            /* EXCB */
   2365            /* No-op.  */
   2366            break;
   2367        case 0x4000:
   2368            /* MB */
   2369            tcg_gen_mb(TCG_MO_ALL | TCG_BAR_SC);
   2370            break;
   2371        case 0x4400:
   2372            /* WMB */
   2373            tcg_gen_mb(TCG_MO_ST_ST | TCG_BAR_SC);
   2374            break;
   2375        case 0x8000:
   2376            /* FETCH */
   2377            /* No-op */
   2378            break;
   2379        case 0xA000:
   2380            /* FETCH_M */
   2381            /* No-op */
   2382            break;
   2383        case 0xC000:
   2384            /* RPCC */
   2385            va = dest_gpr(ctx, ra);
   2386            if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
   2387                gen_io_start();
   2388                gen_helper_load_pcc(va, cpu_env);
   2389                ret = DISAS_PC_STALE;
   2390            } else {
   2391                gen_helper_load_pcc(va, cpu_env);
   2392            }
   2393            break;
   2394        case 0xE000:
   2395            /* RC */
   2396            gen_rx(ctx, ra, 0);
   2397            break;
   2398        case 0xE800:
   2399            /* ECB */
   2400            break;
   2401        case 0xF000:
   2402            /* RS */
   2403            gen_rx(ctx, ra, 1);
   2404            break;
   2405        case 0xF800:
   2406            /* WH64 */
   2407            /* No-op */
   2408            break;
   2409        case 0xFC00:
   2410            /* WH64EN */
   2411            /* No-op */
   2412            break;
   2413        default:
   2414            goto invalid_opc;
   2415        }
   2416        break;
   2417
   2418    case 0x19:
   2419        /* HW_MFPR (PALcode) */
   2420#ifndef CONFIG_USER_ONLY
   2421        REQUIRE_TB_FLAG(ENV_FLAG_PAL_MODE);
   2422        va = dest_gpr(ctx, ra);
   2423        ret = gen_mfpr(ctx, va, insn & 0xffff);
   2424        break;
   2425#else
   2426        goto invalid_opc;
   2427#endif
   2428
   2429    case 0x1A:
   2430        /* JMP, JSR, RET, JSR_COROUTINE.  These only differ by the branch
   2431           prediction stack action, which of course we don't implement.  */
   2432        vb = load_gpr(ctx, rb);
   2433        tcg_gen_andi_i64(cpu_pc, vb, ~3);
   2434        if (ra != 31) {
   2435            tcg_gen_movi_i64(ctx->ir[ra], ctx->base.pc_next);
   2436        }
   2437        ret = DISAS_PC_UPDATED;
   2438        break;
   2439
   2440    case 0x1B:
   2441        /* HW_LD (PALcode) */
   2442#ifndef CONFIG_USER_ONLY
   2443        REQUIRE_TB_FLAG(ENV_FLAG_PAL_MODE);
   2444        {
   2445            TCGv addr = tcg_temp_new();
   2446            vb = load_gpr(ctx, rb);
   2447            va = dest_gpr(ctx, ra);
   2448
   2449            tcg_gen_addi_i64(addr, vb, disp12);
   2450            switch ((insn >> 12) & 0xF) {
   2451            case 0x0:
   2452                /* Longword physical access (hw_ldl/p) */
   2453                tcg_gen_qemu_ld_i64(va, addr, MMU_PHYS_IDX, MO_LESL);
   2454                break;
   2455            case 0x1:
   2456                /* Quadword physical access (hw_ldq/p) */
   2457                tcg_gen_qemu_ld_i64(va, addr, MMU_PHYS_IDX, MO_LEQ);
   2458                break;
   2459            case 0x2:
   2460                /* Longword physical access with lock (hw_ldl_l/p) */
   2461                gen_qemu_ldl_l(va, addr, MMU_PHYS_IDX);
   2462                break;
   2463            case 0x3:
   2464                /* Quadword physical access with lock (hw_ldq_l/p) */
   2465                gen_qemu_ldq_l(va, addr, MMU_PHYS_IDX);
   2466                break;
   2467            case 0x4:
   2468                /* Longword virtual PTE fetch (hw_ldl/v) */
   2469                goto invalid_opc;
   2470            case 0x5:
   2471                /* Quadword virtual PTE fetch (hw_ldq/v) */
   2472                goto invalid_opc;
   2473                break;
   2474            case 0x6:
   2475                /* Invalid */
   2476                goto invalid_opc;
   2477            case 0x7:
   2478                /* Invaliid */
   2479                goto invalid_opc;
   2480            case 0x8:
   2481                /* Longword virtual access (hw_ldl) */
   2482                goto invalid_opc;
   2483            case 0x9:
   2484                /* Quadword virtual access (hw_ldq) */
   2485                goto invalid_opc;
   2486            case 0xA:
   2487                /* Longword virtual access with protection check (hw_ldl/w) */
   2488                tcg_gen_qemu_ld_i64(va, addr, MMU_KERNEL_IDX, MO_LESL);
   2489                break;
   2490            case 0xB:
   2491                /* Quadword virtual access with protection check (hw_ldq/w) */
   2492                tcg_gen_qemu_ld_i64(va, addr, MMU_KERNEL_IDX, MO_LEQ);
   2493                break;
   2494            case 0xC:
   2495                /* Longword virtual access with alt access mode (hw_ldl/a)*/
   2496                goto invalid_opc;
   2497            case 0xD:
   2498                /* Quadword virtual access with alt access mode (hw_ldq/a) */
   2499                goto invalid_opc;
   2500            case 0xE:
   2501                /* Longword virtual access with alternate access mode and
   2502                   protection checks (hw_ldl/wa) */
   2503                tcg_gen_qemu_ld_i64(va, addr, MMU_USER_IDX, MO_LESL);
   2504                break;
   2505            case 0xF:
   2506                /* Quadword virtual access with alternate access mode and
   2507                   protection checks (hw_ldq/wa) */
   2508                tcg_gen_qemu_ld_i64(va, addr, MMU_USER_IDX, MO_LEQ);
   2509                break;
   2510            }
   2511            tcg_temp_free(addr);
   2512            break;
   2513        }
   2514#else
   2515        goto invalid_opc;
   2516#endif
   2517
   2518    case 0x1C:
   2519        vc = dest_gpr(ctx, rc);
   2520        if (fn7 == 0x70) {
   2521            /* FTOIT */
   2522            REQUIRE_AMASK(FIX);
   2523            REQUIRE_REG_31(rb);
   2524            va = load_fpr(ctx, ra);
   2525            tcg_gen_mov_i64(vc, va);
   2526            break;
   2527        } else if (fn7 == 0x78) {
   2528            /* FTOIS */
   2529            REQUIRE_AMASK(FIX);
   2530            REQUIRE_REG_31(rb);
   2531            t32 = tcg_temp_new_i32();
   2532            va = load_fpr(ctx, ra);
   2533            gen_helper_s_to_memory(t32, va);
   2534            tcg_gen_ext_i32_i64(vc, t32);
   2535            tcg_temp_free_i32(t32);
   2536            break;
   2537        }
   2538
   2539        vb = load_gpr_lit(ctx, rb, lit, islit);
   2540        switch (fn7) {
   2541        case 0x00:
   2542            /* SEXTB */
   2543            REQUIRE_AMASK(BWX);
   2544            REQUIRE_REG_31(ra);
   2545            tcg_gen_ext8s_i64(vc, vb);
   2546            break;
   2547        case 0x01:
   2548            /* SEXTW */
   2549            REQUIRE_AMASK(BWX);
   2550            REQUIRE_REG_31(ra);
   2551            tcg_gen_ext16s_i64(vc, vb);
   2552            break;
   2553        case 0x30:
   2554            /* CTPOP */
   2555            REQUIRE_AMASK(CIX);
   2556            REQUIRE_REG_31(ra);
   2557            REQUIRE_NO_LIT;
   2558            tcg_gen_ctpop_i64(vc, vb);
   2559            break;
   2560        case 0x31:
   2561            /* PERR */
   2562            REQUIRE_AMASK(MVI);
   2563            REQUIRE_NO_LIT;
   2564            va = load_gpr(ctx, ra);
   2565            gen_helper_perr(vc, va, vb);
   2566            break;
   2567        case 0x32:
   2568            /* CTLZ */
   2569            REQUIRE_AMASK(CIX);
   2570            REQUIRE_REG_31(ra);
   2571            REQUIRE_NO_LIT;
   2572            tcg_gen_clzi_i64(vc, vb, 64);
   2573            break;
   2574        case 0x33:
   2575            /* CTTZ */
   2576            REQUIRE_AMASK(CIX);
   2577            REQUIRE_REG_31(ra);
   2578            REQUIRE_NO_LIT;
   2579            tcg_gen_ctzi_i64(vc, vb, 64);
   2580            break;
   2581        case 0x34:
   2582            /* UNPKBW */
   2583            REQUIRE_AMASK(MVI);
   2584            REQUIRE_REG_31(ra);
   2585            REQUIRE_NO_LIT;
   2586            gen_helper_unpkbw(vc, vb);
   2587            break;
   2588        case 0x35:
   2589            /* UNPKBL */
   2590            REQUIRE_AMASK(MVI);
   2591            REQUIRE_REG_31(ra);
   2592            REQUIRE_NO_LIT;
   2593            gen_helper_unpkbl(vc, vb);
   2594            break;
   2595        case 0x36:
   2596            /* PKWB */
   2597            REQUIRE_AMASK(MVI);
   2598            REQUIRE_REG_31(ra);
   2599            REQUIRE_NO_LIT;
   2600            gen_helper_pkwb(vc, vb);
   2601            break;
   2602        case 0x37:
   2603            /* PKLB */
   2604            REQUIRE_AMASK(MVI);
   2605            REQUIRE_REG_31(ra);
   2606            REQUIRE_NO_LIT;
   2607            gen_helper_pklb(vc, vb);
   2608            break;
   2609        case 0x38:
   2610            /* MINSB8 */
   2611            REQUIRE_AMASK(MVI);
   2612            va = load_gpr(ctx, ra);
   2613            gen_helper_minsb8(vc, va, vb);
   2614            break;
   2615        case 0x39:
   2616            /* MINSW4 */
   2617            REQUIRE_AMASK(MVI);
   2618            va = load_gpr(ctx, ra);
   2619            gen_helper_minsw4(vc, va, vb);
   2620            break;
   2621        case 0x3A:
   2622            /* MINUB8 */
   2623            REQUIRE_AMASK(MVI);
   2624            va = load_gpr(ctx, ra);
   2625            gen_helper_minub8(vc, va, vb);
   2626            break;
   2627        case 0x3B:
   2628            /* MINUW4 */
   2629            REQUIRE_AMASK(MVI);
   2630            va = load_gpr(ctx, ra);
   2631            gen_helper_minuw4(vc, va, vb);
   2632            break;
   2633        case 0x3C:
   2634            /* MAXUB8 */
   2635            REQUIRE_AMASK(MVI);
   2636            va = load_gpr(ctx, ra);
   2637            gen_helper_maxub8(vc, va, vb);
   2638            break;
   2639        case 0x3D:
   2640            /* MAXUW4 */
   2641            REQUIRE_AMASK(MVI);
   2642            va = load_gpr(ctx, ra);
   2643            gen_helper_maxuw4(vc, va, vb);
   2644            break;
   2645        case 0x3E:
   2646            /* MAXSB8 */
   2647            REQUIRE_AMASK(MVI);
   2648            va = load_gpr(ctx, ra);
   2649            gen_helper_maxsb8(vc, va, vb);
   2650            break;
   2651        case 0x3F:
   2652            /* MAXSW4 */
   2653            REQUIRE_AMASK(MVI);
   2654            va = load_gpr(ctx, ra);
   2655            gen_helper_maxsw4(vc, va, vb);
   2656            break;
   2657        default:
   2658            goto invalid_opc;
   2659        }
   2660        break;
   2661
   2662    case 0x1D:
   2663        /* HW_MTPR (PALcode) */
   2664#ifndef CONFIG_USER_ONLY
   2665        REQUIRE_TB_FLAG(ENV_FLAG_PAL_MODE);
   2666        vb = load_gpr(ctx, rb);
   2667        ret = gen_mtpr(ctx, vb, insn & 0xffff);
   2668        break;
   2669#else
   2670        goto invalid_opc;
   2671#endif
   2672
   2673    case 0x1E:
   2674        /* HW_RET (PALcode) */
   2675#ifndef CONFIG_USER_ONLY
   2676        REQUIRE_TB_FLAG(ENV_FLAG_PAL_MODE);
   2677        if (rb == 31) {
   2678            /* Pre-EV6 CPUs interpreted this as HW_REI, loading the return
   2679               address from EXC_ADDR.  This turns out to be useful for our
   2680               emulation PALcode, so continue to accept it.  */
   2681            vb = dest_sink(ctx);
   2682            tcg_gen_ld_i64(vb, cpu_env, offsetof(CPUAlphaState, exc_addr));
   2683        } else {
   2684            vb = load_gpr(ctx, rb);
   2685        }
   2686        tcg_gen_movi_i64(cpu_lock_addr, -1);
   2687        st_flag_byte(load_zero(ctx), ENV_FLAG_RX_SHIFT);
   2688        tmp = tcg_temp_new();
   2689        tcg_gen_andi_i64(tmp, vb, 1);
   2690        st_flag_byte(tmp, ENV_FLAG_PAL_SHIFT);
   2691        tcg_temp_free(tmp);
   2692        tcg_gen_andi_i64(cpu_pc, vb, ~3);
   2693        /* Allow interrupts to be recognized right away.  */
   2694        ret = DISAS_PC_UPDATED_NOCHAIN;
   2695        break;
   2696#else
   2697        goto invalid_opc;
   2698#endif
   2699
   2700    case 0x1F:
   2701        /* HW_ST (PALcode) */
   2702#ifndef CONFIG_USER_ONLY
   2703        REQUIRE_TB_FLAG(ENV_FLAG_PAL_MODE);
   2704        {
   2705            switch ((insn >> 12) & 0xF) {
   2706            case 0x0:
   2707                /* Longword physical access */
   2708                va = load_gpr(ctx, ra);
   2709                vb = load_gpr(ctx, rb);
   2710                tmp = tcg_temp_new();
   2711                tcg_gen_addi_i64(tmp, vb, disp12);
   2712                tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LESL);
   2713                tcg_temp_free(tmp);
   2714                break;
   2715            case 0x1:
   2716                /* Quadword physical access */
   2717                va = load_gpr(ctx, ra);
   2718                vb = load_gpr(ctx, rb);
   2719                tmp = tcg_temp_new();
   2720                tcg_gen_addi_i64(tmp, vb, disp12);
   2721                tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LEQ);
   2722                tcg_temp_free(tmp);
   2723                break;
   2724            case 0x2:
   2725                /* Longword physical access with lock */
   2726                ret = gen_store_conditional(ctx, ra, rb, disp12,
   2727                                            MMU_PHYS_IDX, MO_LESL);
   2728                break;
   2729            case 0x3:
   2730                /* Quadword physical access with lock */
   2731                ret = gen_store_conditional(ctx, ra, rb, disp12,
   2732                                            MMU_PHYS_IDX, MO_LEQ);
   2733                break;
   2734            case 0x4:
   2735                /* Longword virtual access */
   2736                goto invalid_opc;
   2737            case 0x5:
   2738                /* Quadword virtual access */
   2739                goto invalid_opc;
   2740            case 0x6:
   2741                /* Invalid */
   2742                goto invalid_opc;
   2743            case 0x7:
   2744                /* Invalid */
   2745                goto invalid_opc;
   2746            case 0x8:
   2747                /* Invalid */
   2748                goto invalid_opc;
   2749            case 0x9:
   2750                /* Invalid */
   2751                goto invalid_opc;
   2752            case 0xA:
   2753                /* Invalid */
   2754                goto invalid_opc;
   2755            case 0xB:
   2756                /* Invalid */
   2757                goto invalid_opc;
   2758            case 0xC:
   2759                /* Longword virtual access with alternate access mode */
   2760                goto invalid_opc;
   2761            case 0xD:
   2762                /* Quadword virtual access with alternate access mode */
   2763                goto invalid_opc;
   2764            case 0xE:
   2765                /* Invalid */
   2766                goto invalid_opc;
   2767            case 0xF:
   2768                /* Invalid */
   2769                goto invalid_opc;
   2770            }
   2771            break;
   2772        }
   2773#else
   2774        goto invalid_opc;
   2775#endif
   2776    case 0x20:
   2777        /* LDF */
   2778        REQUIRE_FEN;
   2779        gen_load_mem(ctx, &gen_qemu_ldf, ra, rb, disp16, 1, 0);
   2780        break;
   2781    case 0x21:
   2782        /* LDG */
   2783        REQUIRE_FEN;
   2784        gen_load_mem(ctx, &gen_qemu_ldg, ra, rb, disp16, 1, 0);
   2785        break;
   2786    case 0x22:
   2787        /* LDS */
   2788        REQUIRE_FEN;
   2789        gen_load_mem(ctx, &gen_qemu_lds, ra, rb, disp16, 1, 0);
   2790        break;
   2791    case 0x23:
   2792        /* LDT */
   2793        REQUIRE_FEN;
   2794        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 1, 0);
   2795        break;
   2796    case 0x24:
   2797        /* STF */
   2798        REQUIRE_FEN;
   2799        gen_store_mem(ctx, &gen_qemu_stf, ra, rb, disp16, 1, 0);
   2800        break;
   2801    case 0x25:
   2802        /* STG */
   2803        REQUIRE_FEN;
   2804        gen_store_mem(ctx, &gen_qemu_stg, ra, rb, disp16, 1, 0);
   2805        break;
   2806    case 0x26:
   2807        /* STS */
   2808        REQUIRE_FEN;
   2809        gen_store_mem(ctx, &gen_qemu_sts, ra, rb, disp16, 1, 0);
   2810        break;
   2811    case 0x27:
   2812        /* STT */
   2813        REQUIRE_FEN;
   2814        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 1, 0);
   2815        break;
   2816    case 0x28:
   2817        /* LDL */
   2818        gen_load_mem(ctx, &tcg_gen_qemu_ld32s, ra, rb, disp16, 0, 0);
   2819        break;
   2820    case 0x29:
   2821        /* LDQ */
   2822        gen_load_mem(ctx, &tcg_gen_qemu_ld64, ra, rb, disp16, 0, 0);
   2823        break;
   2824    case 0x2A:
   2825        /* LDL_L */
   2826        gen_load_mem(ctx, &gen_qemu_ldl_l, ra, rb, disp16, 0, 0);
   2827        break;
   2828    case 0x2B:
   2829        /* LDQ_L */
   2830        gen_load_mem(ctx, &gen_qemu_ldq_l, ra, rb, disp16, 0, 0);
   2831        break;
   2832    case 0x2C:
   2833        /* STL */
   2834        gen_store_mem(ctx, &tcg_gen_qemu_st32, ra, rb, disp16, 0, 0);
   2835        break;
   2836    case 0x2D:
   2837        /* STQ */
   2838        gen_store_mem(ctx, &tcg_gen_qemu_st64, ra, rb, disp16, 0, 0);
   2839        break;
   2840    case 0x2E:
   2841        /* STL_C */
   2842        ret = gen_store_conditional(ctx, ra, rb, disp16,
   2843                                    ctx->mem_idx, MO_LESL);
   2844        break;
   2845    case 0x2F:
   2846        /* STQ_C */
   2847        ret = gen_store_conditional(ctx, ra, rb, disp16,
   2848                                    ctx->mem_idx, MO_LEQ);
   2849        break;
   2850    case 0x30:
   2851        /* BR */
   2852        ret = gen_bdirect(ctx, ra, disp21);
   2853        break;
   2854    case 0x31: /* FBEQ */
   2855        REQUIRE_FEN;
   2856        ret = gen_fbcond(ctx, TCG_COND_EQ, ra, disp21);
   2857        break;
   2858    case 0x32: /* FBLT */
   2859        REQUIRE_FEN;
   2860        ret = gen_fbcond(ctx, TCG_COND_LT, ra, disp21);
   2861        break;
   2862    case 0x33: /* FBLE */
   2863        REQUIRE_FEN;
   2864        ret = gen_fbcond(ctx, TCG_COND_LE, ra, disp21);
   2865        break;
   2866    case 0x34:
   2867        /* BSR */
   2868        ret = gen_bdirect(ctx, ra, disp21);
   2869        break;
   2870    case 0x35: /* FBNE */
   2871        REQUIRE_FEN;
   2872        ret = gen_fbcond(ctx, TCG_COND_NE, ra, disp21);
   2873        break;
   2874    case 0x36: /* FBGE */
   2875        REQUIRE_FEN;
   2876        ret = gen_fbcond(ctx, TCG_COND_GE, ra, disp21);
   2877        break;
   2878    case 0x37: /* FBGT */
   2879        REQUIRE_FEN;
   2880        ret = gen_fbcond(ctx, TCG_COND_GT, ra, disp21);
   2881        break;
   2882    case 0x38:
   2883        /* BLBC */
   2884        ret = gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 1);
   2885        break;
   2886    case 0x39:
   2887        /* BEQ */
   2888        ret = gen_bcond(ctx, TCG_COND_EQ, ra, disp21, 0);
   2889        break;
   2890    case 0x3A:
   2891        /* BLT */
   2892        ret = gen_bcond(ctx, TCG_COND_LT, ra, disp21, 0);
   2893        break;
   2894    case 0x3B:
   2895        /* BLE */
   2896        ret = gen_bcond(ctx, TCG_COND_LE, ra, disp21, 0);
   2897        break;
   2898    case 0x3C:
   2899        /* BLBS */
   2900        ret = gen_bcond(ctx, TCG_COND_NE, ra, disp21, 1);
   2901        break;
   2902    case 0x3D:
   2903        /* BNE */
   2904        ret = gen_bcond(ctx, TCG_COND_NE, ra, disp21, 0);
   2905        break;
   2906    case 0x3E:
   2907        /* BGE */
   2908        ret = gen_bcond(ctx, TCG_COND_GE, ra, disp21, 0);
   2909        break;
   2910    case 0x3F:
   2911        /* BGT */
   2912        ret = gen_bcond(ctx, TCG_COND_GT, ra, disp21, 0);
   2913        break;
   2914    invalid_opc:
   2915        ret = gen_invalid(ctx);
   2916        break;
   2917    raise_fen:
   2918        ret = gen_excp(ctx, EXCP_FEN, 0);
   2919        break;
   2920    }
   2921
   2922    return ret;
   2923}
   2924
   2925static void alpha_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
   2926{
   2927    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2928    CPUAlphaState *env = cpu->env_ptr;
   2929    int64_t bound;
   2930
   2931    ctx->tbflags = ctx->base.tb->flags;
   2932    ctx->mem_idx = cpu_mmu_index(env, false);
   2933    ctx->implver = env->implver;
   2934    ctx->amask = env->amask;
   2935
   2936#ifdef CONFIG_USER_ONLY
   2937    ctx->ir = cpu_std_ir;
   2938#else
   2939    ctx->palbr = env->palbr;
   2940    ctx->ir = (ctx->tbflags & ENV_FLAG_PAL_MODE ? cpu_pal_ir : cpu_std_ir);
   2941#endif
   2942
   2943    /* ??? Every TB begins with unset rounding mode, to be initialized on
   2944       the first fp insn of the TB.  Alternately we could define a proper
   2945       default for every TB (e.g. QUAL_RM_N or QUAL_RM_D) and make sure
   2946       to reset the FP_STATUS to that default at the end of any TB that
   2947       changes the default.  We could even (gasp) dynamiclly figure out
   2948       what default would be most efficient given the running program.  */
   2949    ctx->tb_rm = -1;
   2950    /* Similarly for flush-to-zero.  */
   2951    ctx->tb_ftz = -1;
   2952
   2953    ctx->zero = NULL;
   2954    ctx->sink = NULL;
   2955
   2956    /* Bound the number of insns to execute to those left on the page.  */
   2957    bound = -(ctx->base.pc_first | TARGET_PAGE_MASK) / 4;
   2958    ctx->base.max_insns = MIN(ctx->base.max_insns, bound);
   2959}
   2960
   2961static void alpha_tr_tb_start(DisasContextBase *db, CPUState *cpu)
   2962{
   2963}
   2964
   2965static void alpha_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
   2966{
   2967    tcg_gen_insn_start(dcbase->pc_next);
   2968}
   2969
   2970static void alpha_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
   2971{
   2972    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2973    CPUAlphaState *env = cpu->env_ptr;
   2974    uint32_t insn = translator_ldl(env, &ctx->base, ctx->base.pc_next);
   2975
   2976    ctx->base.pc_next += 4;
   2977    ctx->base.is_jmp = translate_one(ctx, insn);
   2978
   2979    free_context_temps(ctx);
   2980    translator_loop_temp_check(&ctx->base);
   2981}
   2982
   2983static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
   2984{
   2985    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2986
   2987    switch (ctx->base.is_jmp) {
   2988    case DISAS_NORETURN:
   2989        break;
   2990    case DISAS_TOO_MANY:
   2991        if (use_goto_tb(ctx, ctx->base.pc_next)) {
   2992            tcg_gen_goto_tb(0);
   2993            tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
   2994            tcg_gen_exit_tb(ctx->base.tb, 0);
   2995        }
   2996        /* FALLTHRU */
   2997    case DISAS_PC_STALE:
   2998        tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
   2999        /* FALLTHRU */
   3000    case DISAS_PC_UPDATED:
   3001        if (!ctx->base.singlestep_enabled) {
   3002            tcg_gen_lookup_and_goto_ptr();
   3003            break;
   3004        }
   3005        /* FALLTHRU */
   3006    case DISAS_PC_UPDATED_NOCHAIN:
   3007        if (ctx->base.singlestep_enabled) {
   3008            gen_excp_1(EXCP_DEBUG, 0);
   3009        } else {
   3010            tcg_gen_exit_tb(NULL, 0);
   3011        }
   3012        break;
   3013    default:
   3014        g_assert_not_reached();
   3015    }
   3016}
   3017
   3018static void alpha_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
   3019{
   3020    qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
   3021    log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
   3022}
   3023
   3024static const TranslatorOps alpha_tr_ops = {
   3025    .init_disas_context = alpha_tr_init_disas_context,
   3026    .tb_start           = alpha_tr_tb_start,
   3027    .insn_start         = alpha_tr_insn_start,
   3028    .translate_insn     = alpha_tr_translate_insn,
   3029    .tb_stop            = alpha_tr_tb_stop,
   3030    .disas_log          = alpha_tr_disas_log,
   3031};
   3032
   3033void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int max_insns)
   3034{
   3035    DisasContext dc;
   3036    translator_loop(&alpha_tr_ops, &dc.base, cpu, tb, max_insns);
   3037}
   3038
   3039void restore_state_to_opc(CPUAlphaState *env, TranslationBlock *tb,
   3040                          target_ulong *data)
   3041{
   3042    env->pc = data[0];
   3043}