[PATCH]: Add Hygon Dhyana support
Jinke Fan
fanjinke at hygon.cn
Sat Feb 16 05:18:27 UTC 2019
Hello All,
This patch is used to support Hygon Dhyana x86 vendor id (HygonGenuine).
As Hygon Dhyana share most architecture feature as AMD Family 17h, the
patch adds Hygon CPU Vendor ID to check for reused AMD code paths.
Background:
Chengdu Haiguang IC Design Co., Ltd (Hygon) is a Joint Venture
between AMD and Haiguang Information Technology Co.,Ltd., aims at
providing high performance x86 processor for China server market.
Its first generation processor codename is Dhyana, which
originates from AMD technology and shares most of the
architecture with AMD's family 17h, but with different CPU Vendor
ID("HygonGenuine")/Family series number(Family 18h).
The patch is based on the original repository:
hg.openjdk.java.net/jdk/jdk
changeset: 53783:72709e703abd
tag: tip
user: mbalao
date: Fri Feb 15 11:46:15 2019 -0300
summary: 8219011: Implement MacroAssembler::warn method on AArch64
Please help me with the commit process.
Thank you very much!
*patch
Webrev:
https://fjkbo.github.io/openjdk/webrev/index.html
The output of hg diff -g:
diff --git a/src/hotspot/cpu/x86/assembler_x86.cpp
b/src/hotspot/cpu/x86/assembler_x86.cpp
--- a/src/hotspot/cpu/x86/assembler_x86.cpp
+++ b/src/hotspot/cpu/x86/assembler_x86.cpp
@@ -3099,7 +3099,7 @@
}
return;
}
- if (UseAddressNop && VM_Version::is_amd()) {
+ if (UseAddressNop && (VM_Version::is_amd() || VM_Version::is_hygon())) {
//
// Using multi-bytes nops "0x0F 0x1F [address]" for AMD.
// 1: 0x90
diff --git a/src/hotspot/cpu/x86/vm_version_ext_x86.cpp
b/src/hotspot/cpu/x86/vm_version_ext_x86.cpp
--- a/src/hotspot/cpu/x86/vm_version_ext_x86.cpp
+++ b/src/hotspot/cpu/x86/vm_version_ext_x86.cpp
@@ -340,6 +340,10 @@
return !is_amd_Barcelona();
}
+ if (is_hygon()) {
+ return true;
+ }
+
return false;
}
diff --git a/src/hotspot/cpu/x86/vm_version_x86.cpp
b/src/hotspot/cpu/x86/vm_version_x86.cpp
--- a/src/hotspot/cpu/x86/vm_version_x86.cpp
+++ b/src/hotspot/cpu/x86/vm_version_x86.cpp
@@ -1161,7 +1161,7 @@
}
}
- if( is_amd() ) { // AMD cpus specific settings
+ if( is_amd() || is_hygon() ) { // AMD cpus specific settings
if( supports_sse2() && FLAG_IS_DEFAULT(UseAddressNop) ) {
// Use it on new AMD cpus starting from Opteron.
UseAddressNop = true;
@@ -1235,8 +1235,8 @@
}
#endif // COMPILER2
- // Some defaults for AMD family 17h
- if ( cpu_family() == 0x17 ) {
+ // Some defaults for AMD family 17h || Hygon family 18h
+ if ( cpu_family() == 0x17 || cpu_family() == 0x18 ) {
// On family 17h processors use XMM and UnalignedLoadStores for
Array Copy
if (supports_sse2() && FLAG_IS_DEFAULT(UseXMMForArrayCopy)) {
FLAG_SET_DEFAULT(UseXMMForArrayCopy, true);
diff --git a/src/hotspot/cpu/x86/vm_version_x86.hpp
b/src/hotspot/cpu/x86/vm_version_x86.hpp
--- a/src/hotspot/cpu/x86/vm_version_x86.hpp
+++ b/src/hotspot/cpu/x86/vm_version_x86.hpp
@@ -495,13 +495,13 @@
result |= CPU_CX8;
if (_cpuid_info.std_cpuid1_edx.bits.cmov != 0)
result |= CPU_CMOV;
- if (_cpuid_info.std_cpuid1_edx.bits.fxsr != 0 || (is_amd() &&
+ if (_cpuid_info.std_cpuid1_edx.bits.fxsr != 0 || ((is_amd() ||
is_hygon()) &&
_cpuid_info.ext_cpuid1_edx.bits.fxsr != 0))
result |= CPU_FXSR;
// HT flag is set for multi-core processors also.
if (threads_per_core() > 1)
result |= CPU_HT;
- if (_cpuid_info.std_cpuid1_edx.bits.mmx != 0 || (is_amd() &&
+ if (_cpuid_info.std_cpuid1_edx.bits.mmx != 0 || ((is_amd() ||
is_hygon()) &&
_cpuid_info.ext_cpuid1_edx.bits.mmx != 0))
result |= CPU_MMX;
if (_cpuid_info.std_cpuid1_edx.bits.sse != 0)
@@ -576,8 +576,8 @@
if (_cpuid_info.std_cpuid1_ecx.bits.fma != 0)
result |= CPU_FMA;
- // AMD features.
- if (is_amd()) {
+ // AMD|Hygon features.
+ if (is_amd() || is_hygon()) {
if ((_cpuid_info.ext_cpuid1_edx.bits.tdnow != 0) ||
(_cpuid_info.ext_cpuid1_ecx.bits.prefetchw != 0))
result |= CPU_3DNOW_PREFETCH;
@@ -711,6 +711,7 @@
static int cpu_family() { return _cpu;}
static bool is_P6() { return cpu_family() >= 6; }
static bool is_amd() { assert_is_initialized(); return
_cpuid_info.std_vendor_name_0 == 0x68747541; } // 'htuA'
+ static bool is_hygon() { assert_is_initialized(); return
_cpuid_info.std_vendor_name_0 == 0x6F677948; } // 'ogyH'
static bool is_intel() { assert_is_initialized(); return
_cpuid_info.std_vendor_name_0 == 0x756e6547; } // 'uneG'
static bool is_zx() { assert_is_initialized(); return
(_cpuid_info.std_vendor_name_0 == 0x746e6543) ||
(_cpuid_info.std_vendor_name_0 == 0x68532020); } // 'tneC'||'hS '
static bool is_atom_family() { return ((cpu_family() == 0x06) &&
((extended_cpu_model() == 0x36) || (extended_cpu_model() == 0x37) ||
(extended_cpu_model() == 0x4D))); } //Silvermont and Centerton
@@ -734,7 +735,7 @@
if (!supports_topology || result == 0) {
result = (_cpuid_info.dcp_cpuid4_eax.bits.cores_per_cpu + 1);
}
- } else if (is_amd()) {
+ } else if (is_amd() || is_hygon()) {
result = (_cpuid_info.ext_cpuid8_ecx.bits.cores_per_cpu + 1);
} else if (is_zx()) {
bool supports_topology = supports_processor_topology();
@@ -770,7 +771,7 @@
intx result = 0;
if (is_intel()) {
result = (_cpuid_info.dcp_cpuid4_ebx.bits.L1_line_size + 1);
- } else if (is_amd()) {
+ } else if (is_amd() || is_hygon()) {
result = _cpuid_info.ext_cpuid5_ecx.bits.L1_line_size;
} else if (is_zx()) {
result = (_cpuid_info.dcp_cpuid4_ebx.bits.L1_line_size + 1);
@@ -857,7 +858,7 @@
// AMD features
static bool supports_3dnow_prefetch() { return (_features &
CPU_3DNOW_PREFETCH) != 0; }
- static bool supports_mmx_ext() { return is_amd() &&
_cpuid_info.ext_cpuid1_edx.bits.mmx_amd != 0; }
+ static bool supports_mmx_ext() { return (is_amd()||is_hygon()) &&
_cpuid_info.ext_cpuid1_edx.bits.mmx_amd != 0; }
static bool supports_lzcnt() { return (_features & CPU_LZCNT) != 0; }
static bool supports_sse4a() { return (_features & CPU_SSE4A) != 0; }
@@ -870,7 +871,7 @@
}
static bool supports_tscinv() {
return supports_tscinv_bit() &&
- ( (is_amd() && !is_amd_Barcelona()) ||
+ ( ((is_amd()||is_hygon()) && !is_amd_Barcelona()) ||
is_intel_tsc_synched_at_init() );
}
@@ -896,7 +897,7 @@
// Core - 256 / prefetchnta
// It will be used only when AllocatePrefetchStyle > 0
- if (is_amd()) { // AMD
+ if (is_amd() || is_hygon()) { // AMD
if (supports_sse2()) {
return 256; // Opteron
} else {
*test
I tested it with jtreg and found no regressions.
Base Run:
==============================
Test summary
==============================
TEST TOTAL PASS FAIL ERROR
>> jtreg:test/hotspot/jtreg:tier1 1364 1363 1 0 <<
>> jtreg:test/jdk:tier1 1877 1876 1 0 <<
>> jtreg:test/langtools:tier1 3985 3984 1 0 <<
jtreg:test/nashorn:tier1 0 0 0 0
jtreg:test/jaxp:tier1 0 0 0 0
==============================
TEST FAILURE
And The result of after patching is the same as the before.
==============================
Test summary
==============================
TEST TOTAL PASS FAIL ERROR
>> jtreg:test/hotspot/jtreg:tier1 1364 1363 1 0 <<
>> jtreg:test/jdk:tier1 1877 1876 1 0 <<
>> jtreg:test/langtools:tier1 3985 3984 1 0 <<
jtreg:test/nashorn:tier1 0 0 0 0
jtreg:test/jaxp:tier1 0 0 0 0
==============================
TEST FAILURE
Is there anything incorrectly?
Please let me know your comments.
Best Regards!
Fanjinke.
More information about the hotspot-dev
mailing list