|
From: <sv...@va...> - 2006-10-19 00:15:29
|
Author: sewardj
Date: 2006-10-19 01:15:25 +0100 (Thu, 19 Oct 2006)
New Revision: 1670
Log:
ppc64: detect rldicl/rldicr which are simply 64-bit shifts left/right
and emit IR directly as such. Improves performance of 64-bit code (a
bit).
Modified:
trunk/priv/guest-ppc/toIR.c
Modified: trunk/priv/guest-ppc/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-ppc/toIR.c 2006-10-17 00:28:22 UTC (rev 1669)
+++ trunk/priv/guest-ppc/toIR.c 2006-10-19 00:15:25 UTC (rev 1670)
@@ -3335,7 +3335,7 @@
/* Special-case the ,32-n,n,31 form as that is just n-bit
unsigned shift right, PPC32 p501 */
DIP("srwi%s r%u,r%u,%d\n", flag_rC ? ".":"",
- rA_addr, rS_addr, sh_imm);
+ rA_addr, rS_addr, MaskBeg);
assign( rA, binop(Iop_Shr32, mkexpr(rS), mkU8(MaskBeg)) );
}
else {
@@ -3380,7 +3380,6 @@
break;
}
=20
-
/* 64bit Integer Rotates */
case 0x1E: {
msk_imm =3D ((msk_imm & 1) << 5) | (msk_imm >> 1);
@@ -3426,24 +3425,38 @@
*/
=20
case 0x0: // rldicl (Rotl DWord Imm, Clear Left, PPC64 p558)
- DIP("rldicl%s r%u,r%u,%u,%u\n", flag_rC ? ".":"",
- rA_addr, rS_addr, sh_imm, msk_imm);
- r =3D ROTL(mkexpr(rS), mkU8(sh_imm));
- mask64 =3D MASK64(0, 63-msk_imm);
- assign( rA, binop(Iop_And64, r, mkU64(mask64)) );
+ if (mode64
+ && sh_imm + msk_imm =3D=3D 64 && msk_imm >=3D 1 && msk_imm =
<=3D 63) {
+ /* special-case the ,64-n,n form as that is just
+ unsigned shift-right by n */
+ DIP("srdi%s r%u,r%u,%u\n",
+ flag_rC ? ".":"", rA_addr, rS_addr, msk_imm);
+ assign( rA, binop(Iop_Shr64, mkexpr(rS), mkU8(msk_imm)) );
+ } else {
+ DIP("rldicl%s r%u,r%u,%u,%u\n", flag_rC ? ".":"",
+ rA_addr, rS_addr, sh_imm, msk_imm);
+ r =3D ROTL(mkexpr(rS), mkU8(sh_imm));
+ mask64 =3D MASK64(0, 63-msk_imm);
+ assign( rA, binop(Iop_And64, r, mkU64(mask64)) );
+ }
break;
- /* later: deal with special case:
- (msk_imm + sh_imm =3D=3D 63) =3D> SHR(63 - sh_imm) */
=20
case 0x1: // rldicr (Rotl DWord Imm, Clear Right, PPC64 p559)
- DIP("rldicr%s r%u,r%u,%u,%u\n", flag_rC ? ".":"",
- rA_addr, rS_addr, sh_imm, msk_imm);
- r =3D ROTL(mkexpr(rS), mkU8(sh_imm));
- mask64 =3D MASK64(63-msk_imm, 63);
- assign( rA, binop(Iop_And64, r, mkU64(mask64)) );
+ if (mode64=20
+ && sh_imm + msk_imm =3D=3D 63 && sh_imm >=3D 1 && sh_imm <=3D=
63) {
+ /* special-case the ,n,63-n form as that is just
+ shift-left by n */
+ DIP("sldi%s r%u,r%u,%u\n",
+ flag_rC ? ".":"", rA_addr, rS_addr, sh_imm);
+ assign( rA, binop(Iop_Shl64, mkexpr(rS), mkU8(sh_imm)) );
+ } else {
+ DIP("rldicr%s r%u,r%u,%u,%u\n", flag_rC ? ".":"",
+ rA_addr, rS_addr, sh_imm, msk_imm);
+ r =3D ROTL(mkexpr(rS), mkU8(sh_imm));
+ mask64 =3D MASK64(63-msk_imm, 63);
+ assign( rA, binop(Iop_And64, r, mkU64(mask64)) );
+ }
break;
- /* later: deal with special case:
- (msk_imm =3D=3D sh_imm) =3D> SHL(sh_imm) */
=20
case 0x3: { // rldimi (Rotl DWord Imm, Mask Insert, PPC64 p560)
IRTemp rA_orig =3D newTemp(ty);
|