Define vector versions of the endianness conversion functions.

This commit is contained in:
Dag-Erling Smørgrav 2017-03-19 19:00:01 +01:00
parent 9796dc64ee
commit 6a60c8024b
2 changed files with 154 additions and 0 deletions

View file

@ -57,9 +57,13 @@ AX_GCC_BUILTIN([__builtin_bswap32])
AX_GCC_BUILTIN([__builtin_bswap64])
AC_CHECK_DECLS([
bswap16, bswap32, bswap64,
bswap16v, bswap32v, bswap64v,
be16enc, be16dec, le16enc, le16dec,
be16encv, be16decv, le16encv, le16decv,
be32enc, be32dec, le32enc, le32dec,
be32encv, be32decv, le32encv, le32decv,
be64enc, be64dec, le64enc, le64dec,
be64encv, be64decv, le64encv, le64decv,
htobe16, be16toh, htole16, le16toh,
htobe32, be32toh, htole32, le32toh,
htobe64, be64toh, htole64, le64toh,

View file

@ -48,48 +48,93 @@ CRYB_BEGIN
#if !HAVE_DECL_BSWAP16
#define bswap16 cryb_bswap16
#endif
#if !HAVE_DECL_BSWAP16V
#define bswap16v cryb_bswap16v
#endif
#if !HAVE_DECL_BSWAP32
#define bswap32 cryb_bswap32
#endif
#if !HAVE_DECL_BSWAP32V
#define bswap32v cryb_bswap32v
#endif
#if !HAVE_DECL_BSWAP64
#define bswap64 cryb_bswap64
#endif
#if !HAVE_DECL_BSWAP64V
#define bswap64v cryb_bswap64v
#endif
#if !HAVE_DECL_BE16ENC
#define be16enc cryb_be16enc
#endif
#if !HAVE_DECL_BE16ENCV
#define be16encv cryb_be16encv
#endif
#if !HAVE_DECL_BE16DEC
#define be16dec cryb_be16dec
#endif
#if !HAVE_DECL_BE16DECV
#define be16decv cryb_be16decv
#endif
#if !HAVE_DECL_BE32ENC
#define be32enc cryb_be32enc
#endif
#if !HAVE_DECL_BE32ENCV
#define be32encv cryb_be32encv
#endif
#if !HAVE_DECL_BE32DEC
#define be32dec cryb_be32dec
#endif
#if !HAVE_DECL_BE32DECV
#define be32decv cryb_be32decv
#endif
#if !HAVE_DECL_BE64ENC
#define be64enc cryb_be64enc
#endif
#if !HAVE_DECL_BE64ENCV
#define be64encv cryb_be64encv
#endif
#if !HAVE_DECL_BE64DEC
#define be64dec cryb_be64dec
#endif
#if !HAVE_DECL_BE64DECV
#define be64decv cryb_be64decv
#endif
#if !HAVE_DECL_LE16ENC
#define le16enc cryb_le16enc
#endif
#if !HAVE_DECL_LE16ENCV
#define le16encv cryb_le16encv
#endif
#if !HAVE_DECL_LE16DEC
#define le16dec cryb_le16dec
#endif
#if !HAVE_DECL_LE16DECV
#define le16decv cryb_le16decv
#endif
#if !HAVE_DECL_LE32ENC
#define le32enc cryb_le32enc
#endif
#if !HAVE_DECL_LE32ENCV
#define le32encv cryb_le32encv
#endif
#if !HAVE_DECL_LE32DEC
#define le32dec cryb_le32dec
#endif
#if !HAVE_DECL_LE32DECV
#define le32decv cryb_le32decv
#endif
#if !HAVE_DECL_LE64ENC
#define le64enc cryb_le64enc
#endif
#if !HAVE_DECL_LE64ENCV
#define le64encv cryb_le64encv
#endif
#if !HAVE_DECL_LE64DEC
#define le64dec cryb_le64dec
#endif
#if !HAVE_DECL_LE64DECV
#define le64decv cryb_le64decv
#endif
#if !HAVE_DECL_HTOBE16
#define htobe16 cryb_htobe16
#endif
@ -138,6 +183,13 @@ cryb_bswap16(uint16_t u16)
#endif
}
static inline void
cryb_bswap16v(uint16_t *u16, size_t n)
{
for (; n--; u16++)
*u16 = cryb_bswap16(*u16);
}
static inline uint32_t
cryb_bswap32(uint32_t u32)
{
@ -151,6 +203,13 @@ cryb_bswap32(uint32_t u32)
#endif
}
static inline void
cryb_bswap32v(uint32_t *u32, size_t n)
{
for (; n--; u32++)
*u32 = cryb_bswap32(*u32);
}
static inline uint64_t
cryb_bswap64(uint64_t u64)
{
@ -168,6 +227,13 @@ cryb_bswap64(uint64_t u64)
#endif
}
static inline void
cryb_bswap64v(uint64_t *u64, size_t n)
{
for (; n--; u64++)
*u64 = cryb_bswap64(*u64);
}
static inline void
cryb_be16enc(void *p, uint16_t u16)
{
@ -175,6 +241,13 @@ cryb_be16enc(void *p, uint16_t u16)
((uint8_t *)p)[0] = (u16 >> 8) & 0xff;
}
static inline void
cryb_be16encv(void *p, const uint16_t *u16, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u16, u16++)
cryb_be16enc(u8, *u16);
}
static inline uint16_t
cryb_be16dec(const void *p)
{
@ -182,6 +255,13 @@ cryb_be16dec(const void *p)
(uint16_t)((const uint8_t *)p)[0] << 8);
}
static inline void
cryb_be16decv(uint16_t *u16, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u16, u16++)
*u16 = cryb_be16dec(u8);
}
static inline void
cryb_be32enc(void *p, uint32_t u32)
{
@ -191,6 +271,13 @@ cryb_be32enc(void *p, uint32_t u32)
((uint8_t *)p)[0] = (u32 >> 24) & 0xff;
}
static inline void
cryb_be32encv(void *p, const uint32_t *u32, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u32, u32++)
cryb_be32enc(u8, *u32);
}
static inline uint32_t
cryb_be32dec(const void *p)
{
@ -200,6 +287,13 @@ cryb_be32dec(const void *p)
(uint32_t)((const uint8_t *)p)[0] << 24);
}
static inline void
cryb_be32decv(uint32_t *u32, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u32, u32++)
*u32 = cryb_be32dec(u8);
}
static inline void
cryb_be64enc(void *p, uint64_t u64)
{
@ -213,6 +307,13 @@ cryb_be64enc(void *p, uint64_t u64)
((uint8_t *)p)[0] = (u64 >> 56) & 0xff;
}
static inline void
cryb_be64encv(void *p, const uint64_t *u64, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u64, u64++)
cryb_be64enc(u8, *u64);
}
static inline uint64_t
cryb_be64dec(const void *p)
{
@ -226,6 +327,13 @@ cryb_be64dec(const void *p)
(uint64_t)((const uint8_t *)p)[0] << 56);
}
static inline void
cryb_be64decv(uint64_t *u64, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u64, u64++)
*u64 = cryb_be64dec(u8);
}
static inline void
cryb_le16enc(void *p, uint16_t u16)
{
@ -233,6 +341,13 @@ cryb_le16enc(void *p, uint16_t u16)
((uint8_t *)p)[1] = (u16 >> 8) & 0xff;
}
static inline void
cryb_le16encv(void *p, const uint16_t *u16, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u16, u16++)
cryb_le16enc(u8, *u16);
}
static inline uint16_t
cryb_le16dec(const void *p)
{
@ -240,6 +355,13 @@ cryb_le16dec(const void *p)
(uint16_t)((const uint8_t *)p)[1] << 8);
}
static inline void
cryb_le16decv(uint16_t *u16, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u16, u16++)
*u16 = cryb_le16dec(u8);
}
static inline void
cryb_le32enc(void *p, uint32_t u32)
{
@ -249,6 +371,13 @@ cryb_le32enc(void *p, uint32_t u32)
((uint8_t *)p)[3] = (u32 >> 24) & 0xff;
}
static inline void
cryb_le32encv(void *p, const uint32_t *u32, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u32, u32++)
cryb_le32enc(u8, *u32);
}
static inline uint32_t
cryb_le32dec(const void *p)
{
@ -258,6 +387,13 @@ cryb_le32dec(const void *p)
(uint32_t)((const uint8_t *)p)[3] << 24);
}
static inline void
cryb_le32decv(uint32_t *u32, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u32, u32++)
*u32 = cryb_le32dec(u8);
}
static inline void
cryb_le64enc(void *p, uint64_t u64)
{
@ -271,6 +407,13 @@ cryb_le64enc(void *p, uint64_t u64)
((uint8_t *)p)[7] = (u64 >> 56) & 0xff;
}
static inline void
cryb_le64encv(void *p, const uint64_t *u64, size_t n)
{
for (uint8_t *u8 = p; n--; u8 += sizeof *u64, u64++)
cryb_le64enc(u8, *u64);
}
static inline uint64_t
cryb_le64dec(const void *p)
{
@ -284,6 +427,13 @@ cryb_le64dec(const void *p)
(uint64_t)((const uint8_t *)p)[7] << 56);
}
static inline void
cryb_le64decv(uint64_t *u64, const void *p, size_t n)
{
for (const uint8_t *u8 = p; n--; u8 += sizeof *u64, u64++)
*u64 = cryb_le64dec(u8);
}
static inline uint16_t
cryb_htobe16(uint16_t u16)
{