]> Git Repo - qemu.git/blob - tcg/tcg.c
vhost-net: revamp configure logic
[qemu.git] / tcg / tcg.c
1 /*
2  * Tiny Code Generator for QEMU
3  *
4  * Copyright (c) 2008 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24
25 /* define it to use liveness analysis (better code) */
26 #define USE_TCG_OPTIMIZATIONS
27
28 #include "qemu/osdep.h"
29
30 /* Define to jump the ELF file used to communicate with GDB.  */
31 #undef DEBUG_JIT
32
33 #include "qemu/error-report.h"
34 #include "qemu/cutils.h"
35 #include "qemu/host-utils.h"
36 #include "qemu/timer.h"
37
38 /* Note: the long term plan is to reduce the dependencies on the QEMU
39    CPU definitions. Currently they are used for qemu_ld/st
40    instructions */
41 #define NO_CPU_IO_DEFS
42 #include "cpu.h"
43
44 #include "exec/cpu-common.h"
45 #include "exec/exec-all.h"
46
47 #include "tcg-op.h"
48
49 #if UINTPTR_MAX == UINT32_MAX
50 # define ELF_CLASS  ELFCLASS32
51 #else
52 # define ELF_CLASS  ELFCLASS64
53 #endif
54 #ifdef HOST_WORDS_BIGENDIAN
55 # define ELF_DATA   ELFDATA2MSB
56 #else
57 # define ELF_DATA   ELFDATA2LSB
58 #endif
59
60 #include "elf.h"
61 #include "exec/log.h"
62 #include "sysemu/sysemu.h"
63
64 /* Forward declarations for functions declared in tcg-target.inc.c and
65    used here. */
66 static void tcg_target_init(TCGContext *s);
67 static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode);
68 static void tcg_target_qemu_prologue(TCGContext *s);
69 static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
70                         intptr_t value, intptr_t addend);
71
72 /* The CIE and FDE header definitions will be common to all hosts.  */
73 typedef struct {
74     uint32_t len __attribute__((aligned((sizeof(void *)))));
75     uint32_t id;
76     uint8_t version;
77     char augmentation[1];
78     uint8_t code_align;
79     uint8_t data_align;
80     uint8_t return_column;
81 } DebugFrameCIE;
82
83 typedef struct QEMU_PACKED {
84     uint32_t len __attribute__((aligned((sizeof(void *)))));
85     uint32_t cie_offset;
86     uintptr_t func_start;
87     uintptr_t func_len;
88 } DebugFrameFDEHeader;
89
90 typedef struct QEMU_PACKED {
91     DebugFrameCIE cie;
92     DebugFrameFDEHeader fde;
93 } DebugFrameHeader;
94
95 static void tcg_register_jit_int(void *buf, size_t size,
96                                  const void *debug_frame,
97                                  size_t debug_frame_size)
98     __attribute__((unused));
99
100 /* Forward declarations for functions declared and used in tcg-target.inc.c. */
101 static const char *target_parse_constraint(TCGArgConstraint *ct,
102                                            const char *ct_str, TCGType type);
103 static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1,
104                        intptr_t arg2);
105 static void tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg);
106 static void tcg_out_movi(TCGContext *s, TCGType type,
107                          TCGReg ret, tcg_target_long arg);
108 static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
109                        const int *const_args);
110 #if TCG_TARGET_MAYBE_vec
111 static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, unsigned vecl,
112                            unsigned vece, const TCGArg *args,
113                            const int *const_args);
114 #else
115 static inline void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, unsigned vecl,
116                                   unsigned vece, const TCGArg *args,
117                                   const int *const_args)
118 {
119     g_assert_not_reached();
120 }
121 #endif
122 static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
123                        intptr_t arg2);
124 static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
125                         TCGReg base, intptr_t ofs);
126 static void tcg_out_call(TCGContext *s, tcg_insn_unit *target);
127 static int tcg_target_const_match(tcg_target_long val, TCGType type,
128                                   const TCGArgConstraint *arg_ct);
129 #ifdef TCG_TARGET_NEED_LDST_LABELS
130 static bool tcg_out_ldst_finalize(TCGContext *s);
131 #endif
132
133 #define TCG_HIGHWATER 1024
134
135 static TCGContext **tcg_ctxs;
136 static unsigned int n_tcg_ctxs;
137 TCGv_env cpu_env = 0;
138
139 struct tcg_region_tree {
140     QemuMutex lock;
141     GTree *tree;
142     /* padding to avoid false sharing is computed at run-time */
143 };
144
145 /*
146  * We divide code_gen_buffer into equally-sized "regions" that TCG threads
147  * dynamically allocate from as demand dictates. Given appropriate region
148  * sizing, this minimizes flushes even when some TCG threads generate a lot
149  * more code than others.
150  */
151 struct tcg_region_state {
152     QemuMutex lock;
153
154     /* fields set at init time */
155     void *start;
156     void *start_aligned;
157     void *end;
158     size_t n;
159     size_t size; /* size of one region */
160     size_t stride; /* .size + guard size */
161
162     /* fields protected by the lock */
163     size_t current; /* current region index */
164     size_t agg_size_full; /* aggregate size of full regions */
165 };
166
167 static struct tcg_region_state region;
168 /*
169  * This is an array of struct tcg_region_tree's, with padding.
170  * We use void * to simplify the computation of region_trees[i]; each
171  * struct is found every tree_size bytes.
172  */
173 static void *region_trees;
174 static size_t tree_size;
175 static TCGRegSet tcg_target_available_regs[TCG_TYPE_COUNT];
176 static TCGRegSet tcg_target_call_clobber_regs;
177
178 #if TCG_TARGET_INSN_UNIT_SIZE == 1
179 static __attribute__((unused)) inline void tcg_out8(TCGContext *s, uint8_t v)
180 {
181     *s->code_ptr++ = v;
182 }
183
184 static __attribute__((unused)) inline void tcg_patch8(tcg_insn_unit *p,
185                                                       uint8_t v)
186 {
187     *p = v;
188 }
189 #endif
190
191 #if TCG_TARGET_INSN_UNIT_SIZE <= 2
192 static __attribute__((unused)) inline void tcg_out16(TCGContext *s, uint16_t v)
193 {
194     if (TCG_TARGET_INSN_UNIT_SIZE == 2) {
195         *s->code_ptr++ = v;
196     } else {
197         tcg_insn_unit *p = s->code_ptr;
198         memcpy(p, &v, sizeof(v));
199         s->code_ptr = p + (2 / TCG_TARGET_INSN_UNIT_SIZE);
200     }
201 }
202
203 static __attribute__((unused)) inline void tcg_patch16(tcg_insn_unit *p,
204                                                        uint16_t v)
205 {
206     if (TCG_TARGET_INSN_UNIT_SIZE == 2) {
207         *p = v;
208     } else {
209         memcpy(p, &v, sizeof(v));
210     }
211 }
212 #endif
213
214 #if TCG_TARGET_INSN_UNIT_SIZE <= 4
215 static __attribute__((unused)) inline void tcg_out32(TCGContext *s, uint32_t v)
216 {
217     if (TCG_TARGET_INSN_UNIT_SIZE == 4) {
218         *s->code_ptr++ = v;
219     } else {
220         tcg_insn_unit *p = s->code_ptr;
221         memcpy(p, &v, sizeof(v));
222         s->code_ptr = p + (4 / TCG_TARGET_INSN_UNIT_SIZE);
223     }
224 }
225
226 static __attribute__((unused)) inline void tcg_patch32(tcg_insn_unit *p,
227                                                        uint32_t v)
228 {
229     if (TCG_TARGET_INSN_UNIT_SIZE == 4) {
230         *p = v;
231     } else {
232         memcpy(p, &v, sizeof(v));
233     }
234 }
235 #endif
236
237 #if TCG_TARGET_INSN_UNIT_SIZE <= 8
238 static __attribute__((unused)) inline void tcg_out64(TCGContext *s, uint64_t v)
239 {
240     if (TCG_TARGET_INSN_UNIT_SIZE == 8) {
241         *s->code_ptr++ = v;
242     } else {
243         tcg_insn_unit *p = s->code_ptr;
244         memcpy(p, &v, sizeof(v));
245         s->code_ptr = p + (8 / TCG_TARGET_INSN_UNIT_SIZE);
246     }
247 }
248
249 static __attribute__((unused)) inline void tcg_patch64(tcg_insn_unit *p,
250                                                        uint64_t v)
251 {
252     if (TCG_TARGET_INSN_UNIT_SIZE == 8) {
253         *p = v;
254     } else {
255         memcpy(p, &v, sizeof(v));
256     }
257 }
258 #endif
259
260 /* label relocation processing */
261
262 static void tcg_out_reloc(TCGContext *s, tcg_insn_unit *code_ptr, int type,
263                           TCGLabel *l, intptr_t addend)
264 {
265     TCGRelocation *r;
266
267     if (l->has_value) {
268         /* FIXME: This may break relocations on RISC targets that
269            modify instruction fields in place.  The caller may not have 
270            written the initial value.  */
271         bool ok = patch_reloc(code_ptr, type, l->u.value, addend);
272         tcg_debug_assert(ok);
273     } else {
274         /* add a new relocation entry */
275         r = tcg_malloc(sizeof(TCGRelocation));
276         r->type = type;
277         r->ptr = code_ptr;
278         r->addend = addend;
279         r->next = l->u.first_reloc;
280         l->u.first_reloc = r;
281     }
282 }
283
284 static void tcg_out_label(TCGContext *s, TCGLabel *l, tcg_insn_unit *ptr)
285 {
286     intptr_t value = (intptr_t)ptr;
287     TCGRelocation *r;
288
289     tcg_debug_assert(!l->has_value);
290
291     for (r = l->u.first_reloc; r != NULL; r = r->next) {
292         bool ok = patch_reloc(r->ptr, r->type, value, r->addend);
293         tcg_debug_assert(ok);
294     }
295
296     l->has_value = 1;
297     l->u.value_ptr = ptr;
298 }
299
300 TCGLabel *gen_new_label(void)
301 {
302     TCGContext *s = tcg_ctx;
303     TCGLabel *l = tcg_malloc(sizeof(TCGLabel));
304
305     *l = (TCGLabel){
306         .id = s->nb_labels++
307     };
308 #ifdef CONFIG_DEBUG_TCG
309     QSIMPLEQ_INSERT_TAIL(&s->labels, l, next);
310 #endif
311
312     return l;
313 }
314
315 static void set_jmp_reset_offset(TCGContext *s, int which)
316 {
317     size_t off = tcg_current_code_size(s);
318     s->tb_jmp_reset_offset[which] = off;
319     /* Make sure that we didn't overflow the stored offset.  */
320     assert(s->tb_jmp_reset_offset[which] == off);
321 }
322
323 #include "tcg-target.inc.c"
324
325 /* compare a pointer @ptr and a tb_tc @s */
326 static int ptr_cmp_tb_tc(const void *ptr, const struct tb_tc *s)
327 {
328     if (ptr >= s->ptr + s->size) {
329         return 1;
330     } else if (ptr < s->ptr) {
331         return -1;
332     }
333     return 0;
334 }
335
336 static gint tb_tc_cmp(gconstpointer ap, gconstpointer bp)
337 {
338     const struct tb_tc *a = ap;
339     const struct tb_tc *b = bp;
340
341     /*
342      * When both sizes are set, we know this isn't a lookup.
343      * This is the most likely case: every TB must be inserted; lookups
344      * are a lot less frequent.
345      */
346     if (likely(a->size && b->size)) {
347         if (a->ptr > b->ptr) {
348             return 1;
349         } else if (a->ptr < b->ptr) {
350             return -1;
351         }
352         /* a->ptr == b->ptr should happen only on deletions */
353         g_assert(a->size == b->size);
354         return 0;
355     }
356     /*
357      * All lookups have either .size field set to 0.
358      * From the glib sources we see that @ap is always the lookup key. However
359      * the docs provide no guarantee, so we just mark this case as likely.
360      */
361     if (likely(a->size == 0)) {
362         return ptr_cmp_tb_tc(a->ptr, b);
363     }
364     return ptr_cmp_tb_tc(b->ptr, a);
365 }
366
367 static void tcg_region_trees_init(void)
368 {
369     size_t i;
370
371     tree_size = ROUND_UP(sizeof(struct tcg_region_tree), qemu_dcache_linesize);
372     region_trees = qemu_memalign(qemu_dcache_linesize, region.n * tree_size);
373     for (i = 0; i < region.n; i++) {
374         struct tcg_region_tree *rt = region_trees + i * tree_size;
375
376         qemu_mutex_init(&rt->lock);
377         rt->tree = g_tree_new(tb_tc_cmp);
378     }
379 }
380
381 static struct tcg_region_tree *tc_ptr_to_region_tree(void *p)
382 {
383     size_t region_idx;
384
385     if (p < region.start_aligned) {
386         region_idx = 0;
387     } else {
388         ptrdiff_t offset = p - region.start_aligned;
389
390         if (offset > region.stride * (region.n - 1)) {
391             region_idx = region.n - 1;
392         } else {
393             region_idx = offset / region.stride;
394         }
395     }
396     return region_trees + region_idx * tree_size;
397 }
398
399 void tcg_tb_insert(TranslationBlock *tb)
400 {
401     struct tcg_region_tree *rt = tc_ptr_to_region_tree(tb->tc.ptr);
402
403     qemu_mutex_lock(&rt->lock);
404     g_tree_insert(rt->tree, &tb->tc, tb);
405     qemu_mutex_unlock(&rt->lock);
406 }
407
408 void tcg_tb_remove(TranslationBlock *tb)
409 {
410     struct tcg_region_tree *rt = tc_ptr_to_region_tree(tb->tc.ptr);
411
412     qemu_mutex_lock(&rt->lock);
413     g_tree_remove(rt->tree, &tb->tc);
414     qemu_mutex_unlock(&rt->lock);
415 }
416
417 /*
418  * Find the TB 'tb' such that
419  * tb->tc.ptr <= tc_ptr < tb->tc.ptr + tb->tc.size
420  * Return NULL if not found.
421  */
422 TranslationBlock *tcg_tb_lookup(uintptr_t tc_ptr)
423 {
424     struct tcg_region_tree *rt = tc_ptr_to_region_tree((void *)tc_ptr);
425     TranslationBlock *tb;
426     struct tb_tc s = { .ptr = (void *)tc_ptr };
427
428     qemu_mutex_lock(&rt->lock);
429     tb = g_tree_lookup(rt->tree, &s);
430     qemu_mutex_unlock(&rt->lock);
431     return tb;
432 }
433
434 static void tcg_region_tree_lock_all(void)
435 {
436     size_t i;
437
438     for (i = 0; i < region.n; i++) {
439         struct tcg_region_tree *rt = region_trees + i * tree_size;
440
441         qemu_mutex_lock(&rt->lock);
442     }
443 }
444
445 static void tcg_region_tree_unlock_all(void)
446 {
447     size_t i;
448
449     for (i = 0; i < region.n; i++) {
450         struct tcg_region_tree *rt = region_trees + i * tree_size;
451
452         qemu_mutex_unlock(&rt->lock);
453     }
454 }
455
456 void tcg_tb_foreach(GTraverseFunc func, gpointer user_data)
457 {
458     size_t i;
459
460     tcg_region_tree_lock_all();
461     for (i = 0; i < region.n; i++) {
462         struct tcg_region_tree *rt = region_trees + i * tree_size;
463
464         g_tree_foreach(rt->tree, func, user_data);
465     }
466     tcg_region_tree_unlock_all();
467 }
468
469 size_t tcg_nb_tbs(void)
470 {
471     size_t nb_tbs = 0;
472     size_t i;
473
474     tcg_region_tree_lock_all();
475     for (i = 0; i < region.n; i++) {
476         struct tcg_region_tree *rt = region_trees + i * tree_size;
477
478         nb_tbs += g_tree_nnodes(rt->tree);
479     }
480     tcg_region_tree_unlock_all();
481     return nb_tbs;
482 }
483
484 static void tcg_region_tree_reset_all(void)
485 {
486     size_t i;
487
488     tcg_region_tree_lock_all();
489     for (i = 0; i < region.n; i++) {
490         struct tcg_region_tree *rt = region_trees + i * tree_size;
491
492         /* Increment the refcount first so that destroy acts as a reset */
493         g_tree_ref(rt->tree);
494         g_tree_destroy(rt->tree);
495     }
496     tcg_region_tree_unlock_all();
497 }
498
499 static void tcg_region_bounds(size_t curr_region, void **pstart, void **pend)
500 {
501     void *start, *end;
502
503     start = region.start_aligned + curr_region * region.stride;
504     end = start + region.size;
505
506     if (curr_region == 0) {
507         start = region.start;
508     }
509     if (curr_region == region.n - 1) {
510         end = region.end;
511     }
512
513     *pstart = start;
514     *pend = end;
515 }
516
517 static void tcg_region_assign(TCGContext *s, size_t curr_region)
518 {
519     void *start, *end;
520
521     tcg_region_bounds(curr_region, &start, &end);
522
523     s->code_gen_buffer = start;
524     s->code_gen_ptr = start;
525     s->code_gen_buffer_size = end - start;
526     s->code_gen_highwater = end - TCG_HIGHWATER;
527 }
528
529 static bool tcg_region_alloc__locked(TCGContext *s)
530 {
531     if (region.current == region.n) {
532         return true;
533     }
534     tcg_region_assign(s, region.current);
535     region.current++;
536     return false;
537 }
538
539 /*
540  * Request a new region once the one in use has filled up.
541  * Returns true on error.
542  */
543 static bool tcg_region_alloc(TCGContext *s)
544 {
545     bool err;
546     /* read the region size now; alloc__locked will overwrite it on success */
547     size_t size_full = s->code_gen_buffer_size;
548
549     qemu_mutex_lock(&region.lock);
550     err = tcg_region_alloc__locked(s);
551     if (!err) {
552         region.agg_size_full += size_full - TCG_HIGHWATER;
553     }
554     qemu_mutex_unlock(&region.lock);
555     return err;
556 }
557
558 /*
559  * Perform a context's first region allocation.
560  * This function does _not_ increment region.agg_size_full.
561  */
562 static inline bool tcg_region_initial_alloc__locked(TCGContext *s)
563 {
564     return tcg_region_alloc__locked(s);
565 }
566
567 /* Call from a safe-work context */
568 void tcg_region_reset_all(void)
569 {
570     unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
571     unsigned int i;
572
573     qemu_mutex_lock(&region.lock);
574     region.current = 0;
575     region.agg_size_full = 0;
576
577     for (i = 0; i < n_ctxs; i++) {
578         TCGContext *s = atomic_read(&tcg_ctxs[i]);
579         bool err = tcg_region_initial_alloc__locked(s);
580
581         g_assert(!err);
582     }
583     qemu_mutex_unlock(&region.lock);
584
585     tcg_region_tree_reset_all();
586 }
587
588 #ifdef CONFIG_USER_ONLY
589 static size_t tcg_n_regions(void)
590 {
591     return 1;
592 }
593 #else
594 /*
595  * It is likely that some vCPUs will translate more code than others, so we
596  * first try to set more regions than max_cpus, with those regions being of
597  * reasonable size. If that's not possible we make do by evenly dividing
598  * the code_gen_buffer among the vCPUs.
599  */
600 static size_t tcg_n_regions(void)
601 {
602     size_t i;
603
604     /* Use a single region if all we have is one vCPU thread */
605     if (max_cpus == 1 || !qemu_tcg_mttcg_enabled()) {
606         return 1;
607     }
608
609     /* Try to have more regions than max_cpus, with each region being >= 2 MB */
610     for (i = 8; i > 0; i--) {
611         size_t regions_per_thread = i;
612         size_t region_size;
613
614         region_size = tcg_init_ctx.code_gen_buffer_size;
615         region_size /= max_cpus * regions_per_thread;
616
617         if (region_size >= 2 * 1024u * 1024) {
618             return max_cpus * regions_per_thread;
619         }
620     }
621     /* If we can't, then just allocate one region per vCPU thread */
622     return max_cpus;
623 }
624 #endif
625
626 /*
627  * Initializes region partitioning.
628  *
629  * Called at init time from the parent thread (i.e. the one calling
630  * tcg_context_init), after the target's TCG globals have been set.
631  *
632  * Region partitioning works by splitting code_gen_buffer into separate regions,
633  * and then assigning regions to TCG threads so that the threads can translate
634  * code in parallel without synchronization.
635  *
636  * In softmmu the number of TCG threads is bounded by max_cpus, so we use at
637  * least max_cpus regions in MTTCG. In !MTTCG we use a single region.
638  * Note that the TCG options from the command-line (i.e. -accel accel=tcg,[...])
639  * must have been parsed before calling this function, since it calls
640  * qemu_tcg_mttcg_enabled().
641  *
642  * In user-mode we use a single region.  Having multiple regions in user-mode
643  * is not supported, because the number of vCPU threads (recall that each thread
644  * spawned by the guest corresponds to a vCPU thread) is only bounded by the
645  * OS, and usually this number is huge (tens of thousands is not uncommon).
646  * Thus, given this large bound on the number of vCPU threads and the fact
647  * that code_gen_buffer is allocated at compile-time, we cannot guarantee
648  * that the availability of at least one region per vCPU thread.
649  *
650  * However, this user-mode limitation is unlikely to be a significant problem
651  * in practice. Multi-threaded guests share most if not all of their translated
652  * code, which makes parallel code generation less appealing than in softmmu.
653  */
654 void tcg_region_init(void)
655 {
656     void *buf = tcg_init_ctx.code_gen_buffer;
657     void *aligned;
658     size_t size = tcg_init_ctx.code_gen_buffer_size;
659     size_t page_size = qemu_real_host_page_size;
660     size_t region_size;
661     size_t n_regions;
662     size_t i;
663
664     n_regions = tcg_n_regions();
665
666     /* The first region will be 'aligned - buf' bytes larger than the others */
667     aligned = QEMU_ALIGN_PTR_UP(buf, page_size);
668     g_assert(aligned < tcg_init_ctx.code_gen_buffer + size);
669     /*
670      * Make region_size a multiple of page_size, using aligned as the start.
671      * As a result of this we might end up with a few extra pages at the end of
672      * the buffer; we will assign those to the last region.
673      */
674     region_size = (size - (aligned - buf)) / n_regions;
675     region_size = QEMU_ALIGN_DOWN(region_size, page_size);
676
677     /* A region must have at least 2 pages; one code, one guard */
678     g_assert(region_size >= 2 * page_size);
679
680     /* init the region struct */
681     qemu_mutex_init(&region.lock);
682     region.n = n_regions;
683     region.size = region_size - page_size;
684     region.stride = region_size;
685     region.start = buf;
686     region.start_aligned = aligned;
687     /* page-align the end, since its last page will be a guard page */
688     region.end = QEMU_ALIGN_PTR_DOWN(buf + size, page_size);
689     /* account for that last guard page */
690     region.end -= page_size;
691
692     /* set guard pages */
693     for (i = 0; i < region.n; i++) {
694         void *start, *end;
695         int rc;
696
697         tcg_region_bounds(i, &start, &end);
698         rc = qemu_mprotect_none(end, page_size);
699         g_assert(!rc);
700     }
701
702     tcg_region_trees_init();
703
704     /* In user-mode we support only one ctx, so do the initial allocation now */
705 #ifdef CONFIG_USER_ONLY
706     {
707         bool err = tcg_region_initial_alloc__locked(tcg_ctx);
708
709         g_assert(!err);
710     }
711 #endif
712 }
713
714 /*
715  * All TCG threads except the parent (i.e. the one that called tcg_context_init
716  * and registered the target's TCG globals) must register with this function
717  * before initiating translation.
718  *
719  * In user-mode we just point tcg_ctx to tcg_init_ctx. See the documentation
720  * of tcg_region_init() for the reasoning behind this.
721  *
722  * In softmmu each caller registers its context in tcg_ctxs[]. Note that in
723  * softmmu tcg_ctxs[] does not track tcg_ctx_init, since the initial context
724  * is not used anymore for translation once this function is called.
725  *
726  * Not tracking tcg_init_ctx in tcg_ctxs[] in softmmu keeps code that iterates
727  * over the array (e.g. tcg_code_size() the same for both softmmu and user-mode.
728  */
729 #ifdef CONFIG_USER_ONLY
730 void tcg_register_thread(void)
731 {
732     tcg_ctx = &tcg_init_ctx;
733 }
734 #else
735 void tcg_register_thread(void)
736 {
737     TCGContext *s = g_malloc(sizeof(*s));
738     unsigned int i, n;
739     bool err;
740
741     *s = tcg_init_ctx;
742
743     /* Relink mem_base.  */
744     for (i = 0, n = tcg_init_ctx.nb_globals; i < n; ++i) {
745         if (tcg_init_ctx.temps[i].mem_base) {
746             ptrdiff_t b = tcg_init_ctx.temps[i].mem_base - tcg_init_ctx.temps;
747             tcg_debug_assert(b >= 0 && b < n);
748             s->temps[i].mem_base = &s->temps[b];
749         }
750     }
751
752     /* Claim an entry in tcg_ctxs */
753     n = atomic_fetch_inc(&n_tcg_ctxs);
754     g_assert(n < max_cpus);
755     atomic_set(&tcg_ctxs[n], s);
756
757     tcg_ctx = s;
758     qemu_mutex_lock(&region.lock);
759     err = tcg_region_initial_alloc__locked(tcg_ctx);
760     g_assert(!err);
761     qemu_mutex_unlock(&region.lock);
762 }
763 #endif /* !CONFIG_USER_ONLY */
764
765 /*
766  * Returns the size (in bytes) of all translated code (i.e. from all regions)
767  * currently in the cache.
768  * See also: tcg_code_capacity()
769  * Do not confuse with tcg_current_code_size(); that one applies to a single
770  * TCG context.
771  */
772 size_t tcg_code_size(void)
773 {
774     unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
775     unsigned int i;
776     size_t total;
777
778     qemu_mutex_lock(&region.lock);
779     total = region.agg_size_full;
780     for (i = 0; i < n_ctxs; i++) {
781         const TCGContext *s = atomic_read(&tcg_ctxs[i]);
782         size_t size;
783
784         size = atomic_read(&s->code_gen_ptr) - s->code_gen_buffer;
785         g_assert(size <= s->code_gen_buffer_size);
786         total += size;
787     }
788     qemu_mutex_unlock(&region.lock);
789     return total;
790 }
791
792 /*
793  * Returns the code capacity (in bytes) of the entire cache, i.e. including all
794  * regions.
795  * See also: tcg_code_size()
796  */
797 size_t tcg_code_capacity(void)
798 {
799     size_t guard_size, capacity;
800
801     /* no need for synchronization; these variables are set at init time */
802     guard_size = region.stride - region.size;
803     capacity = region.end + guard_size - region.start;
804     capacity -= region.n * (guard_size + TCG_HIGHWATER);
805     return capacity;
806 }
807
808 size_t tcg_tb_phys_invalidate_count(void)
809 {
810     unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
811     unsigned int i;
812     size_t total = 0;
813
814     for (i = 0; i < n_ctxs; i++) {
815         const TCGContext *s = atomic_read(&tcg_ctxs[i]);
816
817         total += atomic_read(&s->tb_phys_invalidate_count);
818     }
819     return total;
820 }
821
822 /* pool based memory allocation */
823 void *tcg_malloc_internal(TCGContext *s, int size)
824 {
825     TCGPool *p;
826     int pool_size;
827     
828     if (size > TCG_POOL_CHUNK_SIZE) {
829         /* big malloc: insert a new pool (XXX: could optimize) */
830         p = g_malloc(sizeof(TCGPool) + size);
831         p->size = size;
832         p->next = s->pool_first_large;
833         s->pool_first_large = p;
834         return p->data;
835     } else {
836         p = s->pool_current;
837         if (!p) {
838             p = s->pool_first;
839             if (!p)
840                 goto new_pool;
841         } else {
842             if (!p->next) {
843             new_pool:
844                 pool_size = TCG_POOL_CHUNK_SIZE;
845                 p = g_malloc(sizeof(TCGPool) + pool_size);
846                 p->size = pool_size;
847                 p->next = NULL;
848                 if (s->pool_current) 
849                     s->pool_current->next = p;
850                 else
851                     s->pool_first = p;
852             } else {
853                 p = p->next;
854             }
855         }
856     }
857     s->pool_current = p;
858     s->pool_cur = p->data + size;
859     s->pool_end = p->data + p->size;
860     return p->data;
861 }
862
863 void tcg_pool_reset(TCGContext *s)
864 {
865     TCGPool *p, *t;
866     for (p = s->pool_first_large; p; p = t) {
867         t = p->next;
868         g_free(p);
869     }
870     s->pool_first_large = NULL;
871     s->pool_cur = s->pool_end = NULL;
872     s->pool_current = NULL;
873 }
874
875 typedef struct TCGHelperInfo {
876     void *func;
877     const char *name;
878     unsigned flags;
879     unsigned sizemask;
880 } TCGHelperInfo;
881
882 #include "exec/helper-proto.h"
883
884 static const TCGHelperInfo all_helpers[] = {
885 #include "exec/helper-tcg.h"
886 };
887 static GHashTable *helper_table;
888
889 static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)];
890 static void process_op_defs(TCGContext *s);
891 static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
892                                             TCGReg reg, const char *name);
893
894 void tcg_context_init(TCGContext *s)
895 {
896     int op, total_args, n, i;
897     TCGOpDef *def;
898     TCGArgConstraint *args_ct;
899     int *sorted_args;
900     TCGTemp *ts;
901
902     memset(s, 0, sizeof(*s));
903     s->nb_globals = 0;
904
905     /* Count total number of arguments and allocate the corresponding
906        space */
907     total_args = 0;
908     for(op = 0; op < NB_OPS; op++) {
909         def = &tcg_op_defs[op];
910         n = def->nb_iargs + def->nb_oargs;
911         total_args += n;
912     }
913
914     args_ct = g_malloc(sizeof(TCGArgConstraint) * total_args);
915     sorted_args = g_malloc(sizeof(int) * total_args);
916
917     for(op = 0; op < NB_OPS; op++) {
918         def = &tcg_op_defs[op];
919         def->args_ct = args_ct;
920         def->sorted_args = sorted_args;
921         n = def->nb_iargs + def->nb_oargs;
922         sorted_args += n;
923         args_ct += n;
924     }
925
926     /* Register helpers.  */
927     /* Use g_direct_hash/equal for direct pointer comparisons on func.  */
928     helper_table = g_hash_table_new(NULL, NULL);
929
930     for (i = 0; i < ARRAY_SIZE(all_helpers); ++i) {
931         g_hash_table_insert(helper_table, (gpointer)all_helpers[i].func,
932                             (gpointer)&all_helpers[i]);
933     }
934
935     tcg_target_init(s);
936     process_op_defs(s);
937
938     /* Reverse the order of the saved registers, assuming they're all at
939        the start of tcg_target_reg_alloc_order.  */
940     for (n = 0; n < ARRAY_SIZE(tcg_target_reg_alloc_order); ++n) {
941         int r = tcg_target_reg_alloc_order[n];
942         if (tcg_regset_test_reg(tcg_target_call_clobber_regs, r)) {
943             break;
944         }
945     }
946     for (i = 0; i < n; ++i) {
947         indirect_reg_alloc_order[i] = tcg_target_reg_alloc_order[n - 1 - i];
948     }
949     for (; i < ARRAY_SIZE(tcg_target_reg_alloc_order); ++i) {
950         indirect_reg_alloc_order[i] = tcg_target_reg_alloc_order[i];
951     }
952
953     tcg_ctx = s;
954     /*
955      * In user-mode we simply share the init context among threads, since we
956      * use a single region. See the documentation tcg_region_init() for the
957      * reasoning behind this.
958      * In softmmu we will have at most max_cpus TCG threads.
959      */
960 #ifdef CONFIG_USER_ONLY
961     tcg_ctxs = &tcg_ctx;
962     n_tcg_ctxs = 1;
963 #else
964     tcg_ctxs = g_new(TCGContext *, max_cpus);
965 #endif
966
967     tcg_debug_assert(!tcg_regset_test_reg(s->reserved_regs, TCG_AREG0));
968     ts = tcg_global_reg_new_internal(s, TCG_TYPE_PTR, TCG_AREG0, "env");
969     cpu_env = temp_tcgv_ptr(ts);
970 }
971
972 /*
973  * Allocate TBs right before their corresponding translated code, making
974  * sure that TBs and code are on different cache lines.
975  */
976 TranslationBlock *tcg_tb_alloc(TCGContext *s)
977 {
978     uintptr_t align = qemu_icache_linesize;
979     TranslationBlock *tb;
980     void *next;
981
982  retry:
983     tb = (void *)ROUND_UP((uintptr_t)s->code_gen_ptr, align);
984     next = (void *)ROUND_UP((uintptr_t)(tb + 1), align);
985
986     if (unlikely(next > s->code_gen_highwater)) {
987         if (tcg_region_alloc(s)) {
988             return NULL;
989         }
990         goto retry;
991     }
992     atomic_set(&s->code_gen_ptr, next);
993     s->data_gen_ptr = NULL;
994     return tb;
995 }
996
997 void tcg_prologue_init(TCGContext *s)
998 {
999     size_t prologue_size, total_size;
1000     void *buf0, *buf1;
1001
1002     /* Put the prologue at the beginning of code_gen_buffer.  */
1003     buf0 = s->code_gen_buffer;
1004     total_size = s->code_gen_buffer_size;
1005     s->code_ptr = buf0;
1006     s->code_buf = buf0;
1007     s->data_gen_ptr = NULL;
1008     s->code_gen_prologue = buf0;
1009
1010     /* Compute a high-water mark, at which we voluntarily flush the buffer
1011        and start over.  The size here is arbitrary, significantly larger
1012        than we expect the code generation for any one opcode to require.  */
1013     s->code_gen_highwater = s->code_gen_buffer + (total_size - TCG_HIGHWATER);
1014
1015 #ifdef TCG_TARGET_NEED_POOL_LABELS
1016     s->pool_labels = NULL;
1017 #endif
1018
1019     /* Generate the prologue.  */
1020     tcg_target_qemu_prologue(s);
1021
1022 #ifdef TCG_TARGET_NEED_POOL_LABELS
1023     /* Allow the prologue to put e.g. guest_base into a pool entry.  */
1024     {
1025         bool ok = tcg_out_pool_finalize(s);
1026         tcg_debug_assert(ok);
1027     }
1028 #endif
1029
1030     buf1 = s->code_ptr;
1031     flush_icache_range((uintptr_t)buf0, (uintptr_t)buf1);
1032
1033     /* Deduct the prologue from the buffer.  */
1034     prologue_size = tcg_current_code_size(s);
1035     s->code_gen_ptr = buf1;
1036     s->code_gen_buffer = buf1;
1037     s->code_buf = buf1;
1038     total_size -= prologue_size;
1039     s->code_gen_buffer_size = total_size;
1040
1041     tcg_register_jit(s->code_gen_buffer, total_size);
1042
1043 #ifdef DEBUG_DISAS
1044     if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
1045         qemu_log_lock();
1046         qemu_log("PROLOGUE: [size=%zu]\n", prologue_size);
1047         if (s->data_gen_ptr) {
1048             size_t code_size = s->data_gen_ptr - buf0;
1049             size_t data_size = prologue_size - code_size;
1050             size_t i;
1051
1052             log_disas(buf0, code_size);
1053
1054             for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
1055                 if (sizeof(tcg_target_ulong) == 8) {
1056                     qemu_log("0x%08" PRIxPTR ":  .quad  0x%016" PRIx64 "\n",
1057                              (uintptr_t)s->data_gen_ptr + i,
1058                              *(uint64_t *)(s->data_gen_ptr + i));
1059                 } else {
1060                     qemu_log("0x%08" PRIxPTR ":  .long  0x%08x\n",
1061                              (uintptr_t)s->data_gen_ptr + i,
1062                              *(uint32_t *)(s->data_gen_ptr + i));
1063                 }
1064             }
1065         } else {
1066             log_disas(buf0, prologue_size);
1067         }
1068         qemu_log("\n");
1069         qemu_log_flush();
1070         qemu_log_unlock();
1071     }
1072 #endif
1073
1074     /* Assert that goto_ptr is implemented completely.  */
1075     if (TCG_TARGET_HAS_goto_ptr) {
1076         tcg_debug_assert(s->code_gen_epilogue != NULL);
1077     }
1078 }
1079
1080 void tcg_func_start(TCGContext *s)
1081 {
1082     tcg_pool_reset(s);
1083     s->nb_temps = s->nb_globals;
1084
1085     /* No temps have been previously allocated for size or locality.  */
1086     memset(s->free_temps, 0, sizeof(s->free_temps));
1087
1088     s->nb_ops = 0;
1089     s->nb_labels = 0;
1090     s->current_frame_offset = s->frame_start;
1091
1092 #ifdef CONFIG_DEBUG_TCG
1093     s->goto_tb_issue_mask = 0;
1094 #endif
1095
1096     QTAILQ_INIT(&s->ops);
1097     QTAILQ_INIT(&s->free_ops);
1098 #ifdef CONFIG_DEBUG_TCG
1099     QSIMPLEQ_INIT(&s->labels);
1100 #endif
1101 }
1102
1103 static inline TCGTemp *tcg_temp_alloc(TCGContext *s)
1104 {
1105     int n = s->nb_temps++;
1106     tcg_debug_assert(n < TCG_MAX_TEMPS);
1107     return memset(&s->temps[n], 0, sizeof(TCGTemp));
1108 }
1109
1110 static inline TCGTemp *tcg_global_alloc(TCGContext *s)
1111 {
1112     TCGTemp *ts;
1113
1114     tcg_debug_assert(s->nb_globals == s->nb_temps);
1115     s->nb_globals++;
1116     ts = tcg_temp_alloc(s);
1117     ts->temp_global = 1;
1118
1119     return ts;
1120 }
1121
1122 static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
1123                                             TCGReg reg, const char *name)
1124 {
1125     TCGTemp *ts;
1126
1127     if (TCG_TARGET_REG_BITS == 32 && type != TCG_TYPE_I32) {
1128         tcg_abort();
1129     }
1130
1131     ts = tcg_global_alloc(s);
1132     ts->base_type = type;
1133     ts->type = type;
1134     ts->fixed_reg = 1;
1135     ts->reg = reg;
1136     ts->name = name;
1137     tcg_regset_set_reg(s->reserved_regs, reg);
1138
1139     return ts;
1140 }
1141
1142 void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size)
1143 {
1144     s->frame_start = start;
1145     s->frame_end = start + size;
1146     s->frame_temp
1147         = tcg_global_reg_new_internal(s, TCG_TYPE_PTR, reg, "_frame");
1148 }
1149
1150 TCGTemp *tcg_global_mem_new_internal(TCGType type, TCGv_ptr base,
1151                                      intptr_t offset, const char *name)
1152 {
1153     TCGContext *s = tcg_ctx;
1154     TCGTemp *base_ts = tcgv_ptr_temp(base);
1155     TCGTemp *ts = tcg_global_alloc(s);
1156     int indirect_reg = 0, bigendian = 0;
1157 #ifdef HOST_WORDS_BIGENDIAN
1158     bigendian = 1;
1159 #endif
1160
1161     if (!base_ts->fixed_reg) {
1162         /* We do not support double-indirect registers.  */
1163         tcg_debug_assert(!base_ts->indirect_reg);
1164         base_ts->indirect_base = 1;
1165         s->nb_indirects += (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64
1166                             ? 2 : 1);
1167         indirect_reg = 1;
1168     }
1169
1170     if (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64) {
1171         TCGTemp *ts2 = tcg_global_alloc(s);
1172         char buf[64];
1173
1174         ts->base_type = TCG_TYPE_I64;
1175         ts->type = TCG_TYPE_I32;
1176         ts->indirect_reg = indirect_reg;
1177         ts->mem_allocated = 1;
1178         ts->mem_base = base_ts;
1179         ts->mem_offset = offset + bigendian * 4;
1180         pstrcpy(buf, sizeof(buf), name);
1181         pstrcat(buf, sizeof(buf), "_0");
1182         ts->name = strdup(buf);
1183
1184         tcg_debug_assert(ts2 == ts + 1);
1185         ts2->base_type = TCG_TYPE_I64;
1186         ts2->type = TCG_TYPE_I32;
1187         ts2->indirect_reg = indirect_reg;
1188         ts2->mem_allocated = 1;
1189         ts2->mem_base = base_ts;
1190         ts2->mem_offset = offset + (1 - bigendian) * 4;
1191         pstrcpy(buf, sizeof(buf), name);
1192         pstrcat(buf, sizeof(buf), "_1");
1193         ts2->name = strdup(buf);
1194     } else {
1195         ts->base_type = type;
1196         ts->type = type;
1197         ts->indirect_reg = indirect_reg;
1198         ts->mem_allocated = 1;
1199         ts->mem_base = base_ts;
1200         ts->mem_offset = offset;
1201         ts->name = name;
1202     }
1203     return ts;
1204 }
1205
1206 TCGTemp *tcg_temp_new_internal(TCGType type, bool temp_local)
1207 {
1208     TCGContext *s = tcg_ctx;
1209     TCGTemp *ts;
1210     int idx, k;
1211
1212     k = type + (temp_local ? TCG_TYPE_COUNT : 0);
1213     idx = find_first_bit(s->free_temps[k].l, TCG_MAX_TEMPS);
1214     if (idx < TCG_MAX_TEMPS) {
1215         /* There is already an available temp with the right type.  */
1216         clear_bit(idx, s->free_temps[k].l);
1217
1218         ts = &s->temps[idx];
1219         ts->temp_allocated = 1;
1220         tcg_debug_assert(ts->base_type == type);
1221         tcg_debug_assert(ts->temp_local == temp_local);
1222     } else {
1223         ts = tcg_temp_alloc(s);
1224         if (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64) {
1225             TCGTemp *ts2 = tcg_temp_alloc(s);
1226
1227             ts->base_type = type;
1228             ts->type = TCG_TYPE_I32;
1229             ts->temp_allocated = 1;
1230             ts->temp_local = temp_local;
1231
1232             tcg_debug_assert(ts2 == ts + 1);
1233             ts2->base_type = TCG_TYPE_I64;
1234             ts2->type = TCG_TYPE_I32;
1235             ts2->temp_allocated = 1;
1236             ts2->temp_local = temp_local;
1237         } else {
1238             ts->base_type = type;
1239             ts->type = type;
1240             ts->temp_allocated = 1;
1241             ts->temp_local = temp_local;
1242         }
1243     }
1244
1245 #if defined(CONFIG_DEBUG_TCG)
1246     s->temps_in_use++;
1247 #endif
1248     return ts;
1249 }
1250
1251 TCGv_vec tcg_temp_new_vec(TCGType type)
1252 {
1253     TCGTemp *t;
1254
1255 #ifdef CONFIG_DEBUG_TCG
1256     switch (type) {
1257     case TCG_TYPE_V64:
1258         assert(TCG_TARGET_HAS_v64);
1259         break;
1260     case TCG_TYPE_V128:
1261         assert(TCG_TARGET_HAS_v128);
1262         break;
1263     case TCG_TYPE_V256:
1264         assert(TCG_TARGET_HAS_v256);
1265         break;
1266     default:
1267         g_assert_not_reached();
1268     }
1269 #endif
1270
1271     t = tcg_temp_new_internal(type, 0);
1272     return temp_tcgv_vec(t);
1273 }
1274
1275 /* Create a new temp of the same type as an existing temp.  */
1276 TCGv_vec tcg_temp_new_vec_matching(TCGv_vec match)
1277 {
1278     TCGTemp *t = tcgv_vec_temp(match);
1279
1280     tcg_debug_assert(t->temp_allocated != 0);
1281
1282     t = tcg_temp_new_internal(t->base_type, 0);
1283     return temp_tcgv_vec(t);
1284 }
1285
1286 void tcg_temp_free_internal(TCGTemp *ts)
1287 {
1288     TCGContext *s = tcg_ctx;
1289     int k, idx;
1290
1291 #if defined(CONFIG_DEBUG_TCG)
1292     s->temps_in_use--;
1293     if (s->temps_in_use < 0) {
1294         fprintf(stderr, "More temporaries freed than allocated!\n");
1295     }
1296 #endif
1297
1298     tcg_debug_assert(ts->temp_global == 0);
1299     tcg_debug_assert(ts->temp_allocated != 0);
1300     ts->temp_allocated = 0;
1301
1302     idx = temp_idx(ts);
1303     k = ts->base_type + (ts->temp_local ? TCG_TYPE_COUNT : 0);
1304     set_bit(idx, s->free_temps[k].l);
1305 }
1306
1307 TCGv_i32 tcg_const_i32(int32_t val)
1308 {
1309     TCGv_i32 t0;
1310     t0 = tcg_temp_new_i32();
1311     tcg_gen_movi_i32(t0, val);
1312     return t0;
1313 }
1314
1315 TCGv_i64 tcg_const_i64(int64_t val)
1316 {
1317     TCGv_i64 t0;
1318     t0 = tcg_temp_new_i64();
1319     tcg_gen_movi_i64(t0, val);
1320     return t0;
1321 }
1322
1323 TCGv_i32 tcg_const_local_i32(int32_t val)
1324 {
1325     TCGv_i32 t0;
1326     t0 = tcg_temp_local_new_i32();
1327     tcg_gen_movi_i32(t0, val);
1328     return t0;
1329 }
1330
1331 TCGv_i64 tcg_const_local_i64(int64_t val)
1332 {
1333     TCGv_i64 t0;
1334     t0 = tcg_temp_local_new_i64();
1335     tcg_gen_movi_i64(t0, val);
1336     return t0;
1337 }
1338
1339 #if defined(CONFIG_DEBUG_TCG)
1340 void tcg_clear_temp_count(void)
1341 {
1342     TCGContext *s = tcg_ctx;
1343     s->temps_in_use = 0;
1344 }
1345
1346 int tcg_check_temp_count(void)
1347 {
1348     TCGContext *s = tcg_ctx;
1349     if (s->temps_in_use) {
1350         /* Clear the count so that we don't give another
1351          * warning immediately next time around.
1352          */
1353         s->temps_in_use = 0;
1354         return 1;
1355     }
1356     return 0;
1357 }
1358 #endif
1359
1360 /* Return true if OP may appear in the opcode stream.
1361    Test the runtime variable that controls each opcode.  */
1362 bool tcg_op_supported(TCGOpcode op)
1363 {
1364     const bool have_vec
1365         = TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
1366
1367     switch (op) {
1368     case INDEX_op_discard:
1369     case INDEX_op_set_label:
1370     case INDEX_op_call:
1371     case INDEX_op_br:
1372     case INDEX_op_mb:
1373     case INDEX_op_insn_start:
1374     case INDEX_op_exit_tb:
1375     case INDEX_op_goto_tb:
1376     case INDEX_op_qemu_ld_i32:
1377     case INDEX_op_qemu_st_i32:
1378     case INDEX_op_qemu_ld_i64:
1379     case INDEX_op_qemu_st_i64:
1380         return true;
1381
1382     case INDEX_op_goto_ptr:
1383         return TCG_TARGET_HAS_goto_ptr;
1384
1385     case INDEX_op_mov_i32:
1386     case INDEX_op_movi_i32:
1387     case INDEX_op_setcond_i32:
1388     case INDEX_op_brcond_i32:
1389     case INDEX_op_ld8u_i32:
1390     case INDEX_op_ld8s_i32:
1391     case INDEX_op_ld16u_i32:
1392     case INDEX_op_ld16s_i32:
1393     case INDEX_op_ld_i32:
1394     case INDEX_op_st8_i32:
1395     case INDEX_op_st16_i32:
1396     case INDEX_op_st_i32:
1397     case INDEX_op_add_i32:
1398     case INDEX_op_sub_i32:
1399     case INDEX_op_mul_i32:
1400     case INDEX_op_and_i32:
1401     case INDEX_op_or_i32:
1402     case INDEX_op_xor_i32:
1403     case INDEX_op_shl_i32:
1404     case INDEX_op_shr_i32:
1405     case INDEX_op_sar_i32:
1406         return true;
1407
1408     case INDEX_op_movcond_i32:
1409         return TCG_TARGET_HAS_movcond_i32;
1410     case INDEX_op_div_i32:
1411     case INDEX_op_divu_i32:
1412         return TCG_TARGET_HAS_div_i32;
1413     case INDEX_op_rem_i32:
1414     case INDEX_op_remu_i32:
1415         return TCG_TARGET_HAS_rem_i32;
1416     case INDEX_op_div2_i32:
1417     case INDEX_op_divu2_i32:
1418         return TCG_TARGET_HAS_div2_i32;
1419     case INDEX_op_rotl_i32:
1420     case INDEX_op_rotr_i32:
1421         return TCG_TARGET_HAS_rot_i32;
1422     case INDEX_op_deposit_i32:
1423         return TCG_TARGET_HAS_deposit_i32;
1424     case INDEX_op_extract_i32:
1425         return TCG_TARGET_HAS_extract_i32;
1426     case INDEX_op_sextract_i32:
1427         return TCG_TARGET_HAS_sextract_i32;
1428     case INDEX_op_add2_i32:
1429         return TCG_TARGET_HAS_add2_i32;
1430     case INDEX_op_sub2_i32:
1431         return TCG_TARGET_HAS_sub2_i32;
1432     case INDEX_op_mulu2_i32:
1433         return TCG_TARGET_HAS_mulu2_i32;
1434     case INDEX_op_muls2_i32:
1435         return TCG_TARGET_HAS_muls2_i32;
1436     case INDEX_op_muluh_i32:
1437         return TCG_TARGET_HAS_muluh_i32;
1438     case INDEX_op_mulsh_i32:
1439         return TCG_TARGET_HAS_mulsh_i32;
1440     case INDEX_op_ext8s_i32:
1441         return TCG_TARGET_HAS_ext8s_i32;
1442     case INDEX_op_ext16s_i32:
1443         return TCG_TARGET_HAS_ext16s_i32;
1444     case INDEX_op_ext8u_i32:
1445         return TCG_TARGET_HAS_ext8u_i32;
1446     case INDEX_op_ext16u_i32:
1447         return TCG_TARGET_HAS_ext16u_i32;
1448     case INDEX_op_bswap16_i32:
1449         return TCG_TARGET_HAS_bswap16_i32;
1450     case INDEX_op_bswap32_i32:
1451         return TCG_TARGET_HAS_bswap32_i32;
1452     case INDEX_op_not_i32:
1453         return TCG_TARGET_HAS_not_i32;
1454     case INDEX_op_neg_i32:
1455         return TCG_TARGET_HAS_neg_i32;
1456     case INDEX_op_andc_i32:
1457         return TCG_TARGET_HAS_andc_i32;
1458     case INDEX_op_orc_i32:
1459         return TCG_TARGET_HAS_orc_i32;
1460     case INDEX_op_eqv_i32:
1461         return TCG_TARGET_HAS_eqv_i32;
1462     case INDEX_op_nand_i32:
1463         return TCG_TARGET_HAS_nand_i32;
1464     case INDEX_op_nor_i32:
1465         return TCG_TARGET_HAS_nor_i32;
1466     case INDEX_op_clz_i32:
1467         return TCG_TARGET_HAS_clz_i32;
1468     case INDEX_op_ctz_i32:
1469         return TCG_TARGET_HAS_ctz_i32;
1470     case INDEX_op_ctpop_i32:
1471         return TCG_TARGET_HAS_ctpop_i32;
1472
1473     case INDEX_op_brcond2_i32:
1474     case INDEX_op_setcond2_i32:
1475         return TCG_TARGET_REG_BITS == 32;
1476
1477     case INDEX_op_mov_i64:
1478     case INDEX_op_movi_i64:
1479     case INDEX_op_setcond_i64:
1480     case INDEX_op_brcond_i64:
1481     case INDEX_op_ld8u_i64:
1482     case INDEX_op_ld8s_i64:
1483     case INDEX_op_ld16u_i64:
1484     case INDEX_op_ld16s_i64:
1485     case INDEX_op_ld32u_i64:
1486     case INDEX_op_ld32s_i64:
1487     case INDEX_op_ld_i64:
1488     case INDEX_op_st8_i64:
1489     case INDEX_op_st16_i64:
1490     case INDEX_op_st32_i64:
1491     case INDEX_op_st_i64:
1492     case INDEX_op_add_i64:
1493     case INDEX_op_sub_i64:
1494     case INDEX_op_mul_i64:
1495     case INDEX_op_and_i64:
1496     case INDEX_op_or_i64:
1497     case INDEX_op_xor_i64:
1498     case INDEX_op_shl_i64:
1499     case INDEX_op_shr_i64:
1500     case INDEX_op_sar_i64:
1501     case INDEX_op_ext_i32_i64:
1502     case INDEX_op_extu_i32_i64:
1503         return TCG_TARGET_REG_BITS == 64;
1504
1505     case INDEX_op_movcond_i64:
1506         return TCG_TARGET_HAS_movcond_i64;
1507     case INDEX_op_div_i64:
1508     case INDEX_op_divu_i64:
1509         return TCG_TARGET_HAS_div_i64;
1510     case INDEX_op_rem_i64:
1511     case INDEX_op_remu_i64:
1512         return TCG_TARGET_HAS_rem_i64;
1513     case INDEX_op_div2_i64:
1514     case INDEX_op_divu2_i64:
1515         return TCG_TARGET_HAS_div2_i64;
1516     case INDEX_op_rotl_i64:
1517     case INDEX_op_rotr_i64:
1518         return TCG_TARGET_HAS_rot_i64;
1519     case INDEX_op_deposit_i64:
1520         return TCG_TARGET_HAS_deposit_i64;
1521     case INDEX_op_extract_i64:
1522         return TCG_TARGET_HAS_extract_i64;
1523     case INDEX_op_sextract_i64:
1524         return TCG_TARGET_HAS_sextract_i64;
1525     case INDEX_op_extrl_i64_i32:
1526         return TCG_TARGET_HAS_extrl_i64_i32;
1527     case INDEX_op_extrh_i64_i32:
1528         return TCG_TARGET_HAS_extrh_i64_i32;
1529     case INDEX_op_ext8s_i64:
1530         return TCG_TARGET_HAS_ext8s_i64;
1531     case INDEX_op_ext16s_i64:
1532         return TCG_TARGET_HAS_ext16s_i64;
1533     case INDEX_op_ext32s_i64:
1534         return TCG_TARGET_HAS_ext32s_i64;
1535     case INDEX_op_ext8u_i64:
1536         return TCG_TARGET_HAS_ext8u_i64;
1537     case INDEX_op_ext16u_i64:
1538         return TCG_TARGET_HAS_ext16u_i64;
1539     case INDEX_op_ext32u_i64:
1540         return TCG_TARGET_HAS_ext32u_i64;
1541     case INDEX_op_bswap16_i64:
1542         return TCG_TARGET_HAS_bswap16_i64;
1543     case INDEX_op_bswap32_i64:
1544         return TCG_TARGET_HAS_bswap32_i64;
1545     case INDEX_op_bswap64_i64:
1546         return TCG_TARGET_HAS_bswap64_i64;
1547     case INDEX_op_not_i64:
1548         return TCG_TARGET_HAS_not_i64;
1549     case INDEX_op_neg_i64:
1550         return TCG_TARGET_HAS_neg_i64;
1551     case INDEX_op_andc_i64:
1552         return TCG_TARGET_HAS_andc_i64;
1553     case INDEX_op_orc_i64:
1554         return TCG_TARGET_HAS_orc_i64;
1555     case INDEX_op_eqv_i64:
1556         return TCG_TARGET_HAS_eqv_i64;
1557     case INDEX_op_nand_i64:
1558         return TCG_TARGET_HAS_nand_i64;
1559     case INDEX_op_nor_i64:
1560         return TCG_TARGET_HAS_nor_i64;
1561     case INDEX_op_clz_i64:
1562         return TCG_TARGET_HAS_clz_i64;
1563     case INDEX_op_ctz_i64:
1564         return TCG_TARGET_HAS_ctz_i64;
1565     case INDEX_op_ctpop_i64:
1566         return TCG_TARGET_HAS_ctpop_i64;
1567     case INDEX_op_add2_i64:
1568         return TCG_TARGET_HAS_add2_i64;
1569     case INDEX_op_sub2_i64:
1570         return TCG_TARGET_HAS_sub2_i64;
1571     case INDEX_op_mulu2_i64:
1572         return TCG_TARGET_HAS_mulu2_i64;
1573     case INDEX_op_muls2_i64:
1574         return TCG_TARGET_HAS_muls2_i64;
1575     case INDEX_op_muluh_i64:
1576         return TCG_TARGET_HAS_muluh_i64;
1577     case INDEX_op_mulsh_i64:
1578         return TCG_TARGET_HAS_mulsh_i64;
1579
1580     case INDEX_op_mov_vec:
1581     case INDEX_op_dup_vec:
1582     case INDEX_op_dupi_vec:
1583     case INDEX_op_ld_vec:
1584     case INDEX_op_st_vec:
1585     case INDEX_op_add_vec:
1586     case INDEX_op_sub_vec:
1587     case INDEX_op_and_vec:
1588     case INDEX_op_or_vec:
1589     case INDEX_op_xor_vec:
1590     case INDEX_op_cmp_vec:
1591         return have_vec;
1592     case INDEX_op_dup2_vec:
1593         return have_vec && TCG_TARGET_REG_BITS == 32;
1594     case INDEX_op_not_vec:
1595         return have_vec && TCG_TARGET_HAS_not_vec;
1596     case INDEX_op_neg_vec:
1597         return have_vec && TCG_TARGET_HAS_neg_vec;
1598     case INDEX_op_andc_vec:
1599         return have_vec && TCG_TARGET_HAS_andc_vec;
1600     case INDEX_op_orc_vec:
1601         return have_vec && TCG_TARGET_HAS_orc_vec;
1602     case INDEX_op_mul_vec:
1603         return have_vec && TCG_TARGET_HAS_mul_vec;
1604     case INDEX_op_shli_vec:
1605     case INDEX_op_shri_vec:
1606     case INDEX_op_sari_vec:
1607         return have_vec && TCG_TARGET_HAS_shi_vec;
1608     case INDEX_op_shls_vec:
1609     case INDEX_op_shrs_vec:
1610     case INDEX_op_sars_vec:
1611         return have_vec && TCG_TARGET_HAS_shs_vec;
1612     case INDEX_op_shlv_vec:
1613     case INDEX_op_shrv_vec:
1614     case INDEX_op_sarv_vec:
1615         return have_vec && TCG_TARGET_HAS_shv_vec;
1616     case INDEX_op_ssadd_vec:
1617     case INDEX_op_usadd_vec:
1618     case INDEX_op_sssub_vec:
1619     case INDEX_op_ussub_vec:
1620         return have_vec && TCG_TARGET_HAS_sat_vec;
1621     case INDEX_op_smin_vec:
1622     case INDEX_op_umin_vec:
1623     case INDEX_op_smax_vec:
1624     case INDEX_op_umax_vec:
1625         return have_vec && TCG_TARGET_HAS_minmax_vec;
1626
1627     default:
1628         tcg_debug_assert(op > INDEX_op_last_generic && op < NB_OPS);
1629         return true;
1630     }
1631 }
1632
1633 /* Note: we convert the 64 bit args to 32 bit and do some alignment
1634    and endian swap. Maybe it would be better to do the alignment
1635    and endian swap in tcg_reg_alloc_call(). */
1636 void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
1637 {
1638     int i, real_args, nb_rets, pi;
1639     unsigned sizemask, flags;
1640     TCGHelperInfo *info;
1641     TCGOp *op;
1642
1643     info = g_hash_table_lookup(helper_table, (gpointer)func);
1644     flags = info->flags;
1645     sizemask = info->sizemask;
1646
1647 #if defined(__sparc__) && !defined(__arch64__) \
1648     && !defined(CONFIG_TCG_INTERPRETER)
1649     /* We have 64-bit values in one register, but need to pass as two
1650        separate parameters.  Split them.  */
1651     int orig_sizemask = sizemask;
1652     int orig_nargs = nargs;
1653     TCGv_i64 retl, reth;
1654     TCGTemp *split_args[MAX_OPC_PARAM];
1655
1656     retl = NULL;
1657     reth = NULL;
1658     if (sizemask != 0) {
1659         for (i = real_args = 0; i < nargs; ++i) {
1660             int is_64bit = sizemask & (1 << (i+1)*2);
1661             if (is_64bit) {
1662                 TCGv_i64 orig = temp_tcgv_i64(args[i]);
1663                 TCGv_i32 h = tcg_temp_new_i32();
1664                 TCGv_i32 l = tcg_temp_new_i32();
1665                 tcg_gen_extr_i64_i32(l, h, orig);
1666                 split_args[real_args++] = tcgv_i32_temp(h);
1667                 split_args[real_args++] = tcgv_i32_temp(l);
1668             } else {
1669                 split_args[real_args++] = args[i];
1670             }
1671         }
1672         nargs = real_args;
1673         args = split_args;
1674         sizemask = 0;
1675     }
1676 #elif defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
1677     for (i = 0; i < nargs; ++i) {
1678         int is_64bit = sizemask & (1 << (i+1)*2);
1679         int is_signed = sizemask & (2 << (i+1)*2);
1680         if (!is_64bit) {
1681             TCGv_i64 temp = tcg_temp_new_i64();
1682             TCGv_i64 orig = temp_tcgv_i64(args[i]);
1683             if (is_signed) {
1684                 tcg_gen_ext32s_i64(temp, orig);
1685             } else {
1686                 tcg_gen_ext32u_i64(temp, orig);
1687             }
1688             args[i] = tcgv_i64_temp(temp);
1689         }
1690     }
1691 #endif /* TCG_TARGET_EXTEND_ARGS */
1692
1693     op = tcg_emit_op(INDEX_op_call);
1694
1695     pi = 0;
1696     if (ret != NULL) {
1697 #if defined(__sparc__) && !defined(__arch64__) \
1698     && !defined(CONFIG_TCG_INTERPRETER)
1699         if (orig_sizemask & 1) {
1700             /* The 32-bit ABI is going to return the 64-bit value in
1701                the %o0/%o1 register pair.  Prepare for this by using
1702                two return temporaries, and reassemble below.  */
1703             retl = tcg_temp_new_i64();
1704             reth = tcg_temp_new_i64();
1705             op->args[pi++] = tcgv_i64_arg(reth);
1706             op->args[pi++] = tcgv_i64_arg(retl);
1707             nb_rets = 2;
1708         } else {
1709             op->args[pi++] = temp_arg(ret);
1710             nb_rets = 1;
1711         }
1712 #else
1713         if (TCG_TARGET_REG_BITS < 64 && (sizemask & 1)) {
1714 #ifdef HOST_WORDS_BIGENDIAN
1715             op->args[pi++] = temp_arg(ret + 1);
1716             op->args[pi++] = temp_arg(ret);
1717 #else
1718             op->args[pi++] = temp_arg(ret);
1719             op->args[pi++] = temp_arg(ret + 1);
1720 #endif
1721             nb_rets = 2;
1722         } else {
1723             op->args[pi++] = temp_arg(ret);
1724             nb_rets = 1;
1725         }
1726 #endif
1727     } else {
1728         nb_rets = 0;
1729     }
1730     TCGOP_CALLO(op) = nb_rets;
1731
1732     real_args = 0;
1733     for (i = 0; i < nargs; i++) {
1734         int is_64bit = sizemask & (1 << (i+1)*2);
1735         if (TCG_TARGET_REG_BITS < 64 && is_64bit) {
1736 #ifdef TCG_TARGET_CALL_ALIGN_ARGS
1737             /* some targets want aligned 64 bit args */
1738             if (real_args & 1) {
1739                 op->args[pi++] = TCG_CALL_DUMMY_ARG;
1740                 real_args++;
1741             }
1742 #endif
1743            /* If stack grows up, then we will be placing successive
1744               arguments at lower addresses, which means we need to
1745               reverse the order compared to how we would normally
1746               treat either big or little-endian.  For those arguments
1747               that will wind up in registers, this still works for
1748               HPPA (the only current STACK_GROWSUP target) since the
1749               argument registers are *also* allocated in decreasing
1750               order.  If another such target is added, this logic may
1751               have to get more complicated to differentiate between
1752               stack arguments and register arguments.  */
1753 #if defined(HOST_WORDS_BIGENDIAN) != defined(TCG_TARGET_STACK_GROWSUP)
1754             op->args[pi++] = temp_arg(args[i] + 1);
1755             op->args[pi++] = temp_arg(args[i]);
1756 #else
1757             op->args[pi++] = temp_arg(args[i]);
1758             op->args[pi++] = temp_arg(args[i] + 1);
1759 #endif
1760             real_args += 2;
1761             continue;
1762         }
1763
1764         op->args[pi++] = temp_arg(args[i]);
1765         real_args++;
1766     }
1767     op->args[pi++] = (uintptr_t)func;
1768     op->args[pi++] = flags;
1769     TCGOP_CALLI(op) = real_args;
1770
1771     /* Make sure the fields didn't overflow.  */
1772     tcg_debug_assert(TCGOP_CALLI(op) == real_args);
1773     tcg_debug_assert(pi <= ARRAY_SIZE(op->args));
1774
1775 #if defined(__sparc__) && !defined(__arch64__) \
1776     && !defined(CONFIG_TCG_INTERPRETER)
1777     /* Free all of the parts we allocated above.  */
1778     for (i = real_args = 0; i < orig_nargs; ++i) {
1779         int is_64bit = orig_sizemask & (1 << (i+1)*2);
1780         if (is_64bit) {
1781             tcg_temp_free_internal(args[real_args++]);
1782             tcg_temp_free_internal(args[real_args++]);
1783         } else {
1784             real_args++;
1785         }
1786     }
1787     if (orig_sizemask & 1) {
1788         /* The 32-bit ABI returned two 32-bit pieces.  Re-assemble them.
1789            Note that describing these as TCGv_i64 eliminates an unnecessary
1790            zero-extension that tcg_gen_concat_i32_i64 would create.  */
1791         tcg_gen_concat32_i64(temp_tcgv_i64(ret), retl, reth);
1792         tcg_temp_free_i64(retl);
1793         tcg_temp_free_i64(reth);
1794     }
1795 #elif defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
1796     for (i = 0; i < nargs; ++i) {
1797         int is_64bit = sizemask & (1 << (i+1)*2);
1798         if (!is_64bit) {
1799             tcg_temp_free_internal(args[i]);
1800         }
1801     }
1802 #endif /* TCG_TARGET_EXTEND_ARGS */
1803 }
1804
1805 static void tcg_reg_alloc_start(TCGContext *s)
1806 {
1807     int i, n;
1808     TCGTemp *ts;
1809
1810     for (i = 0, n = s->nb_globals; i < n; i++) {
1811         ts = &s->temps[i];
1812         ts->val_type = (ts->fixed_reg ? TEMP_VAL_REG : TEMP_VAL_MEM);
1813     }
1814     for (n = s->nb_temps; i < n; i++) {
1815         ts = &s->temps[i];
1816         ts->val_type = (ts->temp_local ? TEMP_VAL_MEM : TEMP_VAL_DEAD);
1817         ts->mem_allocated = 0;
1818         ts->fixed_reg = 0;
1819     }
1820
1821     memset(s->reg_to_temp, 0, sizeof(s->reg_to_temp));
1822 }
1823
1824 static char *tcg_get_arg_str_ptr(TCGContext *s, char *buf, int buf_size,
1825                                  TCGTemp *ts)
1826 {
1827     int idx = temp_idx(ts);
1828
1829     if (ts->temp_global) {
1830         pstrcpy(buf, buf_size, ts->name);
1831     } else if (ts->temp_local) {
1832         snprintf(buf, buf_size, "loc%d", idx - s->nb_globals);
1833     } else {
1834         snprintf(buf, buf_size, "tmp%d", idx - s->nb_globals);
1835     }
1836     return buf;
1837 }
1838
1839 static char *tcg_get_arg_str(TCGContext *s, char *buf,
1840                              int buf_size, TCGArg arg)
1841 {
1842     return tcg_get_arg_str_ptr(s, buf, buf_size, arg_temp(arg));
1843 }
1844
1845 /* Find helper name.  */
1846 static inline const char *tcg_find_helper(TCGContext *s, uintptr_t val)
1847 {
1848     const char *ret = NULL;
1849     if (helper_table) {
1850         TCGHelperInfo *info = g_hash_table_lookup(helper_table, (gpointer)val);
1851         if (info) {
1852             ret = info->name;
1853         }
1854     }
1855     return ret;
1856 }
1857
1858 static const char * const cond_name[] =
1859 {
1860     [TCG_COND_NEVER] = "never",
1861     [TCG_COND_ALWAYS] = "always",
1862     [TCG_COND_EQ] = "eq",
1863     [TCG_COND_NE] = "ne",
1864     [TCG_COND_LT] = "lt",
1865     [TCG_COND_GE] = "ge",
1866     [TCG_COND_LE] = "le",
1867     [TCG_COND_GT] = "gt",
1868     [TCG_COND_LTU] = "ltu",
1869     [TCG_COND_GEU] = "geu",
1870     [TCG_COND_LEU] = "leu",
1871     [TCG_COND_GTU] = "gtu"
1872 };
1873
1874 static const char * const ldst_name[] =
1875 {
1876     [MO_UB]   = "ub",
1877     [MO_SB]   = "sb",
1878     [MO_LEUW] = "leuw",
1879     [MO_LESW] = "lesw",
1880     [MO_LEUL] = "leul",
1881     [MO_LESL] = "lesl",
1882     [MO_LEQ]  = "leq",
1883     [MO_BEUW] = "beuw",
1884     [MO_BESW] = "besw",
1885     [MO_BEUL] = "beul",
1886     [MO_BESL] = "besl",
1887     [MO_BEQ]  = "beq",
1888 };
1889
1890 static const char * const alignment_name[(MO_AMASK >> MO_ASHIFT) + 1] = {
1891 #ifdef ALIGNED_ONLY
1892     [MO_UNALN >> MO_ASHIFT]    = "un+",
1893     [MO_ALIGN >> MO_ASHIFT]    = "",
1894 #else
1895     [MO_UNALN >> MO_ASHIFT]    = "",
1896     [MO_ALIGN >> MO_ASHIFT]    = "al+",
1897 #endif
1898     [MO_ALIGN_2 >> MO_ASHIFT]  = "al2+",
1899     [MO_ALIGN_4 >> MO_ASHIFT]  = "al4+",
1900     [MO_ALIGN_8 >> MO_ASHIFT]  = "al8+",
1901     [MO_ALIGN_16 >> MO_ASHIFT] = "al16+",
1902     [MO_ALIGN_32 >> MO_ASHIFT] = "al32+",
1903     [MO_ALIGN_64 >> MO_ASHIFT] = "al64+",
1904 };
1905
1906 static inline bool tcg_regset_single(TCGRegSet d)
1907 {
1908     return (d & (d - 1)) == 0;
1909 }
1910
1911 static inline TCGReg tcg_regset_first(TCGRegSet d)
1912 {
1913     if (TCG_TARGET_NB_REGS <= 32) {
1914         return ctz32(d);
1915     } else {
1916         return ctz64(d);
1917     }
1918 }
1919
1920 static void tcg_dump_ops(TCGContext *s, bool have_prefs)
1921 {
1922     char buf[128];
1923     TCGOp *op;
1924
1925     QTAILQ_FOREACH(op, &s->ops, link) {
1926         int i, k, nb_oargs, nb_iargs, nb_cargs;
1927         const TCGOpDef *def;
1928         TCGOpcode c;
1929         int col = 0;
1930
1931         c = op->opc;
1932         def = &tcg_op_defs[c];
1933
1934         if (c == INDEX_op_insn_start) {
1935             nb_oargs = 0;
1936             col += qemu_log("\n ----");
1937
1938             for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
1939                 target_ulong a;
1940 #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
1941                 a = deposit64(op->args[i * 2], 32, 32, op->args[i * 2 + 1]);
1942 #else
1943                 a = op->args[i];
1944 #endif
1945                 col += qemu_log(" " TARGET_FMT_lx, a);
1946             }
1947         } else if (c == INDEX_op_call) {
1948             /* variable number of arguments */
1949             nb_oargs = TCGOP_CALLO(op);
1950             nb_iargs = TCGOP_CALLI(op);
1951             nb_cargs = def->nb_cargs;
1952
1953             /* function name, flags, out args */
1954             col += qemu_log(" %s %s,$0x%" TCG_PRIlx ",$%d", def->name,
1955                             tcg_find_helper(s, op->args[nb_oargs + nb_iargs]),
1956                             op->args[nb_oargs + nb_iargs + 1], nb_oargs);
1957             for (i = 0; i < nb_oargs; i++) {
1958                 col += qemu_log(",%s", tcg_get_arg_str(s, buf, sizeof(buf),
1959                                                        op->args[i]));
1960             }
1961             for (i = 0; i < nb_iargs; i++) {
1962                 TCGArg arg = op->args[nb_oargs + i];
1963                 const char *t = "<dummy>";
1964                 if (arg != TCG_CALL_DUMMY_ARG) {
1965                     t = tcg_get_arg_str(s, buf, sizeof(buf), arg);
1966                 }
1967                 col += qemu_log(",%s", t);
1968             }
1969         } else {
1970             col += qemu_log(" %s ", def->name);
1971
1972             nb_oargs = def->nb_oargs;
1973             nb_iargs = def->nb_iargs;
1974             nb_cargs = def->nb_cargs;
1975
1976             if (def->flags & TCG_OPF_VECTOR) {
1977                 col += qemu_log("v%d,e%d,", 64 << TCGOP_VECL(op),
1978                                 8 << TCGOP_VECE(op));
1979             }
1980
1981             k = 0;
1982             for (i = 0; i < nb_oargs; i++) {
1983                 if (k != 0) {
1984                     col += qemu_log(",");
1985                 }
1986                 col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
1987                                                       op->args[k++]));
1988             }
1989             for (i = 0; i < nb_iargs; i++) {
1990                 if (k != 0) {
1991                     col += qemu_log(",");
1992                 }
1993                 col += qemu_log("%s", tcg_get_arg_str(s, buf, sizeof(buf),
1994                                                       op->args[k++]));
1995             }
1996             switch (c) {
1997             case INDEX_op_brcond_i32:
1998             case INDEX_op_setcond_i32:
1999             case INDEX_op_movcond_i32:
2000             case INDEX_op_brcond2_i32:
2001             case INDEX_op_setcond2_i32:
2002             case INDEX_op_brcond_i64:
2003             case INDEX_op_setcond_i64:
2004             case INDEX_op_movcond_i64:
2005             case INDEX_op_cmp_vec:
2006                 if (op->args[k] < ARRAY_SIZE(cond_name)
2007                     && cond_name[op->args[k]]) {
2008                     col += qemu_log(",%s", cond_name[op->args[k++]]);
2009                 } else {
2010                     col += qemu_log(",$0x%" TCG_PRIlx, op->args[k++]);
2011                 }
2012                 i = 1;
2013                 break;
2014             case INDEX_op_qemu_ld_i32:
2015             case INDEX_op_qemu_st_i32:
2016             case INDEX_op_qemu_ld_i64:
2017             case INDEX_op_qemu_st_i64:
2018                 {
2019                     TCGMemOpIdx oi = op->args[k++];
2020                     TCGMemOp op = get_memop(oi);
2021                     unsigned ix = get_mmuidx(oi);
2022
2023                     if (op & ~(MO_AMASK | MO_BSWAP | MO_SSIZE)) {
2024                         col += qemu_log(",$0x%x,%u", op, ix);
2025                     } else {
2026                         const char *s_al, *s_op;
2027                         s_al = alignment_name[(op & MO_AMASK) >> MO_ASHIFT];
2028                         s_op = ldst_name[op & (MO_BSWAP | MO_SSIZE)];
2029                         col += qemu_log(",%s%s,%u", s_al, s_op, ix);
2030                     }
2031                     i = 1;
2032                 }
2033                 break;
2034             default:
2035                 i = 0;
2036                 break;
2037             }
2038             switch (c) {
2039             case INDEX_op_set_label:
2040             case INDEX_op_br:
2041             case INDEX_op_brcond_i32:
2042             case INDEX_op_brcond_i64:
2043             case INDEX_op_brcond2_i32:
2044                 col += qemu_log("%s$L%d", k ? "," : "",
2045                                 arg_label(op->args[k])->id);
2046                 i++, k++;
2047                 break;
2048             default:
2049                 break;
2050             }
2051             for (; i < nb_cargs; i++, k++) {
2052                 col += qemu_log("%s$0x%" TCG_PRIlx, k ? "," : "", op->args[k]);
2053             }
2054         }
2055
2056         if (have_prefs || op->life) {
2057             for (; col < 40; ++col) {
2058                 putc(' ', qemu_logfile);
2059             }
2060         }
2061
2062         if (op->life) {
2063             unsigned life = op->life;
2064
2065             if (life & (SYNC_ARG * 3)) {
2066                 qemu_log("  sync:");
2067                 for (i = 0; i < 2; ++i) {
2068                     if (life & (SYNC_ARG << i)) {
2069                         qemu_log(" %d", i);
2070                     }
2071                 }
2072             }
2073             life /= DEAD_ARG;
2074             if (life) {
2075                 qemu_log("  dead:");
2076                 for (i = 0; life; ++i, life >>= 1) {
2077                     if (life & 1) {
2078                         qemu_log(" %d", i);
2079                     }
2080                 }
2081             }
2082         }
2083
2084         if (have_prefs) {
2085             for (i = 0; i < nb_oargs; ++i) {
2086                 TCGRegSet set = op->output_pref[i];
2087
2088                 if (i == 0) {
2089                     qemu_log("  pref=");
2090                 } else {
2091                     qemu_log(",");
2092                 }
2093                 if (set == 0) {
2094                     qemu_log("none");
2095                 } else if (set == MAKE_64BIT_MASK(0, TCG_TARGET_NB_REGS)) {
2096                     qemu_log("all");
2097 #ifdef CONFIG_DEBUG_TCG
2098                 } else if (tcg_regset_single(set)) {
2099                     TCGReg reg = tcg_regset_first(set);
2100                     qemu_log("%s", tcg_target_reg_names[reg]);
2101 #endif
2102                 } else if (TCG_TARGET_NB_REGS <= 32) {
2103                     qemu_log("%#x", (uint32_t)set);
2104                 } else {
2105                     qemu_log("%#" PRIx64, (uint64_t)set);
2106                 }
2107             }
2108         }
2109
2110         qemu_log("\n");
2111     }
2112 }
2113
2114 /* we give more priority to constraints with less registers */
2115 static int get_constraint_priority(const TCGOpDef *def, int k)
2116 {
2117     const TCGArgConstraint *arg_ct;
2118
2119     int i, n;
2120     arg_ct = &def->args_ct[k];
2121     if (arg_ct->ct & TCG_CT_ALIAS) {
2122         /* an alias is equivalent to a single register */
2123         n = 1;
2124     } else {
2125         if (!(arg_ct->ct & TCG_CT_REG))
2126             return 0;
2127         n = 0;
2128         for(i = 0; i < TCG_TARGET_NB_REGS; i++) {
2129             if (tcg_regset_test_reg(arg_ct->u.regs, i))
2130                 n++;
2131         }
2132     }
2133     return TCG_TARGET_NB_REGS - n + 1;
2134 }
2135
2136 /* sort from highest priority to lowest */
2137 static void sort_constraints(TCGOpDef *def, int start, int n)
2138 {
2139     int i, j, p1, p2, tmp;
2140
2141     for(i = 0; i < n; i++)
2142         def->sorted_args[start + i] = start + i;
2143     if (n <= 1)
2144         return;
2145     for(i = 0; i < n - 1; i++) {
2146         for(j = i + 1; j < n; j++) {
2147             p1 = get_constraint_priority(def, def->sorted_args[start + i]);
2148             p2 = get_constraint_priority(def, def->sorted_args[start + j]);
2149             if (p1 < p2) {
2150                 tmp = def->sorted_args[start + i];
2151                 def->sorted_args[start + i] = def->sorted_args[start + j];
2152                 def->sorted_args[start + j] = tmp;
2153             }
2154         }
2155     }
2156 }
2157
2158 static void process_op_defs(TCGContext *s)
2159 {
2160     TCGOpcode op;
2161
2162     for (op = 0; op < NB_OPS; op++) {
2163         TCGOpDef *def = &tcg_op_defs[op];
2164         const TCGTargetOpDef *tdefs;
2165         TCGType type;
2166         int i, nb_args;
2167
2168         if (def->flags & TCG_OPF_NOT_PRESENT) {
2169             continue;
2170         }
2171
2172         nb_args = def->nb_iargs + def->nb_oargs;
2173         if (nb_args == 0) {
2174             continue;
2175         }
2176
2177         tdefs = tcg_target_op_def(op);
2178         /* Missing TCGTargetOpDef entry. */
2179         tcg_debug_assert(tdefs != NULL);
2180
2181         type = (def->flags & TCG_OPF_64BIT ? TCG_TYPE_I64 : TCG_TYPE_I32);
2182         for (i = 0; i < nb_args; i++) {
2183             const char *ct_str = tdefs->args_ct_str[i];
2184             /* Incomplete TCGTargetOpDef entry. */
2185             tcg_debug_assert(ct_str != NULL);
2186
2187             def->args_ct[i].u.regs = 0;
2188             def->args_ct[i].ct = 0;
2189             while (*ct_str != '\0') {
2190                 switch(*ct_str) {
2191                 case '0' ... '9':
2192                     {
2193                         int oarg = *ct_str - '0';
2194                         tcg_debug_assert(ct_str == tdefs->args_ct_str[i]);
2195                         tcg_debug_assert(oarg < def->nb_oargs);
2196                         tcg_debug_assert(def->args_ct[oarg].ct & TCG_CT_REG);
2197                         /* TCG_CT_ALIAS is for the output arguments.
2198                            The input is tagged with TCG_CT_IALIAS. */
2199                         def->args_ct[i] = def->args_ct[oarg];
2200                         def->args_ct[oarg].ct |= TCG_CT_ALIAS;
2201                         def->args_ct[oarg].alias_index = i;
2202                         def->args_ct[i].ct |= TCG_CT_IALIAS;
2203                         def->args_ct[i].alias_index = oarg;
2204                     }
2205                     ct_str++;
2206                     break;
2207                 case '&':
2208                     def->args_ct[i].ct |= TCG_CT_NEWREG;
2209                     ct_str++;
2210                     break;
2211                 case 'i':
2212                     def->args_ct[i].ct |= TCG_CT_CONST;
2213                     ct_str++;
2214                     break;
2215                 default:
2216                     ct_str = target_parse_constraint(&def->args_ct[i],
2217                                                      ct_str, type);
2218                     /* Typo in TCGTargetOpDef constraint. */
2219                     tcg_debug_assert(ct_str != NULL);
2220                 }
2221             }
2222         }
2223
2224         /* TCGTargetOpDef entry with too much information? */
2225         tcg_debug_assert(i == TCG_MAX_OP_ARGS || tdefs->args_ct_str[i] == NULL);
2226
2227         /* sort the constraints (XXX: this is just an heuristic) */
2228         sort_constraints(def, 0, def->nb_oargs);
2229         sort_constraints(def, def->nb_oargs, def->nb_iargs);
2230     }
2231 }
2232
2233 void tcg_op_remove(TCGContext *s, TCGOp *op)
2234 {
2235     TCGLabel *label;
2236
2237     switch (op->opc) {
2238     case INDEX_op_br:
2239         label = arg_label(op->args[0]);
2240         label->refs--;
2241         break;
2242     case INDEX_op_brcond_i32:
2243     case INDEX_op_brcond_i64:
2244         label = arg_label(op->args[3]);
2245         label->refs--;
2246         break;
2247     case INDEX_op_brcond2_i32:
2248         label = arg_label(op->args[5]);
2249         label->refs--;
2250         break;
2251     default:
2252         break;
2253     }
2254
2255     QTAILQ_REMOVE(&s->ops, op, link);
2256     QTAILQ_INSERT_TAIL(&s->free_ops, op, link);
2257     s->nb_ops--;
2258
2259 #ifdef CONFIG_PROFILER
2260     atomic_set(&s->prof.del_op_count, s->prof.del_op_count + 1);
2261 #endif
2262 }
2263
2264 static TCGOp *tcg_op_alloc(TCGOpcode opc)
2265 {
2266     TCGContext *s = tcg_ctx;
2267     TCGOp *op;
2268
2269     if (likely(QTAILQ_EMPTY(&s->free_ops))) {
2270         op = tcg_malloc(sizeof(TCGOp));
2271     } else {
2272         op = QTAILQ_FIRST(&s->free_ops);
2273         QTAILQ_REMOVE(&s->free_ops, op, link);
2274     }
2275     memset(op, 0, offsetof(TCGOp, link));
2276     op->opc = opc;
2277     s->nb_ops++;
2278
2279     return op;
2280 }
2281
2282 TCGOp *tcg_emit_op(TCGOpcode opc)
2283 {
2284     TCGOp *op = tcg_op_alloc(opc);
2285     QTAILQ_INSERT_TAIL(&tcg_ctx->ops, op, link);
2286     return op;
2287 }
2288
2289 TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op, TCGOpcode opc)
2290 {
2291     TCGOp *new_op = tcg_op_alloc(opc);
2292     QTAILQ_INSERT_BEFORE(old_op, new_op, link);
2293     return new_op;
2294 }
2295
2296 TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op, TCGOpcode opc)
2297 {
2298     TCGOp *new_op = tcg_op_alloc(opc);
2299     QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
2300     return new_op;
2301 }
2302
2303 /* Reachable analysis : remove unreachable code.  */
2304 static void reachable_code_pass(TCGContext *s)
2305 {
2306     TCGOp *op, *op_next;
2307     bool dead = false;
2308
2309     QTAILQ_FOREACH_SAFE(op, &s->ops, link, op_next) {
2310         bool remove = dead;
2311         TCGLabel *label;
2312         int call_flags;
2313
2314         switch (op->opc) {
2315         case INDEX_op_set_label:
2316             label = arg_label(op->args[0]);
2317             if (label->refs == 0) {
2318                 /*
2319                  * While there is an occasional backward branch, virtually
2320                  * all branches generated by the translators are forward.
2321                  * Which means that generally we will have already removed
2322                  * all references to the label that will be, and there is
2323                  * little to be gained by iterating.
2324                  */
2325                 remove = true;
2326             } else {
2327                 /* Once we see a label, insns become live again.  */
2328                 dead = false;
2329                 remove = false;
2330
2331                 /*
2332                  * Optimization can fold conditional branches to unconditional.
2333                  * If we find a label with one reference which is preceded by
2334                  * an unconditional branch to it, remove both.  This needed to
2335                  * wait until the dead code in between them was removed.
2336                  */
2337                 if (label->refs == 1) {
2338                     TCGOp *op_prev = QTAILQ_PREV(op, link);
2339                     if (op_prev->opc == INDEX_op_br &&
2340                         label == arg_label(op_prev->args[0])) {
2341                         tcg_op_remove(s, op_prev);
2342                         remove = true;
2343                     }
2344                 }
2345             }
2346             break;
2347
2348         case INDEX_op_br:
2349         case INDEX_op_exit_tb:
2350         case INDEX_op_goto_ptr:
2351             /* Unconditional branches; everything following is dead.  */
2352             dead = true;
2353             break;
2354
2355         case INDEX_op_call:
2356             /* Notice noreturn helper calls, raising exceptions.  */
2357             call_flags = op->args[TCGOP_CALLO(op) + TCGOP_CALLI(op) + 1];
2358             if (call_flags & TCG_CALL_NO_RETURN) {
2359                 dead = true;
2360             }
2361             break;
2362
2363         case INDEX_op_insn_start:
2364             /* Never remove -- we need to keep these for unwind.  */
2365             remove = false;
2366             break;
2367
2368         default:
2369             break;
2370         }
2371
2372         if (remove) {
2373             tcg_op_remove(s, op);
2374         }
2375     }
2376 }
2377
2378 #define TS_DEAD  1
2379 #define TS_MEM   2
2380
2381 #define IS_DEAD_ARG(n)   (arg_life & (DEAD_ARG << (n)))
2382 #define NEED_SYNC_ARG(n) (arg_life & (SYNC_ARG << (n)))
2383
2384 /* For liveness_pass_1, the register preferences for a given temp.  */
2385 static inline TCGRegSet *la_temp_pref(TCGTemp *ts)
2386 {
2387     return ts->state_ptr;
2388 }
2389
2390 /* For liveness_pass_1, reset the preferences for a given temp to the
2391  * maximal regset for its type.
2392  */
2393 static inline void la_reset_pref(TCGTemp *ts)
2394 {
2395     *la_temp_pref(ts)
2396         = (ts->state == TS_DEAD ? 0 : tcg_target_available_regs[ts->type]);
2397 }
2398
2399 /* liveness analysis: end of function: all temps are dead, and globals
2400    should be in memory. */
2401 static void la_func_end(TCGContext *s, int ng, int nt)
2402 {
2403     int i;
2404
2405     for (i = 0; i < ng; ++i) {
2406         s->temps[i].state = TS_DEAD | TS_MEM;
2407         la_reset_pref(&s->temps[i]);
2408     }
2409     for (i = ng; i < nt; ++i) {
2410         s->temps[i].state = TS_DEAD;
2411         la_reset_pref(&s->temps[i]);
2412     }
2413 }
2414
2415 /* liveness analysis: end of basic block: all temps are dead, globals
2416    and local temps should be in memory. */
2417 static void la_bb_end(TCGContext *s, int ng, int nt)
2418 {
2419     int i;
2420
2421     for (i = 0; i < ng; ++i) {
2422         s->temps[i].state = TS_DEAD | TS_MEM;
2423         la_reset_pref(&s->temps[i]);
2424     }
2425     for (i = ng; i < nt; ++i) {
2426         s->temps[i].state = (s->temps[i].temp_local
2427                              ? TS_DEAD | TS_MEM
2428                              : TS_DEAD);
2429         la_reset_pref(&s->temps[i]);
2430     }
2431 }
2432
2433 /* liveness analysis: sync globals back to memory.  */
2434 static void la_global_sync(TCGContext *s, int ng)
2435 {
2436     int i;
2437
2438     for (i = 0; i < ng; ++i) {
2439         int state = s->temps[i].state;
2440         s->temps[i].state = state | TS_MEM;
2441         if (state == TS_DEAD) {
2442             /* If the global was previously dead, reset prefs.  */
2443             la_reset_pref(&s->temps[i]);
2444         }
2445     }
2446 }
2447
2448 /* liveness analysis: sync globals back to memory and kill.  */
2449 static void la_global_kill(TCGContext *s, int ng)
2450 {
2451     int i;
2452
2453     for (i = 0; i < ng; i++) {
2454         s->temps[i].state = TS_DEAD | TS_MEM;
2455         la_reset_pref(&s->temps[i]);
2456     }
2457 }
2458
2459 /* liveness analysis: note live globals crossing calls.  */
2460 static void la_cross_call(TCGContext *s, int nt)
2461 {
2462     TCGRegSet mask = ~tcg_target_call_clobber_regs;
2463     int i;
2464
2465     for (i = 0; i < nt; i++) {
2466         TCGTemp *ts = &s->temps[i];
2467         if (!(ts->state & TS_DEAD)) {
2468             TCGRegSet *pset = la_temp_pref(ts);
2469             TCGRegSet set = *pset;
2470
2471             set &= mask;
2472             /* If the combination is not possible, restart.  */
2473             if (set == 0) {
2474                 set = tcg_target_available_regs[ts->type] & mask;
2475             }
2476             *pset = set;
2477         }
2478     }
2479 }
2480
2481 /* Liveness analysis : update the opc_arg_life array to tell if a
2482    given input arguments is dead. Instructions updating dead
2483    temporaries are removed. */
2484 static void liveness_pass_1(TCGContext *s)
2485 {
2486     int nb_globals = s->nb_globals;
2487     int nb_temps = s->nb_temps;
2488     TCGOp *op, *op_prev;
2489     TCGRegSet *prefs;
2490     int i;
2491
2492     prefs = tcg_malloc(sizeof(TCGRegSet) * nb_temps);
2493     for (i = 0; i < nb_temps; ++i) {
2494         s->temps[i].state_ptr = prefs + i;
2495     }
2496
2497     /* ??? Should be redundant with the exit_tb that ends the TB.  */
2498     la_func_end(s, nb_globals, nb_temps);
2499
2500     QTAILQ_FOREACH_REVERSE_SAFE(op, &s->ops, link, op_prev) {
2501         int nb_iargs, nb_oargs;
2502         TCGOpcode opc_new, opc_new2;
2503         bool have_opc_new2;
2504         TCGLifeData arg_life = 0;
2505         TCGTemp *ts;
2506         TCGOpcode opc = op->opc;
2507         const TCGOpDef *def = &tcg_op_defs[opc];
2508
2509         switch (opc) {
2510         case INDEX_op_call:
2511             {
2512                 int call_flags;
2513                 int nb_call_regs;
2514
2515                 nb_oargs = TCGOP_CALLO(op);
2516                 nb_iargs = TCGOP_CALLI(op);
2517                 call_flags = op->args[nb_oargs + nb_iargs + 1];
2518
2519                 /* pure functions can be removed if their result is unused */
2520                 if (call_flags & TCG_CALL_NO_SIDE_EFFECTS) {
2521                     for (i = 0; i < nb_oargs; i++) {
2522                         ts = arg_temp(op->args[i]);
2523                         if (ts->state != TS_DEAD) {
2524                             goto do_not_remove_call;
2525                         }
2526                     }
2527                     goto do_remove;
2528                 }
2529             do_not_remove_call:
2530
2531                 /* Output args are dead.  */
2532                 for (i = 0; i < nb_oargs; i++) {
2533                     ts = arg_temp(op->args[i]);
2534                     if (ts->state & TS_DEAD) {
2535                         arg_life |= DEAD_ARG << i;
2536                     }
2537                     if (ts->state & TS_MEM) {
2538                         arg_life |= SYNC_ARG << i;
2539                     }
2540                     ts->state = TS_DEAD;
2541                     la_reset_pref(ts);
2542
2543                     /* Not used -- it will be tcg_target_call_oarg_regs[i].  */
2544                     op->output_pref[i] = 0;
2545                 }
2546
2547                 if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
2548                                     TCG_CALL_NO_READ_GLOBALS))) {
2549                     la_global_kill(s, nb_globals);
2550                 } else if (!(call_flags & TCG_CALL_NO_READ_GLOBALS)) {
2551                     la_global_sync(s, nb_globals);
2552                 }
2553
2554                 /* Record arguments that die in this helper.  */
2555                 for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
2556                     ts = arg_temp(op->args[i]);
2557                     if (ts && ts->state & TS_DEAD) {
2558                         arg_life |= DEAD_ARG << i;
2559                     }
2560                 }
2561
2562                 /* For all live registers, remove call-clobbered prefs.  */
2563                 la_cross_call(s, nb_temps);
2564
2565                 nb_call_regs = ARRAY_SIZE(tcg_target_call_iarg_regs);
2566
2567                 /* Input arguments are live for preceding opcodes.  */
2568                 for (i = 0; i < nb_iargs; i++) {
2569                     ts = arg_temp(op->args[i + nb_oargs]);
2570                     if (ts && ts->state & TS_DEAD) {
2571                         /* For those arguments that die, and will be allocated
2572                          * in registers, clear the register set for that arg,
2573                          * to be filled in below.  For args that will be on
2574                          * the stack, reset to any available reg.
2575                          */
2576                         *la_temp_pref(ts)
2577                             = (i < nb_call_regs ? 0 :
2578                                tcg_target_available_regs[ts->type]);
2579                         ts->state &= ~TS_DEAD;
2580                     }
2581                 }
2582
2583                 /* For each input argument, add its input register to prefs.
2584                    If a temp is used once, this produces a single set bit.  */
2585                 for (i = 0; i < MIN(nb_call_regs, nb_iargs); i++) {
2586                     ts = arg_temp(op->args[i + nb_oargs]);
2587                     if (ts) {
2588                         tcg_regset_set_reg(*la_temp_pref(ts),
2589                                            tcg_target_call_iarg_regs[i]);
2590                     }
2591                 }
2592             }
2593             break;
2594         case INDEX_op_insn_start:
2595             break;
2596         case INDEX_op_discard:
2597             /* mark the temporary as dead */
2598             ts = arg_temp(op->args[0]);
2599             ts->state = TS_DEAD;
2600             la_reset_pref(ts);
2601             break;
2602
2603         case INDEX_op_add2_i32:
2604             opc_new = INDEX_op_add_i32;
2605             goto do_addsub2;
2606         case INDEX_op_sub2_i32:
2607             opc_new = INDEX_op_sub_i32;
2608             goto do_addsub2;
2609         case INDEX_op_add2_i64:
2610             opc_new = INDEX_op_add_i64;
2611             goto do_addsub2;
2612         case INDEX_op_sub2_i64:
2613             opc_new = INDEX_op_sub_i64;
2614         do_addsub2:
2615             nb_iargs = 4;
2616             nb_oargs = 2;
2617             /* Test if the high part of the operation is dead, but not
2618                the low part.  The result can be optimized to a simple
2619                add or sub.  This happens often for x86_64 guest when the
2620                cpu mode is set to 32 bit.  */
2621             if (arg_temp(op->args[1])->state == TS_DEAD) {
2622                 if (arg_temp(op->args[0])->state == TS_DEAD) {
2623                     goto do_remove;
2624                 }
2625                 /* Replace the opcode and adjust the args in place,
2626                    leaving 3 unused args at the end.  */
2627                 op->opc = opc = opc_new;
2628                 op->args[1] = op->args[2];
2629                 op->args[2] = op->args[4];
2630                 /* Fall through and mark the single-word operation live.  */
2631                 nb_iargs = 2;
2632                 nb_oargs = 1;
2633             }
2634             goto do_not_remove;
2635
2636         case INDEX_op_mulu2_i32:
2637             opc_new = INDEX_op_mul_i32;
2638             opc_new2 = INDEX_op_muluh_i32;
2639             have_opc_new2 = TCG_TARGET_HAS_muluh_i32;
2640             goto do_mul2;
2641         case INDEX_op_muls2_i32:
2642             opc_new = INDEX_op_mul_i32;
2643             opc_new2 = INDEX_op_mulsh_i32;
2644             have_opc_new2 = TCG_TARGET_HAS_mulsh_i32;
2645             goto do_mul2;
2646         case INDEX_op_mulu2_i64:
2647             opc_new = INDEX_op_mul_i64;
2648             opc_new2 = INDEX_op_muluh_i64;
2649             have_opc_new2 = TCG_TARGET_HAS_muluh_i64;
2650             goto do_mul2;
2651         case INDEX_op_muls2_i64:
2652             opc_new = INDEX_op_mul_i64;
2653             opc_new2 = INDEX_op_mulsh_i64;
2654             have_opc_new2 = TCG_TARGET_HAS_mulsh_i64;
2655             goto do_mul2;
2656         do_mul2:
2657             nb_iargs = 2;
2658             nb_oargs = 2;
2659             if (arg_temp(op->args[1])->state == TS_DEAD) {
2660                 if (arg_temp(op->args[0])->state == TS_DEAD) {
2661                     /* Both parts of the operation are dead.  */
2662                     goto do_remove;
2663                 }
2664                 /* The high part of the operation is dead; generate the low. */
2665                 op->opc = opc = opc_new;
2666                 op->args[1] = op->args[2];
2667                 op->args[2] = op->args[3];
2668             } else if (arg_temp(op->args[0])->state == TS_DEAD && have_opc_new2) {
2669                 /* The low part of the operation is dead; generate the high. */
2670                 op->opc = opc = opc_new2;
2671                 op->args[0] = op->args[1];
2672                 op->args[1] = op->args[2];
2673                 op->args[2] = op->args[3];
2674             } else {
2675                 goto do_not_remove;
2676             }
2677             /* Mark the single-word operation live.  */
2678             nb_oargs = 1;
2679             goto do_not_remove;
2680
2681         default:
2682             /* XXX: optimize by hardcoding common cases (e.g. triadic ops) */
2683             nb_iargs = def->nb_iargs;
2684             nb_oargs = def->nb_oargs;
2685
2686             /* Test if the operation can be removed because all
2687                its outputs are dead. We assume that nb_oargs == 0
2688                implies side effects */
2689             if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs != 0) {
2690                 for (i = 0; i < nb_oargs; i++) {
2691                     if (arg_temp(op->args[i])->state != TS_DEAD) {
2692                         goto do_not_remove;
2693                     }
2694                 }
2695                 goto do_remove;
2696             }
2697             goto do_not_remove;
2698
2699         do_remove:
2700             tcg_op_remove(s, op);
2701             break;
2702
2703         do_not_remove:
2704             for (i = 0; i < nb_oargs; i++) {
2705                 ts = arg_temp(op->args[i]);
2706
2707                 /* Remember the preference of the uses that followed.  */
2708                 op->output_pref[i] = *la_temp_pref(ts);
2709
2710                 /* Output args are dead.  */
2711                 if (ts->state & TS_DEAD) {
2712                     arg_life |= DEAD_ARG << i;
2713                 }
2714                 if (ts->state & TS_MEM) {
2715                     arg_life |= SYNC_ARG << i;
2716                 }
2717                 ts->state = TS_DEAD;
2718                 la_reset_pref(ts);
2719             }
2720
2721             /* If end of basic block, update.  */
2722             if (def->flags & TCG_OPF_BB_EXIT) {
2723                 la_func_end(s, nb_globals, nb_temps);
2724             } else if (def->flags & TCG_OPF_BB_END) {
2725                 la_bb_end(s, nb_globals, nb_temps);
2726             } else if (def->flags & TCG_OPF_SIDE_EFFECTS) {
2727                 la_global_sync(s, nb_globals);
2728                 if (def->flags & TCG_OPF_CALL_CLOBBER) {
2729                     la_cross_call(s, nb_temps);
2730                 }
2731             }
2732
2733             /* Record arguments that die in this opcode.  */
2734             for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
2735                 ts = arg_temp(op->args[i]);
2736                 if (ts->state & TS_DEAD) {
2737                     arg_life |= DEAD_ARG << i;
2738                 }
2739             }
2740
2741             /* Input arguments are live for preceding opcodes.  */
2742             for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
2743                 ts = arg_temp(op->args[i]);
2744                 if (ts->state & TS_DEAD) {
2745                     /* For operands that were dead, initially allow
2746                        all regs for the type.  */
2747                     *la_temp_pref(ts) = tcg_target_available_regs[ts->type];
2748                     ts->state &= ~TS_DEAD;
2749                 }
2750             }
2751
2752             /* Incorporate constraints for this operand.  */
2753             switch (opc) {
2754             case INDEX_op_mov_i32:
2755             case INDEX_op_mov_i64:
2756                 /* Note that these are TCG_OPF_NOT_PRESENT and do not
2757                    have proper constraints.  That said, special case
2758                    moves to propagate preferences backward.  */
2759                 if (IS_DEAD_ARG(1)) {
2760                     *la_temp_pref(arg_temp(op->args[0]))
2761                         = *la_temp_pref(arg_temp(op->args[1]));
2762                 }
2763                 break;
2764
2765             default:
2766                 for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
2767                     const TCGArgConstraint *ct = &def->args_ct[i];
2768                     TCGRegSet set, *pset;
2769
2770                     ts = arg_temp(op->args[i]);
2771                     pset = la_temp_pref(ts);
2772                     set = *pset;
2773
2774                     set &= ct->u.regs;
2775                     if (ct->ct & TCG_CT_IALIAS) {
2776                         set &= op->output_pref[ct->alias_index];
2777                     }
2778                     /* If the combination is not possible, restart.  */
2779                     if (set == 0) {
2780                         set = ct->u.regs;
2781                     }
2782                     *pset = set;
2783                 }
2784                 break;
2785             }
2786             break;
2787         }
2788         op->life = arg_life;
2789     }
2790 }
2791
2792 /* Liveness analysis: Convert indirect regs to direct temporaries.  */
2793 static bool liveness_pass_2(TCGContext *s)
2794 {
2795     int nb_globals = s->nb_globals;
2796     int nb_temps, i;
2797     bool changes = false;
2798     TCGOp *op, *op_next;
2799
2800     /* Create a temporary for each indirect global.  */
2801     for (i = 0; i < nb_globals; ++i) {
2802         TCGTemp *its = &s->temps[i];
2803         if (its->indirect_reg) {
2804             TCGTemp *dts = tcg_temp_alloc(s);
2805             dts->type = its->type;
2806             dts->base_type = its->base_type;
2807             its->state_ptr = dts;
2808         } else {
2809             its->state_ptr = NULL;
2810         }
2811         /* All globals begin dead.  */
2812         its->state = TS_DEAD;
2813     }
2814     for (nb_temps = s->nb_temps; i < nb_temps; ++i) {
2815         TCGTemp *its = &s->temps[i];
2816         its->state_ptr = NULL;
2817         its->state = TS_DEAD;
2818     }
2819
2820     QTAILQ_FOREACH_SAFE(op, &s->ops, link, op_next) {
2821         TCGOpcode opc = op->opc;
2822         const TCGOpDef *def = &tcg_op_defs[opc];
2823         TCGLifeData arg_life = op->life;
2824         int nb_iargs, nb_oargs, call_flags;
2825         TCGTemp *arg_ts, *dir_ts;
2826
2827         if (opc == INDEX_op_call) {
2828             nb_oargs = TCGOP_CALLO(op);
2829             nb_iargs = TCGOP_CALLI(op);
2830             call_flags = op->args[nb_oargs + nb_iargs + 1];
2831         } else {
2832             nb_iargs = def->nb_iargs;
2833             nb_oargs = def->nb_oargs;
2834
2835             /* Set flags similar to how calls require.  */
2836             if (def->flags & TCG_OPF_BB_END) {
2837                 /* Like writing globals: save_globals */
2838                 call_flags = 0;
2839             } else if (def->flags & TCG_OPF_SIDE_EFFECTS) {
2840                 /* Like reading globals: sync_globals */
2841                 call_flags = TCG_CALL_NO_WRITE_GLOBALS;
2842             } else {
2843                 /* No effect on globals.  */
2844                 call_flags = (TCG_CALL_NO_READ_GLOBALS |
2845                               TCG_CALL_NO_WRITE_GLOBALS);
2846             }
2847         }
2848
2849         /* Make sure that input arguments are available.  */
2850         for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
2851             arg_ts = arg_temp(op->args[i]);
2852             if (arg_ts) {
2853                 dir_ts = arg_ts->state_ptr;
2854                 if (dir_ts && arg_ts->state == TS_DEAD) {
2855                     TCGOpcode lopc = (arg_ts->type == TCG_TYPE_I32
2856                                       ? INDEX_op_ld_i32
2857                                       : INDEX_op_ld_i64);
2858                     TCGOp *lop = tcg_op_insert_before(s, op, lopc);
2859
2860                     lop->args[0] = temp_arg(dir_ts);
2861                     lop->args[1] = temp_arg(arg_ts->mem_base);
2862                     lop->args[2] = arg_ts->mem_offset;
2863
2864                     /* Loaded, but synced with memory.  */
2865                     arg_ts->state = TS_MEM;
2866                 }
2867             }
2868         }
2869
2870         /* Perform input replacement, and mark inputs that became dead.
2871            No action is required except keeping temp_state up to date
2872            so that we reload when needed.  */
2873         for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
2874             arg_ts = arg_temp(op->args[i]);
2875             if (arg_ts) {
2876                 dir_ts = arg_ts->state_ptr;
2877                 if (dir_ts) {
2878                     op->args[i] = temp_arg(dir_ts);
2879                     changes = true;
2880                     if (IS_DEAD_ARG(i)) {
2881                         arg_ts->state = TS_DEAD;
2882                     }
2883                 }
2884             }
2885         }
2886
2887         /* Liveness analysis should ensure that the following are
2888            all correct, for call sites and basic block end points.  */
2889         if (call_flags & TCG_CALL_NO_READ_GLOBALS) {
2890             /* Nothing to do */
2891         } else if (call_flags & TCG_CALL_NO_WRITE_GLOBALS) {
2892             for (i = 0; i < nb_globals; ++i) {
2893                 /* Liveness should see that globals are synced back,
2894                    that is, either TS_DEAD or TS_MEM.  */
2895                 arg_ts = &s->temps[i];
2896                 tcg_debug_assert(arg_ts->state_ptr == 0
2897                                  || arg_ts->state != 0);
2898             }
2899         } else {
2900             for (i = 0; i < nb_globals; ++i) {
2901                 /* Liveness should see that globals are saved back,
2902                    that is, TS_DEAD, waiting to be reloaded.  */
2903                 arg_ts = &s->temps[i];
2904                 tcg_debug_assert(arg_ts->state_ptr == 0
2905                                  || arg_ts->state == TS_DEAD);
2906             }
2907         }
2908
2909         /* Outputs become available.  */
2910         for (i = 0; i < nb_oargs; i++) {
2911             arg_ts = arg_temp(op->args[i]);
2912             dir_ts = arg_ts->state_ptr;
2913             if (!dir_ts) {
2914                 continue;
2915             }
2916             op->args[i] = temp_arg(dir_ts);
2917             changes = true;
2918
2919             /* The output is now live and modified.  */
2920             arg_ts->state = 0;
2921
2922             /* Sync outputs upon their last write.  */
2923             if (NEED_SYNC_ARG(i)) {
2924                 TCGOpcode sopc = (arg_ts->type == TCG_TYPE_I32
2925                                   ? INDEX_op_st_i32
2926                                   : INDEX_op_st_i64);
2927                 TCGOp *sop = tcg_op_insert_after(s, op, sopc);
2928
2929                 sop->args[0] = temp_arg(dir_ts);
2930                 sop->args[1] = temp_arg(arg_ts->mem_base);
2931                 sop->args[2] = arg_ts->mem_offset;
2932
2933                 arg_ts->state = TS_MEM;
2934             }
2935             /* Drop outputs that are dead.  */
2936             if (IS_DEAD_ARG(i)) {
2937                 arg_ts->state = TS_DEAD;
2938             }
2939         }
2940     }
2941
2942     return changes;
2943 }
2944
2945 #ifdef CONFIG_DEBUG_TCG
2946 static void dump_regs(TCGContext *s)
2947 {
2948     TCGTemp *ts;
2949     int i;
2950     char buf[64];
2951
2952     for(i = 0; i < s->nb_temps; i++) {
2953         ts = &s->temps[i];
2954         printf("  %10s: ", tcg_get_arg_str_ptr(s, buf, sizeof(buf), ts));
2955         switch(ts->val_type) {
2956         case TEMP_VAL_REG:
2957             printf("%s", tcg_target_reg_names[ts->reg]);
2958             break;
2959         case TEMP_VAL_MEM:
2960             printf("%d(%s)", (int)ts->mem_offset,
2961                    tcg_target_reg_names[ts->mem_base->reg]);
2962             break;
2963         case TEMP_VAL_CONST:
2964             printf("$0x%" TCG_PRIlx, ts->val);
2965             break;
2966         case TEMP_VAL_DEAD:
2967             printf("D");
2968             break;
2969         default:
2970             printf("???");
2971             break;
2972         }
2973         printf("\n");
2974     }
2975
2976     for(i = 0; i < TCG_TARGET_NB_REGS; i++) {
2977         if (s->reg_to_temp[i] != NULL) {
2978             printf("%s: %s\n", 
2979                    tcg_target_reg_names[i], 
2980                    tcg_get_arg_str_ptr(s, buf, sizeof(buf), s->reg_to_temp[i]));
2981         }
2982     }
2983 }
2984
2985 static void check_regs(TCGContext *s)
2986 {
2987     int reg;
2988     int k;
2989     TCGTemp *ts;
2990     char buf[64];
2991
2992     for (reg = 0; reg < TCG_TARGET_NB_REGS; reg++) {
2993         ts = s->reg_to_temp[reg];
2994         if (ts != NULL) {
2995             if (ts->val_type != TEMP_VAL_REG || ts->reg != reg) {
2996                 printf("Inconsistency for register %s:\n", 
2997                        tcg_target_reg_names[reg]);
2998                 goto fail;
2999             }
3000         }
3001     }
3002     for (k = 0; k < s->nb_temps; k++) {
3003         ts = &s->temps[k];
3004         if (ts->val_type == TEMP_VAL_REG && !ts->fixed_reg
3005             && s->reg_to_temp[ts->reg] != ts) {
3006             printf("Inconsistency for temp %s:\n",
3007                    tcg_get_arg_str_ptr(s, buf, sizeof(buf), ts));
3008         fail:
3009             printf("reg state:\n");
3010             dump_regs(s);
3011             tcg_abort();
3012         }
3013     }
3014 }
3015 #endif
3016
3017 static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
3018 {
3019 #if !(defined(__sparc__) && TCG_TARGET_REG_BITS == 64)
3020     /* Sparc64 stack is accessed with offset of 2047 */
3021     s->current_frame_offset = (s->current_frame_offset +
3022                                (tcg_target_long)sizeof(tcg_target_long) - 1) &
3023         ~(sizeof(tcg_target_long) - 1);
3024 #endif
3025     if (s->current_frame_offset + (tcg_target_long)sizeof(tcg_target_long) >
3026         s->frame_end) {
3027         tcg_abort();
3028     }
3029     ts->mem_offset = s->current_frame_offset;
3030     ts->mem_base = s->frame_temp;
3031     ts->mem_allocated = 1;
3032     s->current_frame_offset += sizeof(tcg_target_long);
3033 }
3034
3035 static void temp_load(TCGContext *, TCGTemp *, TCGRegSet, TCGRegSet, TCGRegSet);
3036
3037 /* Mark a temporary as free or dead.  If 'free_or_dead' is negative,
3038    mark it free; otherwise mark it dead.  */
3039 static void temp_free_or_dead(TCGContext *s, TCGTemp *ts, int free_or_dead)
3040 {
3041     if (ts->fixed_reg) {
3042         return;
3043     }
3044     if (ts->val_type == TEMP_VAL_REG) {
3045         s->reg_to_temp[ts->reg] = NULL;
3046     }
3047     ts->val_type = (free_or_dead < 0
3048                     || ts->temp_local
3049                     || ts->temp_global
3050                     ? TEMP_VAL_MEM : TEMP_VAL_DEAD);
3051 }
3052
3053 /* Mark a temporary as dead.  */
3054 static inline void temp_dead(TCGContext *s, TCGTemp *ts)
3055 {
3056     temp_free_or_dead(s, ts, 1);
3057 }
3058
3059 /* Sync a temporary to memory. 'allocated_regs' is used in case a temporary
3060    registers needs to be allocated to store a constant.  If 'free_or_dead'
3061    is non-zero, subsequently release the temporary; if it is positive, the
3062    temp is dead; if it is negative, the temp is free.  */
3063 static void temp_sync(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs,
3064                       TCGRegSet preferred_regs, int free_or_dead)
3065 {
3066     if (ts->fixed_reg) {
3067         return;
3068     }
3069     if (!ts->mem_coherent) {
3070         if (!ts->mem_allocated) {
3071             temp_allocate_frame(s, ts);
3072         }
3073         switch (ts->val_type) {
3074         case TEMP_VAL_CONST:
3075             /* If we're going to free the temp immediately, then we won't
3076                require it later in a register, so attempt to store the
3077                constant to memory directly.  */
3078             if (free_or_dead
3079                 && tcg_out_sti(s, ts->type, ts->val,
3080                                ts->mem_base->reg, ts->mem_offset)) {
3081                 break;
3082             }
3083             temp_load(s, ts, tcg_target_available_regs[ts->type],
3084                       allocated_regs, preferred_regs);
3085             /* fallthrough */
3086
3087         case TEMP_VAL_REG:
3088             tcg_out_st(s, ts->type, ts->reg,
3089                        ts->mem_base->reg, ts->mem_offset);
3090             break;
3091
3092         case TEMP_VAL_MEM:
3093             break;
3094
3095         case TEMP_VAL_DEAD:
3096         default:
3097             tcg_abort();
3098         }
3099         ts->mem_coherent = 1;
3100     }
3101     if (free_or_dead) {
3102         temp_free_or_dead(s, ts, free_or_dead);
3103     }
3104 }
3105
3106 /* free register 'reg' by spilling the corresponding temporary if necessary */
3107 static void tcg_reg_free(TCGContext *s, TCGReg reg, TCGRegSet allocated_regs)
3108 {
3109     TCGTemp *ts = s->reg_to_temp[reg];
3110     if (ts != NULL) {
3111         temp_sync(s, ts, allocated_regs, 0, -1);
3112     }
3113 }
3114
3115 /**
3116  * tcg_reg_alloc:
3117  * @required_regs: Set of registers in which we must allocate.
3118  * @allocated_regs: Set of registers which must be avoided.
3119  * @preferred_regs: Set of registers we should prefer.
3120  * @rev: True if we search the registers in "indirect" order.
3121  *
3122  * The allocated register must be in @required_regs & ~@allocated_regs,
3123  * but if we can put it in @preferred_regs we may save a move later.
3124  */
3125 static TCGReg tcg_reg_alloc(TCGContext *s, TCGRegSet required_regs,
3126                             TCGRegSet allocated_regs,
3127                             TCGRegSet preferred_regs, bool rev)
3128 {
3129     int i, j, f, n = ARRAY_SIZE(tcg_target_reg_alloc_order);
3130     TCGRegSet reg_ct[2];
3131     const int *order;
3132
3133     reg_ct[1] = required_regs & ~allocated_regs;
3134     tcg_debug_assert(reg_ct[1] != 0);
3135     reg_ct[0] = reg_ct[1] & preferred_regs;
3136
3137     /* Skip the preferred_regs option if it cannot be satisfied,
3138        or if the preference made no difference.  */
3139     f = reg_ct[0] == 0 || reg_ct[0] == reg_ct[1];
3140
3141     order = rev ? indirect_reg_alloc_order : tcg_target_reg_alloc_order;
3142
3143     /* Try free registers, preferences first.  */
3144     for (j = f; j < 2; j++) {
3145         TCGRegSet set = reg_ct[j];
3146
3147         if (tcg_regset_single(set)) {
3148             /* One register in the set.  */
3149             TCGReg reg = tcg_regset_first(set);
3150             if (s->reg_to_temp[reg] == NULL) {
3151                 return reg;
3152             }
3153         } else {
3154             for (i = 0; i < n; i++) {
3155                 TCGReg reg = order[i];
3156                 if (s->reg_to_temp[reg] == NULL &&
3157                     tcg_regset_test_reg(set, reg)) {
3158                     return reg;
3159                 }
3160             }
3161         }
3162     }
3163
3164     /* We must spill something.  */
3165     for (j = f; j < 2; j++) {
3166         TCGRegSet set = reg_ct[j];
3167
3168         if (tcg_regset_single(set)) {
3169             /* One register in the set.  */
3170             TCGReg reg = tcg_regset_first(set);
3171             tcg_reg_free(s, reg, allocated_regs);
3172             return reg;
3173         } else {
3174             for (i = 0; i < n; i++) {
3175                 TCGReg reg = order[i];
3176                 if (tcg_regset_test_reg(set, reg)) {
3177                     tcg_reg_free(s, reg, allocated_regs);
3178                     return reg;
3179                 }
3180             }
3181         }
3182     }
3183
3184     tcg_abort();
3185 }
3186
3187 /* Make sure the temporary is in a register.  If needed, allocate the register
3188    from DESIRED while avoiding ALLOCATED.  */
3189 static void temp_load(TCGContext *s, TCGTemp *ts, TCGRegSet desired_regs,
3190                       TCGRegSet allocated_regs, TCGRegSet preferred_regs)
3191 {
3192     TCGReg reg;
3193
3194     switch (ts->val_type) {
3195     case TEMP_VAL_REG:
3196         return;
3197     case TEMP_VAL_CONST:
3198         reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
3199                             preferred_regs, ts->indirect_base);
3200         tcg_out_movi(s, ts->type, reg, ts->val);
3201         ts->mem_coherent = 0;
3202         break;
3203     case TEMP_VAL_MEM:
3204         reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
3205                             preferred_regs, ts->indirect_base);
3206         tcg_out_ld(s, ts->type, reg, ts->mem_base->reg, ts->mem_offset);
3207         ts->mem_coherent = 1;
3208         break;
3209     case TEMP_VAL_DEAD:
3210     default:
3211         tcg_abort();
3212     }
3213     ts->reg = reg;
3214     ts->val_type = TEMP_VAL_REG;
3215     s->reg_to_temp[reg] = ts;
3216 }
3217
3218 /* Save a temporary to memory. 'allocated_regs' is used in case a
3219    temporary registers needs to be allocated to store a constant.  */
3220 static void temp_save(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs)
3221 {
3222     /* The liveness analysis already ensures that globals are back
3223        in memory. Keep an tcg_debug_assert for safety. */
3224     tcg_debug_assert(ts->val_type == TEMP_VAL_MEM || ts->fixed_reg);
3225 }
3226
3227 /* save globals to their canonical location and assume they can be
3228    modified be the following code. 'allocated_regs' is used in case a
3229    temporary registers needs to be allocated to store a constant. */
3230 static void save_globals(TCGContext *s, TCGRegSet allocated_regs)
3231 {
3232     int i, n;
3233
3234     for (i = 0, n = s->nb_globals; i < n; i++) {
3235         temp_save(s, &s->temps[i], allocated_regs);
3236     }
3237 }
3238
3239 /* sync globals to their canonical location and assume they can be
3240    read by the following code. 'allocated_regs' is used in case a
3241    temporary registers needs to be allocated to store a constant. */
3242 static void sync_globals(TCGContext *s, TCGRegSet allocated_regs)
3243 {
3244     int i, n;
3245
3246     for (i = 0, n = s->nb_globals; i < n; i++) {
3247         TCGTemp *ts = &s->temps[i];
3248         tcg_debug_assert(ts->val_type != TEMP_VAL_REG
3249                          || ts->fixed_reg
3250                          || ts->mem_coherent);
3251     }
3252 }
3253
3254 /* at the end of a basic block, we assume all temporaries are dead and
3255    all globals are stored at their canonical location. */
3256 static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
3257 {
3258     int i;
3259
3260     for (i = s->nb_globals; i < s->nb_temps; i++) {
3261         TCGTemp *ts = &s->temps[i];
3262         if (ts->temp_local) {
3263             temp_save(s, ts, allocated_regs);
3264         } else {
3265             /* The liveness analysis already ensures that temps are dead.
3266                Keep an tcg_debug_assert for safety. */
3267             tcg_debug_assert(ts->val_type == TEMP_VAL_DEAD);
3268         }
3269     }
3270
3271     save_globals(s, allocated_regs);
3272 }
3273
3274 static void tcg_reg_alloc_do_movi(TCGContext *s, TCGTemp *ots,
3275                                   tcg_target_ulong val, TCGLifeData arg_life,
3276                                   TCGRegSet preferred_regs)
3277 {
3278     if (ots->fixed_reg) {
3279         /* For fixed registers, we do not do any constant propagation.  */
3280         tcg_out_movi(s, ots->type, ots->reg, val);
3281         return;
3282     }
3283
3284     /* The movi is not explicitly generated here.  */
3285     if (ots->val_type == TEMP_VAL_REG) {
3286         s->reg_to_temp[ots->reg] = NULL;
3287     }
3288     ots->val_type = TEMP_VAL_CONST;
3289     ots->val = val;
3290     ots->mem_coherent = 0;
3291     if (NEED_SYNC_ARG(0)) {
3292         temp_sync(s, ots, s->reserved_regs, preferred_regs, IS_DEAD_ARG(0));
3293     } else if (IS_DEAD_ARG(0)) {
3294         temp_dead(s, ots);
3295     }
3296 }
3297
3298 static void tcg_reg_alloc_movi(TCGContext *s, const TCGOp *op)
3299 {
3300     TCGTemp *ots = arg_temp(op->args[0]);
3301     tcg_target_ulong val = op->args[1];
3302
3303     tcg_reg_alloc_do_movi(s, ots, val, op->life, op->output_pref[0]);
3304 }
3305
3306 static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
3307 {
3308     const TCGLifeData arg_life = op->life;
3309     TCGRegSet allocated_regs, preferred_regs;
3310     TCGTemp *ts, *ots;
3311     TCGType otype, itype;
3312
3313     allocated_regs = s->reserved_regs;
3314     preferred_regs = op->output_pref[0];
3315     ots = arg_temp(op->args[0]);
3316     ts = arg_temp(op->args[1]);
3317
3318     /* Note that otype != itype for no-op truncation.  */
3319     otype = ots->type;
3320     itype = ts->type;
3321
3322     if (ts->val_type == TEMP_VAL_CONST) {
3323         /* propagate constant or generate sti */
3324         tcg_target_ulong val = ts->val;
3325         if (IS_DEAD_ARG(1)) {
3326             temp_dead(s, ts);
3327         }
3328         tcg_reg_alloc_do_movi(s, ots, val, arg_life, preferred_regs);
3329         return;
3330     }
3331
3332     /* If the source value is in memory we're going to be forced
3333        to have it in a register in order to perform the copy.  Copy
3334        the SOURCE value into its own register first, that way we
3335        don't have to reload SOURCE the next time it is used. */
3336     if (ts->val_type == TEMP_VAL_MEM) {
3337         temp_load(s, ts, tcg_target_available_regs[itype],
3338                   allocated_regs, preferred_regs);
3339     }
3340
3341     tcg_debug_assert(ts->val_type == TEMP_VAL_REG);
3342     if (IS_DEAD_ARG(0) && !ots->fixed_reg) {
3343         /* mov to a non-saved dead register makes no sense (even with
3344            liveness analysis disabled). */
3345         tcg_debug_assert(NEED_SYNC_ARG(0));
3346         if (!ots->mem_allocated) {
3347             temp_allocate_frame(s, ots);
3348         }
3349         tcg_out_st(s, otype, ts->reg, ots->mem_base->reg, ots->mem_offset);
3350         if (IS_DEAD_ARG(1)) {
3351             temp_dead(s, ts);
3352         }
3353         temp_dead(s, ots);
3354     } else {
3355         if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) {
3356             /* the mov can be suppressed */
3357             if (ots->val_type == TEMP_VAL_REG) {
3358                 s->reg_to_temp[ots->reg] = NULL;
3359             }
3360             ots->reg = ts->reg;
3361             temp_dead(s, ts);
3362         } else {
3363             if (ots->val_type != TEMP_VAL_REG) {
3364                 /* When allocating a new register, make sure to not spill the
3365                    input one. */
3366                 tcg_regset_set_reg(allocated_regs, ts->reg);
3367                 ots->reg = tcg_reg_alloc(s, tcg_target_available_regs[otype],
3368                                          allocated_regs, preferred_regs,
3369                                          ots->indirect_base);
3370             }
3371             tcg_out_mov(s, otype, ots->reg, ts->reg);
3372         }
3373         ots->val_type = TEMP_VAL_REG;
3374         ots->mem_coherent = 0;
3375         s->reg_to_temp[ots->reg] = ots;
3376         if (NEED_SYNC_ARG(0)) {
3377             temp_sync(s, ots, allocated_regs, 0, 0);
3378         }
3379     }
3380 }
3381
3382 static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
3383 {
3384     const TCGLifeData arg_life = op->life;
3385     const TCGOpDef * const def = &tcg_op_defs[op->opc];
3386     TCGRegSet i_allocated_regs;
3387     TCGRegSet o_allocated_regs;
3388     int i, k, nb_iargs, nb_oargs;
3389     TCGReg reg;
3390     TCGArg arg;
3391     const TCGArgConstraint *arg_ct;
3392     TCGTemp *ts;
3393     TCGArg new_args[TCG_MAX_OP_ARGS];
3394     int const_args[TCG_MAX_OP_ARGS];
3395
3396     nb_oargs = def->nb_oargs;
3397     nb_iargs = def->nb_iargs;
3398
3399     /* copy constants */
3400     memcpy(new_args + nb_oargs + nb_iargs, 
3401            op->args + nb_oargs + nb_iargs,
3402            sizeof(TCGArg) * def->nb_cargs);
3403
3404     i_allocated_regs = s->reserved_regs;
3405     o_allocated_regs = s->reserved_regs;
3406
3407     /* satisfy input constraints */ 
3408     for (k = 0; k < nb_iargs; k++) {
3409         TCGRegSet i_preferred_regs, o_preferred_regs;
3410
3411         i = def->sorted_args[nb_oargs + k];
3412         arg = op->args[i];
3413         arg_ct = &def->args_ct[i];
3414         ts = arg_temp(arg);
3415
3416         if (ts->val_type == TEMP_VAL_CONST
3417             && tcg_target_const_match(ts->val, ts->type, arg_ct)) {
3418             /* constant is OK for instruction */
3419             const_args[i] = 1;
3420             new_args[i] = ts->val;
3421             continue;
3422         }
3423
3424         i_preferred_regs = o_preferred_regs = 0;
3425         if (arg_ct->ct & TCG_CT_IALIAS) {
3426             o_preferred_regs = op->output_pref[arg_ct->alias_index];
3427             if (ts->fixed_reg) {
3428                 /* if fixed register, we must allocate a new register
3429                    if the alias is not the same register */
3430                 if (arg != op->args[arg_ct->alias_index]) {
3431                     goto allocate_in_reg;
3432                 }
3433             } else {
3434                 /* if the input is aliased to an output and if it is
3435                    not dead after the instruction, we must allocate
3436                    a new register and move it */
3437                 if (!IS_DEAD_ARG(i)) {
3438                     goto allocate_in_reg;
3439                 }
3440
3441                 /* check if the current register has already been allocated
3442                    for another input aliased to an output */
3443                 if (ts->val_type == TEMP_VAL_REG) {
3444                     int k2, i2;
3445                     reg = ts->reg;
3446                     for (k2 = 0 ; k2 < k ; k2++) {
3447                         i2 = def->sorted_args[nb_oargs + k2];
3448                         if ((def->args_ct[i2].ct & TCG_CT_IALIAS) &&
3449                             reg == new_args[i2]) {
3450                             goto allocate_in_reg;
3451                         }
3452                     }
3453                 }
3454                 i_preferred_regs = o_preferred_regs;
3455             }
3456         }
3457
3458         temp_load(s, ts, arg_ct->u.regs, i_allocated_regs, i_preferred_regs);
3459         reg = ts->reg;
3460
3461         if (tcg_regset_test_reg(arg_ct->u.regs, reg)) {
3462             /* nothing to do : the constraint is satisfied */
3463         } else {
3464         allocate_in_reg:
3465             /* allocate a new register matching the constraint 
3466                and move the temporary register into it */
3467             temp_load(s, ts, tcg_target_available_regs[ts->type],
3468                       i_allocated_regs, 0);
3469             reg = tcg_reg_alloc(s, arg_ct->u.regs, i_allocated_regs,
3470                                 o_preferred_regs, ts->indirect_base);
3471             tcg_out_mov(s, ts->type, reg, ts->reg);
3472         }
3473         new_args[i] = reg;
3474         const_args[i] = 0;
3475         tcg_regset_set_reg(i_allocated_regs, reg);
3476     }
3477     
3478     /* mark dead temporaries and free the associated registers */
3479     for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
3480         if (IS_DEAD_ARG(i)) {
3481             temp_dead(s, arg_temp(op->args[i]));
3482         }
3483     }
3484
3485     if (def->flags & TCG_OPF_BB_END) {
3486         tcg_reg_alloc_bb_end(s, i_allocated_regs);
3487     } else {
3488         if (def->flags & TCG_OPF_CALL_CLOBBER) {
3489             /* XXX: permit generic clobber register list ? */ 
3490             for (i = 0; i < TCG_TARGET_NB_REGS; i++) {
3491                 if (tcg_regset_test_reg(tcg_target_call_clobber_regs, i)) {
3492                     tcg_reg_free(s, i, i_allocated_regs);
3493                 }
3494             }
3495         }
3496         if (def->flags & TCG_OPF_SIDE_EFFECTS) {
3497             /* sync globals if the op has side effects and might trigger
3498                an exception. */
3499             sync_globals(s, i_allocated_regs);
3500         }
3501         
3502         /* satisfy the output constraints */
3503         for(k = 0; k < nb_oargs; k++) {
3504             i = def->sorted_args[k];
3505             arg = op->args[i];
3506             arg_ct = &def->args_ct[i];
3507             ts = arg_temp(arg);
3508             if ((arg_ct->ct & TCG_CT_ALIAS)
3509                 && !const_args[arg_ct->alias_index]) {
3510                 reg = new_args[arg_ct->alias_index];
3511             } else if (arg_ct->ct & TCG_CT_NEWREG) {
3512                 reg = tcg_reg_alloc(s, arg_ct->u.regs,
3513                                     i_allocated_regs | o_allocated_regs,
3514                                     op->output_pref[k], ts->indirect_base);
3515             } else {
3516                 /* if fixed register, we try to use it */
3517                 reg = ts->reg;
3518                 if (ts->fixed_reg &&
3519                     tcg_regset_test_reg(arg_ct->u.regs, reg)) {
3520                     goto oarg_end;
3521                 }
3522                 reg = tcg_reg_alloc(s, arg_ct->u.regs, o_allocated_regs,
3523                                     op->output_pref[k], ts->indirect_base);
3524             }
3525             tcg_regset_set_reg(o_allocated_regs, reg);
3526             /* if a fixed register is used, then a move will be done afterwards */
3527             if (!ts->fixed_reg) {
3528                 if (ts->val_type == TEMP_VAL_REG) {
3529                     s->reg_to_temp[ts->reg] = NULL;
3530                 }
3531                 ts->val_type = TEMP_VAL_REG;
3532                 ts->reg = reg;
3533                 /* temp value is modified, so the value kept in memory is
3534                    potentially not the same */
3535                 ts->mem_coherent = 0;
3536                 s->reg_to_temp[reg] = ts;
3537             }
3538         oarg_end:
3539             new_args[i] = reg;
3540         }
3541     }
3542
3543     /* emit instruction */
3544     if (def->flags & TCG_OPF_VECTOR) {
3545         tcg_out_vec_op(s, op->opc, TCGOP_VECL(op), TCGOP_VECE(op),
3546                        new_args, const_args);
3547     } else {
3548         tcg_out_op(s, op->opc, new_args, const_args);
3549     }
3550
3551     /* move the outputs in the correct register if needed */
3552     for(i = 0; i < nb_oargs; i++) {
3553         ts = arg_temp(op->args[i]);
3554         reg = new_args[i];
3555         if (ts->fixed_reg && ts->reg != reg) {
3556             tcg_out_mov(s, ts->type, ts->reg, reg);
3557         }
3558         if (NEED_SYNC_ARG(i)) {
3559             temp_sync(s, ts, o_allocated_regs, 0, IS_DEAD_ARG(i));
3560         } else if (IS_DEAD_ARG(i)) {
3561             temp_dead(s, ts);
3562         }
3563     }
3564 }
3565
3566 #ifdef TCG_TARGET_STACK_GROWSUP
3567 #define STACK_DIR(x) (-(x))
3568 #else
3569 #define STACK_DIR(x) (x)
3570 #endif
3571
3572 static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
3573 {
3574     const int nb_oargs = TCGOP_CALLO(op);
3575     const int nb_iargs = TCGOP_CALLI(op);
3576     const TCGLifeData arg_life = op->life;
3577     int flags, nb_regs, i;
3578     TCGReg reg;
3579     TCGArg arg;
3580     TCGTemp *ts;
3581     intptr_t stack_offset;
3582     size_t call_stack_size;
3583     tcg_insn_unit *func_addr;
3584     int allocate_args;
3585     TCGRegSet allocated_regs;
3586
3587     func_addr = (tcg_insn_unit *)(intptr_t)op->args[nb_oargs + nb_iargs];
3588     flags = op->args[nb_oargs + nb_iargs + 1];
3589
3590     nb_regs = ARRAY_SIZE(tcg_target_call_iarg_regs);
3591     if (nb_regs > nb_iargs) {
3592         nb_regs = nb_iargs;
3593     }
3594
3595     /* assign stack slots first */
3596     call_stack_size = (nb_iargs - nb_regs) * sizeof(tcg_target_long);
3597     call_stack_size = (call_stack_size + TCG_TARGET_STACK_ALIGN - 1) & 
3598         ~(TCG_TARGET_STACK_ALIGN - 1);
3599     allocate_args = (call_stack_size > TCG_STATIC_CALL_ARGS_SIZE);
3600     if (allocate_args) {
3601         /* XXX: if more than TCG_STATIC_CALL_ARGS_SIZE is needed,
3602            preallocate call stack */
3603         tcg_abort();
3604     }
3605
3606     stack_offset = TCG_TARGET_CALL_STACK_OFFSET;
3607     for (i = nb_regs; i < nb_iargs; i++) {
3608         arg = op->args[nb_oargs + i];
3609 #ifdef TCG_TARGET_STACK_GROWSUP
3610         stack_offset -= sizeof(tcg_target_long);
3611 #endif
3612         if (arg != TCG_CALL_DUMMY_ARG) {
3613             ts = arg_temp(arg);
3614             temp_load(s, ts, tcg_target_available_regs[ts->type],
3615                       s->reserved_regs, 0);
3616             tcg_out_st(s, ts->type, ts->reg, TCG_REG_CALL_STACK, stack_offset);
3617         }
3618 #ifndef TCG_TARGET_STACK_GROWSUP
3619         stack_offset += sizeof(tcg_target_long);
3620 #endif
3621     }
3622     
3623     /* assign input registers */
3624     allocated_regs = s->reserved_regs;
3625     for (i = 0; i < nb_regs; i++) {
3626         arg = op->args[nb_oargs + i];
3627         if (arg != TCG_CALL_DUMMY_ARG) {
3628             ts = arg_temp(arg);
3629             reg = tcg_target_call_iarg_regs[i];
3630
3631             if (ts->val_type == TEMP_VAL_REG) {
3632                 if (ts->reg != reg) {
3633                     tcg_reg_free(s, reg, allocated_regs);
3634                     tcg_out_mov(s, ts->type, reg, ts->reg);
3635                 }
3636             } else {
3637                 TCGRegSet arg_set = 0;
3638
3639                 tcg_reg_free(s, reg, allocated_regs);
3640                 tcg_regset_set_reg(arg_set, reg);
3641                 temp_load(s, ts, arg_set, allocated_regs, 0);
3642             }
3643
3644             tcg_regset_set_reg(allocated_regs, reg);
3645         }
3646     }
3647     
3648     /* mark dead temporaries and free the associated registers */
3649     for (i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
3650         if (IS_DEAD_ARG(i)) {
3651             temp_dead(s, arg_temp(op->args[i]));
3652         }
3653     }
3654     
3655     /* clobber call registers */
3656     for (i = 0; i < TCG_TARGET_NB_REGS; i++) {
3657         if (tcg_regset_test_reg(tcg_target_call_clobber_regs, i)) {
3658             tcg_reg_free(s, i, allocated_regs);
3659         }
3660     }
3661
3662     /* Save globals if they might be written by the helper, sync them if
3663        they might be read. */
3664     if (flags & TCG_CALL_NO_READ_GLOBALS) {
3665         /* Nothing to do */
3666     } else if (flags & TCG_CALL_NO_WRITE_GLOBALS) {
3667         sync_globals(s, allocated_regs);
3668     } else {
3669         save_globals(s, allocated_regs);
3670     }
3671
3672     tcg_out_call(s, func_addr);
3673
3674     /* assign output registers and emit moves if needed */
3675     for(i = 0; i < nb_oargs; i++) {
3676         arg = op->args[i];
3677         ts = arg_temp(arg);
3678         reg = tcg_target_call_oarg_regs[i];
3679         tcg_debug_assert(s->reg_to_temp[reg] == NULL);
3680
3681         if (ts->fixed_reg) {
3682             if (ts->reg != reg) {
3683                 tcg_out_mov(s, ts->type, ts->reg, reg);
3684             }
3685         } else {
3686             if (ts->val_type == TEMP_VAL_REG) {
3687                 s->reg_to_temp[ts->reg] = NULL;
3688             }
3689             ts->val_type = TEMP_VAL_REG;
3690             ts->reg = reg;
3691             ts->mem_coherent = 0;
3692             s->reg_to_temp[reg] = ts;
3693             if (NEED_SYNC_ARG(i)) {
3694                 temp_sync(s, ts, allocated_regs, 0, IS_DEAD_ARG(i));
3695             } else if (IS_DEAD_ARG(i)) {
3696                 temp_dead(s, ts);
3697             }
3698         }
3699     }
3700 }
3701
3702 #ifdef CONFIG_PROFILER
3703
3704 /* avoid copy/paste errors */
3705 #define PROF_ADD(to, from, field)                       \
3706     do {                                                \
3707         (to)->field += atomic_read(&((from)->field));   \
3708     } while (0)
3709
3710 #define PROF_MAX(to, from, field)                                       \
3711     do {                                                                \
3712         typeof((from)->field) val__ = atomic_read(&((from)->field));    \
3713         if (val__ > (to)->field) {                                      \
3714             (to)->field = val__;                                        \
3715         }                                                               \
3716     } while (0)
3717
3718 /* Pass in a zero'ed @prof */
3719 static inline
3720 void tcg_profile_snapshot(TCGProfile *prof, bool counters, bool table)
3721 {
3722     unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
3723     unsigned int i;
3724
3725     for (i = 0; i < n_ctxs; i++) {
3726         TCGContext *s = atomic_read(&tcg_ctxs[i]);
3727         const TCGProfile *orig = &s->prof;
3728
3729         if (counters) {
3730             PROF_ADD(prof, orig, cpu_exec_time);
3731             PROF_ADD(prof, orig, tb_count1);
3732             PROF_ADD(prof, orig, tb_count);
3733             PROF_ADD(prof, orig, op_count);
3734             PROF_MAX(prof, orig, op_count_max);
3735             PROF_ADD(prof, orig, temp_count);
3736             PROF_MAX(prof, orig, temp_count_max);
3737             PROF_ADD(prof, orig, del_op_count);
3738             PROF_ADD(prof, orig, code_in_len);
3739             PROF_ADD(prof, orig, code_out_len);
3740             PROF_ADD(prof, orig, search_out_len);
3741             PROF_ADD(prof, orig, interm_time);
3742             PROF_ADD(prof, orig, code_time);
3743             PROF_ADD(prof, orig, la_time);
3744             PROF_ADD(prof, orig, opt_time);
3745             PROF_ADD(prof, orig, restore_count);
3746             PROF_ADD(prof, orig, restore_time);
3747         }
3748         if (table) {
3749             int i;
3750
3751             for (i = 0; i < NB_OPS; i++) {
3752                 PROF_ADD(prof, orig, table_op_count[i]);
3753             }
3754         }
3755     }
3756 }
3757
3758 #undef PROF_ADD
3759 #undef PROF_MAX
3760
3761 static void tcg_profile_snapshot_counters(TCGProfile *prof)
3762 {
3763     tcg_profile_snapshot(prof, true, false);
3764 }
3765
3766 static void tcg_profile_snapshot_table(TCGProfile *prof)
3767 {
3768     tcg_profile_snapshot(prof, false, true);
3769 }
3770
3771 void tcg_dump_op_count(FILE *f, fprintf_function cpu_fprintf)
3772 {
3773     TCGProfile prof = {};
3774     int i;
3775
3776     tcg_profile_snapshot_table(&prof);
3777     for (i = 0; i < NB_OPS; i++) {
3778         cpu_fprintf(f, "%s %" PRId64 "\n", tcg_op_defs[i].name,
3779                     prof.table_op_count[i]);
3780     }
3781 }
3782
3783 int64_t tcg_cpu_exec_time(void)
3784 {
3785     unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
3786     unsigned int i;
3787     int64_t ret = 0;
3788
3789     for (i = 0; i < n_ctxs; i++) {
3790         const TCGContext *s = atomic_read(&tcg_ctxs[i]);
3791         const TCGProfile *prof = &s->prof;
3792
3793         ret += atomic_read(&prof->cpu_exec_time);
3794     }
3795     return ret;
3796 }
3797 #else
3798 void tcg_dump_op_count(FILE *f, fprintf_function cpu_fprintf)
3799 {
3800     cpu_fprintf(f, "[TCG profiler not compiled]\n");
3801 }
3802
3803 int64_t tcg_cpu_exec_time(void)
3804 {
3805     error_report("%s: TCG profiler not compiled", __func__);
3806     exit(EXIT_FAILURE);
3807 }
3808 #endif
3809
3810
3811 int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
3812 {
3813 #ifdef CONFIG_PROFILER
3814     TCGProfile *prof = &s->prof;
3815 #endif
3816     int i, num_insns;
3817     TCGOp *op;
3818
3819 #ifdef CONFIG_PROFILER
3820     {
3821         int n = 0;
3822
3823         QTAILQ_FOREACH(op, &s->ops, link) {
3824             n++;
3825         }
3826         atomic_set(&prof->op_count, prof->op_count + n);
3827         if (n > prof->op_count_max) {
3828             atomic_set(&prof->op_count_max, n);
3829         }
3830
3831         n = s->nb_temps;
3832         atomic_set(&prof->temp_count, prof->temp_count + n);
3833         if (n > prof->temp_count_max) {
3834             atomic_set(&prof->temp_count_max, n);
3835         }
3836     }
3837 #endif
3838
3839 #ifdef DEBUG_DISAS
3840     if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP)
3841                  && qemu_log_in_addr_range(tb->pc))) {
3842         qemu_log_lock();
3843         qemu_log("OP:\n");
3844         tcg_dump_ops(s, false);
3845         qemu_log("\n");
3846         qemu_log_unlock();
3847     }
3848 #endif
3849
3850 #ifdef CONFIG_DEBUG_TCG
3851     /* Ensure all labels referenced have been emitted.  */
3852     {
3853         TCGLabel *l;
3854         bool error = false;
3855
3856         QSIMPLEQ_FOREACH(l, &s->labels, next) {
3857             if (unlikely(!l->present) && l->refs) {
3858                 qemu_log_mask(CPU_LOG_TB_OP,
3859                               "$L%d referenced but not present.\n", l->id);
3860                 error = true;
3861             }
3862         }
3863         assert(!error);
3864     }
3865 #endif
3866
3867 #ifdef CONFIG_PROFILER
3868     atomic_set(&prof->opt_time, prof->opt_time - profile_getclock());
3869 #endif
3870
3871 #ifdef USE_TCG_OPTIMIZATIONS
3872     tcg_optimize(s);
3873 #endif
3874
3875 #ifdef CONFIG_PROFILER
3876     atomic_set(&prof->opt_time, prof->opt_time + profile_getclock());
3877     atomic_set(&prof->la_time, prof->la_time - profile_getclock());
3878 #endif
3879
3880     reachable_code_pass(s);
3881     liveness_pass_1(s);
3882
3883     if (s->nb_indirects > 0) {
3884 #ifdef DEBUG_DISAS
3885         if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_IND)
3886                      && qemu_log_in_addr_range(tb->pc))) {
3887             qemu_log_lock();
3888             qemu_log("OP before indirect lowering:\n");
3889             tcg_dump_ops(s, false);
3890             qemu_log("\n");
3891             qemu_log_unlock();
3892         }
3893 #endif
3894         /* Replace indirect temps with direct temps.  */
3895         if (liveness_pass_2(s)) {
3896             /* If changes were made, re-run liveness.  */
3897             liveness_pass_1(s);
3898         }
3899     }
3900
3901 #ifdef CONFIG_PROFILER
3902     atomic_set(&prof->la_time, prof->la_time + profile_getclock());
3903 #endif
3904
3905 #ifdef DEBUG_DISAS
3906     if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_OPT)
3907                  && qemu_log_in_addr_range(tb->pc))) {
3908         qemu_log_lock();
3909         qemu_log("OP after optimization and liveness analysis:\n");
3910         tcg_dump_ops(s, true);
3911         qemu_log("\n");
3912         qemu_log_unlock();
3913     }
3914 #endif
3915
3916     tcg_reg_alloc_start(s);
3917
3918     s->code_buf = tb->tc.ptr;
3919     s->code_ptr = tb->tc.ptr;
3920
3921 #ifdef TCG_TARGET_NEED_LDST_LABELS
3922     QSIMPLEQ_INIT(&s->ldst_labels);
3923 #endif
3924 #ifdef TCG_TARGET_NEED_POOL_LABELS
3925     s->pool_labels = NULL;
3926 #endif
3927
3928     num_insns = -1;
3929     QTAILQ_FOREACH(op, &s->ops, link) {
3930         TCGOpcode opc = op->opc;
3931
3932 #ifdef CONFIG_PROFILER
3933         atomic_set(&prof->table_op_count[opc], prof->table_op_count[opc] + 1);
3934 #endif
3935
3936         switch (opc) {
3937         case INDEX_op_mov_i32:
3938         case INDEX_op_mov_i64:
3939         case INDEX_op_mov_vec:
3940             tcg_reg_alloc_mov(s, op);
3941             break;
3942         case INDEX_op_movi_i32:
3943         case INDEX_op_movi_i64:
3944         case INDEX_op_dupi_vec:
3945             tcg_reg_alloc_movi(s, op);
3946             break;
3947         case INDEX_op_insn_start:
3948             if (num_insns >= 0) {
3949                 size_t off = tcg_current_code_size(s);
3950                 s->gen_insn_end_off[num_insns] = off;
3951                 /* Assert that we do not overflow our stored offset.  */
3952                 assert(s->gen_insn_end_off[num_insns] == off);
3953             }
3954             num_insns++;
3955             for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
3956                 target_ulong a;
3957 #if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
3958                 a = deposit64(op->args[i * 2], 32, 32, op->args[i * 2 + 1]);
3959 #else
3960                 a = op->args[i];
3961 #endif
3962                 s->gen_insn_data[num_insns][i] = a;
3963             }
3964             break;
3965         case INDEX_op_discard:
3966             temp_dead(s, arg_temp(op->args[0]));
3967             break;
3968         case INDEX_op_set_label:
3969             tcg_reg_alloc_bb_end(s, s->reserved_regs);
3970             tcg_out_label(s, arg_label(op->args[0]), s->code_ptr);
3971             break;
3972         case INDEX_op_call:
3973             tcg_reg_alloc_call(s, op);
3974             break;
3975         default:
3976             /* Sanity check that we've not introduced any unhandled opcodes. */
3977             tcg_debug_assert(tcg_op_supported(opc));
3978             /* Note: in order to speed up the code, it would be much
3979                faster to have specialized register allocator functions for
3980                some common argument patterns */
3981             tcg_reg_alloc_op(s, op);
3982             break;
3983         }
3984 #ifdef CONFIG_DEBUG_TCG
3985         check_regs(s);
3986 #endif
3987         /* Test for (pending) buffer overflow.  The assumption is that any
3988            one operation beginning below the high water mark cannot overrun
3989            the buffer completely.  Thus we can test for overflow after
3990            generating code without having to check during generation.  */
3991         if (unlikely((void *)s->code_ptr > s->code_gen_highwater)) {
3992             return -1;
3993         }
3994     }
3995     tcg_debug_assert(num_insns >= 0);
3996     s->gen_insn_end_off[num_insns] = tcg_current_code_size(s);
3997
3998     /* Generate TB finalization at the end of block */
3999 #ifdef TCG_TARGET_NEED_LDST_LABELS
4000     if (!tcg_out_ldst_finalize(s)) {
4001         return -1;
4002     }
4003 #endif
4004 #ifdef TCG_TARGET_NEED_POOL_LABELS
4005     if (!tcg_out_pool_finalize(s)) {
4006         return -1;
4007     }
4008 #endif
4009
4010     /* flush instruction cache */
4011     flush_icache_range((uintptr_t)s->code_buf, (uintptr_t)s->code_ptr);
4012
4013     return tcg_current_code_size(s);
4014 }
4015
4016 #ifdef CONFIG_PROFILER
4017 void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf)
4018 {
4019     TCGProfile prof = {};
4020     const TCGProfile *s;
4021     int64_t tb_count;
4022     int64_t tb_div_count;
4023     int64_t tot;
4024
4025     tcg_profile_snapshot_counters(&prof);
4026     s = &prof;
4027     tb_count = s->tb_count;
4028     tb_div_count = tb_count ? tb_count : 1;
4029     tot = s->interm_time + s->code_time;
4030
4031     cpu_fprintf(f, "JIT cycles          %" PRId64 " (%0.3f s at 2.4 GHz)\n",
4032                 tot, tot / 2.4e9);
4033     cpu_fprintf(f, "translated TBs      %" PRId64 " (aborted=%" PRId64 " %0.1f%%)\n", 
4034                 tb_count, s->tb_count1 - tb_count,
4035                 (double)(s->tb_count1 - s->tb_count)
4036                 / (s->tb_count1 ? s->tb_count1 : 1) * 100.0);
4037     cpu_fprintf(f, "avg ops/TB          %0.1f max=%d\n", 
4038                 (double)s->op_count / tb_div_count, s->op_count_max);
4039     cpu_fprintf(f, "deleted ops/TB      %0.2f\n",
4040                 (double)s->del_op_count / tb_div_count);
4041     cpu_fprintf(f, "avg temps/TB        %0.2f max=%d\n",
4042                 (double)s->temp_count / tb_div_count, s->temp_count_max);
4043     cpu_fprintf(f, "avg host code/TB    %0.1f\n",
4044                 (double)s->code_out_len / tb_div_count);
4045     cpu_fprintf(f, "avg search data/TB  %0.1f\n",
4046                 (double)s->search_out_len / tb_div_count);
4047     
4048     cpu_fprintf(f, "cycles/op           %0.1f\n", 
4049                 s->op_count ? (double)tot / s->op_count : 0);
4050     cpu_fprintf(f, "cycles/in byte      %0.1f\n", 
4051                 s->code_in_len ? (double)tot / s->code_in_len : 0);
4052     cpu_fprintf(f, "cycles/out byte     %0.1f\n", 
4053                 s->code_out_len ? (double)tot / s->code_out_len : 0);
4054     cpu_fprintf(f, "cycles/search byte     %0.1f\n",
4055                 s->search_out_len ? (double)tot / s->search_out_len : 0);
4056     if (tot == 0) {
4057         tot = 1;
4058     }
4059     cpu_fprintf(f, "  gen_interm time   %0.1f%%\n", 
4060                 (double)s->interm_time / tot * 100.0);
4061     cpu_fprintf(f, "  gen_code time     %0.1f%%\n", 
4062                 (double)s->code_time / tot * 100.0);
4063     cpu_fprintf(f, "optim./code time    %0.1f%%\n",
4064                 (double)s->opt_time / (s->code_time ? s->code_time : 1)
4065                 * 100.0);
4066     cpu_fprintf(f, "liveness/code time  %0.1f%%\n", 
4067                 (double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0);
4068     cpu_fprintf(f, "cpu_restore count   %" PRId64 "\n",
4069                 s->restore_count);
4070     cpu_fprintf(f, "  avg cycles        %0.1f\n",
4071                 s->restore_count ? (double)s->restore_time / s->restore_count : 0);
4072 }
4073 #else
4074 void tcg_dump_info(FILE *f, fprintf_function cpu_fprintf)
4075 {
4076     cpu_fprintf(f, "[TCG profiler not compiled]\n");
4077 }
4078 #endif
4079
4080 #ifdef ELF_HOST_MACHINE
4081 /* In order to use this feature, the backend needs to do three things:
4082
4083    (1) Define ELF_HOST_MACHINE to indicate both what value to
4084        put into the ELF image and to indicate support for the feature.
4085
4086    (2) Define tcg_register_jit.  This should create a buffer containing
4087        the contents of a .debug_frame section that describes the post-
4088        prologue unwind info for the tcg machine.
4089
4090    (3) Call tcg_register_jit_int, with the constructed .debug_frame.
4091 */
4092
4093 /* Begin GDB interface.  THE FOLLOWING MUST MATCH GDB DOCS.  */
4094 typedef enum {
4095     JIT_NOACTION = 0,
4096     JIT_REGISTER_FN,
4097     JIT_UNREGISTER_FN
4098 } jit_actions_t;
4099
4100 struct jit_code_entry {
4101     struct jit_code_entry *next_entry;
4102     struct jit_code_entry *prev_entry;
4103     const void *symfile_addr;
4104     uint64_t symfile_size;
4105 };
4106
4107 struct jit_descriptor {
4108     uint32_t version;
4109     uint32_t action_flag;
4110     struct jit_code_entry *relevant_entry;
4111     struct jit_code_entry *first_entry;
4112 };
4113
4114 void __jit_debug_register_code(void) __attribute__((noinline));
4115 void __jit_debug_register_code(void)
4116 {
4117     asm("");
4118 }
4119
4120 /* Must statically initialize the version, because GDB may check
4121    the version before we can set it.  */
4122 struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 };
4123
4124 /* End GDB interface.  */
4125
4126 static int find_string(const char *strtab, const char *str)
4127 {
4128     const char *p = strtab + 1;
4129
4130     while (1) {
4131         if (strcmp(p, str) == 0) {
4132             return p - strtab;
4133         }
4134         p += strlen(p) + 1;
4135     }
4136 }
4137
4138 static void tcg_register_jit_int(void *buf_ptr, size_t buf_size,
4139                                  const void *debug_frame,
4140                                  size_t debug_frame_size)
4141 {
4142     struct __attribute__((packed)) DebugInfo {
4143         uint32_t  len;
4144         uint16_t  version;
4145         uint32_t  abbrev;
4146         uint8_t   ptr_size;
4147         uint8_t   cu_die;
4148         uint16_t  cu_lang;
4149         uintptr_t cu_low_pc;
4150         uintptr_t cu_high_pc;
4151         uint8_t   fn_die;
4152         char      fn_name[16];
4153         uintptr_t fn_low_pc;
4154         uintptr_t fn_high_pc;
4155         uint8_t   cu_eoc;
4156     };
4157
4158     struct ElfImage {
4159         ElfW(Ehdr) ehdr;
4160         ElfW(Phdr) phdr;
4161         ElfW(Shdr) shdr[7];
4162         ElfW(Sym)  sym[2];
4163         struct DebugInfo di;
4164         uint8_t    da[24];
4165         char       str[80];
4166     };
4167
4168     struct ElfImage *img;
4169
4170     static const struct ElfImage img_template = {
4171         .ehdr = {
4172             .e_ident[EI_MAG0] = ELFMAG0,
4173             .e_ident[EI_MAG1] = ELFMAG1,
4174             .e_ident[EI_MAG2] = ELFMAG2,
4175             .e_ident[EI_MAG3] = ELFMAG3,
4176             .e_ident[EI_CLASS] = ELF_CLASS,
4177             .e_ident[EI_DATA] = ELF_DATA,
4178             .e_ident[EI_VERSION] = EV_CURRENT,
4179             .e_type = ET_EXEC,
4180             .e_machine = ELF_HOST_MACHINE,
4181             .e_version = EV_CURRENT,
4182             .e_phoff = offsetof(struct ElfImage, phdr),
4183             .e_shoff = offsetof(struct ElfImage, shdr),
4184             .e_ehsize = sizeof(ElfW(Shdr)),
4185             .e_phentsize = sizeof(ElfW(Phdr)),
4186             .e_phnum = 1,
4187             .e_shentsize = sizeof(ElfW(Shdr)),
4188             .e_shnum = ARRAY_SIZE(img->shdr),
4189             .e_shstrndx = ARRAY_SIZE(img->shdr) - 1,
4190 #ifdef ELF_HOST_FLAGS
4191             .e_flags = ELF_HOST_FLAGS,
4192 #endif
4193 #ifdef ELF_OSABI
4194             .e_ident[EI_OSABI] = ELF_OSABI,
4195 #endif
4196         },
4197         .phdr = {
4198             .p_type = PT_LOAD,
4199             .p_flags = PF_X,
4200         },
4201         .shdr = {
4202             [0] = { .sh_type = SHT_NULL },
4203             /* Trick: The contents of code_gen_buffer are not present in
4204                this fake ELF file; that got allocated elsewhere.  Therefore
4205                we mark .text as SHT_NOBITS (similar to .bss) so that readers
4206                will not look for contents.  We can record any address.  */
4207             [1] = { /* .text */
4208                 .sh_type = SHT_NOBITS,
4209                 .sh_flags = SHF_EXECINSTR | SHF_ALLOC,
4210             },
4211             [2] = { /* .debug_info */
4212                 .sh_type = SHT_PROGBITS,
4213                 .sh_offset = offsetof(struct ElfImage, di),
4214                 .sh_size = sizeof(struct DebugInfo),
4215             },
4216             [3] = { /* .debug_abbrev */
4217                 .sh_type = SHT_PROGBITS,
4218                 .sh_offset = offsetof(struct ElfImage, da),
4219                 .sh_size = sizeof(img->da),
4220             },
4221             [4] = { /* .debug_frame */
4222                 .sh_type = SHT_PROGBITS,
4223                 .sh_offset = sizeof(struct ElfImage),
4224             },
4225             [5] = { /* .symtab */
4226                 .sh_type = SHT_SYMTAB,
4227                 .sh_offset = offsetof(struct ElfImage, sym),
4228                 .sh_size = sizeof(img->sym),
4229                 .sh_info = 1,
4230                 .sh_link = ARRAY_SIZE(img->shdr) - 1,
4231                 .sh_entsize = sizeof(ElfW(Sym)),
4232             },
4233             [6] = { /* .strtab */
4234                 .sh_type = SHT_STRTAB,
4235                 .sh_offset = offsetof(struct ElfImage, str),
4236                 .sh_size = sizeof(img->str),
4237             }
4238         },
4239         .sym = {
4240             [1] = { /* code_gen_buffer */
4241                 .st_info = ELF_ST_INFO(STB_GLOBAL, STT_FUNC),
4242                 .st_shndx = 1,
4243             }
4244         },
4245         .di = {
4246             .len = sizeof(struct DebugInfo) - 4,
4247             .version = 2,
4248             .ptr_size = sizeof(void *),
4249             .cu_die = 1,
4250             .cu_lang = 0x8001,  /* DW_LANG_Mips_Assembler */
4251             .fn_die = 2,
4252             .fn_name = "code_gen_buffer"
4253         },
4254         .da = {
4255             1,          /* abbrev number (the cu) */
4256             0x11, 1,    /* DW_TAG_compile_unit, has children */
4257             0x13, 0x5,  /* DW_AT_language, DW_FORM_data2 */
4258             0x11, 0x1,  /* DW_AT_low_pc, DW_FORM_addr */
4259             0x12, 0x1,  /* DW_AT_high_pc, DW_FORM_addr */
4260             0, 0,       /* end of abbrev */
4261             2,          /* abbrev number (the fn) */
4262             0x2e, 0,    /* DW_TAG_subprogram, no children */
4263             0x3, 0x8,   /* DW_AT_name, DW_FORM_string */
4264             0x11, 0x1,  /* DW_AT_low_pc, DW_FORM_addr */
4265             0x12, 0x1,  /* DW_AT_high_pc, DW_FORM_addr */
4266             0, 0,       /* end of abbrev */
4267             0           /* no more abbrev */
4268         },
4269         .str = "\0" ".text\0" ".debug_info\0" ".debug_abbrev\0"
4270                ".debug_frame\0" ".symtab\0" ".strtab\0" "code_gen_buffer",
4271     };
4272
4273     /* We only need a single jit entry; statically allocate it.  */
4274     static struct jit_code_entry one_entry;
4275
4276     uintptr_t buf = (uintptr_t)buf_ptr;
4277     size_t img_size = sizeof(struct ElfImage) + debug_frame_size;
4278     DebugFrameHeader *dfh;
4279
4280     img = g_malloc(img_size);
4281     *img = img_template;
4282
4283     img->phdr.p_vaddr = buf;
4284     img->phdr.p_paddr = buf;
4285     img->phdr.p_memsz = buf_size;
4286
4287     img->shdr[1].sh_name = find_string(img->str, ".text");
4288     img->shdr[1].sh_addr = buf;
4289     img->shdr[1].sh_size = buf_size;
4290
4291     img->shdr[2].sh_name = find_string(img->str, ".debug_info");
4292     img->shdr[3].sh_name = find_string(img->str, ".debug_abbrev");
4293
4294     img->shdr[4].sh_name = find_string(img->str, ".debug_frame");
4295     img->shdr[4].sh_size = debug_frame_size;
4296
4297     img->shdr[5].sh_name = find_string(img->str, ".symtab");
4298     img->shdr[6].sh_name = find_string(img->str, ".strtab");
4299
4300     img->sym[1].st_name = find_string(img->str, "code_gen_buffer");
4301     img->sym[1].st_value = buf;
4302     img->sym[1].st_size = buf_size;
4303
4304     img->di.cu_low_pc = buf;
4305     img->di.cu_high_pc = buf + buf_size;
4306     img->di.fn_low_pc = buf;
4307     img->di.fn_high_pc = buf + buf_size;
4308
4309     dfh = (DebugFrameHeader *)(img + 1);
4310     memcpy(dfh, debug_frame, debug_frame_size);
4311     dfh->fde.func_start = buf;
4312     dfh->fde.func_len = buf_size;
4313
4314 #ifdef DEBUG_JIT
4315     /* Enable this block to be able to debug the ELF image file creation.
4316        One can use readelf, objdump, or other inspection utilities.  */
4317     {
4318         FILE *f = fopen("/tmp/qemu.jit", "w+b");
4319         if (f) {
4320             if (fwrite(img, img_size, 1, f) != img_size) {
4321                 /* Avoid stupid unused return value warning for fwrite.  */
4322             }
4323             fclose(f);
4324         }
4325     }
4326 #endif
4327
4328     one_entry.symfile_addr = img;
4329     one_entry.symfile_size = img_size;
4330
4331     __jit_debug_descriptor.action_flag = JIT_REGISTER_FN;
4332     __jit_debug_descriptor.relevant_entry = &one_entry;
4333     __jit_debug_descriptor.first_entry = &one_entry;
4334     __jit_debug_register_code();
4335 }
4336 #else
4337 /* No support for the feature.  Provide the entry point expected by exec.c,
4338    and implement the internal function we declared earlier.  */
4339
4340 static void tcg_register_jit_int(void *buf, size_t size,
4341                                  const void *debug_frame,
4342                                  size_t debug_frame_size)
4343 {
4344 }
4345
4346 void tcg_register_jit(void *buf, size_t buf_size)
4347 {
4348 }
4349 #endif /* ELF_HOST_MACHINE */
4350
4351 #if !TCG_TARGET_MAYBE_vec
4352 void tcg_expand_vec_op(TCGOpcode o, TCGType t, unsigned e, TCGArg a0, ...)
4353 {
4354     g_assert_not_reached();
4355 }
4356 #endif
This page took 0.253091 seconds and 4 git commands to generate.