[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/12] qemu/host-utils.h: Add clz and ctz functions for lower-bit
|
From: |
Richard Henderson |
|
Subject: |
[PULL 04/12] qemu/host-utils.h: Add clz and ctz functions for lower-bit integers |
|
Date: |
Tue, 2 May 2023 12:20:15 +0100 |
From: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
This is for use in the RISC-V vclz and vctz instructions (implemented in
proceeding commit).
Signed-off-by: Kiran Ostrolenk <kiran.ostrolenk@codethink.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230428144757.57530-11-lawrence.hunter@codethink.co.uk>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/qemu/host-utils.h | 54 +++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
index 3ce62bf4a5..d3b4dce6a9 100644
--- a/include/qemu/host-utils.h
+++ b/include/qemu/host-utils.h
@@ -107,6 +107,36 @@ static inline uint64_t muldiv64(uint64_t a, uint32_t b,
uint32_t c)
}
#endif
+/**
+ * clz8 - count leading zeros in a 8-bit value.
+ * @val: The value to search
+ *
+ * Returns 8 if the value is zero. Note that the GCC builtin is
+ * undefined if the value is zero.
+ *
+ * Note that the GCC builtin will upcast its argument to an `unsigned int`
+ * so this function subtracts off the number of prepended zeroes.
+ */
+static inline int clz8(uint8_t val)
+{
+ return val ? __builtin_clz(val) - 24 : 8;
+}
+
+/**
+ * clz16 - count leading zeros in a 16-bit value.
+ * @val: The value to search
+ *
+ * Returns 16 if the value is zero. Note that the GCC builtin is
+ * undefined if the value is zero.
+ *
+ * Note that the GCC builtin will upcast its argument to an `unsigned int`
+ * so this function subtracts off the number of prepended zeroes.
+ */
+static inline int clz16(uint16_t val)
+{
+ return val ? __builtin_clz(val) - 16 : 16;
+}
+
/**
* clz32 - count leading zeros in a 32-bit value.
* @val: The value to search
@@ -153,6 +183,30 @@ static inline int clo64(uint64_t val)
return clz64(~val);
}
+/**
+ * ctz8 - count trailing zeros in a 8-bit value.
+ * @val: The value to search
+ *
+ * Returns 8 if the value is zero. Note that the GCC builtin is
+ * undefined if the value is zero.
+ */
+static inline int ctz8(uint8_t val)
+{
+ return val ? __builtin_ctz(val) : 8;
+}
+
+/**
+ * ctz16 - count trailing zeros in a 16-bit value.
+ * @val: The value to search
+ *
+ * Returns 16 if the value is zero. Note that the GCC builtin is
+ * undefined if the value is zero.
+ */
+static inline int ctz16(uint16_t val)
+{
+ return val ? __builtin_ctz(val) : 16;
+}
+
/**
* ctz32 - count trailing zeros in a 32-bit value.
* @val: The value to search
--
2.34.1
- [PULL 00/12] tcg patch queue, Richard Henderson, 2023/05/02
- [PULL 01/12] softmmu: Tidy dirtylimit_dirty_ring_full_time, Richard Henderson, 2023/05/02
- [PULL 03/12] qemu/bitops.h: Limit rotate amounts, Richard Henderson, 2023/05/02
- [PULL 02/12] accel/tcg: Uncache the host address for instruction fetch when tlb size < 1, Richard Henderson, 2023/05/02
- [PULL 04/12] qemu/host-utils.h: Add clz and ctz functions for lower-bit integers,
Richard Henderson <=
- [PULL 05/12] tcg: Add tcg_gen_gvec_andcs, Richard Henderson, 2023/05/02
- [PULL 07/12] qemu/int128: Re-shuffle Int128Alias members, Richard Henderson, 2023/05/02
- [PULL 06/12] tcg: Add tcg_gen_gvec_rotrs, Richard Henderson, 2023/05/02
- [PULL 09/12] accel/tcg: Add cpu_ld*_code_mmu, Richard Henderson, 2023/05/02
- [PULL 08/12] migration/xbzrle: Use __attribute__((target)) for avx512, Richard Henderson, 2023/05/02
- [PULL 11/12] tcg/mips: Conditionalize tcg_out_exts_i32_i64, Richard Henderson, 2023/05/02
- [PULL 10/12] tcg/loongarch64: Conditionalize tcg_out_exts_i32_i64, Richard Henderson, 2023/05/02
- [PULL 12/12] tcg: Introduce tcg_out_movext2, Richard Henderson, 2023/05/02