roadmap: detector twins FUN_180535880/180536f90 decoded, per-stub dispatch tables
This commit is contained in:
+37
@@ -268,3 +268,40 @@
|
||||
- План: разметить таблицу → извлечь байты функций 0x18004xxxx (+0x18000a160..0x180074740)
|
||||
→ objdump 0x180000000-adjust → транскрипция в dsp/detect.cpp → верификация SNR 19.8 дБ.
|
||||
- Непустые ранее известные ядра (0x180040cc0..0x180041700) = 8 функций = полный алгоритм детектора.
|
||||
|
||||
### B.6 — ДЕТЕКТОР ПОЛНОСТЬЮ ДЕШИФРОВАН (2026-08-17) — dispatch-модель ИСПРАВЛЕНА
|
||||
- **ИСПРАВЛЕНИЕ dispatch**: у КАЖДОГО стаба СВОЯ таблица (не одна общая 0x182616008).
|
||||
Все стабы читают ОДИН глобальный индекс `DAT_1826159a0` (в дампе = 4, константа), но
|
||||
каждый берёт свой слот из своей таблицы (RIP-rel `48 63 05/4c 8d 15/41 ff 24 c2`).
|
||||
`/tmp/dispatch_map.txt` (223 записи одной таблицы) — УСТАРЕЛ для вызовов детектора.
|
||||
- **Карта стабов FUN_180535880 (float-детектор)**: `0x180001d00`→tbl`0x182616008`→`0x180040d40`
|
||||
(AVX-memset); `0x1800019a0`→tbl`0x182615b88`→`0x180004200`→`0x181a63fe0` (fill float N штук
|
||||
значением из xmm0: rcx=bits, rdx=dst, r8d=N; ветка больших через 0x180017580);
|
||||
`0x1800021e0`→tbl`0x182616688`→`0x1800130e0`; `0x1800018b0`→tbl`0x182615a48`→`0x180003040`→`0x181a557c0`;
|
||||
`0x180001af0`→tbl`0x182615d48`→`0x180005a20`; `0x180001dc0`→tbl`0x182616108`→`0x18000ad60`
|
||||
(комплексное умножение `vfmaddsub213ps`); `0x180001fd0`→tbl`0x1826163c8`→`0x18000f620`
|
||||
(векторная FMA-аккумуляция `out[i]=out[i]+xmm1*in[i]`, AVX2, развёртка по 8);
|
||||
`0x180001e20`→tbl`0x182616188`→`0x18000b820`→`0x181a775a0`.
|
||||
- **FUN_180536f90 = DOUBLE-БЛИЗНЕЦ FUN_180535880** (тот же 3-итерационный цикл, `movsd`/`shl 4`
|
||||
против `movss`/`shl 3`): `0x180001a30`→`0x180004d60`; `0x1800022d0`→`0x180015300`→`0x180040d40`;
|
||||
`0x180001e80`→`0x18000c7e0`; `0x180001910`→`0x1800034c0`→`0x181a62d00`; `0x180001ac0`→`0x180005720`;
|
||||
`0x180001e50`→`0x18000bba0`; `0x180002150`→`0x180012320` (double-FMA-аккум);
|
||||
`0x180001f40`→`0x18000df20`→`0x181a78060`.
|
||||
- **Алгоритм FUN_180535880** (rcx=this, rdx=r15=out, r8={double* A, double* B} по 3 double,
|
||||
r9→[rsp+0x20], [rsp+0xf0]=N): читает A[0..2]/B[0..2], cvtpd2ps→стек [0x28..0x40];
|
||||
r13=2N, r12=r15+N*8, rbp=r15+2N*8. Цикл i=0..2:
|
||||
- i=0: memset r15 (N qword) значением (A0,0); memset r12 (N qword) значением (B0,0);
|
||||
- i=1: rbx=r15+3N*8; fill rbx (N float) константой 0x1824c3ea4; затем 0x1800021e0(rbx,r9,this,N),
|
||||
0x1800018b0(this,N), 0x180001af0(this,rbp,N);
|
||||
- i=2: 0x180001dc0(this,rbp,rbp,N) = комплексное умножение rbp на самого себя;
|
||||
- (после каждого i): rbp += A[i]*r15 (0x180001fd0, 2N float) и rbp += B[i]*r12;
|
||||
- после цикла: 0x180001e20(r12,r15,this,N).
|
||||
- **Ключевые ядра (реальные .text/0x181a*)**: `0x180040d40`=AVX memset по qword-паттерну (798б);
|
||||
`0x181a63fe0`=fill N*4 байт широковещательным 32-бит значением (AVX2, up to 0x8000);
|
||||
`0x18000f620`=FMA-аккум (scalar+ymm+tail, возврат -8/-6 при null/0);
|
||||
`0x18000ad60`=комплексное умножение (vfmaddsub213ps, цепочки xmm/ymm, маска-зоны 0x20 байт);
|
||||
`0x180005a20`=обёртка больших chunk`ов (0x7fffffe0 по 8байт) вокруг 0x18001a5a0.
|
||||
- **Конечные артефакты**: `/tmp/det/det_535880.bin/.dis` (1668б, 435 стр), `det_536f90.bin/.dis`
|
||||
(1935б, 582 стр), `r_*/f_*/p_*` для всех ядер, `sizes.json`.
|
||||
- **Следующий шаг**: транскрипция обоих близнецов в dsp/detect.cpp (или dsp/detector.cpp)
|
||||
с точным порядком float/double операций + комплексного умножения rbp; верификация SNR 19.8 дБ.
|
||||
|
||||
Reference in New Issue
Block a user