Browse Source

Use more builtin functions if available

Signed-off-by: Steffen Jaeckel <[email protected]>
Steffen Jaeckel 1 month ago
parent
commit
fe8e4bf547

+ 6 - 0
src/encauth/ocb/ocb_ntz.c

@@ -17,6 +17,11 @@
 */
 */
 int ocb_ntz(unsigned long x)
 int ocb_ntz(unsigned long x)
 {
 {
+#if defined(LTC_HAVE_CTZL_BUILTIN)
+   if (x == 0)
+      return sizeof(unsigned long) * CHAR_BIT;
+   return __builtin_ctzl(x);
+#else
    int c;
    int c;
    x &= 0xFFFFFFFFUL;
    x &= 0xFFFFFFFFUL;
    c = 0;
    c = 0;
@@ -25,6 +30,7 @@ int ocb_ntz(unsigned long x)
       x >>= 1;
       x >>= 1;
    }
    }
    return c;
    return c;
+#endif
 }
 }
 
 
 #endif
 #endif

+ 6 - 0
src/encauth/ocb3/ocb3_int_ntz.c

@@ -16,6 +16,11 @@
 */
 */
 int ocb3_int_ntz(unsigned long x)
 int ocb3_int_ntz(unsigned long x)
 {
 {
+#if defined(LTC_HAVE_CTZL_BUILTIN)
+   if (x == 0)
+      return sizeof(unsigned long) * CHAR_BIT;
+   return __builtin_ctzl(x);
+#else
    int c;
    int c;
    x &= 0xFFFFFFFFUL;
    x &= 0xFFFFFFFFUL;
    c = 0;
    c = 0;
@@ -24,6 +29,7 @@ int ocb3_int_ntz(unsigned long x)
       x >>= 1;
       x >>= 1;
    }
    }
    return c;
    return c;
+#endif
 }
 }
 
 
 #endif
 #endif

+ 8 - 0
src/headers/tomcrypt_cfg.h

@@ -295,6 +295,14 @@ typedef unsigned long ltc_mp_digit;
    #define LTC_HAVE_ROTATE_BUILTIN
    #define LTC_HAVE_ROTATE_BUILTIN
 #endif
 #endif
 
 
+#if __has_builtin(__builtin_clzl)
+   #define LTC_HAVE_CLZL_BUILTIN
+#endif
+
+#if __has_builtin(__builtin_ctzl)
+   #define LTC_HAVE_CTZL_BUILTIN
+#endif
+
 #if defined(__GNUC__)
 #if defined(__GNUC__)
    #define LTC_ALIGN(n) __attribute__((aligned(n)))
    #define LTC_ALIGN(n) __attribute__((aligned(n)))
 #else
 #else

+ 6 - 0
src/mac/pmac/pmac_ntz.c

@@ -14,6 +14,11 @@
 */
 */
 int pmac_ntz(unsigned long x)
 int pmac_ntz(unsigned long x)
 {
 {
+#if defined(LTC_HAVE_CTZL_BUILTIN)
+   if (x == 0)
+      return sizeof(unsigned long) * CHAR_BIT;
+   return __builtin_ctzl(x);
+#else
    int c;
    int c;
    x &= 0xFFFFFFFFUL;
    x &= 0xFFFFFFFFUL;
    c = 0;
    c = 0;
@@ -22,6 +27,7 @@ int pmac_ntz(unsigned long x)
       x >>= 1;
       x >>= 1;
    }
    }
    return c;
    return c;
+#endif
 }
 }
 
 
 #endif
 #endif

+ 6 - 1
src/pk/asn1/der/object_identifier/der_length_object_identifier.c

@@ -11,6 +11,11 @@
 
 
 unsigned long der_object_identifier_bits(unsigned long x)
 unsigned long der_object_identifier_bits(unsigned long x)
 {
 {
+#if defined(LTC_HAVE_CLZL_BUILTIN)
+   if (x == 0)
+      return 0;
+   return sizeof(unsigned long) * CHAR_BIT - __builtin_clzl(x);
+#else
    unsigned long c;
    unsigned long c;
    c  = 0;
    c  = 0;
    while (x) {
    while (x) {
@@ -18,9 +23,9 @@ unsigned long der_object_identifier_bits(unsigned long x)
      x >>= 1;
      x >>= 1;
    }
    }
    return c;
    return c;
+#endif
 }
 }
 
 
-
 /**
 /**
   Gets length of DER encoding of Object Identifier
   Gets length of DER encoding of Object Identifier
   @param nwords   The number of OID words
   @param nwords   The number of OID words