Skip to content

Commit ed3eeda

Browse files
ngzhianCommit Bot
authored andcommitted
Merged: [ia32][wasm-simd] Fix aligned moves in codegen
For SIMD instructions that use aligned moves (like movaps or movapd), we don't have correct memory alignment for SIMD moves yet. Switch to to movupd. [email protected],[email protected] Bug: v8:9198 Bug: v8:10831 Bug: chromium:1134039 (cherry picked from commit ab23ff3) Change-Id: Icc038b4a32364b8bc66b723403ccc11f954b080d No-Try: true No-Presubmit: true No-Tree-Checks: true Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2469600 Commit-Queue: Zhi An Ng <[email protected]> Reviewed-by: Zhi An Ng <[email protected]> Cr-Commit-Position: refs/branch-heads/8.6@{#30} Cr-Branched-From: a64aed2-refs/heads/8.6.395@{#1} Cr-Branched-From: a626bc0-refs/heads/master@{#69472}
1 parent 69eb682 commit ed3eeda

5 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/codegen/ia32/assembler-ia32.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,9 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
963963
void movapd(XMMRegister dst, Operand src) {
964964
sse2_instr(dst, src, 0x66, 0x0F, 0x28);
965965
}
966+
void movupd(XMMRegister dst, Operand src) {
967+
sse2_instr(dst, src, 0x66, 0x0F, 0x10);
968+
}
966969

967970
void movmskpd(Register dst, XMMRegister src);
968971
void movmskps(Register dst, XMMRegister src);
@@ -1338,6 +1341,7 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
13381341
void vmovapd(XMMRegister dst, Operand src) { vpd(0x28, dst, xmm0, src); }
13391342
void vmovups(XMMRegister dst, XMMRegister src) { vmovups(dst, Operand(src)); }
13401343
void vmovups(XMMRegister dst, Operand src) { vps(0x10, dst, xmm0, src); }
1344+
void vmovupd(XMMRegister dst, Operand src) { vpd(0x10, dst, xmm0, src); }
13411345
void vshufps(XMMRegister dst, XMMRegister src1, XMMRegister src2, byte imm8) {
13421346
vshufps(dst, src1, Operand(src2), imm8);
13431347
}

src/codegen/ia32/macro-assembler-ia32.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
294294
AVX_OP2_WITH_TYPE(Movaps, movaps, XMMRegister, XMMRegister)
295295
AVX_OP2_WITH_TYPE(Movapd, movapd, XMMRegister, XMMRegister)
296296
AVX_OP2_WITH_TYPE(Movapd, movapd, XMMRegister, const Operand&)
297+
AVX_OP2_WITH_TYPE(Movupd, movupd, XMMRegister, const Operand&)
297298
AVX_OP2_WITH_TYPE(Pmovmskb, pmovmskb, Register, XMMRegister)
298299
AVX_OP2_WITH_TYPE(Movmskps, movmskps, Register, XMMRegister)
299300

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1968,7 +1968,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
19681968
tmp = i.TempSimd128Register(0);
19691969
// The minpd instruction doesn't propagate NaNs and +0's in its first
19701970
// operand. Perform minpd in both orders, merge the resuls, and adjust.
1971-
__ Movapd(tmp, src1);
1971+
__ Movupd(tmp, src1);
19721972
__ Minpd(tmp, tmp, src);
19731973
__ Minpd(dst, src, src1);
19741974
// propagate -0's and NaNs, which may be non-canonical.
@@ -1987,7 +1987,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
19871987
tmp = i.TempSimd128Register(0);
19881988
// The maxpd instruction doesn't propagate NaNs and +0's in its first
19891989
// operand. Perform maxpd in both orders, merge the resuls, and adjust.
1990-
__ Movapd(tmp, src1);
1990+
__ Movupd(tmp, src1);
19911991
__ Maxpd(tmp, tmp, src);
19921992
__ Maxpd(dst, src, src1);
19931993
// Find discrepancies.
@@ -2383,7 +2383,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
23832383
XMMRegister dst = i.OutputSimd128Register();
23842384
Operand src1 = i.InputOperand(1);
23852385
// See comment above for correction of maxps.
2386-
__ movaps(kScratchDoubleReg, src1);
2386+
__ vmovups(kScratchDoubleReg, src1);
23872387
__ vmaxps(kScratchDoubleReg, kScratchDoubleReg, dst);
23882388
__ vmaxps(dst, dst, src1);
23892389
__ vxorps(dst, dst, kScratchDoubleReg);

src/diagnostics/ia32/disasm-ia32.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,10 @@ int DisassemblerIA32::AVXInstruction(byte* data) {
11731173
int mod, regop, rm, vvvv = vex_vreg();
11741174
get_modrm(*current, &mod, &regop, &rm);
11751175
switch (opcode) {
1176+
case 0x10:
1177+
AppendToBuffer("vmovupd %s,", NameOfXMMRegister(regop));
1178+
current += PrintRightXMMOperand(current);
1179+
break;
11761180
case 0x28:
11771181
AppendToBuffer("vmovapd %s,", NameOfXMMRegister(regop));
11781182
current += PrintRightXMMOperand(current);
@@ -2108,7 +2112,13 @@ int DisassemblerIA32::InstructionDecode(v8::internal::Vector<char> out_buffer,
21082112
data += 2;
21092113
} else if (*data == 0x0F) {
21102114
data++;
2111-
if (*data == 0x28) {
2115+
if (*data == 0x10) {
2116+
data++;
2117+
int mod, regop, rm;
2118+
get_modrm(*data, &mod, &regop, &rm);
2119+
AppendToBuffer("movupd %s,", NameOfXMMRegister(regop));
2120+
data += PrintRightXMMOperand(data);
2121+
} else if (*data == 0x28) {
21122122
data++;
21132123
int mod, regop, rm;
21142124
get_modrm(*data, &mod, &regop, &rm);

test/cctest/test-disasm-ia32.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ TEST(DisasmIa320) {
473473

474474
__ movapd(xmm0, xmm1);
475475
__ movapd(xmm0, Operand(edx, 4));
476+
__ movupd(xmm0, Operand(edx, 4));
476477

477478
__ movd(xmm0, edi);
478479
__ movd(xmm0, Operand(ebx, ecx, times_4, 10000));
@@ -689,6 +690,7 @@ TEST(DisasmIa320) {
689690
__ vmovaps(xmm0, xmm1);
690691
__ vmovapd(xmm0, xmm1);
691692
__ vmovapd(xmm0, Operand(ebx, ecx, times_4, 10000));
693+
__ vmovupd(xmm0, Operand(ebx, ecx, times_4, 10000));
692694
__ vshufps(xmm0, xmm1, xmm2, 3);
693695
__ vshufps(xmm0, xmm1, Operand(edx, 4), 3);
694696
__ vhaddps(xmm0, xmm1, xmm2);

0 commit comments

Comments
 (0)