Skip to content

Commit 36cd50c

Browse files
WIP
1 parent 1bd2ce7 commit 36cd50c

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

include/xsimd/arch/xsimd_altivec.hpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)