Commit a87c0cd1 authored by Bill Budge's avatar Bill Budge Committed by Commit Bot

[wasm simd] Eliminate impossible code paths for ARM Dup shuffle

- Dup (broadcast) shuffles are always swizzles (single operand),
  which are canonicalized to only use the first input, so we don't
  need to check the index and switch operands.

Bug: v8:6020
Change-Id: I3ef8ba8071775dfbd21c0cab3fdf24db17f496bb
Reviewed-on: https://chromium-review.googlesource.com/1129540Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Commit-Queue: Bill Budge <bbudge@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54367}
parent cab5304b
......@@ -2488,10 +2488,9 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
int index = 0;
if (TryMatch32x4Shuffle(shuffle, shuffle32x4)) {
if (TryMatchDup<4>(shuffle, &index)) {
InstructionOperand src =
index < 4 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArmS128Dup, g.DefineAsRegister(node), src, g.UseImmediate(Neon32),
g.UseImmediate(index % 4));
DCHECK_GT(4, index);
Emit(kArmS128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(Neon32), g.UseImmediate(index % 4));
} else {
Emit(kArmS32x4Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseRegister(input1), g.UseImmediate(Pack4Lanes(shuffle32x4)));
......@@ -2499,17 +2498,15 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
return;
}
if (TryMatchDup<8>(shuffle, &index)) {
InstructionOperand src =
index < 8 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArmS128Dup, g.DefineAsRegister(node), src, g.UseImmediate(Neon16),
g.UseImmediate(index % 8));
DCHECK_GT(8, index);
Emit(kArmS128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(Neon16), g.UseImmediate(index % 8));
return;
}
if (TryMatchDup<16>(shuffle, &index)) {
InstructionOperand src =
index < 16 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArmS128Dup, g.DefineAsRegister(node), src, g.UseImmediate(Neon8),
g.UseImmediate(index % 16));
DCHECK_GT(16, index);
Emit(kArmS128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(Neon8), g.UseImmediate(index % 16));
return;
}
ArchOpcode opcode;
......
......@@ -3178,10 +3178,9 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
int index = 0;
if (TryMatch32x4Shuffle(shuffle, shuffle32x4)) {
if (TryMatchDup<4>(shuffle, &index)) {
InstructionOperand src =
index < 4 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArm64S128Dup, g.DefineAsRegister(node), src, g.UseImmediate(4),
g.UseImmediate(index % 4));
DCHECK_GT(4, index);
Emit(kArm64S128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(4), g.UseImmediate(index % 4));
} else {
Emit(kArm64S32x4Shuffle, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseRegister(input1), g.UseImmediate(Pack4Lanes(shuffle32x4)));
......@@ -3189,17 +3188,15 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) {
return;
}
if (TryMatchDup<8>(shuffle, &index)) {
InstructionOperand src =
index < 8 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArm64S128Dup, g.DefineAsRegister(node), src, g.UseImmediate(8),
g.UseImmediate(index % 8));
DCHECK_GT(8, index);
Emit(kArm64S128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(8), g.UseImmediate(index % 8));
return;
}
if (TryMatchDup<16>(shuffle, &index)) {
InstructionOperand src =
index < 16 ? g.UseRegister(input0) : g.UseRegister(input1);
Emit(kArm64S128Dup, g.DefineAsRegister(node), src, g.UseImmediate(16),
g.UseImmediate(index % 16));
DCHECK_GT(16, index);
Emit(kArm64S128Dup, g.DefineAsRegister(node), g.UseRegister(input0),
g.UseImmediate(16), g.UseImmediate(index % 16));
return;
}
// Code generator uses vtbl, arrange sources to form a valid lookup table.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment