Add DerivedFunction for doubling lane widths and halving the number of lanes (i.e. merging)

Certain operations (e.g. widening) will have operands with types like `NxM` but will return results with types like `(N*2)x(M/2)` (double the lane width, halve the number of lanes; maintain the same number of vector bits). This is equivalent to applying two `DerivedFunction`s to the type: `DerivedFunction::DoubleWidth` then `DerivedFunction::HalfVector`. Since there is no easy way to apply multiple `DerivedFunction`s (e.g. most of the logic is one-level deep, 1d5a678124/cranelift/codegen/meta/src/gen_inst.rs (L618-L621)), I added `DerivedFunction::MergeLanes` to do the necessary type conversion.
This commit is contained in:
Andrew Brown
2020-07-07 13:37:37 -07:00
parent 12a31c88d7
commit 0e5e8a62c8
3 changed files with 48 additions and 2 deletions

View File

@@ -584,6 +584,9 @@ enum OperandConstraint {
/// This operand is `ctrlType.split_lanes()`.
SplitLanes,
/// This operand is `ctrlType.merge_lanes()`.
MergeLanes,
}
impl OperandConstraint {
@@ -615,6 +618,11 @@ impl OperandConstraint {
.split_lanes()
.expect("invalid type for split_lanes"),
),
MergeLanes => Bound(
ctrl_type
.merge_lanes()
.expect("invalid type for merge_lanes"),
),
}
}
}