xref: /aosp_15_r20/external/lzma/C/CpuArch.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker /* CpuArch.h -- CPU specific code
2*f6dc9357SAndroid Build Coastguard Worker Igor Pavlov : Public domain */
3*f6dc9357SAndroid Build Coastguard Worker 
4*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_CPU_ARCH_H
5*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_CPU_ARCH_H
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "7zTypes.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker /*
12*f6dc9357SAndroid Build Coastguard Worker MY_CPU_LE means that CPU is LITTLE ENDIAN.
13*f6dc9357SAndroid Build Coastguard Worker MY_CPU_BE means that CPU is BIG ENDIAN.
14*f6dc9357SAndroid Build Coastguard Worker If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform.
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses.
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker MY_CPU_64BIT means that processor can work with 64-bit registers.
19*f6dc9357SAndroid Build Coastguard Worker   MY_CPU_64BIT can be used to select fast code branch
20*f6dc9357SAndroid Build Coastguard Worker   MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8)
21*f6dc9357SAndroid Build Coastguard Worker */
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker #if !defined(_M_ARM64EC)
24*f6dc9357SAndroid Build Coastguard Worker #if  defined(_M_X64) \
25*f6dc9357SAndroid Build Coastguard Worker   || defined(_M_AMD64) \
26*f6dc9357SAndroid Build Coastguard Worker   || defined(__x86_64__) \
27*f6dc9357SAndroid Build Coastguard Worker   || defined(__AMD64__) \
28*f6dc9357SAndroid Build Coastguard Worker   || defined(__amd64__)
29*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_AMD64
30*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ILP32__
31*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "x32"
32*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 4
33*f6dc9357SAndroid Build Coastguard Worker   #else
34*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "x64"
35*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 8
36*f6dc9357SAndroid Build Coastguard Worker   #endif
37*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
38*f6dc9357SAndroid Build Coastguard Worker #endif
39*f6dc9357SAndroid Build Coastguard Worker #endif
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker #if  defined(_M_IX86) \
43*f6dc9357SAndroid Build Coastguard Worker   || defined(__i386__)
44*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_X86
45*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "x86"
46*f6dc9357SAndroid Build Coastguard Worker   /* #define MY_CPU_32BIT */
47*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_SIZEOF_POINTER 4
48*f6dc9357SAndroid Build Coastguard Worker #endif
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker #if  defined(_M_ARM64) \
52*f6dc9357SAndroid Build Coastguard Worker   || defined(_M_ARM64EC) \
53*f6dc9357SAndroid Build Coastguard Worker   || defined(__AARCH64EL__) \
54*f6dc9357SAndroid Build Coastguard Worker   || defined(__AARCH64EB__) \
55*f6dc9357SAndroid Build Coastguard Worker   || defined(__aarch64__)
56*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_ARM64
57*f6dc9357SAndroid Build Coastguard Worker #if   defined(__ILP32__) \
58*f6dc9357SAndroid Build Coastguard Worker    || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4)
59*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "arm64-32"
60*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 4
61*f6dc9357SAndroid Build Coastguard Worker #elif defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 16)
62*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "arm64-128"
63*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 16
64*f6dc9357SAndroid Build Coastguard Worker #else
65*f6dc9357SAndroid Build Coastguard Worker #if defined(_M_ARM64EC)
66*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "arm64ec"
67*f6dc9357SAndroid Build Coastguard Worker #else
68*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "arm64"
69*f6dc9357SAndroid Build Coastguard Worker #endif
70*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 8
71*f6dc9357SAndroid Build Coastguard Worker #endif
72*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
73*f6dc9357SAndroid Build Coastguard Worker #endif
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker #if  defined(_M_ARM) \
77*f6dc9357SAndroid Build Coastguard Worker   || defined(_M_ARM_NT) \
78*f6dc9357SAndroid Build Coastguard Worker   || defined(_M_ARMT) \
79*f6dc9357SAndroid Build Coastguard Worker   || defined(__arm__) \
80*f6dc9357SAndroid Build Coastguard Worker   || defined(__thumb__) \
81*f6dc9357SAndroid Build Coastguard Worker   || defined(__ARMEL__) \
82*f6dc9357SAndroid Build Coastguard Worker   || defined(__ARMEB__) \
83*f6dc9357SAndroid Build Coastguard Worker   || defined(__THUMBEL__) \
84*f6dc9357SAndroid Build Coastguard Worker   || defined(__THUMBEB__)
85*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_ARM
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker   #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT)
88*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_ARMT
89*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "armt"
90*f6dc9357SAndroid Build Coastguard Worker   #else
91*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_ARM32
92*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "arm"
93*f6dc9357SAndroid Build Coastguard Worker   #endif
94*f6dc9357SAndroid Build Coastguard Worker   /* #define MY_CPU_32BIT */
95*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_SIZEOF_POINTER 4
96*f6dc9357SAndroid Build Coastguard Worker #endif
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker #if  defined(_M_IA64) \
100*f6dc9357SAndroid Build Coastguard Worker   || defined(__ia64__)
101*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_IA64
102*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "ia64"
103*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
104*f6dc9357SAndroid Build Coastguard Worker #endif
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker #if  defined(__mips64) \
108*f6dc9357SAndroid Build Coastguard Worker   || defined(__mips64__) \
109*f6dc9357SAndroid Build Coastguard Worker   || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3))
110*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "mips64"
111*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
112*f6dc9357SAndroid Build Coastguard Worker #elif defined(__mips__)
113*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "mips"
114*f6dc9357SAndroid Build Coastguard Worker   /* #define MY_CPU_32BIT */
115*f6dc9357SAndroid Build Coastguard Worker #endif
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker 
118*f6dc9357SAndroid Build Coastguard Worker #if  defined(__ppc64__) \
119*f6dc9357SAndroid Build Coastguard Worker   || defined(__powerpc64__) \
120*f6dc9357SAndroid Build Coastguard Worker   || defined(__ppc__) \
121*f6dc9357SAndroid Build Coastguard Worker   || defined(__powerpc__) \
122*f6dc9357SAndroid Build Coastguard Worker   || defined(__PPC__) \
123*f6dc9357SAndroid Build Coastguard Worker   || defined(_POWER)
124*f6dc9357SAndroid Build Coastguard Worker 
125*f6dc9357SAndroid Build Coastguard Worker #define MY_CPU_PPC_OR_PPC64
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker #if  defined(__ppc64__) \
128*f6dc9357SAndroid Build Coastguard Worker   || defined(__powerpc64__) \
129*f6dc9357SAndroid Build Coastguard Worker   || defined(_LP64) \
130*f6dc9357SAndroid Build Coastguard Worker   || defined(__64BIT__)
131*f6dc9357SAndroid Build Coastguard Worker   #ifdef __ILP32__
132*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "ppc64-32"
133*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 4
134*f6dc9357SAndroid Build Coastguard Worker   #else
135*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "ppc64"
136*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 8
137*f6dc9357SAndroid Build Coastguard Worker   #endif
138*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
139*f6dc9357SAndroid Build Coastguard Worker #else
140*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "ppc"
141*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_SIZEOF_POINTER 4
142*f6dc9357SAndroid Build Coastguard Worker   /* #define MY_CPU_32BIT */
143*f6dc9357SAndroid Build Coastguard Worker #endif
144*f6dc9357SAndroid Build Coastguard Worker #endif
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker #if   defined(__sparc__) \
148*f6dc9357SAndroid Build Coastguard Worker    || defined(__sparc)
149*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_SPARC
150*f6dc9357SAndroid Build Coastguard Worker   #if  defined(__LP64__) \
151*f6dc9357SAndroid Build Coastguard Worker     || defined(_LP64) \
152*f6dc9357SAndroid Build Coastguard Worker     || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 8)
153*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "sparcv9"
154*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 8
155*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_64BIT
156*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__sparc_v9__) \
157*f6dc9357SAndroid Build Coastguard Worker      || defined(__sparcv9)
158*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_64BIT
159*f6dc9357SAndroid Build Coastguard Worker     #if defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4)
160*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_NAME "sparcv9-32"
161*f6dc9357SAndroid Build Coastguard Worker     #else
162*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_NAME "sparcv9m"
163*f6dc9357SAndroid Build Coastguard Worker     #endif
164*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__sparc_v8__) \
165*f6dc9357SAndroid Build Coastguard Worker      || defined(__sparcv8)
166*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "sparcv8"
167*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 4
168*f6dc9357SAndroid Build Coastguard Worker   #else
169*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "sparc"
170*f6dc9357SAndroid Build Coastguard Worker   #endif
171*f6dc9357SAndroid Build Coastguard Worker #endif
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker #if  defined(__riscv) \
175*f6dc9357SAndroid Build Coastguard Worker   || defined(__riscv__)
176*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_RISCV
177*f6dc9357SAndroid Build Coastguard Worker   #if __riscv_xlen == 32
178*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "riscv32"
179*f6dc9357SAndroid Build Coastguard Worker   #elif __riscv_xlen == 64
180*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "riscv64"
181*f6dc9357SAndroid Build Coastguard Worker   #else
182*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "riscv"
183*f6dc9357SAndroid Build Coastguard Worker   #endif
184*f6dc9357SAndroid Build Coastguard Worker #endif
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker 
187*f6dc9357SAndroid Build Coastguard Worker #if defined(__loongarch__)
188*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_LOONGARCH
189*f6dc9357SAndroid Build Coastguard Worker   #if defined(__loongarch64) || defined(__loongarch_grlen) && (__loongarch_grlen == 64)
190*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
191*f6dc9357SAndroid Build Coastguard Worker   #endif
192*f6dc9357SAndroid Build Coastguard Worker   #if defined(__loongarch64)
193*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "loongarch64"
194*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_LOONGARCH64
195*f6dc9357SAndroid Build Coastguard Worker   #else
196*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_NAME "loongarch"
197*f6dc9357SAndroid Build Coastguard Worker   #endif
198*f6dc9357SAndroid Build Coastguard Worker #endif
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker // #undef MY_CPU_NAME
202*f6dc9357SAndroid Build Coastguard Worker // #undef MY_CPU_SIZEOF_POINTER
203*f6dc9357SAndroid Build Coastguard Worker // #define __e2k__
204*f6dc9357SAndroid Build Coastguard Worker // #define __SIZEOF_POINTER__ 4
205*f6dc9357SAndroid Build Coastguard Worker #if  defined(__e2k__)
206*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_E2K
207*f6dc9357SAndroid Build Coastguard Worker   #if defined(__ILP32__) || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 4)
208*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "e2k-32"
209*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER 4
210*f6dc9357SAndroid Build Coastguard Worker   #else
211*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "e2k"
212*f6dc9357SAndroid Build Coastguard Worker     #if defined(__LP64__) || defined(__SIZEOF_POINTER__) && (__SIZEOF_POINTER__ == 8)
213*f6dc9357SAndroid Build Coastguard Worker       #define MY_CPU_SIZEOF_POINTER 8
214*f6dc9357SAndroid Build Coastguard Worker     #endif
215*f6dc9357SAndroid Build Coastguard Worker   #endif
216*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_64BIT
217*f6dc9357SAndroid Build Coastguard Worker #endif
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_X86) || defined(MY_CPU_AMD64)
221*f6dc9357SAndroid Build Coastguard Worker #define MY_CPU_X86_OR_AMD64
222*f6dc9357SAndroid Build Coastguard Worker #endif
223*f6dc9357SAndroid Build Coastguard Worker 
224*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64)
225*f6dc9357SAndroid Build Coastguard Worker #define MY_CPU_ARM_OR_ARM64
226*f6dc9357SAndroid Build Coastguard Worker #endif
227*f6dc9357SAndroid Build Coastguard Worker 
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
230*f6dc9357SAndroid Build Coastguard Worker 
231*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_ARM
232*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_ARM_LE
233*f6dc9357SAndroid Build Coastguard Worker   #endif
234*f6dc9357SAndroid Build Coastguard Worker 
235*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_ARM64
236*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_ARM64_LE
237*f6dc9357SAndroid Build Coastguard Worker   #endif
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker   #ifdef _M_IA64
240*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_IA64_LE
241*f6dc9357SAndroid Build Coastguard Worker   #endif
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker #endif
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_X86_OR_AMD64) \
247*f6dc9357SAndroid Build Coastguard Worker     || defined(MY_CPU_ARM_LE) \
248*f6dc9357SAndroid Build Coastguard Worker     || defined(MY_CPU_ARM64_LE) \
249*f6dc9357SAndroid Build Coastguard Worker     || defined(MY_CPU_IA64_LE) \
250*f6dc9357SAndroid Build Coastguard Worker     || defined(_LITTLE_ENDIAN) \
251*f6dc9357SAndroid Build Coastguard Worker     || defined(__LITTLE_ENDIAN__) \
252*f6dc9357SAndroid Build Coastguard Worker     || defined(__ARMEL__) \
253*f6dc9357SAndroid Build Coastguard Worker     || defined(__THUMBEL__) \
254*f6dc9357SAndroid Build Coastguard Worker     || defined(__AARCH64EL__) \
255*f6dc9357SAndroid Build Coastguard Worker     || defined(__MIPSEL__) \
256*f6dc9357SAndroid Build Coastguard Worker     || defined(__MIPSEL) \
257*f6dc9357SAndroid Build Coastguard Worker     || defined(_MIPSEL) \
258*f6dc9357SAndroid Build Coastguard Worker     || defined(__BFIN__) \
259*f6dc9357SAndroid Build Coastguard Worker     || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
260*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_LE
261*f6dc9357SAndroid Build Coastguard Worker #endif
262*f6dc9357SAndroid Build Coastguard Worker 
263*f6dc9357SAndroid Build Coastguard Worker #if defined(__BIG_ENDIAN__) \
264*f6dc9357SAndroid Build Coastguard Worker     || defined(__ARMEB__) \
265*f6dc9357SAndroid Build Coastguard Worker     || defined(__THUMBEB__) \
266*f6dc9357SAndroid Build Coastguard Worker     || defined(__AARCH64EB__) \
267*f6dc9357SAndroid Build Coastguard Worker     || defined(__MIPSEB__) \
268*f6dc9357SAndroid Build Coastguard Worker     || defined(__MIPSEB) \
269*f6dc9357SAndroid Build Coastguard Worker     || defined(_MIPSEB) \
270*f6dc9357SAndroid Build Coastguard Worker     || defined(__m68k__) \
271*f6dc9357SAndroid Build Coastguard Worker     || defined(__s390__) \
272*f6dc9357SAndroid Build Coastguard Worker     || defined(__s390x__) \
273*f6dc9357SAndroid Build Coastguard Worker     || defined(__zarch__) \
274*f6dc9357SAndroid Build Coastguard Worker     || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
275*f6dc9357SAndroid Build Coastguard Worker   #define MY_CPU_BE
276*f6dc9357SAndroid Build Coastguard Worker #endif
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_LE) && defined(MY_CPU_BE)
280*f6dc9357SAndroid Build Coastguard Worker   #error Stop_Compiling_Bad_Endian
281*f6dc9357SAndroid Build Coastguard Worker #endif
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker #if !defined(MY_CPU_LE) && !defined(MY_CPU_BE)
284*f6dc9357SAndroid Build Coastguard Worker   #error Stop_Compiling_CPU_ENDIAN_must_be_detected_at_compile_time
285*f6dc9357SAndroid Build Coastguard Worker #endif
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT)
288*f6dc9357SAndroid Build Coastguard Worker   #error Stop_Compiling_Bad_32_64_BIT
289*f6dc9357SAndroid Build Coastguard Worker #endif
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker #ifdef __SIZEOF_POINTER__
292*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_SIZEOF_POINTER
293*f6dc9357SAndroid Build Coastguard Worker     #if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__
294*f6dc9357SAndroid Build Coastguard Worker       #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE
295*f6dc9357SAndroid Build Coastguard Worker     #endif
296*f6dc9357SAndroid Build Coastguard Worker   #else
297*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_SIZEOF_POINTER  __SIZEOF_POINTER__
298*f6dc9357SAndroid Build Coastguard Worker   #endif
299*f6dc9357SAndroid Build Coastguard Worker #endif
300*f6dc9357SAndroid Build Coastguard Worker 
301*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4)
302*f6dc9357SAndroid Build Coastguard Worker #if defined (_LP64)
303*f6dc9357SAndroid Build Coastguard Worker       #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE
304*f6dc9357SAndroid Build Coastguard Worker #endif
305*f6dc9357SAndroid Build Coastguard Worker #endif
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker #ifdef _MSC_VER
308*f6dc9357SAndroid Build Coastguard Worker   #if _MSC_VER >= 1300
309*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pack_push_1   __pragma(pack(push, 1))
310*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pop           __pragma(pack(pop))
311*f6dc9357SAndroid Build Coastguard Worker   #else
312*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pack_push_1
313*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pop
314*f6dc9357SAndroid Build Coastguard Worker   #endif
315*f6dc9357SAndroid Build Coastguard Worker #else
316*f6dc9357SAndroid Build Coastguard Worker   #ifdef __xlC__
317*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pack_push_1   _Pragma("pack(1)")
318*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pop           _Pragma("pack()")
319*f6dc9357SAndroid Build Coastguard Worker   #else
320*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pack_push_1   _Pragma("pack(push, 1)")
321*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_pragma_pop           _Pragma("pack(pop)")
322*f6dc9357SAndroid Build Coastguard Worker   #endif
323*f6dc9357SAndroid Build Coastguard Worker #endif
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker 
326*f6dc9357SAndroid Build Coastguard Worker #ifndef MY_CPU_NAME
327*f6dc9357SAndroid Build Coastguard Worker   // #define MY_CPU_IS_UNKNOWN
328*f6dc9357SAndroid Build Coastguard Worker   #ifdef MY_CPU_LE
329*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "LE"
330*f6dc9357SAndroid Build Coastguard Worker   #elif defined(MY_CPU_BE)
331*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME "BE"
332*f6dc9357SAndroid Build Coastguard Worker   #else
333*f6dc9357SAndroid Build Coastguard Worker     /*
334*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_NAME ""
335*f6dc9357SAndroid Build Coastguard Worker     */
336*f6dc9357SAndroid Build Coastguard Worker   #endif
337*f6dc9357SAndroid Build Coastguard Worker #endif
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker 
340*f6dc9357SAndroid Build Coastguard Worker 
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker #ifdef __has_builtin
344*f6dc9357SAndroid Build Coastguard Worker   #define Z7_has_builtin(x)  __has_builtin(x)
345*f6dc9357SAndroid Build Coastguard Worker #else
346*f6dc9357SAndroid Build Coastguard Worker   #define Z7_has_builtin(x)  0
347*f6dc9357SAndroid Build Coastguard Worker #endif
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker 
350*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP32_CONST(v) \
351*f6dc9357SAndroid Build Coastguard Worker        ( (((UInt32)(v) << 24)                   ) \
352*f6dc9357SAndroid Build Coastguard Worker        | (((UInt32)(v) <<  8) & (UInt32)0xff0000) \
353*f6dc9357SAndroid Build Coastguard Worker        | (((UInt32)(v) >>  8) & (UInt32)0xff00  ) \
354*f6dc9357SAndroid Build Coastguard Worker        | (((UInt32)(v) >> 24)                   ))
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker 
357*f6dc9357SAndroid Build Coastguard Worker #if defined(_MSC_VER) && (_MSC_VER >= 1300)
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker #include <stdlib.h>
360*f6dc9357SAndroid Build Coastguard Worker 
361*f6dc9357SAndroid Build Coastguard Worker /* Note: these macros will use bswap instruction (486), that is unsupported in 386 cpu */
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker #pragma intrinsic(_byteswap_ushort)
364*f6dc9357SAndroid Build Coastguard Worker #pragma intrinsic(_byteswap_ulong)
365*f6dc9357SAndroid Build Coastguard Worker #pragma intrinsic(_byteswap_uint64)
366*f6dc9357SAndroid Build Coastguard Worker 
367*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP16(v)  _byteswap_ushort(v)
368*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP32(v)  _byteswap_ulong (v)
369*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP64(v)  _byteswap_uint64(v)
370*f6dc9357SAndroid Build Coastguard Worker #define Z7_CPU_FAST_BSWAP_SUPPORTED
371*f6dc9357SAndroid Build Coastguard Worker 
372*f6dc9357SAndroid Build Coastguard Worker /* GCC can generate slow code that calls function for __builtin_bswap32() for:
373*f6dc9357SAndroid Build Coastguard Worker      - GCC for RISCV, if Zbb/XTHeadBb extension is not used.
374*f6dc9357SAndroid Build Coastguard Worker      - GCC for SPARC.
375*f6dc9357SAndroid Build Coastguard Worker    The code from CLANG for SPARC also is not fastest.
376*f6dc9357SAndroid Build Coastguard Worker    So we don't define Z7_CPU_FAST_BSWAP_SUPPORTED in some cases.
377*f6dc9357SAndroid Build Coastguard Worker */
378*f6dc9357SAndroid Build Coastguard Worker #elif (!defined(MY_CPU_RISCV) || defined (__riscv_zbb) || defined(__riscv_xtheadbb)) \
379*f6dc9357SAndroid Build Coastguard Worker     && !defined(MY_CPU_SPARC) \
380*f6dc9357SAndroid Build Coastguard Worker     && ( \
381*f6dc9357SAndroid Build Coastguard Worker        (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \
382*f6dc9357SAndroid Build Coastguard Worker     || (defined(__clang__) && Z7_has_builtin(__builtin_bswap16)) \
383*f6dc9357SAndroid Build Coastguard Worker     )
384*f6dc9357SAndroid Build Coastguard Worker 
385*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP16(v)  __builtin_bswap16(v)
386*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP32(v)  __builtin_bswap32(v)
387*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP64(v)  __builtin_bswap64(v)
388*f6dc9357SAndroid Build Coastguard Worker #define Z7_CPU_FAST_BSWAP_SUPPORTED
389*f6dc9357SAndroid Build Coastguard Worker 
390*f6dc9357SAndroid Build Coastguard Worker #else
391*f6dc9357SAndroid Build Coastguard Worker 
392*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP16(v) ((UInt16) \
393*f6dc9357SAndroid Build Coastguard Worker        ( ((UInt32)(v) << 8) \
394*f6dc9357SAndroid Build Coastguard Worker        | ((UInt32)(v) >> 8) \
395*f6dc9357SAndroid Build Coastguard Worker        ))
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP32(v) Z7_BSWAP32_CONST(v)
398*f6dc9357SAndroid Build Coastguard Worker 
399*f6dc9357SAndroid Build Coastguard Worker #define Z7_BSWAP64(v) \
400*f6dc9357SAndroid Build Coastguard Worker        ( ( ( (UInt64)(v)                           ) << 8 * 7 ) \
401*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 1) ) << 8 * 5 ) \
402*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 2) ) << 8 * 3 ) \
403*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) & ((UInt32)0xff << 8 * 3) ) << 8 * 1 ) \
404*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) >> 8 * 1 ) & ((UInt32)0xff << 8 * 3) ) \
405*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) >> 8 * 3 ) & ((UInt32)0xff << 8 * 2) ) \
406*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) >> 8 * 5 ) & ((UInt32)0xff << 8 * 1) ) \
407*f6dc9357SAndroid Build Coastguard Worker        | ( ( (UInt64)(v) >> 8 * 7 )                           ) \
408*f6dc9357SAndroid Build Coastguard Worker        )
409*f6dc9357SAndroid Build Coastguard Worker 
410*f6dc9357SAndroid Build Coastguard Worker #endif
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker 
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_LE
415*f6dc9357SAndroid Build Coastguard Worker   #if defined(MY_CPU_X86_OR_AMD64) \
416*f6dc9357SAndroid Build Coastguard Worker       || defined(MY_CPU_ARM64) \
417*f6dc9357SAndroid Build Coastguard Worker       || defined(MY_CPU_RISCV) && defined(__riscv_misaligned_fast) \
418*f6dc9357SAndroid Build Coastguard Worker       || defined(MY_CPU_E2K) && defined(__iset__) && (__iset__ >= 6)
419*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_LE_UNALIGN
420*f6dc9357SAndroid Build Coastguard Worker     #define MY_CPU_LE_UNALIGN_64
421*f6dc9357SAndroid Build Coastguard Worker   #elif defined(__ARM_FEATURE_UNALIGNED)
422*f6dc9357SAndroid Build Coastguard Worker /* === ALIGNMENT on 32-bit arm and LDRD/STRD/LDM/STM instructions.
423*f6dc9357SAndroid Build Coastguard Worker   Description of problems:
424*f6dc9357SAndroid Build Coastguard Worker problem-1 : 32-bit ARM architecture:
425*f6dc9357SAndroid Build Coastguard Worker   multi-access (pair of 32-bit accesses) instructions (LDRD/STRD/LDM/STM)
426*f6dc9357SAndroid Build Coastguard Worker   require 32-bit (WORD) alignment (by 32-bit ARM architecture).
427*f6dc9357SAndroid Build Coastguard Worker   So there is "Alignment fault exception", if data is not aligned for 32-bit.
428*f6dc9357SAndroid Build Coastguard Worker 
429*f6dc9357SAndroid Build Coastguard Worker problem-2 : 32-bit kernels and arm64 kernels:
430*f6dc9357SAndroid Build Coastguard Worker   32-bit linux kernels provide fixup for these "paired" instruction "Alignment fault exception".
431*f6dc9357SAndroid Build Coastguard Worker   So unaligned paired-access instructions work via exception handler in kernel in 32-bit linux.
432*f6dc9357SAndroid Build Coastguard Worker 
433*f6dc9357SAndroid Build Coastguard Worker   But some arm64 kernels do not handle these faults in 32-bit programs.
434*f6dc9357SAndroid Build Coastguard Worker   So we have unhandled exception for such instructions.
435*f6dc9357SAndroid Build Coastguard Worker   Probably some new arm64 kernels have fixed it, and unaligned
436*f6dc9357SAndroid Build Coastguard Worker   paired-access instructions work in new kernels?
437*f6dc9357SAndroid Build Coastguard Worker 
438*f6dc9357SAndroid Build Coastguard Worker problem-3 : compiler for 32-bit arm:
439*f6dc9357SAndroid Build Coastguard Worker   Compilers use LDRD/STRD/LDM/STM for UInt64 accesses
440*f6dc9357SAndroid Build Coastguard Worker   and for another cases where two 32-bit accesses are fused
441*f6dc9357SAndroid Build Coastguard Worker   to one multi-access instruction.
442*f6dc9357SAndroid Build Coastguard Worker   So UInt64 variables must be aligned for 32-bit, and each
443*f6dc9357SAndroid Build Coastguard Worker   32-bit access must be aligned for 32-bit, if we want to
444*f6dc9357SAndroid Build Coastguard Worker   avoid "Alignment fault" exception (handled or unhandled).
445*f6dc9357SAndroid Build Coastguard Worker 
446*f6dc9357SAndroid Build Coastguard Worker problem-4 : performace:
447*f6dc9357SAndroid Build Coastguard Worker   Even if unaligned access is handled by kernel, it will be slow.
448*f6dc9357SAndroid Build Coastguard Worker   So if we allow unaligned access, we can get fast unaligned
449*f6dc9357SAndroid Build Coastguard Worker   single-access, and slow unaligned paired-access.
450*f6dc9357SAndroid Build Coastguard Worker 
451*f6dc9357SAndroid Build Coastguard Worker   We don't allow unaligned access on 32-bit arm, because compiler
452*f6dc9357SAndroid Build Coastguard Worker   genarates paired-access instructions that require 32-bit alignment,
453*f6dc9357SAndroid Build Coastguard Worker   and some arm64 kernels have no handler for these instructions.
454*f6dc9357SAndroid Build Coastguard Worker   Also unaligned paired-access instructions will be slow, if kernel handles them.
455*f6dc9357SAndroid Build Coastguard Worker */
456*f6dc9357SAndroid Build Coastguard Worker     // it must be disabled:
457*f6dc9357SAndroid Build Coastguard Worker     // #define MY_CPU_LE_UNALIGN
458*f6dc9357SAndroid Build Coastguard Worker   #endif
459*f6dc9357SAndroid Build Coastguard Worker #endif
460*f6dc9357SAndroid Build Coastguard Worker 
461*f6dc9357SAndroid Build Coastguard Worker 
462*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_LE_UNALIGN
463*f6dc9357SAndroid Build Coastguard Worker 
464*f6dc9357SAndroid Build Coastguard Worker #define GetUi16(p) (*(const UInt16 *)(const void *)(p))
465*f6dc9357SAndroid Build Coastguard Worker #define GetUi32(p) (*(const UInt32 *)(const void *)(p))
466*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_LE_UNALIGN_64
467*f6dc9357SAndroid Build Coastguard Worker #define GetUi64(p) (*(const UInt64 *)(const void *)(p))
468*f6dc9357SAndroid Build Coastguard Worker #define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); }
469*f6dc9357SAndroid Build Coastguard Worker #endif
470*f6dc9357SAndroid Build Coastguard Worker 
471*f6dc9357SAndroid Build Coastguard Worker #define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); }
472*f6dc9357SAndroid Build Coastguard Worker #define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); }
473*f6dc9357SAndroid Build Coastguard Worker 
474*f6dc9357SAndroid Build Coastguard Worker #else
475*f6dc9357SAndroid Build Coastguard Worker 
476*f6dc9357SAndroid Build Coastguard Worker #define GetUi16(p) ( (UInt16) ( \
477*f6dc9357SAndroid Build Coastguard Worker              ((const Byte *)(p))[0] | \
478*f6dc9357SAndroid Build Coastguard Worker     ((UInt16)((const Byte *)(p))[1] << 8) ))
479*f6dc9357SAndroid Build Coastguard Worker 
480*f6dc9357SAndroid Build Coastguard Worker #define GetUi32(p) ( \
481*f6dc9357SAndroid Build Coastguard Worker              ((const Byte *)(p))[0]        | \
482*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[1] <<  8) | \
483*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[2] << 16) | \
484*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[3] << 24))
485*f6dc9357SAndroid Build Coastguard Worker 
486*f6dc9357SAndroid Build Coastguard Worker #define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
487*f6dc9357SAndroid Build Coastguard Worker     _ppp_[0] = (Byte)_vvv_; \
488*f6dc9357SAndroid Build Coastguard Worker     _ppp_[1] = (Byte)(_vvv_ >> 8); }
489*f6dc9357SAndroid Build Coastguard Worker 
490*f6dc9357SAndroid Build Coastguard Worker #define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
491*f6dc9357SAndroid Build Coastguard Worker     _ppp_[0] = (Byte)_vvv_; \
492*f6dc9357SAndroid Build Coastguard Worker     _ppp_[1] = (Byte)(_vvv_ >> 8); \
493*f6dc9357SAndroid Build Coastguard Worker     _ppp_[2] = (Byte)(_vvv_ >> 16); \
494*f6dc9357SAndroid Build Coastguard Worker     _ppp_[3] = (Byte)(_vvv_ >> 24); }
495*f6dc9357SAndroid Build Coastguard Worker 
496*f6dc9357SAndroid Build Coastguard Worker #endif
497*f6dc9357SAndroid Build Coastguard Worker 
498*f6dc9357SAndroid Build Coastguard Worker 
499*f6dc9357SAndroid Build Coastguard Worker #ifndef GetUi64
500*f6dc9357SAndroid Build Coastguard Worker #define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32))
501*f6dc9357SAndroid Build Coastguard Worker #endif
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker #ifndef SetUi64
504*f6dc9357SAndroid Build Coastguard Worker #define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \
505*f6dc9357SAndroid Build Coastguard Worker     SetUi32(_ppp2_    , (UInt32)_vvv2_) \
506*f6dc9357SAndroid Build Coastguard Worker     SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)) }
507*f6dc9357SAndroid Build Coastguard Worker #endif
508*f6dc9357SAndroid Build Coastguard Worker 
509*f6dc9357SAndroid Build Coastguard Worker 
510*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_LE_UNALIGN) && defined(Z7_CPU_FAST_BSWAP_SUPPORTED)
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker #if 0
513*f6dc9357SAndroid Build Coastguard Worker // Z7_BSWAP16 can be slow for x86-msvc
514*f6dc9357SAndroid Build Coastguard Worker #define GetBe16_to32(p)  (Z7_BSWAP16 (*(const UInt16 *)(const void *)(p)))
515*f6dc9357SAndroid Build Coastguard Worker #else
516*f6dc9357SAndroid Build Coastguard Worker #define GetBe16_to32(p)  (Z7_BSWAP32 (*(const UInt16 *)(const void *)(p)) >> 16)
517*f6dc9357SAndroid Build Coastguard Worker #endif
518*f6dc9357SAndroid Build Coastguard Worker 
519*f6dc9357SAndroid Build Coastguard Worker #define GetBe32(p)  Z7_BSWAP32 (*(const UInt32 *)(const void *)(p))
520*f6dc9357SAndroid Build Coastguard Worker #define SetBe32(p, v) { (*(UInt32 *)(void *)(p)) = Z7_BSWAP32(v); }
521*f6dc9357SAndroid Build Coastguard Worker 
522*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_LE_UNALIGN_64)
523*f6dc9357SAndroid Build Coastguard Worker #define GetBe64(p)  Z7_BSWAP64 (*(const UInt64 *)(const void *)(p))
524*f6dc9357SAndroid Build Coastguard Worker #define SetBe64(p, v) { (*(UInt64 *)(void *)(p)) = Z7_BSWAP64(v); }
525*f6dc9357SAndroid Build Coastguard Worker #endif
526*f6dc9357SAndroid Build Coastguard Worker 
527*f6dc9357SAndroid Build Coastguard Worker #else
528*f6dc9357SAndroid Build Coastguard Worker 
529*f6dc9357SAndroid Build Coastguard Worker #define GetBe32(p) ( \
530*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[0] << 24) | \
531*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[1] << 16) | \
532*f6dc9357SAndroid Build Coastguard Worker     ((UInt32)((const Byte *)(p))[2] <<  8) | \
533*f6dc9357SAndroid Build Coastguard Worker              ((const Byte *)(p))[3] )
534*f6dc9357SAndroid Build Coastguard Worker 
535*f6dc9357SAndroid Build Coastguard Worker #define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \
536*f6dc9357SAndroid Build Coastguard Worker     _ppp_[0] = (Byte)(_vvv_ >> 24); \
537*f6dc9357SAndroid Build Coastguard Worker     _ppp_[1] = (Byte)(_vvv_ >> 16); \
538*f6dc9357SAndroid Build Coastguard Worker     _ppp_[2] = (Byte)(_vvv_ >> 8); \
539*f6dc9357SAndroid Build Coastguard Worker     _ppp_[3] = (Byte)_vvv_; }
540*f6dc9357SAndroid Build Coastguard Worker 
541*f6dc9357SAndroid Build Coastguard Worker #endif
542*f6dc9357SAndroid Build Coastguard Worker 
543*f6dc9357SAndroid Build Coastguard Worker #ifndef GetBe64
544*f6dc9357SAndroid Build Coastguard Worker #define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4))
545*f6dc9357SAndroid Build Coastguard Worker #endif
546*f6dc9357SAndroid Build Coastguard Worker 
547*f6dc9357SAndroid Build Coastguard Worker #ifndef SetBe64
548*f6dc9357SAndroid Build Coastguard Worker #define SetBe64(p, v) { Byte *_ppp_ = (Byte *)(p); UInt64 _vvv_ = (v); \
549*f6dc9357SAndroid Build Coastguard Worker     _ppp_[0] = (Byte)(_vvv_ >> 56); \
550*f6dc9357SAndroid Build Coastguard Worker     _ppp_[1] = (Byte)(_vvv_ >> 48); \
551*f6dc9357SAndroid Build Coastguard Worker     _ppp_[2] = (Byte)(_vvv_ >> 40); \
552*f6dc9357SAndroid Build Coastguard Worker     _ppp_[3] = (Byte)(_vvv_ >> 32); \
553*f6dc9357SAndroid Build Coastguard Worker     _ppp_[4] = (Byte)(_vvv_ >> 24); \
554*f6dc9357SAndroid Build Coastguard Worker     _ppp_[5] = (Byte)(_vvv_ >> 16); \
555*f6dc9357SAndroid Build Coastguard Worker     _ppp_[6] = (Byte)(_vvv_ >> 8); \
556*f6dc9357SAndroid Build Coastguard Worker     _ppp_[7] = (Byte)_vvv_; }
557*f6dc9357SAndroid Build Coastguard Worker #endif
558*f6dc9357SAndroid Build Coastguard Worker 
559*f6dc9357SAndroid Build Coastguard Worker #ifndef GetBe16
560*f6dc9357SAndroid Build Coastguard Worker #ifdef GetBe16_to32
561*f6dc9357SAndroid Build Coastguard Worker #define GetBe16(p) ( (UInt16) GetBe16_to32(p))
562*f6dc9357SAndroid Build Coastguard Worker #else
563*f6dc9357SAndroid Build Coastguard Worker #define GetBe16(p) ( (UInt16) ( \
564*f6dc9357SAndroid Build Coastguard Worker     ((UInt16)((const Byte *)(p))[0] << 8) | \
565*f6dc9357SAndroid Build Coastguard Worker              ((const Byte *)(p))[1] ))
566*f6dc9357SAndroid Build Coastguard Worker #endif
567*f6dc9357SAndroid Build Coastguard Worker #endif
568*f6dc9357SAndroid Build Coastguard Worker 
569*f6dc9357SAndroid Build Coastguard Worker 
570*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_BE)
571*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_BE_TO_NATIVE_CONST32(v)  (v)
572*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_LE_TO_NATIVE_CONST32(v)  Z7_BSWAP32_CONST(v)
573*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_NATIVE_TO_BE_32(v)       (v)
574*f6dc9357SAndroid Build Coastguard Worker #elif defined(MY_CPU_LE)
575*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_BE_TO_NATIVE_CONST32(v)  Z7_BSWAP32_CONST(v)
576*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_LE_TO_NATIVE_CONST32(v)  (v)
577*f6dc9357SAndroid Build Coastguard Worker #define Z7_CONV_NATIVE_TO_BE_32(v)       Z7_BSWAP32(v)
578*f6dc9357SAndroid Build Coastguard Worker #else
579*f6dc9357SAndroid Build Coastguard Worker #error Stop_Compiling_Unknown_Endian_CONV
580*f6dc9357SAndroid Build Coastguard Worker #endif
581*f6dc9357SAndroid Build Coastguard Worker 
582*f6dc9357SAndroid Build Coastguard Worker 
583*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_BE)
584*f6dc9357SAndroid Build Coastguard Worker 
585*f6dc9357SAndroid Build Coastguard Worker #define GetBe64a(p)      (*(const UInt64 *)(const void *)(p))
586*f6dc9357SAndroid Build Coastguard Worker #define GetBe32a(p)      (*(const UInt32 *)(const void *)(p))
587*f6dc9357SAndroid Build Coastguard Worker #define GetBe16a(p)      (*(const UInt16 *)(const void *)(p))
588*f6dc9357SAndroid Build Coastguard Worker #define SetBe32a(p, v)   { *(UInt32 *)(void *)(p) = (v); }
589*f6dc9357SAndroid Build Coastguard Worker #define SetBe16a(p, v)   { *(UInt16 *)(void *)(p) = (v); }
590*f6dc9357SAndroid Build Coastguard Worker 
591*f6dc9357SAndroid Build Coastguard Worker #define GetUi64a(p)      GetUi64(p)
592*f6dc9357SAndroid Build Coastguard Worker #define GetUi32a(p)      GetUi32(p)
593*f6dc9357SAndroid Build Coastguard Worker #define GetUi16a(p)      GetUi16(p)
594*f6dc9357SAndroid Build Coastguard Worker #define SetUi32a(p, v)   SetUi32(p, v)
595*f6dc9357SAndroid Build Coastguard Worker #define SetUi16a(p, v)   SetUi16(p, v)
596*f6dc9357SAndroid Build Coastguard Worker 
597*f6dc9357SAndroid Build Coastguard Worker #elif defined(MY_CPU_LE)
598*f6dc9357SAndroid Build Coastguard Worker 
599*f6dc9357SAndroid Build Coastguard Worker #define GetUi64a(p)      (*(const UInt64 *)(const void *)(p))
600*f6dc9357SAndroid Build Coastguard Worker #define GetUi32a(p)      (*(const UInt32 *)(const void *)(p))
601*f6dc9357SAndroid Build Coastguard Worker #define GetUi16a(p)      (*(const UInt16 *)(const void *)(p))
602*f6dc9357SAndroid Build Coastguard Worker #define SetUi32a(p, v)   { *(UInt32 *)(void *)(p) = (v); }
603*f6dc9357SAndroid Build Coastguard Worker #define SetUi16a(p, v)   { *(UInt16 *)(void *)(p) = (v); }
604*f6dc9357SAndroid Build Coastguard Worker 
605*f6dc9357SAndroid Build Coastguard Worker #define GetBe64a(p)      GetBe64(p)
606*f6dc9357SAndroid Build Coastguard Worker #define GetBe32a(p)      GetBe32(p)
607*f6dc9357SAndroid Build Coastguard Worker #define GetBe16a(p)      GetBe16(p)
608*f6dc9357SAndroid Build Coastguard Worker #define SetBe32a(p, v)   SetBe32(p, v)
609*f6dc9357SAndroid Build Coastguard Worker #define SetBe16a(p, v)   SetBe16(p, v)
610*f6dc9357SAndroid Build Coastguard Worker 
611*f6dc9357SAndroid Build Coastguard Worker #else
612*f6dc9357SAndroid Build Coastguard Worker #error Stop_Compiling_Unknown_Endian_CPU_a
613*f6dc9357SAndroid Build Coastguard Worker #endif
614*f6dc9357SAndroid Build Coastguard Worker 
615*f6dc9357SAndroid Build Coastguard Worker 
616*f6dc9357SAndroid Build Coastguard Worker #ifndef GetBe16_to32
617*f6dc9357SAndroid Build Coastguard Worker #define GetBe16_to32(p) GetBe16(p)
618*f6dc9357SAndroid Build Coastguard Worker #endif
619*f6dc9357SAndroid Build Coastguard Worker 
620*f6dc9357SAndroid Build Coastguard Worker 
621*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_X86_OR_AMD64) \
622*f6dc9357SAndroid Build Coastguard Worker   || defined(MY_CPU_ARM_OR_ARM64) \
623*f6dc9357SAndroid Build Coastguard Worker   || defined(MY_CPU_PPC_OR_PPC64)
624*f6dc9357SAndroid Build Coastguard Worker   #define Z7_CPU_FAST_ROTATE_SUPPORTED
625*f6dc9357SAndroid Build Coastguard Worker #endif
626*f6dc9357SAndroid Build Coastguard Worker 
627*f6dc9357SAndroid Build Coastguard Worker 
628*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_CPU_X86_OR_AMD64
629*f6dc9357SAndroid Build Coastguard Worker 
630*f6dc9357SAndroid Build Coastguard Worker void Z7_FASTCALL z7_x86_cpuid(UInt32 a[4], UInt32 function);
631*f6dc9357SAndroid Build Coastguard Worker UInt32 Z7_FASTCALL z7_x86_cpuid_GetMaxFunc(void);
632*f6dc9357SAndroid Build Coastguard Worker #if defined(MY_CPU_AMD64)
633*f6dc9357SAndroid Build Coastguard Worker #define Z7_IF_X86_CPUID_SUPPORTED
634*f6dc9357SAndroid Build Coastguard Worker #else
635*f6dc9357SAndroid Build Coastguard Worker #define Z7_IF_X86_CPUID_SUPPORTED if (z7_x86_cpuid_GetMaxFunc())
636*f6dc9357SAndroid Build Coastguard Worker #endif
637*f6dc9357SAndroid Build Coastguard Worker 
638*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_AES(void);
639*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_AVX(void);
640*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_AVX2(void);
641*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_AVX512F_AVX512VL(void);
642*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_VAES_AVX2(void);
643*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_CMOV(void);
644*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SSE(void);
645*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SSE2(void);
646*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SSSE3(void);
647*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SSE41(void);
648*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA(void);
649*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA512(void);
650*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_PageGB(void);
651*f6dc9357SAndroid Build Coastguard Worker 
652*f6dc9357SAndroid Build Coastguard Worker #elif defined(MY_CPU_ARM_OR_ARM64)
653*f6dc9357SAndroid Build Coastguard Worker 
654*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_CRC32(void);
655*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_NEON(void);
656*f6dc9357SAndroid Build Coastguard Worker 
657*f6dc9357SAndroid Build Coastguard Worker #if defined(_WIN32)
658*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_CRYPTO(void);
659*f6dc9357SAndroid Build Coastguard Worker #define CPU_IsSupported_SHA1  CPU_IsSupported_CRYPTO
660*f6dc9357SAndroid Build Coastguard Worker #define CPU_IsSupported_SHA2  CPU_IsSupported_CRYPTO
661*f6dc9357SAndroid Build Coastguard Worker #define CPU_IsSupported_AES   CPU_IsSupported_CRYPTO
662*f6dc9357SAndroid Build Coastguard Worker #else
663*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA1(void);
664*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA2(void);
665*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_AES(void);
666*f6dc9357SAndroid Build Coastguard Worker #endif
667*f6dc9357SAndroid Build Coastguard Worker BoolInt CPU_IsSupported_SHA512(void);
668*f6dc9357SAndroid Build Coastguard Worker 
669*f6dc9357SAndroid Build Coastguard Worker #endif
670*f6dc9357SAndroid Build Coastguard Worker 
671*f6dc9357SAndroid Build Coastguard Worker #if defined(__APPLE__)
672*f6dc9357SAndroid Build Coastguard Worker int z7_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize);
673*f6dc9357SAndroid Build Coastguard Worker int z7_sysctlbyname_Get_UInt32(const char *name, UInt32 *val);
674*f6dc9357SAndroid Build Coastguard Worker #endif
675*f6dc9357SAndroid Build Coastguard Worker 
676*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
677*f6dc9357SAndroid Build Coastguard Worker 
678*f6dc9357SAndroid Build Coastguard Worker #endif
679