Skip to content

Commit 516b5d3

Browse files
ngzhianCommit Bot
authored andcommitted
Merged: [wasm-simd][x64] Check for register when emitting shuffles
Some shuffles take have either register or memory operand for second input, but the codegen incorrectly assumes that it is always a register. Bug: v8:10824 (cherry picked from commit ddf30be) Change-Id: I897c4290a8b91ff2ab839e98b16a9696c0bae511 No-Try: true No-Presubmit: true No-Tree-Checks: true Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2391280 Reviewed-by: Bill Budge <[email protected]> Commit-Queue: Zhi An Ng <[email protected]> Cr-Commit-Position: refs/branch-heads/8.6@{#6} Cr-Branched-From: a64aed2-refs/heads/8.6.395@{#1} Cr-Branched-From: a626bc0-refs/heads/master@{#69472}
1 parent 58073be commit 516b5d3

3 files changed

Lines changed: 13 additions & 4 deletions

File tree

src/codegen/x64/assembler-x64.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,6 +1646,10 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
16461646
vinstr(0x0F, dst, src1, src2, k66, k0F3A, kWIG);
16471647
emit(imm8);
16481648
}
1649+
void vpalignr(XMMRegister dst, XMMRegister src1, Operand src2, uint8_t imm8) {
1650+
vinstr(0x0F, dst, src1, src2, k66, k0F3A, kWIG);
1651+
emit(imm8);
1652+
}
16491653

16501654
void vps(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2);
16511655
void vps(byte op, XMMRegister dst, XMMRegister src1, Operand src2);

src/compiler/backend/x64/code-generator-x64.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -667,10 +667,14 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen,
667667
ASSEMBLE_SIMD_INSTR(opcode, dst, input_index); \
668668
} while (false)
669669

670-
#define ASSEMBLE_SIMD_IMM_SHUFFLE(opcode, imm) \
671-
do { \
672-
DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0)); \
673-
__ opcode(i.OutputSimd128Register(), i.InputSimd128Register(1), imm); \
670+
#define ASSEMBLE_SIMD_IMM_SHUFFLE(opcode, imm) \
671+
do { \
672+
DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0)); \
673+
if (instr->InputAt(1)->IsSimd128Register()) { \
674+
__ opcode(i.OutputSimd128Register(), i.InputSimd128Register(1), imm); \
675+
} else { \
676+
__ opcode(i.OutputSimd128Register(), i.InputOperand(1), imm); \
677+
} \
674678
} while (false)
675679

676680
#define ASSEMBLE_SIMD_ALL_TRUE(opcode) \

test/cctest/test-disasm-x64.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,7 @@ TEST(DisasmX64) {
817817
__ vpblendw(xmm1, xmm2, xmm3, 23);
818818
__ vpblendw(xmm1, xmm2, Operand(rbx, rcx, times_4, 10000), 23);
819819
__ vpalignr(xmm1, xmm2, xmm3, 4);
820+
__ vpalignr(xmm1, xmm2, Operand(rbx, rcx, times_4, 10000), 4);
820821

821822
__ vblendvpd(xmm1, xmm2, xmm3, xmm4);
822823

0 commit comments

Comments
 (0)