24#ifdef COMPILER_RT_ARMHF_TARGET
25#define COMPILER_RT_ABI
27#define COMPILER_RT_ABI __attribute__((__pcs__("aapcs")))
30#define COMPILER_RT_ABI
33#define AEABI_RTABI __attribute__((__pcs__("aapcs")))
35#if defined(_MSC_VER) && !defined(__clang__)
36#define ALWAYS_INLINE __forceinline
37#define NOINLINE __declspec(noinline)
38#define NORETURN __declspec(noreturn)
41#define ALWAYS_INLINE __attribute__((always_inline))
42#define NOINLINE __attribute__((noinline))
43#define NORETURN __attribute__((noreturn))
44#define UNUSED __attribute__((unused))
49#define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name
51#if defined(__ELF__) || defined(__MINGW32__) || defined(__wasm__) || \
52 defined(_AIX) || defined(__CYGWIN__)
53#define COMPILER_RT_ALIAS(name, aliasname) \
54 COMPILER_RT_ABI __typeof(name) aliasname __attribute__((__alias__(#name)));
55#elif defined(__APPLE__)
56#if defined(VISIBILITY_HIDDEN)
57#define COMPILER_RT_ALIAS_VISIBILITY(name) \
58 __asm__(".private_extern " SYMBOL_NAME(name));
60#define COMPILER_RT_ALIAS_VISIBILITY(name)
62#define COMPILER_RT_ALIAS(name, aliasname) \
63 __asm__(".globl " SYMBOL_NAME(aliasname)); \
64 COMPILER_RT_ALIAS_VISIBILITY(aliasname) \
65 __asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \
66 COMPILER_RT_ABI __typeof(name) aliasname;
67#elif defined(_WIN32) || defined(__UEFI__)
68#define COMPILER_RT_ALIAS(name, aliasname)
70#error Unsupported target
73#if (defined(__FreeBSD__) || defined(__NetBSD__)) && \
74 (defined(_KERNEL) || defined(_STANDALONE))
83#if defined(__has_include) && __has_include(<sys/limits.h>)
84#include <sys/limits.h>
86#include <machine/limits.h>
88#include <sys/stdint.h>
104COMPILER_RT_ABI
int __paritysi2(si_int a);
105COMPILER_RT_ABI
int __paritydi2(di_int a);
107COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b);
108COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b);
109COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d);
111COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int *rem);
112COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int *rem);
114COMPILER_RT_ABI
int __clzti2(ti_int a);
115COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int *rem);
119#if defined(_MSC_VER) && !defined(__clang__)
122static int __inline __builtin_ctz(uint32_t value) {
123 unsigned long trailing_zero = 0;
124 if (_BitScanForward(&trailing_zero, value))
125 return trailing_zero;
129static int __inline __builtin_clz(uint32_t value) {
130 unsigned long leading_zero = 0;
131 if (_BitScanReverse(&leading_zero, value))
132 return 31 - leading_zero;
136#if defined(_M_ARM) || defined(_M_X64)
137static int __inline __builtin_clzll(uint64_t value) {
138 unsigned long leading_zero = 0;
139 if (_BitScanReverse64(&leading_zero, value))
140 return 63 - leading_zero;
144static int __inline __builtin_clzll(uint64_t value) {
147 uint32_t msh = (uint32_t)(value >> 32);
148 uint32_t lsh = (uint32_t)(value & 0xFFFFFFFF);
150 return __builtin_clz(msh);
151 return 32 + __builtin_clz(lsh);
155#define __builtin_clzl __builtin_clzll
157static bool __inline __builtin_sadd_overflow(
int x,
int y,
int *result) {
158 if ((x < 0) != (y < 0)) {
162 int tmp = (
unsigned int)x + (
unsigned int)y;
163 if ((tmp < 0) != (x < 0))