Koko Bhadra
4fa465fc8f
compiler_rt: optimize udivmod large-divisor case with trial quotient
...
Replace the O(n) shift-subtract loop with a constant-time trial
quotient approach (Knuth Algorithm D, TAOCP Vol 2 Section 4.3.1).
The old code iterates clz(b_hi)-clz(a_hi)+1 times (up to 64
iterations of 128-bit arithmetic). The new code uses a single
divwide call to get a trial quotient, then verifies with two
native-width widening multiplies.
Benchmark (Apple M1, ReleaseFast):
- Large divisor, large shift: 87ns -> 7.5ns (11.5x faster)
- Small divisor / uniform: unchanged
2026-03-05 20:22:19 +01:00
..
2026-02-09 20:03:15 -08:00
2022-06-17 16:38:59 -07:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:04:17 +01:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2023-10-29 07:20:36 -04:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2024-06-16 11:53:33 +02:00
2024-06-16 11:53:33 +02:00
2024-06-16 11:53:33 +02:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2025-03-05 03:01:43 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2025-07-22 19:43:47 -07:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2025-03-05 03:01:43 +00:00
2023-09-27 11:24:28 -07:00
2026-02-09 20:04:17 +01:00
2025-02-25 19:31:00 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2025-02-25 19:31:00 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-13 20:49:14 +01:00
2026-02-13 20:49:14 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2023-10-29 07:20:36 -04:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2024-09-02 00:10:22 +03:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2025-07-22 19:43:47 -07:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2025-04-11 07:06:01 -04:00
2025-11-22 22:42:38 +00:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2022-05-06 22:41:00 -07:00
2023-10-29 07:20:36 -04:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2025-04-11 07:06:01 -04:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2025-03-05 03:01:43 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2024-03-14 19:43:24 +02:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2023-06-24 16:56:39 -07:00
2023-06-24 16:56:39 -07:00
2023-06-24 16:56:39 -07:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2023-06-24 16:56:39 -07:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2024-02-08 15:21:35 +01:00
2024-02-08 15:21:35 +01:00
2024-02-08 15:21:35 +01:00
2026-02-09 20:04:17 +01:00
2024-02-08 15:21:35 +01:00
2024-02-08 15:21:35 +01:00
2024-02-08 15:21:35 +01:00
2023-11-19 09:55:07 +00:00
2026-02-09 20:03:15 -08:00
2025-07-22 19:43:47 -07:00
2023-09-19 09:37:52 -07:00
2023-07-24 10:23:51 -07:00
2026-02-09 20:03:15 -08:00
2023-06-24 16:56:39 -07:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2025-02-09 00:42:55 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2023-07-24 10:23:51 -07:00
2024-09-02 00:10:22 +03:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:04:17 +01:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2023-11-19 09:55:07 +00:00
2026-03-05 20:22:19 +01:00
2024-10-19 19:44:53 +01:00
2026-02-09 20:03:15 -08:00
2024-10-19 19:44:53 +01:00
2026-02-09 20:03:15 -08:00
2026-02-09 20:03:15 -08:00