mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
c9152b6f14
This change switches c++ exception handling from sjlj to standard dwarf. It's needed because clang for aarch64 doesn't support sjlj. It turns out that libunwind had a bare-metal configuration that made this easy to do. This change gets the new experimental cosmocc -mclang flag in a state of working so well that it can now be used to build all of llamafile and it goes 3x faster in terms of build latency, without trading away any perf. The int_fast16_t and int_fast32_t types are now always defined as 32-bit in the interest of having more abi consistency between cosmocc -mgcc and -mclang mode.
100 lines
3.3 KiB
C
100 lines
3.3 KiB
C
/*===---- crc32intrin.h - SSE4.2 Accumulate CRC32 intrinsics ---------------===
|
|
*
|
|
* Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
* See https://llvm.org/LICENSE.txt for license information.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*
|
|
*===-----------------------------------------------------------------------===
|
|
*/
|
|
|
|
#ifndef __CRC32INTRIN_H
|
|
#define __CRC32INTRIN_H
|
|
|
|
#define __DEFAULT_FN_ATTRS \
|
|
__attribute__((__always_inline__, __nodebug__, __target__("crc32")))
|
|
|
|
/// Adds the unsigned integer operand to the CRC-32C checksum of the
|
|
/// unsigned char operand.
|
|
///
|
|
/// \headerfile <x86intrin.h>
|
|
///
|
|
/// This intrinsic corresponds to the <c> CRC32B </c> instruction.
|
|
///
|
|
/// \param __C
|
|
/// An unsigned integer operand to add to the CRC-32C checksum of operand
|
|
/// \a __D.
|
|
/// \param __D
|
|
/// An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
|
|
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
|
|
/// operand \a __D.
|
|
static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
_mm_crc32_u8(unsigned int __C, unsigned char __D)
|
|
{
|
|
return __builtin_ia32_crc32qi(__C, __D);
|
|
}
|
|
|
|
/// Adds the unsigned integer operand to the CRC-32C checksum of the
|
|
/// unsigned short operand.
|
|
///
|
|
/// \headerfile <x86intrin.h>
|
|
///
|
|
/// This intrinsic corresponds to the <c> CRC32W </c> instruction.
|
|
///
|
|
/// \param __C
|
|
/// An unsigned integer operand to add to the CRC-32C checksum of operand
|
|
/// \a __D.
|
|
/// \param __D
|
|
/// An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
|
|
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
|
|
/// operand \a __D.
|
|
static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
_mm_crc32_u16(unsigned int __C, unsigned short __D)
|
|
{
|
|
return __builtin_ia32_crc32hi(__C, __D);
|
|
}
|
|
|
|
/// Adds the first unsigned integer operand to the CRC-32C checksum of
|
|
/// the second unsigned integer operand.
|
|
///
|
|
/// \headerfile <x86intrin.h>
|
|
///
|
|
/// This intrinsic corresponds to the <c> CRC32L </c> instruction.
|
|
///
|
|
/// \param __C
|
|
/// An unsigned integer operand to add to the CRC-32C checksum of operand
|
|
/// \a __D.
|
|
/// \param __D
|
|
/// An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
|
|
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
|
|
/// operand \a __D.
|
|
static __inline__ unsigned int __DEFAULT_FN_ATTRS
|
|
_mm_crc32_u32(unsigned int __C, unsigned int __D)
|
|
{
|
|
return __builtin_ia32_crc32si(__C, __D);
|
|
}
|
|
|
|
#ifdef __x86_64__
|
|
/// Adds the unsigned integer operand to the CRC-32C checksum of the
|
|
/// unsigned 64-bit integer operand.
|
|
///
|
|
/// \headerfile <x86intrin.h>
|
|
///
|
|
/// This intrinsic corresponds to the <c> CRC32Q </c> instruction.
|
|
///
|
|
/// \param __C
|
|
/// An unsigned integer operand to add to the CRC-32C checksum of operand
|
|
/// \a __D.
|
|
/// \param __D
|
|
/// An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
|
|
/// \returns The result of adding operand \a __C to the CRC-32C checksum of
|
|
/// operand \a __D.
|
|
static __inline__ unsigned long long __DEFAULT_FN_ATTRS
|
|
_mm_crc32_u64(unsigned long long __C, unsigned long long __D)
|
|
{
|
|
return __builtin_ia32_crc32di(__C, __D);
|
|
}
|
|
#endif /* __x86_64__ */
|
|
|
|
#undef __DEFAULT_FN_ATTRS
|
|
|
|
#endif /* __CRC32INTRIN_H */
|