Skip to content

Commit c0970f6

Browse files
WIP
1 parent 2b41f08 commit c0970f6

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

include/xsimd/arch/xsimd_neon.hpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -991,12 +991,22 @@ namespace xsimd
991991
return dispatcher.apply(register_type(lhs), register_type(rhs));
992992
}
993993

994-
template <class A, class T, detail::enable_sized_integral_t<T, 8> = 0>
994+
template <class A, class T, detail::enable_sized_signed_t<T, 8> = 0>
995+
XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon>) noexcept
996+
{
997+
using register_type = typename batch<T, A>::register_type;
998+
return batch_bool<T, A>(vreinterpretq_u64_s64(vshrq_n_s64(vqsubq_s64(register_type(lhs), register_type(rhs)), 63)));
999+
}
1000+
1001+
template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
9951002
XSIMD_INLINE batch_bool<T, A> lt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon>) noexcept
9961003
{
997-
return batch_bool<T, A>({ lhs.get(0) < rhs.get(0), lhs.get(1) < rhs.get(1) });
1004+
using register_type = typename batch<T, A>::register_type;
1005+
register_type acc = { 0x7FFFFFFFFFFFFFFFull, 0x7FFFFFFFFFFFFFFFull };
1006+
return batch_bool<T, A>(vreinterpretq_u64_s64(vshrq_n_s64(vreinterpretq_s64_u64(vqaddq_u64(vqsubq_u64(register_type(rhs), register_type(lhs)), acc)), 63)));
9981007
}
9991008

1009+
10001010
/******
10011011
* le *
10021012
******/
@@ -1018,9 +1028,10 @@ namespace xsimd
10181028
template <class A, class T, detail::enable_sized_integral_t<T, 8> = 0>
10191029
XSIMD_INLINE batch_bool<T, A> le(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon>) noexcept
10201030
{
1021-
return batch_bool<T, A>({ lhs.get(0) <= rhs.get(0), lhs.get(1) <= rhs.get(1) });
1031+
return !(lhs > rhs);
10221032
}
10231033

1034+
10241035
/******
10251036
* gt *
10261037
******/
@@ -1061,13 +1072,9 @@ namespace xsimd
10611072
template <class A, class T, detail::enable_sized_unsigned_t<T, 8> = 0>
10621073
XSIMD_INLINE batch_bool<T, A> gt(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon>) noexcept
10631074
{
1064-
#if 1
10651075
using register_type = typename batch<T, A>::register_type;
10661076
register_type acc = { 0x7FFFFFFFFFFFFFFFull, 0x7FFFFFFFFFFFFFFFull };
10671077
return batch_bool<T, A>(vreinterpretq_u64_s64(vshrq_n_s64(vreinterpretq_s64_u64(vqaddq_u64(vqsubq_u64(register_type(lhs), register_type(rhs)), acc)), 63)));
1068-
#else
1069-
return batch_bool<T, A>({ lhs.get(0) > rhs.get(0), lhs.get(1) > rhs.get(1) });
1070-
#endif
10711078
}
10721079

10731080
/******
@@ -1091,7 +1098,7 @@ namespace xsimd
10911098
template <class A, class T, detail::enable_sized_integral_t<T, 8> = 0>
10921099
XSIMD_INLINE batch_bool<T, A> ge(batch<T, A> const& lhs, batch<T, A> const& rhs, requires_arch<neon>) noexcept
10931100
{
1094-
return batch_bool<T, A>({ lhs.get(0) >= rhs.get(0), lhs.get(1) >= rhs.get(1) });
1101+
return !(lhs < rhs);
10951102
}
10961103

10971104
/*******************

0 commit comments

Comments
 (0)