From ce98efc525ca46a9030336d3bcd161ac90baa657 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Thu, 4 Jul 2024 09:58:14 -0400 Subject: [PATCH] =?UTF-8?q?Transform=20atom=E2=8A=B8=E2=8C=BD=E2=8E=89k=20?= =?UTF-8?q?into=20a=20single=20high-rank=20=E2=8C=BD=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/builtins/cells.c | 9 +++++++++ src/builtins/sfns.c | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 304d819e..963e2663 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -16,6 +16,7 @@ B insert_cells_identity(B x, B f, usz* xsh, ur xr, ur k, u8 rtid); B scan_rows_bit(u8, B x, usz m); // from scan.c B takedrop_highrank(bool take, B w, B x); // from sfns.c +B rotate_highrank(bool inv, B w, B x); // from sfns.c B try_interleave_cells(B w, B x, ur xr, ur xk, usz* xsh); // from transpose.c // X - variable name; XSH - its shape; K - number of leading axes that get iterated over; SLN - number of slices that will be made; DX - additional refcount count to add to x @@ -687,6 +688,14 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { ap[xk] = o2fG(w); return takedrop_highrank(take, a, x); } break; + case n_reverse: { + if (xcr==0 || !isF64(w)) break; + f64* ap; + B a = m_f64arrv(&ap, xk+1); + FILL_TO(ap, el_f64, 0, m_f64(0), xk); + ap[xk] = o2fG(w); + return rotate_highrank(0, a, x); + } case n_transp: if (q_usz(w)) { usz a=o2sG(w); if (a= (u64)l_) { v_%= (i64)l_; if(v_<0) v_+= l_; } v_; }) -static NOINLINE B rotate_highrank(bool inv, B w, B x) { +NOINLINE B rotate_highrank(bool inv, B w, B x) { #define INV (inv? "⁼" : "") if (RNK(w)>1) thrF("⌽%U: 𝕨 must have rank at most 1 (%H ≡ ≢𝕨)", INV, w); B r;