blob: b6450553865bfbb24f81db885f51b63dfdfd28a0 [file] [log] [blame]
/* Copyright 2022 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef DEV_EMBEDDED_TI50_SDK_FILES_INCLUDE_ENDIAN_H_
#define DEV_EMBEDDED_TI50_SDK_FILES_INCLUDE_ENDIAN_H_
#include <stdint.h>
#ifdef __soteria
static inline uint32_t __bswap32(uint32_t data) {
uint32_t ret;
asm volatile("grevi %0, %1, 0x18" : "=r"(ret) : "r"(data));
return ret;
}
static inline uint16_t __bswap16(uint16_t x) {
uint16_t i;
asm("grevi %0, %1, 0x08\n" : "=r"(i) : "r"(x));
return i;
}
static inline uint64_t __bswap64(uint64_t x) {
uint32_t lo = __bswap32((uint32_t)x);
uint32_t hi = __bswap32((uint32_t)(x >> 32));
return ((uint64_t)lo << 32) | (uint64_t)hi;
}
#else
#define __bswap16(_x) __builtin_bswap16(_x)
#define __bswap32(_x) __builtin_bswap32(_x)
#define __bswap64(_x) __builtin_bswap64(_x)
#endif
#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
static inline uint16_t be16toh(uint16_t in) {
return __bswap16(in);
}
static inline uint32_t be32toh(uint32_t in) {
return __bswap32(in);
}
static inline uint64_t be64toh(uint64_t in) {
return __bswap64(in);
}
static inline uint16_t htobe16(uint16_t in) {
return __bswap16(in);
}
static inline uint32_t htobe32(uint32_t in) {
return __bswap32(in);
}
static inline uint64_t htobe64(uint64_t in) {
return __bswap64(in);
}
#else /* __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ */
static inline uint16_t be16toh(uint16_t in) {
return in;
}
static inline uint32_t be32toh(uint32_t in) {
return in;
}
static inline uint64_t be64toh(uint64_t in) {
return in;
}
static inline uint16_t htobe16(uint16_t in) {
return in;
}
static inline uint32_t htobe32(uint32_t in) {
return in;
}
static inline uint64_t htobe64(uint64_t in) {
return in;
}
#endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
#endif /* DEV_EMBEDDED_TI50_SDK_FILES_INCLUDE_ENDIAN_H_ */