@ -1933,6 +1933,37 @@ void HELPER(sme2_ucvtf)(void *vd, void *vs, float_status *fpst, uint32_t desc)
}
}
# define ZIP2(NAME, TYPE, H) \
void HELPER ( NAME ) ( void * vd , void * vn , void * vm , uint32_t desc ) \
{ \
ARMVectorReg scratch [ 2 ] ; \
size_t oprsz = simd_oprsz ( desc ) ; \
size_t pairs = oprsz / ( sizeof ( TYPE ) * 2 ) ; \
TYPE * n = vn , * m = vm ; \
if ( vectors_overlap ( vd , 2 , vn , 1 ) ) { \
n = memcpy ( & scratch [ 0 ] , vn , oprsz ) ; \
} \
if ( vectors_overlap ( vd , 2 , vm , 1 ) ) { \
m = memcpy ( & scratch [ 1 ] , vm , oprsz ) ; \
} \
for ( size_t r = 0 ; r < 2 ; + + r ) { \
TYPE * d = vd + r * sizeof ( ARMVectorReg ) ; \
size_t base = r * pairs ; \
for ( size_t p = 0 ; p < pairs ; + + p ) { \
d [ H ( 2 * p + 0 ) ] = n [ base + H ( p ) ] ; \
d [ H ( 2 * p + 1 ) ] = m [ base + H ( p ) ] ; \
} \
} \
}
ZIP2 ( sme2_zip2_b , uint8_t , H1 )
ZIP2 ( sme2_zip2_h , uint16_t , H2 )
ZIP2 ( sme2_zip2_s , uint32_t , H4 )
ZIP2 ( sme2_zip2_d , uint64_t , )
ZIP2 ( sme2_zip2_q , Int128 , )
# undef ZIP2
# define ZIP4(NAME, TYPE, H) \
void HELPER ( NAME ) ( void * vd , void * vs , uint32_t desc ) \
{ \
@ -1967,6 +1998,37 @@ ZIP4(sme2_zip4_q, Int128, )
# undef ZIP4
# define UZP2(NAME, TYPE, H) \
void HELPER ( NAME ) ( void * vd , void * vn , void * vm , uint32_t desc ) \
{ \
ARMVectorReg scratch [ 2 ] ; \
size_t oprsz = simd_oprsz ( desc ) ; \
size_t pairs = oprsz / ( sizeof ( TYPE ) * 2 ) ; \
TYPE * d0 = vd , * d1 = vd + sizeof ( ARMVectorReg ) ; \
if ( vectors_overlap ( vd , 2 , vn , 1 ) ) { \
vn = memcpy ( & scratch [ 0 ] , vn , oprsz ) ; \
} \
if ( vectors_overlap ( vd , 2 , vm , 1 ) ) { \
vm = memcpy ( & scratch [ 1 ] , vm , oprsz ) ; \
} \
for ( size_t r = 0 ; r < 2 ; + + r ) { \
TYPE * s = r ? vm : vn ; \
size_t base = r * pairs ; \
for ( size_t p = 0 ; p < pairs ; + + p ) { \
d0 [ base + H ( p ) ] = s [ H ( 2 * p + 0 ) ] ; \
d1 [ base + H ( p ) ] = s [ H ( 2 * p + 1 ) ] ; \
} \
} \
}
UZP2 ( sme2_uzp2_b , uint8_t , H1 )
UZP2 ( sme2_uzp2_h , uint16_t , H2 )
UZP2 ( sme2_uzp2_s , uint32_t , H4 )
UZP2 ( sme2_uzp2_d , uint64_t , )
UZP2 ( sme2_uzp2_q , Int128 , )
# undef UZP2
# define UZP4(NAME, TYPE, H) \
void HELPER ( NAME ) ( void * vd , void * vs , uint32_t desc ) \
{ \