summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/eigccarm.h
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2021-06-12 03:00:21 +1000
committer Vas Crabb <cuavas@users.noreply.github.com>2021-06-13 09:38:01 +1000
commit73d97b7dc492871d3dcf4ee919fc443dd2308dec (patch)
treec394cccb9d6514a5b8e69f054d5d27ecc50a5d58 /src/osd/eigccarm.h
parent27b93b23486533747d9ba185ff54da860223a463 (diff)
Added helpers for 64-bit count leading zeroes/ones.
Diffstat (limited to 'src/osd/eigccarm.h')
-rw-r--r--src/osd/eigccarm.h62
1 files changed, 54 insertions, 8 deletions
diff --git a/src/osd/eigccarm.h b/src/osd/eigccarm.h
index 27d79c4a5c6..90004daf9d4 100644
--- a/src/osd/eigccarm.h
+++ b/src/osd/eigccarm.h
@@ -239,14 +239,14 @@ _mulu_64x64(uint64_t a, uint64_t b, uint64_t &hi)
***************************************************************************/
/*-------------------------------------------------
- count_leading_zeros - return the number of
+ count_leading_zeros_32 - return the number of
leading zero bits in a 32-bit value
-------------------------------------------------*/
#if defined(__aarch64__)
-#define count_leading_zeros _count_leading_zeros
+#define count_leading_zeros_32 _count_leading_zeros_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_zeros(uint32_t value)
+_count_leading_zeros_32(uint32_t value)
{
uint32_t result;
@@ -256,20 +256,20 @@ _count_leading_zeros(uint32_t value)
: [value] "r" (value)
);
- return result;
+ return uint8_t(result);
}
#endif
/*-------------------------------------------------
- count_leading_ones - return the number of
+ count_leading_ones_32 - return the number of
leading one bits in a 32-bit value
-------------------------------------------------*/
#if defined(__aarch64__)
-#define count_leading_ones _count_leading_ones
+#define count_leading_ones_32 _count_leading_ones_32
inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
-_count_leading_ones(uint32_t value)
+_count_leading_ones_32(uint32_t value)
{
uint32_t result;
@@ -279,7 +279,53 @@ _count_leading_ones(uint32_t value)
: [value] "r" (~value)
);
- return result;
+ return uint8_t(result);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_zeros_64 - return the number of
+ leading zero bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__aarch64__)
+#define count_leading_zeros_64 _count_leading_zeros_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_zeros_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " clz %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (value)
+ );
+
+ return uint8_t(result);
+}
+#endif
+
+
+/*-------------------------------------------------
+ count_leading_ones_64 - return the number of
+ leading one bits in a 64-bit value
+-------------------------------------------------*/
+
+#if defined(__aarch64__)
+#define count_leading_ones_64 _count_leading_ones_64
+inline uint8_t ATTR_CONST ATTR_FORCE_INLINE
+_count_leading_ones_64(uint64_t value)
+{
+ uint64_t result;
+
+ __asm__ (
+ " clz %[result], %[value] \n"
+ : [result] "=r" (result)
+ : [value] "r" (~value)
+ );
+
+ return uint8_t(result);
}
#endif