)]}'
{
  "commit": "473bc4018791491dfa3eabf0f214eff365accd47",
  "tree": "6451032d7a7581311dc99c3fd1c0c9c11017fafe",
  "parents": [
    "ce36167c3be514dd165a3ecff2d377cfa8eca0c9"
  ],
  "author": {
    "name": "ziereis",
    "email": "44057120+ziereis@users.noreply.github.com",
    "time": "Thu Sep 10 09:43:34 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Sep 10 09:43:34 2026 +0200"
  },
  "message": "[ARM64] Add base bf16 mmt4d tiles for cores without the BF16 extension (#24900)\n\nOn Arm64 cores without the Armv8.6 BF16 extension, bf16 `mmt4d`\ncurrently falls back to the scalar generic kernel. All existing Arm64\nbf16 tiles require the `_bf16` feature:\n\n```text\nIREE_UK_MMT4D_TILE(arm_64, bf16, bf16, f32,  1..8, 8, 4, _bf16)\nIREE_UK_MMT4D_TILE(arm_64, bf16, bf16, bf16, 1..8, 8, 4, _bf16)\n```\n\nThis PR adds base Arm64 bf16 tiles for cores without that extension.\n\nThe new tiles widen bf16 operands to f32 using NEON, accumulate with\nFMLA, and narrow back to bf16 on store when required. The same\nimplementation serves both bf16 and f32 accumulator/output variants.\n\nNo compiler changes are required: `enumerateMatmulTileArm64` already\nselects `8x8x1` tiles for bf16 when the BF16 extension is unavailable.\n\n## Performance\n\ni.MX95 (Cortex-A55, six cores), 512x512x512, median of three runs:\n\n| case | before | after | speedup |\n|---|---:|---:|---:|\n| bf16 -\u003e bf16 | 216 ms | 7.64 ms | 28x |\n| bf16 -\u003e f32 | 216 ms | 7.53 ms | 29x |\n| f32 -\u003e f32 | — | 8.22 ms | — |\n\nFor narrow M, using Mx512 by 512x512:\n\n| M | before | after | speedup |\n|---|---:|---:|---:|\n| 1 | 1.52 ms | 0.879 ms | 1.7x |\n| 2 | 2.31 ms | 0.874 ms | 2.6x |\n| 4 | 3.37 ms | 0.887 ms | 3.8x |\n\n## Correctness\n\nTested on device with `iree-run-module` for M\u003d1,2,4,8 for bf16 -\u003e bf16\nand M\u003d8 for bf16 -\u003e f32.\n\nThe registered tiles match the generic implementation for normal inputs.\nThe widening behavior for bf16 subnormals and NaN payloads follows the\nnative NEON conversion behavior and can differ from the scalar helper,\nsimilarly to the existing Arm64 f16 tiles.\n\nThe bf16 -\u003e bf16 path accumulates in f32 and rounds once when storing,\nmatching the behavior of the existing Arm64 f16 tile.\n\nAssisted by: Claude\n\n---------\n\nSigned-off-by: Thomas Ziereis \u003cziereis@roofline.ai\u003e\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "56ee0275a3342087d85c05067c21577f6a1970f1",
      "old_mode": 33188,
      "old_path": "build_tools/linters/typos.toml",
      "new_id": "c018595d1e7f2ae1e4f5682650735bbe45a2c564",
      "new_mode": 33188,
      "new_path": "build_tools/linters/typos.toml"
    },
    {
      "type": "modify",
      "old_id": "5789b9ccb060864755c366d4ebc63dce07295e04",
      "old_mode": 33188,
      "old_path": "runtime/src/iree/builtins/ukernel/arch/arm_64/mmt4d_arm_64_base.c",
      "new_id": "19d5ecf6d830a468332aded4ba5ebca580abca34",
      "new_mode": 33188,
      "new_path": "runtime/src/iree/builtins/ukernel/arch/arm_64/mmt4d_arm_64_base.c"
    },
    {
      "type": "modify",
      "old_id": "6bc173aa693ef2f0a4de2ebf2f3d6c548e1d460d",
      "old_mode": 33188,
      "old_path": "runtime/src/iree/builtins/ukernel/arch/arm_64/mmt4d_arm_64_tiles.inl",
      "new_id": "ad45057ca6262193aae5affea7741d12f182dac6",
      "new_mode": 33188,
      "new_path": "runtime/src/iree/builtins/ukernel/arch/arm_64/mmt4d_arm_64_tiles.inl"
    },
    {
      "type": "modify",
      "old_id": "ee7f3cfcc6ebd054c853e4ff3538ffa1580bb8c3",
      "old_mode": 33188,
      "old_path": "runtime/src/iree/builtins/ukernel/common.h",
      "new_id": "715904948c0056f2645ce1cda76f6d77fed69e66",
      "new_mode": 33188,
      "new_path": "runtime/src/iree/builtins/ukernel/common.h"
    },
    {
      "type": "modify",
      "old_id": "ea537ac63359dbc24a5046fb65e5b49bd6292490",
      "old_mode": 33188,
      "old_path": "runtime/src/iree/builtins/ukernel/tools/mmt4d_benchmark.c",
      "new_id": "d56ac3e28cdf824552393f43bfd09ec2e800be61",
      "new_mode": 33188,
      "new_path": "runtime/src/iree/builtins/ukernel/tools/mmt4d_benchmark.c"
    },
    {
      "type": "modify",
      "old_id": "a09f2271d050c04a086e946835f246fa1742d0b5",
      "old_mode": 33188,
      "old_path": "runtime/src/iree/builtins/ukernel/tools/mmt4d_test.c",
      "new_id": "fd5f6b56eecbd8216cb9167db557f71f1a875c50",
      "new_mode": 33188,
      "new_path": "runtime/src/iree/builtins/ukernel/tools/mmt4d_test.c"
    }
  ]
}
