Mark Wielaard 59e54b
commit 6c07dca0af0527226ec9784fbb703526887f09c0
Mark Wielaard 59e54b
Author: sewardj <sewardj@8f6e269a-dfd6-0310-a8e1-e2731360e62c>
Mark Wielaard 59e54b
Date:   Tue Mar 26 10:27:39 2013 +0000
Mark Wielaard 59e54b
Mark Wielaard 59e54b
    Implement SSE4 MOVNTDQA insn.  Fixes #316503.
Mark Wielaard 59e54b
    (Patrick J. LoPresti, lopresti@gmail.com)
Mark Wielaard 59e54b
    
Mark Wielaard 59e54b
    
Mark Wielaard 59e54b
    git-svn-id: svn://svn.valgrind.org/vex/trunk@2700 8f6e269a-dfd6-0310-a8e1-e2731360e62c
Mark Wielaard 59e54b
Mark Wielaard 59e54b
diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c
Mark Wielaard 59e54b
index 1034971..7e98e76 100644
Mark Wielaard 59e54b
--- a/VEX/priv/guest_amd64_toIR.c
Mark Wielaard 59e54b
+++ b/VEX/priv/guest_amd64_toIR.c
Mark Wielaard 59e54b
@@ -16378,6 +16378,25 @@ Long dis_ESC_0F38__SSE4 ( Bool* decode_OK,
Mark Wielaard 59e54b
       }
Mark Wielaard 59e54b
       break;
Mark Wielaard 59e54b
 
Mark Wielaard 59e54b
+   case 0x2A:
Mark Wielaard 59e54b
+      /* 66 0F 38 2A = MOVNTDQA
Mark Wielaard 59e54b
+         "non-temporal" "streaming" load
Mark Wielaard 59e54b
+         Handle like MOVDQA but only memory operand is allowed */
Mark Wielaard 59e54b
+      if (have66noF2noF3(pfx) && sz == 2) {
Mark Wielaard 59e54b
+         modrm = getUChar(delta);
Mark Wielaard 59e54b
+         if (!epartIsReg(modrm)) {
Mark Wielaard 59e54b
+            addr = disAMode ( &alen, vbi, pfx, delta, dis_buf, 0 );
Mark Wielaard 59e54b
+            gen_SEGV_if_not_16_aligned( addr );
Mark Wielaard 59e54b
+            putXMMReg( gregOfRexRM(pfx,modrm),
Mark Wielaard 59e54b
+                       loadLE(Ity_V128, mkexpr(addr)) );
Mark Wielaard 59e54b
+            DIP("movntdqa %s,%s\n", dis_buf,
Mark Wielaard 59e54b
+                                    nameXMMReg(gregOfRexRM(pfx,modrm)));
Mark Wielaard 59e54b
+            delta += alen;
Mark Wielaard 59e54b
+            goto decode_success;
Mark Wielaard 59e54b
+         }
Mark Wielaard 59e54b
+      }
Mark Wielaard 59e54b
+      break;
Mark Wielaard 59e54b
+
Mark Wielaard 59e54b
    case 0x2B:
Mark Wielaard 59e54b
       /* 66 0f 38 2B /r = PACKUSDW xmm1, xmm2/m128
Mark Wielaard 59e54b
          2x 32x4 S->U saturating narrow from xmm2/m128 to xmm1 */