https://bugs.kde.org/show_bug.cgi?id=487439

--- Comment #9 from Paul Floyd <pjfl...@wanadoo.fr> ---
Bill Torpey, could you build Valgrind to test a fix?

This change seems to fix your problem:

diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c
index f0b1c5516..28c37f092 100644
--- a/VEX/priv/guest_amd64_toIR.c
+++ b/VEX/priv/guest_amd64_toIR.c
@@ -14138,7 +14138,7 @@ Long dis_ESC_0F__SSE2 ( Bool* decode_OK,
          goto decode_success;
       }
       /* 66 0F 73 /6 ib = PSLLQ by immediate */
-      if (have66noF2noF3(pfx) && sz == 2 
+      if (have66noF2noF3(pfx) && (sz == 2 || /* ignore redundant REX.W */ sz
== 8)
           && epartIsReg(getUChar(delta))
           && gregLO3ofRM(getUChar(delta)) == 6) {
          delta = dis_SSE_shiftE_imm( pfx, delta, "psllq", Iop_ShlN64x2 );

Mark, do you know how to force using rex.W in assembler?

This testcase also seems to work

/* with redundant rex.W */
static void psllq_4(void)
{
   reg128_t arg1 = { .uq = { 0x0123456789abcdefULL, 0x0123456789abcdefULL } };
   reg128_t result0;
   char state[108];

   if (sigsetjmp(catchpoint, 1) == 0)
   {
      asm(
         "ffree %%st(7)\n"
         "ffree %%st(6)\n"
         "ffree %%st(5)\n"
         "ffree %%st(4)\n"
         "movlps %2, %%xmm1\n"
         "movhps %3, %%xmm1\n"
         //".rex.W psllq $12, %%xmm1\n"
         ".byte 0x66,0x48,0x0f,0x73,0xf1,0x0c\n"
         "movlps %%xmm1, %0\n"
         "movhps %%xmm1, %1\n"
         "cld\n"
         : "=m" (result0.uq[0]), "=m" (result0.uq[1])
         : "m" (arg1.uq[0]), "m" (arg1.uq[1]), "m" (state[0])
         : "xmm1"
      );

      if (result0.uq[0] == 0x3456789abcdef000ULL && result0.uq[1] ==
0x3456789abcdef000ULL )
      {
         printf("psllq_4 ... ok\n");
      }
      else
      {
         printf("psllq_4 ... not ok\n");
         printf("  result0.uq[0] = %llu (expected %llu)\n", result0.uq[0],
0x3456789abcdef000ULL);
         printf("  result0.uq[1] = %llu (expected %llu)\n", result0.uq[1],
0x3456789abcdef000ULL);
      }
   }
   else
   {
      printf("psllq_4 ... failed\n");
   }

   return;
}

but it doesn't fit in with the gen_insn_test.pl script.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to