From eda232feb3893aadf469d06af30b6572f7b4aa18 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Mon, 12 May 2008 23:09:09 +0000 Subject: [PATCH] Handle Left64 on 32-bit host. This stops Memcheck on ppc32 asserting on some bits of Altivec code. Partial merge of r1832. git-svn-id: svn://svn.valgrind.org/vex/branches/VEX_3_3_BRANCH@1839 --- VEX/priv/host-ppc/isel.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/VEX/priv/host-ppc/isel.c b/VEX/priv/host-ppc/isel.c index c3c400bed2..70cdc2887c 100644 --- a/VEX/priv/host-ppc/isel.c +++ b/VEX/priv/host-ppc/isel.c @@ -2751,6 +2751,28 @@ static void iselInt64Expr_wrk ( HReg* rHi, HReg* rLo, return; } + /* Left64 */ + case Iop_Left64: { + HReg argHi, argLo; + HReg zero32 = newVRegI(env); + HReg resHi = newVRegI(env); + HReg resLo = newVRegI(env); + iselInt64Expr(&argHi, &argLo, env, e->Iex.Unop.arg); + vassert(env->mode64 == False); + addInstr(env, PPCInstr_LI(zero32, 0, env->mode64)); + /* resHi:resLo = - argHi:argLo */ + addInstr(env, PPCInstr_AddSubC( False/*sub*/, True/*set carry*/, + resLo, zero32, argLo )); + addInstr(env, PPCInstr_AddSubC( False/*sub*/, False/*read carry*/, + resHi, zero32, argHi )); + /* resHi:resLo |= srcHi:srcLo */ + addInstr(env, PPCInstr_Alu(Palu_OR, resLo, resLo, PPCRH_Reg(argLo))); + addInstr(env, PPCInstr_Alu(Palu_OR, resHi, resHi, PPCRH_Reg(argHi))); + *rHi = resHi; + *rLo = resLo; + return; + } + /* 32Sto64(e) */ case Iop_32Sto64: { HReg tHi = newVRegI(env); -- 2.47.2