From 08fa7d3d304292f9346e7904b5a98e95f8fe8b01 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 21 Nov 2023 02:20:36 +0200 Subject: [PATCH] specialize x86-64 homMask of 2x[n]i16, use for comparison --- src/singeli/src/avx2.singeli | 1 + src/singeli/src/cmp.singeli | 3 ++- src/singeli/src/sse2.singeli | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/singeli/src/avx2.singeli b/src/singeli/src/avx2.singeli index c9cd8633..3e317ace 100644 --- a/src/singeli/src/avx2.singeli +++ b/src/singeli/src/avx2.singeli @@ -59,6 +59,7 @@ 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<{ def E2 = (if (aa and isunsigned{E} and ((same{F,__eq} | same{F,__ne}) | (E==u32))) {ty_s{E}} else E) def bulk = w/width{E2} - G_vec{[bulk]E2, max{tern{hasarch{'AARCH64'},2,1}, 8/bulk}} + def unr = if (hasarch{'X86_64'} and width{E2}==16) 2 else max{8/bulk,1} + G_vec{[bulk]E2, max{tern{hasarch{'AARCH64'},2,1}, unr}} }, tup{i8, i16, i32, f64, u8, u16, u32}} } } diff --git a/src/singeli/src/sse2.singeli b/src/singeli/src/sse2.singeli index 0961ffa7..2bf09a84 100644 --- a/src/singeli/src/sse2.singeli +++ b/src/singeli/src/sse2.singeli @@ -52,6 +52,7 @@ def topMask{x:T & w128{T, 32}} = emit{u8, '_mm_movemask_ps', v2f{x}} def topMask{x:T & w128{T, 64}} = emit{u8, '_mm_movemask_pd', v2d{x}} def homMask{x:T & w128{T}} = topMask{x} def homMaskX{a:T & elwidth{T}==16} = tup{2, homMask{re_el{u8,a}}} +def homMask{a:T, b:T & w128i{T,16}} = homMask{packs{ty_s{a},ty_s{b}}} def homAny{x:T & w128i{T}} = homMask{[16]u8 ~~ x} != 0 def homAll{x:T & w128i{T}} = homMask{[16]u8 ~~ x} == 0xffff