diff --git a/Android.mk b/Android.mk index 6ed2295f..4f2cfa92 100644 --- a/Android.mk +++ b/Android.mk @@ -15,7 +15,6 @@ LOCAL_SRC_FILES := \ src/dec/webp.c \ src/dsp/cpu.c \ src/dsp/dec.c \ - src/dsp/dec_neon.c \ src/dsp/dec_sse2.c \ src/dsp/enc.c \ src/dsp/enc_sse2.c \ @@ -58,7 +57,10 @@ LOCAL_CFLAGS := -Wall -DANDROID -DHAVE_MALLOC_H -DHAVE_PTHREAD \ LOCAL_C_INCLUDES += $(LOCAL_PATH)/src ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) - LOCAL_ARM_NEON := true + # Setting LOCAL_ARM_NEON will enable -mfpu=neon which may cause illegal + # instructions to be generated for armv7a code. Instead target the neon code + # specifically. + LOCAL_SRC_FILES += src/dsp/dec_neon.c.neon endif LOCAL_STATIC_LIBRARIES := cpufeatures diff --git a/src/dsp/cpu.c b/src/dsp/cpu.c index 57f49441..02287344 100644 --- a/src/dsp/cpu.c +++ b/src/dsp/cpu.c @@ -57,7 +57,7 @@ static int x86CPUInfo(CPUFeature feature) { return 0; } VP8CPUInfo VP8GetCPUInfo = x86CPUInfo; -#elif defined(__ANDROID__) +#elif defined(WEBP_ANDROID_NEON) static int AndroidCPUInfo(CPUFeature feature) { const AndroidCpuFamily cpu_family = android_getCpuFamily(); const uint64_t cpu_features = android_getCpuFeatures(); diff --git a/src/dsp/dec.c b/src/dsp/dec.c index 4b4ce5fd..9ae7b6fa 100644 --- a/src/dsp/dec.c +++ b/src/dsp/dec.c @@ -719,7 +719,7 @@ void VP8DspInit(void) { if (VP8GetCPUInfo(kSSE2)) { VP8DspInitSSE2(); } -#elif defined(__GNUC__) && defined(__ARM_NEON__) +#elif defined(WEBP_USE_NEON) if (VP8GetCPUInfo(kNEON)) { VP8DspInitNEON(); } diff --git a/src/dsp/dec_neon.c b/src/dsp/dec_neon.c index 32c8ad6c..ec824b79 100644 --- a/src/dsp/dec_neon.c +++ b/src/dsp/dec_neon.c @@ -10,7 +10,9 @@ // Authors: Somnath Banerjee (somnath@google.com) // Johann Koenig (johannkoenig@google.com) -#if defined(__GNUC__) && defined(__ARM_NEON__) +#include "./dsp.h" + +#if defined(WEBP_USE_NEON) #include "../dec/vp8i.h" @@ -324,4 +326,4 @@ void VP8DspInitNEON(void) { } // extern "C" #endif -#endif // __GNUC__ && __ARM_NEON__ +#endif // WEBP_USE_NEON diff --git a/src/dsp/dsp.h b/src/dsp/dsp.h index 63514c7a..db9c1455 100644 --- a/src/dsp/dsp.h +++ b/src/dsp/dsp.h @@ -29,6 +29,14 @@ extern "C" { #define WEBP_USE_SSE2 #endif +#if defined(__ANDROID__) && defined(__ARM_ARCH_7A__) +#define WEBP_ANDROID_NEON // Android targets that might support NEON +#endif + +#if defined(__ARM_NEON__) || defined(WEBP_ANDROID_NEON) +#define WEBP_USE_NEON +#endif + typedef enum { kSSE2, kSSE3,