|
From: <sv...@va...> - 2006-03-06 14:08:07
|
Author: sewardj
Date: 2006-03-06 14:07:58 +0000 (Mon, 06 Mar 2006)
New Revision: 1585
Log:
Implement 3DNow! prefetch insn (prefetch, prefetchw). Fixes #120410.
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/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-x86/toIR.c 2006-03-06 13:42:01 UTC (rev 1584)
+++ trunk/priv/guest-x86/toIR.c 2006-03-06 14:07:58 UTC (rev 1585)
@@ -8101,6 +8101,29 @@
goto decode_success;
}
=20
+ /* 0F 0D /0 =3D PREFETCH m8 -- 3DNow! prefetch */
+ /* 0F 0D /1 =3D PREFETCHW m8 -- ditto, with some other hint */
+ if (insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x0D
+ && !epartIsReg(insn[2])=20
+ && gregOfRM(insn[2]) >=3D 0 && gregOfRM(insn[2]) <=3D 1) {
+ HChar* hintstr =3D "??";
+
+ modrm =3D getIByte(delta+2);
+ vassert(!epartIsReg(modrm));
+
+ addr =3D disAMode ( &alen, sorb, delta+2, dis_buf );
+ delta +=3D 2+alen;
+
+ switch (gregOfRM(modrm)) {
+ case 0: hintstr =3D ""; break;
+ case 1: hintstr =3D "w"; break;
+ default: vassert(0); /*NOTREACHED*/
+ }
+
+ DIP("prefetch%s %s\n", hintstr, dis_buf);
+ goto decode_success;
+ }
+
/* ***--- this is an MMX class insn introduced in SSE1 ---*** */
/* 0F F6 =3D PSADBW -- sum of 8Ux8 absolute differences */
if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xF6) {
|