[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 02/13] target-ppc: add mask_u128 routine
From: |
Nikunj A Dadhania |
Subject: |
[Qemu-ppc] [PATCH 02/13] target-ppc: add mask_u128 routine |
Date: |
Mon, 5 Dec 2016 16:55:19 +0530 |
Adjust FUNC_MASK define and add function to generate mask_u128
Signed-off-by: Nikunj A Dadhania <address@hidden>
---
target-ppc/internal.h | 38 +++++++++++++++++++++++++++++---------
1 file changed, 29 insertions(+), 9 deletions(-)
diff --git a/target-ppc/internal.h b/target-ppc/internal.h
index 66cde46..27d956f 100644
--- a/target-ppc/internal.h
+++ b/target-ppc/internal.h
@@ -18,9 +18,9 @@
#ifndef PPC_INTERNAL_H
#define PPC_INTERNAL_H
-#define FUNC_MASK(name, ret_type, size, max_val) \
-static inline ret_type name(uint##size##_t start, \
- uint##size##_t end) \
+#define FUNC_MASK(name, ret_type, size, in_type, max_val) \
+static inline ret_type name(in_type start, \
+ in_type end) \
{ \
ret_type ret, max_bit = size - 1; \
\
@@ -29,8 +29,8 @@ static inline ret_type name(uint##size##_t start,
\
} else if (likely(end == max_bit)) { \
ret = max_val >> start; \
} else { \
- ret = (((uint##size##_t)(-1ULL)) >> (start)) ^ \
- (((uint##size##_t)(-1ULL) >> (end)) >> 1); \
+ ret = (((in_type)(-1ULL)) >> (start)) ^ \
+ (((in_type)(-1ULL) >> (end)) >> 1); \
if (unlikely(start > end)) { \
return ~ret; \
} \
@@ -40,12 +40,32 @@ static inline ret_type name(uint##size##_t start,
\
}
#if defined(TARGET_PPC64)
-FUNC_MASK(MASK, target_ulong, 64, UINT64_MAX);
+FUNC_MASK(MASK, target_ulong, 64, uint64_t, UINT64_MAX);
#else
-FUNC_MASK(MASK, target_ulong, 32, UINT32_MAX);
+FUNC_MASK(MASK, target_ulong, 32, uint32_t, UINT32_MAX);
+#endif
+FUNC_MASK(mask_u32, uint32_t, 32, uint32_t, UINT32_MAX);
+FUNC_MASK(mask_u64, uint64_t, 64, uint64_t, UINT64_MAX);
+
+#if defined(CONFIG_INT128)
+FUNC_MASK(mask_u128, Int128, 128, Int128, ~((__uint128_t)0));
+#else
+static inline Int128 mask_u128(int start, int end)
+{
+ Int128 r = {0};
+ if (start > 63) {
+ r.hi = 0;
+ r.lo = mask_u64(start - 64, end - 64);
+ } else if (end < 64) {
+ r.hi = mask_u64(start, end);
+ r.lo = 0;
+ } else {
+ r.hi = mask_u64(start, 63);
+ r.lo = mask_u64(0, end - 64);
+ }
+ return r;
+}
#endif
-FUNC_MASK(mask_u32, uint32_t, 32, UINT32_MAX);
-FUNC_MASK(mask_u64, uint64_t, 64, UINT64_MAX);
/*****************************************************************************/
/*** Instruction decoding ***/
--
2.7.4