bytecodealliance / bytecodealliance/wasmtime

Cranelift: `fcvt_to_{u,s}int{,_sat}` not implemented for `{i8,i16}` types on x64

Open
#4,897 2 comments 0 reactions 0 assignees View on GitHub
bug cranelift cranelift:area:x64
Dominant language
Rust
Stars
18.6k
Forks
1.8k
Avg merge
1d 18h
Merged PRs (30d)
126

Description

👋 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 interpret
test run
target x86_64

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

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

function %c(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint.i8 v0
return v1
}
; run: %c(0.0) == 0

function %d(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint.i16 v0
return v1
}
; run: %d(0.0) == 0
```

fcvt_to_sint

```
test interpret
test run
target x86_64

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

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

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

function %signed_d(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint.i16 v0
return v1
}
; run: %signed_d(0.0) == 0
```

fcvt_to_uint_sat

```
test interpret
test run
target x86_64

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

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

function %c(f64) -> i8 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i8 v0
return v1
}
; run: %c(0.0) == 0

function %d(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_uint_sat.i16 v0
return v1
}
; run: %d(0.0) == 0

```

fcvt_to_sint_sat

```
test interpret
test run
target x86_64

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

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

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

function %signed_d(f64) -> i16 {
block0(v0: f64):
v1 = fcvt_to_sint_sat.i16 v0
return v1
}
; run: %signed_d(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 'assertion failed: dst_size.is_one_of(&[OperandSize::Size32, OperandSize::Size64])', cranelift\codegen\src\isa\x64\inst\mod.rs:331:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
ERROR cranelift_filetests::concurrent > FAIL: panicked in worker #0: assertion failed: dst_size.is_one_of(&[OperandSize::Size32, OperandSize::Size64])
FAIL .\lmao.clif: panicked in worker #0: assertion failed: dst_size.is_one_of(&[OperandSize::Size32, OperandSize::Size64])
1 tests
Error: 1 failure
```

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

### Versions and Environment

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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.