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 (88946B)


      1/*
      2 * QEMU AVR CPU
      3 *
      4 * Copyright (c) 2019-2020 Michael Rolnik
      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
     18 * <http://www.gnu.org/licenses/lgpl-2.1.html>
     19 */
     20
     21#include "qemu/osdep.h"
     22#include "qemu/qemu-print.h"
     23#include "tcg/tcg.h"
     24#include "cpu.h"
     25#include "exec/exec-all.h"
     26#include "tcg/tcg-op.h"
     27#include "exec/cpu_ldst.h"
     28#include "exec/helper-proto.h"
     29#include "exec/helper-gen.h"
     30#include "exec/log.h"
     31#include "exec/translator.h"
     32#include "exec/gen-icount.h"
     33
     34/*
     35 *  Define if you want a BREAK instruction translated to a breakpoint
     36 *  Active debugging connection is assumed
     37 *  This is for
     38 *  https://github.com/seharris/qemu-avr-tests/tree/master/instruction-tests
     39 *  tests
     40 */
     41#undef BREAKPOINT_ON_BREAK
     42
     43static TCGv cpu_pc;
     44
     45static TCGv cpu_Cf;
     46static TCGv cpu_Zf;
     47static TCGv cpu_Nf;
     48static TCGv cpu_Vf;
     49static TCGv cpu_Sf;
     50static TCGv cpu_Hf;
     51static TCGv cpu_Tf;
     52static TCGv cpu_If;
     53
     54static TCGv cpu_rampD;
     55static TCGv cpu_rampX;
     56static TCGv cpu_rampY;
     57static TCGv cpu_rampZ;
     58
     59static TCGv cpu_r[NUMBER_OF_CPU_REGISTERS];
     60static TCGv cpu_eind;
     61static TCGv cpu_sp;
     62
     63static TCGv cpu_skip;
     64
     65static const char reg_names[NUMBER_OF_CPU_REGISTERS][8] = {
     66    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
     67    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",
     68    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
     69    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
     70};
     71#define REG(x) (cpu_r[x])
     72
     73#define DISAS_EXIT   DISAS_TARGET_0  /* We want return to the cpu main loop.  */
     74#define DISAS_LOOKUP DISAS_TARGET_1  /* We have a variable condition exit.  */
     75#define DISAS_CHAIN  DISAS_TARGET_2  /* We have a single condition exit.  */
     76
     77typedef struct DisasContext DisasContext;
     78
     79/* This is the state at translation time. */
     80struct DisasContext {
     81    DisasContextBase base;
     82
     83    CPUAVRState *env;
     84    CPUState *cs;
     85
     86    target_long npc;
     87    uint32_t opcode;
     88
     89    /* Routine used to access memory */
     90    int memidx;
     91
     92    /*
     93     * some AVR instructions can make the following instruction to be skipped
     94     * Let's name those instructions
     95     *     A   - instruction that can skip the next one
     96     *     B   - instruction that can be skipped. this depends on execution of A
     97     * there are two scenarios
     98     * 1. A and B belong to the same translation block
     99     * 2. A is the last instruction in the translation block and B is the last
    100     *
    101     * following variables are used to simplify the skipping logic, they are
    102     * used in the following manner (sketch)
    103     *
    104     * TCGLabel *skip_label = NULL;
    105     * if (ctx->skip_cond != TCG_COND_NEVER) {
    106     *     skip_label = gen_new_label();
    107     *     tcg_gen_brcond_tl(skip_cond, skip_var0, skip_var1, skip_label);
    108     * }
    109     *
    110     * if (free_skip_var0) {
    111     *     tcg_temp_free(skip_var0);
    112     *     free_skip_var0 = false;
    113     * }
    114     *
    115     * translate(ctx);
    116     *
    117     * if (skip_label) {
    118     *     gen_set_label(skip_label);
    119     * }
    120     */
    121    TCGv skip_var0;
    122    TCGv skip_var1;
    123    TCGCond skip_cond;
    124    bool free_skip_var0;
    125};
    126
    127void avr_cpu_tcg_init(void)
    128{
    129    int i;
    130
    131#define AVR_REG_OFFS(x) offsetof(CPUAVRState, x)
    132    cpu_pc = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(pc_w), "pc");
    133    cpu_Cf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregC), "Cf");
    134    cpu_Zf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregZ), "Zf");
    135    cpu_Nf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregN), "Nf");
    136    cpu_Vf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregV), "Vf");
    137    cpu_Sf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregS), "Sf");
    138    cpu_Hf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregH), "Hf");
    139    cpu_Tf = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregT), "Tf");
    140    cpu_If = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sregI), "If");
    141    cpu_rampD = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampD), "rampD");
    142    cpu_rampX = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampX), "rampX");
    143    cpu_rampY = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampY), "rampY");
    144    cpu_rampZ = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(rampZ), "rampZ");
    145    cpu_eind = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(eind), "eind");
    146    cpu_sp = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(sp), "sp");
    147    cpu_skip = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(skip), "skip");
    148
    149    for (i = 0; i < NUMBER_OF_CPU_REGISTERS; i++) {
    150        cpu_r[i] = tcg_global_mem_new_i32(cpu_env, AVR_REG_OFFS(r[i]),
    151                                          reg_names[i]);
    152    }
    153#undef AVR_REG_OFFS
    154}
    155
    156static int to_regs_16_31_by_one(DisasContext *ctx, int indx)
    157{
    158    return 16 + (indx % 16);
    159}
    160
    161static int to_regs_16_23_by_one(DisasContext *ctx, int indx)
    162{
    163    return 16 + (indx % 8);
    164}
    165
    166static int to_regs_24_30_by_two(DisasContext *ctx, int indx)
    167{
    168    return 24 + (indx % 4) * 2;
    169}
    170
    171static int to_regs_00_30_by_two(DisasContext *ctx, int indx)
    172{
    173    return (indx % 16) * 2;
    174}
    175
    176static uint16_t next_word(DisasContext *ctx)
    177{
    178    return cpu_lduw_code(ctx->env, ctx->npc++ * 2);
    179}
    180
    181static int append_16(DisasContext *ctx, int x)
    182{
    183    return x << 16 | next_word(ctx);
    184}
    185
    186static bool avr_have_feature(DisasContext *ctx, int feature)
    187{
    188    if (!avr_feature(ctx->env, feature)) {
    189        gen_helper_unsupported(cpu_env);
    190        ctx->base.is_jmp = DISAS_NORETURN;
    191        return false;
    192    }
    193    return true;
    194}
    195
    196static bool decode_insn(DisasContext *ctx, uint16_t insn);
    197#include "decode-insn.c.inc"
    198
    199/*
    200 * Arithmetic Instructions
    201 */
    202
    203/*
    204 * Utility functions for updating status registers:
    205 *
    206 *   - gen_add_CHf()
    207 *   - gen_add_Vf()
    208 *   - gen_sub_CHf()
    209 *   - gen_sub_Vf()
    210 *   - gen_NSf()
    211 *   - gen_ZNSf()
    212 *
    213 */
    214
    215static void gen_add_CHf(TCGv R, TCGv Rd, TCGv Rr)
    216{
    217    TCGv t1 = tcg_temp_new_i32();
    218    TCGv t2 = tcg_temp_new_i32();
    219    TCGv t3 = tcg_temp_new_i32();
    220
    221    tcg_gen_and_tl(t1, Rd, Rr); /* t1 = Rd & Rr */
    222    tcg_gen_andc_tl(t2, Rd, R); /* t2 = Rd & ~R */
    223    tcg_gen_andc_tl(t3, Rr, R); /* t3 = Rr & ~R */
    224    tcg_gen_or_tl(t1, t1, t2); /* t1 = t1 | t2 | t3 */
    225    tcg_gen_or_tl(t1, t1, t3);
    226
    227    tcg_gen_shri_tl(cpu_Cf, t1, 7); /* Cf = t1(7) */
    228    tcg_gen_shri_tl(cpu_Hf, t1, 3); /* Hf = t1(3) */
    229    tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
    230
    231    tcg_temp_free_i32(t3);
    232    tcg_temp_free_i32(t2);
    233    tcg_temp_free_i32(t1);
    234}
    235
    236static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr)
    237{
    238    TCGv t1 = tcg_temp_new_i32();
    239    TCGv t2 = tcg_temp_new_i32();
    240
    241    /* t1 = Rd & Rr & ~R | ~Rd & ~Rr & R */
    242    /*    = (Rd ^ R) & ~(Rd ^ Rr) */
    243    tcg_gen_xor_tl(t1, Rd, R);
    244    tcg_gen_xor_tl(t2, Rd, Rr);
    245    tcg_gen_andc_tl(t1, t1, t2);
    246
    247    tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
    248
    249    tcg_temp_free_i32(t2);
    250    tcg_temp_free_i32(t1);
    251}
    252
    253static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr)
    254{
    255    TCGv t1 = tcg_temp_new_i32();
    256    TCGv t2 = tcg_temp_new_i32();
    257    TCGv t3 = tcg_temp_new_i32();
    258
    259    tcg_gen_not_tl(t1, Rd); /* t1 = ~Rd */
    260    tcg_gen_and_tl(t2, t1, Rr); /* t2 = ~Rd & Rr */
    261    tcg_gen_or_tl(t3, t1, Rr); /* t3 = (~Rd | Rr) & R */
    262    tcg_gen_and_tl(t3, t3, R);
    263    tcg_gen_or_tl(t2, t2, t3); /* t2 = ~Rd & Rr | ~Rd & R | R & Rr */
    264
    265    tcg_gen_shri_tl(cpu_Cf, t2, 7); /* Cf = t2(7) */
    266    tcg_gen_shri_tl(cpu_Hf, t2, 3); /* Hf = t2(3) */
    267    tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1);
    268
    269    tcg_temp_free_i32(t3);
    270    tcg_temp_free_i32(t2);
    271    tcg_temp_free_i32(t1);
    272}
    273
    274static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr)
    275{
    276    TCGv t1 = tcg_temp_new_i32();
    277    TCGv t2 = tcg_temp_new_i32();
    278
    279    /* t1 = Rd & ~Rr & ~R | ~Rd & Rr & R */
    280    /*    = (Rd ^ R) & (Rd ^ R) */
    281    tcg_gen_xor_tl(t1, Rd, R);
    282    tcg_gen_xor_tl(t2, Rd, Rr);
    283    tcg_gen_and_tl(t1, t1, t2);
    284
    285    tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */
    286
    287    tcg_temp_free_i32(t2);
    288    tcg_temp_free_i32(t1);
    289}
    290
    291static void gen_NSf(TCGv R)
    292{
    293    tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
    294    tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
    295}
    296
    297static void gen_ZNSf(TCGv R)
    298{
    299    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    300
    301    /* update status register */
    302    tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
    303    tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
    304}
    305
    306/*
    307 *  Adds two registers without the C Flag and places the result in the
    308 *  destination register Rd.
    309 */
    310static bool trans_ADD(DisasContext *ctx, arg_ADD *a)
    311{
    312    TCGv Rd = cpu_r[a->rd];
    313    TCGv Rr = cpu_r[a->rr];
    314    TCGv R = tcg_temp_new_i32();
    315
    316    tcg_gen_add_tl(R, Rd, Rr); /* Rd = Rd + Rr */
    317    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    318
    319    /* update status register */
    320    gen_add_CHf(R, Rd, Rr);
    321    gen_add_Vf(R, Rd, Rr);
    322    gen_ZNSf(R);
    323
    324    /* update output registers */
    325    tcg_gen_mov_tl(Rd, R);
    326
    327    tcg_temp_free_i32(R);
    328
    329    return true;
    330}
    331
    332/*
    333 *  Adds two registers and the contents of the C Flag and places the result in
    334 *  the destination register Rd.
    335 */
    336static bool trans_ADC(DisasContext *ctx, arg_ADC *a)
    337{
    338    TCGv Rd = cpu_r[a->rd];
    339    TCGv Rr = cpu_r[a->rr];
    340    TCGv R = tcg_temp_new_i32();
    341
    342    tcg_gen_add_tl(R, Rd, Rr); /* R = Rd + Rr + Cf */
    343    tcg_gen_add_tl(R, R, cpu_Cf);
    344    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    345
    346    /* update status register */
    347    gen_add_CHf(R, Rd, Rr);
    348    gen_add_Vf(R, Rd, Rr);
    349    gen_ZNSf(R);
    350
    351    /* update output registers */
    352    tcg_gen_mov_tl(Rd, R);
    353
    354    tcg_temp_free_i32(R);
    355
    356    return true;
    357}
    358
    359/*
    360 *  Adds an immediate value (0 - 63) to a register pair and places the result
    361 *  in the register pair. This instruction operates on the upper four register
    362 *  pairs, and is well suited for operations on the pointer registers.  This
    363 *  instruction is not available in all devices. Refer to the device specific
    364 *  instruction set summary.
    365 */
    366static bool trans_ADIW(DisasContext *ctx, arg_ADIW *a)
    367{
    368    if (!avr_have_feature(ctx, AVR_FEATURE_ADIW_SBIW)) {
    369        return true;
    370    }
    371
    372    TCGv RdL = cpu_r[a->rd];
    373    TCGv RdH = cpu_r[a->rd + 1];
    374    int Imm = (a->imm);
    375    TCGv R = tcg_temp_new_i32();
    376    TCGv Rd = tcg_temp_new_i32();
    377
    378    tcg_gen_deposit_tl(Rd, RdL, RdH, 8, 8); /* Rd = RdH:RdL */
    379    tcg_gen_addi_tl(R, Rd, Imm); /* R = Rd + Imm */
    380    tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
    381
    382    /* update status register */
    383    tcg_gen_andc_tl(cpu_Cf, Rd, R); /* Cf = Rd & ~R */
    384    tcg_gen_shri_tl(cpu_Cf, cpu_Cf, 15);
    385    tcg_gen_andc_tl(cpu_Vf, R, Rd); /* Vf = R & ~Rd */
    386    tcg_gen_shri_tl(cpu_Vf, cpu_Vf, 15);
    387    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    388    tcg_gen_shri_tl(cpu_Nf, R, 15); /* Nf = R(15) */
    389    tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf);/* Sf = Nf ^ Vf */
    390
    391    /* update output registers */
    392    tcg_gen_andi_tl(RdL, R, 0xff);
    393    tcg_gen_shri_tl(RdH, R, 8);
    394
    395    tcg_temp_free_i32(Rd);
    396    tcg_temp_free_i32(R);
    397
    398    return true;
    399}
    400
    401/*
    402 *  Subtracts two registers and places the result in the destination
    403 *  register Rd.
    404 */
    405static bool trans_SUB(DisasContext *ctx, arg_SUB *a)
    406{
    407    TCGv Rd = cpu_r[a->rd];
    408    TCGv Rr = cpu_r[a->rr];
    409    TCGv R = tcg_temp_new_i32();
    410
    411    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
    412    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    413
    414    /* update status register */
    415    tcg_gen_andc_tl(cpu_Cf, Rd, R); /* Cf = Rd & ~R */
    416    gen_sub_CHf(R, Rd, Rr);
    417    gen_sub_Vf(R, Rd, Rr);
    418    gen_ZNSf(R);
    419
    420    /* update output registers */
    421    tcg_gen_mov_tl(Rd, R);
    422
    423    tcg_temp_free_i32(R);
    424
    425    return true;
    426}
    427
    428/*
    429 *  Subtracts a register and a constant and places the result in the
    430 *  destination register Rd. This instruction is working on Register R16 to R31
    431 *  and is very well suited for operations on the X, Y, and Z-pointers.
    432 */
    433static bool trans_SUBI(DisasContext *ctx, arg_SUBI *a)
    434{
    435    TCGv Rd = cpu_r[a->rd];
    436    TCGv Rr = tcg_const_i32(a->imm);
    437    TCGv R = tcg_temp_new_i32();
    438
    439    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Imm */
    440    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    441
    442    /* update status register */
    443    gen_sub_CHf(R, Rd, Rr);
    444    gen_sub_Vf(R, Rd, Rr);
    445    gen_ZNSf(R);
    446
    447    /* update output registers */
    448    tcg_gen_mov_tl(Rd, R);
    449
    450    tcg_temp_free_i32(R);
    451    tcg_temp_free_i32(Rr);
    452
    453    return true;
    454}
    455
    456/*
    457 *  Subtracts two registers and subtracts with the C Flag and places the
    458 *  result in the destination register Rd.
    459 */
    460static bool trans_SBC(DisasContext *ctx, arg_SBC *a)
    461{
    462    TCGv Rd = cpu_r[a->rd];
    463    TCGv Rr = cpu_r[a->rr];
    464    TCGv R = tcg_temp_new_i32();
    465    TCGv zero = tcg_const_i32(0);
    466
    467    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
    468    tcg_gen_sub_tl(R, R, cpu_Cf);
    469    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    470
    471    /* update status register */
    472    gen_sub_CHf(R, Rd, Rr);
    473    gen_sub_Vf(R, Rd, Rr);
    474    gen_NSf(R);
    475
    476    /*
    477     * Previous value remains unchanged when the result is zero;
    478     * cleared otherwise.
    479     */
    480    tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
    481
    482    /* update output registers */
    483    tcg_gen_mov_tl(Rd, R);
    484
    485    tcg_temp_free_i32(zero);
    486    tcg_temp_free_i32(R);
    487
    488    return true;
    489}
    490
    491/*
    492 *  SBCI -- Subtract Immediate with Carry
    493 */
    494static bool trans_SBCI(DisasContext *ctx, arg_SBCI *a)
    495{
    496    TCGv Rd = cpu_r[a->rd];
    497    TCGv Rr = tcg_const_i32(a->imm);
    498    TCGv R = tcg_temp_new_i32();
    499    TCGv zero = tcg_const_i32(0);
    500
    501    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
    502    tcg_gen_sub_tl(R, R, cpu_Cf);
    503    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    504
    505    /* update status register */
    506    gen_sub_CHf(R, Rd, Rr);
    507    gen_sub_Vf(R, Rd, Rr);
    508    gen_NSf(R);
    509
    510    /*
    511     * Previous value remains unchanged when the result is zero;
    512     * cleared otherwise.
    513     */
    514    tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
    515
    516    /* update output registers */
    517    tcg_gen_mov_tl(Rd, R);
    518
    519    tcg_temp_free_i32(zero);
    520    tcg_temp_free_i32(R);
    521    tcg_temp_free_i32(Rr);
    522
    523    return true;
    524}
    525
    526/*
    527 *  Subtracts an immediate value (0-63) from a register pair and places the
    528 *  result in the register pair. This instruction operates on the upper four
    529 *  register pairs, and is well suited for operations on the Pointer Registers.
    530 *  This instruction is not available in all devices. Refer to the device
    531 *  specific instruction set summary.
    532 */
    533static bool trans_SBIW(DisasContext *ctx, arg_SBIW *a)
    534{
    535    if (!avr_have_feature(ctx, AVR_FEATURE_ADIW_SBIW)) {
    536        return true;
    537    }
    538
    539    TCGv RdL = cpu_r[a->rd];
    540    TCGv RdH = cpu_r[a->rd + 1];
    541    int Imm = (a->imm);
    542    TCGv R = tcg_temp_new_i32();
    543    TCGv Rd = tcg_temp_new_i32();
    544
    545    tcg_gen_deposit_tl(Rd, RdL, RdH, 8, 8); /* Rd = RdH:RdL */
    546    tcg_gen_subi_tl(R, Rd, Imm); /* R = Rd - Imm */
    547    tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
    548
    549    /* update status register */
    550    tcg_gen_andc_tl(cpu_Cf, R, Rd);
    551    tcg_gen_shri_tl(cpu_Cf, cpu_Cf, 15); /* Cf = R & ~Rd */
    552    tcg_gen_andc_tl(cpu_Vf, Rd, R);
    553    tcg_gen_shri_tl(cpu_Vf, cpu_Vf, 15); /* Vf = Rd & ~R */
    554    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    555    tcg_gen_shri_tl(cpu_Nf, R, 15); /* Nf = R(15) */
    556    tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
    557
    558    /* update output registers */
    559    tcg_gen_andi_tl(RdL, R, 0xff);
    560    tcg_gen_shri_tl(RdH, R, 8);
    561
    562    tcg_temp_free_i32(Rd);
    563    tcg_temp_free_i32(R);
    564
    565    return true;
    566}
    567
    568/*
    569 *  Performs the logical AND between the contents of register Rd and register
    570 *  Rr and places the result in the destination register Rd.
    571 */
    572static bool trans_AND(DisasContext *ctx, arg_AND *a)
    573{
    574    TCGv Rd = cpu_r[a->rd];
    575    TCGv Rr = cpu_r[a->rr];
    576    TCGv R = tcg_temp_new_i32();
    577
    578    tcg_gen_and_tl(R, Rd, Rr); /* Rd = Rd and Rr */
    579
    580    /* update status register */
    581    tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */
    582    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    583    gen_ZNSf(R);
    584
    585    /* update output registers */
    586    tcg_gen_mov_tl(Rd, R);
    587
    588    tcg_temp_free_i32(R);
    589
    590    return true;
    591}
    592
    593/*
    594 *  Performs the logical AND between the contents of register Rd and a constant
    595 *  and places the result in the destination register Rd.
    596 */
    597static bool trans_ANDI(DisasContext *ctx, arg_ANDI *a)
    598{
    599    TCGv Rd = cpu_r[a->rd];
    600    int Imm = (a->imm);
    601
    602    tcg_gen_andi_tl(Rd, Rd, Imm); /* Rd = Rd & Imm */
    603
    604    /* update status register */
    605    tcg_gen_movi_tl(cpu_Vf, 0x00); /* Vf = 0 */
    606    gen_ZNSf(Rd);
    607
    608    return true;
    609}
    610
    611/*
    612 *  Performs the logical OR between the contents of register Rd and register
    613 *  Rr and places the result in the destination register Rd.
    614 */
    615static bool trans_OR(DisasContext *ctx, arg_OR *a)
    616{
    617    TCGv Rd = cpu_r[a->rd];
    618    TCGv Rr = cpu_r[a->rr];
    619    TCGv R = tcg_temp_new_i32();
    620
    621    tcg_gen_or_tl(R, Rd, Rr);
    622
    623    /* update status register */
    624    tcg_gen_movi_tl(cpu_Vf, 0);
    625    gen_ZNSf(R);
    626
    627    /* update output registers */
    628    tcg_gen_mov_tl(Rd, R);
    629
    630    tcg_temp_free_i32(R);
    631
    632    return true;
    633}
    634
    635/*
    636 *  Performs the logical OR between the contents of register Rd and a
    637 *  constant and places the result in the destination register Rd.
    638 */
    639static bool trans_ORI(DisasContext *ctx, arg_ORI *a)
    640{
    641    TCGv Rd = cpu_r[a->rd];
    642    int Imm = (a->imm);
    643
    644    tcg_gen_ori_tl(Rd, Rd, Imm); /* Rd = Rd | Imm */
    645
    646    /* update status register */
    647    tcg_gen_movi_tl(cpu_Vf, 0x00); /* Vf = 0 */
    648    gen_ZNSf(Rd);
    649
    650    return true;
    651}
    652
    653/*
    654 *  Performs the logical EOR between the contents of register Rd and
    655 *  register Rr and places the result in the destination register Rd.
    656 */
    657static bool trans_EOR(DisasContext *ctx, arg_EOR *a)
    658{
    659    TCGv Rd = cpu_r[a->rd];
    660    TCGv Rr = cpu_r[a->rr];
    661
    662    tcg_gen_xor_tl(Rd, Rd, Rr);
    663
    664    /* update status register */
    665    tcg_gen_movi_tl(cpu_Vf, 0);
    666    gen_ZNSf(Rd);
    667
    668    return true;
    669}
    670
    671/*
    672 *  Clears the specified bits in register Rd. Performs the logical AND
    673 *  between the contents of register Rd and the complement of the constant mask
    674 *  K. The result will be placed in register Rd.
    675 */
    676static bool trans_COM(DisasContext *ctx, arg_COM *a)
    677{
    678    TCGv Rd = cpu_r[a->rd];
    679    TCGv R = tcg_temp_new_i32();
    680
    681    tcg_gen_xori_tl(Rd, Rd, 0xff);
    682
    683    /* update status register */
    684    tcg_gen_movi_tl(cpu_Cf, 1); /* Cf = 1 */
    685    tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */
    686    gen_ZNSf(Rd);
    687
    688    tcg_temp_free_i32(R);
    689
    690    return true;
    691}
    692
    693/*
    694 *  Replaces the contents of register Rd with its two's complement; the
    695 *  value $80 is left unchanged.
    696 */
    697static bool trans_NEG(DisasContext *ctx, arg_NEG *a)
    698{
    699    TCGv Rd = cpu_r[a->rd];
    700    TCGv t0 = tcg_const_i32(0);
    701    TCGv R = tcg_temp_new_i32();
    702
    703    tcg_gen_sub_tl(R, t0, Rd); /* R = 0 - Rd */
    704    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
    705
    706    /* update status register */
    707    gen_sub_CHf(R, t0, Rd);
    708    gen_sub_Vf(R, t0, Rd);
    709    gen_ZNSf(R);
    710
    711    /* update output registers */
    712    tcg_gen_mov_tl(Rd, R);
    713
    714    tcg_temp_free_i32(t0);
    715    tcg_temp_free_i32(R);
    716
    717    return true;
    718}
    719
    720/*
    721 *  Adds one -1- to the contents of register Rd and places the result in the
    722 *  destination register Rd.  The C Flag in SREG is not affected by the
    723 *  operation, thus allowing the INC instruction to be used on a loop counter in
    724 *  multiple-precision computations.  When operating on unsigned numbers, only
    725 *  BREQ and BRNE branches can be expected to perform consistently. When
    726 *  operating on two's complement values, all signed branches are available.
    727 */
    728static bool trans_INC(DisasContext *ctx, arg_INC *a)
    729{
    730    TCGv Rd = cpu_r[a->rd];
    731
    732    tcg_gen_addi_tl(Rd, Rd, 1);
    733    tcg_gen_andi_tl(Rd, Rd, 0xff);
    734
    735    /* update status register */
    736    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Vf, Rd, 0x80); /* Vf = Rd == 0x80 */
    737    gen_ZNSf(Rd);
    738
    739    return true;
    740}
    741
    742/*
    743 *  Subtracts one -1- from the contents of register Rd and places the result
    744 *  in the destination register Rd.  The C Flag in SREG is not affected by the
    745 *  operation, thus allowing the DEC instruction to be used on a loop counter in
    746 *  multiple-precision computations.  When operating on unsigned values, only
    747 *  BREQ and BRNE branches can be expected to perform consistently.  When
    748 *  operating on two's complement values, all signed branches are available.
    749 */
    750static bool trans_DEC(DisasContext *ctx, arg_DEC *a)
    751{
    752    TCGv Rd = cpu_r[a->rd];
    753
    754    tcg_gen_subi_tl(Rd, Rd, 1); /* Rd = Rd - 1 */
    755    tcg_gen_andi_tl(Rd, Rd, 0xff); /* make it 8 bits */
    756
    757    /* update status register */
    758    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Vf, Rd, 0x7f); /* Vf = Rd == 0x7f */
    759    gen_ZNSf(Rd);
    760
    761    return true;
    762}
    763
    764/*
    765 *  This instruction performs 8-bit x 8-bit -> 16-bit unsigned multiplication.
    766 */
    767static bool trans_MUL(DisasContext *ctx, arg_MUL *a)
    768{
    769    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    770        return true;
    771    }
    772
    773    TCGv R0 = cpu_r[0];
    774    TCGv R1 = cpu_r[1];
    775    TCGv Rd = cpu_r[a->rd];
    776    TCGv Rr = cpu_r[a->rr];
    777    TCGv R = tcg_temp_new_i32();
    778
    779    tcg_gen_mul_tl(R, Rd, Rr); /* R = Rd * Rr */
    780    tcg_gen_andi_tl(R0, R, 0xff);
    781    tcg_gen_shri_tl(R1, R, 8);
    782
    783    /* update status register */
    784    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    785    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    786
    787    tcg_temp_free_i32(R);
    788
    789    return true;
    790}
    791
    792/*
    793 *  This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication.
    794 */
    795static bool trans_MULS(DisasContext *ctx, arg_MULS *a)
    796{
    797    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    798        return true;
    799    }
    800
    801    TCGv R0 = cpu_r[0];
    802    TCGv R1 = cpu_r[1];
    803    TCGv Rd = cpu_r[a->rd];
    804    TCGv Rr = cpu_r[a->rr];
    805    TCGv R = tcg_temp_new_i32();
    806    TCGv t0 = tcg_temp_new_i32();
    807    TCGv t1 = tcg_temp_new_i32();
    808
    809    tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
    810    tcg_gen_ext8s_tl(t1, Rr); /* make Rr full 32 bit signed */
    811    tcg_gen_mul_tl(R, t0, t1); /* R = Rd * Rr */
    812    tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
    813    tcg_gen_andi_tl(R0, R, 0xff);
    814    tcg_gen_shri_tl(R1, R, 8);
    815
    816    /* update status register */
    817    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    818    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    819
    820    tcg_temp_free_i32(t1);
    821    tcg_temp_free_i32(t0);
    822    tcg_temp_free_i32(R);
    823
    824    return true;
    825}
    826
    827/*
    828 *  This instruction performs 8-bit x 8-bit -> 16-bit multiplication of a
    829 *  signed and an unsigned number.
    830 */
    831static bool trans_MULSU(DisasContext *ctx, arg_MULSU *a)
    832{
    833    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    834        return true;
    835    }
    836
    837    TCGv R0 = cpu_r[0];
    838    TCGv R1 = cpu_r[1];
    839    TCGv Rd = cpu_r[a->rd];
    840    TCGv Rr = cpu_r[a->rr];
    841    TCGv R = tcg_temp_new_i32();
    842    TCGv t0 = tcg_temp_new_i32();
    843
    844    tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
    845    tcg_gen_mul_tl(R, t0, Rr); /* R = Rd * Rr */
    846    tcg_gen_andi_tl(R, R, 0xffff); /* make R 16 bits */
    847    tcg_gen_andi_tl(R0, R, 0xff);
    848    tcg_gen_shri_tl(R1, R, 8);
    849
    850    /* update status register */
    851    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    852    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    853
    854    tcg_temp_free_i32(t0);
    855    tcg_temp_free_i32(R);
    856
    857    return true;
    858}
    859
    860/*
    861 *  This instruction performs 8-bit x 8-bit -> 16-bit unsigned
    862 *  multiplication and shifts the result one bit left.
    863 */
    864static bool trans_FMUL(DisasContext *ctx, arg_FMUL *a)
    865{
    866    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    867        return true;
    868    }
    869
    870    TCGv R0 = cpu_r[0];
    871    TCGv R1 = cpu_r[1];
    872    TCGv Rd = cpu_r[a->rd];
    873    TCGv Rr = cpu_r[a->rr];
    874    TCGv R = tcg_temp_new_i32();
    875
    876    tcg_gen_mul_tl(R, Rd, Rr); /* R = Rd * Rr */
    877
    878    /* update status register */
    879    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    880    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    881
    882    /* update output registers */
    883    tcg_gen_shli_tl(R, R, 1);
    884    tcg_gen_andi_tl(R0, R, 0xff);
    885    tcg_gen_shri_tl(R1, R, 8);
    886    tcg_gen_andi_tl(R1, R1, 0xff);
    887
    888
    889    tcg_temp_free_i32(R);
    890
    891    return true;
    892}
    893
    894/*
    895 *  This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication
    896 *  and shifts the result one bit left.
    897 */
    898static bool trans_FMULS(DisasContext *ctx, arg_FMULS *a)
    899{
    900    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    901        return true;
    902    }
    903
    904    TCGv R0 = cpu_r[0];
    905    TCGv R1 = cpu_r[1];
    906    TCGv Rd = cpu_r[a->rd];
    907    TCGv Rr = cpu_r[a->rr];
    908    TCGv R = tcg_temp_new_i32();
    909    TCGv t0 = tcg_temp_new_i32();
    910    TCGv t1 = tcg_temp_new_i32();
    911
    912    tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
    913    tcg_gen_ext8s_tl(t1, Rr); /* make Rr full 32 bit signed */
    914    tcg_gen_mul_tl(R, t0, t1); /* R = Rd * Rr */
    915    tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
    916
    917    /* update status register */
    918    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    919    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    920
    921    /* update output registers */
    922    tcg_gen_shli_tl(R, R, 1);
    923    tcg_gen_andi_tl(R0, R, 0xff);
    924    tcg_gen_shri_tl(R1, R, 8);
    925    tcg_gen_andi_tl(R1, R1, 0xff);
    926
    927    tcg_temp_free_i32(t1);
    928    tcg_temp_free_i32(t0);
    929    tcg_temp_free_i32(R);
    930
    931    return true;
    932}
    933
    934/*
    935 *  This instruction performs 8-bit x 8-bit -> 16-bit signed multiplication
    936 *  and shifts the result one bit left.
    937 */
    938static bool trans_FMULSU(DisasContext *ctx, arg_FMULSU *a)
    939{
    940    if (!avr_have_feature(ctx, AVR_FEATURE_MUL)) {
    941        return true;
    942    }
    943
    944    TCGv R0 = cpu_r[0];
    945    TCGv R1 = cpu_r[1];
    946    TCGv Rd = cpu_r[a->rd];
    947    TCGv Rr = cpu_r[a->rr];
    948    TCGv R = tcg_temp_new_i32();
    949    TCGv t0 = tcg_temp_new_i32();
    950
    951    tcg_gen_ext8s_tl(t0, Rd); /* make Rd full 32 bit signed */
    952    tcg_gen_mul_tl(R, t0, Rr); /* R = Rd * Rr */
    953    tcg_gen_andi_tl(R, R, 0xffff); /* make it 16 bits */
    954
    955    /* update status register */
    956    tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */
    957    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
    958
    959    /* update output registers */
    960    tcg_gen_shli_tl(R, R, 1);
    961    tcg_gen_andi_tl(R0, R, 0xff);
    962    tcg_gen_shri_tl(R1, R, 8);
    963    tcg_gen_andi_tl(R1, R1, 0xff);
    964
    965    tcg_temp_free_i32(t0);
    966    tcg_temp_free_i32(R);
    967
    968    return true;
    969}
    970
    971/*
    972 *  The module is an instruction set extension to the AVR CPU, performing
    973 *  DES iterations. The 64-bit data block (plaintext or ciphertext) is placed in
    974 *  the CPU register file, registers R0-R7, where LSB of data is placed in LSB
    975 *  of R0 and MSB of data is placed in MSB of R7. The full 64-bit key (including
    976 *  parity bits) is placed in registers R8- R15, organized in the register file
    977 *  with LSB of key in LSB of R8 and MSB of key in MSB of R15. Executing one DES
    978 *  instruction performs one round in the DES algorithm. Sixteen rounds must be
    979 *  executed in increasing order to form the correct DES ciphertext or
    980 *  plaintext. Intermediate results are stored in the register file (R0-R15)
    981 *  after each DES instruction. The instruction's operand (K) determines which
    982 *  round is executed, and the half carry flag (H) determines whether encryption
    983 *  or decryption is performed.  The DES algorithm is described in
    984 *  "Specifications for the Data Encryption Standard" (Federal Information
    985 *  Processing Standards Publication 46). Intermediate results in this
    986 *  implementation differ from the standard because the initial permutation and
    987 *  the inverse initial permutation are performed each iteration. This does not
    988 *  affect the result in the final ciphertext or plaintext, but reduces
    989 *  execution time.
    990 */
    991static bool trans_DES(DisasContext *ctx, arg_DES *a)
    992{
    993    /* TODO */
    994    if (!avr_have_feature(ctx, AVR_FEATURE_DES)) {
    995        return true;
    996    }
    997
    998    qemu_log_mask(LOG_UNIMP, "%s: not implemented\n", __func__);
    999
   1000    return true;
   1001}
   1002
   1003/*
   1004 * Branch Instructions
   1005 */
   1006static void gen_jmp_ez(DisasContext *ctx)
   1007{
   1008    tcg_gen_deposit_tl(cpu_pc, cpu_r[30], cpu_r[31], 8, 8);
   1009    tcg_gen_or_tl(cpu_pc, cpu_pc, cpu_eind);
   1010    ctx->base.is_jmp = DISAS_LOOKUP;
   1011}
   1012
   1013static void gen_jmp_z(DisasContext *ctx)
   1014{
   1015    tcg_gen_deposit_tl(cpu_pc, cpu_r[30], cpu_r[31], 8, 8);
   1016    ctx->base.is_jmp = DISAS_LOOKUP;
   1017}
   1018
   1019static void gen_push_ret(DisasContext *ctx, int ret)
   1020{
   1021    if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) {
   1022
   1023        TCGv t0 = tcg_const_i32((ret & 0x0000ff));
   1024
   1025        tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_UB);
   1026        tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
   1027
   1028        tcg_temp_free_i32(t0);
   1029    } else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) {
   1030
   1031        TCGv t0 = tcg_const_i32((ret & 0x00ffff));
   1032
   1033        tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
   1034        tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_BEUW);
   1035        tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
   1036
   1037        tcg_temp_free_i32(t0);
   1038
   1039    } else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) {
   1040
   1041        TCGv lo = tcg_const_i32((ret & 0x0000ff));
   1042        TCGv hi = tcg_const_i32((ret & 0xffff00) >> 8);
   1043
   1044        tcg_gen_qemu_st_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB);
   1045        tcg_gen_subi_tl(cpu_sp, cpu_sp, 2);
   1046        tcg_gen_qemu_st_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW);
   1047        tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
   1048
   1049        tcg_temp_free_i32(lo);
   1050        tcg_temp_free_i32(hi);
   1051    }
   1052}
   1053
   1054static void gen_pop_ret(DisasContext *ctx, TCGv ret)
   1055{
   1056    if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) {
   1057        tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
   1058        tcg_gen_qemu_ld_tl(ret, cpu_sp, MMU_DATA_IDX, MO_UB);
   1059    } else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) {
   1060        tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
   1061        tcg_gen_qemu_ld_tl(ret, cpu_sp, MMU_DATA_IDX, MO_BEUW);
   1062        tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
   1063    } else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) {
   1064        TCGv lo = tcg_temp_new_i32();
   1065        TCGv hi = tcg_temp_new_i32();
   1066
   1067        tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
   1068        tcg_gen_qemu_ld_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW);
   1069
   1070        tcg_gen_addi_tl(cpu_sp, cpu_sp, 2);
   1071        tcg_gen_qemu_ld_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB);
   1072
   1073        tcg_gen_deposit_tl(ret, lo, hi, 8, 16);
   1074
   1075        tcg_temp_free_i32(lo);
   1076        tcg_temp_free_i32(hi);
   1077    }
   1078}
   1079
   1080static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
   1081{
   1082    const TranslationBlock *tb = ctx->base.tb;
   1083
   1084    if (translator_use_goto_tb(&ctx->base, dest)) {
   1085        tcg_gen_goto_tb(n);
   1086        tcg_gen_movi_i32(cpu_pc, dest);
   1087        tcg_gen_exit_tb(tb, n);
   1088    } else {
   1089        tcg_gen_movi_i32(cpu_pc, dest);
   1090        if (ctx->base.singlestep_enabled) {
   1091            gen_helper_debug(cpu_env);
   1092        } else {
   1093            tcg_gen_lookup_and_goto_ptr();
   1094        }
   1095    }
   1096    ctx->base.is_jmp = DISAS_NORETURN;
   1097}
   1098
   1099/*
   1100 *  Relative jump to an address within PC - 2K +1 and PC + 2K (words). For
   1101 *  AVR microcontrollers with Program memory not exceeding 4K words (8KB) this
   1102 *  instruction can address the entire memory from every address location. See
   1103 *  also JMP.
   1104 */
   1105static bool trans_RJMP(DisasContext *ctx, arg_RJMP *a)
   1106{
   1107    int dst = ctx->npc + a->imm;
   1108
   1109    gen_goto_tb(ctx, 0, dst);
   1110
   1111    return true;
   1112}
   1113
   1114/*
   1115 *  Indirect jump to the address pointed to by the Z (16 bits) Pointer
   1116 *  Register in the Register File. The Z-pointer Register is 16 bits wide and
   1117 *  allows jump within the lowest 64K words (128KB) section of Program memory.
   1118 *  This instruction is not available in all devices. Refer to the device
   1119 *  specific instruction set summary.
   1120 */
   1121static bool trans_IJMP(DisasContext *ctx, arg_IJMP *a)
   1122{
   1123    if (!avr_have_feature(ctx, AVR_FEATURE_IJMP_ICALL)) {
   1124        return true;
   1125    }
   1126
   1127    gen_jmp_z(ctx);
   1128
   1129    return true;
   1130}
   1131
   1132/*
   1133 *  Indirect jump to the address pointed to by the Z (16 bits) Pointer
   1134 *  Register in the Register File and the EIND Register in the I/O space. This
   1135 *  instruction allows for indirect jumps to the entire 4M (words) Program
   1136 *  memory space. See also IJMP.  This instruction is not available in all
   1137 *  devices. Refer to the device specific instruction set summary.
   1138 */
   1139static bool trans_EIJMP(DisasContext *ctx, arg_EIJMP *a)
   1140{
   1141    if (!avr_have_feature(ctx, AVR_FEATURE_EIJMP_EICALL)) {
   1142        return true;
   1143    }
   1144
   1145    gen_jmp_ez(ctx);
   1146    return true;
   1147}
   1148
   1149/*
   1150 *  Jump to an address within the entire 4M (words) Program memory. See also
   1151 *  RJMP.  This instruction is not available in all devices. Refer to the device
   1152 *  specific instruction set summary.0
   1153 */
   1154static bool trans_JMP(DisasContext *ctx, arg_JMP *a)
   1155{
   1156    if (!avr_have_feature(ctx, AVR_FEATURE_JMP_CALL)) {
   1157        return true;
   1158    }
   1159
   1160    gen_goto_tb(ctx, 0, a->imm);
   1161
   1162    return true;
   1163}
   1164
   1165/*
   1166 *  Relative call to an address within PC - 2K + 1 and PC + 2K (words). The
   1167 *  return address (the instruction after the RCALL) is stored onto the Stack.
   1168 *  See also CALL. For AVR microcontrollers with Program memory not exceeding 4K
   1169 *  words (8KB) this instruction can address the entire memory from every
   1170 *  address location. The Stack Pointer uses a post-decrement scheme during
   1171 *  RCALL.
   1172 */
   1173static bool trans_RCALL(DisasContext *ctx, arg_RCALL *a)
   1174{
   1175    int ret = ctx->npc;
   1176    int dst = ctx->npc + a->imm;
   1177
   1178    gen_push_ret(ctx, ret);
   1179    gen_goto_tb(ctx, 0, dst);
   1180
   1181    return true;
   1182}
   1183
   1184/*
   1185 *  Calls to a subroutine within the entire 4M (words) Program memory. The
   1186 *  return address (to the instruction after the CALL) will be stored onto the
   1187 *  Stack. See also RCALL. The Stack Pointer uses a post-decrement scheme during
   1188 *  CALL.  This instruction is not available in all devices. Refer to the device
   1189 *  specific instruction set summary.
   1190 */
   1191static bool trans_ICALL(DisasContext *ctx, arg_ICALL *a)
   1192{
   1193    if (!avr_have_feature(ctx, AVR_FEATURE_IJMP_ICALL)) {
   1194        return true;
   1195    }
   1196
   1197    int ret = ctx->npc;
   1198
   1199    gen_push_ret(ctx, ret);
   1200    gen_jmp_z(ctx);
   1201
   1202    return true;
   1203}
   1204
   1205/*
   1206 *  Indirect call of a subroutine pointed to by the Z (16 bits) Pointer
   1207 *  Register in the Register File and the EIND Register in the I/O space. This
   1208 *  instruction allows for indirect calls to the entire 4M (words) Program
   1209 *  memory space. See also ICALL. The Stack Pointer uses a post-decrement scheme
   1210 *  during EICALL.  This instruction is not available in all devices. Refer to
   1211 *  the device specific instruction set summary.
   1212 */
   1213static bool trans_EICALL(DisasContext *ctx, arg_EICALL *a)
   1214{
   1215    if (!avr_have_feature(ctx, AVR_FEATURE_EIJMP_EICALL)) {
   1216        return true;
   1217    }
   1218
   1219    int ret = ctx->npc;
   1220
   1221    gen_push_ret(ctx, ret);
   1222    gen_jmp_ez(ctx);
   1223    return true;
   1224}
   1225
   1226/*
   1227 *  Calls to a subroutine within the entire Program memory. The return
   1228 *  address (to the instruction after the CALL) will be stored onto the Stack.
   1229 *  (See also RCALL). The Stack Pointer uses a post-decrement scheme during
   1230 *  CALL.  This instruction is not available in all devices. Refer to the device
   1231 *  specific instruction set summary.
   1232 */
   1233static bool trans_CALL(DisasContext *ctx, arg_CALL *a)
   1234{
   1235    if (!avr_have_feature(ctx, AVR_FEATURE_JMP_CALL)) {
   1236        return true;
   1237    }
   1238
   1239    int Imm = a->imm;
   1240    int ret = ctx->npc;
   1241
   1242    gen_push_ret(ctx, ret);
   1243    gen_goto_tb(ctx, 0, Imm);
   1244
   1245    return true;
   1246}
   1247
   1248/*
   1249 *  Returns from subroutine. The return address is loaded from the STACK.
   1250 *  The Stack Pointer uses a preincrement scheme during RET.
   1251 */
   1252static bool trans_RET(DisasContext *ctx, arg_RET *a)
   1253{
   1254    gen_pop_ret(ctx, cpu_pc);
   1255
   1256    ctx->base.is_jmp = DISAS_LOOKUP;
   1257    return true;
   1258}
   1259
   1260/*
   1261 *  Returns from interrupt. The return address is loaded from the STACK and
   1262 *  the Global Interrupt Flag is set.  Note that the Status Register is not
   1263 *  automatically stored when entering an interrupt routine, and it is not
   1264 *  restored when returning from an interrupt routine. This must be handled by
   1265 *  the application program. The Stack Pointer uses a pre-increment scheme
   1266 *  during RETI.
   1267 */
   1268static bool trans_RETI(DisasContext *ctx, arg_RETI *a)
   1269{
   1270    gen_pop_ret(ctx, cpu_pc);
   1271    tcg_gen_movi_tl(cpu_If, 1);
   1272
   1273    /* Need to return to main loop to re-evaluate interrupts.  */
   1274    ctx->base.is_jmp = DISAS_EXIT;
   1275    return true;
   1276}
   1277
   1278/*
   1279 *  This instruction performs a compare between two registers Rd and Rr, and
   1280 *  skips the next instruction if Rd = Rr.
   1281 */
   1282static bool trans_CPSE(DisasContext *ctx, arg_CPSE *a)
   1283{
   1284    ctx->skip_cond = TCG_COND_EQ;
   1285    ctx->skip_var0 = cpu_r[a->rd];
   1286    ctx->skip_var1 = cpu_r[a->rr];
   1287    return true;
   1288}
   1289
   1290/*
   1291 *  This instruction performs a compare between two registers Rd and Rr.
   1292 *  None of the registers are changed. All conditional branches can be used
   1293 *  after this instruction.
   1294 */
   1295static bool trans_CP(DisasContext *ctx, arg_CP *a)
   1296{
   1297    TCGv Rd = cpu_r[a->rd];
   1298    TCGv Rr = cpu_r[a->rr];
   1299    TCGv R = tcg_temp_new_i32();
   1300
   1301    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
   1302    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
   1303
   1304    /* update status register */
   1305    gen_sub_CHf(R, Rd, Rr);
   1306    gen_sub_Vf(R, Rd, Rr);
   1307    gen_ZNSf(R);
   1308
   1309    tcg_temp_free_i32(R);
   1310
   1311    return true;
   1312}
   1313
   1314/*
   1315 *  This instruction performs a compare between two registers Rd and Rr and
   1316 *  also takes into account the previous carry. None of the registers are
   1317 *  changed. All conditional branches can be used after this instruction.
   1318 */
   1319static bool trans_CPC(DisasContext *ctx, arg_CPC *a)
   1320{
   1321    TCGv Rd = cpu_r[a->rd];
   1322    TCGv Rr = cpu_r[a->rr];
   1323    TCGv R = tcg_temp_new_i32();
   1324    TCGv zero = tcg_const_i32(0);
   1325
   1326    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr - Cf */
   1327    tcg_gen_sub_tl(R, R, cpu_Cf);
   1328    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
   1329    /* update status register */
   1330    gen_sub_CHf(R, Rd, Rr);
   1331    gen_sub_Vf(R, Rd, Rr);
   1332    gen_NSf(R);
   1333
   1334    /*
   1335     * Previous value remains unchanged when the result is zero;
   1336     * cleared otherwise.
   1337     */
   1338    tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero);
   1339
   1340    tcg_temp_free_i32(zero);
   1341    tcg_temp_free_i32(R);
   1342
   1343    return true;
   1344}
   1345
   1346/*
   1347 *  This instruction performs a compare between register Rd and a constant.
   1348 *  The register is not changed. All conditional branches can be used after this
   1349 *  instruction.
   1350 */
   1351static bool trans_CPI(DisasContext *ctx, arg_CPI *a)
   1352{
   1353    TCGv Rd = cpu_r[a->rd];
   1354    int Imm = a->imm;
   1355    TCGv Rr = tcg_const_i32(Imm);
   1356    TCGv R = tcg_temp_new_i32();
   1357
   1358    tcg_gen_sub_tl(R, Rd, Rr); /* R = Rd - Rr */
   1359    tcg_gen_andi_tl(R, R, 0xff); /* make it 8 bits */
   1360
   1361    /* update status register */
   1362    gen_sub_CHf(R, Rd, Rr);
   1363    gen_sub_Vf(R, Rd, Rr);
   1364    gen_ZNSf(R);
   1365
   1366    tcg_temp_free_i32(R);
   1367    tcg_temp_free_i32(Rr);
   1368
   1369    return true;
   1370}
   1371
   1372/*
   1373 *  This instruction tests a single bit in a register and skips the next
   1374 *  instruction if the bit is cleared.
   1375 */
   1376static bool trans_SBRC(DisasContext *ctx, arg_SBRC *a)
   1377{
   1378    TCGv Rr = cpu_r[a->rr];
   1379
   1380    ctx->skip_cond = TCG_COND_EQ;
   1381    ctx->skip_var0 = tcg_temp_new();
   1382    ctx->free_skip_var0 = true;
   1383
   1384    tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
   1385    return true;
   1386}
   1387
   1388/*
   1389 *  This instruction tests a single bit in a register and skips the next
   1390 *  instruction if the bit is set.
   1391 */
   1392static bool trans_SBRS(DisasContext *ctx, arg_SBRS *a)
   1393{
   1394    TCGv Rr = cpu_r[a->rr];
   1395
   1396    ctx->skip_cond = TCG_COND_NE;
   1397    ctx->skip_var0 = tcg_temp_new();
   1398    ctx->free_skip_var0 = true;
   1399
   1400    tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit);
   1401    return true;
   1402}
   1403
   1404/*
   1405 *  This instruction tests a single bit in an I/O Register and skips the
   1406 *  next instruction if the bit is cleared. This instruction operates on the
   1407 *  lower 32 I/O Registers -- addresses 0-31.
   1408 */
   1409static bool trans_SBIC(DisasContext *ctx, arg_SBIC *a)
   1410{
   1411    TCGv temp = tcg_const_i32(a->reg);
   1412
   1413    gen_helper_inb(temp, cpu_env, temp);
   1414    tcg_gen_andi_tl(temp, temp, 1 << a->bit);
   1415    ctx->skip_cond = TCG_COND_EQ;
   1416    ctx->skip_var0 = temp;
   1417    ctx->free_skip_var0 = true;
   1418
   1419    return true;
   1420}
   1421
   1422/*
   1423 *  This instruction tests a single bit in an I/O Register and skips the
   1424 *  next instruction if the bit is set. This instruction operates on the lower
   1425 *  32 I/O Registers -- addresses 0-31.
   1426 */
   1427static bool trans_SBIS(DisasContext *ctx, arg_SBIS *a)
   1428{
   1429    TCGv temp = tcg_const_i32(a->reg);
   1430
   1431    gen_helper_inb(temp, cpu_env, temp);
   1432    tcg_gen_andi_tl(temp, temp, 1 << a->bit);
   1433    ctx->skip_cond = TCG_COND_NE;
   1434    ctx->skip_var0 = temp;
   1435    ctx->free_skip_var0 = true;
   1436
   1437    return true;
   1438}
   1439
   1440/*
   1441 *  Conditional relative branch. Tests a single bit in SREG and branches
   1442 *  relatively to PC if the bit is cleared. This instruction branches relatively
   1443 *  to PC in either direction (PC - 63 < = destination <= PC + 64). The
   1444 *  parameter k is the offset from PC and is represented in two's complement
   1445 *  form.
   1446 */
   1447static bool trans_BRBC(DisasContext *ctx, arg_BRBC *a)
   1448{
   1449    TCGLabel *not_taken = gen_new_label();
   1450
   1451    TCGv var;
   1452
   1453    switch (a->bit) {
   1454    case 0x00:
   1455        var = cpu_Cf;
   1456        break;
   1457    case 0x01:
   1458        var = cpu_Zf;
   1459        break;
   1460    case 0x02:
   1461        var = cpu_Nf;
   1462        break;
   1463    case 0x03:
   1464        var = cpu_Vf;
   1465        break;
   1466    case 0x04:
   1467        var = cpu_Sf;
   1468        break;
   1469    case 0x05:
   1470        var = cpu_Hf;
   1471        break;
   1472    case 0x06:
   1473        var = cpu_Tf;
   1474        break;
   1475    case 0x07:
   1476        var = cpu_If;
   1477        break;
   1478    default:
   1479        g_assert_not_reached();
   1480    }
   1481
   1482    tcg_gen_brcondi_i32(TCG_COND_NE, var, 0, not_taken);
   1483    gen_goto_tb(ctx, 0, ctx->npc + a->imm);
   1484    gen_set_label(not_taken);
   1485
   1486    ctx->base.is_jmp = DISAS_CHAIN;
   1487    return true;
   1488}
   1489
   1490/*
   1491 *  Conditional relative branch. Tests a single bit in SREG and branches
   1492 *  relatively to PC if the bit is set. This instruction branches relatively to
   1493 *  PC in either direction (PC - 63 < = destination <= PC + 64). The parameter k
   1494 *  is the offset from PC and is represented in two's complement form.
   1495 */
   1496static bool trans_BRBS(DisasContext *ctx, arg_BRBS *a)
   1497{
   1498    TCGLabel *not_taken = gen_new_label();
   1499
   1500    TCGv var;
   1501
   1502    switch (a->bit) {
   1503    case 0x00:
   1504        var = cpu_Cf;
   1505        break;
   1506    case 0x01:
   1507        var = cpu_Zf;
   1508        break;
   1509    case 0x02:
   1510        var = cpu_Nf;
   1511        break;
   1512    case 0x03:
   1513        var = cpu_Vf;
   1514        break;
   1515    case 0x04:
   1516        var = cpu_Sf;
   1517        break;
   1518    case 0x05:
   1519        var = cpu_Hf;
   1520        break;
   1521    case 0x06:
   1522        var = cpu_Tf;
   1523        break;
   1524    case 0x07:
   1525        var = cpu_If;
   1526        break;
   1527    default:
   1528        g_assert_not_reached();
   1529    }
   1530
   1531    tcg_gen_brcondi_i32(TCG_COND_EQ, var, 0, not_taken);
   1532    gen_goto_tb(ctx, 0, ctx->npc + a->imm);
   1533    gen_set_label(not_taken);
   1534
   1535    ctx->base.is_jmp = DISAS_CHAIN;
   1536    return true;
   1537}
   1538
   1539/*
   1540 * Data Transfer Instructions
   1541 */
   1542
   1543/*
   1544 *  in the gen_set_addr & gen_get_addr functions
   1545 *  H assumed to be in 0x00ff0000 format
   1546 *  M assumed to be in 0x000000ff format
   1547 *  L assumed to be in 0x000000ff format
   1548 */
   1549static void gen_set_addr(TCGv addr, TCGv H, TCGv M, TCGv L)
   1550{
   1551
   1552    tcg_gen_andi_tl(L, addr, 0x000000ff);
   1553
   1554    tcg_gen_andi_tl(M, addr, 0x0000ff00);
   1555    tcg_gen_shri_tl(M, M, 8);
   1556
   1557    tcg_gen_andi_tl(H, addr, 0x00ff0000);
   1558}
   1559
   1560static void gen_set_xaddr(TCGv addr)
   1561{
   1562    gen_set_addr(addr, cpu_rampX, cpu_r[27], cpu_r[26]);
   1563}
   1564
   1565static void gen_set_yaddr(TCGv addr)
   1566{
   1567    gen_set_addr(addr, cpu_rampY, cpu_r[29], cpu_r[28]);
   1568}
   1569
   1570static void gen_set_zaddr(TCGv addr)
   1571{
   1572    gen_set_addr(addr, cpu_rampZ, cpu_r[31], cpu_r[30]);
   1573}
   1574
   1575static TCGv gen_get_addr(TCGv H, TCGv M, TCGv L)
   1576{
   1577    TCGv addr = tcg_temp_new_i32();
   1578
   1579    tcg_gen_deposit_tl(addr, M, H, 8, 8);
   1580    tcg_gen_deposit_tl(addr, L, addr, 8, 16);
   1581
   1582    return addr;
   1583}
   1584
   1585static TCGv gen_get_xaddr(void)
   1586{
   1587    return gen_get_addr(cpu_rampX, cpu_r[27], cpu_r[26]);
   1588}
   1589
   1590static TCGv gen_get_yaddr(void)
   1591{
   1592    return gen_get_addr(cpu_rampY, cpu_r[29], cpu_r[28]);
   1593}
   1594
   1595static TCGv gen_get_zaddr(void)
   1596{
   1597    return gen_get_addr(cpu_rampZ, cpu_r[31], cpu_r[30]);
   1598}
   1599
   1600/*
   1601 *  Load one byte indirect from data space to register and stores an clear
   1602 *  the bits in data space specified by the register. The instruction can only
   1603 *  be used towards internal SRAM.  The data location is pointed to by the Z (16
   1604 *  bits) Pointer Register in the Register File. Memory access is limited to the
   1605 *  current data segment of 64KB. To access another data segment in devices with
   1606 *  more than 64KB data space, the RAMPZ in register in the I/O area has to be
   1607 *  changed.  The Z-pointer Register is left unchanged by the operation. This
   1608 *  instruction is especially suited for clearing status bits stored in SRAM.
   1609 */
   1610static void gen_data_store(DisasContext *ctx, TCGv data, TCGv addr)
   1611{
   1612    if (ctx->base.tb->flags & TB_FLAGS_FULL_ACCESS) {
   1613        gen_helper_fullwr(cpu_env, data, addr);
   1614    } else {
   1615        tcg_gen_qemu_st8(data, addr, MMU_DATA_IDX); /* mem[addr] = data */
   1616    }
   1617}
   1618
   1619static void gen_data_load(DisasContext *ctx, TCGv data, TCGv addr)
   1620{
   1621    if (ctx->base.tb->flags & TB_FLAGS_FULL_ACCESS) {
   1622        gen_helper_fullrd(data, cpu_env, addr);
   1623    } else {
   1624        tcg_gen_qemu_ld8u(data, addr, MMU_DATA_IDX); /* data = mem[addr] */
   1625    }
   1626}
   1627
   1628/*
   1629 *  This instruction makes a copy of one register into another. The source
   1630 *  register Rr is left unchanged, while the destination register Rd is loaded
   1631 *  with a copy of Rr.
   1632 */
   1633static bool trans_MOV(DisasContext *ctx, arg_MOV *a)
   1634{
   1635    TCGv Rd = cpu_r[a->rd];
   1636    TCGv Rr = cpu_r[a->rr];
   1637
   1638    tcg_gen_mov_tl(Rd, Rr);
   1639
   1640    return true;
   1641}
   1642
   1643/*
   1644 *  This instruction makes a copy of one register pair into another register
   1645 *  pair. The source register pair Rr+1:Rr is left unchanged, while the
   1646 *  destination register pair Rd+1:Rd is loaded with a copy of Rr + 1:Rr.  This
   1647 *  instruction is not available in all devices. Refer to the device specific
   1648 *  instruction set summary.
   1649 */
   1650static bool trans_MOVW(DisasContext *ctx, arg_MOVW *a)
   1651{
   1652    if (!avr_have_feature(ctx, AVR_FEATURE_MOVW)) {
   1653        return true;
   1654    }
   1655
   1656    TCGv RdL = cpu_r[a->rd];
   1657    TCGv RdH = cpu_r[a->rd + 1];
   1658    TCGv RrL = cpu_r[a->rr];
   1659    TCGv RrH = cpu_r[a->rr + 1];
   1660
   1661    tcg_gen_mov_tl(RdH, RrH);
   1662    tcg_gen_mov_tl(RdL, RrL);
   1663
   1664    return true;
   1665}
   1666
   1667/*
   1668 * Loads an 8 bit constant directly to register 16 to 31.
   1669 */
   1670static bool trans_LDI(DisasContext *ctx, arg_LDI *a)
   1671{
   1672    TCGv Rd = cpu_r[a->rd];
   1673    int imm = a->imm;
   1674
   1675    tcg_gen_movi_tl(Rd, imm);
   1676
   1677    return true;
   1678}
   1679
   1680/*
   1681 *  Loads one byte from the data space to a register. For parts with SRAM,
   1682 *  the data space consists of the Register File, I/O memory and internal SRAM
   1683 *  (and external SRAM if applicable). For parts without SRAM, the data space
   1684 *  consists of the register file only. The EEPROM has a separate address space.
   1685 *  A 16-bit address must be supplied. Memory access is limited to the current
   1686 *  data segment of 64KB. The LDS instruction uses the RAMPD Register to access
   1687 *  memory above 64KB. To access another data segment in devices with more than
   1688 *  64KB data space, the RAMPD in register in the I/O area has to be changed.
   1689 *  This instruction is not available in all devices. Refer to the device
   1690 *  specific instruction set summary.
   1691 */
   1692static bool trans_LDS(DisasContext *ctx, arg_LDS *a)
   1693{
   1694    TCGv Rd = cpu_r[a->rd];
   1695    TCGv addr = tcg_temp_new_i32();
   1696    TCGv H = cpu_rampD;
   1697    a->imm = next_word(ctx);
   1698
   1699    tcg_gen_mov_tl(addr, H); /* addr = H:M:L */
   1700    tcg_gen_shli_tl(addr, addr, 16);
   1701    tcg_gen_ori_tl(addr, addr, a->imm);
   1702
   1703    gen_data_load(ctx, Rd, addr);
   1704
   1705    tcg_temp_free_i32(addr);
   1706
   1707    return true;
   1708}
   1709
   1710/*
   1711 *  Loads one byte indirect from the data space to a register. For parts
   1712 *  with SRAM, the data space consists of the Register File, I/O memory and
   1713 *  internal SRAM (and external SRAM if applicable). For parts without SRAM, the
   1714 *  data space consists of the Register File only. In some parts the Flash
   1715 *  Memory has been mapped to the data space and can be read using this command.
   1716 *  The EEPROM has a separate address space.  The data location is pointed to by
   1717 *  the X (16 bits) Pointer Register in the Register File. Memory access is
   1718 *  limited to the current data segment of 64KB. To access another data segment
   1719 *  in devices with more than 64KB data space, the RAMPX in register in the I/O
   1720 *  area has to be changed.  The X-pointer Register can either be left unchanged
   1721 *  by the operation, or it can be post-incremented or predecremented.  These
   1722 *  features are especially suited for accessing arrays, tables, and Stack
   1723 *  Pointer usage of the X-pointer Register. Note that only the low byte of the
   1724 *  X-pointer is updated in devices with no more than 256 bytes data space. For
   1725 *  such devices, the high byte of the pointer is not used by this instruction
   1726 *  and can be used for other purposes. The RAMPX Register in the I/O area is
   1727 *  updated in parts with more than 64KB data space or more than 64KB Program
   1728 *  memory, and the increment/decrement is added to the entire 24-bit address on
   1729 *  such devices.  Not all variants of this instruction is available in all
   1730 *  devices. Refer to the device specific instruction set summary.  In the
   1731 *  Reduced Core tinyAVR the LD instruction can be used to achieve the same
   1732 *  operation as LPM since the program memory is mapped to the data memory
   1733 *  space.
   1734 */
   1735static bool trans_LDX1(DisasContext *ctx, arg_LDX1 *a)
   1736{
   1737    TCGv Rd = cpu_r[a->rd];
   1738    TCGv addr = gen_get_xaddr();
   1739
   1740    gen_data_load(ctx, Rd, addr);
   1741
   1742    tcg_temp_free_i32(addr);
   1743
   1744    return true;
   1745}
   1746
   1747static bool trans_LDX2(DisasContext *ctx, arg_LDX2 *a)
   1748{
   1749    TCGv Rd = cpu_r[a->rd];
   1750    TCGv addr = gen_get_xaddr();
   1751
   1752    gen_data_load(ctx, Rd, addr);
   1753    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   1754
   1755    gen_set_xaddr(addr);
   1756
   1757    tcg_temp_free_i32(addr);
   1758
   1759    return true;
   1760}
   1761
   1762static bool trans_LDX3(DisasContext *ctx, arg_LDX3 *a)
   1763{
   1764    TCGv Rd = cpu_r[a->rd];
   1765    TCGv addr = gen_get_xaddr();
   1766
   1767    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   1768    gen_data_load(ctx, Rd, addr);
   1769    gen_set_xaddr(addr);
   1770
   1771    tcg_temp_free_i32(addr);
   1772
   1773    return true;
   1774}
   1775
   1776/*
   1777 *  Loads one byte indirect with or without displacement from the data space
   1778 *  to a register. For parts with SRAM, the data space consists of the Register
   1779 *  File, I/O memory and internal SRAM (and external SRAM if applicable). For
   1780 *  parts without SRAM, the data space consists of the Register File only. In
   1781 *  some parts the Flash Memory has been mapped to the data space and can be
   1782 *  read using this command. The EEPROM has a separate address space.  The data
   1783 *  location is pointed to by the Y (16 bits) Pointer Register in the Register
   1784 *  File. Memory access is limited to the current data segment of 64KB. To
   1785 *  access another data segment in devices with more than 64KB data space, the
   1786 *  RAMPY in register in the I/O area has to be changed.  The Y-pointer Register
   1787 *  can either be left unchanged by the operation, or it can be post-incremented
   1788 *  or predecremented.  These features are especially suited for accessing
   1789 *  arrays, tables, and Stack Pointer usage of the Y-pointer Register. Note that
   1790 *  only the low byte of the Y-pointer is updated in devices with no more than
   1791 *  256 bytes data space. For such devices, the high byte of the pointer is not
   1792 *  used by this instruction and can be used for other purposes. The RAMPY
   1793 *  Register in the I/O area is updated in parts with more than 64KB data space
   1794 *  or more than 64KB Program memory, and the increment/decrement/displacement
   1795 *  is added to the entire 24-bit address on such devices.  Not all variants of
   1796 *  this instruction is available in all devices. Refer to the device specific
   1797 *  instruction set summary.  In the Reduced Core tinyAVR the LD instruction can
   1798 *  be used to achieve the same operation as LPM since the program memory is
   1799 *  mapped to the data memory space.
   1800 */
   1801static bool trans_LDY2(DisasContext *ctx, arg_LDY2 *a)
   1802{
   1803    TCGv Rd = cpu_r[a->rd];
   1804    TCGv addr = gen_get_yaddr();
   1805
   1806    gen_data_load(ctx, Rd, addr);
   1807    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   1808
   1809    gen_set_yaddr(addr);
   1810
   1811    tcg_temp_free_i32(addr);
   1812
   1813    return true;
   1814}
   1815
   1816static bool trans_LDY3(DisasContext *ctx, arg_LDY3 *a)
   1817{
   1818    TCGv Rd = cpu_r[a->rd];
   1819    TCGv addr = gen_get_yaddr();
   1820
   1821    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   1822    gen_data_load(ctx, Rd, addr);
   1823    gen_set_yaddr(addr);
   1824
   1825    tcg_temp_free_i32(addr);
   1826
   1827    return true;
   1828}
   1829
   1830static bool trans_LDDY(DisasContext *ctx, arg_LDDY *a)
   1831{
   1832    TCGv Rd = cpu_r[a->rd];
   1833    TCGv addr = gen_get_yaddr();
   1834
   1835    tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
   1836    gen_data_load(ctx, Rd, addr);
   1837
   1838    tcg_temp_free_i32(addr);
   1839
   1840    return true;
   1841}
   1842
   1843/*
   1844 *  Loads one byte indirect with or without displacement from the data space
   1845 *  to a register. For parts with SRAM, the data space consists of the Register
   1846 *  File, I/O memory and internal SRAM (and external SRAM if applicable). For
   1847 *  parts without SRAM, the data space consists of the Register File only. In
   1848 *  some parts the Flash Memory has been mapped to the data space and can be
   1849 *  read using this command. The EEPROM has a separate address space.  The data
   1850 *  location is pointed to by the Z (16 bits) Pointer Register in the Register
   1851 *  File. Memory access is limited to the current data segment of 64KB. To
   1852 *  access another data segment in devices with more than 64KB data space, the
   1853 *  RAMPZ in register in the I/O area has to be changed.  The Z-pointer Register
   1854 *  can either be left unchanged by the operation, or it can be post-incremented
   1855 *  or predecremented.  These features are especially suited for Stack Pointer
   1856 *  usage of the Z-pointer Register, however because the Z-pointer Register can
   1857 *  be used for indirect subroutine calls, indirect jumps and table lookup, it
   1858 *  is often more convenient to use the X or Y-pointer as a dedicated Stack
   1859 *  Pointer. Note that only the low byte of the Z-pointer is updated in devices
   1860 *  with no more than 256 bytes data space. For such devices, the high byte of
   1861 *  the pointer is not used by this instruction and can be used for other
   1862 *  purposes. The RAMPZ Register in the I/O area is updated in parts with more
   1863 *  than 64KB data space or more than 64KB Program memory, and the
   1864 *  increment/decrement/displacement is added to the entire 24-bit address on
   1865 *  such devices.  Not all variants of this instruction is available in all
   1866 *  devices. Refer to the device specific instruction set summary.  In the
   1867 *  Reduced Core tinyAVR the LD instruction can be used to achieve the same
   1868 *  operation as LPM since the program memory is mapped to the data memory
   1869 *  space.  For using the Z-pointer for table lookup in Program memory see the
   1870 *  LPM and ELPM instructions.
   1871 */
   1872static bool trans_LDZ2(DisasContext *ctx, arg_LDZ2 *a)
   1873{
   1874    TCGv Rd = cpu_r[a->rd];
   1875    TCGv addr = gen_get_zaddr();
   1876
   1877    gen_data_load(ctx, Rd, addr);
   1878    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   1879
   1880    gen_set_zaddr(addr);
   1881
   1882    tcg_temp_free_i32(addr);
   1883
   1884    return true;
   1885}
   1886
   1887static bool trans_LDZ3(DisasContext *ctx, arg_LDZ3 *a)
   1888{
   1889    TCGv Rd = cpu_r[a->rd];
   1890    TCGv addr = gen_get_zaddr();
   1891
   1892    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   1893    gen_data_load(ctx, Rd, addr);
   1894
   1895    gen_set_zaddr(addr);
   1896
   1897    tcg_temp_free_i32(addr);
   1898
   1899    return true;
   1900}
   1901
   1902static bool trans_LDDZ(DisasContext *ctx, arg_LDDZ *a)
   1903{
   1904    TCGv Rd = cpu_r[a->rd];
   1905    TCGv addr = gen_get_zaddr();
   1906
   1907    tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
   1908    gen_data_load(ctx, Rd, addr);
   1909
   1910    tcg_temp_free_i32(addr);
   1911
   1912    return true;
   1913}
   1914
   1915/*
   1916 *  Stores one byte from a Register to the data space. For parts with SRAM,
   1917 *  the data space consists of the Register File, I/O memory and internal SRAM
   1918 *  (and external SRAM if applicable). For parts without SRAM, the data space
   1919 *  consists of the Register File only. The EEPROM has a separate address space.
   1920 *  A 16-bit address must be supplied. Memory access is limited to the current
   1921 *  data segment of 64KB. The STS instruction uses the RAMPD Register to access
   1922 *  memory above 64KB. To access another data segment in devices with more than
   1923 *  64KB data space, the RAMPD in register in the I/O area has to be changed.
   1924 *  This instruction is not available in all devices. Refer to the device
   1925 *  specific instruction set summary.
   1926 */
   1927static bool trans_STS(DisasContext *ctx, arg_STS *a)
   1928{
   1929    TCGv Rd = cpu_r[a->rd];
   1930    TCGv addr = tcg_temp_new_i32();
   1931    TCGv H = cpu_rampD;
   1932    a->imm = next_word(ctx);
   1933
   1934    tcg_gen_mov_tl(addr, H); /* addr = H:M:L */
   1935    tcg_gen_shli_tl(addr, addr, 16);
   1936    tcg_gen_ori_tl(addr, addr, a->imm);
   1937    gen_data_store(ctx, Rd, addr);
   1938
   1939    tcg_temp_free_i32(addr);
   1940
   1941    return true;
   1942}
   1943
   1944/*
   1945 * Stores one byte indirect from a register to data space. For parts with SRAM,
   1946 * the data space consists of the Register File, I/O memory, and internal SRAM
   1947 * (and external SRAM if applicable). For parts without SRAM, the data space
   1948 * consists of the Register File only. The EEPROM has a separate address space.
   1949 *
   1950 * The data location is pointed to by the X (16 bits) Pointer Register in the
   1951 * Register File. Memory access is limited to the current data segment of 64KB.
   1952 * To access another data segment in devices with more than 64KB data space, the
   1953 * RAMPX in register in the I/O area has to be changed.
   1954 *
   1955 * The X-pointer Register can either be left unchanged by the operation, or it
   1956 * can be post-incremented or pre-decremented. These features are especially
   1957 * suited for accessing arrays, tables, and Stack Pointer usage of the
   1958 * X-pointer Register. Note that only the low byte of the X-pointer is updated
   1959 * in devices with no more than 256 bytes data space. For such devices, the high
   1960 * byte of the pointer is not used by this instruction and can be used for other
   1961 * purposes. The RAMPX Register in the I/O area is updated in parts with more
   1962 * than 64KB data space or more than 64KB Program memory, and the increment /
   1963 * decrement is added to the entire 24-bit address on such devices.
   1964 */
   1965static bool trans_STX1(DisasContext *ctx, arg_STX1 *a)
   1966{
   1967    TCGv Rd = cpu_r[a->rr];
   1968    TCGv addr = gen_get_xaddr();
   1969
   1970    gen_data_store(ctx, Rd, addr);
   1971
   1972    tcg_temp_free_i32(addr);
   1973
   1974    return true;
   1975}
   1976
   1977static bool trans_STX2(DisasContext *ctx, arg_STX2 *a)
   1978{
   1979    TCGv Rd = cpu_r[a->rr];
   1980    TCGv addr = gen_get_xaddr();
   1981
   1982    gen_data_store(ctx, Rd, addr);
   1983    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   1984    gen_set_xaddr(addr);
   1985
   1986    tcg_temp_free_i32(addr);
   1987
   1988    return true;
   1989}
   1990
   1991static bool trans_STX3(DisasContext *ctx, arg_STX3 *a)
   1992{
   1993    TCGv Rd = cpu_r[a->rr];
   1994    TCGv addr = gen_get_xaddr();
   1995
   1996    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   1997    gen_data_store(ctx, Rd, addr);
   1998    gen_set_xaddr(addr);
   1999
   2000    tcg_temp_free_i32(addr);
   2001
   2002    return true;
   2003}
   2004
   2005/*
   2006 * Stores one byte indirect with or without displacement from a register to data
   2007 * space. For parts with SRAM, the data space consists of the Register File, I/O
   2008 * memory, and internal SRAM (and external SRAM if applicable). For parts
   2009 * without SRAM, the data space consists of the Register File only. The EEPROM
   2010 * has a separate address space.
   2011 *
   2012 * The data location is pointed to by the Y (16 bits) Pointer Register in the
   2013 * Register File. Memory access is limited to the current data segment of 64KB.
   2014 * To access another data segment in devices with more than 64KB data space, the
   2015 * RAMPY in register in the I/O area has to be changed.
   2016 *
   2017 * The Y-pointer Register can either be left unchanged by the operation, or it
   2018 * can be post-incremented or pre-decremented. These features are especially
   2019 * suited for accessing arrays, tables, and Stack Pointer usage of the Y-pointer
   2020 * Register. Note that only the low byte of the Y-pointer is updated in devices
   2021 * with no more than 256 bytes data space. For such devices, the high byte of
   2022 * the pointer is not used by this instruction and can be used for other
   2023 * purposes. The RAMPY Register in the I/O area is updated in parts with more
   2024 * than 64KB data space or more than 64KB Program memory, and the increment /
   2025 * decrement / displacement is added to the entire 24-bit address on such
   2026 * devices.
   2027 */
   2028static bool trans_STY2(DisasContext *ctx, arg_STY2 *a)
   2029{
   2030    TCGv Rd = cpu_r[a->rd];
   2031    TCGv addr = gen_get_yaddr();
   2032
   2033    gen_data_store(ctx, Rd, addr);
   2034    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   2035    gen_set_yaddr(addr);
   2036
   2037    tcg_temp_free_i32(addr);
   2038
   2039    return true;
   2040}
   2041
   2042static bool trans_STY3(DisasContext *ctx, arg_STY3 *a)
   2043{
   2044    TCGv Rd = cpu_r[a->rd];
   2045    TCGv addr = gen_get_yaddr();
   2046
   2047    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   2048    gen_data_store(ctx, Rd, addr);
   2049    gen_set_yaddr(addr);
   2050
   2051    tcg_temp_free_i32(addr);
   2052
   2053    return true;
   2054}
   2055
   2056static bool trans_STDY(DisasContext *ctx, arg_STDY *a)
   2057{
   2058    TCGv Rd = cpu_r[a->rd];
   2059    TCGv addr = gen_get_yaddr();
   2060
   2061    tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
   2062    gen_data_store(ctx, Rd, addr);
   2063
   2064    tcg_temp_free_i32(addr);
   2065
   2066    return true;
   2067}
   2068
   2069/*
   2070 * Stores one byte indirect with or without displacement from a register to data
   2071 * space. For parts with SRAM, the data space consists of the Register File, I/O
   2072 * memory, and internal SRAM (and external SRAM if applicable). For parts
   2073 * without SRAM, the data space consists of the Register File only. The EEPROM
   2074 * has a separate address space.
   2075 *
   2076 * The data location is pointed to by the Y (16 bits) Pointer Register in the
   2077 * Register File. Memory access is limited to the current data segment of 64KB.
   2078 * To access another data segment in devices with more than 64KB data space, the
   2079 * RAMPY in register in the I/O area has to be changed.
   2080 *
   2081 * The Y-pointer Register can either be left unchanged by the operation, or it
   2082 * can be post-incremented or pre-decremented. These features are especially
   2083 * suited for accessing arrays, tables, and Stack Pointer usage of the Y-pointer
   2084 * Register. Note that only the low byte of the Y-pointer is updated in devices
   2085 * with no more than 256 bytes data space. For such devices, the high byte of
   2086 * the pointer is not used by this instruction and can be used for other
   2087 * purposes. The RAMPY Register in the I/O area is updated in parts with more
   2088 * than 64KB data space or more than 64KB Program memory, and the increment /
   2089 * decrement / displacement is added to the entire 24-bit address on such
   2090 * devices.
   2091 */
   2092static bool trans_STZ2(DisasContext *ctx, arg_STZ2 *a)
   2093{
   2094    TCGv Rd = cpu_r[a->rd];
   2095    TCGv addr = gen_get_zaddr();
   2096
   2097    gen_data_store(ctx, Rd, addr);
   2098    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   2099
   2100    gen_set_zaddr(addr);
   2101
   2102    tcg_temp_free_i32(addr);
   2103
   2104    return true;
   2105}
   2106
   2107static bool trans_STZ3(DisasContext *ctx, arg_STZ3 *a)
   2108{
   2109    TCGv Rd = cpu_r[a->rd];
   2110    TCGv addr = gen_get_zaddr();
   2111
   2112    tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */
   2113    gen_data_store(ctx, Rd, addr);
   2114
   2115    gen_set_zaddr(addr);
   2116
   2117    tcg_temp_free_i32(addr);
   2118
   2119    return true;
   2120}
   2121
   2122static bool trans_STDZ(DisasContext *ctx, arg_STDZ *a)
   2123{
   2124    TCGv Rd = cpu_r[a->rd];
   2125    TCGv addr = gen_get_zaddr();
   2126
   2127    tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */
   2128    gen_data_store(ctx, Rd, addr);
   2129
   2130    tcg_temp_free_i32(addr);
   2131
   2132    return true;
   2133}
   2134
   2135/*
   2136 *  Loads one byte pointed to by the Z-register into the destination
   2137 *  register Rd. This instruction features a 100% space effective constant
   2138 *  initialization or constant data fetch. The Program memory is organized in
   2139 *  16-bit words while the Z-pointer is a byte address. Thus, the least
   2140 *  significant bit of the Z-pointer selects either low byte (ZLSB = 0) or high
   2141 *  byte (ZLSB = 1). This instruction can address the first 64KB (32K words) of
   2142 *  Program memory. The Zpointer Register can either be left unchanged by the
   2143 *  operation, or it can be incremented. The incrementation does not apply to
   2144 *  the RAMPZ Register.
   2145 *
   2146 *  Devices with Self-Programming capability can use the LPM instruction to read
   2147 *  the Fuse and Lock bit values.
   2148 */
   2149static bool trans_LPM1(DisasContext *ctx, arg_LPM1 *a)
   2150{
   2151    if (!avr_have_feature(ctx, AVR_FEATURE_LPM)) {
   2152        return true;
   2153    }
   2154
   2155    TCGv Rd = cpu_r[0];
   2156    TCGv addr = tcg_temp_new_i32();
   2157    TCGv H = cpu_r[31];
   2158    TCGv L = cpu_r[30];
   2159
   2160    tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
   2161    tcg_gen_or_tl(addr, addr, L);
   2162    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2163
   2164    tcg_temp_free_i32(addr);
   2165
   2166    return true;
   2167}
   2168
   2169static bool trans_LPM2(DisasContext *ctx, arg_LPM2 *a)
   2170{
   2171    if (!avr_have_feature(ctx, AVR_FEATURE_LPM)) {
   2172        return true;
   2173    }
   2174
   2175    TCGv Rd = cpu_r[a->rd];
   2176    TCGv addr = tcg_temp_new_i32();
   2177    TCGv H = cpu_r[31];
   2178    TCGv L = cpu_r[30];
   2179
   2180    tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
   2181    tcg_gen_or_tl(addr, addr, L);
   2182    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2183
   2184    tcg_temp_free_i32(addr);
   2185
   2186    return true;
   2187}
   2188
   2189static bool trans_LPMX(DisasContext *ctx, arg_LPMX *a)
   2190{
   2191    if (!avr_have_feature(ctx, AVR_FEATURE_LPMX)) {
   2192        return true;
   2193    }
   2194
   2195    TCGv Rd = cpu_r[a->rd];
   2196    TCGv addr = tcg_temp_new_i32();
   2197    TCGv H = cpu_r[31];
   2198    TCGv L = cpu_r[30];
   2199
   2200    tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */
   2201    tcg_gen_or_tl(addr, addr, L);
   2202    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2203    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   2204    tcg_gen_andi_tl(L, addr, 0xff);
   2205    tcg_gen_shri_tl(addr, addr, 8);
   2206    tcg_gen_andi_tl(H, addr, 0xff);
   2207
   2208    tcg_temp_free_i32(addr);
   2209
   2210    return true;
   2211}
   2212
   2213/*
   2214 *  Loads one byte pointed to by the Z-register and the RAMPZ Register in
   2215 *  the I/O space, and places this byte in the destination register Rd. This
   2216 *  instruction features a 100% space effective constant initialization or
   2217 *  constant data fetch. The Program memory is organized in 16-bit words while
   2218 *  the Z-pointer is a byte address. Thus, the least significant bit of the
   2219 *  Z-pointer selects either low byte (ZLSB = 0) or high byte (ZLSB = 1). This
   2220 *  instruction can address the entire Program memory space. The Z-pointer
   2221 *  Register can either be left unchanged by the operation, or it can be
   2222 *  incremented. The incrementation applies to the entire 24-bit concatenation
   2223 *  of the RAMPZ and Z-pointer Registers.
   2224 *
   2225 *  Devices with Self-Programming capability can use the ELPM instruction to
   2226 *  read the Fuse and Lock bit value.
   2227 */
   2228static bool trans_ELPM1(DisasContext *ctx, arg_ELPM1 *a)
   2229{
   2230    if (!avr_have_feature(ctx, AVR_FEATURE_ELPM)) {
   2231        return true;
   2232    }
   2233
   2234    TCGv Rd = cpu_r[0];
   2235    TCGv addr = gen_get_zaddr();
   2236
   2237    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2238
   2239    tcg_temp_free_i32(addr);
   2240
   2241    return true;
   2242}
   2243
   2244static bool trans_ELPM2(DisasContext *ctx, arg_ELPM2 *a)
   2245{
   2246    if (!avr_have_feature(ctx, AVR_FEATURE_ELPM)) {
   2247        return true;
   2248    }
   2249
   2250    TCGv Rd = cpu_r[a->rd];
   2251    TCGv addr = gen_get_zaddr();
   2252
   2253    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2254
   2255    tcg_temp_free_i32(addr);
   2256
   2257    return true;
   2258}
   2259
   2260static bool trans_ELPMX(DisasContext *ctx, arg_ELPMX *a)
   2261{
   2262    if (!avr_have_feature(ctx, AVR_FEATURE_ELPMX)) {
   2263        return true;
   2264    }
   2265
   2266    TCGv Rd = cpu_r[a->rd];
   2267    TCGv addr = gen_get_zaddr();
   2268
   2269    tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */
   2270    tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */
   2271    gen_set_zaddr(addr);
   2272
   2273    tcg_temp_free_i32(addr);
   2274
   2275    return true;
   2276}
   2277
   2278/*
   2279 *  SPM can be used to erase a page in the Program memory, to write a page
   2280 *  in the Program memory (that is already erased), and to set Boot Loader Lock
   2281 *  bits. In some devices, the Program memory can be written one word at a time,
   2282 *  in other devices an entire page can be programmed simultaneously after first
   2283 *  filling a temporary page buffer. In all cases, the Program memory must be
   2284 *  erased one page at a time. When erasing the Program memory, the RAMPZ and
   2285 *  Z-register are used as page address. When writing the Program memory, the
   2286 *  RAMPZ and Z-register are used as page or word address, and the R1:R0
   2287 *  register pair is used as data(1). When setting the Boot Loader Lock bits,
   2288 *  the R1:R0 register pair is used as data. Refer to the device documentation
   2289 *  for detailed description of SPM usage. This instruction can address the
   2290 *  entire Program memory.
   2291 *
   2292 *  The SPM instruction is not available in all devices. Refer to the device
   2293 *  specific instruction set summary.
   2294 *
   2295 *  Note: 1. R1 determines the instruction high byte, and R0 determines the
   2296 *  instruction low byte.
   2297 */
   2298static bool trans_SPM(DisasContext *ctx, arg_SPM *a)
   2299{
   2300    /* TODO */
   2301    if (!avr_have_feature(ctx, AVR_FEATURE_SPM)) {
   2302        return true;
   2303    }
   2304
   2305    return true;
   2306}
   2307
   2308static bool trans_SPMX(DisasContext *ctx, arg_SPMX *a)
   2309{
   2310    /* TODO */
   2311    if (!avr_have_feature(ctx, AVR_FEATURE_SPMX)) {
   2312        return true;
   2313    }
   2314
   2315    return true;
   2316}
   2317
   2318/*
   2319 *  Loads data from the I/O Space (Ports, Timers, Configuration Registers,
   2320 *  etc.) into register Rd in the Register File.
   2321 */
   2322static bool trans_IN(DisasContext *ctx, arg_IN *a)
   2323{
   2324    TCGv Rd = cpu_r[a->rd];
   2325    TCGv port = tcg_const_i32(a->imm);
   2326
   2327    gen_helper_inb(Rd, cpu_env, port);
   2328
   2329    tcg_temp_free_i32(port);
   2330
   2331    return true;
   2332}
   2333
   2334/*
   2335 *  Stores data from register Rr in the Register File to I/O Space (Ports,
   2336 *  Timers, Configuration Registers, etc.).
   2337 */
   2338static bool trans_OUT(DisasContext *ctx, arg_OUT *a)
   2339{
   2340    TCGv Rd = cpu_r[a->rd];
   2341    TCGv port = tcg_const_i32(a->imm);
   2342
   2343    gen_helper_outb(cpu_env, port, Rd);
   2344
   2345    tcg_temp_free_i32(port);
   2346
   2347    return true;
   2348}
   2349
   2350/*
   2351 *  This instruction stores the contents of register Rr on the STACK. The
   2352 *  Stack Pointer is post-decremented by 1 after the PUSH.  This instruction is
   2353 *  not available in all devices. Refer to the device specific instruction set
   2354 *  summary.
   2355 */
   2356static bool trans_PUSH(DisasContext *ctx, arg_PUSH *a)
   2357{
   2358    TCGv Rd = cpu_r[a->rd];
   2359
   2360    gen_data_store(ctx, Rd, cpu_sp);
   2361    tcg_gen_subi_tl(cpu_sp, cpu_sp, 1);
   2362
   2363    return true;
   2364}
   2365
   2366/*
   2367 *  This instruction loads register Rd with a byte from the STACK. The Stack
   2368 *  Pointer is pre-incremented by 1 before the POP.  This instruction is not
   2369 *  available in all devices. Refer to the device specific instruction set
   2370 *  summary.
   2371 */
   2372static bool trans_POP(DisasContext *ctx, arg_POP *a)
   2373{
   2374    /*
   2375     * Using a temp to work around some strange behaviour:
   2376     * tcg_gen_addi_tl(cpu_sp, cpu_sp, 1);
   2377     * gen_data_load(ctx, Rd, cpu_sp);
   2378     * seems to cause the add to happen twice.
   2379     * This doesn't happen if either the add or the load is removed.
   2380     */
   2381    TCGv t1 = tcg_temp_new_i32();
   2382    TCGv Rd = cpu_r[a->rd];
   2383
   2384    tcg_gen_addi_tl(t1, cpu_sp, 1);
   2385    gen_data_load(ctx, Rd, t1);
   2386    tcg_gen_mov_tl(cpu_sp, t1);
   2387
   2388    return true;
   2389}
   2390
   2391/*
   2392 *  Exchanges one byte indirect between register and data space.  The data
   2393 *  location is pointed to by the Z (16 bits) Pointer Register in the Register
   2394 *  File. Memory access is limited to the current data segment of 64KB. To
   2395 *  access another data segment in devices with more than 64KB data space, the
   2396 *  RAMPZ in register in the I/O area has to be changed.
   2397 *
   2398 *  The Z-pointer Register is left unchanged by the operation. This instruction
   2399 *  is especially suited for writing/reading status bits stored in SRAM.
   2400 */
   2401static bool trans_XCH(DisasContext *ctx, arg_XCH *a)
   2402{
   2403    if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
   2404        return true;
   2405    }
   2406
   2407    TCGv Rd = cpu_r[a->rd];
   2408    TCGv t0 = tcg_temp_new_i32();
   2409    TCGv addr = gen_get_zaddr();
   2410
   2411    gen_data_load(ctx, t0, addr);
   2412    gen_data_store(ctx, Rd, addr);
   2413    tcg_gen_mov_tl(Rd, t0);
   2414
   2415    tcg_temp_free_i32(t0);
   2416    tcg_temp_free_i32(addr);
   2417
   2418    return true;
   2419}
   2420
   2421/*
   2422 *  Load one byte indirect from data space to register and set bits in data
   2423 *  space specified by the register. The instruction can only be used towards
   2424 *  internal SRAM.  The data location is pointed to by the Z (16 bits) Pointer
   2425 *  Register in the Register File. Memory access is limited to the current data
   2426 *  segment of 64KB. To access another data segment in devices with more than
   2427 *  64KB data space, the RAMPZ in register in the I/O area has to be changed.
   2428 *
   2429 *  The Z-pointer Register is left unchanged by the operation. This instruction
   2430 *  is especially suited for setting status bits stored in SRAM.
   2431 */
   2432static bool trans_LAS(DisasContext *ctx, arg_LAS *a)
   2433{
   2434    if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
   2435        return true;
   2436    }
   2437
   2438    TCGv Rr = cpu_r[a->rd];
   2439    TCGv addr = gen_get_zaddr();
   2440    TCGv t0 = tcg_temp_new_i32();
   2441    TCGv t1 = tcg_temp_new_i32();
   2442
   2443    gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
   2444    tcg_gen_or_tl(t1, t0, Rr);
   2445    tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
   2446    gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
   2447
   2448    tcg_temp_free_i32(t1);
   2449    tcg_temp_free_i32(t0);
   2450    tcg_temp_free_i32(addr);
   2451
   2452    return true;
   2453}
   2454
   2455/*
   2456 *  Load one byte indirect from data space to register and stores and clear
   2457 *  the bits in data space specified by the register. The instruction can
   2458 *  only be used towards internal SRAM.  The data location is pointed to by
   2459 *  the Z (16 bits) Pointer Register in the Register File. Memory access is
   2460 *  limited to the current data segment of 64KB. To access another data
   2461 *  segment in devices with more than 64KB data space, the RAMPZ in register
   2462 *  in the I/O area has to be changed.
   2463 *
   2464 *  The Z-pointer Register is left unchanged by the operation. This instruction
   2465 *  is especially suited for clearing status bits stored in SRAM.
   2466 */
   2467static bool trans_LAC(DisasContext *ctx, arg_LAC *a)
   2468{
   2469    if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
   2470        return true;
   2471    }
   2472
   2473    TCGv Rr = cpu_r[a->rd];
   2474    TCGv addr = gen_get_zaddr();
   2475    TCGv t0 = tcg_temp_new_i32();
   2476    TCGv t1 = tcg_temp_new_i32();
   2477
   2478    gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
   2479    tcg_gen_andc_tl(t1, t0, Rr); /* t1 = t0 & (0xff - Rr) = t0 & ~Rr */
   2480    tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */
   2481    gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
   2482
   2483    tcg_temp_free_i32(t1);
   2484    tcg_temp_free_i32(t0);
   2485    tcg_temp_free_i32(addr);
   2486
   2487    return true;
   2488}
   2489
   2490
   2491/*
   2492 *  Load one byte indirect from data space to register and toggles bits in
   2493 *  the data space specified by the register.  The instruction can only be used
   2494 *  towards SRAM.  The data location is pointed to by the Z (16 bits) Pointer
   2495 *  Register in the Register File. Memory access is limited to the current data
   2496 *  segment of 64KB. To access another data segment in devices with more than
   2497 *  64KB data space, the RAMPZ in register in the I/O area has to be changed.
   2498 *
   2499 *  The Z-pointer Register is left unchanged by the operation. This instruction
   2500 *  is especially suited for changing status bits stored in SRAM.
   2501 */
   2502static bool trans_LAT(DisasContext *ctx, arg_LAT *a)
   2503{
   2504    if (!avr_have_feature(ctx, AVR_FEATURE_RMW)) {
   2505        return true;
   2506    }
   2507
   2508    TCGv Rd = cpu_r[a->rd];
   2509    TCGv addr = gen_get_zaddr();
   2510    TCGv t0 = tcg_temp_new_i32();
   2511    TCGv t1 = tcg_temp_new_i32();
   2512
   2513    gen_data_load(ctx, t0, addr); /* t0 = mem[addr] */
   2514    tcg_gen_xor_tl(t1, t0, Rd);
   2515    tcg_gen_mov_tl(Rd, t0); /* Rd = t0 */
   2516    gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */
   2517
   2518    tcg_temp_free_i32(t1);
   2519    tcg_temp_free_i32(t0);
   2520    tcg_temp_free_i32(addr);
   2521
   2522    return true;
   2523}
   2524
   2525/*
   2526 * Bit and Bit-test Instructions
   2527 */
   2528static void gen_rshift_ZNVSf(TCGv R)
   2529{
   2530    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */
   2531    tcg_gen_shri_tl(cpu_Nf, R, 7); /* Nf = R(7) */
   2532    tcg_gen_xor_tl(cpu_Vf, cpu_Nf, cpu_Cf);
   2533    tcg_gen_xor_tl(cpu_Sf, cpu_Nf, cpu_Vf); /* Sf = Nf ^ Vf */
   2534}
   2535
   2536/*
   2537 *  Shifts all bits in Rd one place to the right. Bit 7 is cleared. Bit 0 is
   2538 *  loaded into the C Flag of the SREG. This operation effectively divides an
   2539 *  unsigned value by two. The C Flag can be used to round the result.
   2540 */
   2541static bool trans_LSR(DisasContext *ctx, arg_LSR *a)
   2542{
   2543    TCGv Rd = cpu_r[a->rd];
   2544
   2545    tcg_gen_andi_tl(cpu_Cf, Rd, 1);
   2546    tcg_gen_shri_tl(Rd, Rd, 1);
   2547
   2548    /* update status register */
   2549    tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, Rd, 0); /* Zf = Rd == 0 */
   2550    tcg_gen_movi_tl(cpu_Nf, 0);
   2551    tcg_gen_mov_tl(cpu_Vf, cpu_Cf);
   2552    tcg_gen_mov_tl(cpu_Sf, cpu_Vf);
   2553
   2554    return true;
   2555}
   2556
   2557/*
   2558 *  Shifts all bits in Rd one place to the right. The C Flag is shifted into
   2559 *  bit 7 of Rd. Bit 0 is shifted into the C Flag.  This operation, combined
   2560 *  with ASR, effectively divides multi-byte signed values by two. Combined with
   2561 *  LSR it effectively divides multi-byte unsigned values by two. The Carry Flag
   2562 *  can be used to round the result.
   2563 */
   2564static bool trans_ROR(DisasContext *ctx, arg_ROR *a)
   2565{
   2566    TCGv Rd = cpu_r[a->rd];
   2567    TCGv t0 = tcg_temp_new_i32();
   2568
   2569    tcg_gen_shli_tl(t0, cpu_Cf, 7);
   2570
   2571    /* update status register */
   2572    tcg_gen_andi_tl(cpu_Cf, Rd, 1);
   2573
   2574    /* update output register */
   2575    tcg_gen_shri_tl(Rd, Rd, 1);
   2576    tcg_gen_or_tl(Rd, Rd, t0);
   2577
   2578    /* update status register */
   2579    gen_rshift_ZNVSf(Rd);
   2580
   2581    tcg_temp_free_i32(t0);
   2582
   2583    return true;
   2584}
   2585
   2586/*
   2587 *  Shifts all bits in Rd one place to the right. Bit 7 is held constant. Bit 0
   2588 *  is loaded into the C Flag of the SREG. This operation effectively divides a
   2589 *  signed value by two without changing its sign. The Carry Flag can be used to
   2590 *  round the result.
   2591 */
   2592static bool trans_ASR(DisasContext *ctx, arg_ASR *a)
   2593{
   2594    TCGv Rd = cpu_r[a->rd];
   2595    TCGv t0 = tcg_temp_new_i32();
   2596
   2597    /* update status register */
   2598    tcg_gen_andi_tl(cpu_Cf, Rd, 1); /* Cf = Rd(0) */
   2599
   2600    /* update output register */
   2601    tcg_gen_andi_tl(t0, Rd, 0x80); /* Rd = (Rd & 0x80) | (Rd >> 1) */
   2602    tcg_gen_shri_tl(Rd, Rd, 1);
   2603    tcg_gen_or_tl(Rd, Rd, t0);
   2604
   2605    /* update status register */
   2606    gen_rshift_ZNVSf(Rd);
   2607
   2608    tcg_temp_free_i32(t0);
   2609
   2610    return true;
   2611}
   2612
   2613/*
   2614 *  Swaps high and low nibbles in a register.
   2615 */
   2616static bool trans_SWAP(DisasContext *ctx, arg_SWAP *a)
   2617{
   2618    TCGv Rd = cpu_r[a->rd];
   2619    TCGv t0 = tcg_temp_new_i32();
   2620    TCGv t1 = tcg_temp_new_i32();
   2621
   2622    tcg_gen_andi_tl(t0, Rd, 0x0f);
   2623    tcg_gen_shli_tl(t0, t0, 4);
   2624    tcg_gen_andi_tl(t1, Rd, 0xf0);
   2625    tcg_gen_shri_tl(t1, t1, 4);
   2626    tcg_gen_or_tl(Rd, t0, t1);
   2627
   2628    tcg_temp_free_i32(t1);
   2629    tcg_temp_free_i32(t0);
   2630
   2631    return true;
   2632}
   2633
   2634/*
   2635 *  Sets a specified bit in an I/O Register. This instruction operates on
   2636 *  the lower 32 I/O Registers -- addresses 0-31.
   2637 */
   2638static bool trans_SBI(DisasContext *ctx, arg_SBI *a)
   2639{
   2640    TCGv data = tcg_temp_new_i32();
   2641    TCGv port = tcg_const_i32(a->reg);
   2642
   2643    gen_helper_inb(data, cpu_env, port);
   2644    tcg_gen_ori_tl(data, data, 1 << a->bit);
   2645    gen_helper_outb(cpu_env, port, data);
   2646
   2647    tcg_temp_free_i32(port);
   2648    tcg_temp_free_i32(data);
   2649
   2650    return true;
   2651}
   2652
   2653/*
   2654 *  Clears a specified bit in an I/O Register. This instruction operates on
   2655 *  the lower 32 I/O Registers -- addresses 0-31.
   2656 */
   2657static bool trans_CBI(DisasContext *ctx, arg_CBI *a)
   2658{
   2659    TCGv data = tcg_temp_new_i32();
   2660    TCGv port = tcg_const_i32(a->reg);
   2661
   2662    gen_helper_inb(data, cpu_env, port);
   2663    tcg_gen_andi_tl(data, data, ~(1 << a->bit));
   2664    gen_helper_outb(cpu_env, port, data);
   2665
   2666    tcg_temp_free_i32(data);
   2667    tcg_temp_free_i32(port);
   2668
   2669    return true;
   2670}
   2671
   2672/*
   2673 *  Stores bit b from Rd to the T Flag in SREG (Status Register).
   2674 */
   2675static bool trans_BST(DisasContext *ctx, arg_BST *a)
   2676{
   2677    TCGv Rd = cpu_r[a->rd];
   2678
   2679    tcg_gen_andi_tl(cpu_Tf, Rd, 1 << a->bit);
   2680    tcg_gen_shri_tl(cpu_Tf, cpu_Tf, a->bit);
   2681
   2682    return true;
   2683}
   2684
   2685/*
   2686 *  Copies the T Flag in the SREG (Status Register) to bit b in register Rd.
   2687 */
   2688static bool trans_BLD(DisasContext *ctx, arg_BLD *a)
   2689{
   2690    TCGv Rd = cpu_r[a->rd];
   2691    TCGv t1 = tcg_temp_new_i32();
   2692
   2693    tcg_gen_andi_tl(Rd, Rd, ~(1u << a->bit)); /* clear bit */
   2694    tcg_gen_shli_tl(t1, cpu_Tf, a->bit); /* create mask */
   2695    tcg_gen_or_tl(Rd, Rd, t1);
   2696
   2697    tcg_temp_free_i32(t1);
   2698
   2699    return true;
   2700}
   2701
   2702/*
   2703 *  Sets a single Flag or bit in SREG.
   2704 */
   2705static bool trans_BSET(DisasContext *ctx, arg_BSET *a)
   2706{
   2707    switch (a->bit) {
   2708    case 0x00:
   2709        tcg_gen_movi_tl(cpu_Cf, 0x01);
   2710        break;
   2711    case 0x01:
   2712        tcg_gen_movi_tl(cpu_Zf, 0x01);
   2713        break;
   2714    case 0x02:
   2715        tcg_gen_movi_tl(cpu_Nf, 0x01);
   2716        break;
   2717    case 0x03:
   2718        tcg_gen_movi_tl(cpu_Vf, 0x01);
   2719        break;
   2720    case 0x04:
   2721        tcg_gen_movi_tl(cpu_Sf, 0x01);
   2722        break;
   2723    case 0x05:
   2724        tcg_gen_movi_tl(cpu_Hf, 0x01);
   2725        break;
   2726    case 0x06:
   2727        tcg_gen_movi_tl(cpu_Tf, 0x01);
   2728        break;
   2729    case 0x07:
   2730        tcg_gen_movi_tl(cpu_If, 0x01);
   2731        break;
   2732    }
   2733
   2734    return true;
   2735}
   2736
   2737/*
   2738 *  Clears a single Flag in SREG.
   2739 */
   2740static bool trans_BCLR(DisasContext *ctx, arg_BCLR *a)
   2741{
   2742    switch (a->bit) {
   2743    case 0x00:
   2744        tcg_gen_movi_tl(cpu_Cf, 0x00);
   2745        break;
   2746    case 0x01:
   2747        tcg_gen_movi_tl(cpu_Zf, 0x00);
   2748        break;
   2749    case 0x02:
   2750        tcg_gen_movi_tl(cpu_Nf, 0x00);
   2751        break;
   2752    case 0x03:
   2753        tcg_gen_movi_tl(cpu_Vf, 0x00);
   2754        break;
   2755    case 0x04:
   2756        tcg_gen_movi_tl(cpu_Sf, 0x00);
   2757        break;
   2758    case 0x05:
   2759        tcg_gen_movi_tl(cpu_Hf, 0x00);
   2760        break;
   2761    case 0x06:
   2762        tcg_gen_movi_tl(cpu_Tf, 0x00);
   2763        break;
   2764    case 0x07:
   2765        tcg_gen_movi_tl(cpu_If, 0x00);
   2766        break;
   2767    }
   2768
   2769    return true;
   2770}
   2771
   2772/*
   2773 * MCU Control Instructions
   2774 */
   2775
   2776/*
   2777 *  The BREAK instruction is used by the On-chip Debug system, and is
   2778 *  normally not used in the application software. When the BREAK instruction is
   2779 *  executed, the AVR CPU is set in the Stopped Mode. This gives the On-chip
   2780 *  Debugger access to internal resources.  If any Lock bits are set, or either
   2781 *  the JTAGEN or OCDEN Fuses are unprogrammed, the CPU will treat the BREAK
   2782 *  instruction as a NOP and will not enter the Stopped mode.  This instruction
   2783 *  is not available in all devices. Refer to the device specific instruction
   2784 *  set summary.
   2785 */
   2786static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)
   2787{
   2788    if (!avr_have_feature(ctx, AVR_FEATURE_BREAK)) {
   2789        return true;
   2790    }
   2791
   2792#ifdef BREAKPOINT_ON_BREAK
   2793    tcg_gen_movi_tl(cpu_pc, ctx->npc - 1);
   2794    gen_helper_debug(cpu_env);
   2795    ctx->base.is_jmp = DISAS_EXIT;
   2796#else
   2797    /* NOP */
   2798#endif
   2799
   2800    return true;
   2801}
   2802
   2803/*
   2804 *  This instruction performs a single cycle No Operation.
   2805 */
   2806static bool trans_NOP(DisasContext *ctx, arg_NOP *a)
   2807{
   2808
   2809    /* NOP */
   2810
   2811    return true;
   2812}
   2813
   2814/*
   2815 *  This instruction sets the circuit in sleep mode defined by the MCU
   2816 *  Control Register.
   2817 */
   2818static bool trans_SLEEP(DisasContext *ctx, arg_SLEEP *a)
   2819{
   2820    gen_helper_sleep(cpu_env);
   2821    ctx->base.is_jmp = DISAS_NORETURN;
   2822    return true;
   2823}
   2824
   2825/*
   2826 *  This instruction resets the Watchdog Timer. This instruction must be
   2827 *  executed within a limited time given by the WD prescaler. See the Watchdog
   2828 *  Timer hardware specification.
   2829 */
   2830static bool trans_WDR(DisasContext *ctx, arg_WDR *a)
   2831{
   2832    gen_helper_wdr(cpu_env);
   2833
   2834    return true;
   2835}
   2836
   2837/*
   2838 *  Core translation mechanism functions:
   2839 *
   2840 *    - translate()
   2841 *    - canonicalize_skip()
   2842 *    - gen_intermediate_code()
   2843 *    - restore_state_to_opc()
   2844 *
   2845 */
   2846static void translate(DisasContext *ctx)
   2847{
   2848    uint32_t opcode = next_word(ctx);
   2849
   2850    if (!decode_insn(ctx, opcode)) {
   2851        gen_helper_unsupported(cpu_env);
   2852        ctx->base.is_jmp = DISAS_NORETURN;
   2853    }
   2854}
   2855
   2856/* Standardize the cpu_skip condition to NE.  */
   2857static bool canonicalize_skip(DisasContext *ctx)
   2858{
   2859    switch (ctx->skip_cond) {
   2860    case TCG_COND_NEVER:
   2861        /* Normal case: cpu_skip is known to be false.  */
   2862        return false;
   2863
   2864    case TCG_COND_ALWAYS:
   2865        /*
   2866         * Breakpoint case: cpu_skip is known to be true, via TB_FLAGS_SKIP.
   2867         * The breakpoint is on the instruction being skipped, at the start
   2868         * of the TranslationBlock.  No need to update.
   2869         */
   2870        return false;
   2871
   2872    case TCG_COND_NE:
   2873        if (ctx->skip_var1 == NULL) {
   2874            tcg_gen_mov_tl(cpu_skip, ctx->skip_var0);
   2875        } else {
   2876            tcg_gen_xor_tl(cpu_skip, ctx->skip_var0, ctx->skip_var1);
   2877            ctx->skip_var1 = NULL;
   2878        }
   2879        break;
   2880
   2881    default:
   2882        /* Convert to a NE condition vs 0. */
   2883        if (ctx->skip_var1 == NULL) {
   2884            tcg_gen_setcondi_tl(ctx->skip_cond, cpu_skip, ctx->skip_var0, 0);
   2885        } else {
   2886            tcg_gen_setcond_tl(ctx->skip_cond, cpu_skip,
   2887                               ctx->skip_var0, ctx->skip_var1);
   2888            ctx->skip_var1 = NULL;
   2889        }
   2890        ctx->skip_cond = TCG_COND_NE;
   2891        break;
   2892    }
   2893    if (ctx->free_skip_var0) {
   2894        tcg_temp_free(ctx->skip_var0);
   2895        ctx->free_skip_var0 = false;
   2896    }
   2897    ctx->skip_var0 = cpu_skip;
   2898    return true;
   2899}
   2900
   2901static void avr_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
   2902{
   2903    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2904    CPUAVRState *env = cs->env_ptr;
   2905    uint32_t tb_flags = ctx->base.tb->flags;
   2906
   2907    ctx->cs = cs;
   2908    ctx->env = env;
   2909    ctx->npc = ctx->base.pc_first / 2;
   2910
   2911    ctx->skip_cond = TCG_COND_NEVER;
   2912    if (tb_flags & TB_FLAGS_SKIP) {
   2913        ctx->skip_cond = TCG_COND_ALWAYS;
   2914        ctx->skip_var0 = cpu_skip;
   2915    }
   2916
   2917    if (tb_flags & TB_FLAGS_FULL_ACCESS) {
   2918        /*
   2919         * This flag is set by ST/LD instruction we will regenerate it ONLY
   2920         * with mem/cpu memory access instead of mem access
   2921         */
   2922        ctx->base.max_insns = 1;
   2923    }
   2924}
   2925
   2926static void avr_tr_tb_start(DisasContextBase *db, CPUState *cs)
   2927{
   2928}
   2929
   2930static void avr_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
   2931{
   2932    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2933
   2934    tcg_gen_insn_start(ctx->npc);
   2935}
   2936
   2937static void avr_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
   2938{
   2939    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2940    TCGLabel *skip_label = NULL;
   2941
   2942    /* Conditionally skip the next instruction, if indicated.  */
   2943    if (ctx->skip_cond != TCG_COND_NEVER) {
   2944        skip_label = gen_new_label();
   2945        if (ctx->skip_var0 == cpu_skip) {
   2946            /*
   2947             * Copy cpu_skip so that we may zero it before the branch.
   2948             * This ensures that cpu_skip is non-zero after the label
   2949             * if and only if the skipped insn itself sets a skip.
   2950             */
   2951            ctx->free_skip_var0 = true;
   2952            ctx->skip_var0 = tcg_temp_new();
   2953            tcg_gen_mov_tl(ctx->skip_var0, cpu_skip);
   2954            tcg_gen_movi_tl(cpu_skip, 0);
   2955        }
   2956        if (ctx->skip_var1 == NULL) {
   2957            tcg_gen_brcondi_tl(ctx->skip_cond, ctx->skip_var0, 0, skip_label);
   2958        } else {
   2959            tcg_gen_brcond_tl(ctx->skip_cond, ctx->skip_var0,
   2960                              ctx->skip_var1, skip_label);
   2961            ctx->skip_var1 = NULL;
   2962        }
   2963        if (ctx->free_skip_var0) {
   2964            tcg_temp_free(ctx->skip_var0);
   2965            ctx->free_skip_var0 = false;
   2966        }
   2967        ctx->skip_cond = TCG_COND_NEVER;
   2968        ctx->skip_var0 = NULL;
   2969    }
   2970
   2971    translate(ctx);
   2972
   2973    ctx->base.pc_next = ctx->npc * 2;
   2974
   2975    if (skip_label) {
   2976        canonicalize_skip(ctx);
   2977        gen_set_label(skip_label);
   2978        if (ctx->base.is_jmp == DISAS_NORETURN) {
   2979            ctx->base.is_jmp = DISAS_CHAIN;
   2980        }
   2981    }
   2982
   2983    if (ctx->base.is_jmp == DISAS_NEXT) {
   2984        target_ulong page_first = ctx->base.pc_first & TARGET_PAGE_MASK;
   2985
   2986        if ((ctx->base.pc_next - page_first) >= TARGET_PAGE_SIZE - 4) {
   2987            ctx->base.is_jmp = DISAS_TOO_MANY;
   2988        }
   2989    }
   2990}
   2991
   2992static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
   2993{
   2994    DisasContext *ctx = container_of(dcbase, DisasContext, base);
   2995    bool nonconst_skip = canonicalize_skip(ctx);
   2996
   2997    switch (ctx->base.is_jmp) {
   2998    case DISAS_NORETURN:
   2999        assert(!nonconst_skip);
   3000        break;
   3001    case DISAS_NEXT:
   3002    case DISAS_TOO_MANY:
   3003    case DISAS_CHAIN:
   3004        if (!nonconst_skip) {
   3005            /* Note gen_goto_tb checks singlestep.  */
   3006            gen_goto_tb(ctx, 1, ctx->npc);
   3007            break;
   3008        }
   3009        tcg_gen_movi_tl(cpu_pc, ctx->npc);
   3010        /* fall through */
   3011    case DISAS_LOOKUP:
   3012        if (!ctx->base.singlestep_enabled) {
   3013            tcg_gen_lookup_and_goto_ptr();
   3014            break;
   3015        }
   3016        /* fall through */
   3017    case DISAS_EXIT:
   3018        if (ctx->base.singlestep_enabled) {
   3019            gen_helper_debug(cpu_env);
   3020        } else {
   3021            tcg_gen_exit_tb(NULL, 0);
   3022        }
   3023        break;
   3024    default:
   3025        g_assert_not_reached();
   3026    }
   3027}
   3028
   3029static void avr_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
   3030{
   3031    qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
   3032    log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
   3033}
   3034
   3035static const TranslatorOps avr_tr_ops = {
   3036    .init_disas_context = avr_tr_init_disas_context,
   3037    .tb_start           = avr_tr_tb_start,
   3038    .insn_start         = avr_tr_insn_start,
   3039    .translate_insn     = avr_tr_translate_insn,
   3040    .tb_stop            = avr_tr_tb_stop,
   3041    .disas_log          = avr_tr_disas_log,
   3042};
   3043
   3044void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
   3045{
   3046    DisasContext dc = { };
   3047    translator_loop(&avr_tr_ops, &dc.base, cs, tb, max_insns);
   3048}
   3049
   3050void restore_state_to_opc(CPUAVRState *env, TranslationBlock *tb,
   3051                            target_ulong *data)
   3052{
   3053    env->pc_w = data[0];
   3054}