mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-08 09:47:45 +08:00
Bug: libyuv:754 Test: CC=clang CXX=clang++ CFLAGS="-m32" CXXFLAGS="-m32 -mno-sse -O2" make -f linux.mk Change-Id: I74bf8d032013694e65ea7637bc38d3253db53ff2 Reviewed-on: https://chromium-review.googlesource.com/758043 Reviewed-by: Frank Barchard <fbarchard@google.com>
123 lines
4.2 KiB
C++
123 lines
4.2 KiB
C++
/*
|
|
* Copyright 2013 The LibYuv Project Authors. All rights reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef INCLUDE_LIBYUV_COMPARE_ROW_H_
|
|
#define INCLUDE_LIBYUV_COMPARE_ROW_H_
|
|
|
|
#include "libyuv/basic_types.h"
|
|
|
|
#ifdef __cplusplus
|
|
namespace libyuv {
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if defined(__pnacl__) || defined(__CLR_VER) || \
|
|
(defined(__i386__) && !defined(__SSE__) && !defined(__clang__))
|
|
#define LIBYUV_DISABLE_X86
|
|
#endif
|
|
// MemorySanitizer does not support assembly code yet. http://crbug.com/344505
|
|
#if defined(__has_feature)
|
|
#if __has_feature(memory_sanitizer)
|
|
#define LIBYUV_DISABLE_X86
|
|
#endif
|
|
#endif
|
|
|
|
// Visual C 2012 required for AVX2.
|
|
#if defined(_M_IX86) && !defined(__clang__) && defined(_MSC_VER) && \
|
|
_MSC_VER >= 1700
|
|
#define VISUALC_HAS_AVX2 1
|
|
#endif // VisualStudio >= 2012
|
|
|
|
// clang >= 3.4.0 required for AVX2.
|
|
#if defined(__clang__) && (defined(__x86_64__) || defined(__i386__))
|
|
#if (__clang_major__ > 3) || (__clang_major__ == 3 && (__clang_minor__ >= 4))
|
|
#define CLANG_HAS_AVX2 1
|
|
#endif // clang >= 3.4
|
|
#endif // __clang__
|
|
|
|
// clang 6 mips issue https://bugs.chromium.org/p/libyuv/issues/detail?id=715
|
|
// broken in clang version 6.0.0 (trunk 308728)
|
|
// fixed in clang version 6.0.0 (trunk 310694)
|
|
#if defined(__clang__)
|
|
// #define DISABLE_CLANG_MSA 1
|
|
#endif
|
|
|
|
// The following are available for Visual C:
|
|
#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && \
|
|
(defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2))
|
|
#define HAS_HASHDJB2_AVX2
|
|
#endif
|
|
|
|
// The following are available for Visual C and GCC:
|
|
#if !defined(LIBYUV_DISABLE_X86) && \
|
|
(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86))
|
|
#define HAS_HASHDJB2_SSE41
|
|
#define HAS_SUMSQUAREERROR_SSE2
|
|
#define HAS_HAMMINGDISTANCE_SSE42
|
|
#endif
|
|
|
|
// The following are available for Visual C and clangcl 32 bit:
|
|
#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && \
|
|
(defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2))
|
|
#define HAS_HASHDJB2_AVX2
|
|
#define HAS_SUMSQUAREERROR_AVX2
|
|
#endif
|
|
|
|
// The following are available for GCC and clangcl 64 bit:
|
|
#if !defined(LIBYUV_DISABLE_X86) && \
|
|
(defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER)))
|
|
#define HAS_HAMMINGDISTANCE_SSSE3
|
|
#endif
|
|
|
|
// The following are available for GCC and clangcl 64 bit:
|
|
#if !defined(LIBYUV_DISABLE_X86) && defined(CLANG_HAS_AVX2) && \
|
|
(defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER)))
|
|
#define HAS_HAMMINGDISTANCE_AVX2
|
|
#endif
|
|
|
|
// The following are available for Neon:
|
|
#if !defined(LIBYUV_DISABLE_NEON) && \
|
|
(defined(__ARM_NEON__) || defined(LIBYUV_NEON) || defined(__aarch64__))
|
|
#define HAS_SUMSQUAREERROR_NEON
|
|
#define HAS_HAMMINGDISTANCE_NEON
|
|
#endif
|
|
|
|
#if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa)
|
|
#define HAS_HAMMINGDISTANCE_MSA
|
|
|
|
#ifndef DISABLE_CLANG_MSA
|
|
#define HAS_SUMSQUAREERROR_MSA
|
|
#endif
|
|
#endif
|
|
|
|
uint32 HammingDistance_C(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 HammingDistance_SSE42(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 HammingDistance_SSSE3(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 HammingDistance_AVX2(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 HammingDistance_NEON(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 HammingDistance_MSA(const uint8* src_a, const uint8* src_b, int count);
|
|
|
|
uint32 SumSquareError_C(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 SumSquareError_SSE2(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 SumSquareError_AVX2(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 SumSquareError_NEON(const uint8* src_a, const uint8* src_b, int count);
|
|
uint32 SumSquareError_MSA(const uint8* src_a, const uint8* src_b, int count);
|
|
|
|
uint32 HashDjb2_C(const uint8* src, int count, uint32 seed);
|
|
uint32 HashDjb2_SSE41(const uint8* src, int count, uint32 seed);
|
|
uint32 HashDjb2_AVX2(const uint8* src, int count, uint32 seed);
|
|
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
} // namespace libyuv
|
|
#endif
|
|
|
|
#endif // INCLUDE_LIBYUV_COMPARE_ROW_H_
|