]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Support a few more insns I ran across whilst trying to start up
authorJulian Seward <jseward@acm.org>
Wed, 30 Mar 2005 23:20:47 +0000 (23:20 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 30 Mar 2005 23:20:47 +0000 (23:20 +0000)
konqueror (mostly successfully) and mozilla (promising but
unsuccessful).

git-svn-id: svn://svn.valgrind.org/vex/trunk@1115

VEX/priv/guest-amd64/toIR.c
VEX/priv/host-amd64/hdefs.c
VEX/priv/host-amd64/isel.c

index 647651d3701504e1dafbf39526aa1d3e0a06de23..91846b9a6cb6d1bc187ab0011d6a595c0b58d1d6 100644 (file)
@@ -3605,9 +3605,9 @@ ULong dis_Grp3 ( Prefix pfx, Int sz, ULong delta )
          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 @@ DisResult disInstr ( /*IN*/  Bool       resteerOK,
       goto decode_success;
    }
 
-//..    /* 0F 55 = ANDNPS -- G = (not G) and E */
-//..    if (sz == 4 && insn[0] == 0x0F && insn[1] == 0x55) {
-//..       delta = dis_SSE_E_to_G_all_invG( sorb, delta+2, "andnps", Iop_And128 );
-//..       goto decode_success;
-//..    }
+   /* 0F 55 = ANDNPS -- G = (not G) and E */
+   if (haveNo66noF2noF3(pfx) && sz == 4 
+       && insn[0] == 0x0F && insn[1] == 0x55) {
+      delta = dis_SSE_E_to_G_all_invG( pfx, delta+2, "andnps", Iop_AndV128 );
+      goto decode_success;
+   }
 
    /* 0F 54 = ANDPS -- G = G and E */
    if (haveNo66noF2noF3(pfx) && sz == 4 
@@ -8077,15 +8078,15 @@ DisResult disInstr ( /*IN*/  Bool       resteerOK,
 //..    if (sz == 4 && insn[0] == 0x0F && insn[1] == 0xC2) {
 //..       delta = dis_SSEcmp_E_to_G( sorb, delta+2, "cmpps", True, 4 );
 //..       goto decode_success;
-//..    }
-//.. 
-//..    /* F3 0F C2 = CMPSS -- 32F0x4 comparison from R/M to R */
-//..    if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0xC2) {
-//..       vassert(sz == 4);
-//..       delta = dis_SSEcmp_E_to_G( sorb, delta+3, "cmpss", False, 4 );
-//..       goto decode_success;
 //..    }
 
+   /* F3 0F C2 = CMPSS -- 32F0x4 comparison from R/M to R */
+   if (haveF3no66noF2(pfx) && sz == 4
+       && insn[0] == 0x0F && insn[1] == 0xC2) {
+      delta = dis_SSEcmp_E_to_G( pfx, delta+2, "cmpss", False, 4 );
+      goto decode_success;
+   }
+
    /* 0F 2F = COMISS  -- 32F0x4 comparison G,E, and set ZCP */
    /* 0F 2E = UCOMISS -- 32F0x4 comparison G,E, and set ZCP */
    if (haveNo66noF2noF3(pfx) && sz == 4 
@@ -8700,12 +8701,13 @@ DisResult disInstr ( /*IN*/  Bool       resteerOK,
       goto decode_success;
    }
 
-//..    /* 0F 56 = ORPS -- G = G and E */
-//..    if (sz == 4 && insn[0] == 0x0F && insn[1] == 0x56) {
-//..       delta = dis_SSE_E_to_G_all( sorb, delta+2, "orps", Iop_Or128 );
-//..       goto decode_success;
-//..    }
-//.. 
+   /* 0F 56 = ORPS -- G = G and E */
+   if (haveNo66noF2noF3(pfx) && sz == 4
+       && insn[0] == 0x0F && insn[1] == 0x56) {
+      delta = 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 = PAVGB -- 8x8 unsigned Packed Average, with rounding */
 //..    if (sz == 4 && insn[0] == 0x0F && insn[1] == 0xE0) {
index d22ee707d767499559e34bfc77f2845b810bcf75..821def08f730acbf11398936c4ceb4a7a58a78dd 100644 (file)
@@ -3109,7 +3109,7 @@ Int emit_AMD64Instr ( UChar* buf, Int nbuf, AMD64Instr* i )
 //..          case Xsse_SQRTF:  *p++ = 0x51; break;
          case Asse_SUBF:   *p++ = 0x5C; break;
 //..          case Xsse_CMPEQF: *p++ = 0xC2; xtra = 0x100; break;
-//..          case Xsse_CMPLTF: *p++ = 0xC2; xtra = 0x101; break;
+         case Asse_CMPLTF: *p++ = 0xC2; xtra = 0x101; break;
 //..          case Xsse_CMPLEF: *p++ = 0xC2; xtra = 0x102; break;
          default: goto bad;
       }
index f2d28b80e18330018811a69b9b9dd72776eca3e6..1063049f060685bc512aa7be2e6b0199f6ea94c8 100644 (file)
@@ -2976,6 +2976,16 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
          addInstr(env, AMD64Instr_SseLdSt( True/*load*/, 16, dst, rsp0 ));
          add_to_rsp(env, 16);
          return dst;
+      } else 
+      if (e->Iex.Const.con->Ico.V128 == 0x000F) {
+         HReg tmp = newVRegI(env);
+         AMD64AMode* rsp0 = 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 @@ static HReg iselVecExpr_wrk ( ISelEnv* env, IRExpr* e )
 //..       }
 
 //..       case Iop_CmpEQ32F0x4: op = Xsse_CMPEQF; goto do_32F0x4;
-//..       case Iop_CmpLT32F0x4: op = Xsse_CMPLTF; goto do_32F0x4;
+      case Iop_CmpLT32F0x4: op = Asse_CMPLTF; goto do_32F0x4;
 //..       case Iop_CmpLE32F0x4: op = Xsse_CMPLEF; goto do_32F0x4;
       case Iop_Add32F0x4:   op = Asse_ADDF;   goto do_32F0x4;
       case Iop_Div32F0x4:   op = Asse_DIVF;   goto do_32F0x4;