]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
A few more SSE float (scalar,packed) insns. Something is not right;
authorJulian Seward <jseward@acm.org>
Wed, 18 Jun 2003 00:22:01 +0000 (00:22 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 18 Jun 2003 00:22:01 +0000 (00:22 +0000)
the Ogg encoder vectorised for PIII (SSE, -xK) crashes now.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1703

coregrind/vg_to_ucode.c

index 89e4fc3f6262af142220aa6180370a78ae2b0c5d..c11f836ba0a7bc60c33a911113f338547df24725 100644 (file)
@@ -3474,10 +3474,10 @@ Addr dis_SSE3_load_store_or_mov ( UCodeBlock* cb,
       if (dis && is_store)
          VG_(printf)("%s %s, %s\n", name,
                      nameXMMReg(gregOfRM(modrm)),
-                     nameIReg(4,eregOfRM(modrm)) );
+                     nameXMMReg(eregOfRM(modrm)) );
       if (dis && !is_store)
          VG_(printf)("%s %s, %s\n", name,
-                      nameIReg(4,eregOfRM(modrm)), 
+                      nameXMMReg(eregOfRM(modrm)), 
                       nameXMMReg(gregOfRM(modrm)) );
    } else {
       pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
@@ -3525,10 +3525,10 @@ Addr dis_SSE2_load_store_or_mov ( UCodeBlock* cb,
       if (dis && is_store)
          VG_(printf)("%s %s, %s\n", name,
                      nameXMMReg(gregOfRM(modrm)),
-                     nameIReg(4,eregOfRM(modrm)) );
+                     nameXMMReg(eregOfRM(modrm)) );
       if (dis && !is_store)
          VG_(printf)("%s %s, %s\n", name,
-                      nameIReg(4,eregOfRM(modrm)), 
+                      nameXMMReg(eregOfRM(modrm)), 
                       nameXMMReg(gregOfRM(modrm)) );
    } else {
       pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
@@ -3770,22 +3770,6 @@ static Addr disInstr ( UCodeBlock* cb, Addr eip, Bool* isEnd )
       goto decode_success;
    }
 
-   /* DIVSS -- divide low 4 bytes of XMM reg. */
-   if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x5E) {
-      vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 4, "divss",
-                                      insn[0], insn[1], insn[2] );
-      goto decode_success;
-   }
-
-   /* MULSS -- multiply low 4 bytes of XMM reg. */
-   if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x59) {
-      vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 4, "mulss",
-                                      insn[0], insn[1], insn[2] );
-      goto decode_success;
-   }
-
    /* CVTSS2SD -- convert one single float to double. */
    if (insn[0] == 0xF3 && insn[1] == 0x0F && insn[2] == 0x5A) {
       vg_assert(sz == 4);
@@ -3827,6 +3811,18 @@ static Addr disInstr ( UCodeBlock* cb, Addr eip, Bool* isEnd )
       goto decode_success;
    }
 
+   /* 0xF2: MULSD */
+   /* 0xF3: MULSS -- multiply low 4 bytes of XMM reg. */
+   if ((insn[0] == 0xF2 || insn[0] == 0xF3)
+       && insn[1] == 0x0F && insn[2] == 0x59) {
+      vg_assert(sz == 4);
+      Bool sz8 = insn[0] == 0xF2;
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, sz8 ? 8 : 4, 
+                                      sz8 ? "mulss" : "mulsd",
+                                      insn[0], insn[1], insn[2] );
+      goto decode_success;
+   }
+
    /* MULPS */
    /* 0x66: MULPD */
    if (insn[0] == 0x0F && insn[1] == 0x59) {
@@ -3841,50 +3837,71 @@ static Addr disInstr ( UCodeBlock* cb, Addr eip, Bool* isEnd )
       goto decode_success;
    }
 
-   /* 0x66: SUBPD */
-   if (sz == 2
-       && insn[0] == 0x0F && insn[1] == 0x5C) {
-      vg_assert(sz == 2);
-      {
-         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "subpd",
-                                         0x66, insn[0], insn[1] );
-      }
+   /* 0xF2: DIVSD */
+   /* 0xF3: DIVSS -- divide low 4 bytes of XMM reg. */
+   if ((insn[0] == 0xF2 || insn[0] == 0xF3)
+       && insn[1] == 0x0F && insn[2] == 0x5E) {
+      vg_assert(sz == 4);
+      Bool sz8 = insn[0] == 0xF2;
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, sz8 ? 8 : 4, 
+                                      sz8 ? "divsd" : "divss",
+                                      insn[0], insn[1], insn[2] );
       goto decode_success;
    }
 
-   /* MULSD */
-   if (insn[0] == 0xF2 && insn[1] == 0x0F && insn[2] == 0x59) {
+   /* 0xF2: SUBSD */
+   /* 0xF3: SUBSS */
+   if ((insn[0] == 0xF2 || insn[0] == 0xF3)
+       && insn[1] == 0x0F && insn[2] == 0x5C) {
+      Bool sz8 = insn[0] == 0xF2;
       vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 8, "mulsd",
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, sz8 ? 8 : 4, 
+                                      sz8 ? "subsd" : "subss",
                                       insn[0], insn[1], insn[2] );
       goto decode_success;
    }
 
-   /* DIVSD */
-   if (insn[0] == 0xF2 && insn[1] == 0x0F && insn[2] == 0x5E) {
-      vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 8, "divsd",
-                                      insn[0], insn[1], insn[2] );
+   /* SUBPS */
+   /* 0x66: SUBPD */
+   if (insn[0] == 0x0F && insn[1] == 0x5C) {
+      vg_assert(sz == 4 || sz == 2);
+      if (sz == 4) {
+         eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "subps",
+                                         insn[0], insn[1] );
+      } else {
+         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "subpd",
+                                         0x66, insn[0], insn[1] );
+      }
       goto decode_success;
    }
 
-   /* SUBSD */
-   if (insn[0] == 0xF2 && insn[1] == 0x0F && insn[2] == 0x5C) {
+   /* 0xF2: ADDSD */
+   /* 0xF3: ADDSS */
+   if ((insn[0] == 0xF2 || insn[0] == 0xF3)
+       && insn[1] == 0x0F && insn[2] == 0x58) {
+      Bool sz8 = insn[0] == 0xF2;
       vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 8, "subsd",
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, sz8 ? 8 : 4, 
+                                      sz8 ? "addsd" : "addss",
                                       insn[0], insn[1], insn[2] );
       goto decode_success;
    }
 
-   /* ADDSD */
-   if (insn[0] == 0xF2 && insn[1] == 0x0F && insn[2] == 0x58) {
-      vg_assert(sz == 4);
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 8, "addsd",
-                                      insn[0], insn[1], insn[2] );
+   /* ADDPS */
+   /* 0x66: ADDPD */
+   if (insn[0] == 0x0F && insn[1] == 0x58) {
+      vg_assert(sz == 4 || sz == 2);
+      if (sz == 4) {
+         eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "addps",
+                                         insn[0], insn[1] );
+      } else {
+         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "addpd",
+                                         0x66, insn[0], insn[1] );
+      }
       goto decode_success;
    }
 
-   /* MINSD */
+   /* 0xF2: MINSD */
    if (insn[0] == 0xF2 && insn[1] == 0x0F && insn[2] == 0x5D) {
       vg_assert(sz == 4);
       eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, 8, "minsd",
@@ -3892,25 +3909,51 @@ static Addr disInstr ( UCodeBlock* cb, Addr eip, Bool* isEnd )
       goto decode_success;
    }
 
-   /* ADDPS */
-   /* 0x66: ADDPD */
-   if (insn[0] == 0x0F && insn[1] == 0x58) {
+   /* 0xF3: MAXSD */
+   /* 0xF3: MAXSS */
+   if ((insn[0] == 0xF2 || insn[0] == 0xF3) 
+       && insn[1] == 0x0F && insn[2] == 0x5F) {
+      Bool sz8 = insn[0] == 0xF2;
+      vg_assert(sz == 4);
+      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+3, sz8 ? 8 : 4, 
+                                      sz8 ? "maxsd" : "maxss",
+                                      insn[0], insn[1], insn[2] );
+      goto decode_success;
+   }
+
+   /* MAXPS */
+   /* 0x66: MAXPD */
+   if (insn[0] == 0x0F && insn[1] == 0x5F) {
       vg_assert(sz == 4 || sz == 2);
       if (sz == 4) {
-         eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "addps",
+         eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "maxps",
                                          insn[0], insn[1] );
       } else {
-         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "addpd",
+         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "maxpd",
                                          0x66, insn[0], insn[1] );
       }
       goto decode_success;
    }
 
-   /* XORPD (src)xmmreg-or-mem, (dst)xmmreg */
-   if (sz == 2
-       && insn[0] == 0x0F && insn[1] == 0x57) {
-      eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "xorpd",
-                                      0x66, insn[0], insn[1] );
+   /* RCPPS -- reciprocal of packed floats */
+   if (insn[0] == 0x0F && insn[1] == 0x53) {
+      vg_assert(sz == 4);
+      eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "rcpps",
+                                      insn[0], insn[1] );
+      goto decode_success;
+   }
+
+   /* XORPS */
+   /* 0x66: XORPD (src)xmmreg-or-mem, (dst)xmmreg */
+   if (insn[0] == 0x0F && insn[1] == 0x57) {
+      vg_assert(sz == 4 || sz == 2);
+      if (sz == 4) {
+         eip = dis_SSE2_reg_or_mem ( cb, sorb, eip+2, 16, "xorps",
+                                         insn[0], insn[1] );
+      } else {
+         eip = dis_SSE3_reg_or_mem ( cb, sorb, eip+2, 16, "xorpd",
+                                         0x66, insn[0], insn[1] );
+      }
       goto decode_success;
    }