From: Julian Seward Date: Sun, 25 Jul 2004 23:39:13 +0000 (+0000) Subject: Fill in a few more thunks cases. X-Git-Tag: svn/VALGRIND_3_0_1^2~1208 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=642e9fce8997bef35bf21d7c36db030fd17477a0;p=thirdparty%2Fvalgrind.git Fill in a few more thunks cases. git-svn-id: svn://svn.valgrind.org/vex/trunk@126 --- diff --git a/VEX/priv/guest-x86/x86helpers.c b/VEX/priv/guest-x86/x86helpers.c index f889388ef9..cf21b37794 100644 --- a/VEX/priv/guest-x86/x86helpers.c +++ b/VEX/priv/guest-x86/x86helpers.c @@ -26,9 +26,11 @@ */ 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", diff --git a/VEX/priv/guest-x86/x86toIR.c b/VEX/priv/guest-x86/x86toIR.c index fe9dd5e41c..c95cfe32ca 100644 --- a/VEX/priv/guest-x86/x86toIR.c +++ b/VEX/priv/guest-x86/x86toIR.c @@ -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); diff --git a/VEX/priv/host-generic/reg_alloc.c b/VEX/priv/host-generic/reg_alloc.c index 2aebf95446..fb4025874f 100644 --- a/VEX/priv/host-generic/reg_alloc.c +++ b/VEX/priv/host-generic/reg_alloc.c @@ -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) diff --git a/VEX/priv/host-x86/x86host_defs.c b/VEX/priv/host-x86/x86host_defs.c index 283a5a3cfd..8fe91081fa 100644 --- a/VEX/priv/host-x86/x86host_defs.c +++ b/VEX/priv/host-x86/x86host_defs.c @@ -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); }