@@ -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