@@ -78,7 +78,7 @@ namespace xsimd
7878 template <class A , class T , class = typename std::enable_if<std::is_scalar<T>::value, void >::type>
7979 XSIMD_INLINE batch<T, A> add (batch<T, A> const & self, batch<T, A> const & other, requires_arch<altivec>) noexcept
8080 {
81- return vec_add (self, other);
81+ return vec_add (self. data , other. data );
8282 }
8383
8484 // all
@@ -661,8 +661,7 @@ namespace xsimd
661661 {
662662 XSIMD_IF_CONSTEXPR (sizeof (T) == 4 )
663663 {
664- // FIXME: fine an in-order approach
665- auto tmp0 = vec_reve (self); // v3, v2, v1, v0
664+ auto tmp0 = vec_reve (self.data ); // v3, v2, v1, v0
666665 auto tmp1 = vec_add (self.data , tmp0); // v0 + v3, v1 + v2, v2 + v1, v3 + v0
667666 auto tmp2 = vec_permi (tmp1, tmp1, 0x3 ); // v2 + v1, v3 + v0, v2 + v1, v3 + v0
668667 auto tmp3 = vec_add (tmp1, tmp2);
@@ -673,6 +672,16 @@ namespace xsimd
673672 return hadd (self, common {});
674673 }
675674 }
675+ template <class A >
676+ XSIMD_INLINE float reduce_add (batch<float , A> const & self, requires_arch<altivec>) noexcept
677+ {
678+ // FIXME: find an in-order approach
679+ auto tmp0 = vec_reve (self.data ); // v3, v2, v1, v0
680+ auto tmp1 = vec_add (self.data , tmp0); // v0 + v3, v1 + v2, v2 + v1, v3 + v0
681+ auto tmp2 = vec_permi (tmp1, tmp1, 0x3 ); // v2 + v1, v3 + v0, v2 + v1, v3 + v0
682+ auto tmp3 = vec_add (tmp1, tmp2);
683+ return vec_extract (tmp3, 0 );
684+ }
676685
677686#if 0
678687 // reduce_max
0 commit comments