bytecodealliance / wasmtime

A fast and secure runtime for WebAssembly
https://wasmtime.dev/
Apache License 2.0
15.41k stars 1.3k forks source link

Cranelift: x64 backend is missing some lowerings for snarrow and unarrow #4734

Open elliottt opened 2 years ago

elliottt commented 2 years ago

.clif Test Case

function %f3(i64x2, i64x2) -> i32x4 {                                                
block0(v0: i64x2, v1: i64x2):                                                        
  v2 = snarrow v0, v1                                                                
  return v2                                                                          
}

function %f3(i64x2, i64x2) -> i32x4 {                                                
block0(v0: i64x2, v1: i64x2):                                                        
  v2 = unarrow v0, v1                                                                
  return v2                                                                          
}        

Steps to Reproduce

Compile the examples with clif-util compile --target=x86_64.

Expected Results

The examples should generate code.

Actual Results

There's a panic in the x64 code generator, as these case for i64x2 input is not implemented for snarrow and unarrow. The following program will compile successfully, as there's a special case for the combination of snarrow and fcvt_to_sint_sat:

function %f3(f64x2) -> i32x4 {
block0(v0: f64x2):
  v1 = fcvt_to_sint_sat.i64x2 v0
  v2 = vconst.i64x2 0x00
  v3 = snarrow v1, v2
  return v3
}

https://github.com/bytecodealliance/wasmtime/blob/ca6d648e37c80cb13e5027cc746ec0d2e4bd64d1/cranelift/codegen/src/isa/x64/lower.isle#L3275-L3299

Versions and Environment

Cranelift version or commit: ca6d648e37c80cb13e5027cc746ec0d2e4bd64d1

Operating system: Linux

Architecture: x86_64

abrown commented 2 years ago

Is this because those types are not used by the WebAssembly SIMD instructions for narrowing?

cfallin commented 2 years ago

Yep, it appears the ops are only used in particular combinations by cranelift-wasm and those are the combinations the x64 backend supports. That's OK for now (we're keeping status quo as we migrate lowerings) but we definitely want to support the general case in due time, I think.