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