summaryrefslogtreecommitdiff
path: root/riscv/riscv-probe/libfemto/include/stdbits.h
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-10 22:18:39 +0200
committerCarlos Maiolino <[email protected]>2025-07-10 22:18:39 +0200
commit8c6fc0c15415b32080a848bbde640e104098cf13 (patch)
tree04a21bd28f9dc82c8e216390d6208ed93b9bcd11 /riscv/riscv-probe/libfemto/include/stdbits.h
Initial drop
Add some riscv code Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'riscv/riscv-probe/libfemto/include/stdbits.h')
-rw-r--r--riscv/riscv-probe/libfemto/include/stdbits.h63
1 files changed, 63 insertions, 0 deletions
diff --git a/riscv/riscv-probe/libfemto/include/stdbits.h b/riscv/riscv-probe/libfemto/include/stdbits.h
new file mode 100644
index 0000000..2985381
--- /dev/null
+++ b/riscv/riscv-probe/libfemto/include/stdbits.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+#define clz(val) ({ \
+ int result; \
+ switch(sizeof(val)) { \
+ case 1: result = clz8(val); break; \
+ case 2: result = clz16(val); break; \
+ case 4: result = clz32(val); break; \
+ case 8: result = clz64(val); break; \
+ } \
+ result; \
+})
+
+#define ctz(val) ({ \
+ int result; \
+ switch(sizeof(val)) { \
+ case 1: result = ctz8(val); break; \
+ case 2: result = ctz16(val); break; \
+ case 4: result = ctz32(val); break; \
+ case 8: result = ctz64(val); break; \
+ } \
+ result; \
+})
+
+int clz8(int8_t val);
+int clz16(int16_t val);
+int clz32(int32_t val);
+int clz64(int64_t val);
+
+int ctz8(int8_t val);
+int ctz16(int16_t val);
+int ctz32(int32_t val);
+int ctz64(int64_t val);
+
+static inline int ispow2(uintptr_t val)
+{
+ return val && !(val & (val-1));
+}
+
+static inline uintptr_t roundpow2(uintptr_t val)
+{
+ val--;
+ val |= val >> 1;
+ val |= val >> 2;
+ val |= val >> 4;
+ val |= val >> 8;
+ val |= val >> 16;
+#if __SIZE_WIDTH__ == 64
+ val |= val >> 32;
+#endif
+ val++;
+ return val;
+}
+
+#ifdef __cplusplus
+}
+#endif