unroll bitsel

This commit is contained in:
dzaima 2025-04-28 04:15:32 +03:00
parent 0ae0be135c
commit c811e54666

View File

@ -5,13 +5,15 @@ include './bitops'
include './mask' include './mask'
include './bitalign' include './bitalign'
def mask_unr{bulk} = __max{2, 8/bulk}
def bitsel{VL, T, r, bits, e0, e1, len} = { def bitsel{VL, T, r, bits, e0, e1, len} = {
def bulk = VL/width{T} def bulk = VL/width{T}
def VT = [bulk]T def VT = [bulk]T
e0v:= VT**e0 e0v:= VT**e0
e1v:= VT**e1 e1v:= VT**e1
@for_masked{bulk}(r in tup{'g',r}, b in tup{'b',VT,bits} over i to len) r{blend_hom{e0v, e1v, b}} @for_mu{bulk,mask_unr{bulk}}(r in tup{'g',r}, b in tup{'b',VT,bits} over i to len) r{eachx{blend_hom, e0v, e1v, b}}
} }
fn bitsel_i{VL,T}(r:*void, bits:*u64, e0:u64, e1:u64, len:u64) : void = { fn bitsel_i{VL,T}(r:*void, bits:*u64, e0:u64, e1:u64, len:u64) : void = {
@ -31,7 +33,7 @@ fn blend_arr_scalar{E}(rp:*void, zero:*void, one0:u64, mask:*void, len:u64) : vo
def bulk = arch_defvw / width{E} def bulk = arch_defvw / width{E}
def VT = [bulk]E def VT = [bulk]E
def one = VT**cast_i{E, one0} def one = VT**cast_i{E, one0}
@for_masked{bulk}(r in tup{VT,*E~~rp}, zero in tup{VT,*E~~zero}, mask in tup{'b',VT,mask} over i to len) r = blend_hom{zero, one, mask} @for_mu{bulk,mask_unr{bulk}}(r in tup{'g',*E~~rp}, zero in tup{VT,*E~~zero}, mask in tup{'b',VT,mask} over i to len) r{eachx{blend_hom, zero, one, mask}}
} }
} }