00001
00047 #ifndef SPH_TYPES_H__
00048 #define SPH_TYPES_H__
00049
00050 #include <limits.h>
00051
00052
00053
00054
00055
00056 #if CHAR_BIT != 8
00057 #error This code requires 8-bit bytes
00058 #endif
00059
00060
00061
00062 #ifdef DOXYGEN_IGNORE
00063
00385 typedef __arch_dependant__ sph_u32;
00386
00391 typedef __arch_dependant__ sph_s32;
00392
00403 typedef __arch_dependant__ sph_u64;
00404
00409 typedef __arch_dependant__ sph_s64;
00410
00419 #define SPH_C32(x)
00420
00427 #define SPH_T32(x)
00428
00439 #define SPH_ROTL32(x, n)
00440
00451 #define SPH_ROTR32(x, n)
00452
00457 #define SPH_64
00458
00463 #define SPH_64_TRUE
00464
00474 #define SPH_C64(x)
00475
00483 #define SPH_T64(x)
00484
00496 #define SPH_ROTL64(x, n)
00497
00509 #define SPH_ROTR64(x, n)
00510
00518 #define SPH_INLINE
00519
00526 #define SPH_LITTLE_ENDIAN
00527
00534 #define SPH_BIG_ENDIAN
00535
00543 #define SPH_LITTLE_FAST
00544
00552 #define SPH_BIG_FAST
00553
00560 #define SPH_UPTR
00561
00567 #define SPH_UNALIGNED
00568
00577 static inline sph_u32 sph_bswap32(sph_u32 x);
00578
00588 static inline sph_u64 sph_bswap64(sph_u64 x);
00589
00597 static inline unsigned sph_dec16le(const void *src);
00598
00606 static inline void sph_enc16le(void *dst, unsigned val);
00607
00615 static inline unsigned sph_dec16be(const void *src);
00616
00624 static inline void sph_enc16be(void *dst, unsigned val);
00625
00633 static inline sph_u32 sph_dec32le(const void *src);
00634
00645 static inline sph_u32 sph_dec32le_aligned(const void *src);
00646
00654 static inline void sph_enc32le(void *dst, sph_u32 val);
00655
00666 static inline void sph_enc32le_aligned(void *dst, sph_u32 val);
00667
00675 static inline sph_u32 sph_dec32be(const void *src);
00676
00687 static inline sph_u32 sph_dec32be_aligned(const void *src);
00688
00696 static inline void sph_enc32be(void *dst, sph_u32 val);
00697
00708 static inline void sph_enc32be_aligned(void *dst, sph_u32 val);
00709
00718 static inline sph_u64 sph_dec64le(const void *src);
00719
00731 static inline sph_u64 sph_dec64le_aligned(const void *src);
00732
00741 static inline void sph_enc64le(void *dst, sph_u64 val);
00742
00755 static inline void sph_enc64le_aligned(void *dst, sph_u64 val);
00756
00765 static inline sph_u64 sph_dec64be(const void *src);
00766
00778 static inline sph_u64 sph_dec64be_aligned(const void *src);
00779
00788 static inline void sph_enc64be(void *dst, sph_u64 val);
00789
00802 static inline void sph_enc64be_aligned(void *dst, sph_u64 val);
00803
00804 #endif
00805
00806
00807
00808 #ifndef DOXYGEN_IGNORE
00809
00810
00811
00812
00813
00814
00815
00816
00817 #undef SPH_64
00818 #undef SPH_64_TRUE
00819
00820 #if defined __STDC__ && __STDC_VERSION__ >= 199901L
00821
00822
00823
00824
00825
00826
00827
00828 #include <stdint.h>
00829
00830 #ifdef UINT32_MAX
00831 typedef uint32_t sph_u32;
00832 typedef int32_t sph_s32;
00833 #else
00834 typedef uint_fast32_t sph_u32;
00835 typedef int_fast32_t sph_s32;
00836 #endif
00837 #if !SPH_NO_64
00838 #ifdef UINT64_MAX
00839 typedef uint64_t sph_u64;
00840 typedef int64_t sph_s64;
00841 #else
00842 typedef uint_fast64_t sph_u64;
00843 typedef int_fast64_t sph_s64;
00844 #endif
00845 #endif
00846
00847 #define SPH_C32(x) ((sph_u32)(x))
00848 #if !SPH_NO_64
00849 #define SPH_C64(x) ((sph_u64)(x))
00850 #define SPH_64 1
00851 #endif
00852
00853 #else
00854
00855
00856
00857
00858
00859
00860
00861
00862 #if ((UINT_MAX >> 11) >> 11) >= 0x3FF
00863
00864 typedef unsigned int sph_u32;
00865 typedef int sph_s32;
00866
00867 #define SPH_C32(x) ((sph_u32)(x ## U))
00868
00869 #else
00870
00871 typedef unsigned long sph_u32;
00872 typedef long sph_s32;
00873
00874 #define SPH_C32(x) ((sph_u32)(x ## UL))
00875
00876 #endif
00877
00878 #if !SPH_NO_64
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888 #if ((ULONG_MAX >> 31) >> 31) >= 3
00889
00890 typedef unsigned long sph_u64;
00891 typedef long sph_s64;
00892
00893 #define SPH_C64(x) ((sph_u64)(x ## UL))
00894
00895 #define SPH_64 1
00896
00897 #elif ((ULLONG_MAX >> 31) >> 31) >= 3 || defined __GNUC__
00898
00899 typedef unsigned long long sph_u64;
00900 typedef long long sph_s64;
00901
00902 #define SPH_C64(x) ((sph_u64)(x ## ULL))
00903
00904 #define SPH_64 1
00905
00906 #else
00907
00908
00909
00910
00911
00912 #endif
00913
00914 #endif
00915
00916 #endif
00917
00918
00919
00920
00921
00922
00923 #if SPH_64 && (((ULONG_MAX >> 31) >> 31) >= 3 || defined _M_X64)
00924 #define SPH_64_TRUE 1
00925 #endif
00926
00927
00928
00929
00930
00931
00932
00933 #define SPH_T32(x) ((x) & SPH_C32(0xFFFFFFFF))
00934 #define SPH_ROTL32(x, n) SPH_T32(((x) << (n)) | ((x) >> (32 - (n))))
00935 #define SPH_ROTR32(x, n) SPH_ROTL32(x, (32 - (n)))
00936
00937 #if SPH_64
00938
00939 #define SPH_T64(x) ((x) & SPH_C64(0xFFFFFFFFFFFFFFFF))
00940 #define SPH_ROTL64(x, n) SPH_T64(((x) << (n)) | ((x) >> (64 - (n))))
00941 #define SPH_ROTR64(x, n) SPH_ROTL64(x, (64 - (n)))
00942
00943 #endif
00944
00945 #ifndef DOXYGEN_IGNORE
00946
00947
00948
00949
00950 #if (defined __STDC__ && __STDC_VERSION__ >= 199901L) || defined __GNUC__
00951 #define SPH_INLINE inline
00952 #elif defined _MSC_VER
00953 #define SPH_INLINE __inline
00954 #else
00955 #define SPH_INLINE
00956 #endif
00957 #endif
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999 #if defined __i386__ || defined _M_IX86
01000
01001 #define SPH_DETECT_UNALIGNED 1
01002 #define SPH_DETECT_LITTLE_ENDIAN 1
01003 #define SPH_DETECT_UPTR sph_u32
01004 #ifdef __GNUC__
01005 #define SPH_DETECT_I386_GCC 1
01006 #endif
01007 #ifdef _MSC_VER
01008 #define SPH_DETECT_I386_MSVC 1
01009 #endif
01010
01011
01012
01013
01014 #elif defined __x86_64 || defined _M_X64
01015
01016 #define SPH_DETECT_UNALIGNED 1
01017 #define SPH_DETECT_LITTLE_ENDIAN 1
01018 #define SPH_DETECT_UPTR sph_u64
01019 #ifdef __GNUC__
01020 #define SPH_DETECT_AMD64_GCC 1
01021 #endif
01022 #ifdef _MSC_VER
01023 #define SPH_DETECT_AMD64_MSVC 1
01024 #endif
01025
01026
01027
01028
01029 #elif ((defined __sparc__ || defined __sparc) && defined __arch64__) \
01030 || defined __sparcv9
01031
01032 #define SPH_DETECT_BIG_ENDIAN 1
01033 #define SPH_DETECT_UPTR sph_u64
01034 #ifdef __GNUC__
01035 #define SPH_DETECT_SPARCV9_GCC_64 1
01036 #define SPH_DETECT_LITTLE_FAST 1
01037 #endif
01038
01039
01040
01041
01042 #elif (defined __sparc__ || defined __sparc) \
01043 && !(defined __sparcv9 || defined __arch64__)
01044
01045 #define SPH_DETECT_BIG_ENDIAN 1
01046 #define SPH_DETECT_UPTR sph_u32
01047 #if defined __GNUC__ && defined __sparc_v9__
01048 #define SPH_DETECT_SPARCV9_GCC_32 1
01049 #define SPH_DETECT_LITTLE_FAST 1
01050 #endif
01051
01052
01053
01054
01055 #elif defined __arm__ && __ARMEL__
01056
01057 #define SPH_DETECT_LITTLE_ENDIAN 1
01058
01059
01060
01061
01062 #elif MIPSEL || _MIPSEL || __MIPSEL || __MIPSEL__
01063
01064 #define SPH_DETECT_LITTLE_ENDIAN 1
01065
01066
01067
01068
01069 #elif MIPSEB || _MIPSEB || __MIPSEB || __MIPSEB__
01070
01071 #define SPH_DETECT_BIG_ENDIAN 1
01072
01073
01074
01075
01076 #elif defined __powerpc__ || defined __POWERPC__ || defined __ppc__ \
01077 || defined _ARCH_PPC
01078 #if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
01079 #define SPH_DETECT_BIG_ENDIAN 1
01080 #elif defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
01081 #define SPH_DETECT_LITTLE_ENDIAN 1
01082 #endif
01083
01084
01085
01086
01087 #elif defined __ia64 || defined __ia64__ \
01088 || defined __itanium__ || defined _M_IA64
01089
01090 #if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
01091 #define SPH_DETECT_BIG_ENDIAN 1
01092 #else
01093 #define SPH_DETECT_LITTLE_ENDIAN 1
01094 #endif
01095 #if defined __LP64__ || defined _LP64
01096 #define SPH_DETECT_UPTR sph_u64
01097 #else
01098 #define SPH_DETECT_UPTR sph_u32
01099 #endif
01100
01101 #endif
01102
01103 #if defined SPH_DETECT_SPARCV9_GCC_32 || defined SPH_DETECT_SPARCV9_GCC_64
01104 #define SPH_DETECT_SPARCV9_GCC 1
01105 #endif
01106
01107 #if defined SPH_DETECT_UNALIGNED && !defined SPH_UNALIGNED
01108 #define SPH_UNALIGNED SPH_DETECT_UNALIGNED
01109 #endif
01110 #if defined SPH_DETECT_UPTR && !defined SPH_UPTR
01111 #define SPH_UPTR SPH_DETECT_UPTR
01112 #endif
01113 #if defined SPH_DETECT_LITTLE_ENDIAN && !defined SPH_LITTLE_ENDIAN
01114 #define SPH_LITTLE_ENDIAN SPH_DETECT_LITTLE_ENDIAN
01115 #endif
01116 #if defined SPH_DETECT_BIG_ENDIAN && !defined SPH_BIG_ENDIAN
01117 #define SPH_BIG_ENDIAN SPH_DETECT_BIG_ENDIAN
01118 #endif
01119 #if defined SPH_DETECT_LITTLE_FAST && !defined SPH_LITTLE_FAST
01120 #define SPH_LITTLE_FAST SPH_DETECT_LITTLE_FAST
01121 #endif
01122 #if defined SPH_DETECT_BIG_FAST && !defined SPH_BIG_FAST
01123 #define SPH_BIG_FAST SPH_DETECT_BIG_FAST
01124 #endif
01125 #if defined SPH_DETECT_SPARCV9_GCC_32 && !defined SPH_SPARCV9_GCC_32
01126 #define SPH_SPARCV9_GCC_32 SPH_DETECT_SPARCV9_GCC_32
01127 #endif
01128 #if defined SPH_DETECT_SPARCV9_GCC_64 && !defined SPH_SPARCV9_GCC_64
01129 #define SPH_SPARCV9_GCC_64 SPH_DETECT_SPARCV9_GCC_64
01130 #endif
01131 #if defined SPH_DETECT_SPARCV9_GCC && !defined SPH_SPARCV9_GCC
01132 #define SPH_SPARCV9_GCC SPH_DETECT_SPARCV9_GCC
01133 #endif
01134 #if defined SPH_DETECT_I386_GCC && !defined SPH_I386_GCC
01135 #define SPH_I386_GCC SPH_DETECT_I386_GCC
01136 #endif
01137 #if defined SPH_DETECT_I386_MSVC && !defined SPH_I386_MSVC
01138 #define SPH_I386_MSVC SPH_DETECT_I386_MSVC
01139 #endif
01140 #if defined SPH_DETECT_AMD64_GCC && !defined SPH_AMD64_GCC
01141 #define SPH_AMD64_GCC SPH_DETECT_AMD64_GCC
01142 #endif
01143 #if defined SPH_DETECT_AMD64_MSVC && !defined SPH_AMD64_MSVC
01144 #define SPH_AMD64_MSVC SPH_DETECT_AMD64_MSVC
01145 #endif
01146
01147 #if SPH_LITTLE_ENDIAN && !defined SPH_LITTLE_FAST
01148 #define SPH_LITTLE_FAST 1
01149 #endif
01150 #if SPH_BIG_ENDIAN && !defined SPH_BIG_FAST
01151 #define SPH_BIG_FAST 1
01152 #endif
01153
01154 #if defined SPH_UPTR && !(SPH_LITTLE_ENDIAN || SPH_BIG_ENDIAN)
01155 #error SPH_UPTR defined, but endianness is not known.
01156 #endif
01157
01158 #if SPH_I386_GCC && !SPH_NO_ASM
01159
01160
01161
01162
01163
01164
01165 static SPH_INLINE sph_u32
01166 sph_bswap32(sph_u32 x)
01167 {
01168 __asm__ __volatile__ ("bswapl %0" : "=r" (x) : "0" (x));
01169 return x;
01170 }
01171
01172 #if SPH_64
01173
01174 static SPH_INLINE sph_u64
01175 sph_bswap64(sph_u64 x)
01176 {
01177 return ((sph_u64)sph_bswap32((sph_u32)x) << 32)
01178 | (sph_u64)sph_bswap32((sph_u32)(x >> 32));
01179 }
01180
01181 #endif
01182
01183 #elif SPH_AMD64_GCC && !SPH_NO_ASM
01184
01185
01186
01187
01188
01189
01190 static SPH_INLINE sph_u32
01191 sph_bswap32(sph_u32 x)
01192 {
01193 __asm__ __volatile__ ("bswapl %0" : "=r" (x) : "0" (x));
01194 return x;
01195 }
01196
01197 #if SPH_64
01198
01199 static SPH_INLINE sph_u64
01200 sph_bswap64(sph_u64 x)
01201 {
01202 __asm__ __volatile__ ("bswapq %0" : "=r" (x) : "0" (x));
01203 return x;
01204 }
01205
01206 #endif
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241 #else
01242
01243 static SPH_INLINE sph_u32
01244 sph_bswap32(sph_u32 x)
01245 {
01246 x = SPH_T32((x << 16) | (x >> 16));
01247 x = ((x & SPH_C32(0xFF00FF00)) >> 8)
01248 | ((x & SPH_C32(0x00FF00FF)) << 8);
01249 return x;
01250 }
01251
01252 #if SPH_64
01253
01260 static SPH_INLINE sph_u64
01261 sph_bswap64(sph_u64 x)
01262 {
01263 x = SPH_T64((x << 32) | (x >> 32));
01264 x = ((x & SPH_C64(0xFFFF0000FFFF0000)) >> 16)
01265 | ((x & SPH_C64(0x0000FFFF0000FFFF)) << 16);
01266 x = ((x & SPH_C64(0xFF00FF00FF00FF00)) >> 8)
01267 | ((x & SPH_C64(0x00FF00FF00FF00FF)) << 8);
01268 return x;
01269 }
01270
01271 #endif
01272
01273 #endif
01274
01275 #if SPH_SPARCV9_GCC && !SPH_NO_ASM
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293 #define SPH_SPARCV9_SET_ASI \
01294 sph_u32 sph_sparcv9_asi; \
01295 __asm__ __volatile__ ( \
01296 "rd %%asi,%0\n\twr %%g0,0x88,%%asi" : "=r" (sph_sparcv9_asi));
01297
01298 #define SPH_SPARCV9_RESET_ASI \
01299 __asm__ __volatile__ ("wr %%g0,%0,%%asi" : : "r" (sph_sparcv9_asi));
01300
01301 #define SPH_SPARCV9_DEC32LE(base, idx) ({ \
01302 sph_u32 sph_sparcv9_tmp; \
01303 __asm__ __volatile__ ("lda [%1+" #idx "*4]%%asi,%0" \
01304 : "=r" (sph_sparcv9_tmp) : "r" (base)); \
01305 sph_sparcv9_tmp; \
01306 })
01307
01308 #endif
01309
01310 static SPH_INLINE void
01311 sph_enc16be(void *dst, unsigned val)
01312 {
01313 ((unsigned char *)dst)[0] = (val >> 8);
01314 ((unsigned char *)dst)[1] = val;
01315 }
01316
01317 static SPH_INLINE unsigned
01318 sph_dec16be(const void *src)
01319 {
01320 return ((unsigned)(((const unsigned char *)src)[0]) << 8)
01321 | (unsigned)(((const unsigned char *)src)[1]);
01322 }
01323
01324 static SPH_INLINE void
01325 sph_enc16le(void *dst, unsigned val)
01326 {
01327 ((unsigned char *)dst)[0] = val;
01328 ((unsigned char *)dst)[1] = val >> 8;
01329 }
01330
01331 static SPH_INLINE unsigned
01332 sph_dec16le(const void *src)
01333 {
01334 return (unsigned)(((const unsigned char *)src)[0])
01335 | ((unsigned)(((const unsigned char *)src)[1]) << 8);
01336 }
01337
01344 static SPH_INLINE void
01345 sph_enc32be(void *dst, sph_u32 val)
01346 {
01347 #if defined SPH_UPTR
01348 #if SPH_UNALIGNED
01349 #if SPH_LITTLE_ENDIAN
01350 val = sph_bswap32(val);
01351 #endif
01352 *(sph_u32 *)dst = val;
01353 #else
01354 if (((SPH_UPTR)dst & 3) == 0) {
01355 #if SPH_LITTLE_ENDIAN
01356 val = sph_bswap32(val);
01357 #endif
01358 *(sph_u32 *)dst = val;
01359 } else {
01360 ((unsigned char *)dst)[0] = (val >> 24);
01361 ((unsigned char *)dst)[1] = (val >> 16);
01362 ((unsigned char *)dst)[2] = (val >> 8);
01363 ((unsigned char *)dst)[3] = val;
01364 }
01365 #endif
01366 #else
01367 ((unsigned char *)dst)[0] = (val >> 24);
01368 ((unsigned char *)dst)[1] = (val >> 16);
01369 ((unsigned char *)dst)[2] = (val >> 8);
01370 ((unsigned char *)dst)[3] = val;
01371 #endif
01372 }
01373
01381 static SPH_INLINE void
01382 sph_enc32be_aligned(void *dst, sph_u32 val)
01383 {
01384 #if SPH_LITTLE_ENDIAN
01385 *(sph_u32 *)dst = sph_bswap32(val);
01386 #elif SPH_BIG_ENDIAN
01387 *(sph_u32 *)dst = val;
01388 #else
01389 ((unsigned char *)dst)[0] = (val >> 24);
01390 ((unsigned char *)dst)[1] = (val >> 16);
01391 ((unsigned char *)dst)[2] = (val >> 8);
01392 ((unsigned char *)dst)[3] = val;
01393 #endif
01394 }
01395
01402 static SPH_INLINE sph_u32
01403 sph_dec32be(const void *src)
01404 {
01405 #if defined SPH_UPTR
01406 #if SPH_UNALIGNED
01407 #if SPH_LITTLE_ENDIAN
01408 return sph_bswap32(*(const sph_u32 *)src);
01409 #else
01410 return *(const sph_u32 *)src;
01411 #endif
01412 #else
01413 if (((SPH_UPTR)src & 3) == 0) {
01414 #if SPH_LITTLE_ENDIAN
01415 return sph_bswap32(*(const sph_u32 *)src);
01416 #else
01417 return *(const sph_u32 *)src;
01418 #endif
01419 } else {
01420 return ((sph_u32)(((const unsigned char *)src)[0]) << 24)
01421 | ((sph_u32)(((const unsigned char *)src)[1]) << 16)
01422 | ((sph_u32)(((const unsigned char *)src)[2]) << 8)
01423 | (sph_u32)(((const unsigned char *)src)[3]);
01424 }
01425 #endif
01426 #else
01427 return ((sph_u32)(((const unsigned char *)src)[0]) << 24)
01428 | ((sph_u32)(((const unsigned char *)src)[1]) << 16)
01429 | ((sph_u32)(((const unsigned char *)src)[2]) << 8)
01430 | (sph_u32)(((const unsigned char *)src)[3]);
01431 #endif
01432 }
01433
01441 static SPH_INLINE sph_u32
01442 sph_dec32be_aligned(const void *src)
01443 {
01444 #if SPH_LITTLE_ENDIAN
01445 return sph_bswap32(*(const sph_u32 *)src);
01446 #elif SPH_BIG_ENDIAN
01447 return *(const sph_u32 *)src;
01448 #else
01449 return ((sph_u32)(((const unsigned char *)src)[0]) << 24)
01450 | ((sph_u32)(((const unsigned char *)src)[1]) << 16)
01451 | ((sph_u32)(((const unsigned char *)src)[2]) << 8)
01452 | (sph_u32)(((const unsigned char *)src)[3]);
01453 #endif
01454 }
01455
01462 static SPH_INLINE void
01463 sph_enc32le(void *dst, sph_u32 val)
01464 {
01465 #if defined SPH_UPTR
01466 #if SPH_UNALIGNED
01467 #if SPH_BIG_ENDIAN
01468 val = sph_bswap32(val);
01469 #endif
01470 *(sph_u32 *)dst = val;
01471 #else
01472 if (((SPH_UPTR)dst & 3) == 0) {
01473 #if SPH_BIG_ENDIAN
01474 val = sph_bswap32(val);
01475 #endif
01476 *(sph_u32 *)dst = val;
01477 } else {
01478 ((unsigned char *)dst)[0] = val;
01479 ((unsigned char *)dst)[1] = (val >> 8);
01480 ((unsigned char *)dst)[2] = (val >> 16);
01481 ((unsigned char *)dst)[3] = (val >> 24);
01482 }
01483 #endif
01484 #else
01485 ((unsigned char *)dst)[0] = val;
01486 ((unsigned char *)dst)[1] = (val >> 8);
01487 ((unsigned char *)dst)[2] = (val >> 16);
01488 ((unsigned char *)dst)[3] = (val >> 24);
01489 #endif
01490 }
01491
01499 static SPH_INLINE void
01500 sph_enc32le_aligned(void *dst, sph_u32 val)
01501 {
01502 #if SPH_LITTLE_ENDIAN
01503 *(sph_u32 *)dst = val;
01504 #elif SPH_BIG_ENDIAN
01505 *(sph_u32 *)dst = sph_bswap32(val);
01506 #else
01507 ((unsigned char *)dst)[0] = val;
01508 ((unsigned char *)dst)[1] = (val >> 8);
01509 ((unsigned char *)dst)[2] = (val >> 16);
01510 ((unsigned char *)dst)[3] = (val >> 24);
01511 #endif
01512 }
01513
01520 static SPH_INLINE sph_u32
01521 sph_dec32le(const void *src)
01522 {
01523 #if defined SPH_UPTR
01524 #if SPH_UNALIGNED
01525 #if SPH_BIG_ENDIAN
01526 return sph_bswap32(*(const sph_u32 *)src);
01527 #else
01528 return *(const sph_u32 *)src;
01529 #endif
01530 #else
01531 if (((SPH_UPTR)src & 3) == 0) {
01532 #if SPH_BIG_ENDIAN
01533 #if SPH_SPARCV9_GCC && !SPH_NO_ASM
01534 sph_u32 tmp;
01535
01536
01537
01538
01539
01540
01541
01542 __asm__ __volatile__ (
01543 "lda [%1]0x88,%0" : "=r" (tmp) : "r" (src));
01544 return tmp;
01545 #else
01546 return sph_bswap32(*(const sph_u32 *)src);
01547 #endif
01548 #else
01549 return *(const sph_u32 *)src;
01550 #endif
01551 } else {
01552 return (sph_u32)(((const unsigned char *)src)[0])
01553 | ((sph_u32)(((const unsigned char *)src)[1]) << 8)
01554 | ((sph_u32)(((const unsigned char *)src)[2]) << 16)
01555 | ((sph_u32)(((const unsigned char *)src)[3]) << 24);
01556 }
01557 #endif
01558 #else
01559 return (sph_u32)(((const unsigned char *)src)[0])
01560 | ((sph_u32)(((const unsigned char *)src)[1]) << 8)
01561 | ((sph_u32)(((const unsigned char *)src)[2]) << 16)
01562 | ((sph_u32)(((const unsigned char *)src)[3]) << 24);
01563 #endif
01564 }
01565
01573 static SPH_INLINE sph_u32
01574 sph_dec32le_aligned(const void *src)
01575 {
01576 #if SPH_LITTLE_ENDIAN
01577 return *(const sph_u32 *)src;
01578 #elif SPH_BIG_ENDIAN
01579 #if SPH_SPARCV9_GCC && !SPH_NO_ASM
01580 sph_u32 tmp;
01581
01582 __asm__ __volatile__ ("lda [%1]0x88,%0" : "=r" (tmp) : "r" (src));
01583 return tmp;
01584 #else
01585 return sph_bswap32(*(const sph_u32 *)src);
01586 #endif
01587 #else
01588 return (sph_u32)(((const unsigned char *)src)[0])
01589 | ((sph_u32)(((const unsigned char *)src)[1]) << 8)
01590 | ((sph_u32)(((const unsigned char *)src)[2]) << 16)
01591 | ((sph_u32)(((const unsigned char *)src)[3]) << 24);
01592 #endif
01593 }
01594
01595 #if SPH_64
01596
01603 static SPH_INLINE void
01604 sph_enc64be(void *dst, sph_u64 val)
01605 {
01606 #if defined SPH_UPTR
01607 #if SPH_UNALIGNED
01608 #if SPH_LITTLE_ENDIAN
01609 val = sph_bswap64(val);
01610 #endif
01611 *(sph_u64 *)dst = val;
01612 #else
01613 if (((SPH_UPTR)dst & 7) == 0) {
01614 #if SPH_LITTLE_ENDIAN
01615 val = sph_bswap64(val);
01616 #endif
01617 *(sph_u64 *)dst = val;
01618 } else {
01619 ((unsigned char *)dst)[0] = (val >> 56);
01620 ((unsigned char *)dst)[1] = (val >> 48);
01621 ((unsigned char *)dst)[2] = (val >> 40);
01622 ((unsigned char *)dst)[3] = (val >> 32);
01623 ((unsigned char *)dst)[4] = (val >> 24);
01624 ((unsigned char *)dst)[5] = (val >> 16);
01625 ((unsigned char *)dst)[6] = (val >> 8);
01626 ((unsigned char *)dst)[7] = val;
01627 }
01628 #endif
01629 #else
01630 ((unsigned char *)dst)[0] = (val >> 56);
01631 ((unsigned char *)dst)[1] = (val >> 48);
01632 ((unsigned char *)dst)[2] = (val >> 40);
01633 ((unsigned char *)dst)[3] = (val >> 32);
01634 ((unsigned char *)dst)[4] = (val >> 24);
01635 ((unsigned char *)dst)[5] = (val >> 16);
01636 ((unsigned char *)dst)[6] = (val >> 8);
01637 ((unsigned char *)dst)[7] = val;
01638 #endif
01639 }
01640
01648 static SPH_INLINE void
01649 sph_enc64be_aligned(void *dst, sph_u64 val)
01650 {
01651 #if SPH_LITTLE_ENDIAN
01652 *(sph_u64 *)dst = sph_bswap64(val);
01653 #elif SPH_BIG_ENDIAN
01654 *(sph_u64 *)dst = val;
01655 #else
01656 ((unsigned char *)dst)[0] = (val >> 56);
01657 ((unsigned char *)dst)[1] = (val >> 48);
01658 ((unsigned char *)dst)[2] = (val >> 40);
01659 ((unsigned char *)dst)[3] = (val >> 32);
01660 ((unsigned char *)dst)[4] = (val >> 24);
01661 ((unsigned char *)dst)[5] = (val >> 16);
01662 ((unsigned char *)dst)[6] = (val >> 8);
01663 ((unsigned char *)dst)[7] = val;
01664 #endif
01665 }
01666
01673 static SPH_INLINE sph_u64
01674 sph_dec64be(const void *src)
01675 {
01676 #if defined SPH_UPTR
01677 #if SPH_UNALIGNED
01678 #if SPH_LITTLE_ENDIAN
01679 return sph_bswap64(*(const sph_u64 *)src);
01680 #else
01681 return *(const sph_u64 *)src;
01682 #endif
01683 #else
01684 if (((SPH_UPTR)src & 7) == 0) {
01685 #if SPH_LITTLE_ENDIAN
01686 return sph_bswap64(*(const sph_u64 *)src);
01687 #else
01688 return *(const sph_u64 *)src;
01689 #endif
01690 } else {
01691 return ((sph_u64)(((const unsigned char *)src)[0]) << 56)
01692 | ((sph_u64)(((const unsigned char *)src)[1]) << 48)
01693 | ((sph_u64)(((const unsigned char *)src)[2]) << 40)
01694 | ((sph_u64)(((const unsigned char *)src)[3]) << 32)
01695 | ((sph_u64)(((const unsigned char *)src)[4]) << 24)
01696 | ((sph_u64)(((const unsigned char *)src)[5]) << 16)
01697 | ((sph_u64)(((const unsigned char *)src)[6]) << 8)
01698 | (sph_u64)(((const unsigned char *)src)[7]);
01699 }
01700 #endif
01701 #else
01702 return ((sph_u64)(((const unsigned char *)src)[0]) << 56)
01703 | ((sph_u64)(((const unsigned char *)src)[1]) << 48)
01704 | ((sph_u64)(((const unsigned char *)src)[2]) << 40)
01705 | ((sph_u64)(((const unsigned char *)src)[3]) << 32)
01706 | ((sph_u64)(((const unsigned char *)src)[4]) << 24)
01707 | ((sph_u64)(((const unsigned char *)src)[5]) << 16)
01708 | ((sph_u64)(((const unsigned char *)src)[6]) << 8)
01709 | (sph_u64)(((const unsigned char *)src)[7]);
01710 #endif
01711 }
01712
01720 static SPH_INLINE sph_u64
01721 sph_dec64be_aligned(const void *src)
01722 {
01723 #if SPH_LITTLE_ENDIAN
01724 return sph_bswap64(*(const sph_u64 *)src);
01725 #elif SPH_BIG_ENDIAN
01726 return *(const sph_u64 *)src;
01727 #else
01728 return ((sph_u64)(((const unsigned char *)src)[0]) << 56)
01729 | ((sph_u64)(((const unsigned char *)src)[1]) << 48)
01730 | ((sph_u64)(((const unsigned char *)src)[2]) << 40)
01731 | ((sph_u64)(((const unsigned char *)src)[3]) << 32)
01732 | ((sph_u64)(((const unsigned char *)src)[4]) << 24)
01733 | ((sph_u64)(((const unsigned char *)src)[5]) << 16)
01734 | ((sph_u64)(((const unsigned char *)src)[6]) << 8)
01735 | (sph_u64)(((const unsigned char *)src)[7]);
01736 #endif
01737 }
01738
01745 static SPH_INLINE void
01746 sph_enc64le(void *dst, sph_u64 val)
01747 {
01748 #if defined SPH_UPTR
01749 #if SPH_UNALIGNED
01750 #if SPH_BIG_ENDIAN
01751 val = sph_bswap64(val);
01752 #endif
01753 *(sph_u64 *)dst = val;
01754 #else
01755 if (((SPH_UPTR)dst & 7) == 0) {
01756 #if SPH_BIG_ENDIAN
01757 val = sph_bswap64(val);
01758 #endif
01759 *(sph_u64 *)dst = val;
01760 } else {
01761 ((unsigned char *)dst)[0] = val;
01762 ((unsigned char *)dst)[1] = (val >> 8);
01763 ((unsigned char *)dst)[2] = (val >> 16);
01764 ((unsigned char *)dst)[3] = (val >> 24);
01765 ((unsigned char *)dst)[4] = (val >> 32);
01766 ((unsigned char *)dst)[5] = (val >> 40);
01767 ((unsigned char *)dst)[6] = (val >> 48);
01768 ((unsigned char *)dst)[7] = (val >> 56);
01769 }
01770 #endif
01771 #else
01772 ((unsigned char *)dst)[0] = val;
01773 ((unsigned char *)dst)[1] = (val >> 8);
01774 ((unsigned char *)dst)[2] = (val >> 16);
01775 ((unsigned char *)dst)[3] = (val >> 24);
01776 ((unsigned char *)dst)[4] = (val >> 32);
01777 ((unsigned char *)dst)[5] = (val >> 40);
01778 ((unsigned char *)dst)[6] = (val >> 48);
01779 ((unsigned char *)dst)[7] = (val >> 56);
01780 #endif
01781 }
01782
01790 static SPH_INLINE void
01791 sph_enc64le_aligned(void *dst, sph_u64 val)
01792 {
01793 #if SPH_LITTLE_ENDIAN
01794 *(sph_u64 *)dst = val;
01795 #elif SPH_BIG_ENDIAN
01796 *(sph_u64 *)dst = sph_bswap64(val);
01797 #else
01798 ((unsigned char *)dst)[0] = val;
01799 ((unsigned char *)dst)[1] = (val >> 8);
01800 ((unsigned char *)dst)[2] = (val >> 16);
01801 ((unsigned char *)dst)[3] = (val >> 24);
01802 ((unsigned char *)dst)[4] = (val >> 32);
01803 ((unsigned char *)dst)[5] = (val >> 40);
01804 ((unsigned char *)dst)[6] = (val >> 48);
01805 ((unsigned char *)dst)[7] = (val >> 56);
01806 #endif
01807 }
01808
01815 static SPH_INLINE sph_u64
01816 sph_dec64le(const void *src)
01817 {
01818 #if defined SPH_UPTR
01819 #if SPH_UNALIGNED
01820 #if SPH_BIG_ENDIAN
01821 return sph_bswap64(*(const sph_u64 *)src);
01822 #else
01823 return *(const sph_u64 *)src;
01824 #endif
01825 #else
01826 if (((SPH_UPTR)src & 7) == 0) {
01827 #if SPH_BIG_ENDIAN
01828 #if SPH_SPARCV9_GCC_64 && !SPH_NO_ASM
01829 sph_u64 tmp;
01830
01831 __asm__ __volatile__ (
01832 "ldxa [%1]0x88,%0" : "=r" (tmp) : "r" (src));
01833 return tmp;
01834 #else
01835 return sph_bswap64(*(const sph_u64 *)src);
01836 #endif
01837 #else
01838 return *(const sph_u64 *)src;
01839 #endif
01840 } else {
01841 return (sph_u64)(((const unsigned char *)src)[0])
01842 | ((sph_u64)(((const unsigned char *)src)[1]) << 8)
01843 | ((sph_u64)(((const unsigned char *)src)[2]) << 16)
01844 | ((sph_u64)(((const unsigned char *)src)[3]) << 24)
01845 | ((sph_u64)(((const unsigned char *)src)[4]) << 32)
01846 | ((sph_u64)(((const unsigned char *)src)[5]) << 40)
01847 | ((sph_u64)(((const unsigned char *)src)[6]) << 48)
01848 | ((sph_u64)(((const unsigned char *)src)[7]) << 56);
01849 }
01850 #endif
01851 #else
01852 return (sph_u64)(((const unsigned char *)src)[0])
01853 | ((sph_u64)(((const unsigned char *)src)[1]) << 8)
01854 | ((sph_u64)(((const unsigned char *)src)[2]) << 16)
01855 | ((sph_u64)(((const unsigned char *)src)[3]) << 24)
01856 | ((sph_u64)(((const unsigned char *)src)[4]) << 32)
01857 | ((sph_u64)(((const unsigned char *)src)[5]) << 40)
01858 | ((sph_u64)(((const unsigned char *)src)[6]) << 48)
01859 | ((sph_u64)(((const unsigned char *)src)[7]) << 56);
01860 #endif
01861 }
01862
01870 static SPH_INLINE sph_u64
01871 sph_dec64le_aligned(const void *src)
01872 {
01873 #if SPH_LITTLE_ENDIAN
01874 return *(const sph_u64 *)src;
01875 #elif SPH_BIG_ENDIAN
01876 #if SPH_SPARCV9_GCC_64 && !SPH_NO_ASM
01877 sph_u64 tmp;
01878
01879 __asm__ __volatile__ ("ldxa [%1]0x88,%0" : "=r" (tmp) : "r" (src));
01880 return tmp;
01881 #else
01882 return sph_bswap64(*(const sph_u64 *)src);
01883 #endif
01884 #else
01885 return (sph_u64)(((const unsigned char *)src)[0])
01886 | ((sph_u64)(((const unsigned char *)src)[1]) << 8)
01887 | ((sph_u64)(((const unsigned char *)src)[2]) << 16)
01888 | ((sph_u64)(((const unsigned char *)src)[3]) << 24)
01889 | ((sph_u64)(((const unsigned char *)src)[4]) << 32)
01890 | ((sph_u64)(((const unsigned char *)src)[5]) << 40)
01891 | ((sph_u64)(((const unsigned char *)src)[6]) << 48)
01892 | ((sph_u64)(((const unsigned char *)src)[7]) << 56);
01893 #endif
01894 }
01895
01896 #endif
01897
01898 #endif
01899
01900 #endif