From f6be2f3c8749aa50ff3ef97e49bfbddeb8fb5df3 Mon Sep 17 00:00:00 2001 From: Johann Date: Thu, 25 Sep 2014 09:30:28 -0700 Subject: [PATCH] Clarify GCC version check The version check was incorrectly matching some versions of clang which reported as gcc 4.2 Change-Id: I686d3576e71883fe1463206b56ab5e2aa9bb68a8 --- vp8/common/arm/neon/loopfilter_neon.c | 37 ++++--- .../arm/neon/loopfiltersimpleverticaledge_neon.c | 123 +++++++++++---------- vpx_ports/arm.h | 6 + 3 files changed, 87 insertions(+), 79 deletions(-) diff --git a/vp8/common/arm/neon/loopfilter_neon.c b/vp8/common/arm/neon/loopfilter_neon.c index 0bec7fb..9d6807a 100644 --- a/vp8/common/arm/neon/loopfilter_neon.c +++ b/vp8/common/arm/neon/loopfilter_neon.c @@ -10,6 +10,7 @@ #include #include "./vpx_config.h" +#include "vpx_ports/arm.h" static INLINE void vp8_loop_filter_neon( uint8x16_t qblimit, // flimit @@ -253,23 +254,7 @@ void vp8_loop_filter_horizontal_edge_uv_neon( static INLINE void write_4x8(unsigned char *dst, int pitch, const uint8x8x4_t result) { -#if (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) - vst4_lane_u8(dst, result, 0); - dst += pitch; - vst4_lane_u8(dst, result, 1); - dst += pitch; - vst4_lane_u8(dst, result, 2); - dst += pitch; - vst4_lane_u8(dst, result, 3); - dst += pitch; - vst4_lane_u8(dst, result, 4); - dst += pitch; - vst4_lane_u8(dst, result, 5); - dst += pitch; - vst4_lane_u8(dst, result, 6); - dst += pitch; - vst4_lane_u8(dst, result, 7); -#else +#ifdef VPX_INCOMPATIBLE_GCC /* * uint8x8x4_t result 00 01 02 03 | 04 05 06 07 @@ -316,7 +301,23 @@ static INLINE void write_4x8(unsigned char *dst, int pitch, vst1_lane_u32((uint32_t *)dst, x_2_6, 1); dst += pitch; vst1_lane_u32((uint32_t *)dst, x_3_7, 1); -#endif +#else + vst4_lane_u8(dst, result, 0); + dst += pitch; + vst4_lane_u8(dst, result, 1); + dst += pitch; + vst4_lane_u8(dst, result, 2); + dst += pitch; + vst4_lane_u8(dst, result, 3); + dst += pitch; + vst4_lane_u8(dst, result, 4); + dst += pitch; + vst4_lane_u8(dst, result, 5); + dst += pitch; + vst4_lane_u8(dst, result, 6); + dst += pitch; + vst4_lane_u8(dst, result, 7); +#endif // VPX_INCOMPATIBLE_GCC } void vp8_loop_filter_vertical_edge_y_neon( diff --git a/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c b/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c index d5178bb..e1c8609 100644 --- a/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c +++ b/vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c @@ -10,45 +10,9 @@ #include #include "./vpx_config.h" +#include "vpx_ports/arm.h" -#if (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) -static INLINE void write_2x8(unsigned char *dst, int pitch, - const uint8x8x2_t result, - const uint8x8x2_t result2) { - vst2_lane_u8(dst, result, 0); - dst += pitch; - vst2_lane_u8(dst, result, 1); - dst += pitch; - vst2_lane_u8(dst, result, 2); - dst += pitch; - vst2_lane_u8(dst, result, 3); - dst += pitch; - vst2_lane_u8(dst, result, 4); - dst += pitch; - vst2_lane_u8(dst, result, 5); - dst += pitch; - vst2_lane_u8(dst, result, 6); - dst += pitch; - vst2_lane_u8(dst, result, 7); - dst += pitch; - - vst2_lane_u8(dst, result2, 0); - dst += pitch; - vst2_lane_u8(dst, result2, 1); - dst += pitch; - vst2_lane_u8(dst, result2, 2); - dst += pitch; - vst2_lane_u8(dst, result2, 3); - dst += pitch; - vst2_lane_u8(dst, result2, 4); - dst += pitch; - vst2_lane_u8(dst, result2, 5); - dst += pitch; - vst2_lane_u8(dst, result2, 6); - dst += pitch; - vst2_lane_u8(dst, result2, 7); -} -#else +#ifdef VPX_INCOMPATIBLE_GCC static INLINE void write_2x4(unsigned char *dst, int pitch, const uint8x8x2_t result) { /* @@ -88,30 +52,47 @@ static INLINE void write_2x8(unsigned char *dst, int pitch, dst += pitch * 8; write_2x4(dst, pitch, result2); } -#endif - +#else +static INLINE void write_2x8(unsigned char *dst, int pitch, + const uint8x8x2_t result, + const uint8x8x2_t result2) { + vst2_lane_u8(dst, result, 0); + dst += pitch; + vst2_lane_u8(dst, result, 1); + dst += pitch; + vst2_lane_u8(dst, result, 2); + dst += pitch; + vst2_lane_u8(dst, result, 3); + dst += pitch; + vst2_lane_u8(dst, result, 4); + dst += pitch; + vst2_lane_u8(dst, result, 5); + dst += pitch; + vst2_lane_u8(dst, result, 6); + dst += pitch; + vst2_lane_u8(dst, result, 7); + dst += pitch; -#if (__GNUC__ == 4 && (__GNUC_MINOR__ >= 7)) -static INLINE -uint8x8x4_t read_4x8(unsigned char *src, int pitch, uint8x8x4_t x) { - x = vld4_lane_u8(src, x, 0); - src += pitch; - x = vld4_lane_u8(src, x, 1); - src += pitch; - x = vld4_lane_u8(src, x, 2); - src += pitch; - x = vld4_lane_u8(src, x, 3); - src += pitch; - x = vld4_lane_u8(src, x, 4); - src += pitch; - x = vld4_lane_u8(src, x, 5); - src += pitch; - x = vld4_lane_u8(src, x, 6); - src += pitch; - x = vld4_lane_u8(src, x, 7); - return x; + vst2_lane_u8(dst, result2, 0); + dst += pitch; + vst2_lane_u8(dst, result2, 1); + dst += pitch; + vst2_lane_u8(dst, result2, 2); + dst += pitch; + vst2_lane_u8(dst, result2, 3); + dst += pitch; + vst2_lane_u8(dst, result2, 4); + dst += pitch; + vst2_lane_u8(dst, result2, 5); + dst += pitch; + vst2_lane_u8(dst, result2, 6); + dst += pitch; + vst2_lane_u8(dst, result2, 7); } -#else +#endif // VPX_INCOMPATIBLE_GCC + + +#ifdef VPX_INCOMPATIBLE_GCC static INLINE uint8x8x4_t read_4x8(unsigned char *src, int pitch, uint8x8x4_t x) { const uint8x8_t a = vld1_u8(src); @@ -169,7 +150,27 @@ uint8x8x4_t read_4x8(unsigned char *src, int pitch, uint8x8x4_t x) { return x; } -#endif +#else +static INLINE +uint8x8x4_t read_4x8(unsigned char *src, int pitch, uint8x8x4_t x) { + x = vld4_lane_u8(src, x, 0); + src += pitch; + x = vld4_lane_u8(src, x, 1); + src += pitch; + x = vld4_lane_u8(src, x, 2); + src += pitch; + x = vld4_lane_u8(src, x, 3); + src += pitch; + x = vld4_lane_u8(src, x, 4); + src += pitch; + x = vld4_lane_u8(src, x, 5); + src += pitch; + x = vld4_lane_u8(src, x, 6); + src += pitch; + x = vld4_lane_u8(src, x, 7); + return x; +} +#endif // VPX_INCOMPATIBLE_GCC static INLINE void vp8_loop_filter_simple_vertical_edge_neon( unsigned char *s, diff --git a/vpx_ports/arm.h b/vpx_ports/arm.h index 1e4a8e2..42c98f5 100644 --- a/vpx_ports/arm.h +++ b/vpx_ports/arm.h @@ -27,6 +27,12 @@ extern "C" { int arm_cpu_caps(void); +// Earlier gcc compilers have issues with some neon intrinsics +#if !defined(__clang__) && defined(__GNUC__) && \ + __GNUC__ == 4 && __GNUC_MINOR__ <= 6 +#define VPX_INCOMPATIBLE_GCC +#endif + #ifdef __cplusplus } // extern "C" #endif -- 2.7.4