Commit b6abf97df19a3c632ca6977c2056f8a675f3f3f0
1 parent
c6e113f5
converted condition code supprot to TCG - converted shift ops to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4470 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
9 changed files
with
762 additions
and
1132 deletions
target-i386/cpu.h
| ... | ... | @@ -476,6 +476,7 @@ typedef struct CPUX86State { |
| 476 | 476 | /* temporaries if we cannot store them in host registers */ |
| 477 | 477 | target_ulong t0, t1, t2; |
| 478 | 478 | #endif |
| 479 | + target_ulong t3; | |
| 479 | 480 | |
| 480 | 481 | /* standard registers */ |
| 481 | 482 | target_ulong regs[CPU_NB_REGS]; |
| ... | ... | @@ -727,6 +728,13 @@ static inline int cpu_mmu_index (CPUState *env) |
| 727 | 728 | return (env->hflags & HF_CPL_MASK) == 3 ? 1 : 0; |
| 728 | 729 | } |
| 729 | 730 | |
| 731 | +typedef struct CCTable { | |
| 732 | + int (*compute_all)(void); /* return all the flags */ | |
| 733 | + int (*compute_c)(void); /* return the C flag */ | |
| 734 | +} CCTable; | |
| 735 | + | |
| 736 | +extern CCTable cc_table[]; | |
| 737 | + | |
| 730 | 738 | #include "cpu-all.h" |
| 731 | 739 | |
| 732 | 740 | #include "svm.h" | ... | ... |
target-i386/exec.h
| ... | ... | @@ -98,13 +98,6 @@ extern int loglevel; |
| 98 | 98 | #include "cpu.h" |
| 99 | 99 | #include "exec-all.h" |
| 100 | 100 | |
| 101 | -typedef struct CCTable { | |
| 102 | - int (*compute_all)(void); /* return all the flags */ | |
| 103 | - int (*compute_c)(void); /* return the C flag */ | |
| 104 | -} CCTable; | |
| 105 | - | |
| 106 | -extern CCTable cc_table[]; | |
| 107 | - | |
| 108 | 101 | void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0); |
| 109 | 102 | void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3); |
| 110 | 103 | void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4); |
| ... | ... | @@ -129,6 +122,15 @@ void __hidden cpu_loop_exit(void); |
| 129 | 122 | void OPPROTO op_movl_eflags_T0(void); |
| 130 | 123 | void OPPROTO op_movl_T0_eflags(void); |
| 131 | 124 | |
| 125 | +/* n must be a constant to be efficient */ | |
| 126 | +static inline target_long lshift(target_long x, int n) | |
| 127 | +{ | |
| 128 | + if (n >= 0) | |
| 129 | + return x << n; | |
| 130 | + else | |
| 131 | + return x >> (-n); | |
| 132 | +} | |
| 133 | + | |
| 132 | 134 | #include "helper.h" |
| 133 | 135 | |
| 134 | 136 | static inline void svm_check_intercept(uint32_t type) | ... | ... |
target-i386/helper.c
| ... | ... | @@ -5220,3 +5220,22 @@ void helper_movq(uint64_t *d, uint64_t *s) |
| 5220 | 5220 | #define SHIFT 1 |
| 5221 | 5221 | #include "ops_sse.h" |
| 5222 | 5222 | |
| 5223 | +#define SHIFT 0 | |
| 5224 | +#include "helper_template.h" | |
| 5225 | +#undef SHIFT | |
| 5226 | + | |
| 5227 | +#define SHIFT 1 | |
| 5228 | +#include "helper_template.h" | |
| 5229 | +#undef SHIFT | |
| 5230 | + | |
| 5231 | +#define SHIFT 2 | |
| 5232 | +#include "helper_template.h" | |
| 5233 | +#undef SHIFT | |
| 5234 | + | |
| 5235 | +#ifdef TARGET_X86_64 | |
| 5236 | + | |
| 5237 | +#define SHIFT 3 | |
| 5238 | +#include "helper_template.h" | |
| 5239 | +#undef SHIFT | |
| 5240 | + | |
| 5241 | +#endif | ... | ... |
target-i386/helper.h
| ... | ... | @@ -199,3 +199,14 @@ void TCG_HELPER_PROTO helper_movq(uint64_t *d, uint64_t *s); |
| 199 | 199 | #define SHIFT 1 |
| 200 | 200 | #include "ops_sse_header.h" |
| 201 | 201 | |
| 202 | +target_ulong helper_rclb(target_ulong t0, target_ulong t1); | |
| 203 | +target_ulong helper_rclw(target_ulong t0, target_ulong t1); | |
| 204 | +target_ulong helper_rcll(target_ulong t0, target_ulong t1); | |
| 205 | +target_ulong helper_rcrb(target_ulong t0, target_ulong t1); | |
| 206 | +target_ulong helper_rcrw(target_ulong t0, target_ulong t1); | |
| 207 | +target_ulong helper_rcrl(target_ulong t0, target_ulong t1); | |
| 208 | +#ifdef TARGET_X86_64 | |
| 209 | +target_ulong helper_rclq(target_ulong t0, target_ulong t1); | |
| 210 | +target_ulong helper_rcrq(target_ulong t0, target_ulong t1); | |
| 211 | +#endif | |
| 212 | + | ... | ... |
target-i386/helper_template.h
0 โ 100644
| 1 | +/* | |
| 2 | + * i386 helpers | |
| 3 | + * | |
| 4 | + * Copyright (c) 2008 Fabrice Bellard | |
| 5 | + * | |
| 6 | + * This library is free software; you can redistribute it and/or | |
| 7 | + * modify it under the terms of the GNU Lesser General Public | |
| 8 | + * License as published by the Free Software Foundation; either | |
| 9 | + * version 2 of the License, or (at your option) any later version. | |
| 10 | + * | |
| 11 | + * This library is distributed in the hope that it will be useful, | |
| 12 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 14 | + * Lesser General Public License for more details. | |
| 15 | + * | |
| 16 | + * You should have received a copy of the GNU Lesser General Public | |
| 17 | + * License along with this library; if not, write to the Free Software | |
| 18 | + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 19 | + */ | |
| 20 | +#define DATA_BITS (1 << (3 + SHIFT)) | |
| 21 | +#define SHIFT_MASK (DATA_BITS - 1) | |
| 22 | +#define SIGN_MASK (((target_ulong)1) << (DATA_BITS - 1)) | |
| 23 | +#if DATA_BITS <= 32 | |
| 24 | +#define SHIFT1_MASK 0x1f | |
| 25 | +#else | |
| 26 | +#define SHIFT1_MASK 0x3f | |
| 27 | +#endif | |
| 28 | + | |
| 29 | +#if DATA_BITS == 8 | |
| 30 | +#define SUFFIX b | |
| 31 | +#define DATA_TYPE uint8_t | |
| 32 | +#define DATA_STYPE int8_t | |
| 33 | +#define DATA_MASK 0xff | |
| 34 | +#elif DATA_BITS == 16 | |
| 35 | +#define SUFFIX w | |
| 36 | +#define DATA_TYPE uint16_t | |
| 37 | +#define DATA_STYPE int16_t | |
| 38 | +#define DATA_MASK 0xffff | |
| 39 | +#elif DATA_BITS == 32 | |
| 40 | +#define SUFFIX l | |
| 41 | +#define DATA_TYPE uint32_t | |
| 42 | +#define DATA_STYPE int32_t | |
| 43 | +#define DATA_MASK 0xffffffff | |
| 44 | +#elif DATA_BITS == 64 | |
| 45 | +#define SUFFIX q | |
| 46 | +#define DATA_TYPE uint64_t | |
| 47 | +#define DATA_STYPE int64_t | |
| 48 | +#define DATA_MASK 0xffffffffffffffffULL | |
| 49 | +#else | |
| 50 | +#error unhandled operand size | |
| 51 | +#endif | |
| 52 | + | |
| 53 | +target_ulong glue(helper_rcl, SUFFIX)(target_ulong t0, target_ulong t1) | |
| 54 | +{ | |
| 55 | + int count, eflags; | |
| 56 | + target_ulong src; | |
| 57 | + target_long res; | |
| 58 | + | |
| 59 | + count = t1 & SHIFT1_MASK; | |
| 60 | +#if DATA_BITS == 16 | |
| 61 | + count = rclw_table[count]; | |
| 62 | +#elif DATA_BITS == 8 | |
| 63 | + count = rclb_table[count]; | |
| 64 | +#endif | |
| 65 | + if (count) { | |
| 66 | + eflags = cc_table[CC_OP].compute_all(); | |
| 67 | + t0 &= DATA_MASK; | |
| 68 | + src = t0; | |
| 69 | + res = (t0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1)); | |
| 70 | + if (count > 1) | |
| 71 | + res |= t0 >> (DATA_BITS + 1 - count); | |
| 72 | + t0 = res; | |
| 73 | + env->t3 = (eflags & ~(CC_C | CC_O)) | | |
| 74 | + (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 75 | + ((src >> (DATA_BITS - count)) & CC_C); | |
| 76 | + } else { | |
| 77 | + env->t3 = -1; | |
| 78 | + } | |
| 79 | + return t0; | |
| 80 | +} | |
| 81 | + | |
| 82 | +target_ulong glue(helper_rcr, SUFFIX)(target_ulong t0, target_ulong t1) | |
| 83 | +{ | |
| 84 | + int count, eflags; | |
| 85 | + target_ulong src; | |
| 86 | + target_long res; | |
| 87 | + | |
| 88 | + count = t1 & SHIFT1_MASK; | |
| 89 | +#if DATA_BITS == 16 | |
| 90 | + count = rclw_table[count]; | |
| 91 | +#elif DATA_BITS == 8 | |
| 92 | + count = rclb_table[count]; | |
| 93 | +#endif | |
| 94 | + if (count) { | |
| 95 | + eflags = cc_table[CC_OP].compute_all(); | |
| 96 | + t0 &= DATA_MASK; | |
| 97 | + src = t0; | |
| 98 | + res = (t0 >> count) | ((target_ulong)(eflags & CC_C) << (DATA_BITS - count)); | |
| 99 | + if (count > 1) | |
| 100 | + res |= t0 << (DATA_BITS + 1 - count); | |
| 101 | + t0 = res; | |
| 102 | + env->t3 = (eflags & ~(CC_C | CC_O)) | | |
| 103 | + (lshift(src ^ t0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 104 | + ((src >> (count - 1)) & CC_C); | |
| 105 | + } else { | |
| 106 | + env->t3 = -1; | |
| 107 | + } | |
| 108 | + return t0; | |
| 109 | +} | |
| 110 | + | |
| 111 | +#undef DATA_BITS | |
| 112 | +#undef SHIFT_MASK | |
| 113 | +#undef SHIFT1_MASK | |
| 114 | +#undef SIGN_MASK | |
| 115 | +#undef DATA_TYPE | |
| 116 | +#undef DATA_STYPE | |
| 117 | +#undef DATA_MASK | |
| 118 | +#undef SUFFIX | ... | ... |
target-i386/op.c
| ... | ... | @@ -21,15 +21,6 @@ |
| 21 | 21 | #define ASM_SOFTMMU |
| 22 | 22 | #include "exec.h" |
| 23 | 23 | |
| 24 | -/* n must be a constant to be efficient */ | |
| 25 | -static inline target_long lshift(target_long x, int n) | |
| 26 | -{ | |
| 27 | - if (n >= 0) | |
| 28 | - return x << n; | |
| 29 | - else | |
| 30 | - return x >> (-n); | |
| 31 | -} | |
| 32 | - | |
| 33 | 24 | /* we define the various pieces of code used by the JIT */ |
| 34 | 25 | |
| 35 | 26 | #define REG EAX |
| ... | ... | @@ -132,66 +123,6 @@ static inline target_long lshift(target_long x, int n) |
| 132 | 123 | |
| 133 | 124 | #endif |
| 134 | 125 | |
| 135 | -/* operations with flags */ | |
| 136 | - | |
| 137 | -/* update flags with T0 and T1 (add/sub case) */ | |
| 138 | -void OPPROTO op_update2_cc(void) | |
| 139 | -{ | |
| 140 | - CC_SRC = T1; | |
| 141 | - CC_DST = T0; | |
| 142 | -} | |
| 143 | - | |
| 144 | -/* update flags with T0 (logic operation case) */ | |
| 145 | -void OPPROTO op_update1_cc(void) | |
| 146 | -{ | |
| 147 | - CC_DST = T0; | |
| 148 | -} | |
| 149 | - | |
| 150 | -void OPPROTO op_update_neg_cc(void) | |
| 151 | -{ | |
| 152 | - CC_SRC = -T0; | |
| 153 | - CC_DST = T0; | |
| 154 | -} | |
| 155 | - | |
| 156 | -void OPPROTO op_cmpl_T0_T1_cc(void) | |
| 157 | -{ | |
| 158 | - CC_SRC = T1; | |
| 159 | - CC_DST = T0 - T1; | |
| 160 | -} | |
| 161 | - | |
| 162 | -void OPPROTO op_update_inc_cc(void) | |
| 163 | -{ | |
| 164 | - CC_SRC = cc_table[CC_OP].compute_c(); | |
| 165 | - CC_DST = T0; | |
| 166 | -} | |
| 167 | - | |
| 168 | -void OPPROTO op_testl_T0_T1_cc(void) | |
| 169 | -{ | |
| 170 | - CC_DST = T0 & T1; | |
| 171 | -} | |
| 172 | - | |
| 173 | -/* operations without flags */ | |
| 174 | - | |
| 175 | -void OPPROTO op_negl_T0(void) | |
| 176 | -{ | |
| 177 | - T0 = -T0; | |
| 178 | -} | |
| 179 | - | |
| 180 | -void OPPROTO op_incl_T0(void) | |
| 181 | -{ | |
| 182 | - T0++; | |
| 183 | -} | |
| 184 | - | |
| 185 | -void OPPROTO op_decl_T0(void) | |
| 186 | -{ | |
| 187 | - T0--; | |
| 188 | -} | |
| 189 | - | |
| 190 | -void OPPROTO op_notl_T0(void) | |
| 191 | -{ | |
| 192 | - T0 = ~T0; | |
| 193 | -} | |
| 194 | - | |
| 195 | 126 | /* multiply/divide */ |
| 196 | 127 | |
| 197 | 128 | /* XXX: add eflags optimizations */ |
| ... | ... | @@ -308,28 +239,6 @@ void OPPROTO op_addl_A0_AL(void) |
| 308 | 239 | A0 = (uint32_t)(A0 + (EAX & 0xff)); |
| 309 | 240 | } |
| 310 | 241 | |
| 311 | -#ifdef WORDS_BIGENDIAN | |
| 312 | -typedef union UREG64 { | |
| 313 | - struct { uint16_t v3, v2, v1, v0; } w; | |
| 314 | - struct { uint32_t v1, v0; } l; | |
| 315 | - uint64_t q; | |
| 316 | -} UREG64; | |
| 317 | -#else | |
| 318 | -typedef union UREG64 { | |
| 319 | - struct { uint16_t v0, v1, v2, v3; } w; | |
| 320 | - struct { uint32_t v0, v1; } l; | |
| 321 | - uint64_t q; | |
| 322 | -} UREG64; | |
| 323 | -#endif | |
| 324 | - | |
| 325 | -#define PARAMQ1 \ | |
| 326 | -({\ | |
| 327 | - UREG64 __p;\ | |
| 328 | - __p.l.v1 = PARAM1;\ | |
| 329 | - __p.l.v0 = PARAM2;\ | |
| 330 | - __p.q;\ | |
| 331 | -}) | |
| 332 | - | |
| 333 | 242 | #ifdef TARGET_X86_64 |
| 334 | 243 | |
| 335 | 244 | void OPPROTO op_addq_A0_AL(void) | ... | ... |
target-i386/ops_template.h
| ... | ... | @@ -415,36 +415,6 @@ void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void) |
| 415 | 415 | T0 = ((DATA_STYPE)src1 <= (DATA_STYPE)src2); |
| 416 | 416 | } |
| 417 | 417 | |
| 418 | -/* shifts */ | |
| 419 | - | |
| 420 | -void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void) | |
| 421 | -{ | |
| 422 | - int count; | |
| 423 | - count = T1 & SHIFT1_MASK; | |
| 424 | - T0 = T0 << count; | |
| 425 | - FORCE_RET(); | |
| 426 | -} | |
| 427 | - | |
| 428 | -void OPPROTO glue(glue(op_shr, SUFFIX), _T0_T1)(void) | |
| 429 | -{ | |
| 430 | - int count; | |
| 431 | - count = T1 & SHIFT1_MASK; | |
| 432 | - T0 &= DATA_MASK; | |
| 433 | - T0 = T0 >> count; | |
| 434 | - FORCE_RET(); | |
| 435 | -} | |
| 436 | - | |
| 437 | -void OPPROTO glue(glue(op_sar, SUFFIX), _T0_T1)(void) | |
| 438 | -{ | |
| 439 | - int count; | |
| 440 | - target_long src; | |
| 441 | - | |
| 442 | - count = T1 & SHIFT1_MASK; | |
| 443 | - src = (DATA_STYPE)T0; | |
| 444 | - T0 = src >> count; | |
| 445 | - FORCE_RET(); | |
| 446 | -} | |
| 447 | - | |
| 448 | 418 | #undef MEM_WRITE |
| 449 | 419 | #include "ops_template_mem.h" |
| 450 | 420 | ... | ... |
target-i386/ops_template_mem.h
| ... | ... | @@ -68,370 +68,6 @@ |
| 68 | 68 | |
| 69 | 69 | #endif |
| 70 | 70 | |
| 71 | -void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 72 | -{ | |
| 73 | - int count; | |
| 74 | - target_long src; | |
| 75 | - | |
| 76 | - if (T1 & SHIFT1_MASK) { | |
| 77 | - count = T1 & SHIFT_MASK; | |
| 78 | - src = T0; | |
| 79 | - T0 &= DATA_MASK; | |
| 80 | - T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); | |
| 81 | -#ifdef MEM_WRITE | |
| 82 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 83 | -#else | |
| 84 | - /* gcc 3.2 workaround. This is really a bug in gcc. */ | |
| 85 | - asm volatile("" : : "r" (T0)); | |
| 86 | -#endif | |
| 87 | - CC_SRC = (cc_table[CC_OP].compute_all() & ~(CC_O | CC_C)) | | |
| 88 | - (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 89 | - (T0 & CC_C); | |
| 90 | - CC_OP = CC_OP_EFLAGS; | |
| 91 | - } | |
| 92 | - FORCE_RET(); | |
| 93 | -} | |
| 94 | - | |
| 95 | -void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 96 | -{ | |
| 97 | - int count; | |
| 98 | - target_long src; | |
| 99 | - | |
| 100 | - if (T1 & SHIFT1_MASK) { | |
| 101 | - count = T1 & SHIFT_MASK; | |
| 102 | - src = T0; | |
| 103 | - T0 &= DATA_MASK; | |
| 104 | - T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); | |
| 105 | -#ifdef MEM_WRITE | |
| 106 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 107 | -#else | |
| 108 | - /* gcc 3.2 workaround. This is really a bug in gcc. */ | |
| 109 | - asm volatile("" : : "r" (T0)); | |
| 110 | -#endif | |
| 111 | - CC_SRC = (cc_table[CC_OP].compute_all() & ~(CC_O | CC_C)) | | |
| 112 | - (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 113 | - ((T0 >> (DATA_BITS - 1)) & CC_C); | |
| 114 | - CC_OP = CC_OP_EFLAGS; | |
| 115 | - } | |
| 116 | - FORCE_RET(); | |
| 117 | -} | |
| 118 | - | |
| 119 | -void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1)(void) | |
| 120 | -{ | |
| 121 | - int count; | |
| 122 | - count = T1 & SHIFT_MASK; | |
| 123 | - if (count) { | |
| 124 | - T0 &= DATA_MASK; | |
| 125 | - T0 = (T0 << count) | (T0 >> (DATA_BITS - count)); | |
| 126 | -#ifdef MEM_WRITE | |
| 127 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 128 | -#endif | |
| 129 | - } | |
| 130 | - FORCE_RET(); | |
| 131 | -} | |
| 132 | - | |
| 133 | -void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1)(void) | |
| 134 | -{ | |
| 135 | - int count; | |
| 136 | - count = T1 & SHIFT_MASK; | |
| 137 | - if (count) { | |
| 138 | - T0 &= DATA_MASK; | |
| 139 | - T0 = (T0 >> count) | (T0 << (DATA_BITS - count)); | |
| 140 | -#ifdef MEM_WRITE | |
| 141 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 142 | -#endif | |
| 143 | - } | |
| 144 | - FORCE_RET(); | |
| 145 | -} | |
| 146 | - | |
| 147 | -void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 148 | -{ | |
| 149 | - int count, eflags; | |
| 150 | - target_ulong src; | |
| 151 | - target_long res; | |
| 152 | - | |
| 153 | - count = T1 & SHIFT1_MASK; | |
| 154 | -#if DATA_BITS == 16 | |
| 155 | - count = rclw_table[count]; | |
| 156 | -#elif DATA_BITS == 8 | |
| 157 | - count = rclb_table[count]; | |
| 158 | -#endif | |
| 159 | - if (count) { | |
| 160 | - eflags = cc_table[CC_OP].compute_all(); | |
| 161 | - T0 &= DATA_MASK; | |
| 162 | - src = T0; | |
| 163 | - res = (T0 << count) | ((target_ulong)(eflags & CC_C) << (count - 1)); | |
| 164 | - if (count > 1) | |
| 165 | - res |= T0 >> (DATA_BITS + 1 - count); | |
| 166 | - T0 = res; | |
| 167 | -#ifdef MEM_WRITE | |
| 168 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 169 | -#endif | |
| 170 | - CC_SRC = (eflags & ~(CC_C | CC_O)) | | |
| 171 | - (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 172 | - ((src >> (DATA_BITS - count)) & CC_C); | |
| 173 | - CC_OP = CC_OP_EFLAGS; | |
| 174 | - } | |
| 175 | - FORCE_RET(); | |
| 176 | -} | |
| 177 | - | |
| 178 | -void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 179 | -{ | |
| 180 | - int count, eflags; | |
| 181 | - target_ulong src; | |
| 182 | - target_long res; | |
| 183 | - | |
| 184 | - count = T1 & SHIFT1_MASK; | |
| 185 | -#if DATA_BITS == 16 | |
| 186 | - count = rclw_table[count]; | |
| 187 | -#elif DATA_BITS == 8 | |
| 188 | - count = rclb_table[count]; | |
| 189 | -#endif | |
| 190 | - if (count) { | |
| 191 | - eflags = cc_table[CC_OP].compute_all(); | |
| 192 | - T0 &= DATA_MASK; | |
| 193 | - src = T0; | |
| 194 | - res = (T0 >> count) | ((target_ulong)(eflags & CC_C) << (DATA_BITS - count)); | |
| 195 | - if (count > 1) | |
| 196 | - res |= T0 << (DATA_BITS + 1 - count); | |
| 197 | - T0 = res; | |
| 198 | -#ifdef MEM_WRITE | |
| 199 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 200 | -#endif | |
| 201 | - CC_SRC = (eflags & ~(CC_C | CC_O)) | | |
| 202 | - (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) | | |
| 203 | - ((src >> (count - 1)) & CC_C); | |
| 204 | - CC_OP = CC_OP_EFLAGS; | |
| 205 | - } | |
| 206 | - FORCE_RET(); | |
| 207 | -} | |
| 208 | - | |
| 209 | -void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 210 | -{ | |
| 211 | - int count; | |
| 212 | - target_long src; | |
| 213 | - | |
| 214 | - count = T1 & SHIFT1_MASK; | |
| 215 | - if (count) { | |
| 216 | - src = (DATA_TYPE)T0 << (count - 1); | |
| 217 | - T0 = T0 << count; | |
| 218 | -#ifdef MEM_WRITE | |
| 219 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 220 | -#endif | |
| 221 | - CC_SRC = src; | |
| 222 | - CC_DST = T0; | |
| 223 | - CC_OP = CC_OP_SHLB + SHIFT; | |
| 224 | - } | |
| 225 | - FORCE_RET(); | |
| 226 | -} | |
| 227 | - | |
| 228 | -void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 229 | -{ | |
| 230 | - int count; | |
| 231 | - target_long src; | |
| 232 | - | |
| 233 | - count = T1 & SHIFT1_MASK; | |
| 234 | - if (count) { | |
| 235 | - T0 &= DATA_MASK; | |
| 236 | - src = T0 >> (count - 1); | |
| 237 | - T0 = T0 >> count; | |
| 238 | -#ifdef MEM_WRITE | |
| 239 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 240 | -#endif | |
| 241 | - CC_SRC = src; | |
| 242 | - CC_DST = T0; | |
| 243 | - CC_OP = CC_OP_SARB + SHIFT; | |
| 244 | - } | |
| 245 | - FORCE_RET(); | |
| 246 | -} | |
| 247 | - | |
| 248 | -void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void) | |
| 249 | -{ | |
| 250 | - int count; | |
| 251 | - target_long src; | |
| 252 | - | |
| 253 | - count = T1 & SHIFT1_MASK; | |
| 254 | - if (count) { | |
| 255 | - src = (DATA_STYPE)T0; | |
| 256 | - T0 = src >> count; | |
| 257 | - src = src >> (count - 1); | |
| 258 | -#ifdef MEM_WRITE | |
| 259 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 260 | -#endif | |
| 261 | - CC_SRC = src; | |
| 262 | - CC_DST = T0; | |
| 263 | - CC_OP = CC_OP_SARB + SHIFT; | |
| 264 | - } | |
| 265 | - FORCE_RET(); | |
| 266 | -} | |
| 267 | - | |
| 268 | -#if DATA_BITS == 16 | |
| 269 | -/* XXX: overflow flag might be incorrect in some cases in shldw */ | |
| 270 | -void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void) | |
| 271 | -{ | |
| 272 | - int count; | |
| 273 | - unsigned int res, tmp; | |
| 274 | - count = PARAM1; | |
| 275 | - T1 &= 0xffff; | |
| 276 | - res = T1 | (T0 << 16); | |
| 277 | - tmp = res >> (32 - count); | |
| 278 | - res <<= count; | |
| 279 | - if (count > 16) | |
| 280 | - res |= T1 << (count - 16); | |
| 281 | - T0 = res >> 16; | |
| 282 | -#ifdef MEM_WRITE | |
| 283 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 284 | -#endif | |
| 285 | - CC_SRC = tmp; | |
| 286 | - CC_DST = T0; | |
| 287 | -} | |
| 288 | - | |
| 289 | -void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void) | |
| 290 | -{ | |
| 291 | - int count; | |
| 292 | - unsigned int res, tmp; | |
| 293 | - count = ECX & 0x1f; | |
| 294 | - if (count) { | |
| 295 | - T1 &= 0xffff; | |
| 296 | - res = T1 | (T0 << 16); | |
| 297 | - tmp = res >> (32 - count); | |
| 298 | - res <<= count; | |
| 299 | - if (count > 16) | |
| 300 | - res |= T1 << (count - 16); | |
| 301 | - T0 = res >> 16; | |
| 302 | -#ifdef MEM_WRITE | |
| 303 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 304 | -#endif | |
| 305 | - CC_SRC = tmp; | |
| 306 | - CC_DST = T0; | |
| 307 | - CC_OP = CC_OP_SARB + SHIFT; | |
| 308 | - } | |
| 309 | - FORCE_RET(); | |
| 310 | -} | |
| 311 | - | |
| 312 | -void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void) | |
| 313 | -{ | |
| 314 | - int count; | |
| 315 | - unsigned int res, tmp; | |
| 316 | - | |
| 317 | - count = PARAM1; | |
| 318 | - res = (T0 & 0xffff) | (T1 << 16); | |
| 319 | - tmp = res >> (count - 1); | |
| 320 | - res >>= count; | |
| 321 | - if (count > 16) | |
| 322 | - res |= T1 << (32 - count); | |
| 323 | - T0 = res; | |
| 324 | -#ifdef MEM_WRITE | |
| 325 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 326 | -#endif | |
| 327 | - CC_SRC = tmp; | |
| 328 | - CC_DST = T0; | |
| 329 | -} | |
| 330 | - | |
| 331 | - | |
| 332 | -void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void) | |
| 333 | -{ | |
| 334 | - int count; | |
| 335 | - unsigned int res, tmp; | |
| 336 | - | |
| 337 | - count = ECX & 0x1f; | |
| 338 | - if (count) { | |
| 339 | - res = (T0 & 0xffff) | (T1 << 16); | |
| 340 | - tmp = res >> (count - 1); | |
| 341 | - res >>= count; | |
| 342 | - if (count > 16) | |
| 343 | - res |= T1 << (32 - count); | |
| 344 | - T0 = res; | |
| 345 | -#ifdef MEM_WRITE | |
| 346 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 347 | -#endif | |
| 348 | - CC_SRC = tmp; | |
| 349 | - CC_DST = T0; | |
| 350 | - CC_OP = CC_OP_SARB + SHIFT; | |
| 351 | - } | |
| 352 | - FORCE_RET(); | |
| 353 | -} | |
| 354 | -#endif | |
| 355 | - | |
| 356 | -#if DATA_BITS >= 32 | |
| 357 | -void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void) | |
| 358 | -{ | |
| 359 | - int count; | |
| 360 | - target_long tmp; | |
| 361 | - | |
| 362 | - count = PARAM1; | |
| 363 | - T0 &= DATA_MASK; | |
| 364 | - T1 &= DATA_MASK; | |
| 365 | - tmp = T0 << (count - 1); | |
| 366 | - T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); | |
| 367 | -#ifdef MEM_WRITE | |
| 368 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 369 | -#endif | |
| 370 | - CC_SRC = tmp; | |
| 371 | - CC_DST = T0; | |
| 372 | -} | |
| 373 | - | |
| 374 | -void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void) | |
| 375 | -{ | |
| 376 | - int count; | |
| 377 | - target_long tmp; | |
| 378 | - | |
| 379 | - count = ECX & SHIFT1_MASK; | |
| 380 | - if (count) { | |
| 381 | - T0 &= DATA_MASK; | |
| 382 | - T1 &= DATA_MASK; | |
| 383 | - tmp = T0 << (count - 1); | |
| 384 | - T0 = (T0 << count) | (T1 >> (DATA_BITS - count)); | |
| 385 | -#ifdef MEM_WRITE | |
| 386 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 387 | -#endif | |
| 388 | - CC_SRC = tmp; | |
| 389 | - CC_DST = T0; | |
| 390 | - CC_OP = CC_OP_SHLB + SHIFT; | |
| 391 | - } | |
| 392 | - FORCE_RET(); | |
| 393 | -} | |
| 394 | - | |
| 395 | -void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void) | |
| 396 | -{ | |
| 397 | - int count; | |
| 398 | - target_long tmp; | |
| 399 | - | |
| 400 | - count = PARAM1; | |
| 401 | - T0 &= DATA_MASK; | |
| 402 | - T1 &= DATA_MASK; | |
| 403 | - tmp = T0 >> (count - 1); | |
| 404 | - T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); | |
| 405 | -#ifdef MEM_WRITE | |
| 406 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 407 | -#endif | |
| 408 | - CC_SRC = tmp; | |
| 409 | - CC_DST = T0; | |
| 410 | -} | |
| 411 | - | |
| 412 | - | |
| 413 | -void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void) | |
| 414 | -{ | |
| 415 | - int count; | |
| 416 | - target_long tmp; | |
| 417 | - | |
| 418 | - count = ECX & SHIFT1_MASK; | |
| 419 | - if (count) { | |
| 420 | - T0 &= DATA_MASK; | |
| 421 | - T1 &= DATA_MASK; | |
| 422 | - tmp = T0 >> (count - 1); | |
| 423 | - T0 = (T0 >> count) | (T1 << (DATA_BITS - count)); | |
| 424 | -#ifdef MEM_WRITE | |
| 425 | - glue(st, MEM_SUFFIX)(A0, T0); | |
| 426 | -#endif | |
| 427 | - CC_SRC = tmp; | |
| 428 | - CC_DST = T0; | |
| 429 | - CC_OP = CC_OP_SARB + SHIFT; | |
| 430 | - } | |
| 431 | - FORCE_RET(); | |
| 432 | -} | |
| 433 | -#endif | |
| 434 | - | |
| 435 | 71 | /* carry add/sub (we only need to set CC_OP differently) */ |
| 436 | 72 | |
| 437 | 73 | void OPPROTO glue(glue(op_adc, MEM_SUFFIX), _T0_T1_cc)(void) | ... | ... |
target-i386/translate.c
| ... | ... | @@ -58,9 +58,11 @@ |
| 58 | 58 | //#define MACRO_TEST 1 |
| 59 | 59 | |
| 60 | 60 | /* global register indexes */ |
| 61 | -static TCGv cpu_env, cpu_T[2], cpu_A0; | |
| 61 | +static TCGv cpu_env, cpu_T[2], cpu_A0, cpu_cc_op, cpu_cc_src, cpu_cc_dst; | |
| 62 | +static TCGv cpu_T3; | |
| 62 | 63 | /* local register indexes (only used inside old micro ops) */ |
| 63 | -static TCGv cpu_tmp0, cpu_tmp1, cpu_tmp2, cpu_tmp3, cpu_ptr0, cpu_ptr1; | |
| 64 | +static TCGv cpu_tmp0, cpu_tmp1_i64, cpu_tmp2_i32, cpu_tmp3_i32, cpu_tmp4, cpu_ptr0, cpu_ptr1; | |
| 65 | +static TCGv cpu_tmp5, cpu_tmp6; | |
| 64 | 66 | |
| 65 | 67 | #ifdef TARGET_X86_64 |
| 66 | 68 | static int x86_64_hregs; |
| ... | ... | @@ -428,8 +430,7 @@ static inline void gen_op_addq_ESP_im(int32_t val) |
| 428 | 430 | |
| 429 | 431 | static inline void gen_op_set_cc_op(int32_t val) |
| 430 | 432 | { |
| 431 | - tcg_gen_movi_tl(cpu_tmp0, val); | |
| 432 | - tcg_gen_st32_tl(cpu_tmp0, cpu_env, offsetof(CPUState, cc_op)); | |
| 433 | + tcg_gen_movi_i32(cpu_cc_op, val); | |
| 433 | 434 | } |
| 434 | 435 | |
| 435 | 436 | static inline void gen_op_addl_A0_reg_sN(int shift, int reg) |
| ... | ... | @@ -556,102 +557,6 @@ static GenOpFunc *gen_op_cmpxchg_mem_T0_T1_EAX_cc[3 * 4] = { |
| 556 | 557 | #endif |
| 557 | 558 | }; |
| 558 | 559 | |
| 559 | -#define DEF_SHIFT(SUFFIX)\ | |
| 560 | - {\ | |
| 561 | - gen_op_rolb ## SUFFIX ## _T0_T1_cc,\ | |
| 562 | - gen_op_rorb ## SUFFIX ## _T0_T1_cc,\ | |
| 563 | - gen_op_rclb ## SUFFIX ## _T0_T1_cc,\ | |
| 564 | - gen_op_rcrb ## SUFFIX ## _T0_T1_cc,\ | |
| 565 | - gen_op_shlb ## SUFFIX ## _T0_T1_cc,\ | |
| 566 | - gen_op_shrb ## SUFFIX ## _T0_T1_cc,\ | |
| 567 | - gen_op_shlb ## SUFFIX ## _T0_T1_cc,\ | |
| 568 | - gen_op_sarb ## SUFFIX ## _T0_T1_cc,\ | |
| 569 | - },\ | |
| 570 | - {\ | |
| 571 | - gen_op_rolw ## SUFFIX ## _T0_T1_cc,\ | |
| 572 | - gen_op_rorw ## SUFFIX ## _T0_T1_cc,\ | |
| 573 | - gen_op_rclw ## SUFFIX ## _T0_T1_cc,\ | |
| 574 | - gen_op_rcrw ## SUFFIX ## _T0_T1_cc,\ | |
| 575 | - gen_op_shlw ## SUFFIX ## _T0_T1_cc,\ | |
| 576 | - gen_op_shrw ## SUFFIX ## _T0_T1_cc,\ | |
| 577 | - gen_op_shlw ## SUFFIX ## _T0_T1_cc,\ | |
| 578 | - gen_op_sarw ## SUFFIX ## _T0_T1_cc,\ | |
| 579 | - },\ | |
| 580 | - {\ | |
| 581 | - gen_op_roll ## SUFFIX ## _T0_T1_cc,\ | |
| 582 | - gen_op_rorl ## SUFFIX ## _T0_T1_cc,\ | |
| 583 | - gen_op_rcll ## SUFFIX ## _T0_T1_cc,\ | |
| 584 | - gen_op_rcrl ## SUFFIX ## _T0_T1_cc,\ | |
| 585 | - gen_op_shll ## SUFFIX ## _T0_T1_cc,\ | |
| 586 | - gen_op_shrl ## SUFFIX ## _T0_T1_cc,\ | |
| 587 | - gen_op_shll ## SUFFIX ## _T0_T1_cc,\ | |
| 588 | - gen_op_sarl ## SUFFIX ## _T0_T1_cc,\ | |
| 589 | - },\ | |
| 590 | - {\ | |
| 591 | - X86_64_ONLY(gen_op_rolq ## SUFFIX ## _T0_T1_cc),\ | |
| 592 | - X86_64_ONLY(gen_op_rorq ## SUFFIX ## _T0_T1_cc),\ | |
| 593 | - X86_64_ONLY(gen_op_rclq ## SUFFIX ## _T0_T1_cc),\ | |
| 594 | - X86_64_ONLY(gen_op_rcrq ## SUFFIX ## _T0_T1_cc),\ | |
| 595 | - X86_64_ONLY(gen_op_shlq ## SUFFIX ## _T0_T1_cc),\ | |
| 596 | - X86_64_ONLY(gen_op_shrq ## SUFFIX ## _T0_T1_cc),\ | |
| 597 | - X86_64_ONLY(gen_op_shlq ## SUFFIX ## _T0_T1_cc),\ | |
| 598 | - X86_64_ONLY(gen_op_sarq ## SUFFIX ## _T0_T1_cc),\ | |
| 599 | - }, | |
| 600 | - | |
| 601 | -static GenOpFunc *gen_op_shift_T0_T1_cc[4][8] = { | |
| 602 | - DEF_SHIFT( ) | |
| 603 | -}; | |
| 604 | - | |
| 605 | -static GenOpFunc *gen_op_shift_mem_T0_T1_cc[3 * 4][8] = { | |
| 606 | - DEF_SHIFT(_raw) | |
| 607 | -#ifndef CONFIG_USER_ONLY | |
| 608 | - DEF_SHIFT(_kernel) | |
| 609 | - DEF_SHIFT(_user) | |
| 610 | -#endif | |
| 611 | -}; | |
| 612 | - | |
| 613 | -#define DEF_SHIFTD(SUFFIX, op)\ | |
| 614 | - {\ | |
| 615 | - NULL,\ | |
| 616 | - NULL,\ | |
| 617 | - },\ | |
| 618 | - {\ | |
| 619 | - gen_op_shldw ## SUFFIX ## _T0_T1_ ## op ## _cc,\ | |
| 620 | - gen_op_shrdw ## SUFFIX ## _T0_T1_ ## op ## _cc,\ | |
| 621 | - },\ | |
| 622 | - {\ | |
| 623 | - gen_op_shldl ## SUFFIX ## _T0_T1_ ## op ## _cc,\ | |
| 624 | - gen_op_shrdl ## SUFFIX ## _T0_T1_ ## op ## _cc,\ | |
| 625 | - },\ | |
| 626 | - {\ | |
| 627 | -X86_64_DEF(gen_op_shldq ## SUFFIX ## _T0_T1_ ## op ## _cc,\ | |
| 628 | - gen_op_shrdq ## SUFFIX ## _T0_T1_ ## op ## _cc,)\ | |
| 629 | - }, | |
| 630 | - | |
| 631 | -static GenOpFunc1 *gen_op_shiftd_T0_T1_im_cc[4][2] = { | |
| 632 | - DEF_SHIFTD(, im) | |
| 633 | -}; | |
| 634 | - | |
| 635 | -static GenOpFunc *gen_op_shiftd_T0_T1_ECX_cc[4][2] = { | |
| 636 | - DEF_SHIFTD(, ECX) | |
| 637 | -}; | |
| 638 | - | |
| 639 | -static GenOpFunc1 *gen_op_shiftd_mem_T0_T1_im_cc[3 * 4][2] = { | |
| 640 | - DEF_SHIFTD(_raw, im) | |
| 641 | -#ifndef CONFIG_USER_ONLY | |
| 642 | - DEF_SHIFTD(_kernel, im) | |
| 643 | - DEF_SHIFTD(_user, im) | |
| 644 | -#endif | |
| 645 | -}; | |
| 646 | - | |
| 647 | -static GenOpFunc *gen_op_shiftd_mem_T0_T1_ECX_cc[3 * 4][2] = { | |
| 648 | - DEF_SHIFTD(_raw, ECX) | |
| 649 | -#ifndef CONFIG_USER_ONLY | |
| 650 | - DEF_SHIFTD(_kernel, ECX) | |
| 651 | - DEF_SHIFTD(_user, ECX) | |
| 652 | -#endif | |
| 653 | -}; | |
| 654 | - | |
| 655 | 560 | static GenOpFunc *gen_op_btx_T0_T1_cc[3][4] = { |
| 656 | 561 | [0] = { |
| 657 | 562 | gen_op_btw_T0_T1_cc, |
| ... | ... | @@ -933,9 +838,9 @@ static void gen_check_io(DisasContext *s, int ot, target_ulong cur_eip, |
| 933 | 838 | gen_op_set_cc_op(s->cc_op); |
| 934 | 839 | gen_jmp_im(cur_eip); |
| 935 | 840 | state_saved = 1; |
| 936 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 841 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 937 | 842 | tcg_gen_helper_0_1(gen_check_io_func[ot], |
| 938 | - cpu_tmp2); | |
| 843 | + cpu_tmp2_i32); | |
| 939 | 844 | } |
| 940 | 845 | if(s->flags & (1ULL << INTERCEPT_IOIO_PROT)) { |
| 941 | 846 | if (!state_saved) { |
| ... | ... | @@ -946,9 +851,9 @@ static void gen_check_io(DisasContext *s, int ot, target_ulong cur_eip, |
| 946 | 851 | } |
| 947 | 852 | svm_flags |= (1 << (4 + ot)); |
| 948 | 853 | next_eip = s->pc - s->cs_base; |
| 949 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 854 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 950 | 855 | tcg_gen_helper_0_3(helper_svm_check_io, |
| 951 | - cpu_tmp2, | |
| 856 | + cpu_tmp2_i32, | |
| 952 | 857 | tcg_const_i32(svm_flags), |
| 953 | 858 | tcg_const_i32(next_eip - cur_eip)); |
| 954 | 859 | } |
| ... | ... | @@ -984,6 +889,36 @@ static inline void gen_update_cc_op(DisasContext *s) |
| 984 | 889 | } |
| 985 | 890 | } |
| 986 | 891 | |
| 892 | +static void gen_op_update1_cc(void) | |
| 893 | +{ | |
| 894 | + tcg_gen_discard_tl(cpu_cc_src); | |
| 895 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 896 | +} | |
| 897 | + | |
| 898 | +static void gen_op_update2_cc(void) | |
| 899 | +{ | |
| 900 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]); | |
| 901 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 902 | +} | |
| 903 | + | |
| 904 | +static inline void gen_op_cmpl_T0_T1_cc(void) | |
| 905 | +{ | |
| 906 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]); | |
| 907 | + tcg_gen_sub_tl(cpu_cc_dst, cpu_T[0], cpu_T[1]); | |
| 908 | +} | |
| 909 | + | |
| 910 | +static inline void gen_op_testl_T0_T1_cc(void) | |
| 911 | +{ | |
| 912 | + tcg_gen_discard_tl(cpu_cc_src); | |
| 913 | + tcg_gen_and_tl(cpu_cc_dst, cpu_T[0], cpu_T[1]); | |
| 914 | +} | |
| 915 | + | |
| 916 | +static void gen_op_update_neg_cc(void) | |
| 917 | +{ | |
| 918 | + tcg_gen_neg_tl(cpu_cc_src, cpu_T[0]); | |
| 919 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 920 | +} | |
| 921 | + | |
| 987 | 922 | /* XXX: does not work with gdbstub "ice" single step - not a |
| 988 | 923 | serious problem */ |
| 989 | 924 | static int gen_jz_ecx_string(DisasContext *s, target_ulong next_eip) |
| ... | ... | @@ -1083,9 +1018,9 @@ static inline void gen_ins(DisasContext *s, int ot) |
| 1083 | 1018 | gen_op_movl_T0_0(); |
| 1084 | 1019 | gen_op_st_T0_A0(ot + s->mem_index); |
| 1085 | 1020 | gen_op_mov_TN_reg(OT_WORD, 1, R_EDX); |
| 1086 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[1]); | |
| 1087 | - tcg_gen_andi_i32(cpu_tmp2, cpu_tmp2, 0xffff); | |
| 1088 | - tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[0], cpu_tmp2); | |
| 1021 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[1]); | |
| 1022 | + tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); | |
| 1023 | + tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[0], cpu_tmp2_i32); | |
| 1089 | 1024 | gen_op_st_T0_A0(ot + s->mem_index); |
| 1090 | 1025 | gen_op_movl_T0_Dshift[ot](); |
| 1091 | 1026 | #ifdef TARGET_X86_64 |
| ... | ... | @@ -1106,10 +1041,10 @@ static inline void gen_outs(DisasContext *s, int ot) |
| 1106 | 1041 | gen_op_ld_T0_A0(ot + s->mem_index); |
| 1107 | 1042 | |
| 1108 | 1043 | gen_op_mov_TN_reg(OT_WORD, 1, R_EDX); |
| 1109 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[1]); | |
| 1110 | - tcg_gen_andi_i32(cpu_tmp2, cpu_tmp2, 0xffff); | |
| 1111 | - tcg_gen_trunc_tl_i32(cpu_tmp3, cpu_T[0]); | |
| 1112 | - tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2, cpu_tmp3); | |
| 1044 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[1]); | |
| 1045 | + tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); | |
| 1046 | + tcg_gen_trunc_tl_i32(cpu_tmp3_i32, cpu_T[0]); | |
| 1047 | + tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2_i32, cpu_tmp3_i32); | |
| 1113 | 1048 | |
| 1114 | 1049 | gen_op_movl_T0_Dshift[ot](); |
| 1115 | 1050 | #ifdef TARGET_X86_64 |
| ... | ... | @@ -1390,6 +1325,50 @@ static void gen_op(DisasContext *s1, int op, int ot, int d) |
| 1390 | 1325 | the_end: ; |
| 1391 | 1326 | } |
| 1392 | 1327 | |
| 1328 | +/* compute eflags.C to reg */ | |
| 1329 | +static void gen_compute_eflags_c(TCGv reg) | |
| 1330 | +{ | |
| 1331 | +#if TCG_TARGET_REG_BITS == 32 | |
| 1332 | + tcg_gen_shli_i32(cpu_tmp2_i32, cpu_cc_op, 3); | |
| 1333 | + tcg_gen_addi_i32(cpu_tmp2_i32, cpu_tmp2_i32, | |
| 1334 | + (long)cc_table + offsetof(CCTable, compute_c)); | |
| 1335 | + tcg_gen_ld_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0); | |
| 1336 | + tcg_gen_call(&tcg_ctx, cpu_tmp2_i32, TCG_CALL_PURE, | |
| 1337 | + 1, ®, 0, NULL); | |
| 1338 | +#else | |
| 1339 | + tcg_gen_extu_i32_tl(cpu_tmp1_i64, cpu_cc_op); | |
| 1340 | + tcg_gen_shli_i64(cpu_tmp1_i64, cpu_tmp1_i64, 4); | |
| 1341 | + tcg_gen_addi_i64(cpu_tmp1_i64, cpu_tmp1_i64, | |
| 1342 | + (long)cc_table + offsetof(CCTable, compute_c)); | |
| 1343 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_tmp1_i64, 0); | |
| 1344 | + tcg_gen_call(&tcg_ctx, cpu_tmp1_i64, TCG_CALL_PURE, | |
| 1345 | + 1, &cpu_tmp2_i32, 0, NULL); | |
| 1346 | + tcg_gen_extu_i32_tl(reg, cpu_tmp2_i32); | |
| 1347 | +#endif | |
| 1348 | +} | |
| 1349 | + | |
| 1350 | +/* compute all eflags to cc_src */ | |
| 1351 | +static void gen_compute_eflags(TCGv reg) | |
| 1352 | +{ | |
| 1353 | +#if TCG_TARGET_REG_BITS == 32 | |
| 1354 | + tcg_gen_shli_i32(cpu_tmp2_i32, cpu_cc_op, 3); | |
| 1355 | + tcg_gen_addi_i32(cpu_tmp2_i32, cpu_tmp2_i32, | |
| 1356 | + (long)cc_table + offsetof(CCTable, compute_all)); | |
| 1357 | + tcg_gen_ld_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0); | |
| 1358 | + tcg_gen_call(&tcg_ctx, cpu_tmp2_i32, TCG_CALL_PURE, | |
| 1359 | + 1, ®, 0, NULL); | |
| 1360 | +#else | |
| 1361 | + tcg_gen_extu_i32_tl(cpu_tmp1_i64, cpu_cc_op); | |
| 1362 | + tcg_gen_shli_i64(cpu_tmp1_i64, cpu_tmp1_i64, 4); | |
| 1363 | + tcg_gen_addi_i64(cpu_tmp1_i64, cpu_tmp1_i64, | |
| 1364 | + (long)cc_table + offsetof(CCTable, compute_all)); | |
| 1365 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_tmp1_i64, 0); | |
| 1366 | + tcg_gen_call(&tcg_ctx, cpu_tmp1_i64, TCG_CALL_PURE, | |
| 1367 | + 1, &cpu_tmp2_i32, 0, NULL); | |
| 1368 | + tcg_gen_extu_i32_tl(reg, cpu_tmp2_i32); | |
| 1369 | +#endif | |
| 1370 | +} | |
| 1371 | + | |
| 1393 | 1372 | /* if d == OR_TMP0, it means memory operand (address in A0) */ |
| 1394 | 1373 | static void gen_inc(DisasContext *s1, int ot, int d, int c) |
| 1395 | 1374 | { |
| ... | ... | @@ -1400,38 +1379,390 @@ static void gen_inc(DisasContext *s1, int ot, int d, int c) |
| 1400 | 1379 | if (s1->cc_op != CC_OP_DYNAMIC) |
| 1401 | 1380 | gen_op_set_cc_op(s1->cc_op); |
| 1402 | 1381 | if (c > 0) { |
| 1403 | - gen_op_incl_T0(); | |
| 1382 | + tcg_gen_addi_tl(cpu_T[0], cpu_T[0], 1); | |
| 1404 | 1383 | s1->cc_op = CC_OP_INCB + ot; |
| 1405 | 1384 | } else { |
| 1406 | - gen_op_decl_T0(); | |
| 1385 | + tcg_gen_addi_tl(cpu_T[0], cpu_T[0], -1); | |
| 1407 | 1386 | s1->cc_op = CC_OP_DECB + ot; |
| 1408 | 1387 | } |
| 1409 | 1388 | if (d != OR_TMP0) |
| 1410 | 1389 | gen_op_mov_reg_T0(ot, d); |
| 1411 | 1390 | else |
| 1412 | 1391 | gen_op_st_T0_A0(ot + s1->mem_index); |
| 1413 | - gen_op_update_inc_cc(); | |
| 1392 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 1393 | + gen_compute_eflags_c(cpu_cc_src); | |
| 1414 | 1394 | } |
| 1415 | 1395 | |
| 1416 | -static void gen_shift(DisasContext *s1, int op, int ot, int d, int s) | |
| 1396 | +/* XXX: add faster immediate case */ | |
| 1397 | +static void gen_shift_rm_T1(DisasContext *s, int ot, int op1, | |
| 1398 | + int is_right, int is_arith) | |
| 1417 | 1399 | { |
| 1418 | - if (d != OR_TMP0) | |
| 1419 | - gen_op_mov_TN_reg(ot, 0, d); | |
| 1400 | + target_ulong mask; | |
| 1401 | + int shift_label; | |
| 1402 | + | |
| 1403 | + if (ot == OT_QUAD) | |
| 1404 | + mask = 0x3f; | |
| 1420 | 1405 | else |
| 1421 | - gen_op_ld_T0_A0(ot + s1->mem_index); | |
| 1422 | - if (s != OR_TMP1) | |
| 1423 | - gen_op_mov_TN_reg(ot, 1, s); | |
| 1424 | - /* for zero counts, flags are not updated, so must do it dynamically */ | |
| 1425 | - if (s1->cc_op != CC_OP_DYNAMIC) | |
| 1426 | - gen_op_set_cc_op(s1->cc_op); | |
| 1406 | + mask = 0x1f; | |
| 1427 | 1407 | |
| 1428 | - if (d != OR_TMP0) | |
| 1429 | - gen_op_shift_T0_T1_cc[ot][op](); | |
| 1408 | + /* load */ | |
| 1409 | + if (op1 == OR_TMP0) | |
| 1410 | + gen_op_ld_T0_A0(ot + s->mem_index); | |
| 1430 | 1411 | else |
| 1431 | - gen_op_shift_mem_T0_T1_cc[ot + s1->mem_index][op](); | |
| 1432 | - if (d != OR_TMP0) | |
| 1433 | - gen_op_mov_reg_T0(ot, d); | |
| 1434 | - s1->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 1412 | + gen_op_mov_TN_reg(ot, 0, op1); | |
| 1413 | + | |
| 1414 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], mask); | |
| 1415 | + | |
| 1416 | + tcg_gen_addi_tl(cpu_tmp5, cpu_T[1], -1); | |
| 1417 | + | |
| 1418 | + if (is_right) { | |
| 1419 | + if (is_arith) { | |
| 1420 | + switch(ot) { | |
| 1421 | + case OT_BYTE: | |
| 1422 | + tcg_gen_ext8s_tl(cpu_T[0], cpu_T[0]); | |
| 1423 | + break; | |
| 1424 | + case OT_WORD: | |
| 1425 | + tcg_gen_ext16s_tl(cpu_T[0], cpu_T[0]); | |
| 1426 | + break; | |
| 1427 | + case OT_LONG: | |
| 1428 | + tcg_gen_ext32s_tl(cpu_T[0], cpu_T[0]); | |
| 1429 | + break; | |
| 1430 | + default: | |
| 1431 | + break; | |
| 1432 | + } | |
| 1433 | + tcg_gen_sar_tl(cpu_T3, cpu_T[0], cpu_tmp5); | |
| 1434 | + tcg_gen_sar_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1435 | + } else { | |
| 1436 | + switch(ot) { | |
| 1437 | + case OT_BYTE: | |
| 1438 | + tcg_gen_ext8u_tl(cpu_T[0], cpu_T[0]); | |
| 1439 | + break; | |
| 1440 | + case OT_WORD: | |
| 1441 | + tcg_gen_ext16u_tl(cpu_T[0], cpu_T[0]); | |
| 1442 | + break; | |
| 1443 | + case OT_LONG: | |
| 1444 | + tcg_gen_ext32u_tl(cpu_T[0], cpu_T[0]); | |
| 1445 | + break; | |
| 1446 | + default: | |
| 1447 | + break; | |
| 1448 | + } | |
| 1449 | + tcg_gen_shr_tl(cpu_T3, cpu_T[0], cpu_tmp5); | |
| 1450 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1451 | + } | |
| 1452 | + } else { | |
| 1453 | + tcg_gen_shl_tl(cpu_T3, cpu_T[0], cpu_tmp5); | |
| 1454 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1455 | + } | |
| 1456 | + | |
| 1457 | + /* store */ | |
| 1458 | + if (op1 == OR_TMP0) | |
| 1459 | + gen_op_st_T0_A0(ot + s->mem_index); | |
| 1460 | + else | |
| 1461 | + gen_op_mov_reg_T0(ot, op1); | |
| 1462 | + | |
| 1463 | + /* update eflags if non zero shift */ | |
| 1464 | + if (s->cc_op != CC_OP_DYNAMIC) | |
| 1465 | + gen_op_set_cc_op(s->cc_op); | |
| 1466 | + | |
| 1467 | + shift_label = gen_new_label(); | |
| 1468 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T[1], tcg_const_tl(0), shift_label); | |
| 1469 | + | |
| 1470 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T3); | |
| 1471 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 1472 | + if (is_right) | |
| 1473 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SARB + ot); | |
| 1474 | + else | |
| 1475 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SHLB + ot); | |
| 1476 | + | |
| 1477 | + gen_set_label(shift_label); | |
| 1478 | + s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 1479 | +} | |
| 1480 | + | |
| 1481 | +static inline void tcg_gen_lshift(TCGv ret, TCGv arg1, target_long arg2) | |
| 1482 | +{ | |
| 1483 | + if (arg2 >= 0) | |
| 1484 | + tcg_gen_shli_tl(ret, arg1, arg2); | |
| 1485 | + else | |
| 1486 | + tcg_gen_shri_tl(ret, arg1, -arg2); | |
| 1487 | +} | |
| 1488 | + | |
| 1489 | +/* XXX: add faster immediate case */ | |
| 1490 | +static void gen_rot_rm_T1(DisasContext *s, int ot, int op1, | |
| 1491 | + int is_right) | |
| 1492 | +{ | |
| 1493 | + target_ulong mask; | |
| 1494 | + int label1, label2, data_bits; | |
| 1495 | + | |
| 1496 | + if (ot == OT_QUAD) | |
| 1497 | + mask = 0x3f; | |
| 1498 | + else | |
| 1499 | + mask = 0x1f; | |
| 1500 | + | |
| 1501 | + /* load */ | |
| 1502 | + if (op1 == OR_TMP0) | |
| 1503 | + gen_op_ld_T0_A0(ot + s->mem_index); | |
| 1504 | + else | |
| 1505 | + gen_op_mov_TN_reg(ot, 0, op1); | |
| 1506 | + | |
| 1507 | + tcg_gen_andi_tl(cpu_T[1], cpu_T[1], mask); | |
| 1508 | + | |
| 1509 | + /* Must test zero case to avoid using undefined behaviour in TCG | |
| 1510 | + shifts. */ | |
| 1511 | + label1 = gen_new_label(); | |
| 1512 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T[1], tcg_const_tl(0), label1); | |
| 1513 | + | |
| 1514 | + if (ot <= OT_WORD) | |
| 1515 | + tcg_gen_andi_tl(cpu_tmp0, cpu_T[1], (1 << (3 + ot)) - 1); | |
| 1516 | + else | |
| 1517 | + tcg_gen_mov_tl(cpu_tmp0, cpu_T[1]); | |
| 1518 | + | |
| 1519 | + switch(ot) { | |
| 1520 | + case OT_BYTE: | |
| 1521 | + tcg_gen_ext8u_tl(cpu_T[0], cpu_T[0]); | |
| 1522 | + break; | |
| 1523 | + case OT_WORD: | |
| 1524 | + tcg_gen_ext16u_tl(cpu_T[0], cpu_T[0]); | |
| 1525 | + break; | |
| 1526 | + case OT_LONG: | |
| 1527 | + tcg_gen_ext32u_tl(cpu_T[0], cpu_T[0]); | |
| 1528 | + break; | |
| 1529 | + default: | |
| 1530 | + break; | |
| 1531 | + } | |
| 1532 | + tcg_gen_mov_tl(cpu_T3, cpu_T[0]); | |
| 1533 | + | |
| 1534 | + data_bits = 8 << ot; | |
| 1535 | + /* XXX: rely on behaviour of shifts when operand 2 overflows (XXX: | |
| 1536 | + fix TCG definition) */ | |
| 1537 | + if (is_right) { | |
| 1538 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_tmp0); | |
| 1539 | + tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(data_bits), cpu_tmp0); | |
| 1540 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 1541 | + } else { | |
| 1542 | + tcg_gen_shl_tl(cpu_tmp4, cpu_T[0], cpu_tmp0); | |
| 1543 | + tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(data_bits), cpu_tmp0); | |
| 1544 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 1545 | + } | |
| 1546 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp4); | |
| 1547 | + | |
| 1548 | + gen_set_label(label1); | |
| 1549 | + /* store */ | |
| 1550 | + if (op1 == OR_TMP0) | |
| 1551 | + gen_op_st_T0_A0(ot + s->mem_index); | |
| 1552 | + else | |
| 1553 | + gen_op_mov_reg_T0(ot, op1); | |
| 1554 | + | |
| 1555 | + /* update eflags */ | |
| 1556 | + if (s->cc_op != CC_OP_DYNAMIC) | |
| 1557 | + gen_op_set_cc_op(s->cc_op); | |
| 1558 | + | |
| 1559 | + label2 = gen_new_label(); | |
| 1560 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T[1], tcg_const_tl(0), label2); | |
| 1561 | + | |
| 1562 | + gen_compute_eflags(cpu_cc_src); | |
| 1563 | + tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~(CC_O | CC_C)); | |
| 1564 | + tcg_gen_xor_tl(cpu_tmp0, cpu_T3, cpu_T[0]); | |
| 1565 | + tcg_gen_lshift(cpu_tmp0, cpu_tmp0, 11 - (data_bits - 1)); | |
| 1566 | + tcg_gen_andi_tl(cpu_tmp0, cpu_tmp0, CC_O); | |
| 1567 | + tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_tmp0); | |
| 1568 | + if (is_right) { | |
| 1569 | + tcg_gen_shri_tl(cpu_T[0], cpu_T[0], data_bits - 1); | |
| 1570 | + } | |
| 1571 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], CC_C); | |
| 1572 | + tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, cpu_T[0]); | |
| 1573 | + | |
| 1574 | + tcg_gen_discard_tl(cpu_cc_dst); | |
| 1575 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS); | |
| 1576 | + | |
| 1577 | + gen_set_label(label2); | |
| 1578 | + s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 1579 | +} | |
| 1580 | + | |
| 1581 | +static void *helper_rotc[8] = { | |
| 1582 | + helper_rclb, | |
| 1583 | + helper_rclw, | |
| 1584 | + helper_rcll, | |
| 1585 | + X86_64_ONLY(helper_rclq), | |
| 1586 | + helper_rcrb, | |
| 1587 | + helper_rcrw, | |
| 1588 | + helper_rcrl, | |
| 1589 | + X86_64_ONLY(helper_rcrq), | |
| 1590 | +}; | |
| 1591 | + | |
| 1592 | +/* XXX: add faster immediate = 1 case */ | |
| 1593 | +static void gen_rotc_rm_T1(DisasContext *s, int ot, int op1, | |
| 1594 | + int is_right) | |
| 1595 | +{ | |
| 1596 | + int label1; | |
| 1597 | + | |
| 1598 | + if (s->cc_op != CC_OP_DYNAMIC) | |
| 1599 | + gen_op_set_cc_op(s->cc_op); | |
| 1600 | + | |
| 1601 | + /* load */ | |
| 1602 | + if (op1 == OR_TMP0) | |
| 1603 | + gen_op_ld_T0_A0(ot + s->mem_index); | |
| 1604 | + else | |
| 1605 | + gen_op_mov_TN_reg(ot, 0, op1); | |
| 1606 | + | |
| 1607 | + tcg_gen_helper_1_2(helper_rotc[ot + (is_right * 4)], | |
| 1608 | + cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1609 | + /* store */ | |
| 1610 | + if (op1 == OR_TMP0) | |
| 1611 | + gen_op_st_T0_A0(ot + s->mem_index); | |
| 1612 | + else | |
| 1613 | + gen_op_mov_reg_T0(ot, op1); | |
| 1614 | + | |
| 1615 | + /* update eflags */ | |
| 1616 | + label1 = gen_new_label(); | |
| 1617 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T3, tcg_const_tl(-1), label1); | |
| 1618 | + | |
| 1619 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T3); | |
| 1620 | + tcg_gen_discard_tl(cpu_cc_dst); | |
| 1621 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_EFLAGS); | |
| 1622 | + | |
| 1623 | + gen_set_label(label1); | |
| 1624 | + s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 1625 | +} | |
| 1626 | + | |
| 1627 | +/* XXX: add faster immediate case */ | |
| 1628 | +static void gen_shiftd_rm_T1_T3(DisasContext *s, int ot, int op1, | |
| 1629 | + int is_right) | |
| 1630 | +{ | |
| 1631 | + int label1, label2, data_bits; | |
| 1632 | + target_ulong mask; | |
| 1633 | + | |
| 1634 | + if (ot == OT_QUAD) | |
| 1635 | + mask = 0x3f; | |
| 1636 | + else | |
| 1637 | + mask = 0x1f; | |
| 1638 | + | |
| 1639 | + /* load */ | |
| 1640 | + if (op1 == OR_TMP0) | |
| 1641 | + gen_op_ld_T0_A0(ot + s->mem_index); | |
| 1642 | + else | |
| 1643 | + gen_op_mov_TN_reg(ot, 0, op1); | |
| 1644 | + | |
| 1645 | + tcg_gen_andi_tl(cpu_T3, cpu_T3, mask); | |
| 1646 | + /* Must test zero case to avoid using undefined behaviour in TCG | |
| 1647 | + shifts. */ | |
| 1648 | + label1 = gen_new_label(); | |
| 1649 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T3, tcg_const_tl(0), label1); | |
| 1650 | + | |
| 1651 | + tcg_gen_addi_tl(cpu_tmp5, cpu_T3, -1); | |
| 1652 | + if (ot == OT_WORD) { | |
| 1653 | + /* Note: we implement the Intel behaviour for shift count > 16 */ | |
| 1654 | + if (is_right) { | |
| 1655 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffff); | |
| 1656 | + tcg_gen_shli_tl(cpu_tmp0, cpu_T[1], 16); | |
| 1657 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 1658 | + tcg_gen_ext32u_tl(cpu_T[0], cpu_T[0]); | |
| 1659 | + | |
| 1660 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_tmp5); | |
| 1661 | + | |
| 1662 | + /* only needed if count > 16, but a test would complicate */ | |
| 1663 | + tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(32), cpu_T3); | |
| 1664 | + tcg_gen_shl_tl(cpu_tmp0, cpu_T[0], cpu_tmp5); | |
| 1665 | + | |
| 1666 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T3); | |
| 1667 | + | |
| 1668 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_tmp0); | |
| 1669 | + } else { | |
| 1670 | + /* XXX: not optimal */ | |
| 1671 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0xffff); | |
| 1672 | + tcg_gen_shli_tl(cpu_T[1], cpu_T[1], 16); | |
| 1673 | + tcg_gen_or_tl(cpu_T[1], cpu_T[1], cpu_T[0]); | |
| 1674 | + tcg_gen_ext32u_tl(cpu_T[1], cpu_T[1]); | |
| 1675 | + | |
| 1676 | + tcg_gen_shl_tl(cpu_tmp4, cpu_T[0], cpu_tmp5); | |
| 1677 | + tcg_gen_sub_tl(cpu_tmp0, tcg_const_tl(32), cpu_tmp5); | |
| 1678 | + tcg_gen_shr_tl(cpu_tmp6, cpu_T[1], cpu_tmp0); | |
| 1679 | + tcg_gen_or_tl(cpu_tmp4, cpu_tmp4, cpu_tmp6); | |
| 1680 | + | |
| 1681 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T3); | |
| 1682 | + tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(32), cpu_T3); | |
| 1683 | + tcg_gen_shr_tl(cpu_T[1], cpu_T[1], cpu_tmp5); | |
| 1684 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1685 | + } | |
| 1686 | + } else { | |
| 1687 | + data_bits = 8 << ot; | |
| 1688 | + if (is_right) { | |
| 1689 | + if (ot == OT_LONG) | |
| 1690 | + tcg_gen_ext32u_tl(cpu_T[0], cpu_T[0]); | |
| 1691 | + | |
| 1692 | + tcg_gen_shr_tl(cpu_tmp4, cpu_T[0], cpu_tmp5); | |
| 1693 | + | |
| 1694 | + tcg_gen_shr_tl(cpu_T[0], cpu_T[0], cpu_T3); | |
| 1695 | + tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(data_bits), cpu_T3); | |
| 1696 | + tcg_gen_shl_tl(cpu_T[1], cpu_T[1], cpu_tmp5); | |
| 1697 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1698 | + | |
| 1699 | + } else { | |
| 1700 | + if (ot == OT_LONG) | |
| 1701 | + tcg_gen_ext32u_tl(cpu_T[1], cpu_T[1]); | |
| 1702 | + | |
| 1703 | + tcg_gen_shl_tl(cpu_tmp4, cpu_T[0], cpu_tmp5); | |
| 1704 | + | |
| 1705 | + tcg_gen_shl_tl(cpu_T[0], cpu_T[0], cpu_T3); | |
| 1706 | + tcg_gen_sub_tl(cpu_tmp5, tcg_const_tl(data_bits), cpu_T3); | |
| 1707 | + tcg_gen_shr_tl(cpu_T[1], cpu_T[1], cpu_tmp5); | |
| 1708 | + tcg_gen_or_tl(cpu_T[0], cpu_T[0], cpu_T[1]); | |
| 1709 | + } | |
| 1710 | + } | |
| 1711 | + tcg_gen_mov_tl(cpu_T[1], cpu_tmp4); | |
| 1712 | + | |
| 1713 | + gen_set_label(label1); | |
| 1714 | + /* store */ | |
| 1715 | + if (op1 == OR_TMP0) | |
| 1716 | + gen_op_st_T0_A0(ot + s->mem_index); | |
| 1717 | + else | |
| 1718 | + gen_op_mov_reg_T0(ot, op1); | |
| 1719 | + | |
| 1720 | + /* update eflags */ | |
| 1721 | + if (s->cc_op != CC_OP_DYNAMIC) | |
| 1722 | + gen_op_set_cc_op(s->cc_op); | |
| 1723 | + | |
| 1724 | + label2 = gen_new_label(); | |
| 1725 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T3, tcg_const_tl(0), label2); | |
| 1726 | + | |
| 1727 | + tcg_gen_mov_tl(cpu_cc_src, cpu_T[1]); | |
| 1728 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_T[0]); | |
| 1729 | + if (is_right) { | |
| 1730 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SARB + ot); | |
| 1731 | + } else { | |
| 1732 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_SHLB + ot); | |
| 1733 | + } | |
| 1734 | + gen_set_label(label2); | |
| 1735 | + s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 1736 | +} | |
| 1737 | + | |
| 1738 | +static void gen_shift(DisasContext *s1, int op, int ot, int d, int s) | |
| 1739 | +{ | |
| 1740 | + if (s != OR_TMP1) | |
| 1741 | + gen_op_mov_TN_reg(ot, 1, s); | |
| 1742 | + switch(op) { | |
| 1743 | + case OP_ROL: | |
| 1744 | + gen_rot_rm_T1(s1, ot, d, 0); | |
| 1745 | + break; | |
| 1746 | + case OP_ROR: | |
| 1747 | + gen_rot_rm_T1(s1, ot, d, 1); | |
| 1748 | + break; | |
| 1749 | + case OP_SHL: | |
| 1750 | + case OP_SHL1: | |
| 1751 | + gen_shift_rm_T1(s1, ot, d, 0, 0); | |
| 1752 | + break; | |
| 1753 | + case OP_SHR: | |
| 1754 | + gen_shift_rm_T1(s1, ot, d, 1, 0); | |
| 1755 | + break; | |
| 1756 | + case OP_SAR: | |
| 1757 | + gen_shift_rm_T1(s1, ot, d, 1, 1); | |
| 1758 | + break; | |
| 1759 | + case OP_RCL: | |
| 1760 | + gen_rotc_rm_T1(s1, ot, d, 0); | |
| 1761 | + break; | |
| 1762 | + case OP_RCR: | |
| 1763 | + gen_rotc_rm_T1(s1, ot, d, 1); | |
| 1764 | + break; | |
| 1765 | + } | |
| 1435 | 1766 | } |
| 1436 | 1767 | |
| 1437 | 1768 | static void gen_shifti(DisasContext *s1, int op, int ot, int d, int c) |
| ... | ... | @@ -1987,8 +2318,8 @@ static void gen_movl_seg_T0(DisasContext *s, int seg_reg, target_ulong cur_eip) |
| 1987 | 2318 | if (s->cc_op != CC_OP_DYNAMIC) |
| 1988 | 2319 | gen_op_set_cc_op(s->cc_op); |
| 1989 | 2320 | gen_jmp_im(cur_eip); |
| 1990 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 1991 | - tcg_gen_helper_0_2(helper_load_seg, tcg_const_i32(seg_reg), cpu_tmp2); | |
| 2321 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 2322 | + tcg_gen_helper_0_2(helper_load_seg, tcg_const_i32(seg_reg), cpu_tmp2_i32); | |
| 1992 | 2323 | /* abort translation because the addseg value may change or |
| 1993 | 2324 | because ss32 may change. For R_SS, translation must always |
| 1994 | 2325 | stop as a special handling must be done to disable hardware |
| ... | ... | @@ -2373,61 +2704,61 @@ static void gen_jmp(DisasContext *s, target_ulong eip) |
| 2373 | 2704 | static inline void gen_ldq_env_A0(int idx, int offset) |
| 2374 | 2705 | { |
| 2375 | 2706 | int mem_index = (idx >> 2) - 1; |
| 2376 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_A0, mem_index); | |
| 2377 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, offset); | |
| 2707 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_A0, mem_index); | |
| 2708 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, offset); | |
| 2378 | 2709 | } |
| 2379 | 2710 | |
| 2380 | 2711 | static inline void gen_stq_env_A0(int idx, int offset) |
| 2381 | 2712 | { |
| 2382 | 2713 | int mem_index = (idx >> 2) - 1; |
| 2383 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, offset); | |
| 2384 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_A0, mem_index); | |
| 2714 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, offset); | |
| 2715 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_A0, mem_index); | |
| 2385 | 2716 | } |
| 2386 | 2717 | |
| 2387 | 2718 | static inline void gen_ldo_env_A0(int idx, int offset) |
| 2388 | 2719 | { |
| 2389 | 2720 | int mem_index = (idx >> 2) - 1; |
| 2390 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_A0, mem_index); | |
| 2391 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); | |
| 2721 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_A0, mem_index); | |
| 2722 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); | |
| 2392 | 2723 | tcg_gen_addi_tl(cpu_tmp0, cpu_A0, 8); |
| 2393 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_tmp0, mem_index); | |
| 2394 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); | |
| 2724 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_tmp0, mem_index); | |
| 2725 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); | |
| 2395 | 2726 | } |
| 2396 | 2727 | |
| 2397 | 2728 | static inline void gen_sto_env_A0(int idx, int offset) |
| 2398 | 2729 | { |
| 2399 | 2730 | int mem_index = (idx >> 2) - 1; |
| 2400 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); | |
| 2401 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_A0, mem_index); | |
| 2731 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(0))); | |
| 2732 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_A0, mem_index); | |
| 2402 | 2733 | tcg_gen_addi_tl(cpu_tmp0, cpu_A0, 8); |
| 2403 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); | |
| 2404 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_tmp0, mem_index); | |
| 2734 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, offset + offsetof(XMMReg, XMM_Q(1))); | |
| 2735 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_tmp0, mem_index); | |
| 2405 | 2736 | } |
| 2406 | 2737 | |
| 2407 | 2738 | static inline void gen_op_movo(int d_offset, int s_offset) |
| 2408 | 2739 | { |
| 2409 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, s_offset); | |
| 2410 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, d_offset); | |
| 2411 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, s_offset + 8); | |
| 2412 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, d_offset + 8); | |
| 2740 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, s_offset); | |
| 2741 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, d_offset); | |
| 2742 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, s_offset + 8); | |
| 2743 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, d_offset + 8); | |
| 2413 | 2744 | } |
| 2414 | 2745 | |
| 2415 | 2746 | static inline void gen_op_movq(int d_offset, int s_offset) |
| 2416 | 2747 | { |
| 2417 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, s_offset); | |
| 2418 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, d_offset); | |
| 2748 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, s_offset); | |
| 2749 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, d_offset); | |
| 2419 | 2750 | } |
| 2420 | 2751 | |
| 2421 | 2752 | static inline void gen_op_movl(int d_offset, int s_offset) |
| 2422 | 2753 | { |
| 2423 | - tcg_gen_ld_i32(cpu_tmp2, cpu_env, s_offset); | |
| 2424 | - tcg_gen_st_i32(cpu_tmp2, cpu_env, d_offset); | |
| 2754 | + tcg_gen_ld_i32(cpu_tmp2_i32, cpu_env, s_offset); | |
| 2755 | + tcg_gen_st_i32(cpu_tmp2_i32, cpu_env, d_offset); | |
| 2425 | 2756 | } |
| 2426 | 2757 | |
| 2427 | 2758 | static inline void gen_op_movq_env_0(int d_offset) |
| 2428 | 2759 | { |
| 2429 | - tcg_gen_movi_i64(cpu_tmp1, 0); | |
| 2430 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, d_offset); | |
| 2760 | + tcg_gen_movi_i64(cpu_tmp1_i64, 0); | |
| 2761 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, d_offset); | |
| 2431 | 2762 | } |
| 2432 | 2763 | |
| 2433 | 2764 | #define SSE_SPECIAL ((void *)1) |
| ... | ... | @@ -2739,8 +3070,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 2739 | 3070 | gen_ldst_modrm(s, modrm, OT_LONG, OR_TMP0, 0); |
| 2740 | 3071 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, |
| 2741 | 3072 | offsetof(CPUX86State,xmm_regs[reg])); |
| 2742 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 2743 | - tcg_gen_helper_0_2(helper_movl_mm_T0_xmm, cpu_ptr0, cpu_tmp2); | |
| 3073 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 3074 | + tcg_gen_helper_0_2(helper_movl_mm_T0_xmm, cpu_ptr0, cpu_tmp2_i32); | |
| 2744 | 3075 | } |
| 2745 | 3076 | break; |
| 2746 | 3077 | case 0x6f: /* movq mm, ea */ |
| ... | ... | @@ -2749,9 +3080,9 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 2749 | 3080 | gen_ldq_env_A0(s->mem_index, offsetof(CPUX86State,fpregs[reg].mmx)); |
| 2750 | 3081 | } else { |
| 2751 | 3082 | rm = (modrm & 7); |
| 2752 | - tcg_gen_ld_i64(cpu_tmp1, cpu_env, | |
| 3083 | + tcg_gen_ld_i64(cpu_tmp1_i64, cpu_env, | |
| 2753 | 3084 | offsetof(CPUX86State,fpregs[rm].mmx)); |
| 2754 | - tcg_gen_st_i64(cpu_tmp1, cpu_env, | |
| 3085 | + tcg_gen_st_i64(cpu_tmp1_i64, cpu_env, | |
| 2755 | 3086 | offsetof(CPUX86State,fpregs[reg].mmx)); |
| 2756 | 3087 | } |
| 2757 | 3088 | break; |
| ... | ... | @@ -3007,16 +3338,16 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 3007 | 3338 | rm = (modrm & 7) | REX_B(s); |
| 3008 | 3339 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, |
| 3009 | 3340 | offsetof(CPUX86State,xmm_regs[rm])); |
| 3010 | - tcg_gen_helper_1_1(helper_movmskps, cpu_tmp2, cpu_ptr0); | |
| 3011 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 3341 | + tcg_gen_helper_1_1(helper_movmskps, cpu_tmp2_i32, cpu_ptr0); | |
| 3342 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 3012 | 3343 | gen_op_mov_reg_T0(OT_LONG, reg); |
| 3013 | 3344 | break; |
| 3014 | 3345 | case 0x150: /* movmskpd */ |
| 3015 | 3346 | rm = (modrm & 7) | REX_B(s); |
| 3016 | 3347 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, |
| 3017 | 3348 | offsetof(CPUX86State,xmm_regs[rm])); |
| 3018 | - tcg_gen_helper_1_1(helper_movmskpd, cpu_tmp2, cpu_ptr0); | |
| 3019 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 3349 | + tcg_gen_helper_1_1(helper_movmskpd, cpu_tmp2_i32, cpu_ptr0); | |
| 3350 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 3020 | 3351 | gen_op_mov_reg_T0(OT_LONG, reg); |
| 3021 | 3352 | break; |
| 3022 | 3353 | case 0x02a: /* cvtpi2ps */ |
| ... | ... | @@ -3050,8 +3381,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 3050 | 3381 | op1_offset = offsetof(CPUX86State,xmm_regs[reg]); |
| 3051 | 3382 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, op1_offset); |
| 3052 | 3383 | sse_op2 = sse_op_table3[(s->dflag == 2) * 2 + ((b >> 8) - 2)]; |
| 3053 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 3054 | - tcg_gen_helper_0_2(sse_op2, cpu_ptr0, cpu_tmp2); | |
| 3384 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 3385 | + tcg_gen_helper_0_2(sse_op2, cpu_ptr0, cpu_tmp2_i32); | |
| 3055 | 3386 | break; |
| 3056 | 3387 | case 0x02c: /* cvttps2pi */ |
| 3057 | 3388 | case 0x12c: /* cvttpd2pi */ |
| ... | ... | @@ -3106,8 +3437,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 3106 | 3437 | (b & 1) * 4]; |
| 3107 | 3438 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, op2_offset); |
| 3108 | 3439 | if (ot == OT_LONG) { |
| 3109 | - tcg_gen_helper_1_1(sse_op2, cpu_tmp2, cpu_ptr0); | |
| 3110 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 3440 | + tcg_gen_helper_1_1(sse_op2, cpu_tmp2_i32, cpu_ptr0); | |
| 3441 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 3111 | 3442 | } else { |
| 3112 | 3443 | tcg_gen_helper_1_1(sse_op2, cpu_T[0], cpu_ptr0); |
| 3113 | 3444 | } |
| ... | ... | @@ -3178,13 +3509,13 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) |
| 3178 | 3509 | if (b1) { |
| 3179 | 3510 | rm = (modrm & 7) | REX_B(s); |
| 3180 | 3511 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, offsetof(CPUX86State,xmm_regs[rm])); |
| 3181 | - tcg_gen_helper_1_1(helper_pmovmskb_xmm, cpu_tmp2, cpu_ptr0); | |
| 3512 | + tcg_gen_helper_1_1(helper_pmovmskb_xmm, cpu_tmp2_i32, cpu_ptr0); | |
| 3182 | 3513 | } else { |
| 3183 | 3514 | rm = (modrm & 7); |
| 3184 | 3515 | tcg_gen_addi_ptr(cpu_ptr0, cpu_env, offsetof(CPUX86State,fpregs[rm].mmx)); |
| 3185 | - tcg_gen_helper_1_1(helper_pmovmskb_mmx, cpu_tmp2, cpu_ptr0); | |
| 3516 | + tcg_gen_helper_1_1(helper_pmovmskb_mmx, cpu_tmp2_i32, cpu_ptr0); | |
| 3186 | 3517 | } |
| 3187 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 3518 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 3188 | 3519 | reg = ((modrm >> 3) & 7) | rex_r; |
| 3189 | 3520 | gen_op_mov_reg_T0(OT_LONG, reg); |
| 3190 | 3521 | break; |
| ... | ... | @@ -3590,7 +3921,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 3590 | 3921 | s->cc_op = CC_OP_LOGICB + ot; |
| 3591 | 3922 | break; |
| 3592 | 3923 | case 2: /* not */ |
| 3593 | - gen_op_notl_T0(); | |
| 3924 | + tcg_gen_not_tl(cpu_T[0], cpu_T[0]); | |
| 3594 | 3925 | if (mod != 3) { |
| 3595 | 3926 | gen_op_st_T0_A0(ot + s->mem_index); |
| 3596 | 3927 | } else { |
| ... | ... | @@ -3598,7 +3929,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 3598 | 3929 | } |
| 3599 | 3930 | break; |
| 3600 | 3931 | case 3: /* neg */ |
| 3601 | - gen_op_negl_T0(); | |
| 3932 | + tcg_gen_neg_tl(cpu_T[0], cpu_T[0]); | |
| 3602 | 3933 | if (mod != 3) { |
| 3603 | 3934 | gen_op_st_T0_A0(ot + s->mem_index); |
| 3604 | 3935 | } else { |
| ... | ... | @@ -3773,15 +4104,15 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 3773 | 4104 | if (s->cc_op != CC_OP_DYNAMIC) |
| 3774 | 4105 | gen_op_set_cc_op(s->cc_op); |
| 3775 | 4106 | gen_jmp_im(pc_start - s->cs_base); |
| 3776 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4107 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 3777 | 4108 | tcg_gen_helper_0_4(helper_lcall_protected, |
| 3778 | - cpu_tmp2, cpu_T[1], | |
| 4109 | + cpu_tmp2_i32, cpu_T[1], | |
| 3779 | 4110 | tcg_const_i32(dflag), |
| 3780 | 4111 | tcg_const_i32(s->pc - pc_start)); |
| 3781 | 4112 | } else { |
| 3782 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4113 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 3783 | 4114 | tcg_gen_helper_0_4(helper_lcall_real, |
| 3784 | - cpu_tmp2, cpu_T[1], | |
| 4115 | + cpu_tmp2_i32, cpu_T[1], | |
| 3785 | 4116 | tcg_const_i32(dflag), |
| 3786 | 4117 | tcg_const_i32(s->pc - s->cs_base)); |
| 3787 | 4118 | } |
| ... | ... | @@ -3802,9 +4133,9 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 3802 | 4133 | if (s->cc_op != CC_OP_DYNAMIC) |
| 3803 | 4134 | gen_op_set_cc_op(s->cc_op); |
| 3804 | 4135 | gen_jmp_im(pc_start - s->cs_base); |
| 3805 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4136 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 3806 | 4137 | tcg_gen_helper_0_3(helper_ljmp_protected, |
| 3807 | - cpu_tmp2, | |
| 4138 | + cpu_tmp2_i32, | |
| 3808 | 4139 | cpu_T[1], |
| 3809 | 4140 | tcg_const_i32(s->pc - pc_start)); |
| 3810 | 4141 | } else { |
| ... | ... | @@ -4474,43 +4805,21 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4474 | 4805 | mod = (modrm >> 6) & 3; |
| 4475 | 4806 | rm = (modrm & 7) | REX_B(s); |
| 4476 | 4807 | reg = ((modrm >> 3) & 7) | rex_r; |
| 4477 | - | |
| 4478 | 4808 | if (mod != 3) { |
| 4479 | 4809 | gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
| 4480 | - gen_op_ld_T0_A0(ot + s->mem_index); | |
| 4810 | + opreg = OR_TMP0; | |
| 4481 | 4811 | } else { |
| 4482 | - gen_op_mov_TN_reg(ot, 0, rm); | |
| 4812 | + opreg = rm; | |
| 4483 | 4813 | } |
| 4484 | 4814 | gen_op_mov_TN_reg(ot, 1, reg); |
| 4485 | 4815 | |
| 4486 | 4816 | if (shift) { |
| 4487 | 4817 | val = ldub_code(s->pc++); |
| 4488 | - if (ot == OT_QUAD) | |
| 4489 | - val &= 0x3f; | |
| 4490 | - else | |
| 4491 | - val &= 0x1f; | |
| 4492 | - if (val) { | |
| 4493 | - if (mod == 3) | |
| 4494 | - gen_op_shiftd_T0_T1_im_cc[ot][op](val); | |
| 4495 | - else | |
| 4496 | - gen_op_shiftd_mem_T0_T1_im_cc[ot + s->mem_index][op](val); | |
| 4497 | - if (op == 0 && ot != OT_WORD) | |
| 4498 | - s->cc_op = CC_OP_SHLB + ot; | |
| 4499 | - else | |
| 4500 | - s->cc_op = CC_OP_SARB + ot; | |
| 4501 | - } | |
| 4818 | + tcg_gen_movi_tl(cpu_T3, val); | |
| 4502 | 4819 | } else { |
| 4503 | - if (s->cc_op != CC_OP_DYNAMIC) | |
| 4504 | - gen_op_set_cc_op(s->cc_op); | |
| 4505 | - if (mod == 3) | |
| 4506 | - gen_op_shiftd_T0_T1_ECX_cc[ot][op](); | |
| 4507 | - else | |
| 4508 | - gen_op_shiftd_mem_T0_T1_ECX_cc[ot + s->mem_index][op](); | |
| 4509 | - s->cc_op = CC_OP_DYNAMIC; /* cannot predict flags after */ | |
| 4510 | - } | |
| 4511 | - if (mod == 3) { | |
| 4512 | - gen_op_mov_reg_T0(ot, rm); | |
| 4820 | + tcg_gen_ld_tl(cpu_T3, cpu_env, offsetof(CPUState, regs[R_ECX])); | |
| 4513 | 4821 | } |
| 4822 | + gen_shiftd_rm_T1_T3(s, ot, opreg, op); | |
| 4514 | 4823 | break; |
| 4515 | 4824 | |
| 4516 | 4825 | /************************/ |
| ... | ... | @@ -4541,24 +4850,24 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4541 | 4850 | switch(op >> 4) { |
| 4542 | 4851 | case 0: |
| 4543 | 4852 | gen_op_ld_T0_A0(OT_LONG + s->mem_index); |
| 4544 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4545 | - tcg_gen_helper_0_1(helper_flds_FT0, cpu_tmp2); | |
| 4853 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4854 | + tcg_gen_helper_0_1(helper_flds_FT0, cpu_tmp2_i32); | |
| 4546 | 4855 | break; |
| 4547 | 4856 | case 1: |
| 4548 | 4857 | gen_op_ld_T0_A0(OT_LONG + s->mem_index); |
| 4549 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4550 | - tcg_gen_helper_0_1(helper_fildl_FT0, cpu_tmp2); | |
| 4858 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4859 | + tcg_gen_helper_0_1(helper_fildl_FT0, cpu_tmp2_i32); | |
| 4551 | 4860 | break; |
| 4552 | 4861 | case 2: |
| 4553 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_A0, | |
| 4862 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_A0, | |
| 4554 | 4863 | (s->mem_index >> 2) - 1); |
| 4555 | - tcg_gen_helper_0_1(helper_fldl_FT0, cpu_tmp1); | |
| 4864 | + tcg_gen_helper_0_1(helper_fldl_FT0, cpu_tmp1_i64); | |
| 4556 | 4865 | break; |
| 4557 | 4866 | case 3: |
| 4558 | 4867 | default: |
| 4559 | 4868 | gen_op_lds_T0_A0(OT_WORD + s->mem_index); |
| 4560 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4561 | - tcg_gen_helper_0_1(helper_fildl_FT0, cpu_tmp2); | |
| 4869 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4870 | + tcg_gen_helper_0_1(helper_fildl_FT0, cpu_tmp2_i32); | |
| 4562 | 4871 | break; |
| 4563 | 4872 | } |
| 4564 | 4873 | |
| ... | ... | @@ -4580,24 +4889,24 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4580 | 4889 | switch(op >> 4) { |
| 4581 | 4890 | case 0: |
| 4582 | 4891 | gen_op_ld_T0_A0(OT_LONG + s->mem_index); |
| 4583 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4584 | - tcg_gen_helper_0_1(helper_flds_ST0, cpu_tmp2); | |
| 4892 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4893 | + tcg_gen_helper_0_1(helper_flds_ST0, cpu_tmp2_i32); | |
| 4585 | 4894 | break; |
| 4586 | 4895 | case 1: |
| 4587 | 4896 | gen_op_ld_T0_A0(OT_LONG + s->mem_index); |
| 4588 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4589 | - tcg_gen_helper_0_1(helper_fildl_ST0, cpu_tmp2); | |
| 4897 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4898 | + tcg_gen_helper_0_1(helper_fildl_ST0, cpu_tmp2_i32); | |
| 4590 | 4899 | break; |
| 4591 | 4900 | case 2: |
| 4592 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_A0, | |
| 4901 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_A0, | |
| 4593 | 4902 | (s->mem_index >> 2) - 1); |
| 4594 | - tcg_gen_helper_0_1(helper_fldl_ST0, cpu_tmp1); | |
| 4903 | + tcg_gen_helper_0_1(helper_fldl_ST0, cpu_tmp1_i64); | |
| 4595 | 4904 | break; |
| 4596 | 4905 | case 3: |
| 4597 | 4906 | default: |
| 4598 | 4907 | gen_op_lds_T0_A0(OT_WORD + s->mem_index); |
| 4599 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4600 | - tcg_gen_helper_0_1(helper_fildl_ST0, cpu_tmp2); | |
| 4908 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4909 | + tcg_gen_helper_0_1(helper_fildl_ST0, cpu_tmp2_i32); | |
| 4601 | 4910 | break; |
| 4602 | 4911 | } |
| 4603 | 4912 | break; |
| ... | ... | @@ -4605,19 +4914,19 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4605 | 4914 | /* XXX: the corresponding CPUID bit must be tested ! */ |
| 4606 | 4915 | switch(op >> 4) { |
| 4607 | 4916 | case 1: |
| 4608 | - tcg_gen_helper_1_0(helper_fisttl_ST0, cpu_tmp2); | |
| 4609 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4917 | + tcg_gen_helper_1_0(helper_fisttl_ST0, cpu_tmp2_i32); | |
| 4918 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4610 | 4919 | gen_op_st_T0_A0(OT_LONG + s->mem_index); |
| 4611 | 4920 | break; |
| 4612 | 4921 | case 2: |
| 4613 | - tcg_gen_helper_1_0(helper_fisttll_ST0, cpu_tmp1); | |
| 4614 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_A0, | |
| 4922 | + tcg_gen_helper_1_0(helper_fisttll_ST0, cpu_tmp1_i64); | |
| 4923 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_A0, | |
| 4615 | 4924 | (s->mem_index >> 2) - 1); |
| 4616 | 4925 | break; |
| 4617 | 4926 | case 3: |
| 4618 | 4927 | default: |
| 4619 | - tcg_gen_helper_1_0(helper_fistt_ST0, cpu_tmp2); | |
| 4620 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4928 | + tcg_gen_helper_1_0(helper_fistt_ST0, cpu_tmp2_i32); | |
| 4929 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4621 | 4930 | gen_op_st_T0_A0(OT_WORD + s->mem_index); |
| 4622 | 4931 | break; |
| 4623 | 4932 | } |
| ... | ... | @@ -4626,24 +4935,24 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4626 | 4935 | default: |
| 4627 | 4936 | switch(op >> 4) { |
| 4628 | 4937 | case 0: |
| 4629 | - tcg_gen_helper_1_0(helper_fsts_ST0, cpu_tmp2); | |
| 4630 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4938 | + tcg_gen_helper_1_0(helper_fsts_ST0, cpu_tmp2_i32); | |
| 4939 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4631 | 4940 | gen_op_st_T0_A0(OT_LONG + s->mem_index); |
| 4632 | 4941 | break; |
| 4633 | 4942 | case 1: |
| 4634 | - tcg_gen_helper_1_0(helper_fistl_ST0, cpu_tmp2); | |
| 4635 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4943 | + tcg_gen_helper_1_0(helper_fistl_ST0, cpu_tmp2_i32); | |
| 4944 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4636 | 4945 | gen_op_st_T0_A0(OT_LONG + s->mem_index); |
| 4637 | 4946 | break; |
| 4638 | 4947 | case 2: |
| 4639 | - tcg_gen_helper_1_0(helper_fstl_ST0, cpu_tmp1); | |
| 4640 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_A0, | |
| 4948 | + tcg_gen_helper_1_0(helper_fstl_ST0, cpu_tmp1_i64); | |
| 4949 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_A0, | |
| 4641 | 4950 | (s->mem_index >> 2) - 1); |
| 4642 | 4951 | break; |
| 4643 | 4952 | case 3: |
| 4644 | 4953 | default: |
| 4645 | - tcg_gen_helper_1_0(helper_fist_ST0, cpu_tmp2); | |
| 4646 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4954 | + tcg_gen_helper_1_0(helper_fist_ST0, cpu_tmp2_i32); | |
| 4955 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4647 | 4956 | gen_op_st_T0_A0(OT_WORD + s->mem_index); |
| 4648 | 4957 | break; |
| 4649 | 4958 | } |
| ... | ... | @@ -4661,8 +4970,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4661 | 4970 | break; |
| 4662 | 4971 | case 0x0d: /* fldcw mem */ |
| 4663 | 4972 | gen_op_ld_T0_A0(OT_WORD + s->mem_index); |
| 4664 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 4665 | - tcg_gen_helper_0_1(helper_fldcw, cpu_tmp2); | |
| 4973 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 4974 | + tcg_gen_helper_0_1(helper_fldcw, cpu_tmp2_i32); | |
| 4666 | 4975 | break; |
| 4667 | 4976 | case 0x0e: /* fnstenv mem */ |
| 4668 | 4977 | if (s->cc_op != CC_OP_DYNAMIC) |
| ... | ... | @@ -4672,8 +4981,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4672 | 4981 | cpu_A0, tcg_const_i32(s->dflag)); |
| 4673 | 4982 | break; |
| 4674 | 4983 | case 0x0f: /* fnstcw mem */ |
| 4675 | - tcg_gen_helper_1_0(helper_fnstcw, cpu_tmp2); | |
| 4676 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 4984 | + tcg_gen_helper_1_0(helper_fnstcw, cpu_tmp2_i32); | |
| 4985 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4677 | 4986 | gen_op_st_T0_A0(OT_WORD + s->mem_index); |
| 4678 | 4987 | break; |
| 4679 | 4988 | case 0x1d: /* fldt mem */ |
| ... | ... | @@ -4704,8 +5013,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4704 | 5013 | cpu_A0, tcg_const_i32(s->dflag)); |
| 4705 | 5014 | break; |
| 4706 | 5015 | case 0x2f: /* fnstsw mem */ |
| 4707 | - tcg_gen_helper_1_0(helper_fnstsw, cpu_tmp2); | |
| 4708 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 5016 | + tcg_gen_helper_1_0(helper_fnstsw, cpu_tmp2_i32); | |
| 5017 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4709 | 5018 | gen_op_st_T0_A0(OT_WORD + s->mem_index); |
| 4710 | 5019 | break; |
| 4711 | 5020 | case 0x3c: /* fbld */ |
| ... | ... | @@ -4722,13 +5031,13 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4722 | 5031 | tcg_gen_helper_0_0(helper_fpop); |
| 4723 | 5032 | break; |
| 4724 | 5033 | case 0x3d: /* fildll */ |
| 4725 | - tcg_gen_qemu_ld64(cpu_tmp1, cpu_A0, | |
| 5034 | + tcg_gen_qemu_ld64(cpu_tmp1_i64, cpu_A0, | |
| 4726 | 5035 | (s->mem_index >> 2) - 1); |
| 4727 | - tcg_gen_helper_0_1(helper_fildll_ST0, cpu_tmp1); | |
| 5036 | + tcg_gen_helper_0_1(helper_fildll_ST0, cpu_tmp1_i64); | |
| 4728 | 5037 | break; |
| 4729 | 5038 | case 0x3f: /* fistpll */ |
| 4730 | - tcg_gen_helper_1_0(helper_fistll_ST0, cpu_tmp1); | |
| 4731 | - tcg_gen_qemu_st64(cpu_tmp1, cpu_A0, | |
| 5039 | + tcg_gen_helper_1_0(helper_fistll_ST0, cpu_tmp1_i64); | |
| 5040 | + tcg_gen_qemu_st64(cpu_tmp1_i64, cpu_A0, | |
| 4732 | 5041 | (s->mem_index >> 2) - 1); |
| 4733 | 5042 | tcg_gen_helper_0_0(helper_fpop); |
| 4734 | 5043 | break; |
| ... | ... | @@ -4991,8 +5300,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 4991 | 5300 | case 0x3c: /* df/4 */ |
| 4992 | 5301 | switch(rm) { |
| 4993 | 5302 | case 0: |
| 4994 | - tcg_gen_helper_1_0(helper_fnstsw, cpu_tmp2); | |
| 4995 | - tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2); | |
| 5303 | + tcg_gen_helper_1_0(helper_fnstsw, cpu_tmp2_i32); | |
| 5304 | + tcg_gen_extu_i32_tl(cpu_T[0], cpu_tmp2_i32); | |
| 4996 | 5305 | gen_op_mov_reg_T0(OT_WORD, R_EAX); |
| 4997 | 5306 | break; |
| 4998 | 5307 | default: |
| ... | ... | @@ -5159,8 +5468,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5159 | 5468 | gen_op_movl_T0_im(val); |
| 5160 | 5469 | gen_check_io(s, ot, pc_start - s->cs_base, |
| 5161 | 5470 | SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes)); |
| 5162 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5163 | - tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[1], cpu_tmp2); | |
| 5471 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 5472 | + tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[1], cpu_tmp2_i32); | |
| 5164 | 5473 | gen_op_mov_reg_T1(ot, R_EAX); |
| 5165 | 5474 | break; |
| 5166 | 5475 | case 0xe6: |
| ... | ... | @@ -5175,10 +5484,10 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5175 | 5484 | svm_is_rep(prefixes)); |
| 5176 | 5485 | gen_op_mov_TN_reg(ot, 1, R_EAX); |
| 5177 | 5486 | |
| 5178 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5179 | - tcg_gen_andi_i32(cpu_tmp2, cpu_tmp2, 0xffff); | |
| 5180 | - tcg_gen_trunc_tl_i32(cpu_tmp3, cpu_T[1]); | |
| 5181 | - tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2, cpu_tmp3); | |
| 5487 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 5488 | + tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); | |
| 5489 | + tcg_gen_trunc_tl_i32(cpu_tmp3_i32, cpu_T[1]); | |
| 5490 | + tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2_i32, cpu_tmp3_i32); | |
| 5182 | 5491 | break; |
| 5183 | 5492 | case 0xec: |
| 5184 | 5493 | case 0xed: |
| ... | ... | @@ -5190,8 +5499,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5190 | 5499 | gen_op_andl_T0_ffff(); |
| 5191 | 5500 | gen_check_io(s, ot, pc_start - s->cs_base, |
| 5192 | 5501 | SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes)); |
| 5193 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5194 | - tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[1], cpu_tmp2); | |
| 5502 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 5503 | + tcg_gen_helper_1_1(helper_in_func[ot], cpu_T[1], cpu_tmp2_i32); | |
| 5195 | 5504 | gen_op_mov_reg_T1(ot, R_EAX); |
| 5196 | 5505 | break; |
| 5197 | 5506 | case 0xee: |
| ... | ... | @@ -5206,10 +5515,10 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5206 | 5515 | svm_is_rep(prefixes)); |
| 5207 | 5516 | gen_op_mov_TN_reg(ot, 1, R_EAX); |
| 5208 | 5517 | |
| 5209 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5210 | - tcg_gen_andi_i32(cpu_tmp2, cpu_tmp2, 0xffff); | |
| 5211 | - tcg_gen_trunc_tl_i32(cpu_tmp3, cpu_T[1]); | |
| 5212 | - tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2, cpu_tmp3); | |
| 5518 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 5519 | + tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff); | |
| 5520 | + tcg_gen_trunc_tl_i32(cpu_tmp3_i32, cpu_T[1]); | |
| 5521 | + tcg_gen_helper_0_2(helper_out_func[ot], cpu_tmp2_i32, cpu_tmp3_i32); | |
| 5213 | 5522 | break; |
| 5214 | 5523 | |
| 5215 | 5524 | /************************/ |
| ... | ... | @@ -5474,12 +5783,12 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5474 | 5783 | s->cc_op = CC_OP_EFLAGS; |
| 5475 | 5784 | break; |
| 5476 | 5785 | case 0xfc: /* cld */ |
| 5477 | - tcg_gen_movi_i32(cpu_tmp2, 1); | |
| 5478 | - tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df)); | |
| 5786 | + tcg_gen_movi_i32(cpu_tmp2_i32, 1); | |
| 5787 | + tcg_gen_st_i32(cpu_tmp2_i32, cpu_env, offsetof(CPUState, df)); | |
| 5479 | 5788 | break; |
| 5480 | 5789 | case 0xfd: /* std */ |
| 5481 | - tcg_gen_movi_i32(cpu_tmp2, -1); | |
| 5482 | - tcg_gen_st_i32(cpu_tmp2, cpu_env, offsetof(CPUState, df)); | |
| 5790 | + tcg_gen_movi_i32(cpu_tmp2_i32, -1); | |
| 5791 | + tcg_gen_st_i32(cpu_tmp2_i32, cpu_env, offsetof(CPUState, df)); | |
| 5483 | 5792 | break; |
| 5484 | 5793 | |
| 5485 | 5794 | /************************/ |
| ... | ... | @@ -5723,11 +6032,11 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5723 | 6032 | gen_op_mov_TN_reg(ot, 0, reg); |
| 5724 | 6033 | gen_lea_modrm(s, modrm, ®_addr, &offset_addr); |
| 5725 | 6034 | gen_jmp_im(pc_start - s->cs_base); |
| 5726 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 6035 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 5727 | 6036 | if (ot == OT_WORD) |
| 5728 | - tcg_gen_helper_0_2(helper_boundw, cpu_A0, cpu_tmp2); | |
| 6037 | + tcg_gen_helper_0_2(helper_boundw, cpu_A0, cpu_tmp2_i32); | |
| 5729 | 6038 | else |
| 5730 | - tcg_gen_helper_0_2(helper_boundl, cpu_A0, cpu_tmp2); | |
| 6039 | + tcg_gen_helper_0_2(helper_boundl, cpu_A0, cpu_tmp2_i32); | |
| 5731 | 6040 | break; |
| 5732 | 6041 | case 0x1c8 ... 0x1cf: /* bswap reg */ |
| 5733 | 6042 | reg = (b & 7) | REX_B(s); |
| ... | ... | @@ -5927,8 +6236,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5927 | 6236 | break; |
| 5928 | 6237 | gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); |
| 5929 | 6238 | gen_jmp_im(pc_start - s->cs_base); |
| 5930 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5931 | - tcg_gen_helper_0_1(helper_lldt, cpu_tmp2); | |
| 6239 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 6240 | + tcg_gen_helper_0_1(helper_lldt, cpu_tmp2_i32); | |
| 5932 | 6241 | } |
| 5933 | 6242 | break; |
| 5934 | 6243 | case 1: /* str */ |
| ... | ... | @@ -5952,8 +6261,8 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5952 | 6261 | break; |
| 5953 | 6262 | gen_ldst_modrm(s, modrm, OT_WORD, OR_TMP0, 0); |
| 5954 | 6263 | gen_jmp_im(pc_start - s->cs_base); |
| 5955 | - tcg_gen_trunc_tl_i32(cpu_tmp2, cpu_T[0]); | |
| 5956 | - tcg_gen_helper_0_1(helper_ltr, cpu_tmp2); | |
| 6264 | + tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_T[0]); | |
| 6265 | + tcg_gen_helper_0_1(helper_ltr, cpu_tmp2_i32); | |
| 5957 | 6266 | } |
| 5958 | 6267 | break; |
| 5959 | 6268 | case 4: /* verr */ |
| ... | ... | @@ -6499,337 +6808,6 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 6499 | 6808 | return s->pc; |
| 6500 | 6809 | } |
| 6501 | 6810 | |
| 6502 | -#define CC_OSZAPC (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C) | |
| 6503 | -#define CC_OSZAP (CC_O | CC_S | CC_Z | CC_A | CC_P) | |
| 6504 | - | |
| 6505 | -/* flags read by an operation */ | |
| 6506 | -static uint16_t opc_read_flags[NB_OPS] = { | |
| 6507 | - [INDEX_op_aas] = CC_A, | |
| 6508 | - [INDEX_op_aaa] = CC_A, | |
| 6509 | - [INDEX_op_das] = CC_A | CC_C, | |
| 6510 | - [INDEX_op_daa] = CC_A | CC_C, | |
| 6511 | - | |
| 6512 | - /* subtle: due to the incl/decl implementation, C is used */ | |
| 6513 | - [INDEX_op_update_inc_cc] = CC_C, | |
| 6514 | - | |
| 6515 | - [INDEX_op_into] = CC_O, | |
| 6516 | - | |
| 6517 | - [INDEX_op_jb_subb] = CC_C, | |
| 6518 | - [INDEX_op_jb_subw] = CC_C, | |
| 6519 | - [INDEX_op_jb_subl] = CC_C, | |
| 6520 | - | |
| 6521 | - [INDEX_op_jz_subb] = CC_Z, | |
| 6522 | - [INDEX_op_jz_subw] = CC_Z, | |
| 6523 | - [INDEX_op_jz_subl] = CC_Z, | |
| 6524 | - | |
| 6525 | - [INDEX_op_jbe_subb] = CC_Z | CC_C, | |
| 6526 | - [INDEX_op_jbe_subw] = CC_Z | CC_C, | |
| 6527 | - [INDEX_op_jbe_subl] = CC_Z | CC_C, | |
| 6528 | - | |
| 6529 | - [INDEX_op_js_subb] = CC_S, | |
| 6530 | - [INDEX_op_js_subw] = CC_S, | |
| 6531 | - [INDEX_op_js_subl] = CC_S, | |
| 6532 | - | |
| 6533 | - [INDEX_op_jl_subb] = CC_O | CC_S, | |
| 6534 | - [INDEX_op_jl_subw] = CC_O | CC_S, | |
| 6535 | - [INDEX_op_jl_subl] = CC_O | CC_S, | |
| 6536 | - | |
| 6537 | - [INDEX_op_jle_subb] = CC_O | CC_S | CC_Z, | |
| 6538 | - [INDEX_op_jle_subw] = CC_O | CC_S | CC_Z, | |
| 6539 | - [INDEX_op_jle_subl] = CC_O | CC_S | CC_Z, | |
| 6540 | - | |
| 6541 | - [INDEX_op_loopnzw] = CC_Z, | |
| 6542 | - [INDEX_op_loopnzl] = CC_Z, | |
| 6543 | - [INDEX_op_loopzw] = CC_Z, | |
| 6544 | - [INDEX_op_loopzl] = CC_Z, | |
| 6545 | - | |
| 6546 | - [INDEX_op_seto_T0_cc] = CC_O, | |
| 6547 | - [INDEX_op_setb_T0_cc] = CC_C, | |
| 6548 | - [INDEX_op_setz_T0_cc] = CC_Z, | |
| 6549 | - [INDEX_op_setbe_T0_cc] = CC_Z | CC_C, | |
| 6550 | - [INDEX_op_sets_T0_cc] = CC_S, | |
| 6551 | - [INDEX_op_setp_T0_cc] = CC_P, | |
| 6552 | - [INDEX_op_setl_T0_cc] = CC_O | CC_S, | |
| 6553 | - [INDEX_op_setle_T0_cc] = CC_O | CC_S | CC_Z, | |
| 6554 | - | |
| 6555 | - [INDEX_op_setb_T0_subb] = CC_C, | |
| 6556 | - [INDEX_op_setb_T0_subw] = CC_C, | |
| 6557 | - [INDEX_op_setb_T0_subl] = CC_C, | |
| 6558 | - | |
| 6559 | - [INDEX_op_setz_T0_subb] = CC_Z, | |
| 6560 | - [INDEX_op_setz_T0_subw] = CC_Z, | |
| 6561 | - [INDEX_op_setz_T0_subl] = CC_Z, | |
| 6562 | - | |
| 6563 | - [INDEX_op_setbe_T0_subb] = CC_Z | CC_C, | |
| 6564 | - [INDEX_op_setbe_T0_subw] = CC_Z | CC_C, | |
| 6565 | - [INDEX_op_setbe_T0_subl] = CC_Z | CC_C, | |
| 6566 | - | |
| 6567 | - [INDEX_op_sets_T0_subb] = CC_S, | |
| 6568 | - [INDEX_op_sets_T0_subw] = CC_S, | |
| 6569 | - [INDEX_op_sets_T0_subl] = CC_S, | |
| 6570 | - | |
| 6571 | - [INDEX_op_setl_T0_subb] = CC_O | CC_S, | |
| 6572 | - [INDEX_op_setl_T0_subw] = CC_O | CC_S, | |
| 6573 | - [INDEX_op_setl_T0_subl] = CC_O | CC_S, | |
| 6574 | - | |
| 6575 | - [INDEX_op_setle_T0_subb] = CC_O | CC_S | CC_Z, | |
| 6576 | - [INDEX_op_setle_T0_subw] = CC_O | CC_S | CC_Z, | |
| 6577 | - [INDEX_op_setle_T0_subl] = CC_O | CC_S | CC_Z, | |
| 6578 | - | |
| 6579 | - [INDEX_op_movl_T0_eflags] = CC_OSZAPC, | |
| 6580 | - [INDEX_op_cmc] = CC_C, | |
| 6581 | - [INDEX_op_salc] = CC_C, | |
| 6582 | - | |
| 6583 | - /* needed for correct flag optimisation before string ops */ | |
| 6584 | - [INDEX_op_jnz_ecxw] = CC_OSZAPC, | |
| 6585 | - [INDEX_op_jnz_ecxl] = CC_OSZAPC, | |
| 6586 | - [INDEX_op_jz_ecxw] = CC_OSZAPC, | |
| 6587 | - [INDEX_op_jz_ecxl] = CC_OSZAPC, | |
| 6588 | - | |
| 6589 | -#ifdef TARGET_X86_64 | |
| 6590 | - [INDEX_op_jb_subq] = CC_C, | |
| 6591 | - [INDEX_op_jz_subq] = CC_Z, | |
| 6592 | - [INDEX_op_jbe_subq] = CC_Z | CC_C, | |
| 6593 | - [INDEX_op_js_subq] = CC_S, | |
| 6594 | - [INDEX_op_jl_subq] = CC_O | CC_S, | |
| 6595 | - [INDEX_op_jle_subq] = CC_O | CC_S | CC_Z, | |
| 6596 | - | |
| 6597 | - [INDEX_op_loopnzq] = CC_Z, | |
| 6598 | - [INDEX_op_loopzq] = CC_Z, | |
| 6599 | - | |
| 6600 | - [INDEX_op_setb_T0_subq] = CC_C, | |
| 6601 | - [INDEX_op_setz_T0_subq] = CC_Z, | |
| 6602 | - [INDEX_op_setbe_T0_subq] = CC_Z | CC_C, | |
| 6603 | - [INDEX_op_sets_T0_subq] = CC_S, | |
| 6604 | - [INDEX_op_setl_T0_subq] = CC_O | CC_S, | |
| 6605 | - [INDEX_op_setle_T0_subq] = CC_O | CC_S | CC_Z, | |
| 6606 | - | |
| 6607 | - [INDEX_op_jnz_ecxq] = CC_OSZAPC, | |
| 6608 | - [INDEX_op_jz_ecxq] = CC_OSZAPC, | |
| 6609 | -#endif | |
| 6610 | - | |
| 6611 | -#define DEF_READF(SUFFIX)\ | |
| 6612 | - [INDEX_op_adcb ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6613 | - [INDEX_op_adcw ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6614 | - [INDEX_op_adcl ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6615 | - X86_64_DEF([INDEX_op_adcq ## SUFFIX ## _T0_T1_cc] = CC_C,)\ | |
| 6616 | - [INDEX_op_sbbb ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6617 | - [INDEX_op_sbbw ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6618 | - [INDEX_op_sbbl ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6619 | - X86_64_DEF([INDEX_op_sbbq ## SUFFIX ## _T0_T1_cc] = CC_C,)\ | |
| 6620 | -\ | |
| 6621 | - [INDEX_op_rclb ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6622 | - [INDEX_op_rclw ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6623 | - [INDEX_op_rcll ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6624 | - X86_64_DEF([INDEX_op_rclq ## SUFFIX ## _T0_T1_cc] = CC_C,)\ | |
| 6625 | - [INDEX_op_rcrb ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6626 | - [INDEX_op_rcrw ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6627 | - [INDEX_op_rcrl ## SUFFIX ## _T0_T1_cc] = CC_C,\ | |
| 6628 | - X86_64_DEF([INDEX_op_rcrq ## SUFFIX ## _T0_T1_cc] = CC_C,) | |
| 6629 | - | |
| 6630 | - DEF_READF( ) | |
| 6631 | - DEF_READF(_raw) | |
| 6632 | -#ifndef CONFIG_USER_ONLY | |
| 6633 | - DEF_READF(_kernel) | |
| 6634 | - DEF_READF(_user) | |
| 6635 | -#endif | |
| 6636 | -}; | |
| 6637 | - | |
| 6638 | -/* flags written by an operation */ | |
| 6639 | -static uint16_t opc_write_flags[NB_OPS] = { | |
| 6640 | - [INDEX_op_update2_cc] = CC_OSZAPC, | |
| 6641 | - [INDEX_op_update1_cc] = CC_OSZAPC, | |
| 6642 | - [INDEX_op_cmpl_T0_T1_cc] = CC_OSZAPC, | |
| 6643 | - [INDEX_op_update_neg_cc] = CC_OSZAPC, | |
| 6644 | - /* subtle: due to the incl/decl implementation, C is used */ | |
| 6645 | - [INDEX_op_update_inc_cc] = CC_OSZAPC, | |
| 6646 | - [INDEX_op_testl_T0_T1_cc] = CC_OSZAPC, | |
| 6647 | - | |
| 6648 | - [INDEX_op_mulb_AL_T0] = CC_OSZAPC, | |
| 6649 | - [INDEX_op_mulw_AX_T0] = CC_OSZAPC, | |
| 6650 | - [INDEX_op_mull_EAX_T0] = CC_OSZAPC, | |
| 6651 | - X86_64_DEF([INDEX_op_mulq_EAX_T0] = CC_OSZAPC,) | |
| 6652 | - [INDEX_op_imulb_AL_T0] = CC_OSZAPC, | |
| 6653 | - [INDEX_op_imulw_AX_T0] = CC_OSZAPC, | |
| 6654 | - [INDEX_op_imull_EAX_T0] = CC_OSZAPC, | |
| 6655 | - X86_64_DEF([INDEX_op_imulq_EAX_T0] = CC_OSZAPC,) | |
| 6656 | - [INDEX_op_imulw_T0_T1] = CC_OSZAPC, | |
| 6657 | - [INDEX_op_imull_T0_T1] = CC_OSZAPC, | |
| 6658 | - X86_64_DEF([INDEX_op_imulq_T0_T1] = CC_OSZAPC,) | |
| 6659 | - | |
| 6660 | - /* sse */ | |
| 6661 | - [INDEX_op_com_dummy] = CC_OSZAPC, | |
| 6662 | - [INDEX_op_com_dummy] = CC_OSZAPC, | |
| 6663 | - [INDEX_op_com_dummy] = CC_OSZAPC, | |
| 6664 | - [INDEX_op_com_dummy] = CC_OSZAPC, | |
| 6665 | - | |
| 6666 | - /* bcd */ | |
| 6667 | - [INDEX_op_aam] = CC_OSZAPC, | |
| 6668 | - [INDEX_op_aad] = CC_OSZAPC, | |
| 6669 | - [INDEX_op_aas] = CC_OSZAPC, | |
| 6670 | - [INDEX_op_aaa] = CC_OSZAPC, | |
| 6671 | - [INDEX_op_das] = CC_OSZAPC, | |
| 6672 | - [INDEX_op_daa] = CC_OSZAPC, | |
| 6673 | - | |
| 6674 | - [INDEX_op_movb_eflags_T0] = CC_S | CC_Z | CC_A | CC_P | CC_C, | |
| 6675 | - [INDEX_op_movw_eflags_T0] = CC_OSZAPC, | |
| 6676 | - [INDEX_op_movl_eflags_T0] = CC_OSZAPC, | |
| 6677 | - [INDEX_op_movw_eflags_T0_io] = CC_OSZAPC, | |
| 6678 | - [INDEX_op_movl_eflags_T0_io] = CC_OSZAPC, | |
| 6679 | - [INDEX_op_movw_eflags_T0_cpl0] = CC_OSZAPC, | |
| 6680 | - [INDEX_op_movl_eflags_T0_cpl0] = CC_OSZAPC, | |
| 6681 | - [INDEX_op_clc] = CC_C, | |
| 6682 | - [INDEX_op_stc] = CC_C, | |
| 6683 | - [INDEX_op_cmc] = CC_C, | |
| 6684 | - | |
| 6685 | - [INDEX_op_btw_T0_T1_cc] = CC_OSZAPC, | |
| 6686 | - [INDEX_op_btl_T0_T1_cc] = CC_OSZAPC, | |
| 6687 | - X86_64_DEF([INDEX_op_btq_T0_T1_cc] = CC_OSZAPC,) | |
| 6688 | - [INDEX_op_btsw_T0_T1_cc] = CC_OSZAPC, | |
| 6689 | - [INDEX_op_btsl_T0_T1_cc] = CC_OSZAPC, | |
| 6690 | - X86_64_DEF([INDEX_op_btsq_T0_T1_cc] = CC_OSZAPC,) | |
| 6691 | - [INDEX_op_btrw_T0_T1_cc] = CC_OSZAPC, | |
| 6692 | - [INDEX_op_btrl_T0_T1_cc] = CC_OSZAPC, | |
| 6693 | - X86_64_DEF([INDEX_op_btrq_T0_T1_cc] = CC_OSZAPC,) | |
| 6694 | - [INDEX_op_btcw_T0_T1_cc] = CC_OSZAPC, | |
| 6695 | - [INDEX_op_btcl_T0_T1_cc] = CC_OSZAPC, | |
| 6696 | - X86_64_DEF([INDEX_op_btcq_T0_T1_cc] = CC_OSZAPC,) | |
| 6697 | - | |
| 6698 | - [INDEX_op_bsfw_T0_cc] = CC_OSZAPC, | |
| 6699 | - [INDEX_op_bsfl_T0_cc] = CC_OSZAPC, | |
| 6700 | - X86_64_DEF([INDEX_op_bsfq_T0_cc] = CC_OSZAPC,) | |
| 6701 | - [INDEX_op_bsrw_T0_cc] = CC_OSZAPC, | |
| 6702 | - [INDEX_op_bsrl_T0_cc] = CC_OSZAPC, | |
| 6703 | - X86_64_DEF([INDEX_op_bsrq_T0_cc] = CC_OSZAPC,) | |
| 6704 | - | |
| 6705 | - [INDEX_op_cmpxchgb_T0_T1_EAX_cc] = CC_OSZAPC, | |
| 6706 | - [INDEX_op_cmpxchgw_T0_T1_EAX_cc] = CC_OSZAPC, | |
| 6707 | - [INDEX_op_cmpxchgl_T0_T1_EAX_cc] = CC_OSZAPC, | |
| 6708 | - X86_64_DEF([INDEX_op_cmpxchgq_T0_T1_EAX_cc] = CC_OSZAPC,) | |
| 6709 | - | |
| 6710 | - [INDEX_op_cmpxchg8b] = CC_Z, | |
| 6711 | - [INDEX_op_lar] = CC_Z, | |
| 6712 | - [INDEX_op_lsl] = CC_Z, | |
| 6713 | - [INDEX_op_verr] = CC_Z, | |
| 6714 | - [INDEX_op_verw] = CC_Z, | |
| 6715 | - [INDEX_op_fcomi_dummy] = CC_Z | CC_P | CC_C, | |
| 6716 | - [INDEX_op_fcomi_dummy] = CC_Z | CC_P | CC_C, | |
| 6717 | - | |
| 6718 | -#define DEF_WRITEF(SUFFIX)\ | |
| 6719 | - [INDEX_op_adcb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6720 | - [INDEX_op_adcw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6721 | - [INDEX_op_adcl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6722 | - X86_64_DEF([INDEX_op_adcq ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,)\ | |
| 6723 | - [INDEX_op_sbbb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6724 | - [INDEX_op_sbbw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6725 | - [INDEX_op_sbbl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6726 | - X86_64_DEF([INDEX_op_sbbq ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,)\ | |
| 6727 | -\ | |
| 6728 | - [INDEX_op_rolb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6729 | - [INDEX_op_rolw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6730 | - [INDEX_op_roll ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6731 | - X86_64_DEF([INDEX_op_rolq ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,)\ | |
| 6732 | - [INDEX_op_rorb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6733 | - [INDEX_op_rorw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6734 | - [INDEX_op_rorl ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6735 | - X86_64_DEF([INDEX_op_rorq ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,)\ | |
| 6736 | -\ | |
| 6737 | - [INDEX_op_rclb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6738 | - [INDEX_op_rclw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6739 | - [INDEX_op_rcll ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6740 | - X86_64_DEF([INDEX_op_rclq ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,)\ | |
| 6741 | - [INDEX_op_rcrb ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6742 | - [INDEX_op_rcrw ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6743 | - [INDEX_op_rcrl ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,\ | |
| 6744 | - X86_64_DEF([INDEX_op_rcrq ## SUFFIX ## _T0_T1_cc] = CC_O | CC_C,)\ | |
| 6745 | -\ | |
| 6746 | - [INDEX_op_shlb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6747 | - [INDEX_op_shlw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6748 | - [INDEX_op_shll ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6749 | - X86_64_DEF([INDEX_op_shlq ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,)\ | |
| 6750 | -\ | |
| 6751 | - [INDEX_op_shrb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6752 | - [INDEX_op_shrw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6753 | - [INDEX_op_shrl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6754 | - X86_64_DEF([INDEX_op_shrq ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,)\ | |
| 6755 | -\ | |
| 6756 | - [INDEX_op_sarb ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6757 | - [INDEX_op_sarw ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6758 | - [INDEX_op_sarl ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,\ | |
| 6759 | - X86_64_DEF([INDEX_op_sarq ## SUFFIX ## _T0_T1_cc] = CC_OSZAPC,)\ | |
| 6760 | -\ | |
| 6761 | - [INDEX_op_shldw ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ | |
| 6762 | - [INDEX_op_shldl ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ | |
| 6763 | - X86_64_DEF([INDEX_op_shldq ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,)\ | |
| 6764 | - [INDEX_op_shldw ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ | |
| 6765 | - [INDEX_op_shldl ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ | |
| 6766 | - X86_64_DEF([INDEX_op_shldq ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,)\ | |
| 6767 | -\ | |
| 6768 | - [INDEX_op_shrdw ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ | |
| 6769 | - [INDEX_op_shrdl ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,\ | |
| 6770 | - X86_64_DEF([INDEX_op_shrdq ## SUFFIX ## _T0_T1_ECX_cc] = CC_OSZAPC,)\ | |
| 6771 | - [INDEX_op_shrdw ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ | |
| 6772 | - [INDEX_op_shrdl ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,\ | |
| 6773 | - X86_64_DEF([INDEX_op_shrdq ## SUFFIX ## _T0_T1_im_cc] = CC_OSZAPC,)\ | |
| 6774 | -\ | |
| 6775 | - [INDEX_op_cmpxchgb ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,\ | |
| 6776 | - [INDEX_op_cmpxchgw ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,\ | |
| 6777 | - [INDEX_op_cmpxchgl ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,\ | |
| 6778 | - X86_64_DEF([INDEX_op_cmpxchgq ## SUFFIX ## _T0_T1_EAX_cc] = CC_OSZAPC,) | |
| 6779 | - | |
| 6780 | - | |
| 6781 | - DEF_WRITEF( ) | |
| 6782 | - DEF_WRITEF(_raw) | |
| 6783 | -#ifndef CONFIG_USER_ONLY | |
| 6784 | - DEF_WRITEF(_kernel) | |
| 6785 | - DEF_WRITEF(_user) | |
| 6786 | -#endif | |
| 6787 | -}; | |
| 6788 | - | |
| 6789 | -/* simpler form of an operation if no flags need to be generated */ | |
| 6790 | -static uint16_t opc_simpler[NB_OPS] = { | |
| 6791 | - [INDEX_op_update2_cc] = INDEX_op_nop, | |
| 6792 | - [INDEX_op_update1_cc] = INDEX_op_nop, | |
| 6793 | - [INDEX_op_update_neg_cc] = INDEX_op_nop, | |
| 6794 | -#if 0 | |
| 6795 | - /* broken: CC_OP logic must be rewritten */ | |
| 6796 | - [INDEX_op_update_inc_cc] = INDEX_op_nop, | |
| 6797 | -#endif | |
| 6798 | - | |
| 6799 | - [INDEX_op_shlb_T0_T1_cc] = INDEX_op_shlb_T0_T1, | |
| 6800 | - [INDEX_op_shlw_T0_T1_cc] = INDEX_op_shlw_T0_T1, | |
| 6801 | - [INDEX_op_shll_T0_T1_cc] = INDEX_op_shll_T0_T1, | |
| 6802 | - X86_64_DEF([INDEX_op_shlq_T0_T1_cc] = INDEX_op_shlq_T0_T1,) | |
| 6803 | - | |
| 6804 | - [INDEX_op_shrb_T0_T1_cc] = INDEX_op_shrb_T0_T1, | |
| 6805 | - [INDEX_op_shrw_T0_T1_cc] = INDEX_op_shrw_T0_T1, | |
| 6806 | - [INDEX_op_shrl_T0_T1_cc] = INDEX_op_shrl_T0_T1, | |
| 6807 | - X86_64_DEF([INDEX_op_shrq_T0_T1_cc] = INDEX_op_shrq_T0_T1,) | |
| 6808 | - | |
| 6809 | - [INDEX_op_sarb_T0_T1_cc] = INDEX_op_sarb_T0_T1, | |
| 6810 | - [INDEX_op_sarw_T0_T1_cc] = INDEX_op_sarw_T0_T1, | |
| 6811 | - [INDEX_op_sarl_T0_T1_cc] = INDEX_op_sarl_T0_T1, | |
| 6812 | - X86_64_DEF([INDEX_op_sarq_T0_T1_cc] = INDEX_op_sarq_T0_T1,) | |
| 6813 | - | |
| 6814 | -#define DEF_SIMPLER(SUFFIX)\ | |
| 6815 | - [INDEX_op_rolb ## SUFFIX ## _T0_T1_cc] = INDEX_op_rolb ## SUFFIX ## _T0_T1,\ | |
| 6816 | - [INDEX_op_rolw ## SUFFIX ## _T0_T1_cc] = INDEX_op_rolw ## SUFFIX ## _T0_T1,\ | |
| 6817 | - [INDEX_op_roll ## SUFFIX ## _T0_T1_cc] = INDEX_op_roll ## SUFFIX ## _T0_T1,\ | |
| 6818 | - X86_64_DEF([INDEX_op_rolq ## SUFFIX ## _T0_T1_cc] = INDEX_op_rolq ## SUFFIX ## _T0_T1,)\ | |
| 6819 | -\ | |
| 6820 | - [INDEX_op_rorb ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorb ## SUFFIX ## _T0_T1,\ | |
| 6821 | - [INDEX_op_rorw ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorw ## SUFFIX ## _T0_T1,\ | |
| 6822 | - [INDEX_op_rorl ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorl ## SUFFIX ## _T0_T1,\ | |
| 6823 | - X86_64_DEF([INDEX_op_rorq ## SUFFIX ## _T0_T1_cc] = INDEX_op_rorq ## SUFFIX ## _T0_T1,) | |
| 6824 | - | |
| 6825 | - DEF_SIMPLER( ) | |
| 6826 | - DEF_SIMPLER(_raw) | |
| 6827 | -#ifndef CONFIG_USER_ONLY | |
| 6828 | - DEF_SIMPLER(_kernel) | |
| 6829 | - DEF_SIMPLER(_user) | |
| 6830 | -#endif | |
| 6831 | -}; | |
| 6832 | - | |
| 6833 | 6811 | static void tcg_macro_func(TCGContext *s, int macro_id, const int *dead_args) |
| 6834 | 6812 | { |
| 6835 | 6813 | switch(macro_id) { |
| ... | ... | @@ -6843,13 +6821,11 @@ static void tcg_macro_func(TCGContext *s, int macro_id, const int *dead_args) |
| 6843 | 6821 | |
| 6844 | 6822 | void optimize_flags_init(void) |
| 6845 | 6823 | { |
| 6846 | - int i; | |
| 6847 | - /* put default values in arrays */ | |
| 6848 | - for(i = 0; i < NB_OPS; i++) { | |
| 6849 | - if (opc_simpler[i] == 0) | |
| 6850 | - opc_simpler[i] = i; | |
| 6851 | - } | |
| 6852 | - | |
| 6824 | +#if TCG_TARGET_REG_BITS == 32 | |
| 6825 | + assert(sizeof(CCTable) == (1 << 3)); | |
| 6826 | +#else | |
| 6827 | + assert(sizeof(CCTable) == (1 << 4)); | |
| 6828 | +#endif | |
| 6853 | 6829 | tcg_set_macro_func(&tcg_ctx, tcg_macro_func); |
| 6854 | 6830 | |
| 6855 | 6831 | cpu_env = tcg_global_reg_new(TCG_TYPE_PTR, TCG_AREG0, "env"); |
| ... | ... | @@ -6865,37 +6841,18 @@ void optimize_flags_init(void) |
| 6865 | 6841 | cpu_T[1] = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG2, "T1"); |
| 6866 | 6842 | cpu_A0 = tcg_global_reg_new(TCG_TYPE_TL, TCG_AREG3, "A0"); |
| 6867 | 6843 | #endif |
| 6844 | + cpu_T3 = tcg_global_mem_new(TCG_TYPE_TL, | |
| 6845 | + TCG_AREG0, offsetof(CPUState, t3), "T3"); | |
| 6868 | 6846 | #if defined(__i386__) && (TARGET_LONG_BITS <= HOST_LONG_BITS) |
| 6869 | 6847 | /* XXX: must be suppressed once there are less fixed registers */ |
| 6870 | - cpu_tmp1 = tcg_global_reg2_new_hack(TCG_TYPE_I64, TCG_AREG1, TCG_AREG2, "tmp1"); | |
| 6848 | + cpu_tmp1_i64 = tcg_global_reg2_new_hack(TCG_TYPE_I64, TCG_AREG1, TCG_AREG2, "tmp1"); | |
| 6871 | 6849 | #endif |
| 6872 | -} | |
| 6873 | - | |
| 6874 | -/* CPU flags computation optimization: we move backward thru the | |
| 6875 | - generated code to see which flags are needed. The operation is | |
| 6876 | - modified if suitable */ | |
| 6877 | -static void optimize_flags(uint16_t *opc_buf, int opc_buf_len) | |
| 6878 | -{ | |
| 6879 | - uint16_t *opc_ptr; | |
| 6880 | - int live_flags, write_flags, op; | |
| 6881 | - | |
| 6882 | - opc_ptr = opc_buf + opc_buf_len; | |
| 6883 | - /* live_flags contains the flags needed by the next instructions | |
| 6884 | - in the code. At the end of the block, we consider that all the | |
| 6885 | - flags are live. */ | |
| 6886 | - live_flags = CC_OSZAPC; | |
| 6887 | - while (opc_ptr > opc_buf) { | |
| 6888 | - op = *--opc_ptr; | |
| 6889 | - /* if none of the flags written by the instruction is used, | |
| 6890 | - then we can try to find a simpler instruction */ | |
| 6891 | - write_flags = opc_write_flags[op]; | |
| 6892 | - if ((live_flags & write_flags) == 0) { | |
| 6893 | - *opc_ptr = opc_simpler[op]; | |
| 6894 | - } | |
| 6895 | - /* compute the live flags before the instruction */ | |
| 6896 | - live_flags &= ~write_flags; | |
| 6897 | - live_flags |= opc_read_flags[op]; | |
| 6898 | - } | |
| 6850 | + cpu_cc_op = tcg_global_mem_new(TCG_TYPE_I32, | |
| 6851 | + TCG_AREG0, offsetof(CPUState, cc_op), "cc_op"); | |
| 6852 | + cpu_cc_src = tcg_global_mem_new(TCG_TYPE_TL, | |
| 6853 | + TCG_AREG0, offsetof(CPUState, cc_src), "cc_src"); | |
| 6854 | + cpu_cc_dst = tcg_global_mem_new(TCG_TYPE_TL, | |
| 6855 | + TCG_AREG0, offsetof(CPUState, cc_dst), "cc_dst"); | |
| 6899 | 6856 | } |
| 6900 | 6857 | |
| 6901 | 6858 | /* generate intermediate code in gen_opc_buf and gen_opparam_buf for |
| ... | ... | @@ -6963,10 +6920,13 @@ static inline int gen_intermediate_code_internal(CPUState *env, |
| 6963 | 6920 | |
| 6964 | 6921 | cpu_tmp0 = tcg_temp_new(TCG_TYPE_TL); |
| 6965 | 6922 | #if !(defined(__i386__) && (TARGET_LONG_BITS <= HOST_LONG_BITS)) |
| 6966 | - cpu_tmp1 = tcg_temp_new(TCG_TYPE_I64); | |
| 6923 | + cpu_tmp1_i64 = tcg_temp_new(TCG_TYPE_I64); | |
| 6967 | 6924 | #endif |
| 6968 | - cpu_tmp2 = tcg_temp_new(TCG_TYPE_I32); | |
| 6969 | - cpu_tmp3 = tcg_temp_new(TCG_TYPE_I32); | |
| 6925 | + cpu_tmp2_i32 = tcg_temp_new(TCG_TYPE_I32); | |
| 6926 | + cpu_tmp3_i32 = tcg_temp_new(TCG_TYPE_I32); | |
| 6927 | + cpu_tmp4 = tcg_temp_new(TCG_TYPE_TL); | |
| 6928 | + cpu_tmp5 = tcg_temp_new(TCG_TYPE_TL); | |
| 6929 | + cpu_tmp6 = tcg_temp_new(TCG_TYPE_TL); | |
| 6970 | 6930 | cpu_ptr0 = tcg_temp_new(TCG_TYPE_PTR); |
| 6971 | 6931 | cpu_ptr1 = tcg_temp_new(TCG_TYPE_PTR); |
| 6972 | 6932 | |
| ... | ... | @@ -7053,9 +7013,6 @@ static inline int gen_intermediate_code_internal(CPUState *env, |
| 7053 | 7013 | } |
| 7054 | 7014 | #endif |
| 7055 | 7015 | |
| 7056 | - /* optimize flag computations */ | |
| 7057 | - optimize_flags(gen_opc_buf, gen_opc_ptr - gen_opc_buf); | |
| 7058 | - | |
| 7059 | 7016 | if (!search_pc) |
| 7060 | 7017 | tb->size = pc_ptr - pc_start; |
| 7061 | 7018 | return 0; | ... | ... |