faster i32arrOfBools/

This commit is contained in:
dzaima 2021-06-06 15:13:52 +03:00
parent 92b08de504
commit 47f8984e74
8 changed files with 60 additions and 22 deletions

View File

@ -3,6 +3,8 @@ J=-j4
o3:
@$(MAKE) $(J) -C obj/o3 o3
o3n:
@$(MAKE) $(J) -C obj/o3n o3n
o3g:
@$(MAKE) $(J) -C obj/o3g o3g
debug:
@ -16,6 +18,8 @@ rtverify:
o3-clean:
@$(MAKE) -C obj/o3 clean
o3n-clean:
@$(MAKE) -C obj/o3n clean
o3g-clean:
@$(MAKE) -C obj/o3g clean
debug-clean:
@ -27,4 +31,4 @@ heapverify-clean:
rtverify-clean:
@$(MAKE) -C obj/rtverify clean
clean: o3-clean o3g-clean debug-clean rtperf-clean heapverify-clean rtverify-clean
clean: o3-clean o3n-clean o3g-clean debug-clean rtperf-clean heapverify-clean rtverify-clean

1
obj/o3n/makefile Symbolic link
View File

@ -0,0 +1 @@
../subMakefile

View File

@ -7,6 +7,8 @@ CMD=$(CC) -std=gnu11 -Wall -Wno-unused-function -fms-extensions ${CCFLAGS} $(FLA
o3: FLAGS=-O3
o3: gen
o3n: FLAGS=-O3 -march=native
o3n: gen
o3g: FLAGS=-O3 -g
o3g: gen
debug: FLAGS=-g -DDEBUG

View File

@ -227,47 +227,62 @@ B slash_c2(B t, B w, B x) {
usz xia = a(x)->ia;
B xf = getFillQ(x);
if (wia!=xia) thrF("/: Lengths of components of 𝕨 must match 𝕩 (%s ≠ %s)", wia, xia);
i64 wsum = isum(w); if (wsum>USZ_MAX) thrOOM();
usz ria = wsum;
usz ri = 0;
if (TI(w).elType==el_i32) {
i32* wp = i32any_ptr(w);
while (wia>0 && !wp[wia-1]) wia--;
i64 wsum = 0;
u32 or = 0;
for (usz i = 0; i < wia; i++) {
wsum+= wp[i];
or|= (u32)wp[i];
}
if (or>>31) thrM("/: 𝕨 must consist of natural numbers");
if (TI(x).elType==el_i32) {
i32* xp = i32any_ptr(x);
i32* rp; B r = m_i32arrv(&rp, ria);
for (usz i = 0; i < wia; i++) {
i32 c = wp[i];
if (c<0) thrF("/: 𝕨 must consist of natural numbers (%i∊𝕨)", c);
i32 cx = xp[i];
for (usz j = 0; j < c; j++) *rp++ = cx;
i32* rp; B r = m_i32arrv(&rp, wsum);
if (or<2) {
for (usz i = 0; i < wia; i++) {
*rp = xp[i];
rp+= wp[i];
}
} else {
for (usz i = 0; i < wia; i++) {
i32 cw = wp[i];
i32 cx = xp[i];
for (usz j = 0; j < cw; j++) *rp++ = cx;
}
}
dec(w); dec(x);
return r;
} else if (TI(x).elType==el_f64) {
f64* xp = f64any_ptr(x);
f64* rp; B r = m_f64arrv(&rp, ria);
f64* rp; B r = m_f64arrv(&rp, wsum);
for (usz i = 0; i < wia; i++) {
i32 c = wp[i];
if (c<0) thrF("/: 𝕨 must consist of natural numbers (%i∊𝕨)", c);
i32 cw = wp[i];
f64 cx = xp[i];
for (usz j = 0; j < c; j++) *rp++ = cx;
for (usz j = 0; j < cw; j++) *rp++ = cx;
}
dec(w); dec(x);
return r;
} else {
HArr_p r = m_harrs(ria, &ri);
HArr_p r = m_harrs(wsum, &ri);
BS2B xgetU = TI(x).getU;
for (usz i = 0; i < wia; i++) {
i32 c = wp[i];
if (c==0) continue;
if (c<0) thrF("/: 𝕨 must consist of natural numbers (%i∊𝕨)", c);
i32 cw = wp[i];
if (cw==0) continue;
B cx = xgetU(x, i);
for (usz j = 0; j < c; j++) r.a[ri++] = inc(cx);
for (usz j = 0; j < cw; j++) r.a[ri++] = inc(cx);
}
dec(w); dec(x);
return withFill(harr_fv(r), xf);
}
} else {
i64 ria = isum(w);
if (ria>USZ_MAX) thrOOM();
HArr_p r = m_harrs(ria, &ri);
BS2B wgetU = TI(w).getU;
BS2B xgetU = TI(x).getU;

View File

@ -232,7 +232,7 @@ B fchars_c1(B d, B x) {
return file_chars(path_resolve(nfn_objU(d), x));
}
B fchars_c2(B d, B w, B x) {
file_write(path_resolve(nfn_objU(d), w), x);
file_wChars(path_resolve(nfn_objU(d), w), x);
return x;
}
static NFnDesc* fBytesDesc;

View File

@ -48,7 +48,9 @@ typedef struct TStack {
} TStack;
#define TSALLOC(T,N,I) usz N##_dc=(I); u32 N##_e=sizeof(T); TStack* N##_o = (TStack*)mm_allocN(sizeof(TStack)+N##_e*N##_dc, t_temp); N##_o->size=0; N##_o->cap=N##_dc; T* N = (T*)N##_o->data;
#define TSFREE(N) mm_free((Value*)N##_o);
#define TSADD(N,X) { if (N##_o->size==N##_o->cap) { N##_o = tstack_ext(N##_o, N##_e); N = (void*)N##_o->data; } N[N##_o->size++] = X; }
#define TSDBL(N) { N##_o = tstack_ext(N##_o, N##_e); N = (void*)N##_o->data; }
#define TSADD(N,X) { if (N##_o->size==N##_o->cap) TSDBL(N); N[N##_o->size++] = X; }
#define TSADDA(N,P,AM) { u64 n=AM; while(N##_o->size+n>N##_o->cap) TSDBL(N); memcpy(N+N##_o->size,P,n*N##_e); N##_o->size+= AM; }
#define TSSIZE(N) (N##_o->size)
static NOINLINE TStack* tstack_ext(TStack* o, u32 elsz) {
usz ncap = o->cap*2;

View File

@ -84,7 +84,7 @@ B path_dir(B path) { // consumes; returns directory part of file path with trail
}
void file_write(B path, B x) { // consumes path
void file_wChars(B path, B x) { // consumes path
FILE* f = file_open(path, "write to", "w");
u64 len = utf8lenB(x);
@ -96,6 +96,19 @@ void file_write(B path, B x) { // consumes path
dec(path);
fclose(f);
}
void file_wBytes(B path, B x) { // consumes path
FILE* f = file_open(path, "write to", "w");
u64 len = a(x)->ia;
TALLOC(char, val, len);
BS2B xgetU = TI(x).getU;
for (u64 i = 0; i < len; i++) val[i] = o2i(xgetU(x,i));
if (fwrite(val, 1, len, f) != len) thrF("Error writing to file \"%R\"", path);
TFREE(val);
dec(path);
fclose(f);
}
B file_list(B path) {
DIR* d = dir_open(path);

View File

@ -12,6 +12,7 @@ B path_dir(B path); // consumes; returns directory part of file path, with trail
TmpFile* file_bytes(B path); // consumes
B file_chars(B path); // consumes
void file_write(B path, B x); // consumes path
void file_wChars(B path, B x); // consumes path
void file_wBytes(B path, B x); // consumes path
B file_list(B path); // consumes