Skip to content

Cranelift: fcvt_to_{u,s}int{,_sat} not implemented for i128 on x64 #4899

@afonso360

Description

@afonso360

👋 Hey,

This came up when trying to fuzz #4884

.clif Test Case

So this is a bunch of separate cases, I can split it into multiple issues if you'd like:

fcvt_to_uint
test run
set enable_llvm_abi_extensions
target x86_64

function %a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_uint.i128 v0
    return v1
}
; run: %a(0.0) == 0

function %c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_uint.i128 v0
    return v1
}
; run: %c(0.0) == 0
fcvt_to_sint
test run
set enable_llvm_abi_extensions
target x86_64

function %signed_a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_sint.i128 v0
    return v1
}
; run: %signed_a(0.0) == 0

function %signed_c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_sint.i128 v0
    return v1
}
; run: %signed_c(0.0) == 0
fcvt_to_uint_sat
test run
set enable_llvm_abi_extensions
target x86_64

function %a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_uint_sat.i128 v0
    return v1
}
; run: %a(0.0) == 0

function %c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_uint_sat.i128 v0
    return v1
}
; run: %c(0.0) == 0
fcvt_to_sint_sat
test run
set enable_llvm_abi_extensions
target x86_64

function %signed_a(f32) -> i128 {
block0(v0: f32):
    v1 = fcvt_to_sint_sat.i128 v0
    return v1
}
; run: %signed_a(0.0) == 0

function %signed_c(f64) -> i128 {
block0(v0: f64):
    v1 = fcvt_to_sint_sat.i128 v0
    return v1
}
; run: %signed_c(0.0) == 0

Steps to Reproduce

  • clif-util ./the-above.clif

Expected Results

The above tests to pass.

Actual Results

thread 'worker #0' panicked at 'internal error: entered unreachable code: Invalid OperandSize: 16', cranelift\codegen\src\isa\x64\inst\args.rs:1807:18
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
 ERROR cranelift_filetests::concurrent > FAIL: panicked in worker #0: internal error: entered unreachable code: Invalid OperandSize: 16
FAIL .\lmao.clif: panicked in worker #0: internal error: entered unreachable code: Invalid OperandSize: 16
1 tests
Error: 1 failure

This fails in the first function but all the functions in all test cases crash with a similar error.

Versions and Environment

Cranelift version or commit: main
Operating system: Windows
Architecture: x64

Extra Info

cg_clif works around this by directly emitting a libcall: https://github.com/bjorn3/rustc_codegen_cranelift/blob/fa7660440b2581c4c57d896d50e76da1515de6df/src/cast.rs#L87-L113

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIncorrect behavior in the current implementation that needs fixingcraneliftIssues related to the Cranelift code generatorcranelift:area:x64Issues related to x64 codegen

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions