Index: dll/3rdparty/mbedtls/bignum.c =================================================================== --- dll/3rdparty/mbedtls/bignum.c (revision 72913) +++ dll/3rdparty/mbedtls/bignum.c (working copy) @@ -1090,6 +1090,49 @@ return( mbedtls_mpi_sub_mpi( X, A, &_B ) ); } +#ifdef __REACTOS__ +#ifdef _MSC_VER + +// MSVC +#define cpuid(info, x) __cpuidex(info, x, 0) + +#else + +// GCC +#if defined(__i386__) && defined(__PIC__) +/* %ebx may be the PIC register. */ +#define __cpuid(level, a, b, c, d) \ + __asm__ ("xchgl\t%%ebx, %1\n\t" \ + "cpuid\n\t" \ + "xchgl\t%%ebx, %1\n\t" \ + : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \ + : "0" (level)) +#else +#define __cpuid(level, a, b, c, d) \ + __asm__ ("cpuid\n\t" \ + : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \ + : "0" (level)) +#endif +#define cpuid(info, x) __cpuid(x, info[0], info[1], info[2], info[3]) + +#endif /* _MSC_VER */ + +#if defined(MULADDC_HUIT) && !defined(MBEDTLS_DISABLE_SSE_RUNTIMECHECK) +int isSSE2Available( ) +{ + int info[4], nIds; + cpuid(info, 0); + nIds = info[0]; + + // Detect Features + if (nIds >= 0x00000001) { + cpuid(info, 0x00000001); + return (info[3] & ((int)1 << 26)) != 0; + } + return 0; +} +#endif /* MULADDC_HUIT && !MBEDTLS_DISABLE_SSE_RUNTIMECHECK */ +#endif /* __REACTOS__ */ /* * Helper for mbedtls_mpi multiplication */ @@ -1106,6 +1149,10 @@ mbedtls_mpi_uint c = 0, t = 0; #if defined(MULADDC_HUIT) +#if !defined(MBEDTLS_DISABLE_SSE_RUNTIMECHECK) + if (isSSE2Available()) + { +#endif /* !MBEDTLS_DISABLE_SSE_RUNTIMECHECK */ for( ; i >= 8; i -= 8 ) { MULADDC_INIT @@ -1119,6 +1166,44 @@ MULADDC_CORE MULADDC_STOP } +#if !defined(MBEDTLS_DISABLE_SSE_RUNTIMECHECK) + } + else + { + for( ; i >= 16; i -= 16 ) + { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for( ; i >= 8; i -= 8 ) + { + MULADDC_INIT + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + + MULADDC_CORE MULADDC_CORE + MULADDC_CORE MULADDC_CORE + MULADDC_STOP + } + + for( ; i > 0; i-- ) + { + MULADDC_INIT + MULADDC_CORE + MULADDC_STOP + } + } +#endif /* !MBEDTLS_DISABLE_SSE_RUNTIMECHECK */ #else /* MULADDC_HUIT */ for( ; i >= 16; i -= 16 ) {