Index: source/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c |
=================================================================== |
--- source/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c (revision 263011) |
+++ source/libvpx/vp9/common/x86/vp9_subpixel_8t_intrin_avx2.c (working copy) |
@@ -32,6 +32,27 @@ |
6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14 |
}; |
+#if defined(__clang__) |
+# if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ <= 3) || \ |
+ (defined(__APPLE__) && __clang_major__ == 5 && __clang_minor__ == 0) |
+# define MM256_BROADCASTSI128_SI256(x) \ |
+ _mm_broadcastsi128_si256((__m128i const *)&(x)) |
+# else // clang > 3.3, and not 5.0 on macosx. |
+# define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x) |
+# endif // clang <= 3.3 |
+#elif defined(__GNUC__) |
+# if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 6) |
+# define MM256_BROADCASTSI128_SI256(x) \ |
+ _mm_broadcastsi128_si256((__m128i const *)&(x)) |
+# elif __GNUC__ == 4 && __GNUC_MINOR__ == 7 |
+# define MM256_BROADCASTSI128_SI256(x) _mm_broadcastsi128_si256(x) |
+# else // gcc > 4.7 |
+# define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x) |
+# endif // gcc <= 4.6 |
+#else // !(gcc || clang) |
+# define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x) |
+#endif // __clang__ |
+ |
void vp9_filter_block1d16_h8_avx2(unsigned char *src_ptr, |
unsigned int src_pixels_per_line, |
unsigned char *output_ptr, |
@@ -53,18 +74,7 @@ |
// in both lanes of 128 bit register. |
filtersReg =_mm_packs_epi16(filtersReg, filtersReg); |
// have the same data in both lanes of a 256 bit register |
-#if defined (__GNUC__) |
-#if ( __GNUC__ < 4 || (__GNUC__ == 4 && \ |
-(__GNUC_MINOR__ < 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))) |
- filtersReg32 = _mm_broadcastsi128_si256((__m128i const *)&filtersReg); |
-#elif(__GNUC__ == 4 && (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ > 0)) |
- filtersReg32 = _mm_broadcastsi128_si256(filtersReg); |
-#else |
- filtersReg32 = _mm256_broadcastsi128_si256(filtersReg); |
-#endif |
-#else |
- filtersReg32 = _mm256_broadcastsi128_si256(filtersReg); |
-#endif |
+ filtersReg32 = MM256_BROADCASTSI128_SI256(filtersReg); |
// duplicate only the first 16 bits (first and second byte) |
// across 256 bit register |
@@ -309,18 +319,7 @@ |
// same data in both lanes of 128 bit register. |
filtersReg =_mm_packs_epi16(filtersReg, filtersReg); |
// have the same data in both lanes of a 256 bit register |
-#if defined (__GNUC__) |
-#if ( __GNUC__ < 4 || (__GNUC__ == 4 && \ |
-(__GNUC_MINOR__ < 6 || (__GNUC_MINOR__ == 6 && __GNUC_PATCHLEVEL__ > 0)))) |
- filtersReg32 = _mm_broadcastsi128_si256((__m128i const *)&filtersReg); |
-#elif(__GNUC__ == 4 && (__GNUC_MINOR__ == 7 && __GNUC_PATCHLEVEL__ > 0)) |
- filtersReg32 = _mm_broadcastsi128_si256(filtersReg); |
-#else |
- filtersReg32 = _mm256_broadcastsi128_si256(filtersReg); |
-#endif |
-#else |
- filtersReg32 = _mm256_broadcastsi128_si256(filtersReg); |
-#endif |
+ filtersReg32 = MM256_BROADCASTSI128_SI256(filtersReg); |
// duplicate only the first 16 bits (first and second byte) |
// across 256 bit register |