On 8/31/21 9:39 AM, Luis Pires wrote:
-static inline int divs128(int64_t *plow, int64_t *phigh, int64_t divisor)
+static inline void divs128(int64_t *plow, int64_t *phigh, int64_t divisor)
  {
-    if (divisor == 0) {
-        return 1;
-    } else {
-        __int128_t dividend = ((__int128_t)*phigh << 64) | *plow;
-        __int128_t result = dividend / divisor;
-        *plow = result;
-        *phigh = dividend % divisor;
-        return result != *plow;
-    }
+    __int128_t dividend = ((__int128_t)*phigh << 64) | *plow;

This is incorrect, before and after: *plow must be zero-extended here.


@@ -97,13 +101,11 @@ int divu128(uint64_t *plow, uint64_t *phigh, uint64_t 
divisor)
      uint64_t carry = 0;
if (divisor == 0) {
-        return 1;
+        /* intentionally cause a division by 0 */
+        *plow = 1 / divisor;
      } else if (dhi == 0) {
          *plow  = dlo / divisor;
          *phigh = dlo % divisor;

Let's not do two undefined things and leave *phigh uninitialized (e.g. riscv host, where div-by-zero does not trap). Just fold the div-by-zero case into the dhi == 0 case.


r~

Reply via email to