commit d48cb3c6cee655dbc28a4285b8b4b1377249555c
parent 8b2de8638745c598813c2f7d34b2a450e45384f3
Author: Robert Russell <robert@rr3.xyz>
Date: Sun, 12 Jan 2025 17:46:58 -0800
Fix addc/subc detection
Diffstat:
1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/inc/bits.h b/inc/bits.h
@@ -209,18 +209,18 @@ r_rzb64(u64 n) {
/* TODO: Use addc/subc intrinsics for non-64 bit adds/subs as well? */
#if __GNUC__ >= 14
- #define HAVE_ADDC_SUBC 1
- /* TODO: I think this is technically not a portable way to figure out which
- * integer type to use, but it should be ok. */
- #if UINT_BITS >= 64
- #define ADDC __builtin_addc
- #define SUBC __builtin_subc
- #elif ULONG_BITS >= 64
- #define ADDC __builtin_addcl
- #define SUBC __builtin_subcl
- #else /* ULLONG_BITS >= 64 always */
- #define ADDC __builtin_addcll
- #define SUBC __builtin_subcll
+ #if __SIZEOF_INT__ == 8
+ #define HAVE_ADDC_SUBC 1
+ #define ADDC64 __builtin_addc
+ #define SUBC64 __builtin_subc
+ #elif __SIZEOF_LONG__ == 8
+ #define HAVE_ADDC_SUBC 1
+ #define ADDC64 __builtin_addcl
+ #define SUBC64 __builtin_subcl
+ #elif __SIZEOF_LONG_LONG == 8
+ #define HAVE_ADDC_SUBC 1
+ #define ADDC64 __builtin_addcll
+ #define SUBC64 __builtin_subcll
#endif
#endif
@@ -248,7 +248,7 @@ r_add32(u32 *co, u32 *z, u32 x, u32 y, u32 ci) {
static inline void
r_add64(u64 *co, u64 *z, u64 x, u64 y, u64 ci) {
#ifdef HAVE_ADDC_SUBC
- *z = ADDC(x, y, ci, co);
+ *z = ADDC64(x, y, ci, co);
#else
u64 s = x + y;
u64 co0 = s < x;
@@ -283,7 +283,7 @@ r_sub32(u32 *bo, u32 *z, u32 x, u32 y, u32 bi) {
static inline void
r_sub64(u64 *bo, u64 *z, u64 x, u64 y, u64 bi) {
#ifdef HAVE_ADDC_SUBC
- *z = SUBC(x, y, bi, bo);
+ *z = SUBC64(x, y, bi, bo);
#else
u64 s = x - y;
u64 bo0 = s > x;
@@ -294,8 +294,8 @@ r_sub64(u64 *bo, u64 *z, u64 x, u64 y, u64 bi) {
#endif
}
-#undef GNU_SUBC
-#undef GNU_ADDC
+#undef SUBC64
+#undef ADDC64
#undef HAVE_ADDC_SUBC