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