]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
factor: speed up ge2, gt2
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 1 Jul 2025 10:33:27 +0000 (03:33 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Jul 2025 00:12:40 +0000 (17:12 -0700)
* src/factor.c (ge2, gt2): Now branchless static functions.

src/factor.c

index bb33c25ef3d7cab03dfff638b5f4f84c7e23861e..8d1a6fc5e54cad1255f76d2cf0b33ce72922dc38 100644 (file)
@@ -403,12 +403,24 @@ static void factor_up (struct factors *, mp_limb_t, mp_limb_t,
   } while (0)
 
 /* (ah,hl) >= (bh,bl)?  */
-#define ge2(ah, al, bh, bl)                                             \
-  ((ah) > (bh) || ((ah) == (bh) && (al) >= (bl)))
+static bool
+ge2 (mp_limb_t ah, mp_limb_t al, mp_limb_t bh, mp_limb_t bl)
+{
+  mp_limb_t dh, dl;
+  bool vh = ckd_sub (&dh, ah, bh);
+  mp_limb_t vl = ckd_sub (&dl, al, bl);
+  return ! (vh | ckd_sub (&dh, dh, vl));
+}
 
 /* (ah,hl) > (bh,bl)?  */
-#define gt2(ah, al, bh, bl)                                             \
-  ((ah) > (bh) || ((ah) == (bh) && (al) > (bl)))
+static bool
+gt2 (mp_limb_t ah, mp_limb_t al, mp_limb_t bh, mp_limb_t bl)
+{
+  mp_limb_t dh, dl;
+  bool vh = ckd_sub (&dh, bh, ah);
+  mp_limb_t vl = ckd_sub (&dl, bl, al);
+  return vh | ckd_sub (&dh, dh, vl);
+}
 
 /* Set (rh,rl) = (ah,al) - (bh,bl).  Overflow wraps around.  */
 #ifndef sub_ddmmss