@ -123,6 +123,11 @@ static inline uint64_t expand_pred_s(uint8_t byte)
return word [ byte & 0x11 ] ;
}
static inline uint64_t expand_pred_d ( uint8_t byte )
{
return - ( uint64_t ) ( byte & 1 ) ;
}
# define LOGICAL_PPPP(NAME, FUNC) \
void HELPER ( NAME ) ( void * vd , void * vn , void * vm , void * vg , uint32_t desc ) \
{ \
@ -206,6 +211,7 @@ void HELPER(NAME)(void *vd, void *vn, void *vm, void *vg, uint32_t desc) \
# define DO_EOR(N, M) (N ^ M)
# define DO_ORR(N, M) (N | M)
# define DO_BIC(N, M) (N & ~M)
# define DO_ORC(N, M) (N | ~M)
# define DO_ADD(N, M) (N + M)
# define DO_SUB(N, M) (N - M)
# define DO_MAX(N, M) ((N) >= (M) ? (N) : (M))
@ -1900,10 +1906,46 @@ DO_ZZI(sve_umini_d, uint64_t, DO_MIN)
# undef DO_ZZI
# define DO_LOGIC_QV(NAME, SUFF, INIT, VOP, POP) \
void HELPER ( NAME # # _ # # SUFF ) ( void * vd , void * vn , void * vg , uint32_t desc ) \
{ \
unsigned seg = simd_oprsz ( desc ) / 16 ; \
uint64_t r0 = INIT , r1 = INIT ; \
for ( unsigned s = 0 ; s < seg ; s + + ) { \
uint64_t p0 = expand_pred_ # # SUFF ( * ( uint8_t * ) ( vg + H1 ( s * 2 ) ) ) ; \
uint64_t p1 = expand_pred_ # # SUFF ( * ( uint8_t * ) ( vg + H1 ( s * 2 + 1 ) ) ) ; \
uint64_t v0 = * ( uint64_t * ) ( vn + s * 16 ) ; \
uint64_t v1 = * ( uint64_t * ) ( vn + s * 16 + 8 ) ; \
v0 = POP ( v0 , p0 ) , v1 = POP ( v1 , p1 ) ; \
r0 = VOP ( r0 , v0 ) , r1 = VOP ( r1 , v1 ) ; \
} \
* ( uint64_t * ) ( vd + 0 ) = r0 ; \
* ( uint64_t * ) ( vd + 8 ) = r1 ; \
clear_tail ( vd , 16 , simd_maxsz ( desc ) ) ; \
}
DO_LOGIC_QV ( sve2p1_orqv , b , 0 , DO_ORR , DO_AND )
DO_LOGIC_QV ( sve2p1_orqv , h , 0 , DO_ORR , DO_AND )
DO_LOGIC_QV ( sve2p1_orqv , s , 0 , DO_ORR , DO_AND )
DO_LOGIC_QV ( sve2p1_orqv , d , 0 , DO_ORR , DO_AND )
DO_LOGIC_QV ( sve2p1_eorqv , b , 0 , DO_EOR , DO_AND )
DO_LOGIC_QV ( sve2p1_eorqv , h , 0 , DO_EOR , DO_AND )
DO_LOGIC_QV ( sve2p1_eorqv , s , 0 , DO_EOR , DO_AND )
DO_LOGIC_QV ( sve2p1_eorqv , d , 0 , DO_EOR , DO_AND )
DO_LOGIC_QV ( sve2p1_andqv , b , - 1 , DO_AND , DO_ORC )
DO_LOGIC_QV ( sve2p1_andqv , h , - 1 , DO_AND , DO_ORC )
DO_LOGIC_QV ( sve2p1_andqv , s , - 1 , DO_AND , DO_ORC )
DO_LOGIC_QV ( sve2p1_andqv , d , - 1 , DO_AND , DO_ORC )
# undef DO_LOGIC_QV
# undef DO_AND
# undef DO_ORR
# undef DO_EOR
# undef DO_BIC
# undef DO_ORC
# undef DO_ADD
# undef DO_SUB
# undef DO_MAX