< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page

        

@@ -3398,10 +3398,36 @@
     lea(rscratch1, src);
     movq(dst, Address(rscratch1, 0));
   }
 }
 
+// AVX512 masks used for fixup loops
+jushort evex_simd_mask_table[] =
+{
+  0xffff, 0x0001, 0x0003, 0x0007, 0x000f,
+  0x001f, 0x003f, 0x007f, 0x00ff, 0x01ff,
+  0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff,
+  0x7fff
+};
+
+void MacroAssembler::createmsk(Register dst, Register src) {
+  ExternalAddress mask_table((address)evex_simd_mask_table);
+  lea(dst, mask_table);
+  Assembler::kmovwl(k1, Address(dst, src, Address::times_2, 0));
+  Assembler::movl(dst, src);
+}
+
+void MacroAssembler::restoremsk() {
+  ExternalAddress mask_table((address)evex_simd_mask_table);
+  if (reachable(mask_table)) {
+    Assembler::kmovwl(k1, as_Address(mask_table));
+  } else {
+    lea(rscratch1, mask_table);
+    Assembler::kmovwl(k1, Address(rscratch1, 0));
+  }
+}
+
 void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
   if (reachable(src)) {
     if (UseXmmLoadAndClearUpper) {
       movsd (dst, as_Address(src));
     } else {
< prev index next >