-
Couldn't load subscription status.
- Fork 13.9k
Closed as not planned
Description
Code A:
let value_i = unsafe { value.to_int_unchecked() };
if value.to_bits() == (value_i as f64).to_bits() {
Value::Integer(value_i)
} else {
Value::Number(value)
}Code B:
let value_i = value as i32;
if value.to_bits() == (value_i as f64).to_bits() {
Value::Integer(value_i)
} else {
Value::Number(value)
}I would expect Code A to be faster than Code B, because it doesn't have to do range and NaN checks.
Instead, Code A was 2-6x slower than Code B on x86_64.
Code A compiles to:
movq rcx, xmm0
cvttpd2dq xmm1, xmm0
cvtdq2pd xmm1, xmm1
movq rdx, xmm1
cmp rcx, rdx
jne .LBB5793_1
cvttsd2si ecx, xmm0
mov dword, ptr, [rax, +, 8], ecx
mov ecx, 49
mov qword, ptr, [rax], rcx
ret
.LBB5793_1:
movsd qword, ptr, [rax, +, 8], xmm0
mov ecx, 48
mov qword, ptr, [rax], rcx
retCode B compiles to:
maxsd xmm1, qword, ptr, [rip, +, .LCPI5792_0]
minsd xmm1, qword, ptr, [rip, +, .LCPI5792_1]
cvttsd2si edx, xmm1
xor ecx, ecx
ucomisd xmm0, xmm0
mov rax, rdi
cmovnp ecx, edx
movq rdx, xmm0
xorps xmm1, xmm1
cvtsi2sd xmm1, ecx
movq rsi, xmm1
cmp rdx, rsi
jne .LBB5792_1
mov dword, ptr, [rax, +, 8], ecx
mov ecx, 49
mov qword, ptr, [rax], rcx
ret
.LBB5792_1:
movsd qword, ptr, [rax, +, 8], xmm0
mov ecx, 48
mov qword, ptr, [rax], rcx
retMeta
rustc --version --verbose:
rustc 1.90.0 (1159e78c4 2025-09-14) (Fedora 1.90.0-1.fc41)
binary: rustc
commit-hash: 1159e78c4747b02ef996e55082b704c09b970588
commit-date: 2025-09-14
host: x86_64-unknown-linux-gnu
release: 1.90.0
LLVM version: 19.1.7
See ruffle-rs/ruffle#21907 for context.
Metadata
Metadata
Assignees
Labels
No labels