use vtestz/vptestz instead of movemask for mask-any checks

This commit is contained in:
dzaima 2023-04-15 15:10:58 +03:00
parent 712707d27b
commit a622a6761b

View File

@ -132,11 +132,15 @@ def topMask{x:T & w256{T, 16}} = {
(msk&255) | (msk>>8)
}
def homAny{x:T & w256i{T}} = homMask{[32]u8 ~~ x} != 0
def homAny{x:T & w256i{T}} = ~emit{u1, '_mm256_testz_si256', v2i{x}, v2i{x}}
def homAll{x:T & w256i{T}} = homMask{[32]u8 ~~ x} == 0xffff_ffff
def topAny{x:T & w256i{T}} = topMask{x} != 0
def topAll{x:T & w256i{T}} = topMask{x} == (1<<vcount{T})-1
def topAny{x:T & w256i{T,32}} = ~emit{u1, '_mm256_testz_ps', v2f{x}, v2f{x}}
def topAny{x:T & w256i{T,64}} = ~emit{u1, '_mm256_testz_pd', v2d{x}, v2d{x}}
def homAny{x:T & w256i{T} & elwidth{T}>=32} = topAny{x}
def topAny{x:T & w256i{T,16}} = homAny{[16]i16~~x < [16]i16**0}
def topAll{x:T & w256i{T,16}} = homAll{[16]i16~~x < [16]i16**0}