From f1ff4992440b13de20f2517b3e92ef637c7f8a93 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Mon, 7 Nov 2022 16:06:06 -0500 Subject: [PATCH] Implement multiple result types for non-Singeli +`bool --- src/builtins/md1.c | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 5fc42dec..5ef00382 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -151,13 +151,40 @@ static i64 bit_diff(u64* x, u64 am) { #include "../singeli/gen/scan.c" #pragma GCC diagnostic pop #endif +B slash_c1(B f, B x); +B scan_bit_sum(B x, u64* xp, u64 ia, u64 xs) { // consumes x + u8 re = xs<=I8_MAX? el_i8 : xs<=I16_MAX? el_i16 : el_i32; + if (xs < ia/128) { + B ones = slash_c1(m_f64(0), x); + MAKE_MUT(r0, ia) mut_init(r0, re); MUTG_INIT(r0); + SGetU(ones) + usz ri = 0; + for (usz i = 0; i < xs; i++) { + usz e = o2s(GetU(ones, i)); + mut_fillG(r0, ri, m_i32(i), e-ri); + ri = e; + } + if (rif; if (isAtm(x) || RNK(x)==0) thrM("`: Argument cannot have rank 0"); ur xr = RNK(x); @@ -173,28 +200,7 @@ B scan_c1(Md1D* d, B x) { B f = d->f; u64 xs = bit_sum(xp, ia); if (xs>I32_MAX) goto base; if (xs<=1) { if (xs==0) return x; goto bit_or; } - if (xs < ia/128) { - B ones = slash_c1(m_f64(0), x); - u8 re = xs<=I8_MAX? el_i8 : xs<=I16_MAX? el_i16 : el_i32; - MAKE_MUT(r0, ia) mut_init(r0, re); MUTG_INIT(r0); - SGetU(ones) - usz ri = 0; - for (usz i = 0; i < xs; i++) { - usz e = o2s(GetU(ones, i)); - mut_fillG(r0, ri, m_i32(i), e-ri); - ri = e; - } - if (ri