xref: /dpdk/lib/eal/x86/include/rte_byteorder.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
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