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