--- a/src/hotspot/cpu/x86/vm_version_x86.cpp Tue Nov 26 19:18:07 2019 +0300
+++ b/src/hotspot/cpu/x86/vm_version_x86.cpp Tue Nov 26 19:19:39 2019 +0300
@@ -367,26 +367,29 @@
//
intx saved_useavx = UseAVX;
intx saved_usesse = UseSSE;
- // check _cpuid_info.sef_cpuid7_ebx.bits.avx512f
- __ lea(rsi, Address(rbp, in_bytes(VM_Version::sef_cpuid7_offset())));
- __ movl(rax, 0x10000);
- __ andl(rax, Address(rsi, 4)); // xcr0 bits sse | ymm
- __ cmpl(rax, 0x10000);
- __ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported
- // check _cpuid_info.xem_xcr0_eax.bits.opmask
- // check _cpuid_info.xem_xcr0_eax.bits.zmm512
- // check _cpuid_info.xem_xcr0_eax.bits.zmm32
- __ movl(rax, 0xE0);
- __ andl(rax, Address(rbp, in_bytes(VM_Version::xem_xcr0_offset()))); // xcr0 bits sse | ymm
- __ cmpl(rax, 0xE0);
- __ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported
- __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
- __ movl(rax, Address(rsi, 0));
- __ cmpl(rax, 0x50654); // If it is Skylake
- __ jcc(Assembler::equal, legacy_setup);
// If UseAVX is unitialized or is set by the user to include EVEX
if (use_evex) {
+ // check _cpuid_info.sef_cpuid7_ebx.bits.avx512f
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::sef_cpuid7_offset())));
+ __ movl(rax, 0x10000);
+ __ andl(rax, Address(rsi, 4)); // xcr0 bits sse | ymm
+ __ cmpl(rax, 0x10000);
+ __ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported
+ // check _cpuid_info.xem_xcr0_eax.bits.opmask
+ // check _cpuid_info.xem_xcr0_eax.bits.zmm512
+ // check _cpuid_info.xem_xcr0_eax.bits.zmm32
+ __ movl(rax, 0xE0);
+ __ andl(rax, Address(rbp, in_bytes(VM_Version::xem_xcr0_offset()))); // xcr0 bits sse | ymm
+ __ cmpl(rax, 0xE0);
+ __ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported
+
+ if (FLAG_IS_DEFAULT(UseAVX)) {
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
+ __ movl(rax, Address(rsi, 0));
+ __ cmpl(rax, 0x50654); // If it is Skylake
+ __ jcc(Assembler::equal, legacy_setup);
+ }
// EVEX setup: run in lowest evex mode
VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts
UseAVX = 3;
@@ -455,27 +458,28 @@
VM_Version::set_cpuinfo_cont_addr(__ pc());
// Returns here after signal. Save xmm0 to check it later.
- // check _cpuid_info.sef_cpuid7_ebx.bits.avx512f
- __ lea(rsi, Address(rbp, in_bytes(VM_Version::sef_cpuid7_offset())));
- __ movl(rax, 0x10000);
- __ andl(rax, Address(rsi, 4));
- __ cmpl(rax, 0x10000);
- __ jcc(Assembler::notEqual, legacy_save_restore);
- // check _cpuid_info.xem_xcr0_eax.bits.opmask
- // check _cpuid_info.xem_xcr0_eax.bits.zmm512
- // check _cpuid_info.xem_xcr0_eax.bits.zmm32
- __ movl(rax, 0xE0);
- __ andl(rax, Address(rbp, in_bytes(VM_Version::xem_xcr0_offset()))); // xcr0 bits sse | ymm
- __ cmpl(rax, 0xE0);
- __ jcc(Assembler::notEqual, legacy_save_restore);
-
- __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
- __ movl(rax, Address(rsi, 0));
- __ cmpl(rax, 0x50654); // If it is Skylake
- __ jcc(Assembler::equal, legacy_save_restore);
-
// If UseAVX is unitialized or is set by the user to include EVEX
if (use_evex) {
+ // check _cpuid_info.sef_cpuid7_ebx.bits.avx512f
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::sef_cpuid7_offset())));
+ __ movl(rax, 0x10000);
+ __ andl(rax, Address(rsi, 4));
+ __ cmpl(rax, 0x10000);
+ __ jcc(Assembler::notEqual, legacy_save_restore);
+ // check _cpuid_info.xem_xcr0_eax.bits.opmask
+ // check _cpuid_info.xem_xcr0_eax.bits.zmm512
+ // check _cpuid_info.xem_xcr0_eax.bits.zmm32
+ __ movl(rax, 0xE0);
+ __ andl(rax, Address(rbp, in_bytes(VM_Version::xem_xcr0_offset()))); // xcr0 bits sse | ymm
+ __ cmpl(rax, 0xE0);
+ __ jcc(Assembler::notEqual, legacy_save_restore);
+
+ if (FLAG_IS_DEFAULT(UseAVX)) {
+ __ lea(rsi, Address(rbp, in_bytes(VM_Version::std_cpuid1_offset())));
+ __ movl(rax, Address(rsi, 0));
+ __ cmpl(rax, 0x50654); // If it is Skylake
+ __ jcc(Assembler::equal, legacy_save_restore);
+ }
// EVEX check: run in lowest evex mode
VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts
UseAVX = 3;