199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2010-2014 Intel Corporation 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef _RTE_BYTEORDER_X86_H_ 699a2dd95SBruce Richardson #define _RTE_BYTEORDER_X86_H_ 799a2dd95SBruce Richardson 899a2dd95SBruce Richardson #include <stdint.h> 999a2dd95SBruce Richardson #include <rte_common.h> 1099a2dd95SBruce Richardson #include <rte_config.h> 1199a2dd95SBruce Richardson #include "generic/rte_byteorder.h" 1299a2dd95SBruce Richardson 13*719834a6SMattias Rönnblom #ifdef __cplusplus 14*719834a6SMattias Rönnblom extern "C" { 15*719834a6SMattias Rönnblom #endif 16*719834a6SMattias Rönnblom 1799a2dd95SBruce Richardson #ifndef RTE_BYTE_ORDER 1899a2dd95SBruce Richardson #define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN 1999a2dd95SBruce Richardson #endif 2099a2dd95SBruce Richardson 2116c7206cSTyler Retzlaff #ifndef RTE_FORCE_INTRINSICS 2299a2dd95SBruce Richardson /* 2399a2dd95SBruce Richardson * An architecture-optimized byte swap for a 16-bit value. 2499a2dd95SBruce Richardson * 2599a2dd95SBruce Richardson * Do not use this function directly. The preferred function is rte_bswap16(). 2699a2dd95SBruce Richardson */ 2799a2dd95SBruce Richardson static inline uint16_t rte_arch_bswap16(uint16_t _x) 2899a2dd95SBruce Richardson { 2999a2dd95SBruce Richardson uint16_t x = _x; 3099a2dd95SBruce Richardson asm volatile ("xchgb %b[x1],%h[x2]" 3199a2dd95SBruce Richardson : [x1] "=Q" (x) 3299a2dd95SBruce Richardson : [x2] "0" (x) 3399a2dd95SBruce Richardson ); 3499a2dd95SBruce Richardson return x; 3599a2dd95SBruce Richardson } 3699a2dd95SBruce Richardson 3799a2dd95SBruce Richardson /* 3899a2dd95SBruce Richardson * An architecture-optimized byte swap for a 32-bit value. 3999a2dd95SBruce Richardson * 4099a2dd95SBruce Richardson * Do not use this function directly. The preferred function is rte_bswap32(). 4199a2dd95SBruce Richardson */ 4299a2dd95SBruce Richardson static inline uint32_t rte_arch_bswap32(uint32_t _x) 4399a2dd95SBruce Richardson { 4499a2dd95SBruce Richardson uint32_t x = _x; 4599a2dd95SBruce Richardson asm volatile ("bswap %[x]" 4699a2dd95SBruce Richardson : [x] "+r" (x) 4799a2dd95SBruce Richardson ); 4899a2dd95SBruce Richardson return x; 4999a2dd95SBruce Richardson } 5099a2dd95SBruce Richardson 51*719834a6SMattias Rönnblom #ifdef __cplusplus 52*719834a6SMattias Rönnblom } 53*719834a6SMattias Rönnblom #endif 54*719834a6SMattias Rönnblom 5599a2dd95SBruce Richardson #define rte_bswap16(x) ((uint16_t)(__builtin_constant_p(x) ? \ 5699a2dd95SBruce Richardson rte_constant_bswap16(x) : \ 5799a2dd95SBruce Richardson rte_arch_bswap16(x))) 5899a2dd95SBruce Richardson 5999a2dd95SBruce Richardson #define rte_bswap32(x) ((uint32_t)(__builtin_constant_p(x) ? \ 6099a2dd95SBruce Richardson rte_constant_bswap32(x) : \ 6199a2dd95SBruce Richardson rte_arch_bswap32(x))) 6299a2dd95SBruce Richardson 6399a2dd95SBruce Richardson #define rte_bswap64(x) ((uint64_t)(__builtin_constant_p(x) ? \ 6499a2dd95SBruce Richardson rte_constant_bswap64(x) : \ 6599a2dd95SBruce Richardson rte_arch_bswap64(x))) 6616c7206cSTyler Retzlaff 6716c7206cSTyler Retzlaff #ifdef RTE_ARCH_I686 6816c7206cSTyler Retzlaff #include "rte_byteorder_32.h" 6916c7206cSTyler Retzlaff #else 7016c7206cSTyler Retzlaff #include "rte_byteorder_64.h" 7116c7206cSTyler Retzlaff #endif 7299a2dd95SBruce Richardson #endif 7399a2dd95SBruce Richardson 7499a2dd95SBruce Richardson #define rte_cpu_to_le_16(x) (x) 7599a2dd95SBruce Richardson #define rte_cpu_to_le_32(x) (x) 7699a2dd95SBruce Richardson #define rte_cpu_to_le_64(x) (x) 7799a2dd95SBruce Richardson 7899a2dd95SBruce Richardson #define rte_cpu_to_be_16(x) rte_bswap16(x) 7999a2dd95SBruce Richardson #define rte_cpu_to_be_32(x) rte_bswap32(x) 8099a2dd95SBruce Richardson #define rte_cpu_to_be_64(x) rte_bswap64(x) 8199a2dd95SBruce Richardson 8299a2dd95SBruce Richardson #define rte_le_to_cpu_16(x) (x) 8399a2dd95SBruce Richardson #define rte_le_to_cpu_32(x) (x) 8499a2dd95SBruce Richardson #define rte_le_to_cpu_64(x) (x) 8599a2dd95SBruce Richardson 8699a2dd95SBruce Richardson #define rte_be_to_cpu_16(x) rte_bswap16(x) 8799a2dd95SBruce Richardson #define rte_be_to_cpu_32(x) rte_bswap32(x) 8899a2dd95SBruce Richardson #define rte_be_to_cpu_64(x) rte_bswap64(x) 8999a2dd95SBruce Richardson 9099a2dd95SBruce Richardson #endif /* _RTE_BYTEORDER_X86_H_ */ 91