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