DPDK 21.11.9
rte_crc_arm64.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015 Cavium, Inc
3 */
4
5#ifndef _RTE_CRC_ARM64_H_
6#define _RTE_CRC_ARM64_H_
7
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#include <stdint.h>
19#include <rte_cpuflags.h>
21#include <rte_common.h>
22
23static inline uint32_t
24crc32c_arm64_u8(uint8_t data, uint32_t init_val)
25{
26 __asm__ volatile(
27 "crc32cb %w[crc], %w[crc], %w[value]"
28 : [crc] "+r" (init_val)
29 : [value] "r" (data));
30 return init_val;
31}
32
33static inline uint32_t
34crc32c_arm64_u16(uint16_t data, uint32_t init_val)
35{
36 __asm__ volatile(
37 "crc32ch %w[crc], %w[crc], %w[value]"
38 : [crc] "+r" (init_val)
39 : [value] "r" (data));
40 return init_val;
41}
42
43static inline uint32_t
44crc32c_arm64_u32(uint32_t data, uint32_t init_val)
45{
46 __asm__ volatile(
47 "crc32cw %w[crc], %w[crc], %w[value]"
48 : [crc] "+r" (init_val)
49 : [value] "r" (data));
50 return init_val;
51}
52
53static inline uint32_t
54crc32c_arm64_u64(uint64_t data, uint32_t init_val)
55{
56 __asm__ volatile(
57 "crc32cx %w[crc], %w[crc], %x[value]"
58 : [crc] "+r" (init_val)
59 : [value] "r" (data));
60 return init_val;
61}
62
73static inline void
75{
76 switch (alg) {
77 case CRC32_ARM64:
78 if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_CRC32))
79 alg = CRC32_SW;
80 /* fall-through */
81 case CRC32_SW:
82 crc32_alg = alg;
83 /* fall-through */
84 default:
85 break;
86 }
87}
88
89/* Setting the best available algorithm */
90RTE_INIT(rte_hash_crc_init_alg)
91{
92 rte_hash_crc_set_alg(CRC32_ARM64);
93}
94
107static inline uint32_t
108rte_hash_crc_1byte(uint8_t data, uint32_t init_val)
109{
110 if (likely(crc32_alg & CRC32_ARM64))
111 return crc32c_arm64_u8(data, init_val);
112
113 return crc32c_1byte(data, init_val);
114}
115
128static inline uint32_t
129rte_hash_crc_2byte(uint16_t data, uint32_t init_val)
130{
131 if (likely(crc32_alg & CRC32_ARM64))
132 return crc32c_arm64_u16(data, init_val);
133
134 return crc32c_2bytes(data, init_val);
135}
136
149static inline uint32_t
150rte_hash_crc_4byte(uint32_t data, uint32_t init_val)
151{
152 if (likely(crc32_alg & CRC32_ARM64))
153 return crc32c_arm64_u32(data, init_val);
154
155 return crc32c_1word(data, init_val);
156}
157
170static inline uint32_t
171rte_hash_crc_8byte(uint64_t data, uint32_t init_val)
172{
173 if (likely(crc32_alg == CRC32_ARM64))
174 return crc32c_arm64_u64(data, init_val);
175
176 return crc32c_2words(data, init_val);
177}
178
179#ifdef __cplusplus
180}
181#endif
182
183#endif /* _RTE_CRC_ARM64_H_ */
#define likely(x)
#define RTE_INIT(func)
Definition: rte_common.h:197
__extension__ int rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
static uint32_t rte_hash_crc_4byte(uint32_t data, uint32_t init_val)
static uint32_t rte_hash_crc_1byte(uint8_t data, uint32_t init_val)
static void rte_hash_crc_set_alg(uint8_t alg)
Definition: rte_crc_arm64.h:74
static uint32_t rte_hash_crc_2byte(uint16_t data, uint32_t init_val)
static uint32_t rte_hash_crc_8byte(uint64_t data, uint32_t init_val)