]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
* Fix ubsan failures in mullS64 due to signed integer overflow.
authorJulian Seward <jseward@acm.org>
Tue, 30 Jun 2015 13:37:45 +0000 (13:37 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 30 Jun 2015 13:37:45 +0000 (13:37 +0000)
* Take the opportunity to replace 0xFFFFFFFF with a symbolic
  constant.

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

VEX/priv/guest_amd64_helpers.c

index 81115833acebfea05009ff423b856677d4c20617..c2b216ae53513d935a6d8a125f67bddae2d50117 100644 (file)
 
 static void mullS64 ( Long u, Long v, Long* rHi, Long* rLo )
 {
+   const Long halfMask = 0xFFFFFFFFLL;
    ULong u0, v0, w0;
     Long u1, v1, w1, w2, t;
-   u0   = u & 0xFFFFFFFFULL
+   u0   = u & halfMask
    u1   = u >> 32;
-   v0   = v & 0xFFFFFFFFULL;
+   v0   = v & halfMask;
    v1   = v >> 32;
    w0   = u0 * v0;
    t    = u1 * v0 + (w0 >> 32);
-   w1   = t & 0xFFFFFFFFULL;
+   w1   = t & halfMask;
    w2   = t >> 32;
    w1   = u0 * v1 + w1;
    *rHi = u1 * v1 + w2 + (w1 >> 32);
-   *rLo = u * v;
+   *rLo = (Long)((ULong)u * (ULong)v);
 }
 
 static void mullU64 ( ULong u, ULong v, ULong* rHi, ULong* rLo )
 {
+   const ULong halfMask = 0xFFFFFFFFULL;
    ULong u0, v0, w0;
    ULong u1, v1, w1,w2,t;
-   u0   = u & 0xFFFFFFFFULL;
+   u0   = u & halfMask;
    u1   = u >> 32;
-   v0   = v & 0xFFFFFFFFULL;
+   v0   = v & halfMask;
    v1   = v >> 32;
    w0   = u0 * v0;
    t    = u1 * v0 + (w0 >> 32);
-   w1   = t & 0xFFFFFFFFULL;
+   w1   = t & halfMask;
    w2   = t >> 32;
    w1   = u0 * v1 + w1;
    *rHi = u1 * v1 + w2 + (w1 >> 32);