Commit b6abf97df19a3c632ca6977c2056f8a675f3f3f0

Authored by bellard
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
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, &reg, 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, &reg, 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, &reg_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, &reg_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;
... ...