[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v16 16/35] host-utils: Add revbit functions
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v16 16/35] host-utils: Add revbit functions |
Date: |
Mon, 14 Sep 2015 15:43:23 -0700 |
Signed-off-by: Richard Henderson <address@hidden>
---
include/qemu/host-utils.h | 77 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 77 insertions(+)
diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
index 7d36ebf..3ef97d5 100644
--- a/include/qemu/host-utils.h
+++ b/include/qemu/host-utils.h
@@ -26,6 +26,7 @@
#define HOST_UTILS_H 1
#include "qemu/compiler.h" /* QEMU_GNUC_PREREQ */
+#include "qemu/bswap.h"
#include <limits.h>
#include <stdbool.h>
@@ -391,6 +392,80 @@ static inline int ctpop64(uint64_t val)
#endif
}
+/**
+ * revbit8 - reverse the bits in an 8-bit value.
+ * @x: The value to modify.
+ */
+static inline uint8_t revbit8(uint8_t x)
+{
+ /* Assign the correct nibble position. */
+ x = ((x & 0xf0) >> 4)
+ | ((x & 0x0f) << 4);
+ /* Assign the correct bit position. */
+ x = ((x & 0x88) >> 3)
+ | ((x & 0x44) >> 1)
+ | ((x & 0x22) << 1)
+ | ((x & 0x11) << 3);
+ return x;
+}
+
+/**
+ * revbit16 - reverse the bits in a 16-bit value.
+ * @x: The value to modify.
+ */
+static inline uint16_t revbit16(uint16_t x)
+{
+ /* Assign the correct byte position. */
+ x = bswap16(x);
+ /* Assign the correct nibble position. */
+ x = ((x & 0xf0f0) >> 4)
+ | ((x & 0x0f0f) << 4);
+ /* Assign the correct bit position. */
+ x = ((x & 0x8888) >> 3)
+ | ((x & 0x4444) >> 1)
+ | ((x & 0x2222) << 1)
+ | ((x & 0x1111) << 3);
+ return x;
+}
+
+/**
+ * revbit32 - reverse the bits in a 32-bit value.
+ * @x: The value to modify.
+ */
+static inline uint32_t revbit32(uint32_t x)
+{
+ /* Assign the correct byte position. */
+ x = bswap32(x);
+ /* Assign the correct nibble position. */
+ x = ((x & 0xf0f0f0f0u) >> 4)
+ | ((x & 0x0f0f0f0fu) << 4);
+ /* Assign the correct bit position. */
+ x = ((x & 0x88888888u) >> 3)
+ | ((x & 0x44444444u) >> 1)
+ | ((x & 0x22222222u) << 1)
+ | ((x & 0x11111111u) << 3);
+ return x;
+}
+
+/**
+ * revbit64 - reverse the bits in a 64-bit value.
+ * @x: The value to modify.
+ */
+static inline uint64_t revbit64(uint64_t x)
+{
+ /* Assign the correct byte position. */
+ x = bswap64(x);
+ /* Assign the correct nibble position. */
+ x = ((x & 0xf0f0f0f0f0f0f0f0ull) >> 4)
+ | ((x & 0x0f0f0f0f0f0f0f0full) << 4);
+ /* Assign the correct bit position. */
+ x = ((x & 0x8888888888888888ull) >> 3)
+ | ((x & 0x4444444444444444ull) >> 1)
+ | ((x & 0x2222222222222222ull) << 1)
+ | ((x & 0x1111111111111111ull) << 3);
+ return x;
+}
+
/* Host type specific sizes of these routines. */
#if ULONG_MAX == UINT32_MAX
@@ -399,12 +474,14 @@ static inline int ctpop64(uint64_t val)
# define clol clo32
# define ctol cto32
# define ctpopl ctpop32
+# define revbitl revbit32
#elif ULONG_MAX == UINT64_MAX
# define clzl clz64
# define ctzl ctz64
# define clol clo64
# define ctol cto64
# define ctpopl ctpop64
+# define revbitl revbit64
#else
# error Unknown sizeof long
#endif
--
2.4.3
- [Qemu-devel] [PATCH v16 05/35] target-tilegx: Modify opcode_tilegx.h to fit QEMU usage, (continued)
- [Qemu-devel] [PATCH v16 05/35] target-tilegx: Modify opcode_tilegx.h to fit QEMU usage, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 08/35] target-tilegx: Add special register information from Tilera Corporation, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 09/35] target-tilegx: Add cpu basic features for linux-user, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 13/35] target-tilegx: Add TILE-Gx building files, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 12/35] target-tilegx: Generate SEGV properly, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 10/35] target-tilegx: Add several helpers for instructions translation, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 14/35] target-tilegx: Handle simple logical operations, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 15/35] target-tilegx: Handle arithmetic instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 17/35] target-arm: Use new revbit functions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 16/35] host-utils: Add revbit functions,
Richard Henderson <=
- [Qemu-devel] [PATCH v16 18/35] target-tilegx: Handle most bit manipulation instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 11/35] target-tilegx: Framework for decoding bundles, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 19/35] target-tilegx: Handle basic load and store instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 20/35] target-tilegx: Handle post-increment load and store instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 22/35] target-tilegx: Handle conditional branch instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 23/35] target-tilegx: Handle comparison instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 21/35] target-tilegx: Handle unconditional jump instructions, Richard Henderson, 2015/09/14
- [Qemu-devel] [PATCH v16 25/35] target-tilegx: Handle bitfield instructions, Richard Henderson, 2015/09/14