--- old/src/cpu/x86/vm/vm_version_x86.cpp 2016-11-18 22:35:30.299285100 -0800 +++ new/src/cpu/x86/vm/vm_version_x86.cpp 2016-11-18 22:35:29.949285100 -0800 @@ -358,36 +358,39 @@ __ cmpl(rax, 0xE0); __ jccb(Assembler::notEqual, legacy_setup); // jump if EVEX is not supported - // EVEX setup: run in lowest evex mode - VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts - UseAVX = 3; - UseSSE = 2; + // If UseAVX is unitialized or is set by the user to include EVEX + if ((saved_useavx == 99) || (saved_useavx > 2)) { + // EVEX setup: run in lowest evex mode + VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts + UseAVX = 3; + UseSSE = 2; #ifdef _WINDOWS - // xmm5-xmm15 are not preserved by caller on windows - // https://msdn.microsoft.com/en-us/library/9z1stfyw.aspx - __ subptr(rsp, 64); - __ evmovdqul(Address(rsp, 0), xmm7, Assembler::AVX_512bit); -#ifdef _LP64 - __ subptr(rsp, 64); - __ evmovdqul(Address(rsp, 0), xmm8, Assembler::AVX_512bit); - __ subptr(rsp, 64); - __ evmovdqul(Address(rsp, 0), xmm31, Assembler::AVX_512bit); + // xmm5-xmm15 are not preserved by caller on windows + // https://msdn.microsoft.com/en-us/library/9z1stfyw.aspx + __ subptr(rsp, 64); + __ evmovdqul(Address(rsp, 0), xmm7, Assembler::AVX_512bit); +#ifdef _LP64 + __ subptr(rsp, 64); + __ evmovdqul(Address(rsp, 0), xmm8, Assembler::AVX_512bit); + __ subptr(rsp, 64); + __ evmovdqul(Address(rsp, 0), xmm31, Assembler::AVX_512bit); #endif // _LP64 #endif // _WINDOWS - // load value into all 64 bytes of zmm7 register - __ movl(rcx, VM_Version::ymm_test_value()); - __ movdl(xmm0, rcx); - __ movl(rcx, 0xffff); - __ kmovwl(k1, rcx); - __ evpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit); - __ evmovdqul(xmm7, xmm0, Assembler::AVX_512bit); + // load value into all 64 bytes of zmm7 register + __ movl(rcx, VM_Version::ymm_test_value()); + __ movdl(xmm0, rcx); + __ movl(rcx, 0xffff); + __ kmovwl(k1, rcx); + __ evpbroadcastd(xmm0, xmm0, Assembler::AVX_512bit); + __ evmovdqul(xmm7, xmm0, Assembler::AVX_512bit); #ifdef _LP64 - __ evmovdqul(xmm8, xmm0, Assembler::AVX_512bit); - __ evmovdqul(xmm31, xmm0, Assembler::AVX_512bit); + __ evmovdqul(xmm8, xmm0, Assembler::AVX_512bit); + __ evmovdqul(xmm31, xmm0, Assembler::AVX_512bit); #endif - VM_Version::clean_cpuFeatures(); - __ jmp(save_restore_except); + VM_Version::clean_cpuFeatures(); + __ jmp(save_restore_except); + } __ bind(legacy_setup); // AVX setup @@ -441,32 +444,35 @@ __ cmpl(rax, 0xE0); __ jccb(Assembler::notEqual, legacy_save_restore); - // EVEX check: run in lowest evex mode - VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts - UseAVX = 3; - UseSSE = 2; - __ lea(rsi, Address(rbp, in_bytes(VM_Version::zmm_save_offset()))); - __ evmovdqul(Address(rsi, 0), xmm0, Assembler::AVX_512bit); - __ evmovdqul(Address(rsi, 64), xmm7, Assembler::AVX_512bit); + // If UseAVX is unitialized or is set by the user to include EVEX + if ((saved_useavx == 99) || (saved_useavx > 2)) { + // EVEX check: run in lowest evex mode + VM_Version::set_evex_cpuFeatures(); // Enable temporary to pass asserts + UseAVX = 3; + UseSSE = 2; + __ lea(rsi, Address(rbp, in_bytes(VM_Version::zmm_save_offset()))); + __ evmovdqul(Address(rsi, 0), xmm0, Assembler::AVX_512bit); + __ evmovdqul(Address(rsi, 64), xmm7, Assembler::AVX_512bit); #ifdef _LP64 - __ evmovdqul(Address(rsi, 128), xmm8, Assembler::AVX_512bit); - __ evmovdqul(Address(rsi, 192), xmm31, Assembler::AVX_512bit); + __ evmovdqul(Address(rsi, 128), xmm8, Assembler::AVX_512bit); + __ evmovdqul(Address(rsi, 192), xmm31, Assembler::AVX_512bit); #endif #ifdef _WINDOWS #ifdef _LP64 - __ evmovdqul(xmm31, Address(rsp, 0), Assembler::AVX_512bit); - __ addptr(rsp, 64); - __ evmovdqul(xmm8, Address(rsp, 0), Assembler::AVX_512bit); - __ addptr(rsp, 64); + __ evmovdqul(xmm31, Address(rsp, 0), Assembler::AVX_512bit); + __ addptr(rsp, 64); + __ evmovdqul(xmm8, Address(rsp, 0), Assembler::AVX_512bit); + __ addptr(rsp, 64); #endif // _LP64 - __ evmovdqul(xmm7, Address(rsp, 0), Assembler::AVX_512bit); - __ addptr(rsp, 64); + __ evmovdqul(xmm7, Address(rsp, 0), Assembler::AVX_512bit); + __ addptr(rsp, 64); #endif // _WINDOWS - VM_Version::clean_cpuFeatures(); - UseAVX = saved_useavx; - UseSSE = saved_usesse; - __ jmp(wrapup); + VM_Version::clean_cpuFeatures(); + UseAVX = saved_useavx; + UseSSE = saved_usesse; + __ jmp(wrapup); + } __ bind(legacy_save_restore); // AVX check