< 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 >