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