43 #if defined(__ANDROID__) 47 #if defined(__sun) && defined(__SVR4) 55 static_assert(
sizeof(
uint32_t) ==
sizeof(
unsigned int),
"this code assumes 32-bit integers");
66 return (x << (r & 31)) | (x >> (-r & 31));
70 return (x << (r & 63)) | (x >> (-r & 63));
80 return val & 0xFFFFFFFF;
98 uint64_t adbc_carry = adbc < ad ? 1 : 0;
101 uint64_t product_lo = bd + (adbc << 32);
102 uint64_t product_lo_carry = product_lo < bd ? 1 : 0;
103 *product_hi = ac + (adbc >> 32) + (adbc_carry << 32) + product_lo_carry;
104 assert(ac <= *product_hi);
110 dividend |= ((
uint64_t)*remainder) << 32;
111 *remainder = dividend % divisor;
112 return dividend / divisor;
120 dividend_dwords[3] = hi_dword(dividend_hi);
121 dividend_dwords[2] = lo_dword(dividend_hi);
122 dividend_dwords[1] = hi_dword(dividend_lo);
123 dividend_dwords[0] = lo_dword(dividend_lo);
125 *quotient_hi = div_with_reminder(dividend_dwords[3], divisor, &remainder) << 32;
126 *quotient_hi |= div_with_reminder(dividend_dwords[2], divisor, &remainder);
127 *quotient_lo = div_with_reminder(dividend_dwords[1], divisor, &remainder) << 32;
128 *quotient_lo |= div_with_reminder(dividend_dwords[0], divisor, &remainder);
133 #define IDENT32(x) ((uint32_t) (x)) 134 #define IDENT64(x) ((uint64_t) (x)) 136 #define SWAP32(x) ((((uint32_t) (x) & 0x000000ff) << 24) | \ 137 (((uint32_t) (x) & 0x0000ff00) << 8) | \ 138 (((uint32_t) (x) & 0x00ff0000) >> 8) | \ 139 (((uint32_t) (x) & 0xff000000) >> 24)) 140 #define SWAP64(x) ((((uint64_t) (x) & 0x00000000000000ff) << 56) | \ 141 (((uint64_t) (x) & 0x000000000000ff00) << 40) | \ 142 (((uint64_t) (x) & 0x0000000000ff0000) << 24) | \ 143 (((uint64_t) (x) & 0x00000000ff000000) << 8) | \ 144 (((uint64_t) (x) & 0x000000ff00000000) >> 8) | \ 145 (((uint64_t) (x) & 0x0000ff0000000000) >> 24) | \ 146 (((uint64_t) (x) & 0x00ff000000000000) >> 40) | \ 147 (((uint64_t) (x) & 0xff00000000000000) >> 56)) 153 # if defined(__ANDROID__) && defined(__swap32) && !defined(swap32) 154 # define swap32 __swap32 155 # elif !defined(swap32) 157 x = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8);
158 return (x << 16) | (x >> 16);
161 # if defined(__ANDROID__) && defined(__swap64) && !defined(swap64) 162 # define swap64 __swap64 163 # elif !defined(swap64) 165 x = ((x & 0x00ff00ff00ff00ff) << 8) | ((x & 0xff00ff00ff00ff00) >> 8);
166 x = ((x & 0x0000ffff0000ffff) << 16) | ((x & 0xffff0000ffff0000) >> 16);
167 return (x << 32) | (x >> 32);
172 #if defined(__GNUC__) 173 #define UNUSED __attribute__((unused)) 177 static inline void mem_inplace_ident(
void *mem
UNUSED,
size_t n
UNUSED) { }
180 static inline void mem_inplace_swap32(
void *mem,
size_t n) {
182 for (i = 0; i < n; i++) {
186 static inline void mem_inplace_swap64(
void *mem,
size_t n) {
188 for (i = 0; i < n; i++) {
193 static inline void memcpy_ident32(
void *dst,
const void *src,
size_t n) {
196 static inline void memcpy_ident64(
void *dst,
const void *src,
size_t n) {
200 static inline void memcpy_swap32(
void *dst,
const void *src,
size_t n) {
202 for (i = 0; i < n; i++) {
206 static inline void memcpy_swap64(
void *dst,
const void *src,
size_t n) {
208 for (i = 0; i < n; i++) {
214 # define LITTLE_ENDIAN 1234 215 # define BIG_ENDIAN 4321 216 # define BYTE_ORDER LITTLE_ENDIAN 219 #if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) 220 static_assert(
false,
"BYTE_ORDER is undefined. Perhaps, GNU extensions are not enabled");
223 #if BYTE_ORDER == LITTLE_ENDIAN 224 #define SWAP32LE IDENT32 225 #define SWAP32BE SWAP32 226 #define swap32le ident32 227 #define swap32be swap32 228 #define mem_inplace_swap32le mem_inplace_ident 229 #define mem_inplace_swap32be mem_inplace_swap32 230 #define memcpy_swap32le memcpy_ident32 231 #define memcpy_swap32be memcpy_swap32 232 #define SWAP64LE IDENT64 233 #define SWAP64BE SWAP64 234 #define swap64le ident64 235 #define swap64be swap64 236 #define mem_inplace_swap64le mem_inplace_ident 237 #define mem_inplace_swap64be mem_inplace_swap64 238 #define memcpy_swap64le memcpy_ident64 239 #define memcpy_swap64be memcpy_swap64 242 #if BYTE_ORDER == BIG_ENDIAN 243 #define SWAP32BE IDENT32 244 #define SWAP32LE SWAP32 245 #define swap32be ident32 246 #define swap32le swap32 247 #define mem_inplace_swap32be mem_inplace_ident 248 #define mem_inplace_swap32le mem_inplace_swap32 249 #define memcpy_swap32be memcpy_ident32 250 #define memcpy_swap32le memcpy_swap32 251 #define SWAP64BE IDENT64 252 #define SWAP64LE SWAP64 253 #define swap64be ident64 254 #define swap64le swap64 255 #define mem_inplace_swap64be mem_inplace_ident 256 #define mem_inplace_swap64le mem_inplace_swap64 257 #define memcpy_swap64be memcpy_ident64 258 #define memcpy_swap64le memcpy_swap64
unsigned __int64 uint64_t
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
void * memcpy(void *a, const void *b, size_t c)