From f3699b5ac8c5c467f281811a3c60a95b18be9cb2 Mon Sep 17 00:00:00 2001 From: pkubaj Date: Mon, 21 Mar 2022 02:05:05 +0000 Subject: [PATCH] Fix build with LLVM 13 on ppc64le /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/vsx_utils.hpp:352:12: warning: 'vec_permi' macro redefined [-Wmacro-redefined] # define vec_permi(a, b, c) vec_xxpermdi(b, a, (3 ^ (((c) & 1) << 1 | (c) >> 1))) ^ /usr/lib/clang/13.0.0/include/altivec.h:13077:9: note: previous definition is here #define vec_permi(__a, __b, __c) \ ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/vsx_utils.hpp:370:25: error: redefinition of 'vec_promote' VSX_FINLINE(vec_dword2) vec_promote(long long a, int b) ^ /usr/lib/clang/13.0.0/include/altivec.h:14604:1: note: previous definition is here vec_promote(signed long long __a, int __b) { ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/vsx_utils.hpp:377:26: error: redefinition of 'vec_promote' VSX_FINLINE(vec_udword2) vec_promote(unsigned long long a, int b) ^ /usr/lib/clang/13.0.0/include/altivec.h:14611:1: note: previous definition is here vec_promote(unsigned long long __a, int __b) { ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/hal/intrin_vsx.hpp:1045:22: error: call to 'vec_rsqrt' is ambiguous { return v_float32x4(vec_rsqrt(x.val)); } ^~~~~~~~~ /usr/lib/clang/13.0.0/include/altivec.h:8472:34: note: candidate function static vector float __ATTRS_o_ai vec_rsqrt(vector float __a) { ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/vsx_utils.hpp:362:29: note: candidate function VSX_FINLINE(vec_float4) vec_rsqrt(const vec_float4& a) ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/hal/intrin_vsx.hpp:1047:22: error: call to 'vec_rsqrt' is ambiguous { return v_float64x2(vec_rsqrt(x.val)); } ^~~~~~~~~ /usr/lib/clang/13.0.0/include/altivec.h:8477:35: note: candidate function static vector double __ATTRS_o_ai vec_rsqrt(vector double __a) { ^ /wrkdirs/usr/ports/graphics/opencv/work/opencv-4.5.5/modules/core/include/opencv2/core/vsx_utils.hpp:365:30: note: candidate function VSX_FINLINE(vec_double2) vec_rsqrt(const vec_double2& a) ^ 1 warning and 4 errors generated. The specific functions were added to altivec.h in LLVM's 1ff93618e58df210def48d26878c20a1b414d900, c3da07d216dd20fbdb7302fd085c0a59e189ae3d and 10cc5bcd868c433f9a781aef82178b04e98bd098. --- modules/core/include/opencv2/core/vsx_utils.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/core/include/opencv2/core/vsx_utils.hpp b/modules/core/include/opencv2/core/vsx_utils.hpp index 5cbc066784..79a1074d59 100644 --- a/modules/core/include/opencv2/core/vsx_utils.hpp +++ b/modules/core/include/opencv2/core/vsx_utils.hpp @@ -324,6 +324,7 @@ VSX_IMPL_1RG(vec_udword2, vec_float4, xvcvspuxds, vec_ctulo) #define VSX_IMPL_CONVERT(rt, rg, fnm) \ VSX_FINLINE(rt) fnm(const rg& a) { return __builtin_convertvector(a, rt); } +#ifndef vec_permi #if __clang_major__ < 5 // implement vec_permi in a dirty way # define VSX_IMPL_CLANG_4_PERMI(Tvec) \ @@ -351,12 +352,14 @@ VSX_FINLINE(rt) fnm(const rg& a) { return __builtin_convertvector(a, rt); } // vec_xxpermdi is missing little-endian supports in clang 4 just like gcc4 # define vec_permi(a, b, c) vec_xxpermdi(b, a, (3 ^ (((c) & 1) << 1 | (c) >> 1))) #endif // __clang_major__ < 5 +#endif // shift left double by word immediate #ifndef vec_sldw # define vec_sldw vec_xxsldwi #endif +#if __clang_major__ < 13 // Implement vec_rsqrt since clang only supports vec_rsqrte #ifndef vec_rsqrt VSX_FINLINE(vec_float4) vec_rsqrt(const vec_float4& a) @@ -380,6 +383,7 @@ VSX_FINLINE(vec_udword2) vec_promote(unsigned long long a, int b) ret[b & 1] = a; return ret; } +#endif // vec_popcnt should return unsigned but clang has different thought just like gcc in vec_vpopcnt #define VSX_IMPL_POPCNTU(Tvec, Tvec2, ucast) \