CL/aarch64: implement the wasm SIMD i32x4.dot_i16x8_s instruction
This patch implements, for aarch64, the following wasm SIMD extensions i32x4.dot_i16x8_s instruction https://github.com/WebAssembly/simd/pull/127 It also updates dependencies as follows, in order that the new instruction can be parsed, decoded, etc: wat to 1.0.27 wast to 26.0.1 wasmparser to 0.65.0 wasmprinter to 0.2.12 The changes are straightforward: * new CLIF instruction `widening_pairwise_dot_product_s` * translation from wasm into `widening_pairwise_dot_product_s` * new AArch64 instructions `smull`, `smull2` (part of the `VecRRR` group) * translation from `widening_pairwise_dot_product_s` to `smull ; smull2 ; addv` There is no testcase in this commit, because that is a separate repo. The implementation has been tested, nevertheless.
This commit is contained in:
committed by
julian-seward1
parent
54a97f784e
commit
5a5fb11979
@@ -4078,6 +4078,41 @@ pub(crate) fn define(
|
||||
.operands_out(vec![a]),
|
||||
);
|
||||
|
||||
let I16x8 = &TypeVar::new(
|
||||
"I16x8",
|
||||
"A SIMD vector type containing 8 integer lanes each 16 bits wide.",
|
||||
TypeSetBuilder::new()
|
||||
.ints(16..16)
|
||||
.simd_lanes(8..8)
|
||||
.includes_scalars(false)
|
||||
.build(),
|
||||
);
|
||||
|
||||
let x = &Operand::new("x", I16x8);
|
||||
let y = &Operand::new("y", I16x8);
|
||||
let a = &Operand::new("a", &I16x8.merge_lanes());
|
||||
|
||||
ig.push(
|
||||
Inst::new(
|
||||
"widening_pairwise_dot_product_s",
|
||||
r#"
|
||||
Takes corresponding elements in `x` and `y`, performs a sign-extending length-doubling
|
||||
multiplication on them, then adds adjacent pairs of elements to form the result. For
|
||||
example, if the input vectors are `[x3, x2, x1, x0]` and `[y3, y2, y1, y0]`, it produces
|
||||
the vector `[r1, r0]`, where `r1 = sx(x3) * sx(y3) + sx(x2) * sx(y2)` and
|
||||
`r0 = sx(x1) * sx(y1) + sx(x0) * sx(y0)`, and `sx(n)` sign-extends `n` to twice its width.
|
||||
|
||||
This will double the lane width and halve the number of lanes. So the resulting
|
||||
vector has the same number of bits as `x` and `y` do (individually).
|
||||
|
||||
See https://github.com/WebAssembly/simd/pull/127 for background info.
|
||||
"#,
|
||||
&formats.binary,
|
||||
)
|
||||
.operands_in(vec![x, y])
|
||||
.operands_out(vec![a]),
|
||||
);
|
||||
|
||||
let IntTo = &TypeVar::new(
|
||||
"IntTo",
|
||||
"A larger integer type with the same number of lanes",
|
||||
|
||||
Reference in New Issue
Block a user