Slightly faster table-less compress method
This commit is contained in:
parent
84a928863b
commit
f36426031a
@ -118,26 +118,28 @@ fn slash2{T==i8 & hasarch{'AVX2'}}(w:*u64, x:*T, r:*T, l:u64, sum:u64) : void =
|
|||||||
itab := mI{flat_table{ind2x2, ... 4**iota{2}}}
|
itab := mI{flat_table{ind2x2, ... 4**iota{2}}}
|
||||||
|
|
||||||
@for_special_buffered{r,32} (w in *u32~~w, x in *[32]T~~x over sum) {
|
@for_special_buffered{r,32} (w in *u32~~w, x in *[32]T~~x over sum) {
|
||||||
def step{k==1} = { # Unused, ~15% slower
|
def step{k==1} = { # Unused, ~10% slower
|
||||||
bit := I~~make{[32]u8, 1<<(iota{32}%8)}
|
bit := I~~make{[32]u8, 1<<(iota{32}%8)}
|
||||||
sum := I~~(s8{I~~S**w, make{I,iota{32}>>3}}&bit != bit)
|
sum := I~~(s8{I~~S**w, make{I,iota{32}>>3}}&bit != bit)
|
||||||
tup{sum + shl{[16]u8, sum, 1}, s8{x, io - sum}}
|
tup{sum + shl{[16]u8, sum, 1}, io - sum}
|
||||||
}
|
}
|
||||||
def step{k==2} = {
|
def step{k==2} = {
|
||||||
wv := I~~(S**w >> make{S,4*iota{8}}) & I**0xf
|
wv := I~~(S**w >> make{S,4*iota{8}}) & I**0xf
|
||||||
sum:= s8{sumtab, wv}
|
sum:= s8{sumtab, wv}
|
||||||
ws := s8{itab, s8{wv, mI{4*(iota{16}%4)}}}
|
ws := s8{itab, s8{wv, mI{4*(iota{16}%4)}}}
|
||||||
w4 := io + s8{I~~(S~~ws >> make{S,2*(iota{8}%4)}) & I**3, tr4x4}
|
w4 := io + s8{I~~(S~~ws >> make{S,2*(iota{8}%4)}) & I**3, tr4x4}
|
||||||
tup{shl{[16]u8, sum, 3}, s8{x, w4}}
|
tup{shl{[16]u8, sum, 3}, w4}
|
||||||
}
|
}
|
||||||
def step{k & k>2} = {
|
def step{k & k>2} = {
|
||||||
{sum, res} := step{k-1}
|
def h = k-1
|
||||||
ik := mI{zlow{k,iota{16}} + (1<<(k-1) - 1)}
|
{sum, res} := step{h}
|
||||||
|
ik := mI{zlow{k,iota{16}} + (1<<h - 1)}
|
||||||
|
mh := mI{-(iota{16}>>h & 1)}
|
||||||
ss := s8{sum, ik}
|
ss := s8{sum, ik}
|
||||||
d := io - ss
|
tup{sum+ss, max{res, s8{res & mh, io - ss}}}
|
||||||
tup{sum+ss, homBlend{res, s8{res,d}, d > ik}}
|
|
||||||
}
|
}
|
||||||
{_,r16} := step{4}
|
{_,j16} := step{4}
|
||||||
|
r16 := s8{x, j16}
|
||||||
|
|
||||||
store{*[16]T~~r, 0, half{r16, 0}}
|
store{*[16]T~~r, 0, half{r16, 0}}
|
||||||
store{*[16]T~~(r+popc{w&0xffff}), 0, half{r16, 1}}
|
store{*[16]T~~(r+popc{w&0xffff}), 0, half{r16, 1}}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user