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