From: Julian Seward Date: Wed, 25 Apr 2012 16:47:53 +0000 (+0000) Subject: Try to fold out some of the lousy code generated by the amd64 front X-Git-Tag: svn/VALGRIND_3_8_1^2~163 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83bf1cbcdb8e7e428042488b2b8c7418062d1bd1;p=thirdparty%2Fvalgrind.git Try to fold out some of the lousy code generated by the amd64 front end for 32 bit shifts. git-svn-id: svn://svn.valgrind.org/vex/trunk@2315 --- diff --git a/VEX/priv/ir_opt.c b/VEX/priv/ir_opt.c index 5bf44fd104..240d89e7de 100644 --- a/VEX/priv/ir_opt.c +++ b/VEX/priv/ir_opt.c @@ -4514,6 +4514,33 @@ static IRExpr* fold_IRExpr_Unop ( IROp op, IRExpr* aa ) /* 32Uto64( 16Uto32( x )) --> 16Uto64(x) */ if (is_Unop(aa, Iop_16Uto32)) return IRExpr_Unop(Iop_16Uto64, aa->Iex.Unop.arg); + /* 32Uto64(64to32( Shr64( 32Uto64(64to32(x)), sh )) + --> Shr64( 32Uto64(64to32(x)), sh )) */ + if (is_Unop(aa, Iop_64to32) + && is_Binop(aa->Iex.Unop.arg, Iop_Shr64) + && is_Unop(aa->Iex.Unop.arg->Iex.Binop.arg1, Iop_32Uto64) + && is_Unop(aa->Iex.Unop.arg->Iex.Binop.arg1->Iex.Unop.arg, + Iop_64to32)) { + return aa->Iex.Unop.arg; + } + /* 32Uto64(64to32( Shl64( 32Uto64(64to32(x)), sh )) + --> 32Uto64(64to32( Shl64( x, sh )) */ + if (is_Unop(aa, Iop_64to32) + && is_Binop(aa->Iex.Unop.arg, Iop_Shl64) + && is_Unop(aa->Iex.Unop.arg->Iex.Binop.arg1, Iop_32Uto64) + && is_Unop(aa->Iex.Unop.arg->Iex.Binop.arg1->Iex.Unop.arg, + Iop_64to32)) { + return + IRExpr_Unop( + Iop_32Uto64, + IRExpr_Unop( + Iop_64to32, + IRExpr_Binop( + Iop_Shl64, + aa->Iex.Unop.arg->Iex.Binop.arg1->Iex.Unop.arg->Iex.Unop.arg, + aa->Iex.Unop.arg->Iex.Binop.arg2 + ))); + } break; case Iop_1Sto32: @@ -4529,7 +4556,6 @@ static IRExpr* fold_IRExpr_Unop ( IROp op, IRExpr* aa ) } break; - default: break; }