]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fill in a few more thunks cases.
authorJulian Seward <jseward@acm.org>
Sun, 25 Jul 2004 23:39:13 +0000 (23:39 +0000)
committerJulian Seward <jseward@acm.org>
Sun, 25 Jul 2004 23:39:13 +0000 (23:39 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@126

VEX/priv/guest-x86/x86helpers.c
VEX/priv/guest-x86/x86toIR.c
VEX/priv/host-generic/reg_alloc.c
VEX/priv/host-x86/x86host_defs.c

index f889388ef9e60e09721e986ed7873ce322cb2f9a..cf21b3779489248530dd13169a22a82a86e41216 100644 (file)
 */
 
 typedef UChar uint8_t;
+typedef UInt  uint32_t;
 
 #define CC_O CC_MASK_O
 #define CC_P CC_MASK_P
+#define CC_C CC_MASK_C
 
 
 static const uint8_t parity_table[256] = {
@@ -79,6 +81,7 @@ static inline int lshift(int x, int n)
 #define PREAMBLE(__data_bits)                                           \
    const UInt DATA_MASK                                                 \
       = __data_bits==8 ? 0xFF : (__data_bits==16 ? 0xFFFF : 0xFFFFFFFF); \
+   const UInt SIGN_MASK = 1 << (__data_bits - 1);                        \
    const UInt CC_DST = cc_dst;                                          \
    const UInt CC_SRC = cc_src
 
@@ -157,23 +160,44 @@ static inline int lshift(int x, int n)
     return cf | pf | af | zf | sf | of;                                \
 }
 
+#define ACTIONS_DEC(DATA_BITS,DATA_TYPE,DATA_STYPE)                    \
+{                                                                      \
+  PREAMBLE(DATA_BITS);                                                 \
+  int cf, pf, af, zf, sf, of;                                          \
+  int src1, src2;                                                      \
+  src1 = CC_DST + 1;                                                   \
+  src2 = 1;                                                            \
+  cf = CC_SRC;                                                         \
+  pf = parity_table[(uint8_t)CC_DST];                                  \
+  af = (CC_DST ^ src1 ^ src2) & 0x10;                                  \
+  zf = ((DATA_TYPE)CC_DST == 0) << 6;                                  \
+  sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;                           \
+  of = ((CC_DST & DATA_MASK) == ((uint32_t)SIGN_MASK - 1)) << 11;      \
+  return cf | pf | af | zf | sf | of;                                  \
+}
+
+
 
 /* CALLED FROM GENERATED CODE */
 /*static*/ UInt calculate_eflags_all ( UInt cc_op, UInt cc_src, UInt cc_dst )
 {
    switch (cc_op) {
    case CC_OP_COPY:
-     return cc_src & (CC_MASK_O | CC_MASK_S | CC_MASK_Z | CC_MASK_A | CC_MASK_C | CC_MASK_O);
+      return cc_src & (CC_MASK_O | CC_MASK_S | CC_MASK_Z 
+                       | CC_MASK_A | CC_MASK_C | CC_MASK_O);
 
       case CC_OP_ADDL:   ACTIONS_ADD(32,UInt,Int);
 
       case CC_OP_SUBB:   ACTIONS_SUB(8,UChar,Char);
       case CC_OP_SUBL:   ACTIONS_SUB(32,UInt,Int);
+
       case CC_OP_LOGICB: ACTIONS_LOGIC(8,UChar,Char);
       case CC_OP_LOGICL: ACTIONS_LOGIC(32,UInt,Int);
 
-   case CC_OP_SHLL: ACTIONS_SHL(32,UInt,Int);
-   case CC_OP_SARL: ACTIONS_SAR(32,UInt,Int);
+      case CC_OP_DECL: ACTIONS_DEC(32,UInt,Int);
+
+      case CC_OP_SHLL: ACTIONS_SHL(32,UInt,Int);
+      case CC_OP_SARL: ACTIONS_SAR(32,UInt,Int);
       default:
          /* shouldn't really make these calls from generated code */
          vex_printf("calculate_eflags_all( %d, 0x%x, 0x%x )\n",
index fe9dd5e41c4d000adb06acadb090515e4d3c3704..c95cfe32ca5a12d9d707fe9cbd25fd042e16a095 100644 (file)
@@ -6666,9 +6666,9 @@ static UInt disInstr ( UInt delta, Bool* isEnd )
    case 0x68: /* PUSH Iv */
       d32 = getUDisp(sz,delta); delta += sz;
       goto do_push_I;
-//--    case 0x6A: /* PUSH Ib, sign-extended to sz */
-//--       d32 = getSDisp8(eip); eip += 1;
-//--       goto do_push_I;
+   case 0x6A: /* PUSH Ib, sign-extended to sz */
+      d32 = getSDisp8(delta); delta += 1;
+      goto do_push_I;
    do_push_I:
       ty = szToITy(sz);
       t1 = newTemp(Ity_I32); t2 = newTemp(ty);
index 2aebf95446a1ab47c80aac5e31ba2baad87a9dde..fb4025874f583ad966ed686ef690041671ea0f93 100644 (file)
@@ -16,7 +16,7 @@
 #define DEBUG_REGALLOC 0
 
 /* How many 64-bit sized spill slots do we have? */
-#define N_SPILL64S  16
+#define N_SPILL64S  12
 
 
 /* TODO (critical)
index 283a5a3cfd2ebe537dad5fa21fd33f416fdd0559..8fe91081fa55f4f4a4dd3ae52194c5ce834eb565 100644 (file)
@@ -46,9 +46,9 @@ void ppHRegX86 ( HReg reg )
 }
 
 HReg hregX86_EAX ( void ) { return mkHReg(0, HRcInt, False); }
-HReg hregX86_EBX ( void ) { return mkHReg(3, HRcInt, False); }
 HReg hregX86_ECX ( void ) { return mkHReg(1, HRcInt, False); }
 HReg hregX86_EDX ( void ) { return mkHReg(2, HRcInt, False); }
+HReg hregX86_EBX ( void ) { return mkHReg(3, HRcInt, False); }
 HReg hregX86_ESP ( void ) { return mkHReg(4, HRcInt, False); }
 HReg hregX86_EBP ( void ) { return mkHReg(5, HRcInt, False); }
 HReg hregX86_ESI ( void ) { return mkHReg(6, HRcInt, False); }