From: Julian Seward Date: Tue, 9 Nov 2004 16:01:40 +0000 (+0000) Subject: More primop support needed by memcheck. X-Git-Tag: svn/VALGRIND_3_0_1^2~803 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dca081e066cffca2d1146eb1c9d0ed5a427c39ef;p=thirdparty%2Fvalgrind.git More primop support needed by memcheck. git-svn-id: svn://svn.valgrind.org/vex/trunk@531 --- diff --git a/VEX/priv/host-x86/isel.c b/VEX/priv/host-x86/isel.c index 040a06c2d1..0ad7e64eb9 100644 --- a/VEX/priv/host-x86/isel.c +++ b/VEX/priv/host-x86/isel.c @@ -664,6 +664,19 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e ) } /* Handle misc other ops. */ + if (e->Iex.Binop.op == Iop_8HLto16) { + HReg hi8 = newVRegI(env); + HReg lo8 = newVRegI(env); + HReg hi8s = iselIntExpr_R(env, e->Iex.Binop.arg1); + HReg lo8s = iselIntExpr_R(env, e->Iex.Binop.arg2); + addInstr(env, mk_MOVsd_RR(hi8s, hi8)); + addInstr(env, mk_MOVsd_RR(lo8s, lo8)); + addInstr(env, X86Instr_Sh32(Xsh_SHL, 8, X86RM_Reg(hi8))); + addInstr(env, X86Instr_Alu32R(Xalu_AND, X86RMI_Imm(0xFF), lo8)); + addInstr(env, X86Instr_Alu32R(Xalu_OR, X86RMI_Reg(lo8), hi8)); + return hi8; + } + if (e->Iex.Binop.op == Iop_16HLto32) { HReg hi16 = newVRegI(env); HReg lo16 = newVRegI(env); @@ -880,6 +893,7 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e ) addInstr(env, X86Instr_Set32(cond,dst)); return dst; } + case Iop_1Sto8: case Iop_1Sto16: case Iop_1Sto32: { /* could do better than this, but for now ... */ diff --git a/VEX/priv/ir/irdefs.c b/VEX/priv/ir/irdefs.c index 06128fad6a..cdcd462b73 100644 --- a/VEX/priv/ir/irdefs.c +++ b/VEX/priv/ir/irdefs.c @@ -121,6 +121,7 @@ void ppIROp ( IROp op ) case Iop_32to1: vex_printf("32to1"); return; case Iop_1Uto8: vex_printf("1Uto8"); return; case Iop_1Uto32: vex_printf("1Uto32"); return; + case Iop_1Sto8: vex_printf("1Sto8"); return; case Iop_1Sto16: vex_printf("1Sto16"); return; case Iop_1Sto32: vex_printf("1Sto32"); return; case Iop_1Sto64: vex_printf("1Sto64"); return; @@ -992,6 +993,7 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 ) case Iop_Or1: BINARY(Ity_Bit,Ity_Bit,Ity_Bit); case Iop_Not1: UNARY(Ity_Bit,Ity_Bit); case Iop_1Uto8: UNARY(Ity_I8,Ity_Bit); + case Iop_1Sto8: UNARY(Ity_I8,Ity_Bit); case Iop_1Sto16: UNARY(Ity_I16,Ity_Bit); case Iop_1Uto32: case Iop_1Sto32: UNARY(Ity_I32,Ity_Bit); case Iop_1Sto64: UNARY(Ity_I64,Ity_Bit); diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index c4d61de500..8484f838da 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -200,6 +200,7 @@ typedef Iop_32to1, /* :: Ity_I32 -> Ity_Bit, just select bit[0] */ Iop_1Uto8, /* :: Ity_Bit -> Ity_I8, unsigned widen */ Iop_1Uto32, /* :: Ity_Bit -> Ity_I32, unsigned widen */ + Iop_1Sto8, /* :: Ity_Bit -> Ity_I8, signed widen */ Iop_1Sto16, /* :: Ity_Bit -> Ity_I16, signed widen */ Iop_1Sto32, /* :: Ity_Bit -> Ity_I32, signed widen */ Iop_1Sto64, /* :: Ity_Bit -> Ity_I64, signed widen */