Files
wasmtime/cranelift/wasmtests/simd.wat
Andrew Brown 27532410d2 Fix local.set and local.tee types for SIMD
Because Wasm SIMD vectors store their type as `v128`, there is a mismatch between the more specific types Cranelift uses and Wasm SIMD. Because of this mismatch, Wasm SIMD translates to the default Cranelift type `I8X16`, causing issues when more specific type information is available (e.g. `I32x4`). To fix this, all incoming values to SIMD instructions are checked during translation (not runtime) and if necessary cast from `I8X16` to the appropriate type by functions like `optionally_bitcast_vector`, `pop1_with_bitcast` and `pop2_with_bitcast`. However, there are times when we must also cast to `I8X16` for outgoing values, as with `local.set` and `local.tee`.

There are other ways of resolving this (e.g., see adding a new vector type, https://github.com/bytecodealliance/cranelift/pull/1251) but we discussed staying with this casting approach in https://github.com/bytecodealliance/wasmtime/issues/1147.
2020-03-17 11:44:25 -07:00

30 lines
574 B
Plaintext

(module
(func $test_splat (result i32)
i32.const 42
i32x4.splat
i32x4.extract_lane 0
)
(func $test_insert_lane (result i32)
v128.const i64x2 0 0
i32.const 99
i32x4.replace_lane 1
i32x4.extract_lane 1
)
(func $test_const (result i32)
v128.const i32x4 1 2 3 4
i32x4.extract_lane 3
)
(func $test_locals (local i32 v128)
local.get 0
i32x4.splat
local.set 1
)
(export "test_splat" (func $test_splat))
(export "test_insert_lane" (func $test_insert_lane))
(export "test_const" (func $test_const))
)