< prev index next >
src/cpu/x86/vm/macroAssembler_x86.cpp
Print this page
@@ -4143,21 +4143,26 @@
} 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) {
+ } else {
+ if (src_enc != dst_enc) {
movdqu(src, xmm0);
- vandps(xmm0, nds, negate_field, vector_len);
+ movss(xmm0, nds);
+ vandps(xmm0, xmm0, negate_field, vector_len);
movss(dst, xmm0);
movdqu(xmm0, src);
} else {
- movdqu(src, xmm0);
+ subptr(rsp, 64);
+ evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
movss(xmm0, nds);
vandps(xmm0, xmm0, negate_field, vector_len);
movss(dst, xmm0);
- movdqu(xmm0, src);
+ 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,21 +4180,26 @@
} 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) {
+ } else {
+ if (src_enc != dst_enc) {
movdqu(src, xmm0);
- vandpd(xmm0, nds, negate_field, vector_len);
+ movsd(xmm0, nds);
+ vandpd(xmm0, xmm0, negate_field, vector_len);
movsd(dst, xmm0);
movdqu(xmm0, src);
} else {
- movdqu(src, xmm0);
+ subptr(rsp, 64);
+ evmovdqul(Address(rsp, 0), xmm0, Assembler::AVX_512bit);
movsd(xmm0, nds);
vandpd(xmm0, xmm0, negate_field, vector_len);
movsd(dst, xmm0);
- movdqu(xmm0, src);
+ 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,10 +4942,29 @@
} 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 >