|
From: <sv...@va...> - 2006-12-26 02:31:04
|
Author: sewardj
Date: 2006-12-26 02:31:01 +0000 (Tue, 26 Dec 2006)
New Revision: 1699
Log:
Merge r1670/1 (ppc64 fe rld/rlw improvements)
Modified:
branches/VEX_3_2_BRANCH/priv/guest-ppc/toIR.c
Modified: branches/VEX_3_2_BRANCH/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
--- branches/VEX_3_2_BRANCH/priv/guest-ppc/toIR.c 2006-12-26 02:25:46 UTC=
(rev 1698)
+++ branches/VEX_3_2_BRANCH/priv/guest-ppc/toIR.c 2006-12-26 02:31:01 UTC=
(rev 1699)
@@ -3288,6 +3288,7 @@
vassert(sh_imm < 32);
=20
if (mode64) {
+ IRTemp rTmp =3D newTemp(Ity_I64);
mask64 =3D MASK64(31-MaskEnd, 31-MaskBeg);
DIP("rlwinm%s r%u,r%u,%d,%d,%d\n", flag_rC ? ".":"",
rA_addr, rS_addr, sh_imm, MaskBeg, MaskEnd);
@@ -3295,8 +3296,10 @@
// rA =3D ((tmp32 || tmp32) & mask64)
r =3D ROTL( unop(Iop_64to32, mkexpr(rS) ), mkU8(sh_imm) );
r =3D unop(Iop_32Uto64, r);
- assign( rot, binop(Iop_Or64, r,
- binop(Iop_Shl64, r, mkU8(32))) );
+ assign( rTmp, r );
+ r =3D NULL;
+ assign( rot, binop(Iop_Or64, mkexpr(rTmp),
+ binop(Iop_Shl64, mkexpr(rTmp), mkU8(32))) );
assign( rA, binop(Iop_And64, mkexpr(rot), mkU64(mask64)) );
}
else {
@@ -3311,7 +3314,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 {
@@ -3356,7 +3359,6 @@
break;
}
=20
-
/* 64bit Integer Rotates */
case 0x1E: {
msk_imm =3D ((msk_imm & 1) << 5) | (msk_imm >> 1);
@@ -3402,24 +3404,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);
|