Constant mod over chars can use a cheaper FastMod
@MihaZupan is already working on this.
Since Jan 17, 2025.
Assessment
This issue has not been assessed yet.
Description
#101001 added a faster variant of FastMod that SearchValues now uses when it knows that the value and divisor are both < 2^16 (i.e. chars).
Instead of
https://github.com/dotnet/runtime/blob/e71d737628c7b807aa12755dabe4eca40c40da7e/src/libraries/System.Private.CoreLib/src/System/Collections/HashHelpers.cs#L107
we can use
https://github.com/dotnet/runtime/blob/e71d737628c7b807aa12755dabe4eca40c40da7e/src/libraries/System.Private.CoreLib/src/System/SearchValues/ProbabilisticMapState.cs#L223
Is it worth teaching the JIT to do something similar when it knows that values are in range?
int Mod1(char c) => c % 42;
int Mod2(char c) => (int)(((ulong)(102261127u * c) * 42) >> 32);
Test.Mod1(Char)
L0000: movzx eax, cx
L0003: mov ecx, eax
L0005: shr ecx, 1
L0007: imul rcx, 0x30c30c31
L000e: shr rcx, 0x22
L0012: imul ecx, 0x2a
L0015: sub eax, ecx
L0017: ret
Test.Mod2(Char)
L0000: movzx eax, cx
L0003: imul eax, 0x6186187
L0009: imul rax, 0x2a
L000d: shr rax, 0x20
L0011: ret
- Dominant language
- C#
- Stars
- 18.3k
- Forks
- 5.6k
- PR merge metrics
- PR metrics pending
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/runtime
-
agentic-workflows untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
area-System.Reflection blocking-clean-ci-optional Known Build Error os-mac-os-x untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
area-CodeGen-coreclr untriaged
Difficulty 1/5 Under an hour Newbie friendliness 92/100
-
agentic-workflows untriaged
Difficulty 1/5 Under an hour Newbie friendliness 78/100
-
area-VM-meta-mono untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SubtitleEdit/subtitleedit#15108 · 1 comment ·
-
area/docs-content Bug pulumi/docs
Difficulty 1/5 1-3 hours Newbie friendliness 94/100
-
Create parent directories only after the containment check in InstallHelper.TryExtractToDirectory Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
PowerShell/PSResourceGet#2056 ·