|
From: <sv...@va...> - 2005-07-23 12:07:43
|
Author: sewardj
Date: 2005-07-23 13:07:37 +0100 (Sat, 23 Jul 2005)
New Revision: 1291
Log:
Implement bswapq %reg. Generates pretty verbose code, but it works.
Modified:
trunk/priv/guest-amd64/toIR.c
Modified: trunk/priv/guest-amd64/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-amd64/toIR.c 2005-07-22 09:39:02 UTC (rev 1290)
+++ trunk/priv/guest-amd64/toIR.c 2005-07-23 12:07:37 UTC (rev 1291)
@@ -1026,6 +1026,7 @@
{
vassert(lo3bits < 8);
vassert(IS_VALID_PFX(pfx));
+ vassert(sz =3D=3D 8 || sz =3D=3D 4 || sz =3D=3D 2 || sz =3D=3D 1);
vassert(typeOfIRExpr(irbb->tyenv, e) =3D=3D szToITy(sz));
stmt( IRStmt_Put(=20
offsetIReg( sz, lo3bits | (getRexB(pfx) << 3),=20
@@ -12793,6 +12794,39 @@
putIRegRexB(4, pfx, opc-0xC8, mkexpr(t2));
DIP("bswapl %s\n", nameIRegRexB(4, pfx, opc-0xC8));
break;
+ }
+ else if (sz =3D=3D 8) {
+ t1 =3D newTemp(Ity_I64);
+ t2 =3D newTemp(Ity_I64);
+ assign( t1, getIRegRexB(8, pfx, opc-0xC8) );
+
+# define LANE(_nn) \
+ binop( Iop_Shl64, \
+ binop( Iop_And64, \
+ binop(Iop_Shr64, mkexpr(t1), \
+ mkU8(8 * (7 - (_nn)))), \
+ mkU64(0xFF)), \
+ mkU8(8 * (_nn)))
+
+ assign(=20
+ t2,
+ binop(Iop_Or64,
+ binop(Iop_Or64,
+ binop(Iop_Or64,LANE(0),LANE(1)),
+ binop(Iop_Or64,LANE(2),LANE(3))
+ ),
+ binop(Iop_Or64,
+ binop(Iop_Or64,LANE(4),LANE(5)),
+ binop(Iop_Or64,LANE(6),LANE(7))
+ )
+ )
+ );
+
+# undef LANE
+
+ putIRegRexB(8, pfx, opc-0xC8, mkexpr(t2));
+ DIP("bswapq %s\n", nameIRegRexB(8, pfx, opc-0xC8));
+ break;
} else {
goto decode_failure;
}
|