1/* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * Inspired from FreeBSD src/sys/powerpc/include/endian.h 4 * Copyright (c) 1987, 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 */ 7 8#ifndef _RTE_BYTEORDER_PPC_64_H_ 9#define _RTE_BYTEORDER_PPC_64_H_ 10 11#ifdef __cplusplus 12extern "C" { 13#endif 14 15#include <stdint.h> 16#include "generic/rte_byteorder.h" 17 18/* 19 * An architecture-optimized byte swap for a 16-bit value. 20 * 21 * Do not use this function directly. The preferred function is rte_bswap16(). 22 */ 23static inline uint16_t rte_arch_bswap16(uint16_t _x) 24{ 25 return (_x >> 8) | ((_x << 8) & 0xff00); 26} 27 28/* 29 * An architecture-optimized byte swap for a 32-bit value. 30 * 31 * Do not use this function directly. The preferred function is rte_bswap32(). 32 */ 33static inline uint32_t rte_arch_bswap32(uint32_t _x) 34{ 35 return (_x >> 24) | ((_x >> 8) & 0xff00) | ((_x << 8) & 0xff0000) | 36 ((_x << 24) & 0xff000000); 37} 38 39/* 40 * An architecture-optimized byte swap for a 64-bit value. 41 * 42 * Do not use this function directly. The preferred function is rte_bswap64(). 43 */ 44/* 64-bit mode */ 45static inline uint64_t rte_arch_bswap64(uint64_t _x) 46{ 47 return (_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) | 48 ((_x >> 8) & 0xff000000) | ((_x << 8) & (0xffULL << 32)) | 49 ((_x << 24) & (0xffULL << 40)) | 50 ((_x << 40) & (0xffULL << 48)) | ((_x << 56)); 51} 52 53#ifndef RTE_FORCE_INTRINSICS 54#define rte_bswap16(x) ((uint16_t)(__builtin_constant_p(x) ? \ 55 rte_constant_bswap16(x) : \ 56 rte_arch_bswap16(x))) 57 58#define rte_bswap32(x) ((uint32_t)(__builtin_constant_p(x) ? \ 59 rte_constant_bswap32(x) : \ 60 rte_arch_bswap32(x))) 61 62#define rte_bswap64(x) ((uint64_t)(__builtin_constant_p(x) ? \ 63 rte_constant_bswap64(x) : \ 64 rte_arch_bswap64(x))) 65#else 66/* 67 * __builtin_bswap16 is only available gcc 4.8 and upwards 68 */ 69#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8) 70#define rte_bswap16(x) ((uint16_t)(__builtin_constant_p(x) ? \ 71 rte_constant_bswap16(x) : \ 72 rte_arch_bswap16(x))) 73#endif 74#endif 75 76/* Power 8 have both little endian and big endian mode 77 * Power 7 only support big endian 78 */ 79#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 80 81#define rte_cpu_to_le_16(x) (x) 82#define rte_cpu_to_le_32(x) (x) 83#define rte_cpu_to_le_64(x) (x) 84 85#define rte_cpu_to_be_16(x) rte_bswap16(x) 86#define rte_cpu_to_be_32(x) rte_bswap32(x) 87#define rte_cpu_to_be_64(x) rte_bswap64(x) 88 89#define rte_le_to_cpu_16(x) (x) 90#define rte_le_to_cpu_32(x) (x) 91#define rte_le_to_cpu_64(x) (x) 92 93#define rte_be_to_cpu_16(x) rte_bswap16(x) 94#define rte_be_to_cpu_32(x) rte_bswap32(x) 95#define rte_be_to_cpu_64(x) rte_bswap64(x) 96 97#else /* RTE_BIG_ENDIAN */ 98 99#define rte_cpu_to_le_16(x) rte_bswap16(x) 100#define rte_cpu_to_le_32(x) rte_bswap32(x) 101#define rte_cpu_to_le_64(x) rte_bswap64(x) 102 103#define rte_cpu_to_be_16(x) (x) 104#define rte_cpu_to_be_32(x) (x) 105#define rte_cpu_to_be_64(x) (x) 106 107#define rte_le_to_cpu_16(x) rte_bswap16(x) 108#define rte_le_to_cpu_32(x) rte_bswap32(x) 109#define rte_le_to_cpu_64(x) rte_bswap64(x) 110 111#define rte_be_to_cpu_16(x) (x) 112#define rte_be_to_cpu_32(x) (x) 113#define rte_be_to_cpu_64(x) (x) 114#endif 115 116#ifdef __cplusplus 117} 118#endif 119 120#endif /* _RTE_BYTEORDER_PPC_64_H_ */ 121