|
From: <sv...@va...> - 2005-10-08 19:58:51
|
Author: sewardj
Date: 2005-10-08 20:58:48 +0100 (Sat, 08 Oct 2005)
New Revision: 1418
Log:
Handle the out-of-range shift cases for slw/srw in a different way
which creates less IR and fewer insns at the back end. Worth about 2%
running bzip2 -d with --tool=3Dnone.
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-10-08 11:28:16 UTC (rev 1417)
+++ trunk/priv/guest-ppc32/toIR.c 2005-10-08 19:58:48 UTC (rev 1418)
@@ -3290,12 +3290,24 @@
case 0x018: // slw (Shift Left Word, PPC32 p505)
DIP("slw%s r%d,r%d,r%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, Rb_addr);
- assign( sh_amt, binop(Iop_And8, mkU8(0x1F),
- unop(Iop_32to8, mkexpr(Rb))) );
- assign( Rs_sh, binop(Iop_Shl32, mkexpr(Rs), mkexpr(sh_amt)) );
- assign( rb_b5, binop(Iop_And32, mkexpr(Rb), mkU32(1<<5)) );
- assign( Ra, IRExpr_Mux0X( unop(Iop_32to8, mkexpr(rb_b5)),
- mkexpr(Rs_sh), mkU32(0) ));
+ /* Ra =3D Rs << Rb */
+ /* ppc32 semantics are:=20
+ slw(x,y) =3D (x << (y & 31)) -- primary result
+ & ~((y << 26) >>s 31) -- make result 0=20
+ for y in 32 .. 63
+ */
+ assign(Ra,
+ binop(
+ Iop_And32,
+ binop( Iop_Shl32,=20
+ mkexpr(Rs),=20
+ unop( Iop_32to8,=20
+ binop(Iop_And32, mkexpr(Rb), mkU32(31)))),
+ unop( Iop_Not32,=20
+ binop( Iop_Sar32,=20
+ binop(Iop_Shl32, mkexpr(Rb), mkU8(26)),=20
+ mkU8(31))))
+ );
break;
=20
case 0x318: // sraw (Shift Right Algebraic Word, PPC32 p506)
@@ -3338,12 +3350,24 @@
case 0x218: // srw (Shift Right Word, PPC32 p508)
DIP("srw%s r%d,r%d,r%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, Rb_addr);
- assign( sh_amt, binop(Iop_And8, mkU8(0x1F),
- unop(Iop_32to8, mkexpr(Rb))) );
- assign( Rs_sh, binop(Iop_Shr32, mkexpr(Rs), mkexpr(sh_amt)) );
- assign( rb_b5, binop(Iop_And32, mkexpr(Rb), mkU32(1<<5)) );
- assign( Ra, IRExpr_Mux0X( unop(Iop_32to8, mkexpr(rb_b5)),
- mkexpr(Rs_sh), mkU32(0) ));
+ /* Ra =3D Rs >>u Rb */
+ /* ppc32 semantics are:=20
+ slw(x,y) =3D (x >>u (y & 31)) -- primary result
+ & ~((y << 26) >>s 31) -- make result 0=20
+ for y in 32 .. 63
+ */
+ assign(Ra,
+ binop(
+ Iop_And32,
+ binop( Iop_Shr32,=20
+ mkexpr(Rs),=20
+ unop( Iop_32to8,=20
+ binop(Iop_And32, mkexpr(Rb), mkU32(31)))),
+ unop( Iop_Not32,=20
+ binop( Iop_Sar32,=20
+ binop(Iop_Shl32, mkexpr(Rb), mkU8(26)),=20
+ mkU8(31))))
+ );
break;
=20
default:
|