Skip to content

Commit

Permalink
core:ppc Fixed compilation with xlc, clang.
Browse files Browse the repository at this point in the history
- Use EXPECT_TRUE instead of EXPECT_EQ for comparing NULL in xlc
- Added support for int64 to vec_promote in xlc, clang
- Fixed v_rotate_right in xlc
  • Loading branch information
seiko2plus committed Nov 29, 2017
1 parent 666fc0b commit 6fe6436
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 5 deletions.
4 changes: 4 additions & 0 deletions modules/core/include/opencv2/core/hal/intrin_vsx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -638,7 +638,11 @@ inline _Tpvec v_rotate_right(const _Tpvec& a, const _Tpvec& b)
enum { CV_SHIFT = 16 - imm * (sizeof(typename _Tpvec::lane_type)) };
if (CV_SHIFT == 16)
return a;
#ifdef __IBMCPP__
return _Tpvec(vec_sld(b.val, a.val, CV_SHIFT & 15));
#else
return _Tpvec(vec_sld(b.val, a.val, CV_SHIFT));
#endif
}

template<int imm, typename _Tpvec>
Expand Down
21 changes: 21 additions & 0 deletions modules/core/include/opencv2/core/vsx_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,21 @@ FORCE_INLINE(rt) fnm(const rg& a) { return __builtin_convertvector(a, rt); }
{ return vec_div(vec_double2_sp(1), vec_sqrt(a)); }
#endif

// vec_promote missing support for doubleword
FORCE_INLINE(vec_dword2) vec_promote(long long a, int b)
{
vec_dword2 ret = vec_dword2_z;
ret[b & 1] = a;
return ret;
}

FORCE_INLINE(vec_udword2) vec_promote(unsigned long long a, int b)
{
vec_udword2 ret = vec_udword2_z;
ret[b & 1] = a;
return ret;
}

// vec_popcnt should return unsigned but clang has different thought just like gcc in vec_vpopcnt
#define VSX_IMPL_POPCNTU(Tvec, Tvec2, ucast) \
FORCE_INLINE(Tvec) vec_popcntu(const Tvec2& a) \
Expand Down Expand Up @@ -569,6 +584,12 @@ VSX_IMPL_DIRTY_ODD(vec_udword2, vec_float4, vec_ctulo, vec_ctul)

FORCE_INLINE(vec_dword2) vec_splats(int64 v)
{ return vec_splats((long long) v); }

FORCE_INLINE(vec_udword2) vec_promote(uint64 a, int b)
{ return vec_promote((unsigned long long) a, b); }

FORCE_INLINE(vec_dword2) vec_promote(int64 a, int b)
{ return vec_promote((long long) a, b); }
#endif

/*
Expand Down
16 changes: 11 additions & 5 deletions modules/core/test/test_ptr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@

#include "test_precomp.hpp"

#ifdef GTEST_CAN_COMPARE_NULL
# define EXPECT_NULL(ptr) EXPECT_EQ(NULL, ptr)
#else
# define EXPECT_NULL(ptr) EXPECT_TRUE(ptr == NULL)
#endif

using namespace cv;

namespace {
Expand Down Expand Up @@ -78,7 +84,7 @@ int dummyObject;
TEST(Core_Ptr, default_ctor)
{
Ptr<int> p;
EXPECT_EQ(NULL, p.get());
EXPECT_NULL(p.get());
}

TEST(Core_Ptr, owning_ctor)
Expand All @@ -102,7 +108,7 @@ TEST(Core_Ptr, owning_ctor)

{
Ptr<void> p((void*)0, ReportingDeleter(&deleted));
EXPECT_EQ(NULL, p.get());
EXPECT_NULL(p.get());
}

EXPECT_FALSE(deleted);
Expand Down Expand Up @@ -187,7 +193,7 @@ TEST(Core_Ptr, release)
Ptr<Reporter> p1(new Reporter(&deleted));
p1.release();
EXPECT_TRUE(deleted);
EXPECT_EQ(NULL, p1.get());
EXPECT_NULL(p1.get());
}

TEST(Core_Ptr, reset)
Expand Down Expand Up @@ -253,7 +259,7 @@ TEST(Core_Ptr, accessors)
{
{
Ptr<int> p;
EXPECT_EQ(NULL, static_cast<int*>(p));
EXPECT_NULL(static_cast<int*>(p));
EXPECT_TRUE(p.empty());
}

Expand Down Expand Up @@ -327,7 +333,7 @@ TEST(Core_Ptr, casts)
{
Ptr<Reporter> p1(new Reporter(&deleted));
Ptr<SubReporter> p2 = p1.dynamicCast<SubReporter>();
EXPECT_EQ(NULL, p2.get());
EXPECT_NULL(p2.get());
p1.release();
EXPECT_FALSE(deleted);
}
Expand Down

0 comments on commit 6fe6436

Please sign in to comment.