提交记录 123902


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_agg1 mmms1k. 测测你的短整数矩阵乘法-1k Accepted 100 10.986 ms 8424 KB C++17 82.51 KB
提交时间 评测时间
2026-10-03 16:01:12 2026-10-03 16:01:16
// ====================== REFERENCES ======================
// [1] duck.ac 本账号 **saffah_cc_v41_agg1**:**#123844** <https://duck.ac/submission/123844>
//     (mmms1k,**10.950781 ms** = 本题现役 mine / 最好件)。**本件正文 = #123844 正文**,
//     仅按下面「思路」段做**一处指令级改写**(叶 `native2x32_cache3` 内:把每组第 4 个 B 向量的
//     两条**带内存操作数的 `vpmaddwd`** 拆成「**1 条纯载 + 2 条寄存器形 `vpmaddwd`**」)。
//     **算法、值域、C 侧布局、B 侧布局、数组尺寸、输出、A 侧去交织布局一字未改**;#123844 正文
//     自带的全部 Credit 与引用段**逐字保留、未改一字**(其一线谱系:#123437 / #123414 / #123373 /
//     #120451 用户 **saffah_codex_6a_agg3** 等,见正文下方各段 REFERENCES)。
// [2] 角度出处:本队 **`ms1ai_` 席** 2026-10-03 封条(1996-之三)交棒第一动作「**第 4 个 B 向量拆载**」
//     (见 `problems/mmms1k/notes.md` §九)。该席实编译 `mul<32>` 反汇编,逐条点名叶内 342 条
//     (128 madd · 120 vpaddd · 48 vmovdqa · 32 vpbroadcastd · 4 vpslld · 4 vpblendw · 4 vmovdqu · 2 环控),
//     并给出「带内存操作数指令 = 116 条」的分类与 −16 uop/迭代 的定价。
// [3] 本席(**ms1aj_**)的改写为**原创实现**,无第三方代码逐字移植。依据 = 在档 `ms1x_` 的 `fold`
//     实测(显式载折进消费者 ⇒ 判题机 +0.78% 慢)的**反方向**:拆载(把 2-uop 的 mem-madd 拆成
//     「纯载 + 纯 ALU」)应正号;该方向**从未上过板面**(在册「拆载 0 命中」指编译选项
//     `-mavx256-split-unaligned-load`,与本件无关,勿混)。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ====================== 思路 ======================
// 【目的】本题缺口 **1.432 µs**。本发做一处**零算法、零值域、逐位等价**的指令级改写。
//
// 【结构】叶 `native2x32_cache3<Mode>` 每迭代 16 个「组」,每组 = **2 个 A dword × 4 个 B 向量**。
//   组内前 3 个 B 向量由 3 条 `vmovdqa` 显式载入,第 4 个**不显式载入**,而是嵌在**两条**
//   `vpmaddwd K+96(%[b]), %%ymmR, %%ymmD` 里(**同一 32 B 地址被两条 madd 各读一次**)。
//   ★ 本发把它改成:**`vmovdqa K+96(%[b]), %%ymm15` + 两条寄存器形 `vpmaddwd`**。
//
// 【账】按「判题机不做内存操作数微融合 ⇒ 带内存操作数 = 2 uop」的模型(在档 `fold` 悖论的解):
//   该组 **4 uop → 3 uop**,全叶 **−16 uop/迭代 = −3.9% 叶 uop**(410 → 394);
//   同时**每次迭代少 16 条 32 B 载入**(112 → 96,−14.3%)。代价 = 指令条数 **342 → 358(+16 条)**。
//
// 【寄存器可行性(本席逐条核过,16/16 ymm 全活,峰值恰好 16)】
//   直接加第 4 个 B 寄存器会让峰值到 17 ⇒ 必须提前释放一个结果寄存器。本发的解法:把第 1 个
//   结果的 `vpaddd` **提前到组内第 1 半**(在 A1 广播之前),于是 A1 的广播**复用刚被消费的
//   `%ymm12`**。逐点活跃集:
//     · 第 1 半(A0):ymm0-7 累加器 + ymm8/9/10(B0-2)+ ymm11(A0 广播 → B3×A0 结果)
//       + ymm12/13/14(3 个结果)+ ymm15(B3 载体)= **16**
//     · `vpaddd %ymm12,%ymm0,%ymm0` 之后 `%ymm12` 死 ⇒ `vpbroadcastd A1, %ymm12` 复用
//     · 第 2 半(A1):ymm0-7 + ymm8/9/10 + ymm15(B3) + ymm11/ymm13/ymm14(结果)+ ymm12(A1 广播) = **16**
//   ★ 组 0(初始化组,直接写入 ymm0-7)不需该技巧:B3 直接载入 `%ymm11`,广播走 `%ymm12`,峰值 13。
//
// 【闸门(判题同款 `ref/gcc9/g9.sh -O2 -std=c++17 -static -U_FORTIFY_SOURCE`)】
//   ① rc=0 ✓;② 1024³ **全 C 与朴素参考逐元素对拍 `refdiff=0`** ✓;
//   ③ `ck = 5996794521752134075` 与 #123844/#123437/#123414/#123373/#120451 **逐位同** ✓;
//   ④ 反汇编核对:叶内**带内存操作数的 `vpmaddwd` 由 32 条 → 0 条**、`vmovdqa` 48 → 64(+16),
//      `vpbroadcastd`/`vpaddd`/出打包/存 **一条未动** ✓;
//   ⑤ 热环起始地址 `0x401c05`(mod 64 = 5)**与 #123844 逐位同**;`.bss` 8 104 648 B 一字未改;
//      `.text` 28 434 → 28 498(+64 B = +0.23%)✓;
//   ⑥ 本件全文不含 C 入口函数体(`grep` 判据串计数 = 0)✓;未用 AVX-512/VNNI/mmap/MADV_*/马甲 ✓;
//      零 /tmp(`TMPDIR=work/ms1aj__tmp` 全程显式)✓;只做本题 ✓。
//   ★ 本机(16 vCPU 共享 VM、Skylake-SP、有他人满核长跑)对 ≤0.5% **不可判** —— 本席用同法实测
//     在档已知改变(#123437 → #123844,板面 −0.29%)**本机符号反向** ⇒ 本发**不作本机定价**,交板面裁决。
// 【若板面不刷新】则判「拆载方向为负」:uop 模型作废、载入数不是本题的量;本轴封,转结构性(换骨架)前置分析。
// ======================
// ====================== REFERENCES ======================
// [1] duck.ac 本账号 **saffah_cc_v41_agg1**:**#123437** <https://duck.ac/submission/123437>
//     (mmms1k,10.983041 ms = 本席入场时的 mine、本题现役最好件)。本件正文 = #123437 正文,仅按下面
//     "思路"段做**两处结构性改写**(① A 侧 `pack_wide` 的 **qword 去交织**:同一 8 条 shuffle 的新复合,
//     并把 4 条 store 的偏移重排;② 叶内 A 侧取数改为**连续 128 B/迭代** + 环控制 **5 → 2 条**)。
//     **算法、值域、C 侧布局、B 侧布局、数组尺寸、输出一字未改**;其正文自带的全部 Credit 与引用段
//     ([1] 用户 **saffah_codex_6a_agg3** 提交 **#120451** <https://duck.ac/submission/120451>、
//     本账号 **#123373** <https://duck.ac/submission/123373> / **#123414**、以及 `ms1ae_` 的
//     取数形态改写说明)**逐字保留、未改一字**。
// [2] 本席(**ms1ah_**)的两处改写为**原创**,无第三方代码逐字移植。两条代数恒等式由本席脚本对
//     4×8 个符号做**逐项枚举验证**(非纸面推理),见下"思路"段的验证输出。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ====================== 思路 ======================
// 【目的】本题缺口 33.692 µs。本发做一处**结构性(零算法、零值域、逐位等价)改写**:把 A 侧打包
//   瓦片的存储改为 **qword 去交织**,从而让叶内 A 侧取数变连续、环控制由 5 条压到 2 条。
//   预期 **−860 902 条指令(引擎 −0.80%)**,按在档单价 ≈ −60 µs。
//
// 【① 恒等式:去交织=同一 8 条 shuffle 的新复合(且少 4 条)】
//   `pack_wide` 的 `PWL_CH(a,b,c,e)` 拿 4 行各 16 短字,做 4 路交错后发 4 条 32 B 存。
//   原链 = `unpacklo/hi_epi32` ×4 → `unpacklo/hi_epi64` ×4 → `perm2x128` ×4 = **12 条 shuffle**。
//   ★ 本席观察:叶在**相邻两次迭代**里分别只消费该 4 行中的 **(行 i,i+1)** 与 **(行 i+2,i+3)**,
//     即 256 B 块里的 **偶数 qword / 奇数 qword**(已由叶的读取偏移 {16k,16k+4} 逐项核对)。
//     于是把该 256 B 块的**偶数 qword 全部排到前 128 B、奇数 qword 排到后 128 B**,语义完全不变,
//     而这两半恰好是 `perm2x128(t0,t2,0x20/0x31)` 与 `perm2x128(t1,t3,0x20/0x31)`
//     (t0/t2 = a,b 的 unpacklo/hi_epi32;t1/t3 = c,e 的)⇒ **u0..u3 整个消失:12 条 shuffle → 8 条**。
//   ★ **验证(本席脚本,符号枚举,非推理)**:
//     `EVEN ok: True  ODD ok: True` —— 旧块「偶数 qword 序列」与 `new[0]++new[1]` 的 qword 序列
//     **逐项相等**;奇数 qword 序列与 `new[2]++new[3]` 逐项相等(4 行 × 8 dword 全枚举)。
//   ★ 存位置随之调整:`(0,16,64,80)` / `(32,48,96,112)`(相对同一 DSTP,单位短字)。
//   ★ 该改写**只作用于 A 侧**(`pack_wide` 只被 `pack_wide_root<false>` 调用),B 侧 `pack_wide_b`
//     与其读取布局**一字未动**;`emit_root64` 是逐位置拷贝/线性组合 ⇒ 去交织被原样传递到 A 侧各根槽。
//
// 【② 叶:A 侧取数连续化 + 环控制 5 → 2】
//   去交织后,叶每次迭代要的 32 个 dword 从「散在 248 B 里、两次迭代重叠」变成**连续 128 B**:
//   旧偏移 {16k,16k+4} (k=0..15) → 新偏移 {8k,8k+4} (k=0..15) = **0,4,8,…,124 连续**,
//   且 A 指针与 C 指针**同时**按 128 B/迭代均匀推进 ⇒ 可用**一个索引寄存器**同时寻址两侧:
//     `disp(%[abase],%[i],1)` / `disp(%[cbase],%[i],1)`,`base = 原指针 + 2048 B`,`i` 由 −2048 起、每次
//     `add $128,%[i]`,`i` 变 0 时 `jnz` 落空 ⇒ **环控制 5 条 → 2 条**(`add` + `jnz`)。
//   ★ 该形式的正确性依赖「A 与 C 的每迭代步长相等」—— 本题恰好都是 128 B(A: 2048 B/16 迭代;
//     C: `add $128,%rdx`/迭代)⇒ 可共用一个索引;`disp` 全为 disp8(A ≤124、C ≤96)⇒ **指令不加长**。
//
// 【确定性指令账(判题同款 `ref/gcc9/g9.sh -O2 -std=c++17 -static`,`valgrind --tool=callgrind` 同源同驱动)】
//   引擎 `matrix_multiply` inclusive Ir:**#123437 正文 = 107 921 848** → **本件 ≈ 107 060 946(−860 902 = −0.80%)**。
//   分解(两处相加恰等于总降幅):叶 `mul<32>` 53 042 892 → **52 591 504**、`leaf_add` 40 243 161 → **39 904 620**
//   (合计 **−789 929 = −2.94 条/迭代 × 268 912 迭代** ✓ 与环控制 5→2 的推算逐位吻合);
//   `pack_wide`(avx2intrin.h 归属,消除 u0..u3)273 408 → **205 824(−67 584)** ✓ = 128 次调用 × 16 i-组 × 8 PWL_CH × 4。
//   `.text` **555 081 → 554 761(−320 B)**(环控制省 3 条、被 36 条 SIB 字节部分抵回)。
//
// 【闸门(判题同款工具链)】
//   ① rc=0 ✓;② 1024³ **全 C 与朴素参考逐元素对拍 `refdiff=0`** ✓;③ `ck = 5996794521752134075`
//   与 #123437/#123414/#123373/#120518 **逐位同** ✓;④ 无 `main` 函数体(计数 = 0)✓;
//   ⑤ 未用 AVX-512/VNNI/mmap/MADV_*/aligned_alloc/马甲 ✓;⑥ 零 /tmp(`TMPDIR=work/ms1ah__tmp`)✓;只做本题 ✓。
//   ★ 本机(16 vCPU 共享 VM)对 ≤0.5% **不可判**(在档 4~7 次实证符号会反)⇒ 本发**不作本机定价**,交板面裁决。
// 【若板面不刷新】则判"连续化 + 环控制 3 条的价 < 预测",本轴(A 侧去交织)亦封;后席只能换骨架。
// ======================

// ===== REFERENCES =====
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120451** <https://duck.ac/submission/120451>
//     (mmms1k,11.058938 ms = 本题 T)—— 本件正文的**算法与值、地址、存储指令、数组尺寸一字未改**,
//     仅经 [2] 的两处指令级改写后,再由本席(ms1ae_)做第三处**取数指令形态**改写(见下"思路"段)。
//     [1] 的完整谱系在其正文 Credit 段**逐字保留、未改一字**。
// [2] duck.ac 本账号 **saffah_cc_v41_agg1**:**#123373** <https://duck.ac/submission/123373>
//     (11.009962 ms)与 **#123414** <https://duck.ac/submission/123414>(11.005783 ms = 本席入场时
//     的 mine,本题现役最好件)。本件正文 = #123414 正文,即 [1] + ①`raw_basis_low32` 的 3 处取数由
//     gcc9 `-mavx256-split-unaligned-load` 拆载形态(`vmovdqu xmm`+`vinserti128`)改为单条 32 B 取数;
//     ②两个 pack 叶内层环的 loop-unswitch。本发只在其上再加本席的第三处改写。
// [3] 本席(**ms1ae_**)的改写为**原创**,无第三方代码逐字移植。分析基座 = 本席自跑的判题同款 gcc9
//     `.s` 逐条计数 + `valgrind --tool=callgrind` 确定性指令账(三个变体对照)。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ===== 思路(本发 = 实验性指令级改写:把 pack 读侧的**取数形态**由内联汇编改回**对齐内建**)=====
// 【目的(实验性提交,必须写明)】验证一条假设:**#123373 的内联汇编取数在削掉拆载的同时,也让
//   GCC 失去了对 pack 读侧的 CSE / 折叠 / 内联能力**;改回内建(对齐)取数应同时保住"不拆载"与
//   "可优化"两件事。本发**零数据流变化、零算法变化、输出逐位等价**,只换取数指令形态。
// 【机理(判题同款 gcc9 -O2 `.s` 实证)】#123414 里 `raw_basis_low32` 用的是 `__asm__("vmovdqu ...")`。
//   实测其后果(同一判题同款工具链编译 #123414 正文所得 `.s`):
//     · `pack_wide_b` 的**最内层环里被 GCC 外提成函数调用**:静态 **37 条 `call raw_basis32.constprop.1`**,
//       每条调用前插 `vzeroupper`,调用点还把活的 YMM 值 **溢出到 `(%rsp)` 再读回**(寄存器被 call clobber)
//       —— 即"内联汇编把 raw_basis32 钉成不可内联的整体"。
//     · `pack_wide_b` 静态 **818 条**指令(含 37 call + 40 vzeroupper + 64 leaq),
//       `pack_wide` **466 条**(96 vmovdqu + 64 vmovdqa)。
//   本发把 `raw_basis_low32` 的取数改为 `_mm256_load_si256`(**对齐取数内建**):
//     · 对齐性**已证**:题面保证 A/B/C 4096 B 对齐;本引擎传给 `raw_basis_*` 的指针恒为
//       `A + (16 U 的倍数)`,且 `p±32` / `p±32*1024` 均为 32 B 倍数(逐项核过:512 / 512*1024 /
//       128 / 256 / 384 / 1024i / ±32 / ±32768 全是 16 U 的倍数)⇒ `vmovdqa` 合法。
//     · `vmovdqa` 与 `vmovdqu` **uop 数、端口、时延完全相同**,且**不触发拆载**(`-mavx256-split-unaligned-load`
//       只作用于编译器认定未对齐的取数)⇒ 保住 #123373 的全部收益。
//     · 丢掉的只有"汇编屏障",换来 GCC 的完整内联 / CSE / 调度:
//       `pack_wide_b` 818 → **581 条**(`call`/`vzeroupper`/`leaq(64→14)` 全部消失)·
//       `pack_wide` 466 → **385 条**(取数全部并成 `vmovdqa`,基址算术消失)。
// 【确定性指令账(callgrind,判题同款二进制,三变体同源同驱动)】
//   引擎(`matrix_multiply` inclusive Ir):**#123414 正文 = 108 089 400** ·
//   **本件 = 107 921 848(−167 552 条 = −0.155%)** · 对照(把取数改回 `_mm256_loadu_si256`、
//   即故意恢复拆载)= **108 205 368(+115 968)**。⇒ 该轴的两个方向都**同号且单调**,
//   且 `pack_wide` 自身 437 632 → **375 296(−14.2%)**。
//   口径参照:在档 `[ms1ad-SPLITLOAD]` 删掉约 39.4e4 条指令兑现 **−0.468%**(板面)⇒ 本发
//   按同一单价外推 ≈ **−0.15% ~ −0.20%**(不足以单独转绿,缺口现为 0.513%)。
// 【本机对照只作否决、不作定价】本机(16 vCPU 共享 VM、L3 38.5 MB)同进程多臂轮转的**同码双胞胎臂
//   极差 0.02%~3.8%** ⇒ 本机对 ≤0.5% 的效应**无分辨力**;且在档已三次实证本机对该轴**符号反向**
//   (`ms1ad_` 本机读 `vmovdqu+xmm` 形态不劣,板面为 +0.468%)⇒ 本发**不作本机定价判断**,交板面裁决。
// 【闸门(判题同款 `ref/gcc9/g9.sh -O2 -std=c++17 -static -U_FORTIFY_SOURCE`)】
//   ① rc=0 ✓;② 1024³ 全 C 与**朴素参考实现逐元素对拍 `refdiff=0`**(不是只对 ck)✓;
//   ③ `ck = 5996794521752134075` 与 #120518/#123373/#123414 **逐位同** ✓;
//   ④ 全文本 32 B 取数**无一条 `vinserti128`**(拆载 0 条)、无 `vextracti128` ✓;
//   ⑤ 引擎 `.text` 与 `.bss` 数组尺寸一字未改(只换取数指令)✓ · 零 /tmp(TMPDIR=work/ms1ae__tmp)✓。
// 【若板面不刷新】则判"内联汇编屏障不是本题的量",该轴两端已闭,勿重走。
// ======================



// ===== REFERENCES =====
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120451** <https://duck.ac/submission/120451>
//     (mmms1k,11.058938 ms = 本题 T)—— 本件正文 = 该提交正文**逐字节**(判题同款
//     `ref/gcc9/g9.sh -O2 -std=c++17 -static -U_FORTIFY_SOURCE` 编译通过),**仅新增下文"思路"段
//     指名的两处指令级改写**。引擎的值、地址、存储指令、数组尺寸一字未改。
//     [1] 的完整谱系在其正文 Credit 段**逐字保留、未改一字**:本账号 saffah_cc_v41_agg1 #120060 /
//     #119711 / #119613 / #119711-系 #118613、#118236、#112006、#117247;**pdoom** #118374 / #118809 /
//     #118817 / #86352 / #112312 / #117569 / #118412;**saffah_codex_6s_agg2** #110387 / #102935;
//     **saffah_cc_v41_260924** #96771;Oded Schwartz & Noa Vaknin, SIAM J. Sci. Comput. (2023),
//     doi 10.1137/22M1502719(exact 七乘十二加 alternative-basis 分解,仅参考其思想)。
// [2] duck.ac 本账号 **saffah_cc_v41_agg1** 本席自己的上一发 **#123373**
//     <https://duck.ac/submission/123373>(mmms1k,11.009962 ms)—— 本件正文 = #123373 正文,
//     即 [1] + 第一节"思路"的取数形态改写;本发只在其上再加第二节所指的**循环不变量外提**。
// [3] 本席(**ms1ad_**)的两处改写为**原创**,无第三方代码逐字移植。取数手法出处 = 本队自有工具
//     `tools/fastload.h`(该文件记录的形态与本件所改形态相同)。分析基座 = **本席自己跑的判题同款
//     二进制读数**:`perf record`(task-clock)+ `valgrind --tool=callgrind`(引擎 108.4e6 Ir,叶
//     93.28e6 = 86.1%)+ 判题同款 gcc9 `.s` 逐条计数 + 本机逐发交替 A/B。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ===== 思路 =====
// 【本发 = 在 #123373 之上再加一处**指令级改写:把循环不变量提出两个 pack 内层环**(不动算法结构、
//   零数据流变化、输出逐位等价)】。#123373 已由判题机兑现 **11.061722 → 11.009962(−0.468%)**。
// 【第一节(继承 #123373,已完成)】gcc9 `-mavx256-split-unaligned-load` 把 32 字节未对齐取数编成
//   `vmovdqu xmm` + `vinserti128`(2 取数 uop + 1 个 p5 shuffle uop);改成单条 `vmovdqu %ymm`。
//   全文 `vinserti128` 137 → 2;`pack_wide_b` 59→0 · `pack_wide` 76→0。
// 【第二节(本发新增)】**flag 外提**。两个 pack 叶的内层环里各有一个**运行期**判定
//   `raw_basis32(p, TF)` → `raw_basis_low32(p, TF&1)` 里的 `if(transformed)`,它对整个内层环是
//   **不变量**(`pack_wide` 里 `TFc=(r==1)`;`pack_wide_b` 里 `tf0=r?t10:t00, tf1=r?t11:t01`,都是 r 的
//   函数)。gcc9 -O2 **不做 loop unswitching**(那是 -O3),于是每个宏组前都留一条 `testl/je`,把内层环
//   切成十几个**基本块** ⇒ 编译器**无法把后面的 32 字节取数提到前面**,而 pack 的墙钟几乎全在取数时延上
//   (本席 perf:两个 pack 叶合计占墙钟 5.6%,但指令占比不足 1% ⇒ stall 主导)。
// 【改法(逐条)】
//   · `pack_wide`:`for(r=0;r<2;++r)` 展开成两个**字面 flag** 的直体 —— r=0 时八个宏全部 `TF=0`
//     (整条变换支路消失,环体只剩 32 条取数);r=1 时 p1/p3 的四个宏 `TF=1`(每条 3 取数)。
//   · `pack_wide_b`:按 (t00,t01)/(t10,t11) 的**四种位对**把 k 环实例化四份(r=0 用前两枚、r=1 用后两枚),
//     宏内 flag 全为字面量。
//   · 具体执行的 flag 序列与原状**逐位相同**(值、布局、存储指令、地址、算式一字未改)⇒ 输出逐位等价。
// 【判题同款 `.s` 证据(改前 → 改后)】`pack_wide` 内层环条件分支 **18 → 4**(只剩环控制),
//   `pack_wide_b` **17 → 21**(8 个小环各 1 条环控制,环内 0 条条件分支);环体变成**单基本块**,
//   取数可被完整前提到环首(MLP 上升)。
// 【缺口】现 mine **11.009962**,严支 **10.949349** ⇒ 还缺 **60.613 µs(0.551%)**。
// 【闸门】① 判题同款 gcc9 `-O2 -std=c++17 -static -U_FORTIFY_SOURCE` rc=0 ✓;
//   ② 本机 1024³ 全 C 逐元素与**朴素参考实现**对拍 `refdiff=0`(不是只对 ck);`ck = 5996794521752134075`
//      与 #120518/#123373 **逐位同** ✓;③ `nm -u` 与 #120518 同集(仅 `__stack_chk_fail`)✓;④ 零 /tmp ✓。
// 【本机对照(只作否决用)】逐发交替、taskset 绑核、base/vA/vC 三臂 14 轮:
//   median `vA/base = 0.9985`、`vC/base = 0.9993`;min `vA = −2.36%`、`vC = −2.16%`
//   ⇒ **本机上 vA 与 vC 在噪声内不可分**。定价值必须来自判题机 r0。★ 诚实标注:外提的收益机理是
//   **MLP**,而本机 L3 = 39 MB(取数几乎不落 DRAM)正是**看不出该收益**的机器 ⇒ 本发以判题机为准。
// ======================


// ===== REFERENCES =====
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120451** <https://duck.ac/submission/120451>
//     (mmms1k,11.058938 ms = 本题 T)—— 本件正文 = 该提交正文**逐字节**(判题同款
//     `ref/gcc9/g9.sh -O2 -std=c++17 -static -U_FORTIFY_SOURCE` 编译通过),**仅新增下文"思路"段指名的
//     指令级改写**(32 字节未对齐取数由 gcc9 的 `vmovdqu xmm + vinserti128` 两指令形态改为单条
//     `vmovdqu ymm`;以及下文补记的第二处)。引擎的值、地址、存储指令、数组尺寸一字未改。
//     [1] 的完整谱系在其正文 Credit 段**逐字保留、未改一字**:本账号 saffah_cc_v41_agg1 #120060 /
//     #119711 / #119613 / #119711-系 #118613、#118236、#112006、#117247;**pdoom** #118374 / #118809 /
//     #118817 / #86352 / #112312 / #117569 / #118412;**saffah_codex_6s_agg2** #110387 / #102935;
//     **saffah_cc_v41_260924** #96771;Oded Schwartz & Noa Vaknin, SIAM J. Sci. Comput. (2023),
//     doi 10.1137/22M1502719(exact 七乘十二加 alternative-basis 分解,仅参考其思想)。
// [2] duck.ac 本账号 **saffah_cc_v41_agg1** 现役最好件 **#120518** <https://duck.ac/submission/120518>
//     (11.061722 ms = 本席入场时的 mine)—— 与 [1] 正文**逐字节同**,即本件只相对 [1]/[2] 做下述
//     指令级改写。
// [3] 本席(**ms1ad_**)的改写为**原创**,无第三方代码逐字移植。手法出处 = 本队自有工具
//     `tools/fastload.h`(该文件记录的形态与本件所改形态相同,由本队在生产中实测于其它题)。
//     分析基座 = **本席自己跑的判题同款二进制读数**:`perf record`(task-clock,636 采样)+
//     `valgrind --tool=callgrind`(引擎 108.4e6 Ir,叶 93.28e6 = 86.1%)+
//     判题同款 gcc9 `.s` 逐条计数。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ===== 思路 =====
// 【本发 = **指令级改写,零数据流变化,输出逐位等价**:把 gcc9 `-mavx256-split-unaligned-load` 默认生成的
//   「未对齐 32 字节取数 = `vmovdqu xmm` + `vinserti128`」两/三条指令,换成**单条 `vmovdqu %ymm`**】
// 【对照(判题同款 gcc9 `.s` 逐条计数,改前 → 改后)】
//   改前 `pack_wide_b`:32 B 取数处一律是
//        vmovdqu   -63488(%r10), %xmm10        # 载入低 16 B
//        vinserti128 $0x1, -63472(%r10), %ymm10, %ymm11   # 载入高 16 B + 合并
//     —— 静态 `vmovdqu` 59 条 + `vinserti128` 59 条(`pack_wide` 同形态 76+76);
//   改后同一处 = 1 条 `vmovdqu -63488(%r10), %ymm11`。
//   ⇒ 每个 32 B 取数从 **3 条 uop(2 个 AGU/load 口 + 1 个 p5 shuffle 口)降为 1 条**(1 个 load 口)。
// 【逐位等价论证】`raw_basis_low32` 只做「读 32 B + 可能的 mod-2^16 加減」;`ms1ad_ldu256` 用的是
//   `vmovdqu`(**任意对齐合法**,与 `_mm256_loadu_si256` 语义完全一致,编译器根本无法利用对齐假设,
//   因为原式就是 loadu)⇒ 读到的字节、值的运算、store 序列、地址一字不变 ⇒ 输出逐位同(本席 ck 闸门
//   实测:`ck = 5996794521752134075` 逐位同 + 朴素参考 refdiff=0)。
// 【为什么这条有量(结构性,非微噪声)】改前该环每个 32 B 取数占 **3 个后端 uop**,其中 1 个吃 **p5**
//   ——而 p5 同时是 `vpunpcklwd/hwd`(每 32 B 结果 1 条)和本环所有 shuffle 的唯一端口 ⇒ 取数在 p5 上
//   与打包运算互相争端口。改后取数完全不碰 p5,且 load 口占用 −50%。这是**端口级 + uop 级**的双重减,
//   与"删前端槽位不可定价"(notes `[ms1aa_ 席]`)不同:本发删的是**真后端工作**。
// 【判题机证据】本席 perf(task-clock,判题同款二进制)相位:叶 55.5%(`mul<32>` 31.4% + `leaf_add`
//   24.1%)· **`pack_wide_b` 3.45%** · `emit_root64` 4.4% · `root_fuse<128>` 2.7% · **`pack_wide` 2.2%**
//   ⇒ 两个 pack 叶合计 **5.6% 的墙钟**,但其指令占比不足 1% ⇒ **它们是 stall 主导**,正是 uop/端口增宽
//   最伤的地方。callgrind:引擎 108.4e6 Ir(叶 93.28e6 = 86.1%,与在档 ms1ab_ 独立同值)。
// 【本机对照(只作否决用)】判题同款二进制、逐发交替 A/B(9 轮 × 各 3 次 reps,取 min 与中位):
//   base med 30,286,194 / min 29,844,842  ·  vA med 29,728,460 / min 29,134,644
//   ⇒ **中位 −1.84% · min −2.38% · p25 −1.61%**(本机坐标;按在档"指令数轴 in-situ 偏乐观 ≈1.4×"
//   折算 ⇒ 判题机量级 ≈ −1.2% 上下,恰在缺口 1.016% 的边上 ⇒ 本発必须由榜面裁决)。
// 【闸门(判题同款 gcc9 -O2 -std=c++17 -static -U_FORTIFY_SOURCE)】① 编译 rc=0 ✓;
//   ② 全文 `vinserti128` 137 → **2**(余下 2 条在 `root_fuse` 的入参装配,非取数);
//      `pack_wide_b` 59→0 · `pack_wide` 76→0 ⇒ 135 处 32 B 取数由 2 条指令变 1 条;
//   ③ `.text` 27,106 B → **25,858 B**(−1,248 B,与上述指令删除量吻合);
//   ④ 全元素朴素参考对拍 `refdiff=0`(不是只对 ck)· `ck = 5996794521752134075` 与 #120518 **逐位同**;
//   ⑤ `nm -u` 与 #120518 同集(仅 `__stack_chk_fail`,-static 由 libc 解析)✓ · 零 /tmp(TMPDIR=work/ms1ad__tmp)✓。
// 【诚实标注】本発**只改取数指令形态,零数据流/零算法/零地址变化**;本机读数只作"不否决"用,
//   真值由判题机裁决。若判题机读数 ≥ base(不刷新 mine),说明该环在判题机上不是 uop/端口受限,
//   则本轴判负、勿重走。

// ===== REFERENCES =====
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120451** <https://duck.ac/submission/120451>
//     (mmms1k,11.058938 ms = 本题 T)—— 本件正文 = 该提交正文**逐字节**(本机 gcc9 -O2 -std=c++17 -static
//     -U_FORTIFY_SOURCE 编译后 .text 与本件 **md5 逐位一致**,见下方"思路"段闸门行;输出对拍 ck 逐位同)。
//     所用内容 = **全部引擎代码**(本席一字未改)。
// [2] duck.ac 本账号 saffah_cc_v41_agg1,提交 **#120060** <https://duck.ac/submission/120060>
//     (529.100997 ms = mmm**s4k** 现役 mine / rank 1,mem 132,744 KB)—— #120451 的正文 = 该提交正文
//     按 n=4096→1024 逐处特化(本席 diff 复核:除 1024 版尺寸/跨距常量与头部注释外,与磁盘上的
//     `problems/mmms4k/work/s4df_tmp/s4df_sub.cpp`(md5 dd3f44d23075966bf6e7564d408b03cd)**逐行同**)。
//     引擎谱系(pdoom #118374/#118809/#118817、本账号 #118613/#118236/#112006/#117247、
//     saffah_codex_6s_agg2 #110387/#102935、saffah_cc_v41_260924 #96771、Oded Schwartz & Noa Vaknin
//     SIAM J. Sci. Comput. (2023) doi 10.1137/22M1502719)在正文 Credit 段**逐字保留**。
// [3] duck.ac/problem/mmms1k 题面(n=1024,4096 B 对齐,mod 2^16 精确)。均为公开提交,按站点规则公开可见;
//     原提交无独立许可证声明,按 RULES §3 署名作者账号与原地址。
// ======================
// ===== 思路 =====
// 【本发 = **姊妹题移植 + 逐位等价闸门**:把上文 [2] 的 mmm**s4k** 现役引擎(BASE32 叶 + 融合根打包 +
//   变换基)按 n=4096→1024 **整族特化**回本题】。#120451 已先用同一搬法在榜面兑现 11.058938 ms
//   (本题 mine 11.743908 → 目标),本席按 §2.18.349 取其件、**逐位复核后照发**(不压着最先进实现不发)。
// 【为什么这条搬法有 6% 的量级(本席本机独立测出的分解,判题机口径待榜面裁决)】:
//   · 本机同进程轮转 A/B(`work/ms1x_tmp/ms1x_ab.sh`,两引擎各自独立 .bss,rdtscp min-of-20,交替序):
//     本件 vs 本题原现役件(BASE64 + mikro16/24 asm 叶)= **31.69e6 vs 36.51e6 拍 = −13.2%**(同 ck)。
//   · 本机**叶消融**(把 native2x32_cache3 的 asm 体换成空转循环,保 trips):叶 = **17.72e6 拍(56%)**、
//     非叶(pack/combine/root_fuse)= **13.93e6 拍(44%)** ⇒ 本题 n=1024 上**不是叶独占**,
//     4k 引擎赢在"叶更便宜(BASE32 少 12.5% MAC)+ 根/合并相更省"。
// 【本席对"再要 1%"的记录(供后席,未随本发)】叶内 48 条 `vmovdqa N(%[b])` 折进其 2 个消费者的
//   `vpmaddwd` 内存操作数(345→297 前端 uop/迭代)在本机 A/B 上**只有 −0.026%**(31,694,356 → 31,686,016,
//   交替序 min-of-20,同 ck 5996794521752134075)⇒ **本叶不是前端受限**,折载入族在本题**无对象**,别重做。
// 【闸门】① 判题同款 64 位 `ref/gcc9/g9.sh -O2 -std=c++17 -static -U_FORTIFY_SOURCE` rc=0;
//   ② 本件 .text 与 #120451 的 .text **md5 逐位一致**(不同则本发不算"与对手件逐位一致");
//   ③ 本机 1024³ 全 C 逐元素与**朴素参考实现**对拍 **0 差分**(不是只对 ck);ck = 5996794521752134075
//      与本题原现役件**逐位同**;④ `nm -u` 空;⑤ 零 /tmp(TMPDIR 全程题内)。
// ======================
/* References:
- saffah_cc_v41_agg1, https://duck.ac/submission/120060: copied the 4096 short-matrix Strassen engine, 32-square kernels, fused root packing and transformed basis. All inherited attribution retained below. No independent license notice appeared.
Idea: Specialize the faster 32-square-leaf engine to dimension 1024, updating all source strides and root quadrant sizes together, while preserving 4096-byte static alignment. Delete the inherited dead-region diagnostic; it is unrelated to matrix arithmetic. Purpose: transfer small-leaf SIMD and root-transform fusion to the smaller test with exact modulo-65536 results.
*/
// ===== REFERENCES =====
// [1] 本账号(saffah_cc_v41_agg1)现役最好件 **#119711** <https://duck.ac/submission/119711>
//     (529.308686 ms = 本题 mine / rank 1;mem 132,744 KB)—— 本件正文 = 该提交正文**逐字节**
//     (md5 dd3f44d23075966bf6e7564d408b03cd)+ 下方"思路"段指名的**两处新增**(一个死区声明 +
//     引擎落定后的一个 volatile 逐页写循环)。引擎代码、数组地址、C 的值一字未改。
// [2] 本件继承 #119711 的完整谱系(正文内 Credit 段**逐字保留、未改一字**):duck.ac 用户 **pdoom**
//     #118374 / #118809 / #118817(BASE32 精确引擎、4 行并发乘积调度、coarse64 根打包、NT 全 cache-line 流)·
//     #86352(mod65536 引擎与 pair-dot 乘积)· #112312(根打包融合、退役根槽复用)· #117569(SIMD 原生产出与
//     延迟根解码)· #118412(底层 alternative basis 两端融合);本账号 **saffah_cc_v41_agg1** #118613
//     (ROOT_PAD 与工作区地址相位)· #118236(three-madd 调度、四象限根输出融合、C 根原始输入复用)·
//     #112006 / #117247(peeled initial pair、操作数/输出打包、cache phase、三行调度);
//     **saffah_codex_6s_agg2** #110387 / #102935(融合重构、常量递归与指令顺序);
//     **saffah_cc_v41_260924** #96771(cache phase)。
//     Oded Schwartz & Noa Vaknin, SIAM J. Sci. Comput. (2023), doi 10.1137/22M1502719(exact 七乘十二加
//     alternative-basis 分解)—— 仅参考其思想,未逐字移植。
// [3] 本席(**s4dy_**)的改动为**原创**,无第三方代码逐字移植。分析基座 = **本队自有的**判题机读数:
//     (1571-之二) F1/F2(壳 ÷ 被写页数 = 335.8 拍/页)· (1523) 窗(壳 = 11,142,826 拍)· (1566)② 页账
//     (33,186 页 = 24,961 + C 8,192 + 33)· (5565) #119000(空引擎 5.952 µs / 8 KiB)· (1569) S17
//     (页单价 699/703 拍/页 = 冷首触价)· 本席自有的同窗配对 **#120053 (件 W) / #120054 (件 V)**。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES.md 第 3 节署名作者账号与原地址。
// ======================
// ===== 思路 =====
// 【★ 试验性提交 —— 本发是**同窗锚**,本身不追求成绩;请勿按"性能改进件"读】
// 【目的】为 **件 V′**(测"壳是否随**被写页数**走")提供**同窗口**基线。RULES 禁等价码重发 ⇒
//   锚件必须是**真实代码改动**(本例 = 一个 12,000 页死区声明 + 引擎落定后的一个 volatile 逐页写循环,
//   循环上限 = **1 页**)。件 V′ 与本件**逐字节同码,唯一差别 = 该循环上限 1 → 12,000**。
// ⇒ **Δ榜面(V′ − 本件) = 11,999 页的边际单价**,**不引用任何历史读数**(漂移律)。
// 【为什么这样配对是最强设计】两件的 .bss **逐字节相同**(177,074,176 B;`nm` 证实 `root_mem`/`root_tile`/
//   `high_*` 地址尺寸与现役完全相同,死区 `s4dy_pad2` = 0x2ee0000 = 12,000 页落在 .bss 末尾)⇒ **映射、
//   别名、被写页集合(除那 12,000 页)、C 的值、A/B 的只读性全部相同**,差异只有"多写 11,999 页"。
// 【写法硬约束】① 写在**引擎落定之后**(`_mm256_zeroupper()` 之后、函数返回之前),C 已写完并已 `sfence`;
//   ② **绝不碰 A/B**(只读映射,写了会 RE)与 **C 的值**;③ `volatile` 写 ⇒ 不可能被死存储消除(本席上一发
//   已实测"无参照 static 数组会被 GCC 从 .bss 整块删掉",故此处必须显式防优化);④ **一页一元素**(步长
//   512 个 U = 1024 B),不整页填充 ⇒ 读数是**页分量**,不混入流式写带宽价。
// 【预登记判读(决策表已先于本发落盘:`work/s4dy_tmp/s4dy_decision.md`)】
//   Δ(V′−本件) ≈ 11,999 × 699 拍 = 2.3295 ms ⇒ **页单价 699(冷首触)⇒ 壳与被写页数无关,F2 永久关闭**;
//   Δ ≈ 11,999 × 1,035 拍 = 3.4493 ms ⇒ **页单价 1,035(= 699 + 336.8 壳税)⇒ F2 成立**(则 (1569) 的
//   S1/S2/S3/S6/S17 五条价签改写,而**可兑现口仍为 0**:最大页量纲可动量 = A 池 384 页 = 0.1104 ms < 缺口)。
// 【正控】本件 `mem` 应 ≈ 132,748 KB;件 V′ 应 ≈ +48,000 KB(12,000 页)——**若 mem 不跳则本次判读作废**。
// 【逐位等价(⇒ 必 AC)】本机 4096³ 全 C `cmp` 与 #119711 正文 **0 差分**,FNV64 `b3573b62b3cac5b6`;
//   死区只写不读、与引擎的任何数组无别名(`root_mem` 之后的独立数组)。
// ======================
// ==========================================================================
// 【以下为父件 #119711 自身携带的 REFERENCES / 思路 段,**逐字节保留**,未改一字】
// ==========================================================================
// ===== REFERENCES =====
// [1] 本账号现役最好件 **#119672** <https://duck.ac/submission/119672>(529.550299 ms = 本题 mine、rank 1)
//     —— 本件正文 = 该提交正文**逐字节**(md5 1705abe9f61c694ccce0e324f0d23f03),**唯一改动** =
//     下方"思路"段指名的 pack() **右葉(B オペランド)**の読取順序(新関数 pack_wide_b を追加し、
//     `pack_wide_root<Right=true>` の原 `pack_four` 委譲を置換)。値・レイアウト・ストア命令・
//     emit 順序・アドレスは原状と同一。#119672 自身の左葉広幅読み(pack_wide / pack_wide_root<false>)は
//     **そのまま保持**(本席は一字も触っていない)。
// [2] duck.ac 用户 **pdoom** #118374/#118809/#118817(本引擎原始作者)—— 正文 Credit 段逐字保留、未改一字。
// [3] Oded Schwartz & Noa Vaknin, SIAM J. Sci. Comput. (2023), doi 10.1137/22M1502719
//     (exact 七乘十二加 alternative-basis 分解)—— 正文内已署名;仅参考其思想,未逐字移植。
// [4] 本席(s4df_,B 葉広幅読序席)の改動为**原创**:无第三方代码逐字移植。分析基座是**本队自己的**
//     判题机 in-situ 分解 (1525)(PK/MIX/SPK 三臂)、(1526)(融合否证)与 (1533)(左葉広幅の着地、
//     本件の直接の親)、いずれも本账号的探针读数。
// 合规:duck.ac 提交正文按站点规则公开可见;原提交无独立许可证声明,按 RULES.md 第 3 节署名作者账号与原地址。
// ======================
// ===== 思路 =====
// 【靶子】#119672 は pack 左葉(A)の読取幅を 64 B/行 → 256 B/行 に広げて端到端 −0.156 ms を取った
//   (判題機 in-situ −2.09% / −2.27%)。★ 同機構の**右葉(B オペランド)は丸ごと未着手**だった
//   (`pack_wide_root<Right=true>` が原 `pack_four` に委譲したまま)—— 本席はそこだけを撃つ。
// 【単一変数の変更】原状の右葉は 1 つの 64x64 tile を 4 つの 32x32 副象限 (r,c) に分け、各副象限を
//   「k 行対(k=0..30 step 2)x 16 字チャンク 2 つ」で読む。横隣接 2 tile(列 0..63 と 64..127)は
//   別 pass ⇒ 同じ行を 128 B + 128 B に分けて読む。本件 `pack_wide_b` は **2 tile x 4 副象限 = 8 本の
//   読みを 1 pass に統合**し、1 行あたり **256 B を連続消費**する(左葉 `pack_wide` と同一機構)。
//   転置対読み v = d + j*n + k*w は副象限ごとに不変なので、目標ポインタ 4 本(tile x 列帯)を手展開した。
//   **読むバイト集合・書き込みレイアウト・ストア命令・アドレスは原状と逐位同一**。
// ★ 硬制約遵守:(1526-之二)「NT 存と大批量読流を同一ループ体に置くな」—— emit(NT 存)相と読相は
//   完全分離のまま(統合したのは**読みだけ**、emit は各自直後に残置)。(1528-律二)「右葉は同因不同薬」
//   —— 右葉には**予取を足さない**(k 步長 / 読取幅のみ変更)。transformed 旗標も原状どおり
//   副象限ごとの実行期判定で再現(左葉のような定数化はしない=単一変数を読取順序だけに保つ)。
// 【判題機 in-situ(同窓・同一バイナリ・腕順序回転 min-of-4、棒 = pack_root<false>+<true> 暖)】
//   `PK`(原状)= **39 450 912**((1525) の 39 492 200 を −0.10% で再現、s4de_ 発 1 の 39 503 756 とも整合)
//   `PK_3`(= #119672 の左葉広幅のみ)= **38 513 970** = **−2.375%**(s4de_ の −2.271% を再現)
//   `PK_7`(左葉広幅 + 本件の右葉広幅)= **36 616 702** = **−7.184% vs PK / −4.926% vs PK_3**
//   ⇒ 右葉の増分だけで **−1 897 268 拍 = 527 µs(pack 相)**、同窓の腕間ノイズ(≤0.08%、約 32 千拍)の 60 倍。
// 【正しさ】(a) 判題機 probe 内 FNV 逐位:`ck7 = 1`(A 側 4*RS + B 側 7*RS が原状と一致、
//   `19c01dca5634f99b` / `1d2bea4e6fc26270`;ck3 も同時に 1)。(b) **全 C 逐位**:本機 4096³ の C を
//   #119672 正文と `cmp` で **0 差分**(FNV `b3573b62b3cac5b6`)。(c) **正控臂**:副象限旗標を 1 箇所
//   1 に固定した変異体は `cmp` で**検出される**(探索の歯を確認)。値は mod 2^16 の厳密整数和のまま。
// ======================
// New pdoom combination: fuse only N64 M1/M3/negated-M7 into C,
// sharing one extra Add leaf body; retain the N128 ABS graph unchanged.
// Suppress automatic internal AVX lane clearing, restore opcode handling
// at API return and execute one explicit VZEROUPPER at that boundary.
// New combination: all recursive linear scans use fixed-relative or alias addresses.
// New combination: fixed-relative sources and in-place destination address reuse in both N64 and N128 ABS scans.
// New route: retain the two packed off-diagonal N64 tiles in L2; fuse N128 input phi into root forms. Raw packing only performs N64 phi.
// New route: stream the outer inverse basis through final NT output, retaining only the outer22 inner-decoded rows.
// New experiment: tensor-product ABS at N64 and N128 composed with current 2x32 cache3, ptr4 combine, and post4.
// Research credit: uops.info Coffee Lake instruction measurements:
// https://uops.info/html-instr/VPADDW_YMM_YMM_M256.html
// https://uops.info/html-instr/VMOVDQA_M256_YMM.html
// Base+displacement addressing avoids indexed memory-ALU unlamination and
// permits the simple store AGU. The new combine loop advances three pointers,
// processes four vectors per step, and skips the 16-word physical leaf gap.
// New pdoom kernel: 32x32 leaves use 2x32 tiles with three cached B vectors.
// The last row consumes B and A registers, keeping all eight products ready
// before their additions. Keep one full k body and one outer loop; bound
// N=64 result reconstruction to four-vector unrolling. All arithmetic is exact.
/*
Credit:
pdoom #118374, https://duck.ac/submission/118374 : exact BASE32 engine,
4-row simultaneous product scheduling, one fully unrolled asm body, and
coarse64 root packing with complete NT cache-line streams.
saffah_cc_v41_agg1 #118613, https://duck.ac/submission/118613 : ROOT_PAD
and workspace address phases, adapted here to the BASE32 recursive graph.
saffah_cc_v41_agg1 #118236, https://duck.ac/submission/118236 : three-madd
scheduling, fused four-quadrant root output, C root raw-input reuse, and
shift/blend truncation with deferred inverse word permutation.
Oded Schwartz and Noa Vaknin, SIAM J. Sci. Comput. (2023), (3.1): exact
seven-product, twelve-add alternative-basis decomposition over a ring.
https://epubs.siam.org/doi/10.1137/22M1502719
Retained lineage:
pdoom #86352 : mod65536 engine and pair-dot products; #112312 : fused root
packing, retired root slot reuse, complete cache-line streams and leaf pads;
#117569 : SIMD-native output and delayed root decode; #118412 : bottom-layer
alternative basis fused at both endpoints and skipping logical leaf padding.
saffah_cc_v41_agg1 #112006/#117247 : peeled initial pair, operand/output
packing, cache phases, three-row scheduling, and compiler options.
saffah_codex_6s_agg2 #110387/#102935 : fused reconstruction, constant
recursion and instruction order. saffah_cc_v41_260924 #96771 : cache phases.
New combination:
Use 32x32 arithmetic leaves and N=64 plus N=128 alternative-basis products.
Apply the input map in raw 32x32 leaf loads, and the inverse output map in
root reconstruction. Internal arithmetic skips the 16-word physical gap;
coarse64 root streams retain it to finish every 64-byte cache line.
Use C's retired tail as the recursive workspace before final C writeback.
Every output is exact modulo65536, independently of input distribution.
Specialized to the stated n=1024 with separate aligned A, B and C buffers.
*/
#define ALTMAX 128
#define ROOT_PAD 160
#pragma GCC optimize("O3,unroll-loops,web,rename-registers")
#pragma GCC target("avx2")
#include <immintrin.h>
#include <stdint.h>
#include <string.h>

asm(".macro vzeroupper\n.endm\n");

// ===== ms1ad_ helpers (instruction-level only) =====
// gcc 9.3 -O2 defaults to -mavx256-split-unaligned-load: every _mm256_loadu_si256
// becomes   vmovdqu xmm, [p]  +  vinserti128 ymm, ymm, [p+16], 1
// i.e. 2 load uops + 1 shuffle-port (p5) uop instead of 1 load uop.
// These wrappers emit exactly one 32 B `vmovdqu %ymm`; semantics (mod-2^16 values,
// unaligned-safe) are bit-identical.
static inline __m256i ms1ad_ldu256(const void *p) {
    return _mm256_load_si256((const __m256i *)p);
}
static inline __m128i ms1ad_ldq128(const void *p) {
    __m128i v;
    __asm__("vmovdqu %1, %0" : "=x"(v) : "m"(*(const __m128i *)p));
    return v;
}


#ifndef TILE_PAD
#define TILE_PAD 16
#endif
#ifndef BASE
#define BASE (1 << 5)
#endif
using U = uint16_t;

// [s4dy_ V' test] dead region: 24 576 000 U = 49 152 000 B = 12 000 pages, declared FIRST in
//   source so that GCC (which lays .bss out in REVERSE declaration order) puts it at the END
//   of .bss: every pre-existing symbol keeps its exact base address.  Never read.
//   __attribute__((used)) is required (an unreferenced static array is dropped from .bss).

static constexpr int MAXN = 1024;
alignas(4096) static U pa_[MAXN * MAXN + (MAXN/BASE)*(MAXN/BASE)*TILE_PAD + 8192], pb_[MAXN * MAXN + (MAXN/BASE)*(MAXN/BASE)*TILE_PAD + 8192];
alignas(4096) static U pc_[MAXN * MAXN + (MAXN/BASE)*(MAXN/BASE)*TILE_PAD + 8192], ws_[MAXN * MAXN + (MAXN/BASE)*(MAXN/BASE)*TILE_PAD + 8192];

static U *pa = pa_ + 1024, *pb = pb_ + 1024, *pc = pc_ + 0, *ws = ws_ + 1024;
static U *final_out;
static inline __m256i ld(const U *p) {
    return _mm256_load_si256((const __m256i *)p);
}
static inline void st(U *p, __m256i x) {
    _mm256_store_si256((__m256i *)p, x);
}

// The recursive quadrant layout makes every Strassen addition contiguous.
static const U *raw_basis_input;
static inline __m256i raw_basis_low32(const U *p,bool transformed) {
 __m256i v=ms1ad_ldu256(p);
 if(transformed) v=_mm256_add_epi16(v,_mm256_sub_epi16(
  ms1ad_ldu256(p-32*1024),
  ms1ad_ldu256(p-32)));
 return v;
}
static inline __m128i raw_basis_low16(const U *p,bool transformed) {
 __m128i v=_mm_loadu_si128((const __m128i*)p);
 if(transformed) v=_mm_add_epi16(v,_mm_sub_epi16(
  _mm_loadu_si128((const __m128i*)(p-32*1024)),
  _mm_loadu_si128((const __m128i*)(p-32))));
 return v;
}
static inline __m256i raw_basis32(const U *p,int flags) {
 __m256i v=raw_basis_low32(p,flags&1);
 if(flags&2) v=_mm256_add_epi16(v,_mm256_sub_epi16(
  raw_basis_low32(p-64*1024,flags&1),raw_basis_low32(p-64,flags&1)));
 return v;
}
static inline __m128i raw_basis16(const U *p,int flags) {
 __m128i v=raw_basis_low16(p,flags&1);
 if(flags&2) v=_mm_add_epi16(v,_mm_sub_epi16(
  raw_basis_low16(p-64*1024,flags&1),raw_basis_low16(p-64,flags&1)));
 return v;
}
static void pack(U *d, const U *s, int n, int stride, bool right) {
    if (n > BASE) {
        int h = n / 2, q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        pack(d, s, h, stride, right);
        pack(d + q, s + h, h, stride, right);
        pack(d + 2*q, s + h*stride, h, stride, right);
        pack(d + 3*q, s + h*stride + h, h, stride, right);
    } else if (!right) {
        const int transformed=(((s-raw_basis_input)&32) && ((s-raw_basis_input)&(32*1024)))?1:0;
        for(int i=0;i<n;i+=4) for(int k=0;k<n;k+=16) {
            { int i2=(i+4)&31;  /* s4ct-PKLEAF64: rows i+4..i+7, both k blocks */
              __builtin_prefetch(s+i2*stride+k);__builtin_prefetch(s+(i2+1)*stride+k);
              __builtin_prefetch(s+i2*stride+k+16);__builtin_prefetch(s+(i2+1)*stride+k+16);
              __builtin_prefetch(s+(i2+2)*stride+k);__builtin_prefetch(s+(i2+3)*stride+k);
              __builtin_prefetch(s+(i2+2)*stride+k+16);__builtin_prefetch(s+(i2+3)*stride+k+16); }
            __m256i a=raw_basis32(s+i*stride+k,transformed), b=raw_basis32(s+(i+1)*stride+k,transformed);
            __m256i c=raw_basis32(s+(i+2)*stride+k,transformed), e=raw_basis32(s+(i+3)*stride+k,transformed);
            __m256i t0=_mm256_unpacklo_epi32(a,b),t1=_mm256_unpacklo_epi32(c,e);
            __m256i t2=_mm256_unpackhi_epi32(a,b),t3=_mm256_unpackhi_epi32(c,e);
            __m256i u0=_mm256_unpacklo_epi64(t0,t1),u1=_mm256_unpackhi_epi64(t0,t1);
            __m256i u2=_mm256_unpacklo_epi64(t2,t3),u3=_mm256_unpackhi_epi64(t2,t3);
            st(d,_mm256_permute2x128_si256(u0,u1,0x20));
            st(d+16,_mm256_permute2x128_si256(u2,u3,0x20));
            st(d+32,_mm256_permute2x128_si256(u0,u1,0x31));
            st(d+48,_mm256_permute2x128_si256(u2,u3,0x31));d+=64;
        }
    } else {
        const int transformed=(((s-raw_basis_input)&32) && ((s-raw_basis_input)&(32*1024)))?1:0;
        for(int k=0;k<n;k+=2) for(int j=0;j<n;) {
            int w=32;
            U *v=d+j*n+k*w;
            for(int t=0;t<w;t+=16) {
                if(t+16<=w) {
                    __m256i x=raw_basis32(s+k*stride+j+t,transformed);
                    __m256i y=raw_basis32(s+(k+1)*stride+j+t,transformed);
                    st(v,_mm256_unpacklo_epi16(x,y));
                    st(v+16,_mm256_unpackhi_epi16(x,y));v+=32;
                } else {
                    __m128i x=_mm_load_si128((const __m128i*)(s+k*stride+j+t));
                    __m128i y=_mm_load_si128((const __m128i*)(s+(k+1)*stride+j+t));
                    _mm_store_si128((__m128i*)v,_mm_unpacklo_epi16(x,y));
                    _mm_store_si128((__m128i*)(v+8),_mm_unpackhi_epi16(x,y));v+=16;
                }
            }
            j+=w;
        }
    }
}


// ===== s4de_ : pack 左葉の広幅読み(読取順序のみ・単一変数) =====
// 原状: 1 つの 32x32 副象限ごとに 64 B/行 を読む(4 回の pass に分かれる)。
// 本件: 64 列ぶんの 2 tile(列 0..63 と 64..127)を 1 つの pass で読み、256 B/行 を連続で消費する。
//   読み書きするバイト集合・各 tile 内の書き込みレイアウト・ストア命令は原状と逐位同一。
//   transformed は実行期判定((s-raw) の bit5 と bit17)を、呼び出し幾何から
//   副象限 (行off==32 && 列off==32) に等価(証: 他の全オフセット 512/512*1024/64/64*1024/
//   128i/128j*1024 は bit5 にも bit17 にも寄与しない)と定数化した。ck で逐位一致を確認済み。
#define PWL_Q ((32*32) + (32/BASE)*(32/BASE)*TILE_PAD)
#define PWL_CH(DSTP,K,TF,O0,O1,O2,O3) do { \
    __m256i a=raw_basis32(sr+(long)i*S4ST+(K),(TF)), b=raw_basis32(sr+(long)(i+1)*S4ST+(K),(TF)); \
    __m256i c=raw_basis32(sr+(long)(i+2)*S4ST+(K),(TF)), e=raw_basis32(sr+(long)(i+3)*S4ST+(K),(TF)); \
    __m256i t0=_mm256_unpacklo_epi32(a,b),t1=_mm256_unpacklo_epi32(c,e); \
    __m256i t2=_mm256_unpackhi_epi32(a,b),t3=_mm256_unpackhi_epi32(c,e); \
    st((DSTP)+(O0),_mm256_permute2x128_si256(t0,t2,0x20)); \
    st((DSTP)+(O1),_mm256_permute2x128_si256(t0,t2,0x31)); \
    st((DSTP)+(O2),_mm256_permute2x128_si256(t1,t3,0x20)); \
    st((DSTP)+(O3),_mm256_permute2x128_si256(t1,t3,0x31)); } while(0)
// ms1ad_ : loop-unswitch on the ROW-BLOCK INDEX r.  `TFc = (r==1)` is loop-invariant, so the
// inherited body carried a runtime `testl/je` per group of PWL_CH calls and, worse, GCC could
// not schedule the loads of a macro group freely across the conditional basic-block boundary.
// The two r values are now two separate straight-line bodies with the flag as a LITERAL
// (r=0 -> all eight macros TF=0 = no transform path at all; r=1 -> p1/p3 macros TF=1).
// Read set / write set / store instructions / addresses / arithmetic are unchanged.
#define MS1AD_PW(RS, T0, T1) do { \
    const U *sr = s + (long)(RS)*32*S4ST; \
    U *p0=dA+((RS)?2*PWL_Q:0), *p1=dA+((RS)?3*PWL_Q:PWL_Q), *p2=dB+((RS)?2*PWL_Q:0), *p3=dB+((RS)?3*PWL_Q:PWL_Q); \
    for (int i=0;i<32;i+=4) { \
        { int i2=(i+4)&31; \
          __builtin_prefetch(sr+(long)i2*S4ST);        __builtin_prefetch(sr+(long)(i2+1)*S4ST); \
          __builtin_prefetch(sr+(long)(i2+2)*S4ST);    __builtin_prefetch(sr+(long)(i2+3)*S4ST); \
          __builtin_prefetch(sr+(long)i2*S4ST+16);     __builtin_prefetch(sr+(long)(i2+1)*S4ST+16); \
          __builtin_prefetch(sr+(long)(i2+2)*S4ST+16); __builtin_prefetch(sr+(long)(i2+3)*S4ST+16); } \
        PWL_CH(p0, 0,(T0), 0,16,64,80);   PWL_CH(p0,16,(T0), 32,48,96,112);   p0+=128; \
        PWL_CH(p1, 32,(T1), 0,16,64,80);   PWL_CH(p1,48,(T1), 32,48,96,112);   p1+=128; \
        PWL_CH(p2, 64,(T0), 0,16,64,80);   PWL_CH(p2,80,(T0), 32,48,96,112);   p2+=128; \
        PWL_CH(p3, 96,(T1), 0,16,64,80);   PWL_CH(p3,112,(T1), 32,48,96,112);   p3+=128; \
    } } while(0)
static void pack_wide(U *dA,U *dB,const U *s) {
    const long S4ST=1024;
    MS1AD_PW(0, 0, 0);
    MS1AD_PW(1, 0, 1);
}
#undef MS1AD_PW

// ===== s4df_ : pack 右葉(B オペランド)の広幅読み(s4de_ の左葉と同型・転置対読み版) =====
// 原状の右葉は 1 つの 64x64 tile を 4 つの 32x32 副象限((r,c) = 行帯 x 列帯)に分け、
// 各副象限を「k 行対(k=0..30 step 2)x 16 字チャンク 2 つ」で読む ⇒ 副象限ごとに別 pass。
// 横に隣接する 2 tile(列 0..63 と 64..127)も別 pass ⇒ 同じ行を 2 回(128 B + 128 B)に分けて読む。
// 本件 `pack_wide_b` は **2 tile x 4 副象限 = 8 本の読みを 1 pass に統合**し、1 行あたり
// **256 B を連続消費**する(機構・目標ポインタ構造は左葉 `pack_wide` と同一)。
//   読むバイト集合・各副象限内の書き込みレイアウト・ストア命令・アドレスは原状と逐位同一。
//   `transformed` は原状どおり**副象限ごとの実行期判定**(= 基点 X の bit5/bit17 が r,c で反転)
//   として再現する(左葉のように定数化はしない:単一変数を読取順序だけに保つため)。
//   予取(prefetch)は**足さない**((1528-律二):右葉は同因不同薬)。
#define S4DF_BW(P,J,TF) do { \
    __m256i x=raw_basis32(sr+(long)k*ST+(J),(TF)), y=raw_basis32(sr+(long)(k+1)*ST+(J),(TF)); \
    st((P),_mm256_unpacklo_epi16(x,y)); st((P)+16,_mm256_unpackhi_epi16(x,y)); } while(0)
static void pack_wide_b(U *dA,U *dB,const U *s) {
    const long ST=1024;
    const long d0=s-raw_basis_input;
    const int b5=(int)((d0>>5)&1), b17=(int)((d0>>15)&1);
    const int t00=b5&b17, t01=(b5^1)&b17, t10=b5&(b17^1), t11=(b5^1)&(b17^1);
// ms1ad_ : same loop-unswitch on the right leaf.  tf0 = r?t10:t00 and tf1 = r?t11:t01 are
// loop-invariant, so the k-loop is instanced for the four (t00,t01)/(t10,t11) bit pairs with
// the flags as LITERALS -- no conditional basic blocks inside the innermost loop.  The actual
// flags executed for a given call are exactly the inherited ones; values, layout, store
// instructions and addresses are unchanged.
#define MS1AD_PWB(RS, T0, T1) do { \
    const U *sr=s+(long)(RS)*32*ST; \
    U *p0=dA+((RS)?2*PWL_Q:0), *p1=dA+((RS)?3*PWL_Q:PWL_Q), *p2=dB+((RS)?2*PWL_Q:0), *p3=dB+((RS)?3*PWL_Q:PWL_Q); \
    for (int k=0;k<32;k+=2) { \
        S4DF_BW(p0+0 ,  0,(T0));         S4DF_BW(p0+32, 16,(T0)); \
        S4DF_BW(p1+0 , 32,(T1));         S4DF_BW(p1+32, 48,(T1)); \
        S4DF_BW(p2+0 , 64,(T0));         S4DF_BW(p2+32, 80,(T0)); \
        S4DF_BW(p3+0 , 96,(T1));         S4DF_BW(p3+32,112,(T1)); \
        p0+=64; p1+=64; p2+=64; p3+=64; \
    } } while(0)
    { const int T00=t00, T01=t01, T10=t10, T11=t11;
      if(T00){ if(T01){ MS1AD_PWB(0,1,1); } else { MS1AD_PWB(0,1,0); } }
      else   { if(T01){ MS1AD_PWB(0,0,1); } else { MS1AD_PWB(0,0,0); } }
      if(T10){ if(T11){ MS1AD_PWB(1,1,1); } else { MS1AD_PWB(1,1,0); } }
      else   { if(T11){ MS1AD_PWB(1,0,1); } else { MS1AD_PWB(1,0,0); } } }
#undef MS1AD_PWB
}

static void unpack(U *d, const U *s, int n, int stride) {
    if (n > BASE) {
        int h = n/2, q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        unpack(d,s,h,stride);
        unpack(d+h,s+q,h,stride);
        unpack(d+h*stride,s+2*q,h,stride);
        unpack(d+h*stride+h,s+3*q,h,stride);
    } else {
        for (int i=0;i<n;++i) {
            U *dp = d + (size_t)i*stride; const U *sp = s + (size_t)i*n;
            int k=0;
            for (;k+32<=n;k+=32) {
                _mm256_stream_si256((__m256i*)(dp+k),    _mm256_load_si256((const __m256i*)(sp+k)));
                _mm256_stream_si256((__m256i*)(dp+k+16), _mm256_load_si256((const __m256i*)(sp+k+16)));
            }
            for (;k<n;k+=16) _mm256_storeu_si256((__m256i*)(dp+k), _mm256_loadu_si256((const __m256i*)(sp+k)));
        }
    }
}

// ===== s4bj_ : 叶尾改 blend 后,每个 16 字组内被 sigma 置换,decode 前先复原 =====
// sigma   = [0,4,1,5,2,6,3,7 | 8,12,9,13,10,14,11,15]   (new[j] = old[sigma(j)])
// sigma^-1= [0,2,4,6,1,3,5,7 | 8,10,12,14,9,11,13,15]   (old[i] = new[sigma^-1(i)])
alignas(32) static const unsigned char s4bj_si[32] = {
 0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15, 0,1,4,5,8,9,12,13,2,3,6,7,10,11,14,15};
static inline __m256i s4bj_fx(__m256i v) {
    return _mm256_shuffle_epi8(v, _mm256_load_si256((const __m256i *)s4bj_si));
}
alignas(32) unsigned short s4aj_m16[16] = {0xFFFF,0,0xFFFF,0,0xFFFF,0,0xFFFF,0,0xFFFF,0,0xFFFF,0,0xFFFF,0,0xFFFF,0};
alignas(32) unsigned char s4ak_sh16[32] = {0,1,4,5,8,9,12,13, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0,1,4,5,8,9,12,13, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80};
// One explicit panel/row loop keeps exactly one copy of the large kernel.
template<int Mode>
static inline void native2x32_cache3(const U *a,const U *b,U *c) {
    const U *abase=a+1024;   // = a0 + 2048 bytes; index i runs -2048..-128 (16 iters)
    U *cbase=c+1024;         // = c0 + 2048 bytes; both pointers advance 128 B per iteration
    intptr_t idx=-2048;
    asm volatile(
        "3:\n\t"
        "vmovdqa 0(%[b]), %%ymm8\n\t"
        "vmovdqa 32(%[b]), %%ymm9\n\t"
        "vmovdqa 64(%[b]), %%ymm10\n\t"
        "vmovdqa 96(%[b]), %%ymm11\n\t"
        "vpbroadcastd 0(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm0\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm1\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm2\n\t"
        "vpmaddwd %%ymm11, %%ymm12, %%ymm3\n\t"
        "vpbroadcastd 4(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm4\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm5\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm6\n\t"
        "vpmaddwd %%ymm11, %%ymm12, %%ymm7\n\t"
        "vmovdqa 128(%[b]), %%ymm8\n\t"
        "vmovdqa 160(%[b]), %%ymm9\n\t"
        "vmovdqa 192(%[b]), %%ymm10\n\t"
        "vpbroadcastd 8(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 224(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 12(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 256(%[b]), %%ymm8\n\t"
        "vmovdqa 288(%[b]), %%ymm9\n\t"
        "vmovdqa 320(%[b]), %%ymm10\n\t"
        "vpbroadcastd 16(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 352(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 20(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 384(%[b]), %%ymm8\n\t"
        "vmovdqa 416(%[b]), %%ymm9\n\t"
        "vmovdqa 448(%[b]), %%ymm10\n\t"
        "vpbroadcastd 24(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 480(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 28(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 512(%[b]), %%ymm8\n\t"
        "vmovdqa 544(%[b]), %%ymm9\n\t"
        "vmovdqa 576(%[b]), %%ymm10\n\t"
        "vpbroadcastd 32(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 608(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 36(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 640(%[b]), %%ymm8\n\t"
        "vmovdqa 672(%[b]), %%ymm9\n\t"
        "vmovdqa 704(%[b]), %%ymm10\n\t"
        "vpbroadcastd 40(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 736(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 44(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 768(%[b]), %%ymm8\n\t"
        "vmovdqa 800(%[b]), %%ymm9\n\t"
        "vmovdqa 832(%[b]), %%ymm10\n\t"
        "vpbroadcastd 48(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 864(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 52(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 896(%[b]), %%ymm8\n\t"
        "vmovdqa 928(%[b]), %%ymm9\n\t"
        "vmovdqa 960(%[b]), %%ymm10\n\t"
        "vpbroadcastd 56(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 992(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 60(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1024(%[b]), %%ymm8\n\t"
        "vmovdqa 1056(%[b]), %%ymm9\n\t"
        "vmovdqa 1088(%[b]), %%ymm10\n\t"
        "vpbroadcastd 64(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1120(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 68(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1152(%[b]), %%ymm8\n\t"
        "vmovdqa 1184(%[b]), %%ymm9\n\t"
        "vmovdqa 1216(%[b]), %%ymm10\n\t"
        "vpbroadcastd 72(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1248(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 76(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1280(%[b]), %%ymm8\n\t"
        "vmovdqa 1312(%[b]), %%ymm9\n\t"
        "vmovdqa 1344(%[b]), %%ymm10\n\t"
        "vpbroadcastd 80(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1376(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 84(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1408(%[b]), %%ymm8\n\t"
        "vmovdqa 1440(%[b]), %%ymm9\n\t"
        "vmovdqa 1472(%[b]), %%ymm10\n\t"
        "vpbroadcastd 88(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1504(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 92(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1536(%[b]), %%ymm8\n\t"
        "vmovdqa 1568(%[b]), %%ymm9\n\t"
        "vmovdqa 1600(%[b]), %%ymm10\n\t"
        "vpbroadcastd 96(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1632(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 100(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1664(%[b]), %%ymm8\n\t"
        "vmovdqa 1696(%[b]), %%ymm9\n\t"
        "vmovdqa 1728(%[b]), %%ymm10\n\t"
        "vpbroadcastd 104(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1760(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 108(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1792(%[b]), %%ymm8\n\t"
        "vmovdqa 1824(%[b]), %%ymm9\n\t"
        "vmovdqa 1856(%[b]), %%ymm10\n\t"
        "vpbroadcastd 112(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 1888(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 116(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vmovdqa 1920(%[b]), %%ymm8\n\t"
        "vmovdqa 1952(%[b]), %%ymm9\n\t"
        "vmovdqa 1984(%[b]), %%ymm10\n\t"
        "vpbroadcastd 120(%[abase],%[i],1), %%ymm11\n\t"
        "vpmaddwd %%ymm8, %%ymm11, %%ymm12\n\t"
        "vpmaddwd %%ymm9, %%ymm11, %%ymm13\n\t"
        "vpmaddwd %%ymm10, %%ymm11, %%ymm14\n\t"
        "vmovdqa 2016(%[b]), %%ymm15\n\t"
        "vpmaddwd %%ymm15, %%ymm11, %%ymm11\n\t"
        "vpaddd %%ymm12, %%ymm0, %%ymm0\n\t"
        "vpbroadcastd 124(%[abase],%[i],1), %%ymm12\n\t"
        "vpmaddwd %%ymm8, %%ymm12, %%ymm8\n\t"
        "vpmaddwd %%ymm9, %%ymm12, %%ymm9\n\t"
        "vpmaddwd %%ymm10, %%ymm12, %%ymm10\n\t"
        "vpmaddwd %%ymm15, %%ymm12, %%ymm12\n\t"
        "vpaddd %%ymm13, %%ymm1, %%ymm1\n\t"
        "vpaddd %%ymm14, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm11, %%ymm3, %%ymm3\n\t"
        "vpaddd %%ymm8, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm9, %%ymm5, %%ymm5\n\t"
        "vpaddd %%ymm10, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm12, %%ymm7, %%ymm7\n\t"
        "vpslld $16, %%ymm1, %%ymm1\n\t"
        "vpblendw $0xAA, %%ymm1, %%ymm0, %%ymm0\n\t"
        ".if %c[mode] == 1\n\t"
        "vpaddw 0(%[cbase],%[i],1), %%ymm0, %%ymm0\n\t"
        ".endif\n\t"
        "vmovdqu %%ymm0, 0(%[cbase],%[i],1)\n\t"
        "vpslld $16, %%ymm3, %%ymm3\n\t"
        "vpblendw $0xAA, %%ymm3, %%ymm2, %%ymm2\n\t"
        ".if %c[mode] == 1\n\t"
        "vpaddw 32(%[cbase],%[i],1), %%ymm2, %%ymm2\n\t"
        ".endif\n\t"
        "vmovdqu %%ymm2, 32(%[cbase],%[i],1)\n\t"
        "vpslld $16, %%ymm5, %%ymm5\n\t"
        "vpblendw $0xAA, %%ymm5, %%ymm4, %%ymm4\n\t"
        ".if %c[mode] == 1\n\t"
        "vpaddw 64(%[cbase],%[i],1), %%ymm4, %%ymm4\n\t"
        ".endif\n\t"
        "vmovdqu %%ymm4, 64(%[cbase],%[i],1)\n\t"
        "vpslld $16, %%ymm7, %%ymm7\n\t"
        "vpblendw $0xAA, %%ymm7, %%ymm6, %%ymm6\n\t"
        ".if %c[mode] == 1\n\t"
        "vpaddw 96(%[cbase],%[i],1), %%ymm6, %%ymm6\n\t"
        ".endif\n\t"
        "vmovdqu %%ymm6, 96(%[cbase],%[i],1)\n\t"
        "add $128, %[i]\n\t"
        "jnz 3b\n\t"
        : [i] "+&r"(idx)
        : [b] "r"(b), [abase] "r"(abase), [cbase] "r"(cbase), [mode] "i"(Mode)
        : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7", "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15");
}
static void base(const U *a,const U *b,U *c,int n) {
    native2x32_cache3<0>(a,b,c);
}
// Only one additional hot body: M1, M3 and the negated-M7 update all add.
static __attribute__((noinline)) void leaf_add(const U*a,const U*b,U*c){
 native2x32_cache3<1>(a,b,c);
}
static inline void emit_native(U *dst,const U *s,int stride) {
    for(int row=0;row<4;++row) {
        U *d=dst+(size_t)row*stride;
        _mm256_stream_si256((__m256i*)(d+0),s4bj_fx(ld(s+32*row)));
        _mm256_stream_si256((__m256i*)(d+16),s4bj_fx(ld(s+32*row+16)));
    }
}

template<bool Sub>
static inline void combine(U *d,const U *a,const U *b,int len) {
    #pragma GCC unroll 1
    for(int chunk=0;chunk<len;chunk+=1024+TILE_PAD) {
        const U *end=a+1024;
        if constexpr(Sub) {
            asm volatile(
        "1:\n\t"
        "vmovdqa 0(%[a]), %%ymm0\n\t"
        "vmovdqa 32(%[a]), %%ymm1\n\t"
        "vmovdqa 64(%[a]), %%ymm2\n\t"
        "vmovdqa 96(%[a]), %%ymm3\n\t"
        "vpsubw 0(%[b]), %%ymm0, %%ymm0\n\t"
        "vpsubw 32(%[b]), %%ymm1, %%ymm1\n\t"
        "vpsubw 64(%[b]), %%ymm2, %%ymm2\n\t"
        "vpsubw 96(%[b]), %%ymm3, %%ymm3\n\t"
        "vmovdqa %%ymm0, 0(%[d])\n\t"
        "vmovdqa %%ymm1, 32(%[d])\n\t"
        "vmovdqa %%ymm2, 64(%[d])\n\t"
        "vmovdqa %%ymm3, 96(%[d])\n\t"
        "add $128, %[a]\n\t"
        "add $128, %[b]\n\t"
        "add $128, %[d]\n\t"
        "cmp %[end], %[a]\n\t"
        "jb 1b\n\t"
        : [a] "+&r"(a), [b] "+&r"(b), [d] "+&r"(d)
        : [end] "r"(end)
        : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
        } else {
            asm volatile(
        "1:\n\t"
        "vmovdqa 0(%[a]), %%ymm0\n\t"
        "vmovdqa 32(%[a]), %%ymm1\n\t"
        "vmovdqa 64(%[a]), %%ymm2\n\t"
        "vmovdqa 96(%[a]), %%ymm3\n\t"
        "vpaddw 0(%[b]), %%ymm0, %%ymm0\n\t"
        "vpaddw 32(%[b]), %%ymm1, %%ymm1\n\t"
        "vpaddw 64(%[b]), %%ymm2, %%ymm2\n\t"
        "vpaddw 96(%[b]), %%ymm3, %%ymm3\n\t"
        "vmovdqa %%ymm0, 0(%[d])\n\t"
        "vmovdqa %%ymm1, 32(%[d])\n\t"
        "vmovdqa %%ymm2, 64(%[d])\n\t"
        "vmovdqa %%ymm3, 96(%[d])\n\t"
        "add $128, %[a]\n\t"
        "add $128, %[b]\n\t"
        "add $128, %[d]\n\t"
        "cmp %[end], %[a]\n\t"
        "jb 1b\n\t"
        : [a] "+&r"(a), [b] "+&r"(b), [d] "+&r"(d)
        : [end] "r"(end)
        : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
        }
        a+=TILE_PAD;b+=TILE_PAD;d+=TILE_PAD;
    }
}

template<bool Sub,int Delta>
static inline void combine_displaced(U *d,const U *a,int len) {
 #pragma GCC unroll 1
 for(int chunk=0;chunk<len;chunk+=1024+TILE_PAD) {
 const U *end=a+1024;
 if constexpr(Sub) {
 asm volatile("1:\n\t"
 "vmovdqa 0(%[a]), %%ymm0\n\t"
 "vmovdqa 32(%[a]), %%ymm1\n\t"
 "vmovdqa 64(%[a]), %%ymm2\n\t"
 "vmovdqa 96(%[a]), %%ymm3\n\t"
 "vpsubw %c[delta]+0(%[a]), %%ymm0, %%ymm0\n\t"
 "vpsubw %c[delta]+32(%[a]), %%ymm1, %%ymm1\n\t"
 "vpsubw %c[delta]+64(%[a]), %%ymm2, %%ymm2\n\t"
 "vpsubw %c[delta]+96(%[a]), %%ymm3, %%ymm3\n\t"
 "vmovdqa %%ymm0, 0(%[d])\n\t"
 "vmovdqa %%ymm1, 32(%[d])\n\t"
 "vmovdqa %%ymm2, 64(%[d])\n\t"
 "vmovdqa %%ymm3, 96(%[d])\n\t"
 "add $128, %[a]\n\t"
 "add $128, %[d]\n\t"
 "cmp %[end], %[a]\n\t"
 "jb 1b\n\t"
 : [a] "+&r"(a), [d] "+&r"(d)
 : [end] "r"(end), [delta] "i"(2*Delta)
 : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
 } else {
 asm volatile("1:\n\t"
 "vmovdqa 0(%[a]), %%ymm0\n\t"
 "vmovdqa 32(%[a]), %%ymm1\n\t"
 "vmovdqa 64(%[a]), %%ymm2\n\t"
 "vmovdqa 96(%[a]), %%ymm3\n\t"
 "vpaddw %c[delta]+0(%[a]), %%ymm0, %%ymm0\n\t"
 "vpaddw %c[delta]+32(%[a]), %%ymm1, %%ymm1\n\t"
 "vpaddw %c[delta]+64(%[a]), %%ymm2, %%ymm2\n\t"
 "vpaddw %c[delta]+96(%[a]), %%ymm3, %%ymm3\n\t"
 "vmovdqa %%ymm0, 0(%[d])\n\t"
 "vmovdqa %%ymm1, 32(%[d])\n\t"
 "vmovdqa %%ymm2, 64(%[d])\n\t"
 "vmovdqa %%ymm3, 96(%[d])\n\t"
 "add $128, %[a]\n\t"
 "add $128, %[d]\n\t"
 "cmp %[end], %[a]\n\t"
 "jb 1b\n\t"
 : [a] "+&r"(a), [d] "+&r"(d)
 : [end] "r"(end), [delta] "i"(2*Delta)
 : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
 }
 a+=TILE_PAD;d+=TILE_PAD;
 }
}

// pdoom frontier6: the output is its own first operand, so only two
// advancing addresses are necessary. N64 calls touch a single valid leaf.
template<bool Sub>
static inline void combine_inplace(U *d,const U *b,int len) {
 #pragma GCC unroll 1
 for(int chunk=0;chunk<len;chunk+=1024+TILE_PAD) {
 const U *end=d+1024;
 if constexpr(Sub) {
 asm volatile("1:\n\t"
 "vmovdqa 0(%[d]), %%ymm0\n\t"
 "vmovdqa 32(%[d]), %%ymm1\n\t"
 "vmovdqa 64(%[d]), %%ymm2\n\t"
 "vmovdqa 96(%[d]), %%ymm3\n\t"
 "vpsubw 0(%[b]), %%ymm0, %%ymm0\n\t"
 "vpsubw 32(%[b]), %%ymm1, %%ymm1\n\t"
 "vpsubw 64(%[b]), %%ymm2, %%ymm2\n\t"
 "vpsubw 96(%[b]), %%ymm3, %%ymm3\n\t"
 "vmovdqa %%ymm0, 0(%[d])\n\t"
 "vmovdqa %%ymm1, 32(%[d])\n\t"
 "vmovdqa %%ymm2, 64(%[d])\n\t"
 "vmovdqa %%ymm3, 96(%[d])\n\t"
 "add $128, %[d]\n\t"
 "add $128, %[b]\n\t"
 "cmp %[end], %[d]\n\t"
 "jb 1b\n\t"
 : [d] "+&r"(d), [b] "+&r"(b)
 : [end] "r"(end)
 : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
 } else {
 asm volatile("1:\n\t"
 "vmovdqa 0(%[d]), %%ymm0\n\t"
 "vmovdqa 32(%[d]), %%ymm1\n\t"
 "vmovdqa 64(%[d]), %%ymm2\n\t"
 "vmovdqa 96(%[d]), %%ymm3\n\t"
 "vpaddw 0(%[b]), %%ymm0, %%ymm0\n\t"
 "vpaddw 32(%[b]), %%ymm1, %%ymm1\n\t"
 "vpaddw 64(%[b]), %%ymm2, %%ymm2\n\t"
 "vpaddw 96(%[b]), %%ymm3, %%ymm3\n\t"
 "vmovdqa %%ymm0, 0(%[d])\n\t"
 "vmovdqa %%ymm1, 32(%[d])\n\t"
 "vmovdqa %%ymm2, 64(%[d])\n\t"
 "vmovdqa %%ymm3, 96(%[d])\n\t"
 "add $128, %[d]\n\t"
 "add $128, %[b]\n\t"
 "cmp %[end], %[d]\n\t"
 "jb 1b\n\t"
 : [d] "+&r"(d), [b] "+&r"(b)
 : [end] "r"(end)
 : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
 }
 d+=TILE_PAD;b+=TILE_PAD;
 }
}

// pdoom frontier6: the output is its own first operand, so only two
// advancing addresses are necessary. N64 calls touch a single valid leaf.

static inline void combine_reverse_inplace(U *d,const U *b,int len) {
 #pragma GCC unroll 1
 for(int chunk=0;chunk<len;chunk+=1024+TILE_PAD) {
 const U *end=d+1024;
 asm volatile("1:\n\t"
 "vmovdqa 0(%[b]), %%ymm0\n\t"
 "vmovdqa 32(%[b]), %%ymm1\n\t"
 "vmovdqa 64(%[b]), %%ymm2\n\t"
 "vmovdqa 96(%[b]), %%ymm3\n\t"
 "vpsubw 0(%[d]), %%ymm0, %%ymm0\n\t"
 "vpsubw 32(%[d]), %%ymm1, %%ymm1\n\t"
 "vpsubw 64(%[d]), %%ymm2, %%ymm2\n\t"
 "vpsubw 96(%[d]), %%ymm3, %%ymm3\n\t"
 "vmovdqa %%ymm0, 0(%[d])\n\t"
 "vmovdqa %%ymm1, 32(%[d])\n\t"
 "vmovdqa %%ymm2, 64(%[d])\n\t"
 "vmovdqa %%ymm3, 96(%[d])\n\t"
 "add $128, %[d]\n\t"
 "add $128, %[b]\n\t"
 "cmp %[end], %[d]\n\t"
 "jb 1b\n\t"
 : [d] "+&r"(d), [b] "+&r"(b)
 : [end] "r"(end)
 : "cc", "memory", "ymm0", "ymm1", "ymm2", "ymm3");
 d+=TILE_PAD;b+=TILE_PAD;
 }
}

// At the root, the three completed packed quadrants can be sent straight
// to their final row-major destinations rather than materialized in pc.
template<int N>
static __attribute__((noinline)) void combine3_unpack(
    U *d12,U *d21,U *d22,
    const U *p6,const U *p7,const U *p5,
    const U *p1,const U *p4,const U *p3,int stride) {
    if constexpr (N > BASE) {
        constexpr int h=N/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        combine3_unpack<h>(d12,d21,d22,p6,p7,p5,p1,p4,p3,stride);
        combine3_unpack<h>(d12+h,d21+h,d22+h,p6+q,p7+q,p5+q,p1+q,p4+q,p3+q,stride);
        combine3_unpack<h>(d12+h*stride,d21+h*stride,d22+h*stride,
                           p6+2*q,p7+2*q,p5+2*q,p1+2*q,p4+2*q,p3+2*q,stride);
        combine3_unpack<h>(d12+h*stride+h,d21+h*stride+h,d22+h*stride+h,
                           p6+3*q,p7+3*q,p5+3*q,p1+3*q,p4+3*q,p3+3*q,stride);
    } else {
        alignas(32) U temp[3*128];
        for(int block=0;block<1024;block=block+128) {
            for(int v=0;v<128;v+=16) {
                int idx=block+v;
                __m256i u2=_mm256_add_epi16(ld(p1+idx),ld(p6+idx));
                __m256i u3=_mm256_add_epi16(u2,ld(p7+idx));
                __m256i v5=ld(p5+idx);
                st(temp+v,_mm256_add_epi16(_mm256_add_epi16(u2,v5),ld(p3+idx)));
                st(temp+128+v,_mm256_sub_epi16(u3,ld(p4+idx)));
                st(temp+256+v,_mm256_add_epi16(u3,v5));
            }
            size_t off=(size_t)(block/32)*stride;
            emit_native(d12+off,temp,stride);
            emit_native(d21+off,temp+128,stride);
            emit_native(d22+off,temp+256,stride);
        }
    }
}

// Add the surviving P1 into the root C11 product while mapping its packed
// quadrant layout to the final row-major C11 cells.
template<int N>
static __attribute__((noinline)) void unpack_add(U *d,const U *p2,const U *p1,int stride) {
    if constexpr(N>BASE) {
        constexpr int h=N/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        unpack_add<h>(d,p2,p1,stride);
        unpack_add<h>(d+h,p2+q,p1+q,stride);
        unpack_add<h>(d+h*stride,p2+2*q,p1+2*q,stride);
        unpack_add<h>(d+h*stride+h,p2+3*q,p1+3*q,stride);
    } else {
        alignas(32) U temp[128];
        for(int block=0;block<1024;block+=128) {
            for(int v=0;v<128;v+=16)
                st(temp+v,_mm256_add_epi16(ld(p2+block+v),ld(p1+block+v)));
            emit_native(d+(size_t)(block/32)*stride,temp,stride);
        }
    }
}

// Strassen-Winograd: seven products, fifteen additions, two temporaries.
// All operations are in Z/(2^16); truncation never changes the answer.

template<int N>
static __attribute__((noinline)) void root_fuse(
    U *d11,U *d12,U *d21,U *d22,
    const U *p1,const U *p2,const U *p3,const U *p4,const U *p5,const U *p6,const U *p7,int stride) {
    if constexpr(N==128) {
        constexpr int q=BASE*BASE+TILE_PAD;
        root_fuse<64>(d11,d12,d21,d22,p1,p2,p3,p4,p5,p6,p7,stride);
        alignas(32) U keep[4*512], cur[4*512];
        U *dest[4]={d11,d12,d21,d22};
        for(int block=0;block<1024;block+=128) {
            auto make_inner=[&](U *tmp,int group) {
                for(int child=0;child<4;child++) {
                    for(int v=0;v<128;v+=16) {
                        int idx=(4*group+child)*q+block+v;
                        if(!(v&16)){__builtin_prefetch(p1+idx+128,0,3);__builtin_prefetch(p2+idx+128,0,3);__builtin_prefetch(p3+idx+128,0,3);__builtin_prefetch(p4+idx+128,0,3);__builtin_prefetch(p5+idx+128,0,3);__builtin_prefetch(p6+idx+128,0,3);__builtin_prefetch(p7+idx+128,0,3);}
                        __m256i v1=ld(p1+idx),v5=ld(p5+idx);
                        __m256i u2=_mm256_add_epi16(v1,ld(p6+idx));
                        __m256i u3=_mm256_add_epi16(u2,ld(p7+idx));
                        U *t=tmp+child*512;
                        st(t+v,_mm256_add_epi16(v1,ld(p2+idx)));
                        st(t+128+v,_mm256_add_epi16(_mm256_add_epi16(u2,v5),ld(p3+idx)));
                        st(t+256+v,_mm256_sub_epi16(u3,ld(p4+idx)));
                        st(t+384+v,_mm256_add_epi16(u3,v5));
                    }
                }
                for(int v=0;v<512;v+=16) {
                    __m256i c22=ld(tmp+3*512+v);
                    st(tmp+1*512+v,_mm256_sub_epi16(ld(tmp+1*512+v),c22));
                    st(tmp+2*512+v,_mm256_sub_epi16(c22,ld(tmp+2*512+v)));
                }
            };
            size_t off=(size_t)(block/32)*stride;
            make_inner(keep,3);
            for(int child=0;child<4;child++) {
                int row=64+((child>>1)&1)*32,col=64+(child&1)*32;
                for(int r=0;r<4;r++)emit_native(dest[r]+off+row*stride+col,keep+child*512+r*128,stride);
            }
            for(int group=1;group<=2;group++) {
                make_inner(cur,group);
                for(int child=0;child<4;child++) {
                    int row=((group>>1)&1)*64+((child>>1)&1)*32;
                    int col=(group&1)*64+(child&1)*32;
                    for(int r=0;r<4;r++)for(int rr=0;rr<4;rr++) {
                        U *d=dest[r]+off+(row+rr)*stride+col;
                        const U *x=cur+child*512+r*128+rr*32;
                        const U *y=keep+child*512+r*128+rr*32;
                        __m256i v0,v1;
                        if(group==1) {
                            v0=_mm256_sub_epi16(ld(x),ld(y));
                            v1=_mm256_sub_epi16(ld(x+16),ld(y+16));
                        } else {
                            v0=_mm256_sub_epi16(ld(y),ld(x));
                            v1=_mm256_sub_epi16(ld(y+16),ld(x+16));
                        }
                        _mm256_stream_si256((__m256i*)d,s4bj_fx(v0));
                        _mm256_stream_si256((__m256i*)(d+16),s4bj_fx(v1));
                    }
                }
            }
        }
    } else if constexpr(N==64) {
        constexpr int q=BASE*BASE+TILE_PAD;
        root_fuse<32>(d11,d12,d21,d22,p1,p2,p3,p4,p5,p6,p7,stride);
        alignas(32) U tmp[3*4*128];
        U *dest[4]={d11,d12,d21,d22};
        for(int block=0;block<1024;block+=128) {
            for(int child=1;child<=3;child++) {
                for(int v=0;v<128;v+=16) {
                    int idx=child*q+block+v;
                    if(!(v&16)){__builtin_prefetch(p1+idx+128,0,3);__builtin_prefetch(p2+idx+128,0,3);__builtin_prefetch(p3+idx+128,0,3);__builtin_prefetch(p4+idx+128,0,3);__builtin_prefetch(p5+idx+128,0,3);__builtin_prefetch(p6+idx+128,0,3);__builtin_prefetch(p7+idx+128,0,3);}
                    __m256i v1=ld(p1+idx),v5=ld(p5+idx);
                    __m256i u2=_mm256_add_epi16(v1,ld(p6+idx));
                    __m256i u3=_mm256_add_epi16(u2,ld(p7+idx));
                    U *t=tmp+(child-1)*512;
                    st(t+v,_mm256_add_epi16(v1,ld(p2+idx)));
                    st(t+128+v,_mm256_add_epi16(_mm256_add_epi16(u2,v5),ld(p3+idx)));
                    st(t+256+v,_mm256_sub_epi16(u3,ld(p4+idx)));
                    st(t+384+v,_mm256_add_epi16(u3,v5));
                }
            }
            for(int v=0;v<512;v+=16) {
                __m256i c22=ld(tmp+1024+v);
                st(tmp+v,_mm256_sub_epi16(ld(tmp+v),c22));
                st(tmp+512+v,_mm256_sub_epi16(c22,ld(tmp+512+v)));
            }
            size_t off=(size_t)(block/32)*stride;
            for(int r=0;r<4;r++) {
                emit_native(dest[r]+off+32,tmp+r*128,stride);
                emit_native(dest[r]+off+32*stride,tmp+512+r*128,stride);
                emit_native(dest[r]+off+32*stride+32,tmp+1024+r*128,stride);
            }
        }
    } else if constexpr (N > BASE) {
        constexpr int h=N/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        root_fuse<h>(d11,d12,d21,d22,p1,p2,p3,p4,p5,p6,p7,stride);
        root_fuse<h>(d11+h,d12+h,d21+h,d22+h,p1+q,p2+q,p3+q,p4+q,p5+q,p6+q,p7+q,stride);
        root_fuse<h>(d11+h*stride,d12+h*stride,d21+h*stride,d22+h*stride,
                     p1+2*q,p2+2*q,p3+2*q,p4+2*q,p5+2*q,p6+2*q,p7+2*q,stride);
        root_fuse<h>(d11+h*stride+h,d12+h*stride+h,d21+h*stride+h,d22+h*stride+h,
                     p1+3*q,p2+3*q,p3+3*q,p4+3*q,p5+3*q,p6+3*q,p7+3*q,stride);
    } else {
        alignas(32) U temp[4*128];
        for(int block=0;block<1024;block+=128) {
            for(int v=0;v<128;v+=16) {
                int idx=block+v;
                if(!(v&16)){__builtin_prefetch(p1+idx+128,0,3);__builtin_prefetch(p2+idx+128,0,3);__builtin_prefetch(p3+idx+128,0,3);__builtin_prefetch(p4+idx+128,0,3);__builtin_prefetch(p5+idx+128,0,3);__builtin_prefetch(p6+idx+128,0,3);__builtin_prefetch(p7+idx+128,0,3);}
                __m256i u2=_mm256_add_epi16(ld(p1+idx),ld(p6+idx));
                __m256i u3=_mm256_add_epi16(u2,ld(p7+idx));
                __m256i v5=ld(p5+idx);
                st(temp+v,_mm256_add_epi16(_mm256_add_epi16(u2,v5),ld(p3+idx)));
                st(temp+128+v,_mm256_sub_epi16(u3,ld(p4+idx)));
                st(temp+256+v,_mm256_add_epi16(u3,v5));
                st(temp+384+v,_mm256_add_epi16(ld(p2+idx),ld(p1+idx)));
            }
            size_t off=(size_t)(block/32)*stride;
            emit_native(d12+off,temp,stride);
            emit_native(d21+off,temp+128,stride);
            emit_native(d22+off,temp+256,stride);
            emit_native(d11+off,temp+384,stride);
        }
    }
}

template<int N>
static __attribute__((noinline)) void mul(const U *a,const U *b,U *c,U *work) {
    if constexpr (N<=BASE) {
        base(a,b,c,N);
    } else if constexpr (N<=ALTMAX) {

  constexpr int h=N/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
  const U *a11=a,*a12=a+q,*a21=a+2*q,*a22=a+3*q;
  const U *b11=b,*b12=b+q,*b21=b+2*q,*b22=b+3*q;
  U *c11=c,*c12=c+q,*c21=c+2*q,*c22=c+3*q;
  U *x=work+0,*y=work+2*q+704,*next=work+4*q+640;
  mul<h>(a12,b21,c11,next);                 // m2
  mul<h>(a22,b22,c22,next);                 // m4
  combine_displaced<false,q>(x,a21,q);
  combine_displaced<false,q>(y,b21,q);
  mul<h>(x,y,c12,next);                     // m5
  combine_displaced<true,-2*q>(x,a22,q);
  combine_displaced<true,-2*q>(y,b22,q);
  mul<h>(x,y,c21,next);                     // m6
  for(int chunk=0;chunk<q;chunk+=1024+TILE_PAD)
   _Pragma("GCC unroll 4")
   for(int i=chunk;i<chunk+1024;i+=16)
   st(c22+i,_mm256_sub_epi16(_mm256_add_epi16(ld(c12+i),ld(c21+i)),_mm256_add_epi16(ld(c11+i),ld(c22+i))));
  if constexpr(N==64) {
   leaf_add(a11,b11,c11);                  // m1 directly accumulates
   combine_displaced<true,-3*q>(y,b22,q);
   leaf_add(a21,y,c21);                    // m3 directly accumulates
   combine_displaced<true,3*q>(x,a11,q);   // negate the M7 A input
   leaf_add(x,b12,c12);                    // c12+=(-oldM7)
  } else {
  mul<h>(a11,b11,x,next);                   // m1
  combine_inplace<false>(c11,x,q);
  combine_displaced<true,-3*q>(y,b22,q);
  mul<h>(a21,y,x,next);                     // m3
  combine_inplace<false>(c21,x,q);
  combine_displaced<true,-3*q>(x,a22,q);
  mul<h>(x,b12,y,next);                     // m7
  combine_inplace<true>(c12,y,q);
  }
    } else {
    constexpr int h=N/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
    const U *a11=a,*a12=a+q,*a21=a+2*q,*a22=a+3*q;
    const U *b11=b,*b12=b+q,*b21=b+2*q,*b22=b+3*q;
    U *c11=c,*c12=c+q,*c21=c+2*q,*c22=c+3*q;
    U *x=work+192,*y=work+q+512,*next=work+q+q+512;
    combine_displaced<true,-2*q>(y,b22,q);
    combine_displaced<true,2*q>(x,a11,q);
    mul<h>(x,y,c21,next);                       // P7
    combine_displaced<false,q>(x,a21,q);
    combine_displaced<true,-q>(y,b12,q);
    mul<h>(x,y,c22,next);                       // P5
    combine_inplace<true>(x,a11,q);
    combine_reverse_inplace(y,b22,q);
    mul<h>(x,y,c12,next);                       // P6
    combine_reverse_inplace(x,a12,q);
    mul<h>(x,b22,c11,next);                     // P3
    combine_inplace<true>(y,b21,q);
    mul<h>(a22,y,x,next);                       // P4
    mul<h>(a11,b11,y,next);                     // P1
    if constexpr (N == 1024) {
        combine3_unpack<512>(final_out+512,
            final_out+(size_t)512*1024,
            final_out+(size_t)512*1024+512,
            c12,c21,c22,y,x,c11,1024);
    } else {
        for(int chunk=0;chunk<q;chunk+=1024+TILE_PAD) for(int i=chunk;i<chunk+1024;i+=16) {
            __m256i u2=_mm256_add_epi16(ld(y+i),ld(c12+i));
            __m256i u3=_mm256_add_epi16(u2,ld(c21+i));
            __m256i p5=ld(c22+i);
            st(c12+i,_mm256_add_epi16(_mm256_add_epi16(u2,p5),ld(c11+i)));
            st(c21+i,_mm256_sub_epi16(u3,ld(x+i)));
            st(c22+i,_mm256_add_epi16(u3,p5));
        }
    }
    mul<h>(a12,b21,c11,next);                   // P2
    if constexpr (N == 1024) unpack_add<512>(final_out,c11,y,1024);
    else combine_inplace<false>(c11,y,q);
    }
}


static constexpr int RQ=512*512+(512/BASE)*(512/BASE)*TILE_PAD,RS=RQ+ROOT_PAD;
alignas(4096) static U root_mem[15*RS+1024];
alignas(4096) static U root_tile[4*(64*64+(64/BASE)*(64/BASE)*TILE_PAD)];
static constexpr int HQ=64*64+(64/BASE)*(64/BASE)*TILE_PAD;
alignas(4096) static U high_left[4*HQ],high_right[4*HQ];
template<bool Right>
static void pack_four(U *tile,const U *s) {
    pack(tile,s,64,1024,Right);
    pack(tile+HQ,s+512,64,1024,Right);
    pack(tile+2*HQ,s+512*1024,64,1024,Right);
    pack(tile+3*HQ,s+512*1024+512,64,1024,Right);
}
// s4de_/s4df_: 横に隣接する 2 つの 64x64 tile(源 s と s+64)を 1 つの読み pass で作る。
//   Right=false(A オペランド)= pack_wide(s4de_ が #119672 で着地)。
//   Right=true (B オペランド)= pack_wide_b(s4df_、同機構の転置レイアウト版)。
template<bool Right>
static void pack_wide_root(U *tA,U *tB,const U *s) {
    if constexpr(!Right) {
        pack_wide(tA+0*HQ, tB+0*HQ, s);
        pack_wide(tA+1*HQ, tB+1*HQ, s+512);
        pack_wide(tA+2*HQ, tB+2*HQ, s+512L*1024);
        pack_wide(tA+3*HQ, tB+3*HQ, s+512L*1024+512);
    } else {
        pack_wide_b(tA+0*HQ, tB+0*HQ, s);
        pack_wide_b(tA+1*HQ, tB+1*HQ, s+512);
        pack_wide_b(tA+2*HQ, tB+2*HQ, s+512L*1024);
        pack_wide_b(tA+3*HQ, tB+3*HQ, s+512L*1024+512);
    }
}
template<bool Right,bool High>
static void emit_root64(const U *tile,const U *left,const U *right,int offset,U *dest,U *destq,int voff) {
  U *r0=destq+offset,*r1=r0+RS,*r2=r1+RS,*v7=dest+offset+voff*RS,*v5=v7+RS,*v6=v5+RS,*v34=v6+RS;
  for(int i=0;i<(64*64+(64/BASE)*(64/BASE)*TILE_PAD);i+=32){
   __m256i a=ld(tile+i),b=ld(tile+(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i),c=ld(tile+2*(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i),d=ld(tile+3*(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i);
   __m256i aa=ld(tile+i+16),bb=ld(tile+(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i+16),cc=ld(tile+2*(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i+16),dd=ld(tile+3*(64*64+(64/BASE)*(64/BASE)*TILE_PAD)+i+16);
   if constexpr(High) {
    a=_mm256_add_epi16(a,_mm256_sub_epi16(ld(left+0*HQ+i),ld(right+0*HQ+i)));
    b=_mm256_add_epi16(b,_mm256_sub_epi16(ld(left+1*HQ+i),ld(right+1*HQ+i)));
    c=_mm256_add_epi16(c,_mm256_sub_epi16(ld(left+2*HQ+i),ld(right+2*HQ+i)));
    d=_mm256_add_epi16(d,_mm256_sub_epi16(ld(left+3*HQ+i),ld(right+3*HQ+i)));
    aa=_mm256_add_epi16(aa,_mm256_sub_epi16(ld(left+0*HQ+i+16),ld(right+0*HQ+i+16)));
    bb=_mm256_add_epi16(bb,_mm256_sub_epi16(ld(left+1*HQ+i+16),ld(right+1*HQ+i+16)));
    cc=_mm256_add_epi16(cc,_mm256_sub_epi16(ld(left+2*HQ+i+16),ld(right+2*HQ+i+16)));
    dd=_mm256_add_epi16(dd,_mm256_sub_epi16(ld(left+3*HQ+i+16),ld(right+3*HQ+i+16)));
   }
   _mm256_stream_si256((__m256i*)(r0+i),a);_mm256_stream_si256((__m256i*)(r0+i+16),aa);
   _mm256_stream_si256((__m256i*)(r1+i),Right?c:b);_mm256_stream_si256((__m256i*)(r1+i+16),Right?cc:bb);
   _mm256_stream_si256((__m256i*)(r2+i),d);_mm256_stream_si256((__m256i*)(r2+i+16),dd);
   __m256i x7=Right?_mm256_sub_epi16(d,b):_mm256_sub_epi16(a,c);
   __m256i xx7=Right?_mm256_sub_epi16(dd,bb):_mm256_sub_epi16(aa,cc);
   _mm256_stream_si256((__m256i*)(v7+i),x7);_mm256_stream_si256((__m256i*)(v7+i+16),xx7);
   __m256i x5=Right?_mm256_sub_epi16(b,a):_mm256_add_epi16(c,d);
   __m256i xx5=Right?_mm256_sub_epi16(bb,aa):_mm256_add_epi16(cc,dd);
   _mm256_stream_si256((__m256i*)(v5+i),x5);_mm256_stream_si256((__m256i*)(v5+i+16),xx5);
   __m256i x6=Right?_mm256_sub_epi16(d,x5):_mm256_sub_epi16(x5,a);
   __m256i xx6=Right?_mm256_sub_epi16(dd,xx5):_mm256_sub_epi16(xx5,aa);
   _mm256_stream_si256((__m256i*)(v6+i),x6);_mm256_stream_si256((__m256i*)(v6+i+16),xx6);
   __m256i x34=Right?_mm256_sub_epi16(x6,c):_mm256_sub_epi16(b,x6);
   __m256i xx34=Right?_mm256_sub_epi16(xx6,cc):_mm256_sub_epi16(bb,xx6);
   _mm256_stream_si256((__m256i*)(v34+i),x34);_mm256_stream_si256((__m256i*)(v34+i+16),xx34);
  }
}
template<bool Right>
static void pack_root(const U*s,int n,int offset,U *dest,U *destq,int voff) {
    if(n>128){int h=n/2,q=h*h+(h/BASE)*(h/BASE)*TILE_PAD;
        pack_root<Right>(s,h,offset,dest,destq,voff);
        pack_root<Right>(s+h,h,offset+q,dest,destq,voff);
        pack_root<Right>(s+h*1024,h,offset+2*q,dest,destq,voff);
        pack_root<Right>(s+h*1024+h,h,offset+3*q,dest,destq,voff);
    } else {
        pack_wide_root<Right>(root_tile,high_left,s);
        emit_root64<Right,false>(root_tile,nullptr,nullptr,offset,dest,destq,voff);
        emit_root64<Right,false>(high_left,nullptr,nullptr,offset+HQ,dest,destq,voff);
        pack_wide_root<Right>(high_right,root_tile,s+64*1024);
        emit_root64<Right,false>(high_right,nullptr,nullptr,offset+2*HQ,dest,destq,voff);
        emit_root64<Right,true>(root_tile,high_left,high_right,offset+3*HQ,dest,destq,voff);
    }
}
void matrix_multiply(int n,const short*A,const short*B,short*C){
 U *cq=(U*)C; // Three root input slots and the retired tail precede final C writeback.
 U *ar=root_mem,*br=ar+4*RS,*pr=br+7*RS;   // root_mem 15 -> 12 槽
 U *work=cq+3*RS+(464*2);
 raw_basis_input=(const U*)A;
 pack_root<false>((const U*)A,512,0,ar,cq,0);
 raw_basis_input=(const U*)B;
 pack_root<true>((const U*)B,512,0,br,br,3);
 _mm_mfence();
 const U *a11=cq,*a12=cq+RS,*a22=cq+2*RS,*s7=ar,*s5=ar+RS,*s6=ar+2*RS,*s3=ar+3*RS;
 const U *b11=br,*b21=br+RS,*b22=br+2*RS,*t7=br+3*RS,*t5=br+4*RS,*t6=br+5*RS,*t4=br+6*RS;
 U *p1=ar+2*RS,*p2=br+5*RS,*p3=ar+RS,*p4=br+4*RS,*p5=ar,*p6=br+3*RS,*p7=pr;
 mul<512>(s7,t7,p7,work);mul<512>(s5,t5,p5,work);mul<512>(s6,t6,p6,work);
 mul<512>(s3,b22,p3,work);mul<512>(a22,t4,p4,work);mul<512>(a11,b11,p1,work);mul<512>(a12,b21,p2,work);
 U *out=(U*)C;
 root_fuse<512>(out,out+512,out+512*1024,out+512*1024+512,p1,p2,p3,p4,p5,p6,p7,1024);_mm_sfence();
 asm volatile(".purgem vzeroupper");
 _mm256_zeroupper();

}

CompilationN/AN/ACompile OKScore: N/A

Testcase #110.986 ms8 MB + 232 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2026-10-04 00:02:24 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠