diff --git a/src/singeli/src/mask.singeli b/src/singeli/src/mask.singeli index 82ba9d72..7bf60222 100644 --- a/src/singeli/src/mask.singeli +++ b/src/singeli/src/mask.singeli @@ -1,32 +1,17 @@ -# get mask of first n items; n>0 & n { merge{broadcast{w/8-1, 255}, (1<>3)^31 + 64*(n&7))} +mask128_1:*u8 = maskInit1{128}; def maskOfBit{T,n & w128{T}} = load{*[16]u8 ~~ (mask128_1 + (n>>3)^15 + 32*(n&7))} +mask256:*i64 = merge{broadcast{4, -1}, broadcast{4, 0}} +local def maskOfImpl{T, n, w} = load{*ty_u{T} ~~ (*u8~~mask256 + 32 - n*(width{eltype{T}}/8))} -def maskOf{T,n & w256{T, 8}} = load{*[32]u8 ~~ (mask256_8 + (n^31))} -def maskOf{T,n & w256{T,16}} = load{*[16]u16 ~~ (mask256_16 + (n^15))} -def maskOf{T,n & w256{T,32}} = load{*[ 8]u32 ~~ (mask256_32 + (n^7))} -def maskOf{T,n & w256{T,64}} = load{*[ 4]u64 ~~ (mask256_64 + (n^3))} -def maskOfBit{T,n & w256{T}} = load{*[32]u8 ~~ (mask256_1 + (n>>3)^31 + 64*(n&7))} - -def maskOf{T,n & w128{T, 8}} = load{*[16]u8 ~~ (mask128_8 + (n^15))} -def maskOf{T,n & w128{T,16}} = load{*[ 8]u16 ~~ (mask128_16 + (n^7))} -def maskOf{T,n & w128{T,32}} = load{*[ 4]u32 ~~ (mask128_32 + (n^3))} -def maskOf{T,n & w128{T,64}} = load{*[ 2]u64 ~~ (mask128_64 + (n^1))} -def maskOfBit{T,n & w128{T}} = load{*[16]u8 ~~ (mask128_1 + (n>>3)^15 + 32*(n&7))} +# get mask of first n items; 0 ≤ n ≤ vcount{T} +def maskOf{T,n & w256{T}} = maskOfImpl{T, n, 256} +def maskOf{T,n & w128{T}} = maskOfImpl{T, n, 128} def anyne{x:T, y:T, M & M{0}==0 & isvec{T}} = ~all{x==y} def anyne{x:T, y:T, M & M{0}==1 & isvec{T}} = any{M{x!=y}}