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