Index: third_party/libwebp/utils/endian_inl.h |
diff --git a/third_party/libwebp/utils/endian_inl.h b/third_party/libwebp/utils/endian_inl.h |
index 8d45ff6d8aa984a3a2245bbbd563610b742b037c..cd56c37f4d1fe2310854245e27838a19dbf98afb 100644 |
--- a/third_party/libwebp/utils/endian_inl.h |
+++ b/third_party/libwebp/utils/endian_inl.h |
@@ -16,6 +16,7 @@ |
#include "../webp/config.h" |
#endif |
+#include "../dsp/dsp.h" |
#include "../webp/types.h" |
// some endian fix (e.g.: mips-gcc doesn't define __BIG_ENDIAN__) |
@@ -34,25 +35,13 @@ |
#endif |
#if !defined(HAVE_CONFIG_H) |
-#ifdef __GNUC__ |
-# define LOCAL_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__) |
-#else |
-# define LOCAL_GCC_VERSION 0 |
-#endif // __GNUC__ |
- |
-#ifdef __clang__ |
-# define LOCAL_CLANG_VERSION ((__clang_major__ << 8) | __clang_minor__) |
-#else |
-# define LOCAL_CLANG_VERSION 0 |
-#endif // __clang__ |
- |
// clang-3.3 and gcc-4.3 have builtin functions for swap32/swap64 |
-#if LOCAL_GCC_VERSION >= 0x403 || LOCAL_CLANG_VERSION >= 0x303 |
+#if LOCAL_GCC_PREREQ(4,3) || LOCAL_CLANG_PREREQ(3,3) |
#define HAVE_BUILTIN_BSWAP32 |
#define HAVE_BUILTIN_BSWAP64 |
#endif |
// clang-3.3 and gcc-4.8 have a builtin function for swap16 |
-#if LOCAL_GCC_VERSION >= 0x408 || LOCAL_CLANG_VERSION >= 0x303 |
+#if LOCAL_GCC_PREREQ(4,8) || LOCAL_CLANG_PREREQ(3,3) |
#define HAVE_BUILTIN_BSWAP16 |
#endif |
#endif // !HAVE_CONFIG_H |
@@ -69,7 +58,16 @@ static WEBP_INLINE uint16_t BSwap16(uint16_t x) { |
} |
static WEBP_INLINE uint32_t BSwap32(uint32_t x) { |
-#if defined(HAVE_BUILTIN_BSWAP32) |
+#if defined(WEBP_USE_MIPS32_R2) |
+ uint32_t ret; |
+ __asm__ volatile ( |
+ "wsbh %[ret], %[x] \n\t" |
+ "rotr %[ret], %[ret], 16 \n\t" |
+ : [ret]"=r"(ret) |
+ : [x]"r"(x) |
+ ); |
+ return ret; |
+#elif defined(HAVE_BUILTIN_BSWAP32) |
return __builtin_bswap32(x); |
#elif defined(__i386__) || defined(__x86_64__) |
uint32_t swapped_bytes; |