VirtualBox

Changeset 37689 in vbox for trunk/src/recompiler/tcg/tcg.c


Ignore:
Timestamp:
Jun 29, 2011 4:01:23 PM (13 years ago)
Author:
vboxsync
Message:

recompiler: Merged in changes from 0.13.0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/tcg/tcg.c

    r37676 r37689  
    2828#include "config.h"
    2929
    30 #ifndef CONFIG_DEBUG_TCG
     30#if !defined(CONFIG_DEBUG_TCG) && !defined(NDEBUG)
    3131/* define it to suppress various consistency checks (faster) */
    3232#define NDEBUG
     
    5353#include "cache-utils.h"
    5454#include "host-utils.h"
     55#include "qemu-timer.h"
    5556
    5657/* Note: the long term plan is to reduce the dependancies on the QEMU
     
    7273 * Liveness analysis doesn't work well with 32-bit hosts and 64-bit targets,
    7374 * second element of the register pair to store 64-bit value is considered
    74  * dead, it seems.
    75  * @todo: fix it in compiler
    76  */
     75 * dead, it seems. */
     76 /** @todo re-test this */
    7777# if defined(TARGET_X86_64) && (TCG_TARGET_REG_BITS == 32)
    7878#  undef USE_LIVENESS_ANALYSIS
     
    8080#endif /* VBOX */
    8181
     82static void tcg_target_init(TCGContext *s);
     83static void tcg_target_qemu_prologue(TCGContext *s);
    8284static void patch_reloc(uint8_t *code_ptr, int type,
    8385                        tcg_target_long value, tcg_target_long addend);
    8486
    8587static TCGOpDef tcg_op_defs[] = {
    86 #define DEF(s, n, copy_size) { #s, 0, 0, n, n, 0, copy_size },
    87 #ifndef VBOX
    88 #define DEF2(s, oargs, iargs, cargs, flags) { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags, 0 },
    89 #else  /* VBOX */
    90 # define DEF2(s, oargs, iargs, cargs, flags) { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags, 0, 0, 0 },
    91 #endif /* VBOX */
     88#define DEF(s, oargs, iargs, cargs, flags) { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
    9289#include "tcg-opc.h"
    9390#undef DEF
    94 #undef DEF2
    9591};
    9692
     
    121117/* label relocation processing */
    122118
    123 void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
    124                    int label_index, long addend)
     119static void tcg_out_reloc(TCGContext *s, uint8_t *code_ptr, int type,
     120                          int label_index, long addend)
    125121{
    126122    TCGLabel *l;
     
    261257
    262258    tcg_target_init(s);
    263 
     259}
     260
     261void tcg_prologue_init(TCGContext *s)
     262{
    264263    /* init global prologue and epilogue */
    265264    s->code_buf = code_gen_prologue;
     
    575574                   int sizemask, TCGArg ret, int nargs, TCGArg *args)
    576575{
     576#ifdef TCG_TARGET_I386
    577577    int call_type;
     578#endif
    578579    int i;
    579580    int real_args;
    580581    int nb_rets;
    581582    TCGArg *nparam;
     583
     584#if defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
     585    for (i = 0; i < nargs; ++i) {
     586        int is_64bit = sizemask & (1 << (i+1)*2);
     587        int is_signed = sizemask & (2 << (i+1)*2);
     588        if (!is_64bit) {
     589            TCGv_i64 temp = tcg_temp_new_i64();
     590            TCGv_i64 orig = MAKE_TCGV_I64(args[i]);
     591            if (is_signed) {
     592                tcg_gen_ext32s_i64(temp, orig);
     593            } else {
     594                tcg_gen_ext32u_i64(temp, orig);
     595            }
     596            args[i] = GET_TCGV_I64(temp);
     597        }
     598    }
     599#endif /* TCG_TARGET_EXTEND_ARGS */
     600
    582601    *gen_opc_ptr++ = INDEX_op_call;
    583602    nparam = gen_opparam_ptr++;
     603#ifdef TCG_TARGET_I386
    584604    call_type = (flags & TCG_CALL_TYPE_MASK);
     605#endif
    585606    if (ret != TCG_CALL_DUMMY_ARG) {
    586607#if TCG_TARGET_REG_BITS < 64
     
    606627    for (i = 0; i < nargs; i++) {
    607628#if TCG_TARGET_REG_BITS < 64
    608         if (sizemask & (2 << i)) {
     629        int is_64bit = sizemask & (1 << (i+1)*2);
     630        if (is_64bit) {
    609631#ifdef TCG_TARGET_I386
    610632            /* REGPARM case: if the third parameter is 64 bit, it is
     
    622644            }
    623645#endif
    624 #ifdef TCG_TARGET_WORDS_BIGENDIAN
     646            /* If stack grows up, then we will be placing successive
     647               arguments at lower addresses, which means we need to
     648               reverse the order compared to how we would normally
     649               treat either big or little-endian.  For those arguments
     650               that will wind up in registers, this still works for
     651               HPPA (the only current STACK_GROWSUP target) since the
     652               argument registers are *also* allocated in decreasing
     653               order.  If another such target is added, this logic may
     654               have to get more complicated to differentiate between
     655               stack arguments and register arguments.  */
     656#if defined(TCG_TARGET_WORDS_BIGENDIAN) != defined(TCG_TARGET_STACK_GROWSUP)
    625657            *gen_opparam_ptr++ = args[i] + 1;
    626658            *gen_opparam_ptr++ = args[i];
     
    630662#endif
    631663            real_args += 2;
    632         } else
    633 #endif
    634         {
    635             *gen_opparam_ptr++ = args[i];
    636             real_args++;
    637         }
     664            continue;
     665        }
     666#endif /* TCG_TARGET_REG_BITS < 64 */
     667
     668        *gen_opparam_ptr++ = args[i];
     669        real_args++;
    638670    }
    639671    *gen_opparam_ptr++ = GET_TCGV_PTR(func);
     
    645677    /* total parameters, needed to go backward in the instruction stream */
    646678    *gen_opparam_ptr++ = 1 + nb_rets + real_args + 3;
     679
     680#if defined(TCG_TARGET_EXTEND_ARGS) && TCG_TARGET_REG_BITS == 64
     681    for (i = 0; i < nargs; ++i) {
     682        int is_64bit = sizemask & (1 << (i+1)*2);
     683        if (!is_64bit) {
     684            TCGv_i64 temp = MAKE_TCGV_I64(args[i]);
     685            tcg_temp_free_i64(temp);
     686        }
     687    }
     688#endif /* TCG_TARGET_EXTEND_ARGS */
    647689}
    648690
     
    696738#endif
    697739
     740
    698741static void tcg_reg_alloc_start(TCGContext *s)
    699742{
     
    813856    const TCGArg *args;
    814857    TCGArg arg;
    815     int c, i, k, nb_oargs, nb_iargs, nb_cargs, first_insn;
     858    TCGOpcode c;
     859    int i, k, nb_oargs, nb_iargs, nb_cargs, first_insn;
    816860    const TCGOpDef *def;
    817861    char buf[128];
     
    919963                        tcg_get_arg_str_idx(s, buf, sizeof(buf), args[k++]));
    920964            }
    921             if (c == INDEX_op_brcond_i32
     965            switch (c) {
     966            case INDEX_op_brcond_i32:
    922967#if TCG_TARGET_REG_BITS == 32
    923                 || c == INDEX_op_brcond2_i32
     968            case INDEX_op_brcond2_i32:
    924969#elif TCG_TARGET_REG_BITS == 64
    925                 || c == INDEX_op_brcond_i64
    926 #endif
    927                 ) {
     970            case INDEX_op_brcond_i64:
     971#endif
     972            case INDEX_op_setcond_i32:
     973#if TCG_TARGET_REG_BITS == 32
     974            case INDEX_op_setcond2_i32:
     975#elif TCG_TARGET_REG_BITS == 64
     976            case INDEX_op_setcond_i64:
     977#endif
    928978                if (args[k] < ARRAY_SIZE(cond_name) && cond_name[args[k]])
    929979                    fprintf(outfile, ",%s", cond_name[args[k++]]);
     
    931981                    fprintf(outfile, ",$0x%" TCG_PRIlx, args[k++]);
    932982                i = 1;
    933             }
    934             else
     983                break;
     984            default:
    935985                i = 0;
     986                break;
     987            }
    936988            for(; i < nb_cargs; i++) {
    937989                if (k != 0)
     
    9921044void tcg_add_target_add_op_defs(const TCGTargetOpDef *tdefs)
    9931045{
    994     int op;
     1046    TCGOpcode op;
    9951047    TCGOpDef *def;
    9961048    const char *ct_str;
     
    9981050
    9991051    for(;;) {
    1000         if (tdefs->op < 0)
     1052        if (tdefs->op == (TCGOpcode)-1)
    10011053            break;
    10021054        op = tdefs->op;
    10031055        assert(op >= 0 && op < NB_OPS);
    10041056        def = &tcg_op_defs[op];
     1057#if defined(CONFIG_DEBUG_TCG)
     1058        /* Duplicate entry in op definitions? */
     1059        assert(!def->used);
     1060        def->used = 1;
     1061#endif
    10051062        nb_args = def->nb_iargs + def->nb_oargs;
    10061063        for(i = 0; i < nb_args; i++) {
    10071064            ct_str = tdefs->args_ct_str[i];
     1065            /* Incomplete TCGTargetOpDef entry? */
     1066            assert(ct_str != NULL);
    10081067            tcg_regset_clear(def->args_ct[i].u.regs);
    10091068            def->args_ct[i].ct = 0;
     
    10331092                            fprintf(stderr, "Invalid constraint '%s' for arg %d of operation '%s'\n",
    10341093                                    ct_str, i, def->name);
    1035 #ifdef VBOX
    1036                             tcg_exit(1);
    1037 #else
    10381094                            exit(1);
    1039 #endif
    10401095                        }
    10411096                    }
     
    10431098            }
    10441099        }
     1100
     1101        /* TCGTargetOpDef entry with too much information? */
     1102        assert(i == TCG_MAX_OP_ARGS || tdefs->args_ct_str[i] == NULL);
    10451103
    10461104        /* sort the constraints (XXX: this is just an heuristic) */
     
    10611119    }
    10621120
     1121#if defined(CONFIG_DEBUG_TCG)
     1122    i = 0;
     1123    for (op = 0; op < ARRAY_SIZE(tcg_op_defs); op++) {
     1124        if (op < INDEX_op_call || op == INDEX_op_debug_insn_start) {
     1125            /* Wrong entry in op definitions? */
     1126            if (tcg_op_defs[op].used) {
     1127                fprintf(stderr, "Invalid op definition for %s\n",
     1128                        tcg_op_defs[op].name);
     1129                i = 1;
     1130            }
     1131        } else {
     1132            /* Missing entry in op definitions? */
     1133            if (!tcg_op_defs[op].used) {
     1134                fprintf(stderr, "Missing op definition for %s\n",
     1135                        tcg_op_defs[op].name);
     1136                i = 1;
     1137            }
     1138        }
     1139    }
     1140    if (i == 1) {
     1141        tcg_abort();
     1142    }
     1143#endif
    10631144}
    10641145
     
    11111192static void tcg_liveness_analysis(TCGContext *s)
    11121193{
    1113     int i, op_index, op, nb_args, nb_iargs, nb_oargs, arg, nb_ops;
     1194    int i, op_index, nb_args, nb_iargs, nb_oargs, arg, nb_ops;
     1195    TCGOpcode op;
    11141196    TCGArg *args;
    11151197    const TCGOpDef *def;
     
    12591341#else
    12601342/* dummy liveness analysis */
    1261 void tcg_liveness_analysis(TCGContext *s)
     1343static void tcg_liveness_analysis(TCGContext *s)
    12621344{
    12631345    int nb_ops;
     
    13501432    if (s->current_frame_offset + sizeof(tcg_target_long) > s->frame_end)
    13511433#else
    1352     if ((unsigned)s->current_frame_offset + sizeof(tcg_target_long) > s->frame_end)
     1434    if ((tcg_target_long)s->current_frame_offset + sizeof(tcg_target_long) > s->frame_end)
    13531435#endif
    13541436        tcg_abort();
     
    15241606            }
    15251607            if (ts->reg != reg) {
    1526                 tcg_out_mov(s, reg, ts->reg);
     1608                tcg_out_mov(s, ots->type, reg, ts->reg);
    15271609            }
    15281610        }
     
    15561638
    15571639static void tcg_reg_alloc_op(TCGContext *s,
    1558                              const TCGOpDef *def, int opc,
     1640                             const TCGOpDef *def, TCGOpcode opc,
    15591641                             const TCGArg *args,
    15601642                             unsigned int dead_iargs)
     
    16291711               and move the temporary register into it */
    16301712            reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
    1631             tcg_out_mov(s, reg, ts->reg);
     1713            tcg_out_mov(s, ts->type, reg, ts->reg);
    16321714        }
    16331715        new_args[i] = reg;
     
    17111793        reg = new_args[i];
    17121794        if (ts->fixed_reg && ts->reg != reg) {
    1713             tcg_out_mov(s, ts->reg, reg);
     1795            tcg_out_mov(s, ts->type, ts->reg, reg);
    17141796        }
    17151797    }
     
    17231805
    17241806static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
    1725                               int opc, const TCGArg *args,
     1807                              TCGOpcode opc, const TCGArg *args,
    17261808                              unsigned int dead_iargs)
    17271809{
     
    17971879            if (ts->val_type == TEMP_VAL_REG) {
    17981880                if (ts->reg != reg) {
    1799                     tcg_out_mov(s, reg, ts->reg);
     1881                    tcg_out_mov(s, ts->type, reg, ts->reg);
    18001882                }
    18011883            } else if (ts->val_type == TEMP_VAL_MEM) {
     
    18261908        if (!tcg_regset_test_reg(arg_ct->u.regs, reg)) {
    18271909            reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
    1828             tcg_out_mov(s, reg, ts->reg);
     1910            tcg_out_mov(s, ts->type, reg, ts->reg);
    18291911        }
    18301912        func_arg = reg;
     
    18851967        if (ts->fixed_reg) {
    18861968            if (ts->reg != reg) {
    1887                 tcg_out_mov(s, ts->reg, reg);
     1969                tcg_out_mov(s, ts->type, ts->reg, reg);
    18881970            }
    18891971        } else {
     
    19202002                                      long search_pc)
    19212003{
    1922     int opc, op_index;
     2004    TCGOpcode opc;
     2005    int op_index;
    19232006    const TCGOpDef *def;
    19242007    unsigned int dead_iargs;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette