< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page

        

*** 4143,4163 **** } else if (dst_enc < 16) { movdqu(src, xmm0); movss(xmm0, nds); vandps(dst, xmm0, negate_field, vector_len); movdqu(xmm0, src); ! } else if (nds_enc < 16) { movdqu(src, xmm0); ! vandps(xmm0, nds, negate_field, vector_len); movss(dst, xmm0); movdqu(xmm0, src); } else { ! movdqu(src, xmm0); movss(xmm0, nds); vandps(xmm0, xmm0, negate_field, vector_len); movss(dst, xmm0); ! movdqu(xmm0, src); } } void MacroAssembler::vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len) { int dst_enc = dst->encoding(); --- 4143,4168 ---- } else if (dst_enc < 16) { movdqu(src, xmm0); movss(xmm0, nds); vandps(dst, xmm0, negate_field, vector_len); movdqu(xmm0, src); ! } else { ! if (src_enc != dst_enc) { movdqu(src, xmm0); ! movss(xmm0, nds); ! vandps(xmm0, xmm0, negate_field, vector_len); movss(dst, xmm0); movdqu(xmm0, src); } else { ! subptr(rsp, 64); ! evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit); movss(xmm0, nds); vandps(xmm0, xmm0, negate_field, vector_len); movss(dst, xmm0); ! evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit); ! addptr(rsp, 64); ! } } } void MacroAssembler::vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len) { int dst_enc = dst->encoding();
*** 4175,4195 **** } else if (dst_enc < 16) { movdqu(src, xmm0); movsd(xmm0, nds); vandpd(dst, xmm0, negate_field, vector_len); movdqu(xmm0, src); ! } else if (nds_enc < 16) { movdqu(src, xmm0); ! vandpd(xmm0, nds, negate_field, vector_len); movsd(dst, xmm0); movdqu(xmm0, src); } else { ! movdqu(src, xmm0); movsd(xmm0, nds); vandpd(xmm0, xmm0, negate_field, vector_len); movsd(dst, xmm0); ! movdqu(xmm0, src); } } void MacroAssembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { int dst_enc = dst->encoding(); --- 4180,4205 ---- } else if (dst_enc < 16) { movdqu(src, xmm0); movsd(xmm0, nds); vandpd(dst, xmm0, negate_field, vector_len); movdqu(xmm0, src); ! } else { ! if (src_enc != dst_enc) { movdqu(src, xmm0); ! movsd(xmm0, nds); ! vandpd(xmm0, xmm0, negate_field, vector_len); movsd(dst, xmm0); movdqu(xmm0, src); } else { ! subptr(rsp, 64); ! evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit); movsd(xmm0, nds); vandpd(xmm0, xmm0, negate_field, vector_len); movsd(dst, xmm0); ! evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit); ! addptr(rsp, 64); ! } } } void MacroAssembler::vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { int dst_enc = dst->encoding();
*** 4932,4941 **** --- 4942,4970 ---- } else { Assembler::punpcklbw(dst, src); } } + void MacroAssembler::pshufd(XMMRegister dst, Address src, int mode) { + if (VM_Version::supports_avx512vl()) { + Assembler::pshufd(dst, src, mode); + } else { + int dst_enc = dst->encoding(); + if (dst_enc < 16) { + Assembler::pshufd(dst, src, mode); + } else { + subptr(rsp, 64); + evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit); + evmovdqul(xmm0, dst, Assembler::AVX_512bit); + Assembler::pshufd(xmm0, src, mode); + movdqu(dst, xmm0); + evmovdqul(xmm0, Address(rsp, 0), Assembler::AVX_512bit); + addptr(rsp, 64); + } + } + } + // This instruction exists within macros, ergo we cannot control its input // when emitted through those patterns. void MacroAssembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) { if (VM_Version::supports_avx512nobw()) { int dst_enc = dst->encoding();
< prev index next >