Skip to content

to_int_unchecked produces slower code than the checked version #147650

@kjarosh

Description

@kjarosh

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
 ret

Code 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
 ret

Meta

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions