]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
amd64: add a spec rule for SHRL/SARL then CondS. gcc-8 has been seen to generate...
authorJulian Seward <jseward@acm.org>
Thu, 7 Dec 2017 11:24:57 +0000 (12:24 +0100)
committerJulian Seward <jseward@acm.org>
Thu, 7 Dec 2017 11:24:57 +0000 (12:24 +0100)
VEX/priv/guest_amd64_helpers.c

index e3bfffa4f7de0d12978611920577c73135fd8c6c..e3bac969a9386d9309e64f17c571c539e4a19f7a 100644 (file)
@@ -1744,6 +1744,26 @@ IRExpr* guest_amd64_spechelper ( const HChar* function_name,
                            mkU32(0)));
       }
 
+      if (isU64(cc_op, AMD64G_CC_OP_SHRL) && isU64(cond, AMD64CondS)) {
+         /* SHRL/SARL, then S --> (ULong)result[31] */
+         return binop(Iop_And64,
+                      binop(Iop_Shr64, cc_dep1, mkU8(31)),
+                      mkU64(1));
+      }
+      // The following looks correct to me, but never seems to happen because
+      // the front end converts jns to js by switching the fallthrough vs
+      // taken addresses.  See jcc_01().  But then why do other conditions
+      // considered by this function show up in both variants (xx and Nxx) ?
+      //if (isU64(cc_op, AMD64G_CC_OP_SHRL) && isU64(cond, AMD64CondNS)) {
+      //   /* SHRL/SARL, then NS --> (ULong) ~ result[31] */
+      //   vassert(0);
+      //   return binop(Iop_Xor64,
+      //                binop(Iop_And64,
+      //                      binop(Iop_Shr64, cc_dep1, mkU8(31)),
+      //                      mkU64(1)),
+      //                mkU64(1));
+      //}
+
       /*---------------- COPY ----------------*/
       /* This can happen, as a result of amd64 FP compares: "comisd ... ;
          jbe" for example. */