From: Julian Seward Date: Thu, 26 Aug 2004 11:24:39 +0000 (+0000) Subject: x86->IR->x86: handle byte-sized cmpxchg. X-Git-Tag: svn/VALGRIND_3_0_1^2~1118 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c6f59cdb5587d7712aa5aaa4ee828e6bf6f2d06b;p=thirdparty%2Fvalgrind.git x86->IR->x86: handle byte-sized cmpxchg. git-svn-id: svn://svn.valgrind.org/vex/trunk@216 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index 438ec62e2f..5b5eadb3f6 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -4053,7 +4053,6 @@ UInt dis_cmpxchg_G_E ( UChar sorb, DIP("cmpxchg%c %s,%s\n", nameISize(size), nameIReg(size,gregOfRM(rm)), nameIReg(size,eregOfRM(rm)) ); - vassert(0); } else { addr = disAMode ( &len, sorb, delta0, dis_buf ); assign( dest, loadLE(ty, mkexpr(addr)) ); @@ -7740,9 +7739,9 @@ static UInt disInstr ( UInt delta, Bool* isEnd ) /* =-=-=-=-=-=-=-=-=- CMPXCHG -=-=-=-=-=-=-=-=-=-= */ -//-- case 0xB0: /* CMPXCHG Gb,Eb */ -//-- eip = dis_cmpxchg_G_E ( cb, sorb, 1, eip ); -//-- break; + case 0xB0: /* CMPXCHG Gb,Eb */ + delta = dis_cmpxchg_G_E ( sorb, 1, delta ); + break; case 0xB1: /* CMPXCHG Gv,Ev */ delta = dis_cmpxchg_G_E ( sorb, sz, delta ); break; diff --git a/VEX/priv/host-x86/isel.c b/VEX/priv/host-x86/isel.c index d82b35ee18..86b2c2d28b 100644 --- a/VEX/priv/host-x86/isel.c +++ b/VEX/priv/host-x86/isel.c @@ -673,7 +673,7 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e ) /* --------- MULTIPLEX --------- */ case Iex_Mux0X: { - if (ty == Ity_I32 + if ((ty == Ity_I32 || ty == Ity_I16 || ty == Ity_I8) && typeOfIRExpr(env->type_env,e->Iex.Mux0X.cond) == Ity_I8) { HReg r8; HReg rX = iselIntExpr_R(env, e->Iex.Mux0X.exprX);