From bbb9e7f0edb7506b86ed3e7781f2695a2d296c03 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 15 Apr 2023 01:06:59 +0300 Subject: [PATCH] don't overflow-check widening array-scalar cases when not needed --- src/singeli/src/dyarith.singeli | 8 ++++---- src/singeli/src/genArithTables.bqn | 26 +++++++++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/singeli/src/dyarith.singeli b/src/singeli/src/dyarith.singeli index 3a36384d..6768d7c9 100644 --- a/src/singeli/src/dyarith.singeli +++ b/src/singeli/src/dyarith.singeli @@ -190,7 +190,7 @@ def arithAA{mode, F, W, X, R} = { else arithAAu{vw, mode, F, W, X, R} } -# mode: 0:overflow-checked, needed; 1:overflow-erroring; 2: overflow-checked, not needed +# mode: 0:overflow-checked, needed; 1:overflow-erroring; 2: overflow-checked, not needed; 3: overflow-erroring, not needed fn arithSAf{vw, mode, F, swap, W, X, R}(r:*void, w:u64, x:*void, len:u64) : u64 = { # show{F, swap, mode, W, X, R} assert{len>0} @@ -198,19 +198,19 @@ fn arithSAf{vw, mode, F, swap, W, X, R}(r:*void, w:u64, x:*void, len:u64) : u64 def TY = [bulk]R def overflow = tern{mode==1, {i}=>return{1}, {i}=>return{i}} - def run = runner{(R==f64) | (mode==2), R, F} + def run = runner{(R==f64) | (mode>=2), R, F} def getW{v} = trunc{W, v} def getW{v & W==f64} = interp_f64{v} cw:= ty_sc{W, TY}**getW{w} - def unr = tern{mode==2, 2, 1} # same as in arithAAimpl + def unr = tern{mode>=2, 2, 1} # same as in arithAAimpl muLoop{bulk, unr, len, {is, M} => { def cx = loadBatch{*X~~x, is, ty_sc{X, TY}} def cws = tuplen{is}**cw storeBatch{*R~~r, is, arithProcess{F, run, overflow, M, is, tern{swap,cx,cws}, tern{swap,cws,cx}, TY}, M} }} - if (mode==1) 0 + if (mode==1 or mode==3) 0 else len } diff --git a/src/singeli/src/genArithTables.bqn b/src/singeli/src/genArithTables.bqn index ef026316..ee9da3a9 100644 --- a/src/singeli/src/genArithTables.bqn +++ b/src/singeli/src/genArithTables.bqn @@ -136,13 +136,15 @@ Make ← {𝕊ns: { 𝕊 swap: choices ← ⌽⍟swap⌾(2⊸↑)¨ ns.sa hadChrArr ← 0 - ResMap ← {{(2⊑¨𝕩)⌾((2↑¨𝕩)⊸⊑) 2‿2⥊@} 'c'=𝕩} + _tyMap ← {(𝔽 𝕩)⌾((2↑¨𝕩='c')⊸⊑) 2‿2⥊@} + ResMap ← ('c'=2⊑¨⊢) _tyMap { 0≡≠𝕩? @; charAtm ← 'c' ≡ ⊑⊑𝕩 hasNumArr ← ⊑'i' ∊ 1⊑¨𝕩 hasChrArr ← ⊑'c' ∊ 1⊑¨𝕩 resChr ← ResMap 𝕩 + uncheckedMap ← (⊑¨'u'∊¨⊢) _tyMap 𝕩 argarr ← ⌽⍟swap "SA" canOverflow ← "f64"⊸≢¨ tyName P ← {∾⟨"{",𝕨,",",𝕩,"}"⟩}´ @@ -158,12 +160,13 @@ Make ← {𝕊ns: charArr ← num⊑isc ¬ (charAtm∧¬num⊑canOverflow) ∨ (onlyFirst ∧ 𝕨=2) ∨ (¬hasChrArr)∧charArr? currRes ← charAtm‿charArr⊑resChr + unchFn2 ← charAtm‿charArr⊑uncheckedMap currRes≢@? tw←num⊑charAtm⊑tyi‿tyc ⋄ tx←num⊑tyName ⋄ tr←𝕩⊑currRes⊑tyi‿tyc tr≢@? siName ← ∾⟨id, argarr, 𝕨⊑"?ce", ∾'_'⊸∾¨ tw‿tx‿tr⟩ 𝕨 { 𝕊: - siSrc∾↩ ∾⟨"export{'", siName, "', arithSA{", '0'+ 𝕨⊑⟨@, onlyFirst⊑0‿2, 1⟩, ',', si, ',', '0'+swap, ∾(',' ∾ 'u'⌾⊑⍟('c'≡⊑))¨ tw‿tx‿tr, "}}", nl⟩ + siSrc∾↩ ∾⟨"export{'", siName, "', arithSA{", '0'+ 𝕨⊑⟨@, onlyFirst⊑0‿2, unchFn2⊑1‿3⟩, ',', si, ',', '0'+swap, ∾(',' ∾ 'u'⌾⊑⍟('c'≡⊑))¨ tw‿tx‿tr, "}}", nl⟩ singeliASFns∾↩