From 147d4530c17d26b5d767094f1d284e4b55d7b1cd Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 15 Apr 2023 01:53:04 +0300 Subject: [PATCH] =?UTF-8?q?slightly=20better=20overflow=20check=20for=20i8?= =?UTF-8?q?=C3=97i8=E2=86=92i8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/singeli/src/dyarith.singeli | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/singeli/src/dyarith.singeli b/src/singeli/src/dyarith.singeli index 6768d7c9..10608919 100644 --- a/src/singeli/src/dyarith.singeli +++ b/src/singeli/src/dyarith.singeli @@ -46,11 +46,13 @@ def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i8==eltype{T} & hasar def wp = unpackQ{w, T ~~ (T**0 > w)} def xp = unpackQ{x, T ~~ (T**0 > x)} def rp = each{__mul, wp, xp} - def bad = each{{v} => ty_s{(v<<8)>>8 != v}, rp} if (M{0}) { # masked check + def bad = each{{v} => ty_s{(v<<8)>>8 != v}, rp} tup{packQ{rp}, tup{'homAny', M{packQ{bad}}}} } else { # unmasked check; can do check in a simpler way - tup{packQ{rp}, tup{'homAny', tupsel{0,bad}|tupsel{1,bad}}} + def bad = each{{v} => ty_s{v ^ (v>>15)}, rp} + def RU = to_el{u16,T} + tup{packQ{rp}, tup{'~andAllZero', RU~~tree_fold{|, bad}, RU**0xff80}} } } def arithChk2{F, M, w:T, x:T & match{F,__mul} & isvec{T} & i16==eltype{T} & hasarch{'X86_64'}} = { @@ -113,10 +115,12 @@ def runner{u, R, F} = { run } +# homAny, topAny already give masked vals; anyne doesn't, and ~andAllZero assumes no masking def runChecks_any{F, vals} = { F{tree_fold{|, each{{c}=>tupsel{1,c}, vals}}} } def runChecks{type=='homAny', vals, M} = runChecks_any{homAny, vals} def runChecks{type=='topAny', vals, M} = runChecks_any{topAny, vals} def runChecks{type=='none', vals, M} = 0 +def runChecks{type=='~andAllZero', vals, M & ~M{0}} = ~tree_fold{&, each{andAllZero, ...slice{flip{vals}, 1}}} def runChecks{type=='anyne', vals, M} = { def cols = flip{vals} def xs = tupsel{1, cols}