From 6c9f2c717a4be41f07807409a495098dc7ea32a0 Mon Sep 17 00:00:00 2001 From: Demur Rumed Date: Sun, 3 Mar 2024 23:10:54 +0000 Subject: [PATCH] Optimize targeting expression evaluation to bypass inspection when AND/OR resolved --- src/rs/src/skill.rs | 48 ++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/rs/src/skill.rs b/src/rs/src/skill.rs index eeba7936..b8498315 100644 --- a/src/rs/src/skill.rs +++ b/src/rs/src/skill.rs @@ -635,7 +635,6 @@ macro_rules! tgtcore { } impl Tgt { - const _not: u32 = 0; deftgt!(own, _own, 1); deftgt!(notself, _notself, 2); deftgt!(all, _all, 3); @@ -683,17 +682,18 @@ impl Tgt { let mut opnum = 0; let mut vals = [false; 4]; let mut valnum = 0u8; + let mut ignore = 0; loop { if (x & 1) == 0 { let f = (x >> 1) & 31; x >>= 6; - let res = match f { - Tgt::_not => { - ops[opnum] = (1, valnum); - opnum += 1; - continue; - } + if f == 0 { + ops[opnum] = (1, valnum); + opnum += 1; + continue; + } + vals[valnum as usize] = ignore == 0 && match f { Tgt::_own => ctx.get_owner(c) == ctx.get_owner(t), Tgt::_notself => c != t, Tgt::_all => true, @@ -794,7 +794,6 @@ impl Tgt { } _ => false, }; - vals[valnum as usize] = res; valnum += 1; } else { ops[opnum] = ((x & 2) as u8, valnum); @@ -806,25 +805,34 @@ impl Tgt { if opnum == 0 { return vals[valnum as usize - 1]; } - match ops[opnum - 1] { - (0, n) if valnum > n + 1 => { - opnum -= 1; - vals[valnum as usize - 2] &= vals[valnum as usize - 1]; - valnum -= 1; - continue; + if valnum <= ops[opnum - 1].1 { + break + } + let op = ops[opnum - 1].0; + match op { + 0 | 2 => { // AND | OR + let val = vals[valnum as usize - 1]; + if (op == 0) != val { + ignore += 1; + ops[opnum - 1] = (4, valnum); + } else { + valnum -= 1; + ops[opnum - 1] = (3, valnum); + } } - (1, n) if valnum > n => { + 1 => { // NOT opnum -= 1; vals[valnum as usize - 1] = !vals[valnum as usize - 1]; - continue; } - (2, n) if valnum > n + 1 => { + 3 => { // NEXT + opnum -= 1; + } + 4 => { // DROP opnum -= 1; - vals[valnum as usize - 2] |= vals[valnum as usize - 1]; valnum -= 1; - continue; + ignore -= 1; } - _ => break, + _ => unsafe { core::hint::unreachable_unchecked() }, } } }