Fix SHA ARM64 compile with MSVC compiler (GH #776)
parent
5ccbd9af6a
commit
9277d115a8
19
sha_simd.cpp
19
sha_simd.cpp
|
|
@ -45,6 +45,17 @@
|
||||||
# define EXCEPTION_EXECUTE_HANDLER 1
|
# define EXCEPTION_EXECUTE_HANDLER 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Thanks to Peter Cordes, https://stackoverflow.com/q/54016821/608639
|
||||||
|
#if (CRYPTOPP_ARM_NEON_AVAILABLE)
|
||||||
|
# ifndef PACK32x4
|
||||||
|
# if defined(_MSC_VER)
|
||||||
|
# define PACK32x4(w,x,y,z) { ((w) + (word64(x) << 32)), ((y) + (word64(z) << 32)) }
|
||||||
|
# else
|
||||||
|
# define PACK32x4(w,x,y,z) { (w), (x), (y), (z) }
|
||||||
|
# endif
|
||||||
|
# endif // PACK32x4
|
||||||
|
#endif // Microsoft workaround
|
||||||
|
|
||||||
// Clang __m128i casts
|
// Clang __m128i casts
|
||||||
#define M128_CAST(x) ((__m128i *)(void *)(x))
|
#define M128_CAST(x) ((__m128i *)(void *)(x))
|
||||||
#define CONST_M128_CAST(x) ((const __m128i *)(const void *)(x))
|
#define CONST_M128_CAST(x) ((const __m128i *)(const void *)(x))
|
||||||
|
|
@ -83,7 +94,9 @@ bool CPU_ProbeSHA1()
|
||||||
volatile bool result = true;
|
volatile bool result = true;
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
|
uint32x4_t data1 = PACK32x4(1,2,3,4);
|
||||||
|
uint32x4_t data2 = PACK32x4(5,6,7,8);
|
||||||
|
uint32x4_t data3 = PACK32x4(9,10,11,12);
|
||||||
|
|
||||||
uint32x4_t r1 = vsha1cq_u32 (data1, 0, data2);
|
uint32x4_t r1 = vsha1cq_u32 (data1, 0, data2);
|
||||||
uint32x4_t r2 = vsha1mq_u32 (data1, 0, data2);
|
uint32x4_t r2 = vsha1mq_u32 (data1, 0, data2);
|
||||||
|
|
@ -145,7 +158,9 @@ bool CPU_ProbeSHA2()
|
||||||
volatile bool result = true;
|
volatile bool result = true;
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
uint32x4_t data1 = {1,2,3,4}, data2 = {5,6,7,8}, data3 = {9,10,11,12};
|
uint32x4_t data1 = PACK32x4(1,2,3,4);
|
||||||
|
uint32x4_t data2 = PACK32x4(5,6,7,8);
|
||||||
|
uint32x4_t data3 = PACK32x4(9,10,11,12);
|
||||||
|
|
||||||
uint32x4_t r1 = vsha256hq_u32 (data1, data2, data3);
|
uint32x4_t r1 = vsha256hq_u32 (data1, data2, data3);
|
||||||
uint32x4_t r2 = vsha256h2q_u32 (data1, data2, data3);
|
uint32x4_t r2 = vsha256h2q_u32 (data1, data2, data3);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue