Commit ed7e3de9 authored by Yolanda Chen's avatar Yolanda Chen Committed by V8 LUCI CQ

[x64] Implement 256-bit assembly for vhaddps

Bug: v8:12228
Change-Id: Ie1f569c450f84a862c754b844e36349b1533872d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3194633Reviewed-by: 's avatarZhi An Ng <zhin@chromium.org>
Commit-Queue: Yolanda Chen <yolanda.chen@intel.com>
Cr-Commit-Position: refs/heads/main@{#77202}
parent a5692811
...@@ -1378,15 +1378,16 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { ...@@ -1378,15 +1378,16 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
SSE_BINOP_INSTRUCTION_LIST(AVX_SSE_BINOP) SSE_BINOP_INSTRUCTION_LIST(AVX_SSE_BINOP)
#undef AVX_SSE_BINOP #undef AVX_SSE_BINOP
#define AVX_3(instr, opcode, impl) \ #define AVX_3(instr, opcode, impl, SIMDRegister) \
void instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ void instr(SIMDRegister dst, SIMDRegister src1, SIMDRegister src2) { \
impl(opcode, dst, src1, src2); \ impl(opcode, dst, src1, src2); \
} \ } \
void instr(XMMRegister dst, XMMRegister src1, Operand src2) { \ void instr(SIMDRegister dst, SIMDRegister src1, Operand src2) { \
impl(opcode, dst, src1, src2); \ impl(opcode, dst, src1, src2); \
} }
AVX_3(vhaddps, 0x7c, vsd) AVX_3(vhaddps, 0x7c, vsd, XMMRegister)
AVX_3(vhaddps, 0x7c, vsd, YMMRegister)
#define AVX_SCALAR(instr, prefix, escape, opcode) \ #define AVX_SCALAR(instr, prefix, escape, opcode) \
void v##instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \ void v##instr(XMMRegister dst, XMMRegister src1, XMMRegister src2) { \
...@@ -1513,11 +1514,9 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { ...@@ -1513,11 +1514,9 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. emit(static_cast<byte>(mode) | 0x8); // Mask precision exception.
} }
void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2) { template <typename Reg, typename Op>
vinstr(op, dst, src1, src2, kF2, k0F, kWIG); void vsd(byte op, Reg dst, Reg src1, Op src2) {
} vinstr(op, dst, src1, src2, kF2, k0F, kWIG, AVX);
void vsd(byte op, XMMRegister dst, XMMRegister src1, Operand src2) {
vinstr(op, dst, src1, src2, kF2, k0F, kWIG);
} }
void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) { void vmovss(XMMRegister dst, XMMRegister src1, XMMRegister src2) {
......
...@@ -2629,6 +2629,8 @@ TEST(AssemblerX64FloatingPoint256bit) { ...@@ -2629,6 +2629,8 @@ TEST(AssemblerX64FloatingPoint256bit) {
__ vsubps(ymm10, ymm11, ymm12); __ vsubps(ymm10, ymm11, ymm12);
__ vroundps(ymm9, ymm2, kRoundUp); __ vroundps(ymm9, ymm2, kRoundUp);
__ vroundpd(ymm9, ymm2, kRoundToNearest); __ vroundpd(ymm9, ymm2, kRoundToNearest);
__ vhaddps(ymm1, ymm2, ymm3);
__ vhaddps(ymm0, ymm1, Operand(rbx, rcx, times_4, 10000));
CodeDesc desc; CodeDesc desc;
masm.GetCode(isolate, &desc); masm.GetCode(isolate, &desc);
...@@ -2648,7 +2650,11 @@ TEST(AssemblerX64FloatingPoint256bit) { ...@@ -2648,7 +2650,11 @@ TEST(AssemblerX64FloatingPoint256bit) {
// vroundps ymm9, ymm2, 0xA // vroundps ymm9, ymm2, 0xA
0xC4, 0x63, 0x7D, 0x08, 0xCA, 0x0A, 0xC4, 0x63, 0x7D, 0x08, 0xCA, 0x0A,
// vroundpd ymm9, ymm2, 0x8 // vroundpd ymm9, ymm2, 0x8
0xC4, 0x63, 0x7D, 0x09, 0xCA, 0x08}; 0xC4, 0x63, 0x7D, 0x09, 0xCA, 0x08,
// VHADDPS ymm1, ymm2, ymm3
0xC5, 0xEF, 0x7C, 0xCB,
// VHADDPS ymm0, ymm1, YMMWORD PTR [rbx+rcx*4+0x2710]
0xc5, 0xf7, 0x7c, 0x84, 0x8b, 0x10, 0x27, 0x00, 0x00};
CHECK_EQ(0, memcmp(expected, desc.buffer, sizeof(expected))); CHECK_EQ(0, memcmp(expected, desc.buffer, sizeof(expected)));
} }
......
...@@ -349,6 +349,8 @@ TEST(DisasmX64) { ...@@ -349,6 +349,8 @@ TEST(DisasmX64) {
__ vxorps(xmm0, xmm1, Operand(rbx, rcx, times_4, 10000)); __ vxorps(xmm0, xmm1, Operand(rbx, rcx, times_4, 10000));
__ vhaddps(xmm0, xmm1, xmm9); __ vhaddps(xmm0, xmm1, xmm9);
__ vhaddps(xmm0, xmm1, Operand(rbx, rcx, times_4, 10000)); __ vhaddps(xmm0, xmm1, Operand(rbx, rcx, times_4, 10000));
__ vhaddps(ymm0, ymm1, ymm2);
__ vhaddps(ymm0, ymm1, Operand(rbx, rcx, times_4, 10000));
__ vpcmpeqd(xmm0, xmm15, xmm5); __ vpcmpeqd(xmm0, xmm15, xmm5);
__ vpcmpeqd(xmm15, xmm0, Operand(rbx, rcx, times_4, 10000)); __ vpcmpeqd(xmm15, xmm0, Operand(rbx, rcx, times_4, 10000));
...@@ -699,6 +701,8 @@ struct DisassemblerTester { ...@@ -699,6 +701,8 @@ struct DisassemblerTester {
int pc_offset() { return assm_.pc_offset(); } int pc_offset() { return assm_.pc_offset(); }
Assembler* assm() { return &assm_; }
v8::internal::byte buffer_[kAssemblerBufferSize]; v8::internal::byte buffer_[kAssemblerBufferSize];
Assembler assm_; Assembler assm_;
disasm::NameConverter converter_; disasm::NameConverter converter_;
...@@ -1223,27 +1227,15 @@ UNINITIALIZED_TEST(DisasmX64CheckOutputSSE2) { ...@@ -1223,27 +1227,15 @@ UNINITIALIZED_TEST(DisasmX64CheckOutputSSE2) {
UNINITIALIZED_TEST(DisasmX64YMMRegister) { UNINITIALIZED_TEST(DisasmX64YMMRegister) {
if (!CpuFeatures::IsSupported(AVX)) return; if (!CpuFeatures::IsSupported(AVX)) return;
v8::internal::byte buffer[8192]; DisassemblerTester t;
Assembler assm(AssemblerOptions{}, CpuFeatureScope fscope(t.assm(), AVX);
ExternalAssemblerBuffer(buffer, sizeof buffer));
CpuFeatureScope fscope(&assm, AVX);
__ vmovdqa(ymm0, ymm1);
base::Vector<char> actual = base::Vector<char>::New(37);
disasm::NameConverter converter;
disasm::Disassembler disassembler(converter);
disassembler.InstructionDecode(actual, buffer);
#ifdef OBJECT_PRINT
fprintf(stdout, "Disassembled buffer: %s\n", actual.begin());
#endif
base::Vector<const char> expected =
base::StaticCharVector("c5fd6fc1 vmovdqa ymm0,ymm1\0");
CHECK_EQ(expected, actual);
actual.Dispose(); // Short immediate instructions
COMPARE("c5fd6fc1 vmovdqa ymm0,ymm1", vmovdqa(ymm0, ymm1));
COMPARE("c5f77cc2 vhaddps ymm0,ymm1,ymm2",
vhaddps(ymm0, ymm1, ymm2));
COMPARE("c5f77c848b10270000 vhaddps ymm0,ymm1,[rbx+rcx*4+0x2710]",
vhaddps(ymm0, ymm1, Operand(rbx, rcx, times_4, 10000)));
} }
#undef __ #undef __
......
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