bitops.h: Provide hswap32(), hswap64(), wswap64() swapping operations
Currently the ARM SVE helper code defines locally some utility functions for swapping 16-bit halfwords within 32-bit or 64-bit values and for swapping 32-bit words within 64-bit values, parallel to the byte-swapping bswap16/32/64 functions. We want these also for the ARM MVE code, and they're potentially generally useful for other targets, so move them to bitops.h. (We don't put them in bswap.h with the bswap* functions because they are implemented in terms of the rotate operations also defined in bitops.h, and including bitops.h from bswap.h seems better avoided.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20210614151007.4545-17-peter.maydell@linaro.org
This commit is contained in:
parent
77f96148f3
commit
dbcf6f9367
|
@ -291,6 +291,35 @@ static inline uint64_t ror64(uint64_t word, unsigned int shift)
|
||||||
return (word >> shift) | (word << ((64 - shift) & 63));
|
return (word >> shift) | (word << ((64 - shift) & 63));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hswap32 - swap 16-bit halfwords within a 32-bit value
|
||||||
|
* @h: value to swap
|
||||||
|
*/
|
||||||
|
static inline uint32_t hswap32(uint32_t h)
|
||||||
|
{
|
||||||
|
return rol32(h, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hswap64 - swap 16-bit halfwords within a 64-bit value
|
||||||
|
* @h: value to swap
|
||||||
|
*/
|
||||||
|
static inline uint64_t hswap64(uint64_t h)
|
||||||
|
{
|
||||||
|
uint64_t m = 0x0000ffff0000ffffull;
|
||||||
|
h = rol64(h, 32);
|
||||||
|
return ((h & m) << 16) | ((h >> 16) & m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wswap64 - swap 32-bit words within a 64-bit value
|
||||||
|
* @h: value to swap
|
||||||
|
*/
|
||||||
|
static inline uint64_t wswap64(uint64_t h)
|
||||||
|
{
|
||||||
|
return rol64(h, 32);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* extract32:
|
* extract32:
|
||||||
* @value: the value to extract the bit field from
|
* @value: the value to extract the bit field from
|
||||||
|
|
|
@ -152,26 +152,6 @@ static inline uint64_t expand_pred_s(uint8_t byte)
|
||||||
return word[byte & 0x11];
|
return word[byte & 0x11];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Swap 16-bit words within a 32-bit word. */
|
|
||||||
static inline uint32_t hswap32(uint32_t h)
|
|
||||||
{
|
|
||||||
return rol32(h, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Swap 16-bit words within a 64-bit word. */
|
|
||||||
static inline uint64_t hswap64(uint64_t h)
|
|
||||||
{
|
|
||||||
uint64_t m = 0x0000ffff0000ffffull;
|
|
||||||
h = rol64(h, 32);
|
|
||||||
return ((h & m) << 16) | ((h >> 16) & m);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Swap 32-bit words within a 64-bit word. */
|
|
||||||
static inline uint64_t wswap64(uint64_t h)
|
|
||||||
{
|
|
||||||
return rol64(h, 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LOGICAL_PPPP(NAME, FUNC) \
|
#define LOGICAL_PPPP(NAME, FUNC) \
|
||||||
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, uint32_t desc) \
|
void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, uint32_t desc) \
|
||||||
{ \
|
{ \
|
||||||
|
|
Loading…
Reference in New Issue