Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
/*===---- crc32intrin.h - SSE4.2 Accumulate CRC32 intrinsics ---------------===
2
 *
3
 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
 * See https://llvm.org/LICENSE.txt for license information.
5
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
 *
7
 *===-----------------------------------------------------------------------===
8
 */
9
 
10
#ifndef __CRC32INTRIN_H
11
#define __CRC32INTRIN_H
12
 
13
#define __DEFAULT_FN_ATTRS                                                     \
14
  __attribute__((__always_inline__, __nodebug__, __target__("crc32")))
15
 
16
/// Adds the unsigned integer operand to the CRC-32C checksum of the
17
///    unsigned char operand.
18
///
19
/// \headerfile <x86intrin.h>
20
///
21
/// This intrinsic corresponds to the <c> CRC32B </c> instruction.
22
///
23
/// \param __C
24
///    An unsigned integer operand to add to the CRC-32C checksum of operand
25
///    \a  __D.
26
/// \param __D
27
///    An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
28
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
29
///    operand \a __D.
30
static __inline__ unsigned int __DEFAULT_FN_ATTRS
31
_mm_crc32_u8(unsigned int __C, unsigned char __D)
32
{
33
  return __builtin_ia32_crc32qi(__C, __D);
34
}
35
 
36
/// Adds the unsigned integer operand to the CRC-32C checksum of the
37
///    unsigned short operand.
38
///
39
/// \headerfile <x86intrin.h>
40
///
41
/// This intrinsic corresponds to the <c> CRC32W </c> instruction.
42
///
43
/// \param __C
44
///    An unsigned integer operand to add to the CRC-32C checksum of operand
45
///    \a __D.
46
/// \param __D
47
///    An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
48
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
49
///    operand \a __D.
50
static __inline__ unsigned int __DEFAULT_FN_ATTRS
51
_mm_crc32_u16(unsigned int __C, unsigned short __D)
52
{
53
  return __builtin_ia32_crc32hi(__C, __D);
54
}
55
 
56
/// Adds the first unsigned integer operand to the CRC-32C checksum of
57
///    the second unsigned integer operand.
58
///
59
/// \headerfile <x86intrin.h>
60
///
61
/// This intrinsic corresponds to the <c> CRC32L </c> instruction.
62
///
63
/// \param __C
64
///    An unsigned integer operand to add to the CRC-32C checksum of operand
65
///    \a __D.
66
/// \param __D
67
///    An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
68
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
69
///    operand \a __D.
70
static __inline__ unsigned int __DEFAULT_FN_ATTRS
71
_mm_crc32_u32(unsigned int __C, unsigned int __D)
72
{
73
  return __builtin_ia32_crc32si(__C, __D);
74
}
75
 
76
#ifdef __x86_64__
77
/// Adds the unsigned integer operand to the CRC-32C checksum of the
78
///    unsigned 64-bit integer operand.
79
///
80
/// \headerfile <x86intrin.h>
81
///
82
/// This intrinsic corresponds to the <c> CRC32Q </c> instruction.
83
///
84
/// \param __C
85
///    An unsigned integer operand to add to the CRC-32C checksum of operand
86
///    \a __D.
87
/// \param __D
88
///    An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
89
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
90
///    operand \a __D.
91
static __inline__ unsigned long long __DEFAULT_FN_ATTRS
92
_mm_crc32_u64(unsigned long long __C, unsigned long long __D)
93
{
94
  return __builtin_ia32_crc32di(__C, __D);
95
}
96
#endif /* __x86_64__ */
97
 
98
#undef __DEFAULT_FN_ATTRS
99
 
100
#endif /* __CRC32INTRIN_H */