xref: /openbmc/qemu/tcg/tci.c (revision b6d69fcefbd45ca33b896abfbc8e27e0f713bdf0)
1 /*
2  * Tiny Code Interpreter for QEMU
3  *
4  * Copyright (c) 2009, 2011, 2016 Stefan Weil
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program 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
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "qemu/osdep.h"
21 #include "tcg/tcg.h"
22 #include "tcg/helper-info.h"
23 #include "tcg/tcg-ldst.h"
24 #include "disas/dis-asm.h"
25 #include "tcg-has.h"
26 #include <ffi.h>
27 
28 
29 #define ctpop_tr    glue(ctpop, TCG_TARGET_REG_BITS)
30 
31 /*
32  * Enable TCI assertions only when debugging TCG (and without NDEBUG defined).
33  * Without assertions, the interpreter runs much faster.
34  */
35 #if defined(CONFIG_DEBUG_TCG)
36 # define tci_assert(cond) assert(cond)
37 #else
38 # define tci_assert(cond) ((void)(cond))
39 #endif
40 
41 __thread uintptr_t tci_tb_ptr;
42 
43 static void tci_write_reg64(tcg_target_ulong *regs, uint32_t high_index,
44                             uint32_t low_index, uint64_t value)
45 {
46     regs[low_index] = (uint32_t)value;
47     regs[high_index] = value >> 32;
48 }
49 
50 /* Create a 64 bit value from two 32 bit values. */
51 static uint64_t tci_uint64(uint32_t high, uint32_t low)
52 {
53     return ((uint64_t)high << 32) + low;
54 }
55 
56 /*
57  * Load sets of arguments all at once.  The naming convention is:
58  *   tci_args_<arguments>
59  * where arguments is a sequence of
60  *
61  *   b = immediate (bit position)
62  *   c = condition (TCGCond)
63  *   i = immediate (uint32_t)
64  *   I = immediate (tcg_target_ulong)
65  *   l = label or pointer
66  *   m = immediate (MemOpIdx)
67  *   n = immediate (call return length)
68  *   r = register
69  *   s = signed ldst offset
70  */
71 
72 static void tci_args_l(uint32_t insn, const void *tb_ptr, void **l0)
73 {
74     int diff = sextract32(insn, 12, 20);
75     *l0 = diff ? (void *)tb_ptr + diff : NULL;
76 }
77 
78 static void tci_args_r(uint32_t insn, TCGReg *r0)
79 {
80     *r0 = extract32(insn, 8, 4);
81 }
82 
83 static void tci_args_nl(uint32_t insn, const void *tb_ptr,
84                         uint8_t *n0, void **l1)
85 {
86     *n0 = extract32(insn, 8, 4);
87     *l1 = sextract32(insn, 12, 20) + (void *)tb_ptr;
88 }
89 
90 static void tci_args_rl(uint32_t insn, const void *tb_ptr,
91                         TCGReg *r0, void **l1)
92 {
93     *r0 = extract32(insn, 8, 4);
94     *l1 = sextract32(insn, 12, 20) + (void *)tb_ptr;
95 }
96 
97 static void tci_args_rr(uint32_t insn, TCGReg *r0, TCGReg *r1)
98 {
99     *r0 = extract32(insn, 8, 4);
100     *r1 = extract32(insn, 12, 4);
101 }
102 
103 static void tci_args_ri(uint32_t insn, TCGReg *r0, tcg_target_ulong *i1)
104 {
105     *r0 = extract32(insn, 8, 4);
106     *i1 = sextract32(insn, 12, 20);
107 }
108 
109 static void tci_args_rrm(uint32_t insn, TCGReg *r0,
110                          TCGReg *r1, MemOpIdx *m2)
111 {
112     *r0 = extract32(insn, 8, 4);
113     *r1 = extract32(insn, 12, 4);
114     *m2 = extract32(insn, 16, 16);
115 }
116 
117 static void tci_args_rrr(uint32_t insn, TCGReg *r0, TCGReg *r1, TCGReg *r2)
118 {
119     *r0 = extract32(insn, 8, 4);
120     *r1 = extract32(insn, 12, 4);
121     *r2 = extract32(insn, 16, 4);
122 }
123 
124 static void tci_args_rrs(uint32_t insn, TCGReg *r0, TCGReg *r1, int32_t *i2)
125 {
126     *r0 = extract32(insn, 8, 4);
127     *r1 = extract32(insn, 12, 4);
128     *i2 = sextract32(insn, 16, 16);
129 }
130 
131 static void tci_args_rrbb(uint32_t insn, TCGReg *r0, TCGReg *r1,
132                           uint8_t *i2, uint8_t *i3)
133 {
134     *r0 = extract32(insn, 8, 4);
135     *r1 = extract32(insn, 12, 4);
136     *i2 = extract32(insn, 16, 6);
137     *i3 = extract32(insn, 22, 6);
138 }
139 
140 static void tci_args_rrrc(uint32_t insn,
141                           TCGReg *r0, TCGReg *r1, TCGReg *r2, TCGCond *c3)
142 {
143     *r0 = extract32(insn, 8, 4);
144     *r1 = extract32(insn, 12, 4);
145     *r2 = extract32(insn, 16, 4);
146     *c3 = extract32(insn, 20, 4);
147 }
148 
149 static void tci_args_rrrbb(uint32_t insn, TCGReg *r0, TCGReg *r1,
150                            TCGReg *r2, uint8_t *i3, uint8_t *i4)
151 {
152     *r0 = extract32(insn, 8, 4);
153     *r1 = extract32(insn, 12, 4);
154     *r2 = extract32(insn, 16, 4);
155     *i3 = extract32(insn, 20, 6);
156     *i4 = extract32(insn, 26, 6);
157 }
158 
159 static void tci_args_rrrr(uint32_t insn,
160                           TCGReg *r0, TCGReg *r1, TCGReg *r2, TCGReg *r3)
161 {
162     *r0 = extract32(insn, 8, 4);
163     *r1 = extract32(insn, 12, 4);
164     *r2 = extract32(insn, 16, 4);
165     *r3 = extract32(insn, 20, 4);
166 }
167 
168 static void tci_args_rrrrrc(uint32_t insn, TCGReg *r0, TCGReg *r1,
169                             TCGReg *r2, TCGReg *r3, TCGReg *r4, TCGCond *c5)
170 {
171     *r0 = extract32(insn, 8, 4);
172     *r1 = extract32(insn, 12, 4);
173     *r2 = extract32(insn, 16, 4);
174     *r3 = extract32(insn, 20, 4);
175     *r4 = extract32(insn, 24, 4);
176     *c5 = extract32(insn, 28, 4);
177 }
178 
179 static void tci_args_rrrrrr(uint32_t insn, TCGReg *r0, TCGReg *r1,
180                             TCGReg *r2, TCGReg *r3, TCGReg *r4, TCGReg *r5)
181 {
182     *r0 = extract32(insn, 8, 4);
183     *r1 = extract32(insn, 12, 4);
184     *r2 = extract32(insn, 16, 4);
185     *r3 = extract32(insn, 20, 4);
186     *r4 = extract32(insn, 24, 4);
187     *r5 = extract32(insn, 28, 4);
188 }
189 
190 static bool tci_compare32(uint32_t u0, uint32_t u1, TCGCond condition)
191 {
192     bool result = false;
193     int32_t i0 = u0;
194     int32_t i1 = u1;
195     switch (condition) {
196     case TCG_COND_EQ:
197         result = (u0 == u1);
198         break;
199     case TCG_COND_NE:
200         result = (u0 != u1);
201         break;
202     case TCG_COND_LT:
203         result = (i0 < i1);
204         break;
205     case TCG_COND_GE:
206         result = (i0 >= i1);
207         break;
208     case TCG_COND_LE:
209         result = (i0 <= i1);
210         break;
211     case TCG_COND_GT:
212         result = (i0 > i1);
213         break;
214     case TCG_COND_LTU:
215         result = (u0 < u1);
216         break;
217     case TCG_COND_GEU:
218         result = (u0 >= u1);
219         break;
220     case TCG_COND_LEU:
221         result = (u0 <= u1);
222         break;
223     case TCG_COND_GTU:
224         result = (u0 > u1);
225         break;
226     case TCG_COND_TSTEQ:
227         result = (u0 & u1) == 0;
228         break;
229     case TCG_COND_TSTNE:
230         result = (u0 & u1) != 0;
231         break;
232     default:
233         g_assert_not_reached();
234     }
235     return result;
236 }
237 
238 static bool tci_compare64(uint64_t u0, uint64_t u1, TCGCond condition)
239 {
240     bool result = false;
241     int64_t i0 = u0;
242     int64_t i1 = u1;
243     switch (condition) {
244     case TCG_COND_EQ:
245         result = (u0 == u1);
246         break;
247     case TCG_COND_NE:
248         result = (u0 != u1);
249         break;
250     case TCG_COND_LT:
251         result = (i0 < i1);
252         break;
253     case TCG_COND_GE:
254         result = (i0 >= i1);
255         break;
256     case TCG_COND_LE:
257         result = (i0 <= i1);
258         break;
259     case TCG_COND_GT:
260         result = (i0 > i1);
261         break;
262     case TCG_COND_LTU:
263         result = (u0 < u1);
264         break;
265     case TCG_COND_GEU:
266         result = (u0 >= u1);
267         break;
268     case TCG_COND_LEU:
269         result = (u0 <= u1);
270         break;
271     case TCG_COND_GTU:
272         result = (u0 > u1);
273         break;
274     case TCG_COND_TSTEQ:
275         result = (u0 & u1) == 0;
276         break;
277     case TCG_COND_TSTNE:
278         result = (u0 & u1) != 0;
279         break;
280     default:
281         g_assert_not_reached();
282     }
283     return result;
284 }
285 
286 static uint64_t tci_qemu_ld(CPUArchState *env, uint64_t taddr,
287                             MemOpIdx oi, const void *tb_ptr)
288 {
289     MemOp mop = get_memop(oi);
290     uintptr_t ra = (uintptr_t)tb_ptr;
291 
292     switch (mop & MO_SSIZE) {
293     case MO_UB:
294         return helper_ldub_mmu(env, taddr, oi, ra);
295     case MO_SB:
296         return helper_ldsb_mmu(env, taddr, oi, ra);
297     case MO_UW:
298         return helper_lduw_mmu(env, taddr, oi, ra);
299     case MO_SW:
300         return helper_ldsw_mmu(env, taddr, oi, ra);
301     case MO_UL:
302         return helper_ldul_mmu(env, taddr, oi, ra);
303     case MO_SL:
304         return helper_ldsl_mmu(env, taddr, oi, ra);
305     case MO_UQ:
306         return helper_ldq_mmu(env, taddr, oi, ra);
307     default:
308         g_assert_not_reached();
309     }
310 }
311 
312 static void tci_qemu_st(CPUArchState *env, uint64_t taddr, uint64_t val,
313                         MemOpIdx oi, const void *tb_ptr)
314 {
315     MemOp mop = get_memop(oi);
316     uintptr_t ra = (uintptr_t)tb_ptr;
317 
318     switch (mop & MO_SIZE) {
319     case MO_UB:
320         helper_stb_mmu(env, taddr, val, oi, ra);
321         break;
322     case MO_UW:
323         helper_stw_mmu(env, taddr, val, oi, ra);
324         break;
325     case MO_UL:
326         helper_stl_mmu(env, taddr, val, oi, ra);
327         break;
328     case MO_UQ:
329         helper_stq_mmu(env, taddr, val, oi, ra);
330         break;
331     default:
332         g_assert_not_reached();
333     }
334 }
335 
336 #if TCG_TARGET_REG_BITS == 64
337 # define CASE_32_64(x) \
338         case glue(glue(INDEX_op_, x), _i64): \
339         case glue(glue(INDEX_op_, x), _i32):
340 # define CASE_64(x) \
341         case glue(glue(INDEX_op_, x), _i64):
342 #else
343 # define CASE_32_64(x) \
344         case glue(glue(INDEX_op_, x), _i32):
345 # define CASE_64(x)
346 #endif
347 
348 /* Interpret pseudo code in tb. */
349 /*
350  * Disable CFI checks.
351  * One possible operation in the pseudo code is a call to binary code.
352  * Therefore, disable CFI checks in the interpreter function
353  */
354 uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
355                                             const void *v_tb_ptr)
356 {
357     const uint32_t *tb_ptr = v_tb_ptr;
358     tcg_target_ulong regs[TCG_TARGET_NB_REGS];
359     uint64_t stack[(TCG_STATIC_CALL_ARGS_SIZE + TCG_STATIC_FRAME_SIZE)
360                    / sizeof(uint64_t)];
361 
362     regs[TCG_AREG0] = (tcg_target_ulong)env;
363     regs[TCG_REG_CALL_STACK] = (uintptr_t)stack;
364     tci_assert(tb_ptr);
365 
366     for (;;) {
367         uint32_t insn;
368         TCGOpcode opc;
369         TCGReg r0, r1, r2, r3, r4, r5;
370         tcg_target_ulong t1;
371         TCGCond condition;
372         uint8_t pos, len;
373         uint32_t tmp32;
374         uint64_t tmp64, taddr;
375         uint64_t T1, T2;
376         MemOpIdx oi;
377         int32_t ofs;
378         void *ptr;
379 
380         insn = *tb_ptr++;
381         opc = extract32(insn, 0, 8);
382 
383         switch (opc) {
384         case INDEX_op_call:
385             {
386                 void *call_slots[MAX_CALL_IARGS];
387                 ffi_cif *cif;
388                 void *func;
389                 unsigned i, s, n;
390 
391                 tci_args_nl(insn, tb_ptr, &len, &ptr);
392                 func = ((void **)ptr)[0];
393                 cif = ((void **)ptr)[1];
394 
395                 n = cif->nargs;
396                 for (i = s = 0; i < n; ++i) {
397                     ffi_type *t = cif->arg_types[i];
398                     call_slots[i] = &stack[s];
399                     s += DIV_ROUND_UP(t->size, 8);
400                 }
401 
402                 /* Helper functions may need to access the "return address" */
403                 tci_tb_ptr = (uintptr_t)tb_ptr;
404                 ffi_call(cif, func, stack, call_slots);
405             }
406 
407             switch (len) {
408             case 0: /* void */
409                 break;
410             case 1: /* uint32_t */
411                 /*
412                  * The result winds up "left-aligned" in the stack[0] slot.
413                  * Note that libffi has an odd special case in that it will
414                  * always widen an integral result to ffi_arg.
415                  */
416                 if (sizeof(ffi_arg) == 8) {
417                     regs[TCG_REG_R0] = (uint32_t)stack[0];
418                 } else {
419                     regs[TCG_REG_R0] = *(uint32_t *)stack;
420                 }
421                 break;
422             case 2: /* uint64_t */
423                 /*
424                  * For TCG_TARGET_REG_BITS == 32, the register pair
425                  * must stay in host memory order.
426                  */
427                 memcpy(&regs[TCG_REG_R0], stack, 8);
428                 break;
429             case 3: /* Int128 */
430                 memcpy(&regs[TCG_REG_R0], stack, 16);
431                 break;
432             default:
433                 g_assert_not_reached();
434             }
435             break;
436 
437         case INDEX_op_br:
438             tci_args_l(insn, tb_ptr, &ptr);
439             tb_ptr = ptr;
440             continue;
441         case INDEX_op_movcond_i32:
442             tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
443             tmp32 = tci_compare32(regs[r1], regs[r2], condition);
444             regs[r0] = regs[tmp32 ? r3 : r4];
445             break;
446 #if TCG_TARGET_REG_BITS == 32
447         case INDEX_op_setcond2_i32:
448             tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
449             T1 = tci_uint64(regs[r2], regs[r1]);
450             T2 = tci_uint64(regs[r4], regs[r3]);
451             regs[r0] = tci_compare64(T1, T2, condition);
452             break;
453 #elif TCG_TARGET_REG_BITS == 64
454         case INDEX_op_setcond:
455             tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
456             regs[r0] = tci_compare64(regs[r1], regs[r2], condition);
457             break;
458         case INDEX_op_movcond_i64:
459             tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &condition);
460             tmp32 = tci_compare64(regs[r1], regs[r2], condition);
461             regs[r0] = regs[tmp32 ? r3 : r4];
462             break;
463 #endif
464         case INDEX_op_mov:
465             tci_args_rr(insn, &r0, &r1);
466             regs[r0] = regs[r1];
467             break;
468         case INDEX_op_tci_movi:
469             tci_args_ri(insn, &r0, &t1);
470             regs[r0] = t1;
471             break;
472         case INDEX_op_tci_movl:
473             tci_args_rl(insn, tb_ptr, &r0, &ptr);
474             regs[r0] = *(tcg_target_ulong *)ptr;
475             break;
476 
477             /* Load/store operations (32 bit). */
478 
479         CASE_32_64(ld8u)
480             tci_args_rrs(insn, &r0, &r1, &ofs);
481             ptr = (void *)(regs[r1] + ofs);
482             regs[r0] = *(uint8_t *)ptr;
483             break;
484         CASE_32_64(ld8s)
485             tci_args_rrs(insn, &r0, &r1, &ofs);
486             ptr = (void *)(regs[r1] + ofs);
487             regs[r0] = *(int8_t *)ptr;
488             break;
489         CASE_32_64(ld16u)
490             tci_args_rrs(insn, &r0, &r1, &ofs);
491             ptr = (void *)(regs[r1] + ofs);
492             regs[r0] = *(uint16_t *)ptr;
493             break;
494         CASE_32_64(ld16s)
495             tci_args_rrs(insn, &r0, &r1, &ofs);
496             ptr = (void *)(regs[r1] + ofs);
497             regs[r0] = *(int16_t *)ptr;
498             break;
499         case INDEX_op_ld_i32:
500         CASE_64(ld32u)
501             tci_args_rrs(insn, &r0, &r1, &ofs);
502             ptr = (void *)(regs[r1] + ofs);
503             regs[r0] = *(uint32_t *)ptr;
504             break;
505         CASE_32_64(st8)
506             tci_args_rrs(insn, &r0, &r1, &ofs);
507             ptr = (void *)(regs[r1] + ofs);
508             *(uint8_t *)ptr = regs[r0];
509             break;
510         CASE_32_64(st16)
511             tci_args_rrs(insn, &r0, &r1, &ofs);
512             ptr = (void *)(regs[r1] + ofs);
513             *(uint16_t *)ptr = regs[r0];
514             break;
515         case INDEX_op_st_i32:
516         CASE_64(st32)
517             tci_args_rrs(insn, &r0, &r1, &ofs);
518             ptr = (void *)(regs[r1] + ofs);
519             *(uint32_t *)ptr = regs[r0];
520             break;
521 
522             /* Arithmetic operations (mixed 32/64 bit). */
523 
524         case INDEX_op_add:
525             tci_args_rrr(insn, &r0, &r1, &r2);
526             regs[r0] = regs[r1] + regs[r2];
527             break;
528         case INDEX_op_sub:
529             tci_args_rrr(insn, &r0, &r1, &r2);
530             regs[r0] = regs[r1] - regs[r2];
531             break;
532         case INDEX_op_mul:
533             tci_args_rrr(insn, &r0, &r1, &r2);
534             regs[r0] = regs[r1] * regs[r2];
535             break;
536         case INDEX_op_and:
537             tci_args_rrr(insn, &r0, &r1, &r2);
538             regs[r0] = regs[r1] & regs[r2];
539             break;
540         case INDEX_op_or:
541             tci_args_rrr(insn, &r0, &r1, &r2);
542             regs[r0] = regs[r1] | regs[r2];
543             break;
544         case INDEX_op_xor:
545             tci_args_rrr(insn, &r0, &r1, &r2);
546             regs[r0] = regs[r1] ^ regs[r2];
547             break;
548         case INDEX_op_andc:
549             tci_args_rrr(insn, &r0, &r1, &r2);
550             regs[r0] = regs[r1] & ~regs[r2];
551             break;
552         case INDEX_op_orc:
553             tci_args_rrr(insn, &r0, &r1, &r2);
554             regs[r0] = regs[r1] | ~regs[r2];
555             break;
556         case INDEX_op_eqv:
557             tci_args_rrr(insn, &r0, &r1, &r2);
558             regs[r0] = ~(regs[r1] ^ regs[r2]);
559             break;
560         case INDEX_op_nand:
561             tci_args_rrr(insn, &r0, &r1, &r2);
562             regs[r0] = ~(regs[r1] & regs[r2]);
563             break;
564         case INDEX_op_nor:
565             tci_args_rrr(insn, &r0, &r1, &r2);
566             regs[r0] = ~(regs[r1] | regs[r2]);
567             break;
568         case INDEX_op_neg:
569             tci_args_rr(insn, &r0, &r1);
570             regs[r0] = -regs[r1];
571             break;
572         case INDEX_op_not:
573             tci_args_rr(insn, &r0, &r1);
574             regs[r0] = ~regs[r1];
575             break;
576         case INDEX_op_ctpop:
577             tci_args_rr(insn, &r0, &r1);
578             regs[r0] = ctpop_tr(regs[r1]);
579             break;
580         case INDEX_op_muls2:
581             tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
582 #if TCG_TARGET_REG_BITS == 32
583             tmp64 = (int64_t)(int32_t)regs[r2] * (int32_t)regs[r3];
584             tci_write_reg64(regs, r1, r0, tmp64);
585 #else
586             muls64(&regs[r0], &regs[r1], regs[r2], regs[r3]);
587 #endif
588             break;
589         case INDEX_op_mulu2:
590             tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
591 #if TCG_TARGET_REG_BITS == 32
592             tmp64 = (uint64_t)(uint32_t)regs[r2] * (uint32_t)regs[r3];
593             tci_write_reg64(regs, r1, r0, tmp64);
594 #else
595             mulu64(&regs[r0], &regs[r1], regs[r2], regs[r3]);
596 #endif
597             break;
598 
599             /* Arithmetic operations (32 bit). */
600 
601         case INDEX_op_tci_divs32:
602             tci_args_rrr(insn, &r0, &r1, &r2);
603             regs[r0] = (int32_t)regs[r1] / (int32_t)regs[r2];
604             break;
605         case INDEX_op_tci_divu32:
606             tci_args_rrr(insn, &r0, &r1, &r2);
607             regs[r0] = (uint32_t)regs[r1] / (uint32_t)regs[r2];
608             break;
609         case INDEX_op_tci_rems32:
610             tci_args_rrr(insn, &r0, &r1, &r2);
611             regs[r0] = (int32_t)regs[r1] % (int32_t)regs[r2];
612             break;
613         case INDEX_op_tci_remu32:
614             tci_args_rrr(insn, &r0, &r1, &r2);
615             regs[r0] = (uint32_t)regs[r1] % (uint32_t)regs[r2];
616             break;
617         case INDEX_op_tci_clz32:
618             tci_args_rrr(insn, &r0, &r1, &r2);
619             tmp32 = regs[r1];
620             regs[r0] = tmp32 ? clz32(tmp32) : regs[r2];
621             break;
622         case INDEX_op_tci_ctz32:
623             tci_args_rrr(insn, &r0, &r1, &r2);
624             tmp32 = regs[r1];
625             regs[r0] = tmp32 ? ctz32(tmp32) : regs[r2];
626             break;
627         case INDEX_op_tci_setcond32:
628             tci_args_rrrc(insn, &r0, &r1, &r2, &condition);
629             regs[r0] = tci_compare32(regs[r1], regs[r2], condition);
630             break;
631 
632             /* Shift/rotate operations. */
633 
634         case INDEX_op_shl:
635             tci_args_rrr(insn, &r0, &r1, &r2);
636             regs[r0] = regs[r1] << (regs[r2] % TCG_TARGET_REG_BITS);
637             break;
638         case INDEX_op_shr:
639             tci_args_rrr(insn, &r0, &r1, &r2);
640             regs[r0] = regs[r1] >> (regs[r2] % TCG_TARGET_REG_BITS);
641             break;
642         case INDEX_op_sar:
643             tci_args_rrr(insn, &r0, &r1, &r2);
644             regs[r0] = ((tcg_target_long)regs[r1]
645                         >> (regs[r2] % TCG_TARGET_REG_BITS));
646             break;
647         case INDEX_op_tci_rotl32:
648             tci_args_rrr(insn, &r0, &r1, &r2);
649             regs[r0] = rol32(regs[r1], regs[r2] & 31);
650             break;
651         case INDEX_op_tci_rotr32:
652             tci_args_rrr(insn, &r0, &r1, &r2);
653             regs[r0] = ror32(regs[r1], regs[r2] & 31);
654             break;
655         case INDEX_op_deposit_i32:
656             tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
657             regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
658             break;
659         case INDEX_op_extract_i32:
660             tci_args_rrbb(insn, &r0, &r1, &pos, &len);
661             regs[r0] = extract32(regs[r1], pos, len);
662             break;
663         case INDEX_op_sextract_i32:
664             tci_args_rrbb(insn, &r0, &r1, &pos, &len);
665             regs[r0] = sextract32(regs[r1], pos, len);
666             break;
667         case INDEX_op_brcond:
668             tci_args_rl(insn, tb_ptr, &r0, &ptr);
669             if (regs[r0]) {
670                 tb_ptr = ptr;
671             }
672             break;
673 #if TCG_TARGET_REG_BITS == 32 || TCG_TARGET_HAS_add2_i32
674         case INDEX_op_add2_i32:
675             tci_args_rrrrrr(insn, &r0, &r1, &r2, &r3, &r4, &r5);
676             T1 = tci_uint64(regs[r3], regs[r2]);
677             T2 = tci_uint64(regs[r5], regs[r4]);
678             tci_write_reg64(regs, r1, r0, T1 + T2);
679             break;
680 #endif
681 #if TCG_TARGET_REG_BITS == 32 || TCG_TARGET_HAS_sub2_i32
682         case INDEX_op_sub2_i32:
683             tci_args_rrrrrr(insn, &r0, &r1, &r2, &r3, &r4, &r5);
684             T1 = tci_uint64(regs[r3], regs[r2]);
685             T2 = tci_uint64(regs[r5], regs[r4]);
686             tci_write_reg64(regs, r1, r0, T1 - T2);
687             break;
688 #endif
689 #if TCG_TARGET_HAS_bswap16_i32 || TCG_TARGET_HAS_bswap16_i64
690         CASE_32_64(bswap16)
691             tci_args_rr(insn, &r0, &r1);
692             regs[r0] = bswap16(regs[r1]);
693             break;
694 #endif
695 #if TCG_TARGET_HAS_bswap32_i32 || TCG_TARGET_HAS_bswap32_i64
696         CASE_32_64(bswap32)
697             tci_args_rr(insn, &r0, &r1);
698             regs[r0] = bswap32(regs[r1]);
699             break;
700 #endif
701 #if TCG_TARGET_REG_BITS == 64
702             /* Load/store operations (64 bit). */
703 
704         case INDEX_op_ld32s_i64:
705             tci_args_rrs(insn, &r0, &r1, &ofs);
706             ptr = (void *)(regs[r1] + ofs);
707             regs[r0] = *(int32_t *)ptr;
708             break;
709         case INDEX_op_ld_i64:
710             tci_args_rrs(insn, &r0, &r1, &ofs);
711             ptr = (void *)(regs[r1] + ofs);
712             regs[r0] = *(uint64_t *)ptr;
713             break;
714         case INDEX_op_st_i64:
715             tci_args_rrs(insn, &r0, &r1, &ofs);
716             ptr = (void *)(regs[r1] + ofs);
717             *(uint64_t *)ptr = regs[r0];
718             break;
719 
720             /* Arithmetic operations (64 bit). */
721 
722         case INDEX_op_divs:
723             tci_args_rrr(insn, &r0, &r1, &r2);
724             regs[r0] = (int64_t)regs[r1] / (int64_t)regs[r2];
725             break;
726         case INDEX_op_divu:
727             tci_args_rrr(insn, &r0, &r1, &r2);
728             regs[r0] = (uint64_t)regs[r1] / (uint64_t)regs[r2];
729             break;
730         case INDEX_op_rems:
731             tci_args_rrr(insn, &r0, &r1, &r2);
732             regs[r0] = (int64_t)regs[r1] % (int64_t)regs[r2];
733             break;
734         case INDEX_op_remu:
735             tci_args_rrr(insn, &r0, &r1, &r2);
736             regs[r0] = (uint64_t)regs[r1] % (uint64_t)regs[r2];
737             break;
738         case INDEX_op_clz:
739             tci_args_rrr(insn, &r0, &r1, &r2);
740             regs[r0] = regs[r1] ? clz64(regs[r1]) : regs[r2];
741             break;
742         case INDEX_op_ctz:
743             tci_args_rrr(insn, &r0, &r1, &r2);
744             regs[r0] = regs[r1] ? ctz64(regs[r1]) : regs[r2];
745             break;
746 #if TCG_TARGET_HAS_add2_i64
747         case INDEX_op_add2_i64:
748             tci_args_rrrrrr(insn, &r0, &r1, &r2, &r3, &r4, &r5);
749             T1 = regs[r2] + regs[r4];
750             T2 = regs[r3] + regs[r5] + (T1 < regs[r2]);
751             regs[r0] = T1;
752             regs[r1] = T2;
753             break;
754 #endif
755 #if TCG_TARGET_HAS_add2_i64
756         case INDEX_op_sub2_i64:
757             tci_args_rrrrrr(insn, &r0, &r1, &r2, &r3, &r4, &r5);
758             T1 = regs[r2] - regs[r4];
759             T2 = regs[r3] - regs[r5] - (regs[r2] < regs[r4]);
760             regs[r0] = T1;
761             regs[r1] = T2;
762             break;
763 #endif
764 
765             /* Shift/rotate operations (64 bit). */
766 
767         case INDEX_op_rotl:
768             tci_args_rrr(insn, &r0, &r1, &r2);
769             regs[r0] = rol64(regs[r1], regs[r2] & 63);
770             break;
771         case INDEX_op_rotr:
772             tci_args_rrr(insn, &r0, &r1, &r2);
773             regs[r0] = ror64(regs[r1], regs[r2] & 63);
774             break;
775         case INDEX_op_deposit_i64:
776             tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
777             regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
778             break;
779         case INDEX_op_extract_i64:
780             tci_args_rrbb(insn, &r0, &r1, &pos, &len);
781             regs[r0] = extract64(regs[r1], pos, len);
782             break;
783         case INDEX_op_sextract_i64:
784             tci_args_rrbb(insn, &r0, &r1, &pos, &len);
785             regs[r0] = sextract64(regs[r1], pos, len);
786             break;
787         case INDEX_op_ext_i32_i64:
788             tci_args_rr(insn, &r0, &r1);
789             regs[r0] = (int32_t)regs[r1];
790             break;
791         case INDEX_op_extu_i32_i64:
792             tci_args_rr(insn, &r0, &r1);
793             regs[r0] = (uint32_t)regs[r1];
794             break;
795 #if TCG_TARGET_HAS_bswap64_i64
796         case INDEX_op_bswap64_i64:
797             tci_args_rr(insn, &r0, &r1);
798             regs[r0] = bswap64(regs[r1]);
799             break;
800 #endif
801 #endif /* TCG_TARGET_REG_BITS == 64 */
802 
803             /* QEMU specific operations. */
804 
805         case INDEX_op_exit_tb:
806             tci_args_l(insn, tb_ptr, &ptr);
807             return (uintptr_t)ptr;
808 
809         case INDEX_op_goto_tb:
810             tci_args_l(insn, tb_ptr, &ptr);
811             tb_ptr = *(void **)ptr;
812             break;
813 
814         case INDEX_op_goto_ptr:
815             tci_args_r(insn, &r0);
816             ptr = (void *)regs[r0];
817             if (!ptr) {
818                 return 0;
819             }
820             tb_ptr = ptr;
821             break;
822 
823         case INDEX_op_qemu_ld_i32:
824             tci_args_rrm(insn, &r0, &r1, &oi);
825             taddr = regs[r1];
826             regs[r0] = tci_qemu_ld(env, taddr, oi, tb_ptr);
827             break;
828 
829         case INDEX_op_qemu_ld_i64:
830             if (TCG_TARGET_REG_BITS == 64) {
831                 tci_args_rrm(insn, &r0, &r1, &oi);
832                 taddr = regs[r1];
833             } else {
834                 tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
835                 taddr = regs[r2];
836                 oi = regs[r3];
837             }
838             tmp64 = tci_qemu_ld(env, taddr, oi, tb_ptr);
839             if (TCG_TARGET_REG_BITS == 32) {
840                 tci_write_reg64(regs, r1, r0, tmp64);
841             } else {
842                 regs[r0] = tmp64;
843             }
844             break;
845 
846         case INDEX_op_qemu_st_i32:
847             tci_args_rrm(insn, &r0, &r1, &oi);
848             taddr = regs[r1];
849             tci_qemu_st(env, taddr, regs[r0], oi, tb_ptr);
850             break;
851 
852         case INDEX_op_qemu_st_i64:
853             if (TCG_TARGET_REG_BITS == 64) {
854                 tci_args_rrm(insn, &r0, &r1, &oi);
855                 tmp64 = regs[r0];
856                 taddr = regs[r1];
857             } else {
858                 tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
859                 tmp64 = tci_uint64(regs[r1], regs[r0]);
860                 taddr = regs[r2];
861                 oi = regs[r3];
862             }
863             tci_qemu_st(env, taddr, tmp64, oi, tb_ptr);
864             break;
865 
866         case INDEX_op_mb:
867             /* Ensure ordering for all kinds */
868             smp_mb();
869             break;
870         default:
871             g_assert_not_reached();
872         }
873     }
874 }
875 
876 /*
877  * Disassembler that matches the interpreter
878  */
879 
880 static const char *str_r(TCGReg r)
881 {
882     static const char regs[TCG_TARGET_NB_REGS][4] = {
883         "r0", "r1", "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
884         "r8", "r9", "r10", "r11", "r12", "r13", "env", "sp"
885     };
886 
887     QEMU_BUILD_BUG_ON(TCG_AREG0 != TCG_REG_R14);
888     QEMU_BUILD_BUG_ON(TCG_REG_CALL_STACK != TCG_REG_R15);
889 
890     assert((unsigned)r < TCG_TARGET_NB_REGS);
891     return regs[r];
892 }
893 
894 static const char *str_c(TCGCond c)
895 {
896     static const char cond[16][8] = {
897         [TCG_COND_NEVER] = "never",
898         [TCG_COND_ALWAYS] = "always",
899         [TCG_COND_EQ] = "eq",
900         [TCG_COND_NE] = "ne",
901         [TCG_COND_LT] = "lt",
902         [TCG_COND_GE] = "ge",
903         [TCG_COND_LE] = "le",
904         [TCG_COND_GT] = "gt",
905         [TCG_COND_LTU] = "ltu",
906         [TCG_COND_GEU] = "geu",
907         [TCG_COND_LEU] = "leu",
908         [TCG_COND_GTU] = "gtu",
909         [TCG_COND_TSTEQ] = "tsteq",
910         [TCG_COND_TSTNE] = "tstne",
911     };
912 
913     assert((unsigned)c < ARRAY_SIZE(cond));
914     assert(cond[c][0] != 0);
915     return cond[c];
916 }
917 
918 /* Disassemble TCI bytecode. */
919 int print_insn_tci(bfd_vma addr, disassemble_info *info)
920 {
921     const uint32_t *tb_ptr = (const void *)(uintptr_t)addr;
922     const TCGOpDef *def;
923     const char *op_name;
924     uint32_t insn;
925     TCGOpcode op;
926     TCGReg r0, r1, r2, r3, r4, r5;
927     tcg_target_ulong i1;
928     int32_t s2;
929     TCGCond c;
930     MemOpIdx oi;
931     uint8_t pos, len;
932     void *ptr;
933 
934     /* TCI is always the host, so we don't need to load indirect. */
935     insn = *tb_ptr++;
936 
937     info->fprintf_func(info->stream, "%08x  ", insn);
938 
939     op = extract32(insn, 0, 8);
940     def = &tcg_op_defs[op];
941     op_name = def->name;
942 
943     switch (op) {
944     case INDEX_op_br:
945     case INDEX_op_exit_tb:
946     case INDEX_op_goto_tb:
947         tci_args_l(insn, tb_ptr, &ptr);
948         info->fprintf_func(info->stream, "%-12s  %p", op_name, ptr);
949         break;
950 
951     case INDEX_op_goto_ptr:
952         tci_args_r(insn, &r0);
953         info->fprintf_func(info->stream, "%-12s  %s", op_name, str_r(r0));
954         break;
955 
956     case INDEX_op_call:
957         tci_args_nl(insn, tb_ptr, &len, &ptr);
958         info->fprintf_func(info->stream, "%-12s  %d, %p", op_name, len, ptr);
959         break;
960 
961     case INDEX_op_brcond:
962         tci_args_rl(insn, tb_ptr, &r0, &ptr);
963         info->fprintf_func(info->stream, "%-12s  %s, 0, ne, %p",
964                            op_name, str_r(r0), ptr);
965         break;
966 
967     case INDEX_op_setcond:
968     case INDEX_op_tci_setcond32:
969         tci_args_rrrc(insn, &r0, &r1, &r2, &c);
970         info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %s",
971                            op_name, str_r(r0), str_r(r1), str_r(r2), str_c(c));
972         break;
973 
974     case INDEX_op_tci_movi:
975         tci_args_ri(insn, &r0, &i1);
976         info->fprintf_func(info->stream, "%-12s  %s, 0x%" TCG_PRIlx,
977                            op_name, str_r(r0), i1);
978         break;
979 
980     case INDEX_op_tci_movl:
981         tci_args_rl(insn, tb_ptr, &r0, &ptr);
982         info->fprintf_func(info->stream, "%-12s  %s, %p",
983                            op_name, str_r(r0), ptr);
984         break;
985 
986     case INDEX_op_ld8u_i32:
987     case INDEX_op_ld8u_i64:
988     case INDEX_op_ld8s_i32:
989     case INDEX_op_ld8s_i64:
990     case INDEX_op_ld16u_i32:
991     case INDEX_op_ld16u_i64:
992     case INDEX_op_ld16s_i32:
993     case INDEX_op_ld16s_i64:
994     case INDEX_op_ld32u_i64:
995     case INDEX_op_ld32s_i64:
996     case INDEX_op_ld_i32:
997     case INDEX_op_ld_i64:
998     case INDEX_op_st8_i32:
999     case INDEX_op_st8_i64:
1000     case INDEX_op_st16_i32:
1001     case INDEX_op_st16_i64:
1002     case INDEX_op_st32_i64:
1003     case INDEX_op_st_i32:
1004     case INDEX_op_st_i64:
1005         tci_args_rrs(insn, &r0, &r1, &s2);
1006         info->fprintf_func(info->stream, "%-12s  %s, %s, %d",
1007                            op_name, str_r(r0), str_r(r1), s2);
1008         break;
1009 
1010     case INDEX_op_ctpop:
1011     case INDEX_op_mov:
1012     case INDEX_op_neg:
1013     case INDEX_op_not:
1014     case INDEX_op_ext_i32_i64:
1015     case INDEX_op_extu_i32_i64:
1016     case INDEX_op_bswap16_i32:
1017     case INDEX_op_bswap16_i64:
1018     case INDEX_op_bswap32_i32:
1019     case INDEX_op_bswap32_i64:
1020     case INDEX_op_bswap64_i64:
1021         tci_args_rr(insn, &r0, &r1);
1022         info->fprintf_func(info->stream, "%-12s  %s, %s",
1023                            op_name, str_r(r0), str_r(r1));
1024         break;
1025 
1026     case INDEX_op_add:
1027     case INDEX_op_and:
1028     case INDEX_op_andc:
1029     case INDEX_op_clz:
1030     case INDEX_op_ctz:
1031     case INDEX_op_divs:
1032     case INDEX_op_divu:
1033     case INDEX_op_eqv:
1034     case INDEX_op_mul:
1035     case INDEX_op_nand:
1036     case INDEX_op_nor:
1037     case INDEX_op_or:
1038     case INDEX_op_orc:
1039     case INDEX_op_rems:
1040     case INDEX_op_remu:
1041     case INDEX_op_rotl:
1042     case INDEX_op_rotr:
1043     case INDEX_op_sar:
1044     case INDEX_op_shl:
1045     case INDEX_op_shr:
1046     case INDEX_op_sub:
1047     case INDEX_op_xor:
1048     case INDEX_op_tci_ctz32:
1049     case INDEX_op_tci_clz32:
1050     case INDEX_op_tci_divs32:
1051     case INDEX_op_tci_divu32:
1052     case INDEX_op_tci_rems32:
1053     case INDEX_op_tci_remu32:
1054     case INDEX_op_tci_rotl32:
1055     case INDEX_op_tci_rotr32:
1056         tci_args_rrr(insn, &r0, &r1, &r2);
1057         info->fprintf_func(info->stream, "%-12s  %s, %s, %s",
1058                            op_name, str_r(r0), str_r(r1), str_r(r2));
1059         break;
1060 
1061     case INDEX_op_deposit_i32:
1062     case INDEX_op_deposit_i64:
1063         tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
1064         info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %d, %d",
1065                            op_name, str_r(r0), str_r(r1), str_r(r2), pos, len);
1066         break;
1067 
1068     case INDEX_op_extract_i32:
1069     case INDEX_op_extract_i64:
1070     case INDEX_op_sextract_i32:
1071     case INDEX_op_sextract_i64:
1072         tci_args_rrbb(insn, &r0, &r1, &pos, &len);
1073         info->fprintf_func(info->stream, "%-12s  %s,%s,%d,%d",
1074                            op_name, str_r(r0), str_r(r1), pos, len);
1075         break;
1076 
1077     case INDEX_op_movcond_i32:
1078     case INDEX_op_movcond_i64:
1079     case INDEX_op_setcond2_i32:
1080         tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &c);
1081         info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %s, %s, %s",
1082                            op_name, str_r(r0), str_r(r1), str_r(r2),
1083                            str_r(r3), str_r(r4), str_c(c));
1084         break;
1085 
1086     case INDEX_op_muls2:
1087     case INDEX_op_mulu2:
1088         tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
1089         info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %s",
1090                            op_name, str_r(r0), str_r(r1),
1091                            str_r(r2), str_r(r3));
1092         break;
1093 
1094     case INDEX_op_add2_i32:
1095     case INDEX_op_add2_i64:
1096     case INDEX_op_sub2_i32:
1097     case INDEX_op_sub2_i64:
1098         tci_args_rrrrrr(insn, &r0, &r1, &r2, &r3, &r4, &r5);
1099         info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %s, %s, %s",
1100                            op_name, str_r(r0), str_r(r1), str_r(r2),
1101                            str_r(r3), str_r(r4), str_r(r5));
1102         break;
1103 
1104     case INDEX_op_qemu_ld_i64:
1105     case INDEX_op_qemu_st_i64:
1106         if (TCG_TARGET_REG_BITS == 32) {
1107             tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
1108             info->fprintf_func(info->stream, "%-12s  %s, %s, %s, %s",
1109                                op_name, str_r(r0), str_r(r1),
1110                                str_r(r2), str_r(r3));
1111             break;
1112         }
1113         /* fall through */
1114     case INDEX_op_qemu_ld_i32:
1115     case INDEX_op_qemu_st_i32:
1116         tci_args_rrm(insn, &r0, &r1, &oi);
1117         info->fprintf_func(info->stream, "%-12s  %s, %s, %x",
1118                            op_name, str_r(r0), str_r(r1), oi);
1119         break;
1120 
1121     case 0:
1122         /* tcg_out_nop_fill uses zeros */
1123         if (insn == 0) {
1124             info->fprintf_func(info->stream, "align");
1125             break;
1126         }
1127         /* fall through */
1128 
1129     default:
1130         info->fprintf_func(info->stream, "illegal opcode %d", op);
1131         break;
1132     }
1133 
1134     return sizeof(insn);
1135 }
1136