mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge remote-tracking branch 'origin/3.4' into merge-3.4
This commit is contained in:
@@ -166,7 +166,7 @@ template <typename R> struct Data
|
||||
{
|
||||
*this = r;
|
||||
}
|
||||
operator R ()
|
||||
operator R () const
|
||||
{
|
||||
return initializer<VTraits<R>::max_nlanes>().init(*this);
|
||||
}
|
||||
@@ -1736,11 +1736,39 @@ template<typename R> struct TheTest
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CV_SIMD_64F
|
||||
void do_check_cmp64(const Data<R>& dataA, const Data<R>& dataB)
|
||||
{
|
||||
R a = dataA;
|
||||
R b = dataB;
|
||||
|
||||
#if CV_SIMD_SCALABLE
|
||||
Data<R> dataEQ = v_eq(a, b);
|
||||
Data<R> dataNE = v_ne(a, b);
|
||||
#else
|
||||
Data<R> dataEQ = (a == b);
|
||||
Data<R> dataNE = (a != b);
|
||||
#endif
|
||||
|
||||
for (int i = 0; i < VTraits<R>::vlanes(); ++i)
|
||||
{
|
||||
SCOPED_TRACE(cv::format("i=%d", i));
|
||||
if (cvtest::debugLevel > 0) cout << "i=" << i << " ( " << dataA[i] << " vs " << dataB[i] << " ): eq=" << dataEQ[i] << " ne=" << dataNE[i] << endl;
|
||||
EXPECT_NE((LaneType)dataEQ[i], (LaneType)dataNE[i]);
|
||||
if (dataA[i] == dataB[i])
|
||||
EXPECT_EQ((LaneType)-1, (LaneType)dataEQ[i]);
|
||||
else
|
||||
EXPECT_EQ((LaneType)0, (LaneType)dataEQ[i]);
|
||||
if (dataA[i] != dataB[i])
|
||||
EXPECT_EQ((LaneType)-1, (LaneType)dataNE[i]);
|
||||
else
|
||||
EXPECT_EQ((LaneType)0, (LaneType)dataNE[i]);
|
||||
}
|
||||
}
|
||||
|
||||
TheTest & test_cmp64()
|
||||
{
|
||||
Data<R> dataA, dataB;
|
||||
R a = dataA, b = dataB;
|
||||
Data<R> dataA;
|
||||
Data<R> dataB;
|
||||
|
||||
for (int i = 0; i < VTraits<R>::vlanes(); ++i)
|
||||
{
|
||||
@@ -1748,37 +1776,25 @@ template<typename R> struct TheTest
|
||||
}
|
||||
dataA[0]++;
|
||||
|
||||
a = dataA, b = dataB;
|
||||
do_check_cmp64(dataA, dataB);
|
||||
do_check_cmp64(dataB, dataA);
|
||||
|
||||
Data<R> resC = (a == b);
|
||||
Data<R> resD = (a != b);
|
||||
dataA[0] = dataB[0];
|
||||
dataA[1] += (((LaneType)1) << 32);
|
||||
do_check_cmp64(dataA, dataB);
|
||||
do_check_cmp64(dataB, dataA);
|
||||
|
||||
for (int i = 0; i < VTraits<R>::vlanes(); ++i)
|
||||
{
|
||||
SCOPED_TRACE(cv::format("i=%d", i));
|
||||
EXPECT_EQ(dataA[i] == dataB[i], resC[i] != 0);
|
||||
EXPECT_EQ(dataA[i] != dataB[i], resD[i] != 0);
|
||||
}
|
||||
dataA[0] = (LaneType)-1;
|
||||
dataB[0] = (LaneType)-1;
|
||||
dataA[1] = (LaneType)-1;
|
||||
dataB[1] = (LaneType)2;
|
||||
|
||||
for (int i = 0; i < VTraits<R>::vlanes(); ++i)
|
||||
{
|
||||
dataA[i] = dataB[i] = (LaneType)-1;
|
||||
}
|
||||
do_check_cmp64(dataA, dataB);
|
||||
do_check_cmp64(dataB, dataA);
|
||||
|
||||
a = dataA, b = dataB;
|
||||
|
||||
resC = (a == b);
|
||||
resD = (a != b);
|
||||
|
||||
for (int i = 0; i < VTraits<R>::vlanes(); ++i)
|
||||
{
|
||||
SCOPED_TRACE(cv::format("i=%d", i));
|
||||
EXPECT_EQ(dataA[i] == dataB[i], resC[i] != 0);
|
||||
EXPECT_EQ(dataA[i] != dataB[i], resD[i] != 0);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#define DUMP_ENTRY(type) printf("SIMD%d: %s\n", 8*VTraits<v_uint8>::vlanes(), CV__TRACE_FUNCTION);
|
||||
@@ -2023,9 +2039,8 @@ void test_hal_intrin_uint64()
|
||||
TheTest<v_uint64>()
|
||||
.test_loadstore()
|
||||
.test_addsub()
|
||||
#if CV_SIMD_64F
|
||||
.test_cmp64()
|
||||
#endif
|
||||
//.test_cmp() - not declared as supported
|
||||
.test_shift<1>().test_shift<8>()
|
||||
.test_logic()
|
||||
.test_reverse()
|
||||
@@ -2043,9 +2058,8 @@ void test_hal_intrin_int64()
|
||||
TheTest<v_int64>()
|
||||
.test_loadstore()
|
||||
.test_addsub()
|
||||
#if CV_SIMD_64F
|
||||
.test_cmp64()
|
||||
#endif
|
||||
//.test_cmp() - not declared as supported
|
||||
.test_shift<1>().test_shift<8>()
|
||||
.test_logic()
|
||||
.test_reverse()
|
||||
@@ -2128,7 +2142,8 @@ void test_hal_intrin_float64()
|
||||
.test_rotate<2>().test_rotate<3>()
|
||||
#endif
|
||||
;
|
||||
|
||||
#else
|
||||
std::cout << "SKIP: CV_SIMD_64F is not available" << std::endl;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user