|
From: <sv...@va...> - 2005-03-30 23:20:51
|
Author: sewardj
Date: 2005-03-31 00:20:47 +0100 (Thu, 31 Mar 2005)
New Revision: 1115
Modified:
trunk/priv/guest-amd64/toIR.c
trunk/priv/host-amd64/hdefs.c
trunk/priv/host-amd64/isel.c
Log:
Support a few more insns I ran across whilst trying to start up
konqueror (mostly successfully) and mozilla (promising but
unsuccessful).
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-03-30 23:19:46 UTC (rev 1114)
+++ trunk/priv/guest-amd64/toIR.c 2005-03-30 23:20:47 UTC (rev 1115)
@@ -3605,9 +3605,9 @@
case 4: /* MUL (unsigned widening) */
codegen_mulL_A_D ( sz, False, t1, dis_buf );
break;
-//.. case 5: /* IMUL */
-//.. codegen_mulL_A_D ( sz, True, t1, dis_buf );
-//.. break;
+ case 5: /* IMUL */
+ codegen_mulL_A_D ( sz, True, t1, dis_buf );
+ break;
case 6: /* DIV */
codegen_div ( sz, t1, False );
DIP("div%c %s\n", nameISize(sz), dis_buf);
@@ -8060,11 +8060,12 @@
goto decode_success;
}
=20
-//.. /* 0F 55 =3D ANDNPS -- G =3D (not G) and E */
-//.. if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x55) {
-//.. delta =3D dis_SSE_E_to_G_all_invG( sorb, delta+2, "andnps", I=
op_And128 );
-//.. goto decode_success;
-//.. }
+ /* 0F 55 =3D ANDNPS -- G =3D (not G) and E */
+ if (haveNo66noF2noF3(pfx) && sz =3D=3D 4=20
+ && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x55) {
+ delta =3D dis_SSE_E_to_G_all_invG( pfx, delta+2, "andnps", Iop_And=
V128 );
+ goto decode_success;
+ }
=20
/* 0F 54 =3D ANDPS -- G =3D G and E */
if (haveNo66noF2noF3(pfx) && sz =3D=3D 4=20
@@ -8078,14 +8079,14 @@
//.. delta =3D dis_SSEcmp_E_to_G( sorb, delta+2, "cmpps", True, 4 =
);
//.. goto decode_success;
//.. }
-//..=20
-//.. /* F3 0F C2 =3D CMPSS -- 32F0x4 comparison from R/M to R */
-//.. if (insn[0] =3D=3D 0xF3 && insn[1] =3D=3D 0x0F && insn[2] =3D=3D=
0xC2) {
-//.. vassert(sz =3D=3D 4);
-//.. delta =3D dis_SSEcmp_E_to_G( sorb, delta+3, "cmpss", False, 4=
);
-//.. goto decode_success;
-//.. }
=20
+ /* F3 0F C2 =3D CMPSS -- 32F0x4 comparison from R/M to R */
+ if (haveF3no66noF2(pfx) && sz =3D=3D 4
+ && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xC2) {
+ delta =3D dis_SSEcmp_E_to_G( pfx, delta+2, "cmpss", False, 4 );
+ goto decode_success;
+ }
+
/* 0F 2F =3D COMISS -- 32F0x4 comparison G,E, and set ZCP */
/* 0F 2E =3D UCOMISS -- 32F0x4 comparison G,E, and set ZCP */
if (haveNo66noF2noF3(pfx) && sz =3D=3D 4=20
@@ -8700,12 +8701,13 @@
goto decode_success;
}
=20
-//.. /* 0F 56 =3D ORPS -- G =3D G and E */
-//.. if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x56) {
-//.. delta =3D dis_SSE_E_to_G_all( sorb, delta+2, "orps", Iop_Or12=
8 );
-//.. goto decode_success;
-//.. }
-//..=20
+ /* 0F 56 =3D ORPS -- G =3D G and E */
+ if (haveNo66noF2noF3(pfx) && sz =3D=3D 4
+ && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0x56) {
+ delta =3D dis_SSE_E_to_G_all( pfx, delta+2, "orps", Iop_OrV128 );
+ goto decode_success;
+ }
+
//.. /* ***--- this is an MMX class insn introduced in SSE1 ---*** */
//.. /* 0F E0 =3D PAVGB -- 8x8 unsigned Packed Average, with rounding=
*/
//.. if (sz =3D=3D 4 && insn[0] =3D=3D 0x0F && insn[1] =3D=3D 0xE0) {
Modified: trunk/priv/host-amd64/hdefs.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/host-amd64/hdefs.c 2005-03-30 23:19:46 UTC (rev 1114)
+++ trunk/priv/host-amd64/hdefs.c 2005-03-30 23:20:47 UTC (rev 1115)
@@ -3109,7 +3109,7 @@
//.. case Xsse_SQRTF: *p++ =3D 0x51; break;
case Asse_SUBF: *p++ =3D 0x5C; break;
//.. case Xsse_CMPEQF: *p++ =3D 0xC2; xtra =3D 0x100; break;
-//.. case Xsse_CMPLTF: *p++ =3D 0xC2; xtra =3D 0x101; break;
+ case Asse_CMPLTF: *p++ =3D 0xC2; xtra =3D 0x101; break;
//.. case Xsse_CMPLEF: *p++ =3D 0xC2; xtra =3D 0x102; break;
default: goto bad;
}
Modified: trunk/priv/host-amd64/isel.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/host-amd64/isel.c 2005-03-30 23:19:46 UTC (rev 1114)
+++ trunk/priv/host-amd64/isel.c 2005-03-30 23:20:47 UTC (rev 1115)
@@ -2976,6 +2976,16 @@
addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dst, rsp0 )=
);
add_to_rsp(env, 16);
return dst;
+ } else=20
+ if (e->Iex.Const.con->Ico.V128 =3D=3D 0x000F) {
+ HReg tmp =3D newVRegI(env);
+ AMD64AMode* rsp0 =3D AMD64AMode_IR(0, hregAMD64_RSP());
+ addInstr(env, AMD64Instr_Imm64(0xFFFFFFFFULL, tmp));
+ addInstr(env, AMD64Instr_Push(AMD64RMI_Imm(0)));
+ addInstr(env, AMD64Instr_Push(AMD64RMI_Reg(tmp)));
+ addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dst, rsp0 )=
);
+ add_to_rsp(env, 16);
+ return dst;
} else {
goto vec_fail;
# if 0
@@ -3238,7 +3248,7 @@
//.. }
=20
//.. case Iop_CmpEQ32F0x4: op =3D Xsse_CMPEQF; goto do_32F0x4;
-//.. case Iop_CmpLT32F0x4: op =3D Xsse_CMPLTF; goto do_32F0x4;
+ case Iop_CmpLT32F0x4: op =3D Asse_CMPLTF; goto do_32F0x4;
//.. case Iop_CmpLE32F0x4: op =3D Xsse_CMPLEF; goto do_32F0x4;
case Iop_Add32F0x4: op =3D Asse_ADDF; goto do_32F0x4;
case Iop_Div32F0x4: op =3D Asse_DIVF; goto do_32F0x4;
|