From: Julian Seward Date: Sat, 16 Oct 2004 11:32:15 +0000 (+0000) Subject: * Handle fcmovnz X-Git-Tag: svn/VALGRIND_3_0_1^2~977 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=71a7aba0fc7ef14e6f57dedfe1fc390c440598c3;p=thirdparty%2Fvalgrind.git * Handle fcmovnz * Handle byte-sized integer divide (divb, idivb) git-svn-id: svn://svn.valgrind.org/vex/trunk@357 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index 82c6175e35..144ef2a87e 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -104,6 +104,9 @@ static void unimplemented ( Char* str ) #define R_ESI 6 #define R_EDI 7 +#define R_AL (0+R_EAX) +#define R_AH (4+R_EAX) + static UInt extend_s_8to32( UInt x ) { @@ -1933,6 +1936,20 @@ void codegen_div ( Int sz, IRTemp t, Bool signed_divide ) putIReg( 2, R_EDX, unop(Iop_32to16,unop(Iop_64HIto32,mkexpr(dst64))) ); break; } + case 1: { + IROp widen3264 = signed_divide ? Iop_32Sto64 : Iop_32Uto64; + IROp widen1632 = signed_divide ? Iop_16Sto32 : Iop_16Uto32; + IROp widen816 = signed_divide ? Iop_8Sto16 : Iop_8Uto16; + assign( src64, unop(widen3264, unop(widen1632, getIReg(2,R_EAX))) ); + assign( dst64, + binop(op, mkexpr(src64), + unop(widen1632, unop(widen816, mkexpr(t)))) ); + putIReg( 1, R_AL, unop(Iop_16to8, unop(Iop_32to16, + unop(Iop_64to32,mkexpr(dst64)))) ); + putIReg( 1, R_AH, unop(Iop_16to8, unop(Iop_32to16, + unop(Iop_64HIto32,mkexpr(dst64)))) ); + break; + } default: vpanic("codegen_div(x86)"); } } @@ -3790,6 +3807,15 @@ UInt dis_FPU ( Bool* decode_ok, UChar sorb, UInt delta ) delta++; switch (modrm) { + case 0xC8 ... 0xCF: /* FCMOVNE(NZ) ST(i), ST(0) */ + r_src = (UInt)modrm - 0xC8; + DIP("fcmovnz %%st(%d), %%st(0)", r_src); + put_ST_UNCHECKED(0, + IRExpr_Mux0X( + unop(Iop_1Uto8,calculate_condition(CondNZ)), + get_ST(0), get_ST(r_src)) ); + break; + case 0xE8 ... 0xEF: /* FUCOMI %st(0),%st(?) */ fp_do_ucomi_ST0_STi( (UInt)modrm - 0xE8, False ); break;