)]}'
{
  "commit": "a7b82bbc588847235b52f3597d874d0862cbaa3d",
  "tree": "be34fb9dfe0659652614f9ecaeb39da433683a8f",
  "parents": [
    "c0c3d8e30a8329c48a7e81f40d18a710f4eb4074"
  ],
  "author": {
    "name": "Lurie97",
    "email": "109333972+Lurie97@users.noreply.github.com",
    "time": "Wed Oct 14 09:40:02 2026 +0800"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Tue Oct 13 18:50:12 2026 -0700"
  },
  "message": "[libclc] Produce subnormal results for exp/exp2 on FP32 (#212696)\n\nThe FP32 __clc_exp/__clc_exp2 implementations scale the reduced result\nby 2^p using integer bit manipulation (as_int(y) + (p \u003c\u003c 23)). That\nrepresentation cannot encode a subnormal, so inputs whose result falls\nbelow the smallest normal were unconditionally flushed to zero via \"x \u003c\nllim ? 0.0f\". On devices that report CL_FP_DENORM this loses the correct\nsubnormal result (e.g. erfc(), which is built on exp(), failed CTS\nmath_brute_force with the reference subnormal vs a returned 0).\n\nRecompute the subnormal range with __clc_ldexp, which does produce\nsubnormals, gated on __clc_fp32_subnormals_supported() so flush-to-zero\ntargets keep the previous fast path. The ldexp path is restricted to\n[subnorm_llim, llim); inputs below subnorm_llim (including -inf and\nlarge-magnitude negatives) still flush to zero, since their reduced\nexponent argument would be ill-formed for ldexp.\n\nGitOrigin-RevId: 7cec6725695788dc9a82aa4464611a9dacde2549\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1e7174c7541c5b13e829d81f55cae23397faa80c",
      "old_mode": 33188,
      "old_path": "clc/lib/generic/math/clc_exp.cl",
      "new_id": "7eb2b5599939e05fe56303f6c2b5e5a4b9c21a08",
      "new_mode": 33188,
      "new_path": "clc/lib/generic/math/clc_exp.cl"
    },
    {
      "type": "modify",
      "old_id": "5057bf8034e9273bbc350a66c9ac401147a34185",
      "old_mode": 33188,
      "old_path": "clc/lib/generic/math/clc_exp.inc",
      "new_id": "5539d6b682a6cfabe6819b4b672db9380e6e4364",
      "new_mode": 33188,
      "new_path": "clc/lib/generic/math/clc_exp.inc"
    },
    {
      "type": "modify",
      "old_id": "0516963ab620f4f565c61783f981faeacc2b929d",
      "old_mode": 33188,
      "old_path": "clc/lib/generic/math/clc_exp2.cl",
      "new_id": "8abb966cca04546508cf0548d09a9201620da564",
      "new_mode": 33188,
      "new_path": "clc/lib/generic/math/clc_exp2.cl"
    },
    {
      "type": "modify",
      "old_id": "6da361a43ed4c18bbd420ddd4b2d95e442bc4b2d",
      "old_mode": 33188,
      "old_path": "clc/lib/generic/math/clc_exp2.inc",
      "new_id": "12939a4f1b0b1ec08abb9e5ecf043439d67842dc",
      "new_mode": 33188,
      "new_path": "clc/lib/generic/math/clc_exp2.inc"
    }
  ]
}
