OSDN Git Service

Fix AVX2 support
authorStarg <starg@users.osdn.me>
Fri, 23 Feb 2018 15:15:29 +0000 (00:15 +0900)
committerStarg <starg@users.osdn.me>
Fri, 23 Feb 2018 15:15:29 +0000 (00:15 +0900)
CMakeLists.txt
timidity/optcode.h
timidity/resample.c

index 5e25f92..3f6918f 100644 (file)
@@ -3,6 +3,8 @@ cmake_minimum_required(VERSION 3.9)
 
 project(timidity41)
 
+set(TIM41_USE_AVX2 FALSE CACHE BOOL "Enable use of Intel AVX2 enhanced instructions")
+
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/Debug/bin")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release/bin")
 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_BINARY_DIR}/RelWithDebInfo/bin")
@@ -117,8 +119,19 @@ add_definitions(
     -D_CRT_SECURE_NO_WARNINGS
 )
 
+if(TIM41_USE_AVX2)
+    add_definitions(-DUSE_AVX2)
+else()
+    add_definitions(-DUSE_SSE42)
+endif()
+
 if(MSVC)
     add_compile_options(/W4 /Zi /GS /fp:fast /permissive- /MP /Qspectre)
+    
+    if(TIM41_USE_AVX2)
+        add_compile_options(/arch:AVX2)
+    endif()
+    
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /std:c++17")
 
     set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /GL /guard:cf")
@@ -136,7 +149,14 @@ if(MSVC)
         -DSTDOUT_FILENO=1
     )
 else()
-    add_compile_options(-Wall -Wextra -ffast-math -msse4.2)
+    add_compile_options(-Wall -Wextra -ffast-math)
+
+    if(TIM41_USE_AVX2)
+        add_compile_options(-mavx2)
+    else()
+        add_compile_options(-msse4.2)
+    endif()
+
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
     set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto")
     set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
index 075a51e..0d54c87 100644 (file)
@@ -117,12 +117,12 @@ AVX2
 #undef USE_PENTIUM_4
 #endif
 
-#define USE_SSE // \83e\83X\83g\97p
-#define USE_SSE2 // \83e\83X\83g\97p
-#define USE_SSE3 // \83e\83X\83g\97p
-#define USE_SSSE3 // \83e\83X\83g\97p
-#define USE_SSE41 // \83e\83X\83g\97p
-#define USE_SSE42 // \83e\83X\83g\97p
+//#define USE_SSE // \83e\83X\83g\97p
+//#define USE_SSE2 // \83e\83X\83g\97p
+//#define USE_SSE3 // \83e\83X\83g\97p
+//#define USE_SSSE3 // \83e\83X\83g\97p
+//#define USE_SSE41 // \83e\83X\83g\97p
+//#define USE_SSE42 // \83e\83X\83g\97p
 //#define USE_AVX // \83e\83X\83g\97p
 //#define USE_AVX2 // \83e\83X\83g\97p
 
@@ -757,8 +757,8 @@ LSU : Unalignment (use loadu/storeu
 #define MM_FMA3_PD(v00, v01, v10, v11, v20, v21) _mm_fmadd_pd(v20, v21, _mm_fmadd_pd(v10, v11, _mm_mul_pd(v00, v01)) )
 #define MM_FMA4_PD(v00, v01, v10, v11, v20, v21, v30, v31) _mm_add_pd(\
        _mm_fmadd_pd(v30, v31, _mm_mul_pd(v20, v21)), _mm_fmadd_pd(v10, v11, _mm_mul_pd(v00, v01)) )
-#define MM_FMA5_PD(v00, v01, v10, v11, v20, v21, v30, v31, v40, v41) _mm_fmadd_pd(v40, v41, \
-       _mm_fmadd_pd(v30, v31, _mm_mul_pd(v20, v21)), _mm_fmadd_pd(v10, v11, _mm_mul_pd(v00, v01)) )
+#define MM_FMA5_PD(v00, v01, v10, v11, v20, v21, v30, v31, v40, v41) _mm_add_pd(_mm_fmadd_pd(v40, v41, \
+       _mm_fmadd_pd(v30, v31, _mm_mul_pd(v20, v21))), _mm_fmadd_pd(v10, v11, _mm_mul_pd(v00, v01)) )
 #define MM_FMA6_PD(v00, v01, v10, v11, v20, v21, v30, v31, v40, v41, v50, v51) _mm_add_pd(\
        _mm_fmadd_pd(v50, v51, _mm_fmadd_pd(v40, v41, _mm_mul_pd(v30, v31))), \
        _mm_fmadd_pd(v20, v21, _mm_fmadd_pd(v10, v11, _mm_mul_pd(v00, v01))) )
index 967a930..7ef2a06 100644 (file)
@@ -1570,7 +1570,7 @@ static DATA_T resample_gauss(const sample_t *src, splen_t ofs, resample_rec_t *r
                double tmp;
                for (i = 0; i < gauss_n; i += 8){
 #if (USE_X86_EXT_INTRIN >= 9)
-                       __m256i vec32 = _mm256_cvtepi16_epi32(_mm256_loadu_si256((__m128i *)&sptr[i])); // low i16*8 > i32*8
+                       __m256i vec32 = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i *)&sptr[i])); // low i16*8 > i32*8
                        __m128i vec1 = _mm256_extracti128_si256(vec32, 0x0);
                        __m128i vec2 = _mm256_extracti128_si256(vec32, 0x1);
 #else
@@ -2901,7 +2901,7 @@ static DATA_T resample_lanczos(const sample_t *src, splen_t ofs, resample_rec_t
                __m128d sum1, sum2;     
                for (i = 0; i < width; i += 8){
 #if (USE_X86_EXT_INTRIN >= 9)
-                       __m256i vec32 = _mm256_cvtepi16_epi32(_mm256_loadu_si256((__m128i *)&v1[i])); // low i16*8 > i32*8
+                       __m256i vec32 = _mm256_cvtepi16_epi32(_mm_loadu_si128((__m128i *)&v1[i])); // low i16*8 > i32*8
                        __m128i vec1 = _mm256_extracti128_si256(vec32, 0x0);
                        __m128i vec2 = _mm256_extracti128_si256(vec32, 0x1);
 #else