Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tpruvot
GitHub Repository: tpruvot/cpuminer-multi
Path: blob/linux/crypto/int-util.h
1201 views
1
// Copyright (c) 2012-2013 The Cryptonote developers
2
// Distributed under the MIT/X11 software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#pragma once
6
#ifndef INT_UTILS_H_
7
#define INT_UTILS_H_
8
9
#include <assert.h>
10
#include <stdbool.h>
11
#include <stdint.h>
12
#include <string.h>
13
#ifndef _MSC_VER
14
#include <sys/param.h>
15
#else
16
#define inline __inline
17
#endif
18
19
#ifndef LITTLE_ENDIAN
20
#define LITTLE_ENDIAN 0x1234
21
#define BIG_ENDIAN 0x4321
22
#endif
23
24
#if !defined(BYTE_ORDER) && (defined(__LITTLE_ENDIAN__) || defined(__arm__) || defined(WIN32))
25
#define BYTE_ORDER LITTLE_ENDIAN
26
#endif
27
28
#if defined(WIN32)
29
#include <stdlib.h>
30
31
static inline uint32_t rol32(uint32_t x, int r) {
32
return _rotl(x, r);
33
}
34
35
static inline uint64_t rol64(uint64_t x, int r) {
36
return _rotl64(x, r);
37
}
38
39
#else
40
41
static inline uint32_t rol32(uint32_t x, int r) {
42
return (x << (r & 31)) | (x >> (-r & 31));
43
}
44
45
static inline uint64_t rol64(uint64_t x, int r) {
46
return (x << (r & 63)) | (x >> (-r & 63));
47
}
48
49
#endif
50
51
static inline uint64_t hi_dword(uint64_t val) {
52
return val >> 32;
53
}
54
55
static inline uint64_t lo_dword(uint64_t val) {
56
return val & 0xFFFFFFFF;
57
}
58
59
static inline uint64_t div_with_reminder(uint64_t dividend, uint32_t divisor, uint32_t* remainder) {
60
dividend |= ((uint64_t)*remainder) << 32;
61
*remainder = dividend % divisor;
62
return dividend / divisor;
63
}
64
65
// Long division with 2^32 base
66
static inline uint32_t div128_32(uint64_t dividend_hi, uint64_t dividend_lo, uint32_t divisor, uint64_t* quotient_hi, uint64_t* quotient_lo) {
67
uint64_t dividend_dwords[4];
68
uint32_t remainder = 0;
69
70
dividend_dwords[3] = hi_dword(dividend_hi);
71
dividend_dwords[2] = lo_dword(dividend_hi);
72
dividend_dwords[1] = hi_dword(dividend_lo);
73
dividend_dwords[0] = lo_dword(dividend_lo);
74
75
*quotient_hi = div_with_reminder(dividend_dwords[3], divisor, &remainder) << 32;
76
*quotient_hi |= div_with_reminder(dividend_dwords[2], divisor, &remainder);
77
*quotient_lo = div_with_reminder(dividend_dwords[1], divisor, &remainder) << 32;
78
*quotient_lo |= div_with_reminder(dividend_dwords[0], divisor, &remainder);
79
80
return remainder;
81
}
82
83
#define IDENT32(x) ((uint32_t) (x))
84
#define IDENT64(x) ((uint64_t) (x))
85
86
#define SWAP32(x) ((((uint32_t) (x) & 0x000000ff) << 24) | \
87
(((uint32_t) (x) & 0x0000ff00) << 8) | \
88
(((uint32_t) (x) & 0x00ff0000) >> 8) | \
89
(((uint32_t) (x) & 0xff000000) >> 24))
90
#define SWAP64(x) ((((uint64_t) (x) & 0x00000000000000ff) << 56) | \
91
(((uint64_t) (x) & 0x000000000000ff00) << 40) | \
92
(((uint64_t) (x) & 0x0000000000ff0000) << 24) | \
93
(((uint64_t) (x) & 0x00000000ff000000) << 8) | \
94
(((uint64_t) (x) & 0x000000ff00000000) >> 8) | \
95
(((uint64_t) (x) & 0x0000ff0000000000) >> 24) | \
96
(((uint64_t) (x) & 0x00ff000000000000) >> 40) | \
97
(((uint64_t) (x) & 0xff00000000000000) >> 56))
98
99
static inline uint32_t ident32(uint32_t x) { return x; }
100
static inline uint64_t ident64(uint64_t x) { return x; }
101
102
static inline uint32_t swap32(uint32_t x) {
103
x = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8);
104
return (x << 16) | (x >> 16);
105
}
106
static inline uint64_t swap64(uint64_t x) {
107
x = ((x & 0x00ff00ff00ff00ff) << 8) | ((x & 0xff00ff00ff00ff00) >> 8);
108
x = ((x & 0x0000ffff0000ffff) << 16) | ((x & 0xffff0000ffff0000) >> 16);
109
return (x << 32) | (x >> 32);
110
}
111
112
#if defined(__GNUC__)
113
#define UNUSED __attribute__((unused))
114
#else
115
#define UNUSED
116
#endif
117
static inline void mem_inplace_ident(void *mem UNUSED, size_t n UNUSED) { }
118
#undef UNUSED
119
120
static inline void mem_inplace_swap32(void *mem, size_t n) {
121
size_t i;
122
for (i = 0; i < n; i++) {
123
((uint32_t *) mem)[i] = swap32(((const uint32_t *) mem)[i]);
124
}
125
}
126
static inline void mem_inplace_swap64(void *mem, size_t n) {
127
size_t i;
128
for (i = 0; i < n; i++) {
129
((uint64_t *) mem)[i] = swap64(((const uint64_t *) mem)[i]);
130
}
131
}
132
133
static inline void memcpy_ident32(void *dst, const void *src, size_t n) {
134
memcpy(dst, src, 4 * n);
135
}
136
static inline void memcpy_ident64(void *dst, const void *src, size_t n) {
137
memcpy(dst, src, 8 * n);
138
}
139
140
static inline void memcpy_swap32(void *dst, const void *src, size_t n) {
141
size_t i;
142
for (i = 0; i < n; i++) {
143
((uint32_t *) dst)[i] = swap32(((const uint32_t *) src)[i]);
144
}
145
}
146
static inline void memcpy_swap64(void *dst, const void *src, size_t n) {
147
size_t i;
148
for (i = 0; i < n; i++) {
149
((uint64_t *) dst)[i] = swap64(((const uint64_t *) src)[i]);
150
}
151
}
152
153
#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN)
154
static_assert(false, "BYTE_ORDER is undefined. Perhaps, GNU extensions are not enabled");
155
#endif
156
157
#if BYTE_ORDER == LITTLE_ENDIAN
158
#define SWAP32LE IDENT32
159
#define SWAP32BE SWAP32
160
#define swap32le ident32
161
#define swap32be swap32
162
#define mem_inplace_swap32le mem_inplace_ident
163
#define mem_inplace_swap32be mem_inplace_swap32
164
#define memcpy_swap32le memcpy_ident32
165
#define memcpy_swap32be memcpy_swap32
166
#define SWAP64LE IDENT64
167
#define SWAP64BE SWAP64
168
#define swap64le ident64
169
#define swap64be swap64
170
#define mem_inplace_swap64le mem_inplace_ident
171
#define mem_inplace_swap64be mem_inplace_swap64
172
#define memcpy_swap64le memcpy_ident64
173
#define memcpy_swap64be memcpy_swap64
174
#endif
175
176
#if BYTE_ORDER == BIG_ENDIAN
177
#define SWAP32BE IDENT32
178
#define SWAP32LE SWAP32
179
#define swap32be ident32
180
#define swap32le swap32
181
#define mem_inplace_swap32be mem_inplace_ident
182
#define mem_inplace_swap32le mem_inplace_swap32
183
#define memcpy_swap32be memcpy_ident32
184
#define memcpy_swap32le memcpy_swap32
185
#define SWAP64BE IDENT64
186
#define SWAP64LE SWAP64
187
#define swap64be ident64
188
#define swap64le swap64
189
#define mem_inplace_swap64be mem_inplace_ident
190
#define mem_inplace_swap64le mem_inplace_swap64
191
#define memcpy_swap64be memcpy_ident64
192
#define memcpy_swap64le memcpy_swap64
193
#endif
194
195
#endif /* INT_UTILS_H_ */
196
197