VirtualBox

Changeset 37675 in vbox for trunk/src/recompiler/tcg/i386


Ignore:
Timestamp:
Jun 29, 2011 7:07:14 AM (14 years ago)
Author:
vboxsync
Message:

rem: Synced with v0.12.5.

Location:
trunk/src/recompiler/tcg/i386
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/tcg/i386/tcg-target.c

    r36175 r37675  
    293293}
    294294
    295 static inline void tgen_arithi(TCGContext *s, int c, int r0, int32_t val)
    296 {
    297     if (val == (int8_t)val) {
     295static inline void tgen_arithi(TCGContext *s, int c, int r0, int32_t val, int cf)
     296{
     297    if (!cf && ((c == ARITH_ADD && val == 1) || (c == ARITH_SUB && val == -1))) {
     298        /* inc */
     299        tcg_out_opc(s, 0x40 + r0);
     300    } else if (!cf && ((c == ARITH_ADD && val == -1) || (c == ARITH_SUB && val == 1))) {
     301        /* dec */
     302        tcg_out_opc(s, 0x48 + r0);
     303    } else if (val == (int8_t)val) {
    298304        tcg_out_modrm(s, 0x83, c, r0);
    299305        tcg_out8(s, val);
     306    } else if (c == ARITH_AND && val == 0xffu && r0 < 4) {
     307        /* movzbl */
     308        tcg_out_modrm(s, 0xb6 | P_EXT, r0, r0);
     309    } else if (c == ARITH_AND && val == 0xffffu) {
     310        /* movzwl */
     311        tcg_out_modrm(s, 0xb7 | P_EXT, r0, r0);
    300312    } else {
    301313        tcg_out_modrm(s, 0x81, c, r0);
     
    307319{
    308320    if (val != 0)
    309         tgen_arithi(s, ARITH_ADD, reg, val);
     321        tgen_arithi(s, ARITH_ADD, reg, val, 0);
    310322}
    311323
     
    314326{
    315327    if (val != 0)
    316         tgen_arithi(s, ARITH_SUB, reg, val);
     328        tgen_arithi(s, ARITH_SUB, reg, val, 0);
    317329}
    318330#endif
     
    363375            tcg_out_modrm(s, 0x85, arg1, arg1);
    364376        } else {
    365             tgen_arithi(s, ARITH_CMP, arg1, arg2);
     377            tgen_arithi(s, ARITH_CMP, arg1, arg2, 0);
    366378        }
    367379    } else {
     
    370382    tcg_out_jxx(s, tcg_cond_to_jcc[cond], label_index);
    371383}
    372 
    373 #ifdef VBOX
    374 
    375 DECLINLINE(void) tcg_out_long_call(TCGContext *s, void* dst)
    376 {
    377     intptr_t disp;
    378 # ifdef VBOX
    379     tcg_gen_stack_alignment_check(s);
    380 # endif
    381     disp = (uintptr_t)dst - (uintptr_t)s->code_ptr - 5;
    382     tcg_out8(s,  0xe8); /* call disp32 */
    383     tcg_out32(s, disp); /* disp32 */
    384 }
    385 
    386 DECLINLINE(void) tcg_out_long_jmp(TCGContext *s, void* dst)
    387 {
    388     intptr_t disp = (uintptr_t)dst - (uintptr_t)s->code_ptr - 5;
    389     tcg_out8(s,  0xe9); /* jmp disp32 */
    390     tcg_out32(s, disp); /* disp32 */
    391 }
    392 
    393 #endif /* VBOX */
    394384
    395385/* XXX: we implement it at the target level to avoid having to
     
    474464#endif
    475465
     466#ifndef CONFIG_USER_ONLY
     467#define GUEST_BASE 0
     468#endif
     469
    476470#if defined(VBOX) && defined(REM_PHYS_ADDR_IN_TLB)
    477 static void *vbox_ld_helpers[] = {
     471
     472static void * const vbox_ld_helpers[] = {
    478473    __ldub_vbox_phys,
    479474    __lduw_vbox_phys,
     
    486481};
    487482
    488 static void *vbox_st_helpers[] = {
     483static void * const vbox_st_helpers[] = {
    489484    __stb_vbox_phys,
    490485    __stw_vbox_phys,
     
    493488};
    494489
     490DECLINLINE(void) tcg_out_long_call(TCGContext *s, void* dst)
     491{
     492    intptr_t disp;
     493# ifdef VBOX
     494    tcg_gen_stack_alignment_check(s);
     495# endif
     496    disp = (uintptr_t)dst - (uintptr_t)s->code_ptr - 5;
     497    tcg_out8(s,  0xe8); /* call disp32 */
     498    tcg_out32(s, disp); /* disp32 */
     499}
     500
    495501static void tcg_out_vbox_phys_read(TCGContext *s, int index,
    496502                                   int addr_reg,
     
    503509    AssertMsg(sizeof(RTGCPHYS) == 8, ("Physical address must be 64-bits, update caller\n"));
    504510
    505 #if 0
     511# if 0
    506512    tcg_out8(s, 0x6a); tcg_out8(s, 0x00); /* push $0 */
    507513    tcg_out_push(s, addr_reg);
    508 #else
     514# else
    509515    /* mov addr_reg, %eax */
    510516    tcg_out_mov(s, TCG_REG_EAX, addr_reg);
    511 #endif
     517# endif
    512518
    513519    tcg_out_long_call(s, vbox_ld_helpers[index]);
     
    526532    int useReg2 = ((index & 3) == 3);
    527533
    528 #if 0
     534# if 0
    529535    /* out parameter (value2) */
    530536    if (useReg2)
     
    536542    tcg_out8(s, 0x6a); tcg_out8(s, 0x00); /* push $0 */
    537543    tcg_out_push(s, addr_reg);
    538 #else
     544# else
    539545    Assert(val_reg !=  TCG_REG_EAX && (!useReg2 || (val_reg2 != TCG_REG_EAX)));
    540546    /* mov addr_reg, %eax */
     
    546552        tcg_out_mov(s, TCG_REG_ECX, val_reg2);
    547553
    548 #endif
     554# endif
    549555    /* call it */
    550556    tcg_out_long_call(s, vbox_st_helpers[index]);
    551557
    552558    /* clean stack after us */
    553 #if 0
     559# if 0
    554560    tcg_out_addi(s, TCG_REG_ESP, 8 + (useReg2 ? 8 : 4));
    555561# endif
     
    604610    tcg_out32(s, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS);
    605611
    606 #ifndef VBOX
    607612    tcg_out_opc(s, 0x8d); /* lea offset(r1, %ebp), r1 */
    608613    tcg_out8(s, 0x80 | (r1 << 3) | 0x04);
     614#ifndef VBOX
    609615    tcg_out8(s, (5 << 3) | r1);
     616#else
     617    tcg_out8(s, (TCG_AREG0 << 3) | r1); /* env, not %ebp */
     618    Assert(mem_index >= 0 && mem_index < NB_MMU_MODES);
     619#endif
    610620    tcg_out32(s, offsetof(CPUState, tlb_table[mem_index][0].addr_read));
    611 #else
    612     tcg_out_opc(s, 0x8d); /* lea offset(r1, env), r1 */
    613     tcg_out8(s, 0x80 | (r1 << 3) | 0x04);
    614     tcg_out8(s, (TCG_AREG0 << 3) | r1);
    615     tcg_out32(s, offsetof(CPUState, tlb_table[mem_index][0].addr_read));
    616 #endif
    617621
    618622    /* cmp 0(r1), r0 */
     
    714718    case 0:
    715719        /* movzbl */
    716         tcg_out_modrm_offset(s, 0xb6 | P_EXT, data_reg, r0, 0);
     720        tcg_out_modrm_offset(s, 0xb6 | P_EXT, data_reg, r0, GUEST_BASE);
    717721        break;
    718722    case 0 | 4:
    719723        /* movsbl */
    720         tcg_out_modrm_offset(s, 0xbe | P_EXT, data_reg, r0, 0);
     724        tcg_out_modrm_offset(s, 0xbe | P_EXT, data_reg, r0, GUEST_BASE);
    721725        break;
    722726    case 1:
    723727        /* movzwl */
    724         tcg_out_modrm_offset(s, 0xb7 | P_EXT, data_reg, r0, 0);
     728        tcg_out_modrm_offset(s, 0xb7 | P_EXT, data_reg, r0, GUEST_BASE);
    725729        if (bswap) {
    726730            /* rolw $8, data_reg */
     
    732736    case 1 | 4:
    733737        /* movswl */
    734         tcg_out_modrm_offset(s, 0xbf | P_EXT, data_reg, r0, 0);
     738        tcg_out_modrm_offset(s, 0xbf | P_EXT, data_reg, r0, GUEST_BASE);
    735739        if (bswap) {
    736740            /* rolw $8, data_reg */
     
    745749    case 2:
    746750        /* movl (r0), data_reg */
    747         tcg_out_modrm_offset(s, 0x8b, data_reg, r0, 0);
     751        tcg_out_modrm_offset(s, 0x8b, data_reg, r0, GUEST_BASE);
    748752        if (bswap) {
    749753            /* bswap */
     
    761765        }
    762766        if (!bswap) {
    763             tcg_out_modrm_offset(s, 0x8b, data_reg, r0, 0);
    764             tcg_out_modrm_offset(s, 0x8b, data_reg2, r0, 4);
     767            tcg_out_modrm_offset(s, 0x8b, data_reg, r0, GUEST_BASE);
     768            tcg_out_modrm_offset(s, 0x8b, data_reg2, r0, GUEST_BASE + 4);
    765769        } else {
    766             tcg_out_modrm_offset(s, 0x8b, data_reg, r0, 4);
     770            tcg_out_modrm_offset(s, 0x8b, data_reg, r0, GUEST_BASE + 4);
    767771            tcg_out_opc(s, (0xc8 + data_reg) | P_EXT);
    768772
    769             tcg_out_modrm_offset(s, 0x8b, data_reg2, r0, 0);
     773            tcg_out_modrm_offset(s, 0x8b, data_reg2, r0, GUEST_BASE);
    770774            /* bswap */
    771775            tcg_out_opc(s, (0xc8 + data_reg2) | P_EXT);
     
    842846    tcg_out32(s, (CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS);
    843847
    844 #ifndef VBOX
    845848    tcg_out_opc(s, 0x8d); /* lea offset(r1, %ebp), r1 */
    846849    tcg_out8(s, 0x80 | (r1 << 3) | 0x04);
     850#ifndef VBOX
    847851    tcg_out8(s, (5 << 3) | r1);
     852#else
     853    tcg_out8(s, (TCG_AREG0 << 3) | r1); /* env is not %ebp */
     854    Assert(mem_index >= 0 && mem_index < NB_MMU_MODES);
     855#endif
    848856    tcg_out32(s, offsetof(CPUState, tlb_table[mem_index][0].addr_write));
    849 #else
    850     tcg_out_opc(s, 0x8d); /* lea offset(r1, env), r1 */
    851     tcg_out8(s, 0x80 | (r1 << 3) | 0x04);
    852     tcg_out8(s, (TCG_AREG0 << 3) | r1);
    853     tcg_out32(s, offsetof(CPUState, tlb_table[mem_index][0].addr_write));
    854 #endif
    855857
    856858    /* cmp 0(r1), r0 */
     
    10041006    case 0:
    10051007        /* movb */
    1006         tcg_out_modrm_offset(s, 0x88, data_reg, r0, 0);
     1008        tcg_out_modrm_offset(s, 0x88, data_reg, r0, GUEST_BASE);
    10071009        break;
    10081010    case 1:
     
    10161018        /* movw */
    10171019        tcg_out8(s, 0x66);
    1018         tcg_out_modrm_offset(s, 0x89, data_reg, r0, 0);
     1020        tcg_out_modrm_offset(s, 0x89, data_reg, r0, GUEST_BASE);
    10191021        break;
    10201022    case 2:
     
    10261028        }
    10271029        /* movl */
    1028         tcg_out_modrm_offset(s, 0x89, data_reg, r0, 0);
     1030        tcg_out_modrm_offset(s, 0x89, data_reg, r0, GUEST_BASE);
    10291031        break;
    10301032    case 3:
     
    10331035            /* bswap data_reg */
    10341036            tcg_out_opc(s, (0xc8 + r1) | P_EXT);
    1035             tcg_out_modrm_offset(s, 0x89, r1, r0, 0);
     1037            tcg_out_modrm_offset(s, 0x89, r1, r0, GUEST_BASE);
    10361038            tcg_out_mov(s, r1, data_reg);
    10371039            /* bswap data_reg */
    10381040            tcg_out_opc(s, (0xc8 + r1) | P_EXT);
    1039             tcg_out_modrm_offset(s, 0x89, r1, r0, 4);
     1041            tcg_out_modrm_offset(s, 0x89, r1, r0, GUEST_BASE + 4);
    10401042        } else {
    1041             tcg_out_modrm_offset(s, 0x89, data_reg, r0, 0);
    1042             tcg_out_modrm_offset(s, 0x89, data_reg2, r0, 4);
     1043            tcg_out_modrm_offset(s, 0x89, data_reg, r0, GUEST_BASE);
     1044            tcg_out_modrm_offset(s, 0x89, data_reg2, r0, GUEST_BASE + 4);
    10431045        }
    10441046        break;
     
    11581160    gen_arith:
    11591161        if (const_args[2]) {
    1160             tgen_arithi(s, c, args[0], args[2]);
     1162            tgen_arithi(s, c, args[0], args[2], 0);
    11611163        } else {
    11621164            tcg_out_modrm(s, 0x01 | (c << 3), args[2], args[0]);
     
    12161218    case INDEX_op_add2_i32:
    12171219        if (const_args[4])
    1218             tgen_arithi(s, ARITH_ADD, args[0], args[4]);
     1220            tgen_arithi(s, ARITH_ADD, args[0], args[4], 1);
    12191221        else
    12201222            tcg_out_modrm(s, 0x01 | (ARITH_ADD << 3), args[4], args[0]);
    12211223        if (const_args[5])
    1222             tgen_arithi(s, ARITH_ADC, args[1], args[5]);
     1224            tgen_arithi(s, ARITH_ADC, args[1], args[5], 1);
    12231225        else
    12241226            tcg_out_modrm(s, 0x01 | (ARITH_ADC << 3), args[5], args[1]);
     
    12261228    case INDEX_op_sub2_i32:
    12271229        if (const_args[4])
    1228             tgen_arithi(s, ARITH_SUB, args[0], args[4]);
     1230            tgen_arithi(s, ARITH_SUB, args[0], args[4], 1);
    12291231        else
    12301232            tcg_out_modrm(s, 0x01 | (ARITH_SUB << 3), args[4], args[0]);
    12311233        if (const_args[5])
    1232             tgen_arithi(s, ARITH_SBB, args[1], args[5]);
     1234            tgen_arithi(s, ARITH_SBB, args[1], args[5], 1);
    12331235        else
    12341236            tcg_out_modrm(s, 0x01 | (ARITH_SBB << 3), args[5], args[1]);
     
    12631265    case INDEX_op_ext16s_i32:
    12641266        tcg_out_modrm(s, 0xbf | P_EXT, args[0], args[1]);
     1267        break;
     1268    case INDEX_op_ext8u_i32:
     1269        tcg_out_modrm(s, 0xb6 | P_EXT, args[0], args[1]);
     1270        break;
     1271    case INDEX_op_ext16u_i32:
     1272        tcg_out_modrm(s, 0xb7 | P_EXT, args[0], args[1]);
    12651273        break;
    12661274
     
    13321340    { INDEX_op_shr_i32, { "r", "0", "ci" } },
    13331341    { INDEX_op_sar_i32, { "r", "0", "ci" } },
    1334     { INDEX_op_sar_i32, { "r", "0", "ci" } },
    13351342    { INDEX_op_rotl_i32, { "r", "0", "ci" } },
    13361343    { INDEX_op_rotr_i32, { "r", "0", "ci" } },
     
    13511358    { INDEX_op_ext8s_i32, { "r", "q" } },
    13521359    { INDEX_op_ext16s_i32, { "r", "r" } },
     1360    { INDEX_op_ext8u_i32, { "r", "q"} },
     1361    { INDEX_op_ext16u_i32, { "r", "r"} },
    13531362
    13541363#if TARGET_LONG_BITS == 32
  • trunk/src/recompiler/tcg/i386/tcg-target.h

    r36175 r37675  
    5353#define TCG_TARGET_HAS_ext16s_i32
    5454#define TCG_TARGET_HAS_rot_i32
     55#define TCG_TARGET_HAS_ext8u_i32
     56#define TCG_TARGET_HAS_ext16u_i32
     57
     58#define TCG_TARGET_HAS_GUEST_BASE
    5559
    5660/* Note: must be synced with dyngen-exec.h */
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