24t: exact semantics th2030=mul / th2270=add (with special cases); FUN_180563a60 identified as init-time dB-domain table builder (log x 8.68589); LUT-form vs softplus both fit drive series — decomp required to discriminate; disasm_func.py tool

This commit is contained in:
2026-08-24 22:13:01 +03:00
parent 0bc8427cd7
commit 5bd60cfefd
2 changed files with 91 additions and 0 deletions
+33
View File
@@ -287,3 +287,36 @@ ILT-резолв bigkernel-стабов даёт impl в 141100..141940 — вс
использует закэшированный кернел; либо трассировать надо момент инициализации использует закэшированный кернел; либо трассировать надо момент инициализации
- Выход плагина НЕдетерминирован: md5 двух свободных рендеров различен при - Выход плагина НЕдетерминирован: md5 двух свободных рендеров различен при
одинаковом rms (PRNG-дизеринг из LCG-прологов) — метрика только спектральная! одинаковом rms (PRNG-дизеринг из LCG-прологов) — метрика только спектральная!
## ДОПОЛНЕНИЕ 24t: ТОЧНЫЕ СЕМАНТИКИ СКАЛЯР-ОПОВ + опознание 563a60
Инструмент: scripts/disasm_func.py (полный дизасм функции с резолвом
RIP-констант инлайн).
### Тела скаляр-трансформов (float-ветки):
| стаб/impl | семантика | спец-случаи |
|---|---|---|
| th2030→ffe0 | dst[i] *= scalar | scalar==1 → скип; ==0 → zero-fill |
| th2270→14c40 | dst[i] += scalar | scalar==0 → скип |
Оба: скалярный хвост + AVX2 основной цикл (vmulps/vaddps ymm). Двойные
ветки (1d30/22a0) аналогичны на sd/pd.
### FUN_180563a60 = init-time ПОСТРОИТЕЛЬ таблицы (не per-bin!)
- Один caller: 1805636c2 (init-семейство).
- Константы пролога: xmm11=8.68589 (20/ln10 — ln⇒дБ!), xmm12=1/1024,
xmm14=0.5, xmm10=2, xmm9=1, xmm6=1; вызов IAT 181a14cd0 (log-класс)
над double из [obj+0x4198], ×8.68589 → дБ, запись пар во вектор
([obj+0xe0], рост через realloc 56c640).
- Вывод: строит дБ-доменную таблицу парами при param-rebuild — согласуется
с «LUT» ролью. Хвост с вирт. вызовом [rax+0x10] не декодирован.
### Алгебра T1: обе формы фитуют серию драйва (8 точек недоопределены)
- softplus α·ln1p(L/β)+c: rms 0.016 (α=3.2193 β=0.4927 c=0.542)
- LUT-форма t=((dBA)/(BA))^γ·M: rms 0.029 (A=36.2 B=20.0 γ=2.097 M=10.49)
Различить только декомпом тракта am/res→scratch или бОльшим числом точек.
### Открытые микровопросы
1. Значение xmm7 на входе th2270 в FIR-цикле (52b5f6): трассировка от
52a583; если mix^p=1 → «bands+=1» противоречит провалам ⇒ xmm7 иной
либо порядок аргументов иной.
2. Раскладка объекта-вектора (тег 6) для ops AD.
+58
View File
@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""disasm_func.py — full-function disassembler with resolved RIP constants.
Usage: disasm_func.py <VA> [max_bytes]
Stops on int3-run after a ret. Prints resolved [rip+X] targets inline.
"""
import sys
import struct
from capstone import Cs, CS_ARCH_X86, CS_MODE_64
from capstone.x86 import X86_OP_MEM, X86_REG_RIP
BASE = 0x180000000
_data = open('/home/m/re-tools/soothe_mem.bin', 'rb').read()
def rd(va, n):
return _data[va - BASE: va - BASE + n]
def main():
va = int(sys.argv[1], 16)
maxb = int(sys.argv[2], 16) if len(sys.argv) > 2 else 0x4000
code = rd(va, maxb)
md = Cs(CS_ARCH_X86, CS_MODE_64)
md.detail = True
out = []
run_int3 = 0
seen_ret = False
for ins in md.disasm(code, va):
line = '%08x %-22s %s %s' % (ins.address, ins.bytes.hex(), ins.mnemonic, ins.op_str)
note = ''
for op in ins.operands:
if op.type == X86_OP_MEM and op.mem.base == X86_REG_RIP:
tgt = ins.address + ins.size + op.mem.disp
note += ' ; ->%x' % tgt
b4 = rd(tgt, 8)
f32v = struct.unpack('<f', b4[:4])[0]
f64v = struct.unpack('<d', b4[:8])[0]
u64v = struct.unpack('<Q', b4[:8])[0]
if abs(f32v) > 1e-6 and abs(f32v) < 1e8:
note += ' f32=%.6g' % f32v
elif abs(f64v) > 1e-6 and abs(f64v) < 1e12:
note += ' f64=%.6g' % f64v
else:
note += ' u64=%x' % u64v
line += note
out.append(line)
if ins.mnemonic == 'ret':
seen_ret = True
run_int3 = 0
elif ins.mnemonic == 'int3':
if seen_ret:
run_int3 += 1
if run_int3 >= 4:
break
else:
run_int3 = 0
print('\n'.join(out))
if __name__ == '__main__':
main()