[wasm]implement simd lowering for I32x4AddHoriz
Change-Id: I7dd81c104da3296cb78688c066b24e12b8ffc6c2 Reviewed-on: https://chromium-review.googlesource.com/882952 Commit-Queue: Jing Bao <jing.bao@intel.com> Reviewed-by: Aseem Garg <aseemgarg@chromium.org> Cr-Commit-Position: refs/heads/master@{#50876}
This commit is contained in:
parent
1abeb5a3b1
commit
bbcccc1ce4
@ -85,6 +85,7 @@ void SimdScalarLowering::LowerGraph() {
|
||||
V(I32x4Shl) \
|
||||
V(I32x4ShrS) \
|
||||
V(I32x4Add) \
|
||||
V(I32x4AddHoriz) \
|
||||
V(I32x4Sub) \
|
||||
V(I32x4Mul) \
|
||||
V(I32x4MinS) \
|
||||
@ -387,14 +388,23 @@ void SimdScalarLowering::LowerStoreOp(MachineRepresentation rep, Node* node,
|
||||
}
|
||||
|
||||
void SimdScalarLowering::LowerBinaryOp(Node* node, SimdType input_rep_type,
|
||||
const Operator* op) {
|
||||
const Operator* op,
|
||||
bool not_horizontal) {
|
||||
DCHECK_EQ(2, node->InputCount());
|
||||
Node** rep_left = GetReplacementsWithType(node->InputAt(0), input_rep_type);
|
||||
Node** rep_right = GetReplacementsWithType(node->InputAt(1), input_rep_type);
|
||||
int num_lanes = NumLanes(input_rep_type);
|
||||
Node** rep_node = zone()->NewArray<Node*>(num_lanes);
|
||||
for (int i = 0; i < num_lanes; ++i) {
|
||||
rep_node[i] = graph()->NewNode(op, rep_left[i], rep_right[i]);
|
||||
if (not_horizontal) {
|
||||
for (int i = 0; i < num_lanes; ++i) {
|
||||
rep_node[i] = graph()->NewNode(op, rep_left[i], rep_right[i]);
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < num_lanes / 2; ++i) {
|
||||
rep_node[i] = graph()->NewNode(op, rep_left[i * 2], rep_left[i * 2 + 1]);
|
||||
rep_node[i + num_lanes / 2] =
|
||||
graph()->NewNode(op, rep_right[i * 2], rep_right[i * 2 + 1]);
|
||||
}
|
||||
}
|
||||
ReplaceNode(node, rep_node, num_lanes);
|
||||
}
|
||||
@ -831,6 +841,10 @@ void SimdScalarLowering::LowerNode(Node* node) {
|
||||
I32X4_BINOP_CASE(kS128Or, Word32Or)
|
||||
I32X4_BINOP_CASE(kS128Xor, Word32Xor)
|
||||
#undef I32X4_BINOP_CASE
|
||||
case IrOpcode::kI32x4AddHoriz: {
|
||||
LowerBinaryOp(node, rep_type, machine()->Int32Add(), false);
|
||||
break;
|
||||
}
|
||||
case IrOpcode::kI16x8Add:
|
||||
case IrOpcode::kI8x16Add: {
|
||||
LowerBinaryOpForSmallInt(node, rep_type, machine()->Int32Add());
|
||||
|
@ -73,7 +73,8 @@ class SimdScalarLowering {
|
||||
const Operator* load_op, SimdType type);
|
||||
void LowerStoreOp(MachineRepresentation rep, Node* node,
|
||||
const Operator* store_op, SimdType rep_type);
|
||||
void LowerBinaryOp(Node* node, SimdType input_rep_type, const Operator* op);
|
||||
void LowerBinaryOp(Node* node, SimdType input_rep_type, const Operator* op,
|
||||
bool not_horizontal = true);
|
||||
void LowerCompareOp(Node* node, SimdType input_rep_type, const Operator* op,
|
||||
bool invert_inputs = false);
|
||||
Node* FixUpperBits(Node* input, int32_t shift);
|
||||
|
@ -1613,7 +1613,7 @@ void RunBinaryLaneOpTest(
|
||||
}
|
||||
}
|
||||
|
||||
WASM_SIMD_COMPILED_TEST(I32x4AddHoriz) {
|
||||
WASM_SIMD_TEST(I32x4AddHoriz) {
|
||||
RunBinaryLaneOpTest<int32_t>(lower_simd, kExprI32x4AddHoriz, {{1, 5, 9, 13}});
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user