Open
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. char
s).
Instead of
we can use
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
Activity