提交记录 124735


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_agg1 mmml4k. 测测你的长整数矩阵乘法-4k Accepted 100 5.234 s 366368 KB C++17 78.59 KB
提交时间 评测时间
2026-10-05 01:39:00 2026-10-05 01:39:11
// ===== REFERENCES =====
// [1] duck.ac 用户 saffah_codex_6a_agg3,提交 #122210 <https://duck.ac/submission/122210>
//     用途:本文件引擎正文的最上游祖先(经 #120448 -> #122147 -> #122175 -> #122193 -> #117203
//     -> #124001 -> #124045 -> #124075 -> #124135 -> #124195 -> #124214 -> #124482 -> #124493 逐字节传递)。
// [2] duck.ac 用户 saffah_cc_v41_agg1(本账号),提交 #117203 <https://duck.ac/submission/117203>
//     用途:#122210 正文自述的上游("original engine")。
// [3] 本账号提交 #124493 <https://duck.ac/submission/124493>
//     用途:**本发母本** —— 本文件正文 = #124493 的逐字节完整源码(md5 b89cd5b7e791efd718f55bd38bf53ff8),
//     唯一改动区 = `mikro_i()` 的 rows==6 主环体内、`add $16, %[ap]` 之前插入定长 nop 编码;
//     被引用正文一个语义字节未改。
// [4] 本账号提交 #124027 <https://duck.ac/submission/124027>(环内审计席 ml4c7_ 的"环控制索引化"发)
//     与 #124075 <https://duck.ac/submission/124075>(ml4cd_ 的 ×2 展开 + 预取去冗余发)
//     用途:参考了其**机制结论**(环体编码字节数增长在本环上有真实代价;×2 展开后环体 380 B / 69 条)。
// [5] Agner Fog, "Instruction tables: Lists of instruction latencies, throughputs and
//     micro-operation breakdowns" <https://www.agner.org/optimize/instruction_tables.pdf>
//     许可证:CC BY-SA 4.0(允许任何用途,需署名并以相同方式共享)。
//     遵守方式:本文件未复制其表格或代码,仅参考其公开的 µop 数/端口归属数据用于静态记账
//     (vpmuludq ymm = 1 µop p01 · vpmulld ymm = 2 µop p01 · vbroadcastsd ymm,m64 = 1 µop p23 ·
//      vmovdqu ymm,m256 = 1 µop p23 · PREFETCHT0 = 1 µop p23 · NOP = 1 µop 无端口)。
// ======================
// ===== 思路 =====
// 【ml4dn_ 席 · 热叶环 µop 账 —— 把「1 uop/k = 115 ms」这条价签在判题机上实测标定】
//   入场口径(tools/exact.py mmml4k 现读):mine = 5215.681283(#124493)· T = 5263.033411(#122210)·
//   严支 = 0.99*T + 1µs = 5210.404077 ⇒ 缺口 5.277206 ms(0.101%)。
//   【为什么做这个】本席奉命攻「热叶环 µop 数削减」。开工前先建了**逐条 µop 账**(判题同款 gcc9 9.3.0
//   -O2 -std=c++17 -S 真汇编,`leaf64_by_sign<ASign>` 内联体),环体 = ×2 展开的
//   `mikro_i` rows==6 主环:**69 条指令 / 380 B / 每迭代 80 µop**(= 40 µop/k),分项:
//     12× vpmuludq (1µ)·12× vpmulld (2µ)·12× vpaddq (1µ)·12× vpaddd (1µ)·
//     6× vbroadcastsd (1µ)·4× vmovdqu (1µ)·1× prefetcht0 (1µ)·add/add/sub+jg (3µ)。
//   端口账(每迭代 2 k):p01 = 18 µop/k(= 12 muludq + 12 mulld-µ,**恰为 ISA 下界**:每 k 需
//   6 行×4 列=24 个 64×64 积 = 72 个 32×32 子积,muludq 每 µop 给 4 个、mulld 每 µop 给 4 个 ⇒ 18 µop
//   是最小值);发射 = 40/4 = 10 拍/k;p01 = 18/2 = 9 拍/k;p23 = 8.5/2。⇒ **环体三资源在 10 拍/k
//   同时打满,任何一项都不再可压**(本席用一条**独立**的数值实验确认 vpmulld 的 2 µop 是"一石二鸟":
//   它同时给出 a0·b_hi 与 a1·b_lo 两个子积,换成 2 条 vpmuludq 是 2 µop 换 2 µop,**无收益**)。
//   ⇒ 由此**判死**:环体 µop 数(40/k)已是地板,`vpmulld`→`vpmuludq` 类替换为 0 收益。
//   【本发做什么】既然"环体 µop 数"已地板,剩下的唯一问题是**这条价签本身是否成立** ——
//   `ml4cd_`/`ml4d8_` 引用的「1 uop/k = 115 ms」是**推算**(40 uop/k 环体在 4 宽发射下饱和),
//   而本队历史上"消融价 vs 可兑现价"相差过 7×(律 420/431),且 `ml4c7_` 的实测剂量价
//   (+1 nop/步 = +0.42%)比 115 ms 小一个量级。本席设计**一对字节数严格相等的臂**来分离
//   「µop 价」与「字节价」:
//     · A0:母本原样(+0 B/迭代,+0 µop/迭代)
//     · T2:2 字节 nop(66 90)           → +2 B/迭代,**+1 µop/迭代**
//     · D2:2 条 1 字节 nop(90 90)      → +2 B/迭代,**+2 µop/迭代**
//     · T4:4 字节 nop(0f 1f 40 00)     → +4 B/迭代,**+1 µop/迭代**
//     · D4:4 条 1 字节 nop(90×4)       → +4 B/迭代,**+4 µop/迭代**
//   ⇒ **D2−T2 与 D4−T4 的字节增长逐字节相等、只差执行的 µop 数** ⇒ 其读数差 = 「+1 µop/k 的纯价」;
//     **T2−A0 与 T4−A0 的 µop 数相同、只差字节** ⇒ 其读数差 = 「+2/+4 B/迭代 的纯字节价」。
//   全部 nop 插在 `add $16, %[ap]` **之前**(环体末尾、指针自增之前),以保证 `sub $2,%[cnt]` 与
//   `jg 1b` 的宏融合**不被拆开**(否则会多出 1 µop/迭代的伪剂量);母本正文一个语义字节未改。
//   【本次为试验性提交】目的 = **在判题机板面上标定「热环每 k 迭代 1 个 µop」与「每迭代 1 个字节」
//   两个单价**,并据此裁定「1 uop/k = 115 ms」这条在册价签是否成立。本发的臂**不指望改善**读数
//   (nop 是纯剂量);若 D−T 的价 ≈0 而 T−A0 的价 ≠0,则判据变为「环体字节数才是承重项」,
//   价签作废并按字节轴重排后续优先级。
// ======================
// ---- inherited comment head compacted for the 102,400-char judge limit ----
// (seat ml4dn_ keeps every citation-bearing line; the long per-seat prose is kept
//  verbatim in the on-disk master ml4dn_base.cpp and in .cache/subcode/124493.txt)
// [1] duck.ac 用户 saffah_codex_6a_agg3,提交 #122210 <https://duck.ac/submission/122210>
// [2] duck.ac 用户 saffah_cc_v41_agg1(本账号),提交 #117203 <https://duck.ac/submission/117203>
// [3] duck.ac 用户 saffah_codex_6a_agg3,提交 #120448 / #122147 / #122175 / #122193
//     <https://duck.ac/submission/120448> 等:精确内存操作数 / 定长打包器 / 64 级专用驱动器。
//     <https://duck.ac/submission/120448> 等:精确内存操作数 / 定长打包器 / 64 级专用驱动器
// [4] 本账号提交 #124045 <https://duck.ac/submission/124045>(参数搜索席 ml4cc_ 的 Apanel 行距 pad=0 发)
//     与 #124075 <https://duck.ac/submission/124075>(环内审计席 ml4cd_ 的 ×2 展开 + 预取去冗余 发)。
// [5] 本账号提交 #124135 <https://duck.ac/submission/124135>(md5 12df2ff9dbed11255ad35fa40130dfeb)。
// [6] 本账号提交 #124195 <https://duck.ac/submission/124195>(md5 56a5486163e8…)= **本发母本**
// [4] 本账号提交 #124045 <https://duck.ac/submission/124045>(参数搜索席 ml4cc_ 的 **Apanel 行距 pad=0** 发)
//     与 #124075 <https://duck.ac/submission/124075>(环内审计席 ml4cd_ 的 **×2 展开 + 预取去冗余** 发)。
// [5] 本账号提交 #124135 <https://duck.ac/submission/124135>(md5 12df2ff9…)= **本发母本**(当前在役最快件)。
// [3] 本账号提交 #124045 <https://duck.ac/submission/124045>(参数搜索席 ml4cc_ 的 KCP=KC+0 发)。
// [4] 本账号提交 #124075 <https://duck.ac/submission/124075>(环内审计席 ml4cd_ 的 ×2 展开 + 预取去冗余发,
//     <https://duck.ac/submission/120448> 等:精确内存操作数 / 定长打包器 / 64 级专用驱动器 /
// [4] 本账号提交 #124045 <https://duck.ac/submission/124045>(= 本文件母本,md5 ae93ba3b…)。
// [4] 本账号提交 #124001 <https://duck.ac/submission/124001>(= 本文件母本,md5 fc4be9bc…)。
// - saffah_codex_6a_agg3, https://duck.ac/submission/122193: specialized store-only
// - saffah_codex_6a_agg3, https://duck.ac/submission/122175: fixed64 packers,
// - saffah_codex_6a_agg3, https://duck.ac/submission/122147: exact memory operands
// - saffah_codex_6a_agg3, https://duck.ac/submission/120448: complete exact
// - saffah_cc_v41_agg1, https://duck.ac/submission/117203: original engine;
// - saffah_cc_v41_agg1, https://duck.ac/submission/117203: copied the accepted exact modular Strassen implementation, retaining its inherited attributions and license notices.
// [1] duck.ac 用户 saffah_cc_v41_agg1(本账号),提交 #109358 <https://duck.ac/submission/109358>
#include <immintrin.h>

/* Single-instruction 256-bit unaligned access, NO alignment precondition.
   g++-9 -O2 with no -march expands the unaligned 256-bit intrinsics into 2-3 uops, one
   of them a p5-only vinsertf128/vextractf128; these emit the single instruction the
   intrinsic is named for.  AT&T order is `vmovdqu src,dst`: the STORE is %0,%1 (ymm
   first, memory second).  A REVERSED store operand silently emits a LOAD instead --
   that is how this was first written and it produced wrong output with no diagnostic.
   volatile + "memory" is REQUIRED: a non-volatile asm with only an "m" input is pure
   and gets eliminated. */
#define LDQ(p) ({ __m256i v; __asm__("vmovdqu %1,%0" : "=x"(v) : "m"(*(const __m256i *)(p))); v; })
#define STQ(p,v) __asm__ volatile("vmovdqu %1,%0" : "=m"(*(__m256i*)(p)) : "x"(v))
#include <stddef.h>
#include <stdint.h>
#include <sys/mman.h>
#pragma GCC optimize("O3","unroll-loops")
#pragma GCC push_options
#pragma GCC target("avx2")

typedef long long TE;

#define MR (6)  /* [ml4cg_] 同场锚:纯拼写,零语义/零机器码改动 */
#define KC 256
#define MC 6
#define NC 1024
#define UU 1

/* [ml4cw_] 本族 = 只动 leaf64 的 ic 瓦片次序;wg_combine 与在役逐字节相同。 */

/* ===================== [ml4cw_] 访问次序旋钮(本席唯一自变量) =====================
   两个 `static volatile` 数组(.data 静态初值)承载次序选择:
     ml4cz_ic1wN152p[0] : leaf64 ic 瓦片序 0=正 1=逆      ml4cz_ic1wN152p[1] : 4 行尾瓦片 0=后 1=前
   且 volatile 语义下编译器必须逐次取真值 ⇒ 各臂 .text 逐字节相同(唯一差异 = .data 初值)。
   ★方向**不进循环体**:只用「增量寄存器 + 终止值」表达 ⇒ 与在役的立即数增量同为 1 条
   add / 1 条 cmp,内环 uop 数不变(本族零指令代价)。 */
static volatile int ml4cz_ic1wN152p[3] = {0, 1, -1};
/* =================== [ml4cw_] 旋钮结束 =================== */

#define CUTL 256

/* A-panel row stride PADDED by 8 uint64 (64 B).  With the natural stride KC*8 = 4096 B
   every one of the 6 rows of a micro-tile maps to the SAME L1 set (4096/64 = 64 sets
   apart, 64 sets in the cache) -- a textbook conflict.  +8 uint64 makes the stride
   4160 B = 65 lines, so consecutive rows land in consecutive sets. */
#define KCP (KC + 0)  /* [ml4cc_] */
static TE Apanel[(size_t)MC * KCP + 64] __attribute__((aligned(8192)));  // [x14f-D4]
static TE Bpanel[(size_t)2 * (NC / 4 + 1) * KC * 8 + 64] __attribute__((aligned(2097152)));

/* op: 0 = store, 1 = add, 2 = sub;  c2 may be 0 (single destination) */
static inline void mikro(long cnt, const long long *ap, const long long *bp,
                        long long *c1, int ldc1, int op1,
                        long long *c2, int ldc2, int op2, int rows) {
  register __m256i v0 asm("ymm0");
  register __m256i v1 asm("ymm1");
  register __m256i v2 asm("ymm2");
  register __m256i v3 asm("ymm3");
  register __m256i v4 asm("ymm4");
  register __m256i v5 asm("ymm5");
  register __m256i v6 asm("ymm6");
  register __m256i v7 asm("ymm7");
  register __m256i v8 asm("ymm8");
  register __m256i v9 asm("ymm9");
  register __m256i v10 asm("ymm10");
  register __m256i v11 asm("ymm11");
  if (rows == 4) {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm4\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm6\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm7\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "test $1, %[cnt]\n\t"
        "jz 3f\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "3:\n\t"
        "1:\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "vmovdqu 36(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 8(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2056(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4104(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6152(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 64(%[bp]), %%ymm12\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "add $16, %[ap]\n\t"
        "add $64, %[bp]\n\t"
        "sub $2, %[cnt]\n\t"
        "jg 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3), [v4] "=x"(v4), [v5] "=x"(v5), [v6] "=x"(v6), [v7] "=x"(v7)
    :
    : "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  } else
  if (rows == 2) {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "1:\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jnz 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3)
    :
    : "ymm4", "ymm5", "ymm6", "ymm7",
      "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  }   else {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm4\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm6\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm8\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm10\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm11\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "test $1, %[cnt]\n\t"
        "jz 3f\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "3:\n\t"
        "1:\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "vmovdqu 36(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 8(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2056(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4104(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6152(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8200(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10248(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 64(%[bp]), %%ymm12\n\t"
        "add $16, %[ap]\n\t"
        "add $64, %[bp]\n\t"
        "sub $2, %[cnt]\n\t"
        "jg 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3), [v4] "=x"(v4), [v5] "=x"(v5), [v6] "=x"(v6), [v7] "=x"(v7), [v8] "=x"(v8), [v9] "=x"(v9), [v10] "=x"(v10), [v11] "=x"(v11)
    :
    : "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  }

  if (rows > 0) {
    __m256i lo = v0, hi = v1;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)0 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)0 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 1) {
    __m256i lo = v2, hi = v3;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)1 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)1 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 2) {
    __m256i lo = v4, hi = v5;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)2 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)2 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 3) {
    __m256i lo = v6, hi = v7;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)3 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)3 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 4) {
    __m256i lo = v8, hi = v9;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)4 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)4 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 5) {
    __m256i lo = v10, hi = v11;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)5 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)5 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
}
static __attribute__((always_inline)) inline void mikro_i(long cnt, const long long *ap, const long long *bp,
                        long long *c1, int ldc1, int op1,
                        long long *c2, int ldc2, int op2, int rows) {
  register __m256i v0 asm("ymm0");
  register __m256i v1 asm("ymm1");
  register __m256i v2 asm("ymm2");
  register __m256i v3 asm("ymm3");
  register __m256i v4 asm("ymm4");
  register __m256i v5 asm("ymm5");
  register __m256i v6 asm("ymm6");
  register __m256i v7 asm("ymm7");
  register __m256i v8 asm("ymm8");
  register __m256i v9 asm("ymm9");
  register __m256i v10 asm("ymm10");
  register __m256i v11 asm("ymm11");
  if (rows == 4) {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm4\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm6\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm7\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "test $1, %[cnt]\n\t"
        "jz 3f\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "3:\n\t"
        "1:\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "vmovdqu 36(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 8(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2056(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4104(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6152(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vmovdqu 64(%[bp]), %%ymm12\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "add $16, %[ap]\n\t"
        "add $64, %[bp]\n\t"
        "sub $2, %[cnt]\n\t"
        "jg 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3), [v4] "=x"(v4), [v5] "=x"(v5), [v6] "=x"(v6), [v7] "=x"(v7)
    :
    : "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  } else
  if (rows == 2) {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "1:\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jnz 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3)
    :
    : "ymm4", "ymm5", "ymm6", "ymm7",
      "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  }   else {
  __asm__ volatile(
        "test %[cnt], %[cnt]\n\t"
        "jle 2f\n\t"
        "vmovdqu 0(%[bp]), %%ymm12\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm0\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm2\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm4\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm6\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm8\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm10\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm11\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "test $1, %[cnt]\n\t"
        "jz 3f\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "add $8, %[ap]\n\t"
        "add $32, %[bp]\n\t"
        "dec %[cnt]\n\t"
        "jle 2f\n\t"
        "3:\n\t"
        "1:\n\t"
        "vmovdqu 4(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 0(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2048(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4096(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6144(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8192(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10240(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "vmovdqu 32(%[bp]), %%ymm12\n\t"
        "vmovdqu 36(%[bp]), %%ymm13\n\t"
        "vbroadcastsd 8(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm0, %%ymm0\n\t"
        "vpaddd %%ymm14, %%ymm1, %%ymm1\n\t"
        "vbroadcastsd 2056(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm2, %%ymm2\n\t"
        "vpaddd %%ymm14, %%ymm3, %%ymm3\n\t"
        "vbroadcastsd 4104(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm4, %%ymm4\n\t"
        "vpaddd %%ymm14, %%ymm5, %%ymm5\n\t"
        "vbroadcastsd 6152(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm6, %%ymm6\n\t"
        "vpaddd %%ymm14, %%ymm7, %%ymm7\n\t"
        "vbroadcastsd 8200(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm8, %%ymm8\n\t"
        "vpaddd %%ymm14, %%ymm9, %%ymm9\n\t"
        "vbroadcastsd 10248(%[ap]), %%ymm14\n\t"
        "vpmuludq %%ymm14, %%ymm13, %%ymm15\n\t"
        "vpmulld %%ymm12, %%ymm14, %%ymm14\n\t"
        "vpaddq %%ymm15, %%ymm10, %%ymm10\n\t"
        "vpaddd %%ymm14, %%ymm11, %%ymm11\n\t"
        "prefetcht0 256(%[bp])\n\t"
        "vmovdqu 64(%[bp]), %%ymm12\n\t"
        "nop\n\t"
        "nop\n\t"
        "nop\n\t"
        "nop\n\t"
        "add $16, %[ap]\n\t"
        "add $64, %[bp]\n\t"
        "sub $2, %[cnt]\n\t"
        "jg 1b\n\t"
        "2:\n\t"
    ""
    : [ap] "+r"(ap), [bp] "+r"(bp), [cnt] "+r"(cnt), [v0] "=x"(v0), [v1] "=x"(v1), [v2] "=x"(v2), [v3] "=x"(v3), [v4] "=x"(v4), [v5] "=x"(v5), [v6] "=x"(v6), [v7] "=x"(v7), [v8] "=x"(v8), [v9] "=x"(v9), [v10] "=x"(v10), [v11] "=x"(v11)
    :
    : "ymm12", "ymm13", "ymm14", "ymm15", "cc", "memory");
  }

  if (rows > 0) {
    __m256i lo = v0, hi = v1;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)0 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)0 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 1) {
    __m256i lo = v2, hi = v3;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)1 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)1 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 2) {
    __m256i lo = v4, hi = v5;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)2 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)2 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 3) {
    __m256i lo = v6, hi = v7;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)3 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)3 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 4) {
    __m256i lo = v8, hi = v9;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)4 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)4 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
  if (rows > 5) {
    __m256i lo = v10, hi = v11;
    __m256i y = _mm256_add_epi32(hi, _mm256_srli_epi64(hi, 32));
    __m256i res = _mm256_add_epi64(lo, _mm256_slli_epi64(y, 32));
    long long *cp = c1 + (size_t)5 * ldc1;
    if (op1 == 0) STQ((__m256i *)cp, res);
    else if (op1 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
    else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res));
    if (c2) { cp = c2 + (size_t)5 * ldc2;
      if (op2 == 0) STQ((__m256i *)cp, res);
      else if (op2 == 1) STQ((__m256i *)cp, _mm256_add_epi64(LDQ((const __m256i *)cp), res));
      else STQ((__m256i *)cp, _mm256_sub_epi64(LDQ((const __m256i *)cp), res)); } }
}

struct Opd {                 /* value(i,j) = sum_t s[t]*p[(r[t]+i)*ld + c[t]+j]  (nt <= 4) */
  const long long *p; int ld; int nt; int r[4], c[4], s[4];
};
static inline Opd oq(const Opd *o, int qi, int qj, int h) {
  Opd d = *o;
  for (int t = 0; t < o->nt; t++) { d.r[t] += qi * h; d.c[t] += qj * h; }
  return d;
}
static inline Opd oadd(const Opd *a, const Opd *b, int sgn) {
  Opd d = *a;
  for (int t = 0; t < b->nt; t++) { d.r[d.nt] = b->r[t]; d.c[d.nt] = b->c[t]; d.s[d.nt] = b->s[t] < 0 ? -sgn : sgn; d.nt++; }
  return d;
}
static inline Opd o1(const long long *p, int ld) {
  Opd d; d.p = p; d.ld = ld; d.nt = 1; d.r[0] = 0; d.c[0] = 0; d.s[0] = 1; return d;
}

/* A panel: rows [ic, ic+mc), k in [pc, pc+kc) of the operand */
static void packA_general(const Opd *o, int ic, int mc, int pc, int kc) {
  const int nt = o->nt;
  const long long *P = o->p; const int ld = o->ld;
  for (int r = 0; r < MC; r++) {
    long long *p = (Apanel + 8) + (size_t)r * KCP; /* [ml4cg_] */
    int k = 0;
    if (r < mc) {
      const long long *s0 = P + (size_t)(o->r[0] + ic + r) * ld + o->c[0] + pc;
      if (nt == 1 || nt == 2) {
        const long long *s1 = (nt == 2) ? P + (size_t)(o->r[1] + ic + r) * ld + o->c[1] + pc : 0;
        int sgn1 = (nt == 2) ? o->s[1] : 1;
        for (; k + 4 <= kc; k += 4) {
          __m256i v = LDQ((const __m256i *)(s0 + k));
          if (nt == 2) {
            __m256i w = LDQ((const __m256i *)(s1 + k));
            v = (sgn1 > 0) ? _mm256_add_epi64(v, w) : _mm256_sub_epi64(v, w);
          }
        STQ((__m256i *)p, v);
        p += 4;
        }
        for (; k < kc; k++) { long long v = s0[k];
          if (nt == 2) v = (sgn1 > 0) ? v + s1[k] : v - s1[k];
          *p++ = (v); }
      } else {
        for (; k + 4 <= kc; k += 4) {
          __m256i v = _mm256_setzero_si256();
          for (int t = 0; t < nt; t++) {
            __m256i w = LDQ((const __m256i *)(P + (size_t)(o->r[t] + ic + r) * ld + o->c[t] + pc + k));
            v = (o->s[t] < 0) ? _mm256_sub_epi64(v, w) : _mm256_add_epi64(v, w);
          }
          STQ((__m256i *)p, v);
          p += 4;
        }
        for (; k < kc; k++) {
          long long v = 0;
          for (int t = 0; t < nt; t++)
            v += o->s[t] < 0 ? -P[(size_t)(o->r[t] + ic + r) * ld + o->c[t] + pc + k]
                             :  P[(size_t)(o->r[t] + ic + r) * ld + o->c[t] + pc + k];
          *p++ = (v);
        }
      }
    }
    p += KC - k;   /* k >= kc is never read: mikro runs kc steps */
  }
}

static void packB_general(const Opd *o, int jc, int nc, int pc, int kc) {
  const int nt = o->nt;
  const long long *P = o->p; const int ld = o->ld;
  const int jbn = (nc + 3) & ~3;   /* mikro reads only jg < nc, step 4 */
  int jb = 0;
  /* ---- 8-column pass: the two 4-column groups jb and jb+4 share ONE 64-byte
     source line (the row stride is ld*8 bytes, so a 4-column load uses exactly
     half a line).  The 4-column loop walks all kc rows before returning to the
     neighbouring group, i.e. after kc strided accesses, so that line is long
     evicted and gets fetched a second time.  Taking both groups in one pass
     reads a full line per row per visit: source line fetches are halved.
     Panel layout is byte-identical (group jb sits at (jb/4)*KC). ---- */
  for (; jb + 16 <= nc; jb += 16) {
    long long *q0 = Bpanel + (size_t)(jb / 4) * kc * 4;
    long long *q1 = q0 + (size_t)kc * 4;
    long long *q2 = q1 + (size_t)kc * 4;
    long long *q3 = q2 + (size_t)kc * 4;
    if (nt <= 2) {
      const long long *s0 = P + (size_t)o->r[0] * ld + o->c[0] + jc + jb;
      const long long *s1 = (nt == 2) ? P + (size_t)o->r[1] * ld + o->c[1] + jc + jb : 0;
      const int sg1 = (nt == 2) ? o->s[1] : 1;
      for (int k = 0; k < kc; k++) {
        const long long *r0 = s0 + (size_t)(pc + k) * ld;
        __m256i v0 = LDQ((const __m256i *)(r0));
        __m256i v1 = LDQ((const __m256i *)(r0 + 4));
        __m256i v2 = LDQ((const __m256i *)(r0 + 8));
        __m256i v3 = LDQ((const __m256i *)(r0 + 12));
        if (nt == 2) {
          const long long *r1 = s1 + (size_t)(pc + k) * ld;
          __m256i w0 = LDQ((const __m256i *)(r1));
          __m256i w1 = LDQ((const __m256i *)(r1 + 4));
          __m256i w2 = LDQ((const __m256i *)(r1 + 8));
          __m256i w3 = LDQ((const __m256i *)(r1 + 12));
          if (sg1 > 0) { v0 = _mm256_add_epi64(v0, w0); v1 = _mm256_add_epi64(v1, w1);
                       v2 = _mm256_add_epi64(v2, w2); v3 = _mm256_add_epi64(v3, w3); }
          else         { v0 = _mm256_sub_epi64(v0, w0); v1 = _mm256_sub_epi64(v1, w1);
                       v2 = _mm256_sub_epi64(v2, w2); v3 = _mm256_sub_epi64(v3, w3); }
        }
        _mm256_store_si256((__m256i *)(q0 + (size_t)k * 4), _mm256_shuffle_epi32(v0, 0xB1));
        _mm256_store_si256((__m256i *)(q1 + (size_t)k * 4), _mm256_shuffle_epi32(v1, 0xB1));
        _mm256_store_si256((__m256i *)(q2 + (size_t)k * 4), _mm256_shuffle_epi32(v2, 0xB1));
        _mm256_store_si256((__m256i *)(q3 + (size_t)k * 4), _mm256_shuffle_epi32(v3, 0xB1));
      }
    } else {
      for (int k = 0; k < kc; k++) {
        __m256i v0 = _mm256_setzero_si256(), v1 = _mm256_setzero_si256();
        __m256i v2 = _mm256_setzero_si256(), v3 = _mm256_setzero_si256();
        for (int tt = 0; tt < nt; tt++) {
          const long long *r0 = P + (size_t)(o->r[tt] + pc + k) * ld + o->c[tt] + jc + jb;
          __m256i w0 = LDQ((const __m256i *)r0);
          __m256i w1 = LDQ((const __m256i *)(r0 + 4));
          __m256i w2 = LDQ((const __m256i *)(r0 + 8));
          __m256i w3 = LDQ((const __m256i *)(r0 + 12));
          if (o->s[tt] < 0) { v0 = _mm256_sub_epi64(v0, w0); v1 = _mm256_sub_epi64(v1, w1);
                               v2 = _mm256_sub_epi64(v2, w2); v3 = _mm256_sub_epi64(v3, w3); }
          else              { v0 = _mm256_add_epi64(v0, w0); v1 = _mm256_add_epi64(v1, w1);
                               v2 = _mm256_add_epi64(v2, w2); v3 = _mm256_add_epi64(v3, w3); }
        }
        _mm256_store_si256((__m256i *)(q0 + (size_t)k * 4), _mm256_shuffle_epi32(v0, 0xB1));
        _mm256_store_si256((__m256i *)(q1 + (size_t)k * 4), _mm256_shuffle_epi32(v1, 0xB1));
        _mm256_store_si256((__m256i *)(q2 + (size_t)k * 4), _mm256_shuffle_epi32(v2, 0xB1));
        _mm256_store_si256((__m256i *)(q3 + (size_t)k * 4), _mm256_shuffle_epi32(v3, 0xB1));
      }
    }
  }
  for (; jb < jbn; jb += 4) {
    long long *q = Bpanel + (size_t)(jb / 4) * kc * 4;
    int full = (jb + 4 <= nc);
    int lim = nc - jb; if (lim > 4) lim = 4; if (lim < 0) lim = 0;
    const long long *sq = P + (size_t)o->r[0] * ld + o->c[0] + jc + jb;
    const long long *sq1 = (nt >= 2) ? P + (size_t)o->r[1] * ld + o->c[1] + jc + jb : 0;
    if (full && nt <= 2) {
      for (int k = 0; k < kc; k++) {
        __m256i v = LDQ((const __m256i *)(sq + (size_t)(pc + k) * ld));
        if (nt == 2) {
          __m256i w = LDQ((const __m256i *)(sq1 + (size_t)(pc + k) * ld));
          v = (o->s[1] > 0) ? _mm256_add_epi64(v, w) : _mm256_sub_epi64(v, w);
        }
        _mm256_store_si256((__m256i *)(q + (size_t)k * 4), _mm256_shuffle_epi32(v, 0xB1));
      }
    } else if (full) {
      for (int k = 0; k < kc; k++) {
        __m256i v = _mm256_setzero_si256();
        for (int tt = 0; tt < nt; tt++) {
          __m256i w = LDQ((const __m256i *)(P + (size_t)(o->r[tt] + pc + k) * ld + o->c[tt] + jc + jb));
          v = (o->s[tt] < 0) ? _mm256_sub_epi64(v, w) : _mm256_add_epi64(v, w);
        }
        _mm256_store_si256((__m256i *)(q + (size_t)k * 4), _mm256_shuffle_epi32(v, 0xB1));
      }
    } else {
      for (int k = 0; k < KC; k++) {
        long long t[4] = {0, 0, 0, 0};
        if (k < kc) {
          int ncol = full ? 4 : lim;
          for (int c = 0; c < ncol; c++) {
            long long v = 0;
            for (int tt = 0; tt < nt; tt++)
              v += o->s[tt] < 0 ? -P[(size_t)(o->r[tt] + pc + k) * ld + o->c[tt] + jc + jb + c]
                                :  P[(size_t)(o->r[tt] + pc + k) * ld + o->c[tt] + jc + jb + c];
            t[c] = v;
          }
        }
        __m256i v = LDQ((const __m256i *)t);
        _mm256_store_si256((__m256i *)(q + (size_t)k * 4), _mm256_shuffle_epi32(v, 0xB1));
      }
    }
  }
}


template<int Sign>
static __attribute__((always_inline)) inline void packA_fixed64(const long long*s0,const long long*s1,int ld,int mc){
 long long*d=(Apanel + 8); /* [ml4cg_] */
 for(int r=0;r<mc;r++){
  #pragma GCC unroll 4
  for(int k=0;k<64;k+=4){
   __m256i v=LDQ((const __m256i*)(s0+k));
   if constexpr(Sign) { __m256i w=LDQ((const __m256i*)(s1+k));v=Sign>0?_mm256_add_epi64(v,w):_mm256_sub_epi64(v,w); }
   STQ((__m256i*)(d+k),v);
  }
  s0+=ld;if constexpr(Sign)s1+=ld;d+=KCP;
 }
}
static void packA(const Opd*o,int ic,int mc,int pc,int kc){
 if(kc==64 && pc==0 && o->nt<=2){
  const long long*s0=o->p+(size_t)(o->r[0]+ic)*o->ld+o->c[0];
  if(o->nt==1)packA_fixed64<0>(s0,nullptr,o->ld,mc);
  else {const long long*s1=o->p+(size_t)(o->r[1]+ic)*o->ld+o->c[1];
   if(o->s[1]>0)packA_fixed64<1>(s0,s1,o->ld,mc);else packA_fixed64<-1>(s0,s1,o->ld,mc);}
  return;
 }
 packA_general(o,ic,mc,pc,kc);
}
/* [ml4cy_] 本函数 = 在役 `packB_fixed64` 正文的**直接式(无旋钮)改写**,唯一改动 = 内层 k 环
   ×1 -> ×2 且**四个相距 2048 B 的写流由「32 B 交错」改成「按象限 64 B 连续突发」**
   (q0+0,q0+4 -> q1+0,q1+4 -> q2 -> q3)。值、地址、算式一字不改,只有**写入次序**不同。
   注:第一发以运行期旋钮形态量到本改动 **−5.39 ms**(pd1 5236.916 vs pd0 5242.305,相邻 47 s);
   本件去掉旋钮与二选一分支 ⇒ 去掉族固有代价 +8.2 ms 后,真效应应留下。 */
template<int Sign>
static __attribute__((noinline)) void packB_fixed64(const long long*s0,const long long*s1,int ld){
 for(int jb=0;jb<64;jb+=16){
  long long*q0=Bpanel+(jb/4)*64*4,*q1=q0+256,*q2=q1+256,*q3=q2+256;
  const long long*r0=s0+jb,*r1=s1;
  if constexpr(Sign)r1+=jb;
  #pragma GCC unroll 1
  for(int k=0;k<64;k+=2){
    __m256i t0,t1,t2,t3,t4,t5,t6,t7;
    {
     __m256i v0=LDQ((const __m256i*)r0),v1=LDQ((const __m256i*)(r0+4)),v2=LDQ((const __m256i*)(r0+8)),v3=LDQ((const __m256i*)(r0+12));
     if constexpr(Sign){
      __m256i w0=LDQ((const __m256i*)r1),w1=LDQ((const __m256i*)(r1+4)),w2=LDQ((const __m256i*)(r1+8)),w3=LDQ((const __m256i*)(r1+12));
      if constexpr(Sign>0){v0=_mm256_add_epi64(v0,w0);v1=_mm256_add_epi64(v1,w1);v2=_mm256_add_epi64(v2,w2);v3=_mm256_add_epi64(v3,w3);}
      else {v0=_mm256_sub_epi64(v0,w0);v1=_mm256_sub_epi64(v1,w1);v2=_mm256_sub_epi64(v2,w2);v3=_mm256_sub_epi64(v3,w3);}
     }
     t0=_mm256_shuffle_epi32(v0,0xB1);t1=_mm256_shuffle_epi32(v1,0xB1);
     t2=_mm256_shuffle_epi32(v2,0xB1);t3=_mm256_shuffle_epi32(v3,0xB1);
    }
    {
     const long long*r2=r0+ld,*r3=r1; if constexpr(Sign) r3+=ld;
     __m256i v0=LDQ((const __m256i*)r2),v1=LDQ((const __m256i*)(r2+4)),v2=LDQ((const __m256i*)(r2+8)),v3=LDQ((const __m256i*)(r2+12));
     if constexpr(Sign){
      __m256i w0=LDQ((const __m256i*)r3),w1=LDQ((const __m256i*)(r3+4)),w2=LDQ((const __m256i*)(r3+8)),w3=LDQ((const __m256i*)(r3+12));
      if constexpr(Sign>0){v0=_mm256_add_epi64(v0,w0);v1=_mm256_add_epi64(v1,w1);v2=_mm256_add_epi64(v2,w2);v3=_mm256_add_epi64(v3,w3);}
      else {v0=_mm256_sub_epi64(v0,w0);v1=_mm256_sub_epi64(v1,w1);v2=_mm256_sub_epi64(v2,w2);v3=_mm256_sub_epi64(v3,w3);}
     }
     t4=_mm256_shuffle_epi32(v0,0xB1);t5=_mm256_shuffle_epi32(v1,0xB1);
     t6=_mm256_shuffle_epi32(v2,0xB1);t7=_mm256_shuffle_epi32(v3,0xB1);
    }
    _mm256_store_si256((__m256i*)q0,t0);_mm256_store_si256((__m256i*)(q0+4),t4);
    _mm256_store_si256((__m256i*)q1,t1);_mm256_store_si256((__m256i*)(q1+4),t5);
    _mm256_store_si256((__m256i*)q2,t2);_mm256_store_si256((__m256i*)(q2+4),t6);
    _mm256_store_si256((__m256i*)q3,t3);_mm256_store_si256((__m256i*)(q3+4),t7);
    q0+=8;q1+=8;q2+=8;q3+=8;r0+=(size_t)2*ld;if constexpr(Sign)r1+=(size_t)2*ld;
  }
 }
}
static void packB(const Opd*o,int jc,int nc,int pc,int kc){
 if(kc==64 && nc==64 && pc==0 && o->nt<=2){
  const long long*s0=o->p+(size_t)o->r[0]*o->ld+o->c[0]+jc;
  if(o->nt==1)packB_fixed64<0>(s0,nullptr,o->ld);
  else {const long long*s1=o->p+(size_t)o->r[1]*o->ld+o->c[1]+jc;
   if(o->s[1]>0)packB_fixed64<1>(s0,s1,o->ld);else packB_fixed64<-1>(s0,s1,o->ld);}
  return;
 }
 packB_general(o,jc,nc,pc,kc);
}
static inline int effop(int base, int term) {   /* term: 1 = +M, 2 = -M ; result: 0 store 1 add 2 sub */
  if (base == 0) return term == 1 ? 0 : 2;
  if (base == 1) return term == 2 ? 2 : 1;
  return term == 2 ? 1 : 2;
}

/* C1 op1 (+- second destination C2 op2, either may be absent) = Ao * Bo, block size n */
static __attribute__((always_inline)) inline void leaf(int n, const Opd *Ao, const Opd *Bo,
                 long long *C1, int ldc1, int op1, long long *C2, int ldc2, int op2) {
  int nb4 = n - (n & 3);
  for (int jc = 0; jc < nb4; jc += NC) {
    int nc = (nb4 - jc < NC) ? (nb4 - jc) : NC;
    for (int pc = 0; pc < n; pc += KC) {
      int kc = (n - pc < KC) ? (n - pc) : KC;
      packB(Bo, jc, nc, pc, kc);
      int e1 = (pc == 0) ? op1 : (op1 == 2 ? 2 : 1);
      int e2 = (pc == 0) ? op2 : (op2 == 2 ? 2 : 1);
      for (int ic = 0; ic < n; ic += MC) {
        int mc = (n - ic < MC) ? (n - ic) : MC;
        packA(Ao, ic, mc, pc, kc);
        for (int ir = 0; ir < mc; ir += MR) {
          int rows = (mc - ir < MR) ? (mc - ir) : MR;
          const long long *ap = (Apanel + 8) + (size_t)ir * KCP * 1; /* [ml4cg_] */
          for (int jg = 0; jg < nc; jg += 4) {
            const long long *bp = Bpanel + (size_t)(jg / 4) * kc * 4;
            mikro(kc / UU, ap, bp, C1 + (size_t)(ic + ir) * ldc1 + jc + jg, ldc1, e1,
                  C2 ? C2 + (size_t)(ic + ir) * ldc2 + jc + jg : 0, ldc2, e2, rows);
          }
        }
      }
    }
  }
  for (int j = nb4; j < n; j++)
    for (int i = 0; i < n; i++) {
      unsigned long long acc = 0;
      for (int k = 0; k < n; k++) {
        long long av = 0, bv = 0;
        for (int t = 0; t < Ao->nt; t++)
          av += Ao->s[t] < 0 ? -Ao->p[(size_t)(Ao->r[t] + i) * Ao->ld + Ao->c[t] + k]
                             :  Ao->p[(size_t)(Ao->r[t] + i) * Ao->ld + Ao->c[t] + k];
        for (int t = 0; t < Bo->nt; t++)
          bv += Bo->s[t] < 0 ? -Bo->p[(size_t)(Bo->r[t] + k) * Bo->ld + Bo->c[t] + j]
                             :  Bo->p[(size_t)(Bo->r[t] + k) * Bo->ld + Bo->c[t] + j];
        acc += (unsigned long long)av * (unsigned long long)bv;
      }
      long long *cp = C1 + (size_t)i * ldc1 + j;
      if (op1 == 0) *cp = (long long)acc;
      else if (op1 == 1) *cp += (long long)acc;
      else *cp -= (long long)acc;
      if (C2) {
        long long *cq = C2 + (size_t)i * ldc2 + j;
        if (op2 == 0) *cq = (long long)acc;
        else if (op2 == 1) *cq += (long long)acc;
        else *cq -= (long long)acc;
      }
    }
}

template<int ASign>
static __attribute__((noinline)) void leaf64_by_sign(const Opd*ao,const Opd*bo,long long*c,int ldc){
 const long long *a0=ao->p+(size_t)ao->r[0]*ao->ld+ao->c[0];
 const long long *a1=ao->nt==2?ao->p+(size_t)ao->r[1]*ao->ld+ao->c[1]:a0;
 const long long *b0=bo->p+(size_t)bo->r[0]*bo->ld+bo->c[0];
 const long long *b1=bo->nt==2?bo->p+(size_t)bo->r[1]*bo->ld+bo->c[1]:b0;
 if(bo->nt==1)packB_fixed64<0>(b0,b1,bo->ld);
 else if(bo->s[1]>0)packB_fixed64<1>(b0,b1,bo->ld);else packB_fixed64<-1>(b0,b1,bo->ld);
 /* [ml4cw_] 本 11 瓦片循环 = 在役正文逐字节拷贝,**唯一改动 = 瓦片拜访次序由运行期
    旋钮给出**(`ic += id` / 尾瓦片前/后)。packA→mikro 的 WAR 依赖链(Apanel)不变 ⇒ 每瓦片
    仍是「打包-消费」串行对;改的只是 11 对的**先后**(C 写流序 / A 读流序 / 生产者-消费者
    重近性)。11! 只取 4 个有结构理由者(正/逆 × 尾瓦片前/后)。 */
 {
  const int id = ml4cz_ic1wN152p[0] ? -6 : 6;
  const int icend = id > 0 ? 60 : -6;
  if (ml4cz_ic1wN152p[1]) {
   packA_fixed64<ASign>(a0+(size_t)60*ao->ld,a1+(size_t)60*ao->ld,ao->ld,4);
   for(int j=0;j<64;j+=4) mikro_i(64,(Apanel + 8),Bpanel+(size_t)j*64,c+(size_t)60*ldc+j,ldc,0,nullptr,0,0,4);
  }
  for(int ic = id > 0 ? 0 : 54; ic != icend; ic += id){
   packA_fixed64<ASign>(a0+(size_t)ic*ao->ld,a1+(size_t)ic*ao->ld,ao->ld,6);
   if(ASign==0) __asm__ volatile(".space 16,0x90"); for(int j=0;j<64;j+=4) mikro_i(64,(Apanel + 8),Bpanel+(size_t)j*64,c+(size_t)ic*ldc+j,ldc,0,nullptr,0,0,6);
  }
  if (!ml4cz_ic1wN152p[1]) {
   packA_fixed64<ASign>(a0+(size_t)60*ao->ld,a1+(size_t)60*ao->ld,ao->ld,4);
   for(int j=0;j<64;j+=4) mikro_i(64,(Apanel + 8),Bpanel+(size_t)j*64,c+(size_t)60*ldc+j,ldc,0,nullptr,0,0,4);
  }
 }
}

static void fixed_leaf64_product(const Opd*ao,const Opd*bo,long long*c,int ldc){
 if(ao->nt==1)leaf64_by_sign<0>(ao,bo,c,ldc);
 else if(ao->s[1]>0)leaf64_by_sign<1>(ao,bo,c,ldc);
 else leaf64_by_sign<-1>(ao,bo,c,ldc);
}

/* recursive Strassen: C1 op1 op= Ao*Bo  and  C2 op2 op= Ao*Bo */
/* Scratch: one h*h product block per recursion level, carved from the tail of the
   buffer.  Only the levels that actually recurse consume space, so a walk of the
   recursion computes exactly the bytes matrix_multiply() hands us below. */
static long long g_scratch[6u * 1024u * 1024u] __attribute__((aligned(2097152)));

/* dst op= sign * T   (op: 0 store, 1 add, 2 sub) */
static void cmb(long long *dst, int ldd, const long long *T, int ldt, int h, int sign, int op) {
  __m256i sgn = _mm256_set1_epi64x(sign < 0 ? -1 : 0);
  for (int i = 0; i < h; i++) {
    const long long *t = T + (size_t)i * ldt;
    long long *c = dst + (size_t)i * ldd;
    int j = 0;
    if (op == 0) {
      for (; j + 4 <= h; j += 4) {
        __m256i v = LDQ((const __m256i *)(t + j));
        if (sign < 0) v = _mm256_sub_epi64(_mm256_setzero_si256(), v);
        STQ((__m256i *)(c + j), v);
      }
      for (; j < h; j++) c[j] = sign < 0 ? -t[j] : t[j];
    } else {
      for (; j + 4 <= h; j += 4) {
        __m256i v = LDQ((const __m256i *)(t + j));
        __m256i w = LDQ((const __m256i *)(c + j));
        if ((op == 1) != (sign < 0)) STQ((__m256i *)(c + j), _mm256_add_epi64(w, v));
        else                         STQ((__m256i *)(c + j), _mm256_sub_epi64(w, v));
      }
      for (; j < h; j++) { if ((op == 1) != (sign < 0)) c[j] += t[j]; else c[j] -= t[j]; }
    }
  }
}

/* Reuse one pair of temporary 1024-square operands across depth-first leaves. */
static long long material_A[1024u * 1024u] __attribute__((aligned(2097152)));
static long long material_B[1024u * 1024u] __attribute__((aligned(2097152)));
/* 512 级物化的目的地:必须与 material_A/B 分开 —— 1024 级钩子的递归仍在读 material_A/B。 */
static long long material_C[512u * 512u] __attribute__((aligned(2097152)));
static long long material_D[512u * 512u] __attribute__((aligned(2097152)));
static void materializeN(const Opd *o, long long *dst, const int n) {
  for (int i = 0; i < n; i++) {
    long long *out = dst + (size_t)i * n;
    int j = 0;
    for (; j + 4 <= n; j += 4) {
      __m256i value = _mm256_setzero_si256();
      for (int t = 0; t < o->nt; t++) {
        const long long *src = o->p + (size_t)(o->r[t] + i) * o->ld + o->c[t] + j;
        __m256i part = LDQ((const __m256i *)src);
        value = o->s[t] < 0 ? _mm256_sub_epi64(value, part) : _mm256_add_epi64(value, part);
      }
      STQ((__m256i *)(out + j), value);
    }
    for (; j < n; j++) {
      unsigned long long value = 0;
      for (int t = 0; t < o->nt; t++) {
        unsigned long long part = (unsigned long long)o->p[(size_t)(o->r[t] + i) * o->ld + o->c[t] + j];
        value = o->s[t] < 0 ? value - part : value + part;
      }
      out[j] = (long long)value;
    }
  }
}

/* single-destination recursive Strassen: d op= Ao*Bo, with T a scratch block of h*h */
static void mmxR(int n, const Opd *Ao, const Opd *Bo, long long *d, int ld, int op,
                 long long *T) {
  if (n == 1024 && (Ao->nt > 1 || Bo->nt > 1)) {
    Opd am, bm; const Opd *a = Ao, *b = Bo;
    if (Ao->nt > 1) { materializeN(Ao, material_A, 1024); am = o1(material_A, n); a = &am; }
    if (Bo->nt > 1) { materializeN(Bo, material_B, 1024); bm = o1(material_B, n); b = &bm; }
    mmxR(n, a, b, d, ld, op, T);
    return;
  }
  if (n <= CUTL || (n & 1) || Ao->nt > 2 || Bo->nt > 2) {
    leaf(n, Ao, Bo, d, ld, op, 0, 0, 0); return; }
  /* n == 512 且本次**本来就会递归**(守卫已过 ⇒ nt <= 2、n > CUTL)时,先把惰性操作数
     物化成 512^2 连续矩阵再递归。语义恒等(mod 2^64 下加法可结合),但 h=256 那一层的描述符
     nt 从 {2,4} 掉到 {2} ⇒ **每个 256 叶的 pack 源读项数减半**(pack 流量 ≈ −2 MB/叶)。 */
  if (n == 512 && (Ao->nt > 1 || Bo->nt > 1)) {
    Opd am, bm; const Opd *a = Ao, *b = Bo;
    if (Ao->nt > 1) { materializeN(Ao, material_C, 512); am = o1(material_C, 512); a = &am; }
    if (Bo->nt > 1) { materializeN(Bo, material_D, 512); bm = o1(material_D, 512); b = &bm; }
    mmxR(n, a, b, d, ld, op, T);
    return;
  }
  const int h = n >> 1;
  Opd A11 = oq(Ao, 0, 0, h), A12 = oq(Ao, 0, 1, h), A21 = oq(Ao, 1, 0, h), A22 = oq(Ao, 1, 1, h);
  Opd B11 = oq(Bo, 0, 0, h), B12 = oq(Bo, 0, 1, h), B21 = oq(Bo, 1, 0, h), B22 = oq(Bo, 1, 1, h);
  long long *Q[4];
  Q[0] = d; Q[1] = d + h; Q[2] = d + (size_t)h * ld; Q[3] = Q[2] + h;
  long long *T2 = T + (size_t)h * h;
  int wr[4] = {0, 0, 0, 0};
#define MK(qi, si, qj, sj, Ma, Mb) do { \
    int oa = wr[qi] ? effop(1, (si)) : effop(op, (si)); \
    int ob = wr[qj] ? effop(1, (sj)) : effop(op, (sj)); \
    wr[qi] = 1; wr[qj] = 1; \
    if (oa == 0) { \
      mmxR(h, &(Ma), &(Mb), Q[qi], ld, 0, T); \
      cmb(Q[qj], ld, Q[qi], ld, h, (sj), ob); \
    } else { \
      mmxR(h, &(Ma), &(Mb), T, h, 0, T2); \
      cmb(Q[qi], ld, T, h, h, (si), oa); \
      cmb(Q[qj], ld, T, h, h, (sj), ob); \
    } \
  } while (0) \

#define MK1(qi, si, Ma, Mb) do { \
    int oa = wr[qi] ? effop(1, (si)) : effop(op, (si)); \
    wr[qi] = 1; \
    mmxR(h, &(Ma), &(Mb), Q[qi], ld, oa, T); \
  } while (0)
  { /* M1 = (A11+A22)(B11+B22) -> +C11, +C22 */
    Opd Ma = oadd(&A11, &A22, 1), Mb = oadd(&B11, &B22, 1);
    MK(0, 1, 3, 1, Ma, Mb);
  }
  { /* M2 = (A21+A22)B11 -> +C21, -C22 */
    Opd Ma = oadd(&A21, &A22, 1), Mb = B11;
    MK(2, 1, 3, 2, Ma, Mb);
  }
  { /* M3 = A11(B12-B22) -> +C12, +C22 */
    Opd Ma = A11, Mb = oadd(&B12, &B22, -1);
    MK(1, 1, 3, 1, Ma, Mb);
  }
  { /* M4 = A22(B21-B11) -> +C11, +C21 */
    Opd Ma = A22, Mb = oadd(&B21, &B11, -1);
    MK(0, 1, 2, 1, Ma, Mb);
  }
  { /* M5 = (A11+A12)B22 -> -C11, +C12 */
    Opd Ma = oadd(&A11, &A12, 1), Mb = B22;
    MK(0, 2, 1, 1, Ma, Mb);
  }
  { /* M6 = (A21-A11)(B11+B12) -> +C22 */
    Opd Ma = oadd(&A21, &A11, -1), Mb = oadd(&B11, &B12, 1);
    MK1(3, 1, Ma, Mb);
  }
  { /* M7 = (A12-A22)(B21+B22) -> +C11 */
    Opd Ma = oadd(&A12, &A22, -1), Mb = oadd(&B21, &B22, 1);
    MK1(0, 1, Ma, Mb);
  }
#undef MK
#undef MK1
}

static inline __m256i wg_load(const long long *p) { return LDQ((const __m256i *)p); }
static inline void wg_store(long long *p, __m256i v) { STQ((__m256i *)p, v); }

static long long wg_buf[5 * (size_t)(2048 * (2048 + 8)) + 4 * 512] __attribute__((aligned(2097152)));

static void wg_add(int h, long long *dst, const long long *a, int lda,
                   const long long *b, int ldb, int sg) {
  for (int i = 0; i < h; i++) {
    long long *d = dst + (size_t)i*h;
    const long long *x = a + (size_t)i*lda, *y = b + (size_t)i*ldb;
    for (int j = 0; j < h; j += 4) {
      __m256i vx=wg_load(x+j), vy=wg_load(y+j);
      wg_store(d+j, sg > 0 ? _mm256_add_epi64(vx,vy) : _mm256_sub_epi64(vx,vy));
    }
  }
}
/* [SCHAIN] d1 = A21+A22, d2 = A21+A22-A11, d3 = A11-A21, one pass (mod 2^64, exact). */
static void wg_schain3(int h, long long *d1, long long *d2, long long *d3,
                       const long long *a11, int ld11, const long long *a21, int ld21,
                       const long long *a22, int ld22) {
  for (int i = 0; i < h; i++) {
    long long *p1 = d1 + (size_t)i*h, *p2 = d2 + (size_t)i*h, *p3 = d3 + (size_t)i*h;
    const long long *x11 = a11 + (size_t)i*ld11, *x21 = a21 + (size_t)i*ld21, *x22 = a22 + (size_t)i*ld22;
    for (int j = 0; j < h; j += 4) {
      __m256i v11 = wg_load(x11+j), v21 = wg_load(x21+j), v22 = wg_load(x22+j);
      __m256i s1 = _mm256_add_epi64(v21, v22);
      wg_store(p1+j, s1);
      wg_store(p2+j, _mm256_sub_epi64(s1, v11));
      wg_store(p3+j, _mm256_sub_epi64(v11, v21));
    }
  }
}
/* d = a - b (mod 2^64) */
static void wg_sub2(int h, long long *d, const long long *a, int lda, const long long *b, int ldb) {
  for (int i = 0; i < h; i++) {
    long long *dd = d + (size_t)i*h;
    const long long *x = a + (size_t)i*lda, *y = b + (size_t)i*ldb;
    for (int j = 0; j < h; j += 4)
      wg_store(dd+j, _mm256_sub_epi64(wg_load(x+j), wg_load(y+j)));
  }
}
static void wg_mutate(int h, long long *dst, const long long *b, int ldb, int reverse) {
  for (int i = 0; i < h; i++) {
    long long *d = dst + (size_t)i*h; const long long *y=b+(size_t)i*ldb;
    for (int j=0; j<h; j+=4) {
      __m256i vd=wg_load(d+j),vy=wg_load(y+j);
      wg_store(d+j, reverse ? _mm256_sub_epi64(vy,vd) : _mm256_sub_epi64(vd,vy));
    }
  }
}
static void wg_combine(int h, long long *C, int ldc, const long long *M1,
                       const long long *M2, const long long *M3, const long long *M4,
                       const long long *M5, const long long *M6, const long long *M7) {
  for (int i=0; i<h; i++) {
    const long long *a=M1+(size_t)i*ldc,*b=M2+(size_t)i*ldc,*c=M3+(size_t)i*ldc;
    const long long *d=M4+(size_t)i*ldc,*e=M5+(size_t)i*h,*f=M6+(size_t)i*h,*g=M7+(size_t)i*h;
    long long *c11=C+(size_t)i*ldc,*c12=c11+h,*c21=c11+(size_t)h*ldc,*c22=c21+h;
    for (int j=0; j<h; j+=4) {
      __m256i p1=wg_load(a+j),p2=wg_load(b+j),p3=wg_load(c+j),p4=wg_load(d+j);
      __m256i p5=wg_load(e+j),p6=wg_load(f+j),p7=wg_load(g+j);
      __m256i u2=_mm256_add_epi64(p1,p6),u3=_mm256_add_epi64(u2,p7);
      __m256i u4=_mm256_add_epi64(u2,p5);
      wg_store(c11+j,_mm256_add_epi64(p1,p2));
      wg_store(c12+j,_mm256_add_epi64(u4,p3));
      wg_store(c21+j,_mm256_sub_epi64(u3,p4));
      wg_store(c22+j,_mm256_add_epi64(u3,p5));
    }
  }
}

static long long wg_buf_mini[5 * 64 * 64 + 4 * 512] __attribute__((aligned(2097152)));
static void winograd_prod128(int n, const long long *A, int lda, const long long *B,
                             int ldb, long long *C, int ldc) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*ldc,*M4=M3+h;
  long long *M5=wg_buf_mini,*M6=M5+sg+512,*M7=M6+sg+512;
  Opd A0=o1(A,lda), B0=o1(B,ldb);
  Opd A11=oq(&A0,0,0,h), A12=oq(&A0,0,1,h), A21=oq(&A0,1,0,h), A22=oq(&A0,1,1,h);
  Opd B11=oq(&B0,0,0,h), B12=oq(&B0,0,1,h), B21=oq(&B0,1,0,h), B22=oq(&B0,1,1,h);
  Opd P1=oadd(&A11,&A22,1), Q1=oadd(&B11,&B22,1);   /* M1=(A11+A22)(B11+B22) */
  Opd P2=oadd(&A21,&A22,1), Q2=B11;                 /* M2=(A21+A22)B11       */
  Opd P3=A11,               Q3=oadd(&B12,&B22,-1);  /* M3=A11(B12-B22)       */
  Opd P4=A22,               Q4=oadd(&B21,&B11,-1);  /* M4=A22(B21-B11)       */
  Opd P5=oadd(&A11,&A12,1), Q5=B22;                 /* M5=(A11+A12)B22       */
  Opd P6=oadd(&A21,&A11,-1),Q6=oadd(&B11,&B12,1);   /* M6=(A21-A11)(B11+B12) */
  Opd P7=oadd(&A12,&A22,-1),Q7=oadd(&B21,&B22,1);   /* M7=(A12-A22)(B21+B22) */
#define PRODO(AO,BO,Z,LZ) do { Opd a_=(AO),b_=(BO); \
    fixed_leaf64_product(&a_,&b_,(Z),(LZ)); } while(0)
  PRODO(P6,Q6,M6,h); PRODO(P5,Q5,M5,h); PRODO(P7,Q7,M7,h); PRODO(P2,Q2,M2,ldc); PRODO(P1,Q1,M1,ldc); PRODO(P4,Q4,M4,ldc); PRODO(P3,Q3,M3,ldc);
#undef PRODO
  for (int i=0;i<h;i++) {
    const long long *m1=M1+(size_t)i*ldc,*m2=M2+(size_t)i*ldc,*m3=M3+(size_t)i*ldc,*m4=M4+(size_t)i*ldc;
    const long long *m5=M5+(size_t)i*h,*m6=M6+(size_t)i*h,*m7=M7+(size_t)i*h;
    long long *c11=C+(size_t)i*ldc,*c12=c11+h,*c21=c11+(size_t)h*ldc,*c22=c21+h;
    for (int j=0;j<h;j+=4) {
      __m256i p1=wg_load(m1+j),p2=wg_load(m2+j),p3=wg_load(m3+j),p4=wg_load(m4+j);
      __m256i p5=wg_load(m5+j),p6=wg_load(m6+j),p7=wg_load(m7+j);
      wg_store(c11+j,_mm256_add_epi64(_mm256_sub_epi64(_mm256_add_epi64(p1,p4),p5),p7));
      wg_store(c12+j,_mm256_add_epi64(p3,p5));
      wg_store(c21+j,_mm256_add_epi64(p2,p4));
      wg_store(c22+j,_mm256_add_epi64(_mm256_add_epi64(_mm256_sub_epi64(p1,p2),p3),p6));
    }
  }
}


/* ---- materialised 256-square Winograd product level ----------------------------
   Each 256-square product is split into seven 128-square ones (M1..M4 in the
   destination's own quadrants, M5..M7/P/Q in scratch carved from the head of
   g_scratch).  The seven 128-square products are plain leaf(128) mikro calls.
   g_scratch is dead storage at n=4096: the only other users are mmxR's T argument
   (never read on the leaf path, and 128 <= CUTL always takes it) and
   matrix_multiply's n != 4096 fallback, which the judge's n=4096 never reaches. */
#define WG256_SZ (128*128)
/* [l4q-PACK-81] Minimal-viable measurement (approved scope = ONLY lda==4096, 81 calls) of the "relayout A" lead.
   Rationale (BRIEF 2.19.1176): the shape arm contrasted stride 4096 vs 256 on ALL blocks, but the
   live engine already runs 56.24% of winograd_prod256's time at stride 256 (via the existing
   materializeN/material_C machinery); only 3.50% is still at 4096.  This wrapper densifies A for
   EXACTLY those calls: winograd_prod256(n) only ever reads its own 2h x 2h (= n x n) operand block,
   so copying that block into a dense n-stride scratch is value-identical (hence BIT-EXACT) and the
   four quadrants then form correctly with lda = n.  B is deliberately left alone (single variable). */
static void winograd_prod256_inner(int n, const long long *A, int lda, const long long *B,
                             int ldb, long long *C, int ldc);
static long long l4q_apack[256 * 256] __attribute__((aligned(4096)));
static void winograd_prod256(int n, const long long *A, int lda, const long long *B,
                             int ldb, long long *C, int ldc) {
  if (lda != 4096) {   /* [l4q-PACK-81] EXACT approved scope: only the 81 calls with lda==4096 */
    winograd_prod256_inner(n, A, lda, B, ldb, C, ldc);
    return;
  }
  for (int i = 0; i < n; i++) {
    const long long *src = A + (size_t)i * lda; long long *dst = l4q_apack + (size_t)i * n;
    for (int j = 0; j < n; j++) dst[j] = src[j];
  }
  winograd_prod256_inner(n, l4q_apack, n, B, ldb, C, ldc);
}
static void winograd_prod256_inner(int n, const long long *A, int lda, const long long *B,
                             int ldb, long long *C, int ldc) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*ldc,*M4=M3+h;
  long long *M5=g_scratch,*M6=M5+sg+512,*M7=M6+sg+512,*P=M7+sg+512,*Q=P+sg+512;
  const long long *A11=A,*A12=A+h,*A21=A+(size_t)h*lda,*A22=A21+h;
  const long long *B11=B,*B12=B+h,*B21=B+(size_t)h*ldb,*B22=B21+h;
#define PROD4(X,Y,Z,LX,LY,LZ) do { Opd ao=o1((X),(LX)),bo=o1((Y),(LY)); \
    winograd_prod128(h,(X),(LX),(Y),(LY),(Z),(LZ)); } while(0)
  PROD4(A11,B11,M1,lda,ldb,ldc);
  PROD4(A12,B21,M2,lda,ldb,ldc);
  wg_add(h,P,A21,lda,A22,lda,+1);
  wg_add(h,Q,B12,ldb,B11,ldb,-1);
  PROD4(P,Q,M5,h,h,h);
  wg_mutate(h,P,A11,lda,0);
  wg_mutate(h,Q,B22,ldb,1);
  PROD4(P,Q,M6,h,h,h);
  wg_mutate(h,P,A12,lda,1);
  PROD4(P,B22,M3,h,ldb,ldc);
  wg_mutate(h,Q,B21,ldb,0);
  PROD4(A22,Q,M4,lda,h,ldc);
  wg_add(h,P,A11,lda,A21,lda,-1);
  wg_add(h,Q,B22,ldb,B12,ldb,-1);
  PROD4(P,Q,M7,h,h,h);
#undef PROD4
  wg_combine(h,C,ldc,M1,M2,M3,M4,M5,M6,M7);
}

static long long wg_buf2[5 * (size_t)(1024 * (1024 + 8)) + 4 * 512] __attribute__((aligned(2097152)));
static long long wg_buf_s2[2 * 2048 * 2048 + 2 * 512] __attribute__((aligned(2097152)));
static long long wg_buf2_s2[2 * (size_t)(1024 * (1024 + 8)) + 1 * 512] __attribute__((aligned(2097152)));
static long long wg_buf1[5 * (size_t)(512 * (512 + 8)) + 4 * 256] __attribute__((aligned(2097152)));
static long long wg_buf0[5 * (size_t)(256 * (256 + 8)) + 4 * 512] __attribute__((aligned(2097152)));
static void winograd_leaf512(int n, const long long *A, int lda, const long long *B, int ldb,
                           long long *C, int ldc) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*ldc,*M4=M3+h;
  long long *M5=wg_buf0,*M6=M5+sg+512,*M7=M6+sg+512,*P=M7+sg+512,*Q=P+sg+512;
  const long long *A11=A,*A12=A+h,*A21=A+(size_t)h*lda,*A22=A21+h;
  const long long *B11=B,*B12=B+h,*B21=B+(size_t)h*ldb,*B22=B21+h;
#define PROD3(X,Y,Z,LX,LY,LZ) do { winograd_prod256(h,(X),(LX),(Y),(LY),(Z),(LZ)); } while(0)
  PROD3(A11,B11,M1,lda,ldb,ldc);
  PROD3(A12,B21,M2,lda,ldb,ldc);
  wg_add(h,P,A21,lda,A22,lda,+1);
  wg_add(h,Q,B12,ldb,B11,ldb,-1);
  PROD3(P,Q,M5,h,h,h);
  wg_mutate(h,P,A11,lda,0);
  wg_mutate(h,Q,B22,ldb,1);
  PROD3(P,Q,M6,h,h,h);
  wg_mutate(h,P,A12,lda,1);
  PROD3(P,B22,M3,h,ldb,ldc);
  wg_mutate(h,Q,B21,ldb,0);
  PROD3(A22,Q,M4,lda,h,ldc);
  wg_add(h,P,A11,lda,A21,lda,-1);
  wg_add(h,Q,B22,ldb,B12,ldb,-1);
  PROD3(P,Q,M7,h,h,h);
#undef PROD3
  wg_combine(h,C,ldc,M1,M2,M3,M4,M5,M6,M7);
}

static void winograd_grandchild(int n, const long long *A, int lda, const long long *B, int ldb,
                           long long *C, int ldc) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*ldc,*M4=M3+h;
  long long *M5=wg_buf1,*M6=M5+sg+256,*M7=M6+sg+256,*P=M7+sg+256,*Q=P+sg+256;
  const long long *A11=A,*A12=A+h,*A21=A+(size_t)h*lda,*A22=A21+h;
  const long long *B11=B,*B12=B+h,*B21=B+(size_t)h*ldb,*B22=B21+h;
#define PROD3(X,Y,Z,LX,LY,LZ) do { winograd_leaf512(h,(X),(LX),(Y),(LY),(Z),(LZ)); } while(0)
  PROD3(A11,B11,M1,lda,ldb,ldc);
  PROD3(A12,B21,M2,lda,ldb,ldc);
  wg_add(h,P,A21,lda,A22,lda,+1);
  wg_add(h,Q,B12,ldb,B11,ldb,-1);
  PROD3(P,Q,M5,h,h,h);
  wg_mutate(h,P,A11,lda,0);
  wg_mutate(h,Q,B22,ldb,1);
  PROD3(P,Q,M6,h,h,h);
  wg_mutate(h,P,A12,lda,1);
  PROD3(P,B22,M3,h,ldb,ldc);
  wg_mutate(h,Q,B21,ldb,0);
  PROD3(A22,Q,M4,lda,h,ldc);
  wg_add(h,P,A11,lda,A21,lda,-1);
  wg_add(h,Q,B22,ldb,B12,ldb,-1);
  PROD3(P,Q,M7,h,h,h);
#undef PROD3
  wg_combine(h,C,ldc,M1,M2,M3,M4,M5,M6,M7);
}

static void winograd_child(int n, const long long *A, int lda, const long long *B, int ldb,
                           long long *C, int ldc) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*ldc,*M4=M3+h;
  long long *M5=wg_buf2,*M6=M5+sg+512,*M7=M6+sg+512,*P=M7+sg+512,*Q=P+sg+512;
  long long *P2=wg_buf2_s2,*P3=P2+sg+512;
  const long long *A11=A,*A12=A+h,*A21=A+(size_t)h*lda,*A22=A21+h;
  const long long *B11=B,*B12=B+h,*B21=B+(size_t)h*ldb,*B22=B21+h;
#define PROD2(X,Y,Z,LX,LY,LZ) do { winograd_grandchild(h,(X),(LX),(Y),(LY),(Z),(LZ)); } while(0)
  PROD2(A11,B11,M1,lda,ldb,ldc);
  PROD2(A12,B21,M2,lda,ldb,ldc);
  wg_schain3(h,P,P2,P3,A11,lda,A21,lda,A22,lda);
  wg_add(h,Q,B12,ldb,B11,ldb,-1);
  PROD2(P,Q,M5,h,h,h);
  wg_mutate(h,Q,B22,ldb,1);
  PROD2(P2,Q,M6,h,h,h);
  wg_sub2(h,P,A12,lda,P2,h);   /* P2 is a contiguous h x h block */
  PROD2(P,B22,M3,h,ldb,ldc);
  wg_mutate(h,Q,B21,ldb,0);
  PROD2(A22,Q,M4,lda,h,ldc);
  wg_add(h,Q,B22,ldb,B12,ldb,-1);
  PROD2(P3,Q,M7,h,h,h);
#undef PROD2
  wg_combine(h,C,ldc,M1,M2,M3,M4,M5,M6,M7);
}

static void winograd_top(int n, const long long *A, const long long *B, long long *C) {
  const int h=n/2; const size_t sz=(size_t)h*h; const size_t sg=(size_t)h*(size_t)(h+8); /* [ml4cn_] 面板间距 */
  long long *M1=C,*M2=C+h,*M3=C+(size_t)h*n,*M4=M3+h;
  long long *M5=wg_buf,*M6=M5+sg+512,*M7=M6+sg+512,*P=M7+sg+512,*Q=P+sg+512;
  const long long *A11=A,*A12=A+h,*A21=A+(size_t)h*n,*A22=A21+h;
  const long long *B11=B,*B12=B+h,*B21=B+(size_t)h*n,*B22=B21+h;
#define PROD(X,Y,Z,LX,LY,LZ) do { winograd_child(h,(X),(LX),(Y),(LY),(Z),(LZ)); } while(0)
  PROD(A11,B11,M1,n,n,n);
  PROD(A12,B21,M2,n,n,n);
  wg_add(h,P,A21,n,A22,n,+1);             // S1
  wg_add(h,Q,B12,n,B11,n,-1);             // T1
  PROD(P,Q,M5,h,h,h);
  wg_mutate(h,P,A11,n,0);                 // S2 = S1 - A11
  wg_mutate(h,Q,B22,n,1);                 // T2 = B22 - T1
  PROD(P,Q,M6,h,h,h);
  wg_mutate(h,P,A12,n,1);                 // S4 = A12 - S2
  PROD(P,B22,M3,h,n,n);
  wg_mutate(h,Q,B21,n,0);                 // T4 = T2 - B21
  PROD(A22,Q,M4,n,h,n);
  wg_add(h,P,A11,n,A21,n,-1);             // S3
  wg_add(h,Q,B22,n,B12,n,-1);             // T3
  PROD(P,Q,M7,h,h,h);
#undef PROD
  wg_combine(h,C,n,M1,M2,M3,M4,M5,M6,M7);
}


static inline void advise_huge(void *p,size_t bytes){
  uintptr_t a=(uintptr_t)p,e=a+bytes;
  uintptr_t h0=(a+2097151u)&~(uintptr_t)2097151u;
  uintptr_t h1=e&~(uintptr_t)2097151u;
  if(h1>h0) madvise((void*)h0,(size_t)(h1-h0),MADV_HUGEPAGE);
}
__attribute__((constructor)) static void setup_huge_scratch(){
  __asm__ volatile(".space 152,0x90"); /* [ml4d1_] */
  advise_huge(wg_buf,sizeof(wg_buf));
  advise_huge(wg_buf2,sizeof(wg_buf2));
  advise_huge(wg_buf1,sizeof(wg_buf1));
  advise_huge(wg_buf0,sizeof(wg_buf0));
  advise_huge(g_scratch,sizeof(g_scratch));
  advise_huge(material_A,sizeof(material_A));
  advise_huge(material_B,sizeof(material_B));
  advise_huge(material_C,sizeof(material_C));
  advise_huge(material_D,sizeof(material_D));
  advise_huge(Bpanel,sizeof(Bpanel));
}
static_assert(sizeof(long long)==8,"l4z3a4");
void matrix_multiply(int n, const long long *A, const long long *B, long long *C) {
  Opd Ao = o1(A, n), Bo = o1(B, n);
  if (n <= CUTL || (n & 1)) { leaf(n, &Ao, &Bo, C, n, 0, 0, 0, 0); return; }
  if (n == 4096) winograd_top(n, A, B, C);
  else mmxR(n, &Ao, &Bo, C, n, 0, g_scratch);
}
#pragma GCC pop_options

/* ml4be_ 席 · 全局布局对照块: 死 .bss, 一行代码不改, 只把程序映像的尾端推后 8 MiB。
   (不可删: used; 不可读: 无任何代码引用 ⇒ 语义零扰动, 闸门按构造成立。) */
static unsigned char ml4be_layout_pad[8u << 20] __attribute__((used, aligned(2097152)));

__attribute__((weak)) int main() { return 0; }

CompilationN/AN/ACompile OKScore: N/A

Testcase #15.234 s357 MB + 800 KBAcceptedScore: 100


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