From e33b3b95ee5d523bd475b115ef44e6ab6786c548 Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 12 Mar 2025 02:00:48 +0200 Subject: [PATCH] relax documented RangeFn behavior to align with NEON impl --- src/utils/calls.h | 2 +- test/cases/build-specific/test_range.bqn | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/utils/calls.h b/src/utils/calls.h index 6799ed17..ff787cd7 100644 --- a/src/utils/calls.h +++ b/src/utils/calls.h @@ -34,7 +34,7 @@ typedef struct { EqFn fn; u8 data; } EqFnObj; #define EQFN_GET(W_ELT, X_ELT) ({ u8 eqfn_i_ = EQFN_INDEX(W_ELT, X_ELT); (EqFnObj){.fn=eqFns[eqfn_i_], .data=eqFnData[eqfn_i_]}; }) #define EQFN_CALL(FN, W, X, L) (FN).fn(W, X, L, (FN).data) // check if L elements starting at a and b match; assumes L≥1 -typedef bool (*RangeFn)(void* xp, i64* res, u64 len); // writes min,max in res, assumes len≥1; returns 0 and leaves res undefined if either any (floor(x)≠x or abs>2⋆53), or (x≠(i64)x) +typedef bool (*RangeFn)(void* xp, i64* res, u64 len); // assumes len≥1; if x has non-integers or values with absolute value >2⋆53, will return 0 or report min<-2⋆53 or max>2⋆53; else, writes min,max in res and returns 1 extern INIT_GLOBAL RangeFn getRange_fns[el_f64+1]; // limited to ≤el_f64 typedef void (*BitSelFn)(void*,u64*,u64,u64,u64); diff --git a/test/cases/build-specific/test_range.bqn b/test/cases/build-specific/test_range.bqn index 1ecc6116..393dbc27 100644 --- a/test/cases/build-specific/test_range.bqn +++ b/test/cases/build-specific/test_range.bqn @@ -1,6 +1,11 @@ # needs: -DTEST_RANGE +"basic test doesn't work; are you on a -DTEST_RANGE build?" ! 1‿9‿1 ≡ •internal.Temp 3‿1‿4‿1‿5‿9 + +%DEF invalid Invalid ← {·‿·‿0: 1; s‿e‿1: (s<-2⋆52) ∨ e>2⋆52}∘•internal.Temp + ≢(⟨⟨0‿9‿1,↕10⟩ ⋄ ⟨¯5‿¯3‿1 ⋄ ¯5‿¯3‿¯4‿¯4‿¯4‿¯4‿¯4⟩⟩∾{⟨⟨¯2,𝕩-3,1⟩,¯2+↕𝕩⟩}¨1+↕100) {exp‿a𝕊𝕩: exp (⋈!≡) •internal.Temp 𝕩•internal.Variation a}⌜ "Ai8"‿"Ai16"‿"Ai32"‿"Af64" T←⋈ ! ⊣ ≡ ·•internal.Temp "Ab"•internal.Variation⊢ ⋄ ≠{𝕊n: 1‿1‿1 T 𝕩⥊1 ⋄ 0‿0‿1 T 𝕩⥊0 ⋄ 0‿1 {0‿1‿1 T (¬𝕨)⌾(𝕩⊸⊑) n⥊𝕨}¨⍟(n>1) 2•rand.Range n}¨1+↕500 -{! 0≡2⊑•internal.Temp (2⋆63)⌾(𝕩⊸⊑) 10⥊0}¨ ↕10 -⟨2⋆63, 1.5, 0÷0⟩ {! 0≡2⊑•internal.Temp 𝕨⌾(𝕩⊸⊑) 20⥊0}⌜ ↕20 +%USE invalid ⋄ Invalid¨ ⟨↕4, -⊸∾ 2⋆↕50, π×↕4, 10⥊2⋆60⟩ %% 0‿0‿1‿1 +%USE invalid ⋄ ⟨2⋆63, 1.5, 0÷0⟩ {𝕩!Invalid 𝕨⌾(𝕩⊸⊑) 20⥊0}⌜ ↕20 +%USE invalid ⋄ p←⟨1+2⋆-52, 1-2⋆-53⟩ ⋄ {𝕩!Invalid 𝕩⌾(10⊸⊑) 20⥊0}¨ ⟨∞, ¯∞, 0.1, ¯0.1⟩ ∾ ((1∾p) ×⌜ -⊸∾ 2⋆54+↕12) ∾○⥊ p ×⌜ 2⋆↕70 ≠{! 0‿0‿1 ≡ •internal.Temp 𝕩↑(𝕩⥊0)∾10⥊0÷0}¨ 1+↕10