diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2015-05-14 12:39:39 +0300 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2015-05-14 14:10:28 +0300 |
commit | 8d7de4dbf7732c6eb9e9853ad7c19c89075ace6f (patch) | |
tree | e6edfaad820279019bb0e2b705cbaee9086802c4 /cipher/poly1305-internal.h | |
parent | b65e9e71d5ee992db5c96793c6af999545daad28 (diff) | |
download | libgcrypt-8d7de4dbf7732c6eb9e9853ad7c19c89075ace6f.tar.gz |
Enable AMD64 Poly1305 implementations on WIN64
* cipher/poly1305-avx2-amd64.S: Enable when
HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS defined.
(ELF): New macro to mask lines with ELF specific commands.
* cipher/poly1305-sse2-amd64.S: Enable when
HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS defined.
(ELF): New macro to mask lines with ELF specific commands.
* cipher/poly1305-internal.h (POLY1305_SYSV_FUNC_ABI): New.
(POLY1305_USE_SSE2, POLY1305_USE_AVX2): Enable when
HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS defined.
(OPS_FUNC_ABI): New.
(poly1305_ops_t): Use OPS_FUNC_ABI.
* cipher/poly1305.c (_gcry_poly1305_amd64_sse2_init_ext)
(_gcry_poly1305_amd64_sse2_finish_ext)
(_gcry_poly1305_amd64_sse2_blocks, _gcry_poly1305_amd64_avx2_init_ext)
(_gcry_poly1305_amd64_avx2_finish_ext)
(_gcry_poly1305_amd64_avx2_blocks, _gcry_poly1305_armv7_neon_init_ext)
(_gcry_poly1305_armv7_neon_finish_ext)
(_gcry_poly1305_armv7_neon_blocks, poly1305_init_ext_ref32)
(poly1305_blocks_ref32, poly1305_finish_ext_ref32)
(poly1305_init_ext_ref8, poly1305_blocks_ref8)
(poly1305_finish_ext_ref8): Use OPS_FUNC_ABI.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'cipher/poly1305-internal.h')
-rw-r--r-- | cipher/poly1305-internal.h | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/cipher/poly1305-internal.h b/cipher/poly1305-internal.h index dfc0c048..bcbe5df7 100644 --- a/cipher/poly1305-internal.h +++ b/cipher/poly1305-internal.h @@ -44,24 +44,30 @@ #define POLY1305_REF_ALIGNMENT sizeof(void *) +#undef POLY1305_SYSV_FUNC_ABI + /* POLY1305_USE_SSE2 indicates whether to compile with AMD64 SSE2 code. */ #undef POLY1305_USE_SSE2 -#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) +#if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ + defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) # define POLY1305_USE_SSE2 1 # define POLY1305_SSE2_BLOCKSIZE 32 # define POLY1305_SSE2_STATESIZE 248 # define POLY1305_SSE2_ALIGNMENT 16 +# define POLY1305_SYSV_FUNC_ABI 1 #endif /* POLY1305_USE_AVX2 indicates whether to compile with AMD64 AVX2 code. */ #undef POLY1305_USE_AVX2 -#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \ +#if defined(__x86_64__) && (defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) || \ + defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS)) && \ defined(ENABLE_AVX2_SUPPORT) # define POLY1305_USE_AVX2 1 # define POLY1305_AVX2_BLOCKSIZE 64 # define POLY1305_AVX2_STATESIZE 328 # define POLY1305_AVX2_ALIGNMENT 32 +# define POLY1305_SYSV_FUNC_ABI 1 #endif @@ -112,6 +118,17 @@ #endif +/* Assembly implementations use SystemV ABI, ABI conversion and additional + * stack to store XMM6-XMM15 needed on Win64. */ +#undef OPS_FUNC_ABI +#if defined(POLY1305_SYSV_FUNC_ABI) && \ + defined(HAVE_COMPATIBLE_GCC_WIN64_PLATFORM_AS) +# define OPS_FUNC_ABI __attribute__((sysv_abi)) +#else +# define OPS_FUNC_ABI +#endif + + typedef struct poly1305_key_s { byte b[POLY1305_KEYLEN]; @@ -121,10 +138,10 @@ typedef struct poly1305_key_s typedef struct poly1305_ops_s { size_t block_size; - void (*init_ext) (void *ctx, const poly1305_key_t * key); - unsigned int (*blocks) (void *ctx, const byte * m, size_t bytes); + void (*init_ext) (void *ctx, const poly1305_key_t * key) OPS_FUNC_ABI; + unsigned int (*blocks) (void *ctx, const byte * m, size_t bytes) OPS_FUNC_ABI; unsigned int (*finish_ext) (void *ctx, const byte * m, size_t remaining, - byte mac[POLY1305_TAGLEN]); + byte mac[POLY1305_TAGLEN]) OPS_FUNC_ABI; } poly1305_ops_t; |