dpdk/lib/eal/ppc/include/rte_byteorder.h
<<
>>
Prefs
   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