dotnet/runtime
在 GitHub 查看Could emit branchless form of i <= 0b00111 && j <= 0b00111 for unsigned integers
Open
#92,692 创建于 2023年9月27日
area-CodeGen-coreclrhelp wantedtenet-performance
仓库指标
- Star
- (17,886 star)
- PR 合并指标
- (平均合并 12天 11小时) (30 天内合并 661 个 PR)
描述
Similar to #61940, equivalent to (i | j) <= 0b0011, the constant value can be 2^n-1, also the condition can be <.
For example:
bool Test0(ulong x, ulong y) => x <= UInt32.MaxValue && y <= UInt32.MaxValue;
bool Test1(ulong x, ulong y) => (x | y) <= UInt32.MaxValue;
The JIT could produce the same output for the above, but currently not, see https://godbolt.org/z/G9Taxqcox
C:Test(ulong,ulong):ubyte:this (FullOpts):
mov eax, 0xD1FFAB1E
cmp rsi, rax
ja SHORT G_M42689_IG05
mov eax, 0xD1FFAB1E
cmp rdx, rax
setbe al
movzx rax, al
ret
G_M42689_IG05:
xor eax, eax
ret
C:Test1(ulong,ulong):ubyte:this (FullOpts):
or rdx, rsi
mov eax, 0xD1FFAB1E
cmp rdx, rax
setbe al
movzx rax, al
ret