#include <string.h>
-#ifdef OPENSSL_IA32_SSE2
-# ifdef __MMX__
-# ifdef __SSE2__
-# define __GOST3411_HAS_SSE2__
-# endif
+#ifdef __SSE2__
+# define __GOST3411_HAS_SSE2__
+# if !defined(__x86_64__) && !defined(__e2k__)
+/*
+ * x86-64 bit Linux and Windows ABIs provide malloc function that returns
+ * 16-byte alignment memory buffers required by SSE load/store instructions.
+ * Other platforms require special trick for proper gost2012_hash_ctx structure
+ * allocation. It will be easier to switch to unaligned loadu/storeu memory
+ * access instructions in this case.
+ */
+# define UNALIGNED_SIMD_ACCESS
+# pragma message "Use unaligned SIMD memory access"
# endif
#endif
#ifndef L_ENDIAN
# define __GOST3411_BIG_ENDIAN__
#endif
+
#if defined __GOST3411_HAS_SSE2__
# include "gosthash2012_sse2.h"
#else