zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

crc32intrin.h (3347B) - Raw


      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 */