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 #include <stdint.h> 12 #include "generic/rte_byteorder.h" 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 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 */ 23 static 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 */ 33 static 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 */ 45 static 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 #endif 66 67 /* Power 8 have both little endian and big endian mode 68 * Power 7 only support big endian 69 */ 70 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 71 72 #define rte_cpu_to_le_16(x) (x) 73 #define rte_cpu_to_le_32(x) (x) 74 #define rte_cpu_to_le_64(x) (x) 75 76 #define rte_cpu_to_be_16(x) rte_bswap16(x) 77 #define rte_cpu_to_be_32(x) rte_bswap32(x) 78 #define rte_cpu_to_be_64(x) rte_bswap64(x) 79 80 #define rte_le_to_cpu_16(x) (x) 81 #define rte_le_to_cpu_32(x) (x) 82 #define rte_le_to_cpu_64(x) (x) 83 84 #define rte_be_to_cpu_16(x) rte_bswap16(x) 85 #define rte_be_to_cpu_32(x) rte_bswap32(x) 86 #define rte_be_to_cpu_64(x) rte_bswap64(x) 87 88 #else /* RTE_BIG_ENDIAN */ 89 90 #define rte_cpu_to_le_16(x) rte_bswap16(x) 91 #define rte_cpu_to_le_32(x) rte_bswap32(x) 92 #define rte_cpu_to_le_64(x) rte_bswap64(x) 93 94 #define rte_cpu_to_be_16(x) (x) 95 #define rte_cpu_to_be_32(x) (x) 96 #define rte_cpu_to_be_64(x) (x) 97 98 #define rte_le_to_cpu_16(x) rte_bswap16(x) 99 #define rte_le_to_cpu_32(x) rte_bswap32(x) 100 #define rte_le_to_cpu_64(x) rte_bswap64(x) 101 102 #define rte_be_to_cpu_16(x) (x) 103 #define rte_be_to_cpu_32(x) (x) 104 #define rte_be_to_cpu_64(x) (x) 105 #endif 106 107 #ifdef __cplusplus 108 } 109 #endif 110 111 #endif /* _RTE_BYTEORDER_PPC_64_H_ */ 112