Browse Source
bpo-40302: Add pycore_byteswap.h header file (GH-19552)
bpo-40302: Add pycore_byteswap.h header file (GH-19552)
Add a new internal pycore_byteswap.h header file with the following functions: * _Py_bswap16() * _Py_bswap32() * _Py_bswap64() Use these functions in _ctypes, sha256 and sha512 modules, and also use in the UTF-32 encoder. sha256, sha512 and _ctypes modules are now built with the internal C API.pull/19573/head
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 219 additions and 112 deletions
-
89Include/internal/pycore_byteswap.h
-
8Include/pyport.h
-
8Lib/test/test_capi.py
-
1Makefile.pre.in
-
4Modules/Setup
-
101Modules/_ctypes/cfield.c
-
32Modules/_testinternalcapi.c
-
17Modules/sha256module.c
-
27Modules/sha512module.c
-
36Objects/stringlib/codecs.h
-
1PCbuild/pythoncore.vcxproj
-
3PCbuild/pythoncore.vcxproj.filters
-
4setup.py
@ -0,0 +1,89 @@ |
|||
/* Bytes swap functions, reverse order of bytes: |
|||
|
|||
- _Py_bswap16(uint16_t) |
|||
- _Py_bswap32(uint32_t) |
|||
- _Py_bswap64(uint64_t) |
|||
*/ |
|||
|
|||
#ifndef Py_INTERNAL_BSWAP_H |
|||
#define Py_INTERNAL_BSWAP_H |
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
#ifndef Py_BUILD_CORE |
|||
# error "this header requires Py_BUILD_CORE define" |
|||
#endif |
|||
|
|||
#if defined(__clang__) || \ |
|||
(defined(__GNUC__) && \ |
|||
((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) |
|||
/* __builtin_bswap16() is available since GCC 4.8, |
|||
__builtin_bswap32() is available since GCC 4.3, |
|||
__builtin_bswap64() is available since GCC 4.3. */ |
|||
# define _PY_HAVE_BUILTIN_BSWAP |
|||
#endif |
|||
|
|||
#ifdef _MSC_VER |
|||
/* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ |
|||
# include <intrin.h> |
|||
#endif |
|||
|
|||
static inline uint16_t |
|||
_Py_bswap16(uint16_t word) |
|||
{ |
|||
#ifdef _PY_HAVE_BUILTIN_BSWAP |
|||
return __builtin_bswap16(word); |
|||
#elif defined(_MSC_VER) |
|||
Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); |
|||
return _byteswap_ushort(word); |
|||
#else |
|||
// Portable implementation which doesn't rely on circular bit shift |
|||
return ( ((word & UINT16_C(0x00FF)) << 8) |
|||
| ((word & UINT16_C(0xFF00)) >> 8)); |
|||
#endif |
|||
} |
|||
|
|||
static inline uint32_t |
|||
_Py_bswap32(uint32_t word) |
|||
{ |
|||
#ifdef _PY_HAVE_BUILTIN_BSWAP |
|||
return __builtin_bswap32(word); |
|||
#elif defined(_MSC_VER) |
|||
Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); |
|||
return _byteswap_ulong(word); |
|||
#else |
|||
// Portable implementation which doesn't rely on circular bit shift |
|||
return ( ((word & UINT32_C(0x000000FF)) << 24) |
|||
| ((word & UINT32_C(0x0000FF00)) << 8) |
|||
| ((word & UINT32_C(0x00FF0000)) >> 8) |
|||
| ((word & UINT32_C(0xFF000000)) >> 24)); |
|||
#endif |
|||
} |
|||
|
|||
static inline uint64_t |
|||
_Py_bswap64(uint64_t word) |
|||
{ |
|||
#ifdef _PY_HAVE_BUILTIN_BSWAP |
|||
return __builtin_bswap64(word); |
|||
#elif defined(_MSC_VER) |
|||
return _byteswap_uint64(word); |
|||
#else |
|||
// Portable implementation which doesn't rely on circular bit shift |
|||
return ( ((word & UINT64_C(0x00000000000000FF)) << 56) |
|||
| ((word & UINT64_C(0x000000000000FF00)) << 40) |
|||
| ((word & UINT64_C(0x0000000000FF0000)) << 24) |
|||
| ((word & UINT64_C(0x00000000FF000000)) << 8) |
|||
| ((word & UINT64_C(0x000000FF00000000)) >> 8) |
|||
| ((word & UINT64_C(0x0000FF0000000000)) >> 24) |
|||
| ((word & UINT64_C(0x00FF000000000000)) >> 40) |
|||
| ((word & UINT64_C(0xFF00000000000000)) >> 56)); |
|||
#endif |
|||
} |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
#endif /* !Py_INTERNAL_BSWAP_H */ |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue