|
From: <sv...@va...> - 2005-10-07 09:45:24
|
Author: sewardj
Date: 2005-10-07 10:45:16 +0100 (Fri, 07 Oct 2005)
New Revision: 1416
Log:
Special-case rlwnms which are really slwi or srwi. This gives about
1% translated code size improvement for run-of-the-mill integer code.
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-05 17:58:32 UTC (rev 1415)
+++ trunk/priv/guest-ppc32/toIR.c 2005-10-07 09:45:16 UTC (rev 1416)
@@ -2153,11 +2153,33 @@
=20
case 0x15:=20
// rlwinm (Rotate Left Word Immediate then AND with Mask, PPC32 p5=
01)
- DIP("rlwinm%s r%d,r%d,%d,%d,%d\n", flag_Rc ? "." : "",
- Ra_addr, Rs_addr, sh_imm, MaskBegin, MaskEnd);
- // Ra =3D ROTL(Rs, Imm) & mask
- assign( Ra, binop(Iop_And32, ROTL32(mkexpr(Rs), mkU32(sh_imm)),=20
- mkU32(mask)) );
+ vassert(MaskBegin < 32);
+ vassert(MaskEnd < 32);
+ vassert(sh_imm < 32);
+
+ if (MaskBegin =3D=3D 0 && sh_imm+MaskEnd =3D=3D 31) {
+ /* Special-case the ,n,0,31-n form as that is just n-bit
+ shift left (PPC32 p501) */
+ DIP("slwi%s r%d,r%d,%d\n", flag_Rc ? "." : "",
+ Ra_addr, Rs_addr, sh_imm);
+ assign( Ra, binop(Iop_Shl32, mkexpr(Rs), mkU8(sh_imm)) );
+ }
+ else
+ if (MaskEnd =3D=3D 31 && sh_imm+MaskBegin =3D=3D 32) {
+ /* Special-case the ,32-n,n,31 form as that is just n-bit
+ unsigned shift right (PPC32 p501) */
+ DIP("srwi%s r%d,r%d,%d\n", flag_Rc ? "." : "",
+ Ra_addr, Rs_addr, sh_imm);
+ assign( Ra, binop(Iop_Shr32, mkexpr(Rs), mkU8(MaskBegin)) );
+ }
+ else {
+ /* General case. */
+ DIP("rlwinm%s r%d,r%d,%d,%d,%d\n", flag_Rc ? "." : "",
+ Ra_addr, Rs_addr, sh_imm, MaskBegin, MaskEnd);
+ // Ra =3D ROTL(Rs, Imm) & mask
+ assign( Ra, binop(Iop_And32, ROTL32(mkexpr(Rs), mkU32(sh_imm)),=
=20
+ mkU32(mask)) );
+ }
break;
=20
case 0x17:=20
|