a couple renames & simplifications
This commit is contained in:
parent
f0223b8baf
commit
7df2f9ba4f
@ -932,7 +932,7 @@ B slash_im(B t, B x) {
|
|||||||
usz sa = 1<<(N-1); \
|
usz sa = 1<<(N-1); \
|
||||||
if (xia < sa || FL_HAS(x,fl_asc)) { \
|
if (xia < sa || FL_HAS(x,fl_asc)) { \
|
||||||
TRY_SMALL_OUT(N) \
|
TRY_SMALL_OUT(N) \
|
||||||
if (N==8) UD; \
|
assert(N != 8); \
|
||||||
sa = ria; \
|
sa = ria; \
|
||||||
} \
|
} \
|
||||||
INIT_RES(16,sa) \
|
INIT_RES(16,sa) \
|
||||||
|
|||||||
@ -13,7 +13,7 @@ def inc{ptr, ind} = inc{ptr, ind, 1}
|
|||||||
fn count{T if T<=i16}(tab:*u16, ov:*u16, xp:*void, n:u64, min_allowed:T) : T = {
|
fn count{T if T<=i16}(tab:*u16, ov:*u16, xp:*void, n:u64, min_allowed:T) : T = {
|
||||||
def vbits = arch_defvw
|
def vbits = arch_defvw
|
||||||
def vec = vbits/width{T}
|
def vec = vbits/width{T}
|
||||||
def uT = ty_u{T}
|
def TU = ty_u{T}
|
||||||
def V = [vec]T
|
def V = [vec]T
|
||||||
def block = (2048*8) / vbits # Target vectors per block
|
def block = (2048*8) / vbits # Target vectors per block
|
||||||
def b_max = block + block/4 # Last block max length
|
def b_max = block + block/4 # Last block max length
|
||||||
@ -55,13 +55,13 @@ fn count{T if T<=i16}(tab:*u16, ov:*u16, xp:*void, n:u64, min_allowed:T) : T = {
|
|||||||
|
|
||||||
# Fast cases
|
# Fast cases
|
||||||
dt := promote{u64, fold_addw{dc}}
|
dt := promote{u64, fold_addw{dc}}
|
||||||
nc := uT~~(mt - jt) # Number of counts to perform: last is implicit
|
nc := TU~~(mt - jt) # Number of counts to perform: last is implicit
|
||||||
if (dt < b * (vec/2) and (b + dt)*4 < b * promote{u64,nc}) {
|
if (dt < b * (vec/2) and (b + dt)*4 < b * promote{u64,nc}) {
|
||||||
r0 = count_with_runs{x, tab, r}
|
r0 = count_with_runs{x, tab, r}
|
||||||
} else if (nc <= 24*vbits/128) {
|
} else if (nc <= 24*vbits/128) {
|
||||||
r0 = rv
|
r0 = rv
|
||||||
count_by_sum{T, V, [vec]uT, xv, b, tab, r0,
|
count_by_sum{T, V, [vec]TU, xv, b, tab, r0,
|
||||||
promote{u64, uT~~jt}, # Starting count
|
promote{u64, TU~~jt}, # Starting count
|
||||||
promote{u64, nc} # Number of iterations
|
promote{u64, nc} # Number of iterations
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +104,7 @@ def count_by_sum{T, V, U, xv, b, tab, r0, j0, m} = {
|
|||||||
total := trunc{usz, r0} # To compute last count
|
total := trunc{usz, r0} # To compute last count
|
||||||
def count_each{js, num} = {
|
def count_each{js, num} = {
|
||||||
j := @collect (k to num) trunc{T, js+k}
|
j := @collect (k to num) trunc{T, js+k}
|
||||||
c := copy{length{j}, U**0}
|
c := length{j} ** U**0
|
||||||
e := each{{j}=>V**j, j}
|
e := each{{j}=>V**j, j}
|
||||||
@for (xv over b) each{{c,e} => c -= xv == e, c, e}
|
@for (xv over b) each{{c,e} => c -= xv == e, c, e}
|
||||||
def add_sum{c, j} = {
|
def add_sum{c, j} = {
|
||||||
@ -196,7 +196,7 @@ fn count_sorted{T}(r:*u8, ov:*usz, oc:*usz, x:*T, n:usz) : usz = {
|
|||||||
d:usz = block
|
d:usz = block
|
||||||
d2 := undefined{usz}
|
d2 := undefined{usz}
|
||||||
while ((d2=d+d) <= rem and bxi{d2}) d = d2
|
while ((d2=d+d) <= rem and bxi{d2}) d = d2
|
||||||
l := (rem &~ (block-1)) - d; if (l > d) l = d
|
l := min{(rem &~ (block-1)) - d, d}
|
||||||
# Target is in [d,d+l); shrink l
|
# Target is in [d,d+l); shrink l
|
||||||
while (l > block) {
|
while (l > block) {
|
||||||
h := (l/2) &~ (block-1)
|
h := (l/2) &~ (block-1)
|
||||||
@ -209,7 +209,7 @@ fn count_sorted{T}(r:*u8, ov:*usz, oc:*usz, x:*T, n:usz) : usz = {
|
|||||||
i += d; xo += d; xi = load{xo}
|
i += d; xo += d; xi = load{xo}
|
||||||
}
|
}
|
||||||
# Count the next block normally
|
# Count the next block normally
|
||||||
if (rem > block) rem = block
|
rem = min{rem, usz~~block} # TODO get rid of the need of the usz~~ here
|
||||||
count_adapt_runs{xo, r, rem}
|
count_adapt_runs{xo, r, rem}
|
||||||
rxi := load{r, xi}
|
rxi := load{r, xi}
|
||||||
if (rxi >= block) {
|
if (rxi >= block) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user