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