Adjust FUNC_MASK define and add function to generate mask_u128 Signed-off-by: Nikunj A Dadhania <nik...@linux.vnet.ibm.com> --- 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