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