[asm] Share portability macros and restrict ASM further

Move portability macros to `lib/common/portability_macros.h`. This file
only contains platform/feature detection (e.g. 0/1 macros). This file is
shared between C and ASM code, so it cannot include any C code.

Rename `HUF_` ASM macros to be `ZSTD_` prefixed, and move to the new
header.

Restrict `ZSTD_ASM_SUPPORTED` to `__GNUC__`, because we need the GAS
assembler.

Finally, only include the ASM code if we are actually going to use it.
This disables it on all Windows platforms, which should resolve the
problem brought up in Issue #2789.
This commit is contained in:
Nick Terrell
2021-12-02 16:58:04 -08:00
parent 647c1b6615
commit c284569457
8 changed files with 155 additions and 103 deletions
+12 -36
View File
@@ -43,31 +43,7 @@
#error "Cannot force the use of the X1 and X2 decoders at the same time!"
#endif
/* Only use assembly on Linux / MacOS.
* Disable when MSAN is enabled.
*/
#if defined(__linux__) || defined(__linux) || defined(__APPLE__)
# if ZSTD_MEMORY_SANITIZER
# define HUF_ASM_SUPPORTED 0
# elif ZSTD_DATAFLOW_SANITIZER
# define HUF_ASM_SUPPORTED 0
# else
# define HUF_ASM_SUPPORTED 1
# endif
#else
# define HUF_ASM_SUPPORTED 0
#endif
/* HUF_DISABLE_ASM: Disables all ASM implementations. */
#if !defined(HUF_DISABLE_ASM) && \
HUF_ASM_SUPPORTED && \
defined(__x86_64__) && (DYNAMIC_BMI2 || defined(__BMI2__))
# define HUF_ENABLE_ASM_X86_64_BMI2 1
#else
# define HUF_ENABLE_ASM_X86_64_BMI2 0
#endif
#if HUF_ENABLE_ASM_X86_64_BMI2 && DYNAMIC_BMI2
#if ZSTD_ENABLE_ASM_X86_64_BMI2 && DYNAMIC_BMI2
# define HUF_ASM_X86_64_BMI2_ATTRS BMI2_TARGET_ATTRIBUTE
#else
# define HUF_ASM_X86_64_BMI2_ATTRS
@@ -80,13 +56,13 @@
#endif
#define HUF_ASM_DECL HUF_EXTERN_C
#if DYNAMIC_BMI2 || (HUF_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__))
#if DYNAMIC_BMI2 || (ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__))
# define HUF_NEED_BMI2_FUNCTION 1
#else
# define HUF_NEED_BMI2_FUNCTION 0
#endif
#if !(HUF_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__))
#if !(ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__))
# define HUF_NEED_DEFAULT_FUNCTION 1
#else
# define HUF_NEED_DEFAULT_FUNCTION 0
@@ -162,7 +138,7 @@ static DTableDesc HUF_getDTableDesc(const HUF_DTable* table)
return dtd;
}
#if HUF_ENABLE_ASM_X86_64_BMI2
#if ZSTD_ENABLE_ASM_X86_64_BMI2
static size_t HUF_initDStream(BYTE const* ip) {
BYTE const lastByte = ip[7];
@@ -685,7 +661,7 @@ size_t HUF_decompress4X1_usingDTable_internal_default(void* dst, size_t dstSize,
}
#endif
#if HUF_ENABLE_ASM_X86_64_BMI2
#if ZSTD_ENABLE_ASM_X86_64_BMI2
HUF_ASM_DECL void HUF_decompress4X1_usingDTable_internal_bmi2_asm_loop(HUF_DecompressAsmArgs* args);
@@ -741,7 +717,7 @@ HUF_decompress4X1_usingDTable_internal_bmi2_asm(
/* decoded size */
return dstSize;
}
#endif /* HUF_ENABLE_ASM_X86_64_BMI2 */
#endif /* ZSTD_ENABLE_ASM_X86_64_BMI2 */
typedef size_t (*HUF_decompress_usingDTable_t)(void *dst, size_t dstSize,
const void *cSrc,
@@ -755,7 +731,7 @@ static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize,
{
#if DYNAMIC_BMI2
if (bmi2) {
# if HUF_ENABLE_ASM_X86_64_BMI2
# if ZSTD_ENABLE_ASM_X86_64_BMI2
return HUF_decompress4X1_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable);
# else
return HUF_decompress4X1_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable);
@@ -765,7 +741,7 @@ static size_t HUF_decompress4X1_usingDTable_internal(void* dst, size_t dstSize,
(void)bmi2;
#endif
#if HUF_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)
#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)
return HUF_decompress4X1_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable);
#else
return HUF_decompress4X1_usingDTable_internal_default(dst, dstSize, cSrc, cSrcSize, DTable);
@@ -1401,7 +1377,7 @@ size_t HUF_decompress4X2_usingDTable_internal_default(void* dst, size_t dstSize,
}
#endif
#if HUF_ENABLE_ASM_X86_64_BMI2
#if ZSTD_ENABLE_ASM_X86_64_BMI2
HUF_ASM_DECL void HUF_decompress4X2_usingDTable_internal_bmi2_asm_loop(HUF_DecompressAsmArgs* args);
@@ -1453,14 +1429,14 @@ HUF_decompress4X2_usingDTable_internal_bmi2_asm(
/* decoded size */
return dstSize;
}
#endif /* HUF_ENABLE_ASM_X86_64_BMI2 */
#endif /* ZSTD_ENABLE_ASM_X86_64_BMI2 */
static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize, void const* cSrc,
size_t cSrcSize, HUF_DTable const* DTable, int bmi2)
{
#if DYNAMIC_BMI2
if (bmi2) {
# if HUF_ENABLE_ASM_X86_64_BMI2
# if ZSTD_ENABLE_ASM_X86_64_BMI2
return HUF_decompress4X2_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable);
# else
return HUF_decompress4X2_usingDTable_internal_bmi2(dst, dstSize, cSrc, cSrcSize, DTable);
@@ -1470,7 +1446,7 @@ static size_t HUF_decompress4X2_usingDTable_internal(void* dst, size_t dstSize,
(void)bmi2;
#endif
#if HUF_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)
#if ZSTD_ENABLE_ASM_X86_64_BMI2 && defined(__BMI2__)
return HUF_decompress4X2_usingDTable_internal_bmi2_asm(dst, dstSize, cSrc, cSrcSize, DTable);
#else
return HUF_decompress4X2_usingDTable_internal_default(dst, dstSize, cSrc, cSrcSize, DTable);
+3 -1
View File
@@ -1,4 +1,6 @@
#if !defined(HUF_DISABLE_ASM) && defined(__x86_64__)
#include "../common/portability_macros.h"
#if ZSTD_ENABLE_ASM_X86_64_BMI2
/* Stack marking
* ref: https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart