/[qemu]/qemu/target-i386/ops_template_mem.h
ViewVC logotype

Diff of /qemu/target-i386/ops_template_mem.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by bellard, Sun Jan 18 21:44:40 2004 UTC revision 1.4 by bellard, Mon Jan 3 23:50:08 2005 UTC
# Line 28  Line 28 
28  #define MEM_SUFFIX w_raw  #define MEM_SUFFIX w_raw
29  #elif DATA_BITS == 32  #elif DATA_BITS == 32
30  #define MEM_SUFFIX l_raw  #define MEM_SUFFIX l_raw
31    #elif DATA_BITS == 64
32    #define MEM_SUFFIX q_raw
33  #endif  #endif
34    
35  #elif MEM_WRITE == 1  #elif MEM_WRITE == 1
# Line 38  Line 40 
40  #define MEM_SUFFIX w_kernel  #define MEM_SUFFIX w_kernel
41  #elif DATA_BITS == 32  #elif DATA_BITS == 32
42  #define MEM_SUFFIX l_kernel  #define MEM_SUFFIX l_kernel
43    #elif DATA_BITS == 64
44    #define MEM_SUFFIX q_kernel
45  #endif  #endif
46    
47  #elif MEM_WRITE == 2  #elif MEM_WRITE == 2
# Line 48  Line 52 
52  #define MEM_SUFFIX w_user  #define MEM_SUFFIX w_user
53  #elif DATA_BITS == 32  #elif DATA_BITS == 32
54  #define MEM_SUFFIX l_user  #define MEM_SUFFIX l_user
55    #elif DATA_BITS == 64
56    #define MEM_SUFFIX q_user
57  #endif  #endif
58    
59  #else  #else
# Line 64  Line 70 
70    
71  void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_rol, MEM_SUFFIX), _T0_T1_cc)(void)
72  {  {
73      int count, src;      int count;
74        target_long src;
75    
76      count = T1 & SHIFT_MASK;      count = T1 & SHIFT_MASK;
77      if (count) {      if (count) {
78          src = T0;          src = T0;
79          T0 &= DATA_MASK;          T0 &= DATA_MASK;
80          T0 = (T0 << count) | (T0 >> (DATA_BITS - count));          T0 = (T0 << count) | (T0 >> (DATA_BITS - count));
81  #ifdef MEM_WRITE  #ifdef MEM_WRITE
82          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
83  #else  #else
84          /* gcc 3.2 workaround. This is really a bug in gcc. */          /* gcc 3.2 workaround. This is really a bug in gcc. */
85          asm volatile("" : : "r" (T0));          asm volatile("" : : "r" (T0));
# Line 86  void OPPROTO glue(glue(op_rol, MEM_SUFFI Line 94  void OPPROTO glue(glue(op_rol, MEM_SUFFI
94    
95  void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_ror, MEM_SUFFIX), _T0_T1_cc)(void)
96  {  {
97      int count, src;      int count;
98        target_long src;
99    
100      count = T1 & SHIFT_MASK;      count = T1 & SHIFT_MASK;
101      if (count) {      if (count) {
102          src = T0;          src = T0;
103          T0 &= DATA_MASK;          T0 &= DATA_MASK;
104          T0 = (T0 >> count) | (T0 << (DATA_BITS - count));          T0 = (T0 >> count) | (T0 << (DATA_BITS - count));
105  #ifdef MEM_WRITE  #ifdef MEM_WRITE
106          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
107  #else  #else
108          /* gcc 3.2 workaround. This is really a bug in gcc. */          /* gcc 3.2 workaround. This is really a bug in gcc. */
109          asm volatile("" : : "r" (T0));          asm volatile("" : : "r" (T0));
# Line 114  void OPPROTO glue(glue(op_rol, MEM_SUFFI Line 124  void OPPROTO glue(glue(op_rol, MEM_SUFFI
124          T0 &= DATA_MASK;          T0 &= DATA_MASK;
125          T0 = (T0 << count) | (T0 >> (DATA_BITS - count));          T0 = (T0 << count) | (T0 >> (DATA_BITS - count));
126  #ifdef MEM_WRITE  #ifdef MEM_WRITE
127          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
128  #endif  #endif
129      }      }
130      FORCE_RET();      FORCE_RET();
# Line 128  void OPPROTO glue(glue(op_ror, MEM_SUFFI Line 138  void OPPROTO glue(glue(op_ror, MEM_SUFFI
138          T0 &= DATA_MASK;          T0 &= DATA_MASK;
139          T0 = (T0 >> count) | (T0 << (DATA_BITS - count));          T0 = (T0 >> count) | (T0 << (DATA_BITS - count));
140  #ifdef MEM_WRITE  #ifdef MEM_WRITE
141          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
142  #endif  #endif
143      }      }
144      FORCE_RET();      FORCE_RET();
# Line 136  void OPPROTO glue(glue(op_ror, MEM_SUFFI Line 146  void OPPROTO glue(glue(op_ror, MEM_SUFFI
146    
147  void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_rcl, MEM_SUFFIX), _T0_T1_cc)(void)
148  {  {
149      int count, res, eflags;      int count, eflags;
150      unsigned int src;      target_ulong src;
151        target_long res;
152    
153      count = T1 & 0x1f;      count = T1 & SHIFT1_MASK;
154  #if DATA_BITS == 16  #if DATA_BITS == 16
155      count = rclw_table[count];      count = rclw_table[count];
156  #elif DATA_BITS == 8  #elif DATA_BITS == 8
# Line 154  void OPPROTO glue(glue(op_rcl, MEM_SUFFI Line 165  void OPPROTO glue(glue(op_rcl, MEM_SUFFI
165              res |= T0 >> (DATA_BITS + 1 - count);              res |= T0 >> (DATA_BITS + 1 - count);
166          T0 = res;          T0 = res;
167  #ifdef MEM_WRITE  #ifdef MEM_WRITE
168          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
169  #endif  #endif
170          CC_SRC = (eflags & ~(CC_C | CC_O)) |          CC_SRC = (eflags & ~(CC_C | CC_O)) |
171              (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) |              (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) |
# Line 166  void OPPROTO glue(glue(op_rcl, MEM_SUFFI Line 177  void OPPROTO glue(glue(op_rcl, MEM_SUFFI
177    
178  void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_rcr, MEM_SUFFIX), _T0_T1_cc)(void)
179  {  {
180      int count, res, eflags;      int count, eflags;
181      unsigned int src;      target_ulong src;
182        target_long res;
183    
184      count = T1 & 0x1f;      count = T1 & SHIFT1_MASK;
185  #if DATA_BITS == 16  #if DATA_BITS == 16
186      count = rclw_table[count];      count = rclw_table[count];
187  #elif DATA_BITS == 8  #elif DATA_BITS == 8
# Line 184  void OPPROTO glue(glue(op_rcr, MEM_SUFFI Line 196  void OPPROTO glue(glue(op_rcr, MEM_SUFFI
196              res |= T0 << (DATA_BITS + 1 - count);              res |= T0 << (DATA_BITS + 1 - count);
197          T0 = res;          T0 = res;
198  #ifdef MEM_WRITE  #ifdef MEM_WRITE
199          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
200  #endif  #endif
201          CC_SRC = (eflags & ~(CC_C | CC_O)) |          CC_SRC = (eflags & ~(CC_C | CC_O)) |
202              (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) |              (lshift(src ^ T0, 11 - (DATA_BITS - 1)) & CC_O) |
# Line 196  void OPPROTO glue(glue(op_rcr, MEM_SUFFI Line 208  void OPPROTO glue(glue(op_rcr, MEM_SUFFI
208    
209  void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_shl, MEM_SUFFIX), _T0_T1_cc)(void)
210  {  {
211      int count, src;      int count;
212      count = T1 & 0x1f;      target_long src;
213    
214        count = T1 & SHIFT1_MASK;
215      if (count) {      if (count) {
216          src = (DATA_TYPE)T0 << (count - 1);          src = (DATA_TYPE)T0 << (count - 1);
217          T0 = T0 << count;          T0 = T0 << count;
218  #ifdef MEM_WRITE  #ifdef MEM_WRITE
219          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
220  #endif  #endif
221          CC_SRC = src;          CC_SRC = src;
222          CC_DST = T0;          CC_DST = T0;
# Line 213  void OPPROTO glue(glue(op_shl, MEM_SUFFI Line 227  void OPPROTO glue(glue(op_shl, MEM_SUFFI
227    
228  void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_shr, MEM_SUFFIX), _T0_T1_cc)(void)
229  {  {
230      int count, src;      int count;
231      count = T1 & 0x1f;      target_long src;
232    
233        count = T1 & SHIFT1_MASK;
234      if (count) {      if (count) {
235          T0 &= DATA_MASK;          T0 &= DATA_MASK;
236          src = T0 >> (count - 1);          src = T0 >> (count - 1);
237          T0 = T0 >> count;          T0 = T0 >> count;
238  #ifdef MEM_WRITE  #ifdef MEM_WRITE
239          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
240  #endif  #endif
241          CC_SRC = src;          CC_SRC = src;
242          CC_DST = T0;          CC_DST = T0;
# Line 231  void OPPROTO glue(glue(op_shr, MEM_SUFFI Line 247  void OPPROTO glue(glue(op_shr, MEM_SUFFI
247    
248  void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_sar, MEM_SUFFIX), _T0_T1_cc)(void)
249  {  {
250      int count, src;      int count;
251      count = T1 & 0x1f;      target_long src;
252    
253        count = T1 & SHIFT1_MASK;
254      if (count) {      if (count) {
255          src = (DATA_STYPE)T0;          src = (DATA_STYPE)T0;
256          T0 = src >> count;          T0 = src >> count;
257          src = src >> (count - 1);          src = src >> (count - 1);
258  #ifdef MEM_WRITE  #ifdef MEM_WRITE
259          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
260  #endif  #endif
261          CC_SRC = src;          CC_SRC = src;
262          CC_DST = T0;          CC_DST = T0;
# Line 262  void OPPROTO glue(glue(op_shld, MEM_SUFF Line 280  void OPPROTO glue(glue(op_shld, MEM_SUFF
280          res |= T1 << (count - 16);          res |= T1 << (count - 16);
281      T0 = res >> 16;      T0 = res >> 16;
282  #ifdef MEM_WRITE  #ifdef MEM_WRITE
283      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
284  #endif  #endif
285      CC_SRC = tmp;      CC_SRC = tmp;
286      CC_DST = T0;      CC_DST = T0;
# Line 282  void OPPROTO glue(glue(op_shld, MEM_SUFF Line 300  void OPPROTO glue(glue(op_shld, MEM_SUFF
300            res |= T1 << (count - 16);            res |= T1 << (count - 16);
301          T0 = res >> 16;          T0 = res >> 16;
302  #ifdef MEM_WRITE  #ifdef MEM_WRITE
303          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
304  #endif  #endif
305          CC_SRC = tmp;          CC_SRC = tmp;
306          CC_DST = T0;          CC_DST = T0;
# Line 304  void OPPROTO glue(glue(op_shrd, MEM_SUFF Line 322  void OPPROTO glue(glue(op_shrd, MEM_SUFF
322          res |= T1 << (32 - count);          res |= T1 << (32 - count);
323      T0 = res;      T0 = res;
324  #ifdef MEM_WRITE  #ifdef MEM_WRITE
325      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
326  #endif  #endif
327      CC_SRC = tmp;      CC_SRC = tmp;
328      CC_DST = T0;      CC_DST = T0;
# Line 325  void OPPROTO glue(glue(op_shrd, MEM_SUFF Line 343  void OPPROTO glue(glue(op_shrd, MEM_SUFF
343              res |= T1 << (32 - count);              res |= T1 << (32 - count);
344          T0 = res;          T0 = res;
345  #ifdef MEM_WRITE  #ifdef MEM_WRITE
346          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
347  #endif  #endif
348          CC_SRC = tmp;          CC_SRC = tmp;
349          CC_DST = T0;          CC_DST = T0;
# Line 335  void OPPROTO glue(glue(op_shrd, MEM_SUFF Line 353  void OPPROTO glue(glue(op_shrd, MEM_SUFF
353  }  }
354  #endif  #endif
355    
356  #if DATA_BITS == 32  #if DATA_BITS >= 32
357  void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void)  void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_im_cc)(void)
358  {  {
359      int count, tmp;      int count;
360        target_long tmp;
361    
362      count = PARAM1;      count = PARAM1;
363      T0 &= DATA_MASK;      T0 &= DATA_MASK;
364      T1 &= DATA_MASK;      T1 &= DATA_MASK;
365      tmp = T0 << (count - 1);      tmp = T0 << (count - 1);
366      T0 = (T0 << count) | (T1 >> (DATA_BITS - count));      T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
367  #ifdef MEM_WRITE  #ifdef MEM_WRITE
368      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
369  #endif  #endif
370      CC_SRC = tmp;      CC_SRC = tmp;
371      CC_DST = T0;      CC_DST = T0;
# Line 353  void OPPROTO glue(glue(op_shld, MEM_SUFF Line 373  void OPPROTO glue(glue(op_shld, MEM_SUFF
373    
374  void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void)  void OPPROTO glue(glue(op_shld, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
375  {  {
376      int count, tmp;      int count;
377      count = ECX & 0x1f;      target_long tmp;
378    
379        count = ECX & SHIFT1_MASK;
380      if (count) {      if (count) {
381          T0 &= DATA_MASK;          T0 &= DATA_MASK;
382          T1 &= DATA_MASK;          T1 &= DATA_MASK;
383          tmp = T0 << (count - 1);          tmp = T0 << (count - 1);
384          T0 = (T0 << count) | (T1 >> (DATA_BITS - count));          T0 = (T0 << count) | (T1 >> (DATA_BITS - count));
385  #ifdef MEM_WRITE  #ifdef MEM_WRITE
386          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
387  #endif  #endif
388          CC_SRC = tmp;          CC_SRC = tmp;
389          CC_DST = T0;          CC_DST = T0;
# Line 372  void OPPROTO glue(glue(op_shld, MEM_SUFF Line 394  void OPPROTO glue(glue(op_shld, MEM_SUFF
394    
395  void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void)  void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_im_cc)(void)
396  {  {
397      int count, tmp;      int count;
398        target_long tmp;
399    
400      count = PARAM1;      count = PARAM1;
401      T0 &= DATA_MASK;      T0 &= DATA_MASK;
402      T1 &= DATA_MASK;      T1 &= DATA_MASK;
403      tmp = T0 >> (count - 1);      tmp = T0 >> (count - 1);
404      T0 = (T0 >> count) | (T1 << (DATA_BITS - count));      T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
405  #ifdef MEM_WRITE  #ifdef MEM_WRITE
406      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
407  #endif  #endif
408      CC_SRC = tmp;      CC_SRC = tmp;
409      CC_DST = T0;      CC_DST = T0;
# Line 388  void OPPROTO glue(glue(op_shrd, MEM_SUFF Line 412  void OPPROTO glue(glue(op_shrd, MEM_SUFF
412    
413  void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void)  void OPPROTO glue(glue(op_shrd, MEM_SUFFIX), _T0_T1_ECX_cc)(void)
414  {  {
415      int count, tmp;      int count;
416      count = ECX & 0x1f;      target_long tmp;
417    
418        count = ECX & SHIFT1_MASK;
419      if (count) {      if (count) {
420          T0 &= DATA_MASK;          T0 &= DATA_MASK;
421          T1 &= DATA_MASK;          T1 &= DATA_MASK;
422          tmp = T0 >> (count - 1);          tmp = T0 >> (count - 1);
423          T0 = (T0 >> count) | (T1 << (DATA_BITS - count));          T0 = (T0 >> count) | (T1 << (DATA_BITS - count));
424  #ifdef MEM_WRITE  #ifdef MEM_WRITE
425          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
426  #endif  #endif
427          CC_SRC = tmp;          CC_SRC = tmp;
428          CC_DST = T0;          CC_DST = T0;
# Line 414  void OPPROTO glue(glue(op_adc, MEM_SUFFI Line 440  void OPPROTO glue(glue(op_adc, MEM_SUFFI
440      cf = cc_table[CC_OP].compute_c();      cf = cc_table[CC_OP].compute_c();
441      T0 = T0 + T1 + cf;      T0 = T0 + T1 + cf;
442  #ifdef MEM_WRITE  #ifdef MEM_WRITE
443      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
444  #endif  #endif
445      CC_SRC = T1;      CC_SRC = T1;
446      CC_DST = T0;      CC_DST = T0;
447      CC_OP = CC_OP_ADDB + SHIFT + cf * 3;      CC_OP = CC_OP_ADDB + SHIFT + cf * 4;
448  }  }
449    
450  void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void)  void OPPROTO glue(glue(op_sbb, MEM_SUFFIX), _T0_T1_cc)(void)
# Line 427  void OPPROTO glue(glue(op_sbb, MEM_SUFFI Line 453  void OPPROTO glue(glue(op_sbb, MEM_SUFFI
453      cf = cc_table[CC_OP].compute_c();      cf = cc_table[CC_OP].compute_c();
454      T0 = T0 - T1 - cf;      T0 = T0 - T1 - cf;
455  #ifdef MEM_WRITE  #ifdef MEM_WRITE
456      glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);      glue(st, MEM_SUFFIX)(A0, T0);
457  #endif  #endif
458      CC_SRC = T1;      CC_SRC = T1;
459      CC_DST = T0;      CC_DST = T0;
460      CC_OP = CC_OP_SUBB + SHIFT + cf * 3;      CC_OP = CC_OP_SUBB + SHIFT + cf * 4;
461  }  }
462    
463  void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void)  void OPPROTO glue(glue(op_cmpxchg, MEM_SUFFIX), _T0_T1_EAX_cc)(void)
464  {  {
465      unsigned int src, dst;      target_ulong src, dst;
466    
467      src = T0;      src = T0;
468      dst = EAX - T0;      dst = EAX - T0;
469      if ((DATA_TYPE)dst == 0) {      if ((DATA_TYPE)dst == 0) {
470          T0 = T1;          T0 = T1;
471  #ifdef MEM_WRITE  #ifdef MEM_WRITE
472          glue(st, MEM_SUFFIX)((uint8_t *)A0, T0);          glue(st, MEM_SUFFIX)(A0, T0);
473  #endif  #endif
474      } else {      } else {
475          EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK);          EAX = (EAX & ~DATA_MASK) | (T0 & DATA_MASK);

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26