annotate src/cpu/x86/vm/vm_version_x86.hpp @ 15388:769fc3629f59

Add phase FlowSensitiveReductionPhase. It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during HighTier under certain conditions (control-flow sensitive conditions). The phase added in this commit (FlowSensitiveReductionPhase) does that, and in addition replaces usages with "downcasting" PiNodes when possible thus resulting in more precise object stamps (e.g., non-null). Finally, usages of floating, side-effects free, expressions are also simplified (as per control-flow sensitive conditions). The newly added phase runs only during HighTier and can be deactivated using Graal option FlowSensitiveReduction (it is active by default).
author Miguel Garcia <miguel.m.garcia@oracle.com>
date Fri, 25 Apr 2014 16:50:52 +0200
parents eefb0224149d
children b51e29501f30 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
1 /*
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
4 *
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
7 * published by the Free Software Foundation.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
8 *
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
13 * accompanied this code).
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
14 *
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 775
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 775
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 775
diff changeset
21 * questions.
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
22 *
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
23 */
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
25 #ifndef CPU_X86_VM_VM_VERSION_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
26 #define CPU_X86_VM_VM_VERSION_X86_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
28 #include "runtime/globals_extension.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
29 #include "runtime/vm_version.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
30
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
31 class VM_Version : public Abstract_VM_Version {
13517
eefb0224149d derive CPUFeatures from VM_Version::_cpuFeatures
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 11173
diff changeset
32 friend class VMStructs;
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
33 public:
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
34 // cpuid result register layouts. These are all unions of a uint32_t
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
35 // (in case anyone wants access to the register as a whole) and a bitfield.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
36
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
37 union StdCpuid1Eax {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
38 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
39 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
40 uint32_t stepping : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
41 model : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
42 family : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
43 proc_type : 2,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
44 : 2,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
45 ext_model : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
46 ext_family : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
47 : 4;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
48 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
49 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
50
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
51 union StdCpuid1Ebx { // example, unused
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
52 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
53 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
54 uint32_t brand_id : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
55 clflush_size : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
56 threads_per_cpu : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
57 apic_id : 8;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
58 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
59 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
60
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
61 union StdCpuid1Ecx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
62 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
63 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
64 uint32_t sse3 : 1,
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
65 clmul : 1,
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
66 : 1,
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
67 monitor : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
68 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
69 vmx : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
70 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
71 est : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
72 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
73 ssse3 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
74 cid : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
75 : 2,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
76 cmpxchg16: 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
77 : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
78 dca : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
79 sse4_1 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
80 sse4_2 : 1,
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 585
diff changeset
81 : 2,
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 585
diff changeset
82 popcnt : 1,
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
83 : 1,
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
84 aes : 1,
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
85 : 1,
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
86 osxsave : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
87 avx : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
88 : 3;
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
89 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
90 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
91
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
92 union StdCpuid1Edx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
93 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
94 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
95 uint32_t : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
96 tsc : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
97 : 3,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
98 cmpxchg8 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
99 : 6,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
100 cmov : 1,
3787
6ae7a1561b53 6990015: Incorrect Icache line size is used for 64 bit x86
kvn
parents: 2479
diff changeset
101 : 3,
6ae7a1561b53 6990015: Incorrect Icache line size is used for 64 bit x86
kvn
parents: 2479
diff changeset
102 clflush : 1,
6ae7a1561b53 6990015: Incorrect Icache line size is used for 64 bit x86
kvn
parents: 2479
diff changeset
103 : 3,
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
104 mmx : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
105 fxsr : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
106 sse : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
107 sse2 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
108 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
109 ht : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
110 : 3;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
111 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
112 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
113
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
114 union DcpCpuid4Eax {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
115 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
116 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
117 uint32_t cache_type : 5,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
118 : 21,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
119 cores_per_cpu : 6;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
120 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
121 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
122
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
123 union DcpCpuid4Ebx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
124 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
125 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
126 uint32_t L1_line_size : 12,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
127 partitions : 10,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
128 associativity : 10;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
129 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
130 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
131
1622
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
132 union TplCpuidBEbx {
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
133 uint32_t value;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
134 struct {
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
135 uint32_t logical_cpus : 16,
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
136 : 16;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
137 } bits;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
138 };
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
139
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
140 union ExtCpuid1Ecx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
141 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
142 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
143 uint32_t LahfSahf : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
144 CmpLegacy : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
145 : 4,
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
146 lzcnt : 1,
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
147 sse4a : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
148 misalignsse : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
149 prefetchw : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
150 : 22;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
151 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
152 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
153
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
154 union ExtCpuid1Edx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
155 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
156 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
157 uint32_t : 22,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
158 mmx_amd : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
159 mmx : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
160 fxsr : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
161 : 4,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
162 long_mode : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
163 tdnow2 : 1,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
164 tdnow : 1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
165 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
166 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
167
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
168 union ExtCpuid5Ex {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
169 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
170 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
171 uint32_t L1_line_size : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
172 L1_tag_lines : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
173 L1_assoc : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
174 L1_size : 8;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
175 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
176 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
177
4771
kvn
parents: 4749 4759
diff changeset
178 union ExtCpuid7Edx {
kvn
parents: 4749 4759
diff changeset
179 uint32_t value;
kvn
parents: 4749 4759
diff changeset
180 struct {
kvn
parents: 4749 4759
diff changeset
181 uint32_t : 8,
kvn
parents: 4749 4759
diff changeset
182 tsc_invariance : 1,
kvn
parents: 4749 4759
diff changeset
183 : 23;
kvn
parents: 4749 4759
diff changeset
184 } bits;
kvn
parents: 4749 4759
diff changeset
185 };
kvn
parents: 4749 4759
diff changeset
186
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
187 union ExtCpuid8Ecx {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
188 uint32_t value;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
189 struct {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
190 uint32_t cores_per_cpu : 8,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
191 : 24;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
192 } bits;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
193 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
194
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
195 union SefCpuid7Eax {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
196 uint32_t value;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
197 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
198
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
199 union SefCpuid7Ebx {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
200 uint32_t value;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
201 struct {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
202 uint32_t fsgsbase : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
203 : 2,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
204 bmi1 : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
205 : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
206 avx2 : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
207 : 2,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
208 bmi2 : 1,
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
209 erms : 1,
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
210 : 22;
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
211 } bits;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
212 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
213
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
214 union XemXcr0Eax {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
215 uint32_t value;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
216 struct {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
217 uint32_t x87 : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
218 sse : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
219 ymm : 1,
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
220 : 29;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
221 } bits;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
222 };
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
223
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
224 protected:
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
225 static int _cpu;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
226 static int _model;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
227 static int _stepping;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
228 static int _cpuFeatures; // features returned by the "cpuid" instruction
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
229 // 0 if this instruction is not available
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
230 static const char* _features_str;
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
231
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
232 enum {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
233 CPU_CX8 = (1 << 0), // next bits are from cpuid 1 (EDX)
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
234 CPU_CMOV = (1 << 1),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
235 CPU_FXSR = (1 << 2),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
236 CPU_HT = (1 << 3),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
237 CPU_MMX = (1 << 4),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
238 CPU_3DNOW_PREFETCH = (1 << 5), // Processor supports 3dnow prefetch and prefetchw instructions
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
239 // may not necessarily support other 3dnow instructions
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
240 CPU_SSE = (1 << 6),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
241 CPU_SSE2 = (1 << 7),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
242 CPU_SSE3 = (1 << 8), // SSE3 comes from cpuid 1 (ECX)
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
243 CPU_SSSE3 = (1 << 9),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
244 CPU_SSE4A = (1 << 10),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
245 CPU_SSE4_1 = (1 << 11),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
246 CPU_SSE4_2 = (1 << 12),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
247 CPU_POPCNT = (1 << 13),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
248 CPU_LZCNT = (1 << 14),
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
249 CPU_TSC = (1 << 15),
4771
kvn
parents: 4749 4759
diff changeset
250 CPU_TSCINV = (1 << 16),
kvn
parents: 4749 4759
diff changeset
251 CPU_AVX = (1 << 17),
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
252 CPU_AVX2 = (1 << 18),
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
253 CPU_AES = (1 << 19),
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
254 CPU_ERMS = (1 << 20), // enhanced 'rep movsb/stosb' instructions
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
255 CPU_CLMUL = (1 << 21) // carryless multiply for CRC
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
256 } cpuFeatureFlags;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
257
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
258 enum {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
259 // AMD
4933
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
260 CPU_FAMILY_AMD_11H = 0x11,
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
261 // Intel
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
262 CPU_FAMILY_INTEL_CORE = 6,
4933
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
263 CPU_MODEL_NEHALEM = 0x1e,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
264 CPU_MODEL_NEHALEM_EP = 0x1a,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
265 CPU_MODEL_NEHALEM_EX = 0x2e,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
266 CPU_MODEL_WESTMERE = 0x25,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
267 CPU_MODEL_WESTMERE_EP = 0x2c,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
268 CPU_MODEL_WESTMERE_EX = 0x2f,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
269 CPU_MODEL_SANDYBRIDGE = 0x2a,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
270 CPU_MODEL_SANDYBRIDGE_EP = 0x2d,
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
271 CPU_MODEL_IVYBRIDGE_EP = 0x3a
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
272 } cpuExtendedFamily;
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
273
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
274 // cpuid information block. All info derived from executing cpuid with
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
275 // various function numbers is stored here. Intel and AMD info is
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
276 // merged in this block: accessor methods disentangle it.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
277 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
278 // The info block is laid out in subblocks of 4 dwords corresponding to
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
279 // eax, ebx, ecx and edx, whether or not they contain anything useful.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
280 struct CpuidInfo {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
281 // cpuid function 0
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
282 uint32_t std_max_function;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
283 uint32_t std_vendor_name_0;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
284 uint32_t std_vendor_name_1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
285 uint32_t std_vendor_name_2;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
286
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
287 // cpuid function 1
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
288 StdCpuid1Eax std_cpuid1_eax;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
289 StdCpuid1Ebx std_cpuid1_ebx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
290 StdCpuid1Ecx std_cpuid1_ecx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
291 StdCpuid1Edx std_cpuid1_edx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
292
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
293 // cpuid function 4 (deterministic cache parameters)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
294 DcpCpuid4Eax dcp_cpuid4_eax;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
295 DcpCpuid4Ebx dcp_cpuid4_ebx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
296 uint32_t dcp_cpuid4_ecx; // unused currently
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
297 uint32_t dcp_cpuid4_edx; // unused currently
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
298
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
299 // cpuid function 7 (structured extended features)
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
300 SefCpuid7Eax sef_cpuid7_eax;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
301 SefCpuid7Ebx sef_cpuid7_ebx;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
302 uint32_t sef_cpuid7_ecx; // unused currently
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
303 uint32_t sef_cpuid7_edx; // unused currently
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
304
1622
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
305 // cpuid function 0xB (processor topology)
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
306 // ecx = 0
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
307 uint32_t tpl_cpuidB0_eax;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
308 TplCpuidBEbx tpl_cpuidB0_ebx;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
309 uint32_t tpl_cpuidB0_ecx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
310 uint32_t tpl_cpuidB0_edx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
311
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
312 // ecx = 1
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
313 uint32_t tpl_cpuidB1_eax;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
314 TplCpuidBEbx tpl_cpuidB1_ebx;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
315 uint32_t tpl_cpuidB1_ecx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
316 uint32_t tpl_cpuidB1_edx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
317
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
318 // ecx = 2
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
319 uint32_t tpl_cpuidB2_eax;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
320 TplCpuidBEbx tpl_cpuidB2_ebx;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
321 uint32_t tpl_cpuidB2_ecx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
322 uint32_t tpl_cpuidB2_edx; // unused currently
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
323
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
324 // cpuid function 0x80000000 // example, unused
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
325 uint32_t ext_max_function;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
326 uint32_t ext_vendor_name_0;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
327 uint32_t ext_vendor_name_1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
328 uint32_t ext_vendor_name_2;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
329
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
330 // cpuid function 0x80000001
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
331 uint32_t ext_cpuid1_eax; // reserved
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
332 uint32_t ext_cpuid1_ebx; // reserved
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
333 ExtCpuid1Ecx ext_cpuid1_ecx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
334 ExtCpuid1Edx ext_cpuid1_edx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
335
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
336 // cpuid functions 0x80000002 thru 0x80000004: example, unused
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
337 uint32_t proc_name_0, proc_name_1, proc_name_2, proc_name_3;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
338 uint32_t proc_name_4, proc_name_5, proc_name_6, proc_name_7;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
339 uint32_t proc_name_8, proc_name_9, proc_name_10,proc_name_11;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
340
4933
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
341 // cpuid function 0x80000005 // AMD L1, Intel reserved
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
342 uint32_t ext_cpuid5_eax; // unused currently
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
343 uint32_t ext_cpuid5_ebx; // reserved
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
344 ExtCpuid5Ex ext_cpuid5_ecx; // L1 data cache info (AMD)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
345 ExtCpuid5Ex ext_cpuid5_edx; // L1 instruction cache info (AMD)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
346
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
347 // cpuid function 0x80000007
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
348 uint32_t ext_cpuid7_eax; // reserved
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
349 uint32_t ext_cpuid7_ebx; // reserved
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
350 uint32_t ext_cpuid7_ecx; // reserved
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
351 ExtCpuid7Edx ext_cpuid7_edx; // tscinv
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
352
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
353 // cpuid function 0x80000008
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
354 uint32_t ext_cpuid8_eax; // unused currently
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
355 uint32_t ext_cpuid8_ebx; // reserved
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
356 ExtCpuid8Ecx ext_cpuid8_ecx;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
357 uint32_t ext_cpuid8_edx; // reserved
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
358
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
359 // extended control register XCR0 (the XFEATURE_ENABLED_MASK register)
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
360 XemXcr0Eax xem_xcr0_eax;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
361 uint32_t xem_xcr0_edx; // reserved
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
362 };
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
363
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
364 // The actual cpuid info block
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
365 static CpuidInfo _cpuid_info;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
366
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
367 // Extractors and predicates
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
368 static uint32_t extended_cpu_family() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
369 uint32_t result = _cpuid_info.std_cpuid1_eax.bits.family;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
370 result += _cpuid_info.std_cpuid1_eax.bits.ext_family;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
371 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
372 }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
373
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
374 static uint32_t extended_cpu_model() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
375 uint32_t result = _cpuid_info.std_cpuid1_eax.bits.model;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
376 result |= _cpuid_info.std_cpuid1_eax.bits.ext_model << 4;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
377 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
378 }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
379
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
380 static uint32_t cpu_stepping() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
381 uint32_t result = _cpuid_info.std_cpuid1_eax.bits.stepping;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
382 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
383 }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
384
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
385 static uint logical_processor_count() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
386 uint result = threads_per_core();
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
387 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
388 }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
389
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
390 static uint32_t feature_flags() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
391 uint32_t result = 0;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
392 if (_cpuid_info.std_cpuid1_edx.bits.cmpxchg8 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
393 result |= CPU_CX8;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
394 if (_cpuid_info.std_cpuid1_edx.bits.cmov != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
395 result |= CPU_CMOV;
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1647
diff changeset
396 if (_cpuid_info.std_cpuid1_edx.bits.fxsr != 0 || (is_amd() &&
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1647
diff changeset
397 _cpuid_info.ext_cpuid1_edx.bits.fxsr != 0))
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
398 result |= CPU_FXSR;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
399 // HT flag is set for multi-core processors also.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
400 if (threads_per_core() > 1)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
401 result |= CPU_HT;
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1647
diff changeset
402 if (_cpuid_info.std_cpuid1_edx.bits.mmx != 0 || (is_amd() &&
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1647
diff changeset
403 _cpuid_info.ext_cpuid1_edx.bits.mmx != 0))
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
404 result |= CPU_MMX;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
405 if (_cpuid_info.std_cpuid1_edx.bits.sse != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
406 result |= CPU_SSE;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
407 if (_cpuid_info.std_cpuid1_edx.bits.sse2 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
408 result |= CPU_SSE2;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
409 if (_cpuid_info.std_cpuid1_ecx.bits.sse3 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
410 result |= CPU_SSE3;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
411 if (_cpuid_info.std_cpuid1_ecx.bits.ssse3 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
412 result |= CPU_SSSE3;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
413 if (_cpuid_info.std_cpuid1_ecx.bits.sse4_1 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
414 result |= CPU_SSE4_1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
415 if (_cpuid_info.std_cpuid1_ecx.bits.sse4_2 != 0)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
416 result |= CPU_SSE4_2;
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 585
diff changeset
417 if (_cpuid_info.std_cpuid1_ecx.bits.popcnt != 0)
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 585
diff changeset
418 result |= CPU_POPCNT;
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
419 if (_cpuid_info.std_cpuid1_ecx.bits.avx != 0 &&
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
420 _cpuid_info.std_cpuid1_ecx.bits.osxsave != 0 &&
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
421 _cpuid_info.xem_xcr0_eax.bits.sse != 0 &&
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
422 _cpuid_info.xem_xcr0_eax.bits.ymm != 0) {
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
423 result |= CPU_AVX;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
424 if (_cpuid_info.sef_cpuid7_ebx.bits.avx2 != 0)
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
425 result |= CPU_AVX2;
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
426 }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
427 if (_cpuid_info.std_cpuid1_edx.bits.tsc != 0)
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
428 result |= CPU_TSC;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
429 if (_cpuid_info.ext_cpuid7_edx.bits.tsc_invariance != 0)
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
430 result |= CPU_TSCINV;
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
431 if (_cpuid_info.std_cpuid1_ecx.bits.aes != 0)
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
432 result |= CPU_AES;
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
433 if (_cpuid_info.sef_cpuid7_ebx.bits.erms != 0)
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
434 result |= CPU_ERMS;
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
435 if (_cpuid_info.std_cpuid1_ecx.bits.clmul != 0)
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
436 result |= CPU_CLMUL;
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
437
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
438 // AMD features.
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
439 if (is_amd()) {
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 1972
diff changeset
440 if ((_cpuid_info.ext_cpuid1_edx.bits.tdnow != 0) ||
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 1972
diff changeset
441 (_cpuid_info.ext_cpuid1_ecx.bits.prefetchw != 0))
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 1972
diff changeset
442 result |= CPU_3DNOW_PREFETCH;
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
443 if (_cpuid_info.ext_cpuid1_ecx.bits.lzcnt != 0)
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
444 result |= CPU_LZCNT;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
445 if (_cpuid_info.ext_cpuid1_ecx.bits.sse4a != 0)
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
446 result |= CPU_SSE4A;
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
447 }
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
448
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
449 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
450 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
451
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
452 static void get_processor_features();
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
453
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
454 public:
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
455 // Offsets for cpuid asm stub
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
456 static ByteSize std_cpuid0_offset() { return byte_offset_of(CpuidInfo, std_max_function); }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
457 static ByteSize std_cpuid1_offset() { return byte_offset_of(CpuidInfo, std_cpuid1_eax); }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
458 static ByteSize dcp_cpuid4_offset() { return byte_offset_of(CpuidInfo, dcp_cpuid4_eax); }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
459 static ByteSize sef_cpuid7_offset() { return byte_offset_of(CpuidInfo, sef_cpuid7_eax); }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
460 static ByteSize ext_cpuid1_offset() { return byte_offset_of(CpuidInfo, ext_cpuid1_eax); }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
461 static ByteSize ext_cpuid5_offset() { return byte_offset_of(CpuidInfo, ext_cpuid5_eax); }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
462 static ByteSize ext_cpuid7_offset() { return byte_offset_of(CpuidInfo, ext_cpuid7_eax); }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
463 static ByteSize ext_cpuid8_offset() { return byte_offset_of(CpuidInfo, ext_cpuid8_eax); }
1622
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
464 static ByteSize tpl_cpuidB0_offset() { return byte_offset_of(CpuidInfo, tpl_cpuidB0_eax); }
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
465 static ByteSize tpl_cpuidB1_offset() { return byte_offset_of(CpuidInfo, tpl_cpuidB1_eax); }
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
466 static ByteSize tpl_cpuidB2_offset() { return byte_offset_of(CpuidInfo, tpl_cpuidB2_eax); }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
467 static ByteSize xem_xcr0_offset() { return byte_offset_of(CpuidInfo, xem_xcr0_eax); }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
468
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
469 // Initialization
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
470 static void initialize();
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
471
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
472 // Asserts
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
473 static void assert_is_initialized() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
474 assert(_cpuid_info.std_cpuid1_eax.bits.family != 0, "VM_Version not initialized");
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
475 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
476
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
477 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
478 // Processor family:
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
479 // 3 - 386
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
480 // 4 - 486
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
481 // 5 - Pentium
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
482 // 6 - PentiumPro, Pentium II, Celeron, Xeon, Pentium III, Athlon,
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
483 // Pentium M, Core Solo, Core Duo, Core2 Duo
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
484 // family 6 model: 9, 13, 14, 15
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
485 // 0x0f - Pentium 4, Opteron
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
486 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
487 // Note: The cpu family should be used to select between
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
488 // instruction sequences which are valid on all Intel
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
489 // processors. Use the feature test functions below to
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
490 // determine whether a particular instruction is supported.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
491 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
492 static int cpu_family() { return _cpu;}
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
493 static bool is_P6() { return cpu_family() >= 6; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
494 static bool is_amd() { assert_is_initialized(); return _cpuid_info.std_vendor_name_0 == 0x68747541; } // 'htuA'
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
495 static bool is_intel() { assert_is_initialized(); return _cpuid_info.std_vendor_name_0 == 0x756e6547; } // 'uneG'
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
496
1647
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
497 static bool supports_processor_topology() {
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
498 return (_cpuid_info.std_max_function >= 0xB) &&
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
499 // eax[4:0] | ebx[0:15] == 0 indicates invalid topology level.
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
500 // Some cpus have max cpuid >= 0xB but do not support processor topology.
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
501 (((_cpuid_info.tpl_cpuidB0_eax & 0x1f) | _cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus) != 0);
1647
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
502 }
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
503
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
504 static uint cores_per_cpu() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
505 uint result = 1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
506 if (is_intel()) {
1647
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
507 if (supports_processor_topology()) {
1622
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
508 result = _cpuid_info.tpl_cpuidB1_ebx.bits.logical_cpus /
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
509 _cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
510 } else {
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
511 result = (_cpuid_info.dcp_cpuid4_eax.bits.cores_per_cpu + 1);
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
512 }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
513 } else if (is_amd()) {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
514 result = (_cpuid_info.ext_cpuid8_ecx.bits.cores_per_cpu + 1);
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
515 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
516 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
517 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
518
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
519 static uint threads_per_core() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
520 uint result = 1;
1647
079980c86f33 6968646: JVM crashes with SIGFPE during startup
kvn
parents: 1622
diff changeset
521 if (is_intel() && supports_processor_topology()) {
1622
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
522 result = _cpuid_info.tpl_cpuidB0_ebx.bits.logical_cpus;
76efbe666d6c 6964774: Adjust optimization flags setting
kvn
parents: 1552
diff changeset
523 } else if (_cpuid_info.std_cpuid1_edx.bits.ht != 0) {
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
524 result = _cpuid_info.std_cpuid1_ebx.bits.threads_per_cpu /
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
525 cores_per_cpu();
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
526 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
527 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
528 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
529
3854
1af104d6cf99 7079329: Adjust allocation prefetching for T4
kvn
parents: 3787
diff changeset
530 static intx prefetch_data_size() {
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
531 intx result = 0;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
532 if (is_intel()) {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
533 result = (_cpuid_info.dcp_cpuid4_ebx.bits.L1_line_size + 1);
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
534 } else if (is_amd()) {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
535 result = _cpuid_info.ext_cpuid5_ecx.bits.L1_line_size;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
536 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
537 if (result < 32) // not defined ?
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
538 result = 32; // 32 bytes by default on x86 and other x64
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
539 return result;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
540 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
541
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
542 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
543 // Feature identification
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
544 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
545 static bool supports_cpuid() { return _cpuFeatures != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
546 static bool supports_cmpxchg8() { return (_cpuFeatures & CPU_CX8) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
547 static bool supports_cmov() { return (_cpuFeatures & CPU_CMOV) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
548 static bool supports_fxsr() { return (_cpuFeatures & CPU_FXSR) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
549 static bool supports_ht() { return (_cpuFeatures & CPU_HT) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
550 static bool supports_mmx() { return (_cpuFeatures & CPU_MMX) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
551 static bool supports_sse() { return (_cpuFeatures & CPU_SSE) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
552 static bool supports_sse2() { return (_cpuFeatures & CPU_SSE2) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
553 static bool supports_sse3() { return (_cpuFeatures & CPU_SSE3) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
554 static bool supports_ssse3() { return (_cpuFeatures & CPU_SSSE3)!= 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
555 static bool supports_sse4_1() { return (_cpuFeatures & CPU_SSE4_1) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
556 static bool supports_sse4_2() { return (_cpuFeatures & CPU_SSE4_2) != 0; }
643
c771b7f43bbf 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 585
diff changeset
557 static bool supports_popcnt() { return (_cpuFeatures & CPU_POPCNT) != 0; }
4759
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
558 static bool supports_avx() { return (_cpuFeatures & CPU_AVX) != 0; }
127b3692c168 7116452: Add support for AVX instructions
kvn
parents: 3865
diff changeset
559 static bool supports_avx2() { return (_cpuFeatures & CPU_AVX2) != 0; }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
560 static bool supports_tsc() { return (_cpuFeatures & CPU_TSC) != 0; }
6894
a3ecd773a7b9 7184394: add intrinsics to use AES instructions
kvn
parents: 6842
diff changeset
561 static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; }
7474
00af3a3a8df4 8005522: use fast-string instructions on x86 for zeroing
kvn
parents: 6894
diff changeset
562 static bool supports_erms() { return (_cpuFeatures & CPU_ERMS) != 0; }
11080
b800986664f4 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 7474
diff changeset
563 static bool supports_clmul() { return (_cpuFeatures & CPU_CLMUL) != 0; }
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
564
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
565 // Intel features
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
566 static bool is_intel_family_core() { return is_intel() &&
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
567 extended_cpu_family() == CPU_FAMILY_INTEL_CORE; }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
568
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
569 static bool is_intel_tsc_synched_at_init() {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
570 if (is_intel_family_core()) {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
571 uint32_t ext_model = extended_cpu_model();
4933
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
572 if (ext_model == CPU_MODEL_NEHALEM_EP ||
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
573 ext_model == CPU_MODEL_WESTMERE_EP ||
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
574 ext_model == CPU_MODEL_SANDYBRIDGE_EP ||
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
575 ext_model == CPU_MODEL_IVYBRIDGE_EP) {
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
576 // <= 2-socket invariant tsc support. EX versions are usually used
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
577 // in > 2-socket systems and likely don't synchronize tscs at
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
578 // initialization.
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
579 // Code that uses tsc values must be prepared for them to arbitrarily
4a24c4f648bd 7142113: Add Ivy Bridge to the known Intel x86 cpu families
phh
parents: 4771
diff changeset
580 // jump forward or backward.
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
581 return true;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
582 }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
583 }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
584 return false;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
585 }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
586
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
587 // AMD features
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 1972
diff changeset
588 static bool supports_3dnow_prefetch() { return (_cpuFeatures & CPU_3DNOW_PREFETCH) != 0; }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
589 static bool supports_mmx_ext() { return is_amd() && _cpuid_info.ext_cpuid1_edx.bits.mmx_amd != 0; }
775
93c14e5562c4 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 643
diff changeset
590 static bool supports_lzcnt() { return (_cpuFeatures & CPU_LZCNT) != 0; }
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
591 static bool supports_sse4a() { return (_cpuFeatures & CPU_SSE4A) != 0; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
592
4749
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
593 static bool is_amd_Barcelona() { return is_amd() &&
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
594 extended_cpu_family() == CPU_FAMILY_AMD_11H; }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
595
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
596 // Intel and AMD newer cores support fast timestamps well
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
597 static bool supports_tscinv_bit() {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
598 return (_cpuFeatures & CPU_TSCINV) != 0;
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
599 }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
600 static bool supports_tscinv() {
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
601 return supports_tscinv_bit() &&
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
602 ( (is_amd() && !is_amd_Barcelona()) ||
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
603 is_intel_tsc_synched_at_init() );
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
604 }
7ab5f6318694 7125934: Add a fast unordered timestamp capability to Hotspot on x86/x64
phh
parents: 3865
diff changeset
605
1914
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1789
diff changeset
606 // Intel Core and newer cpus have fast IDIV instruction (excluding Atom).
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1789
diff changeset
607 static bool has_fast_idiv() { return is_intel() && cpu_family() == 6 &&
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1789
diff changeset
608 supports_sse3() && _model != 0x1C; }
ae065c367d93 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 1789
diff changeset
609
585
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
610 static bool supports_compare_and_exchange() { return true; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
611
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
612 static const char* cpu_features() { return _features_str; }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
613
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
614 static intx allocate_prefetch_distance() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
615 // This method should be called before allocate_prefetch_style().
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
616 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
617 // Hardware prefetching (distance/size in bytes):
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
618 // Pentium 3 - 64 / 32
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
619 // Pentium 4 - 256 / 128
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
620 // Athlon - 64 / 32 ????
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
621 // Opteron - 128 / 64 only when 2 sequential cache lines accessed
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
622 // Core - 128 / 64
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
623 //
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
624 // Software prefetching (distance in bytes / instruction with best score):
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
625 // Pentium 3 - 128 / prefetchnta
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
626 // Pentium 4 - 512 / prefetchnta
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
627 // Athlon - 128 / prefetchnta
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
628 // Opteron - 256 / prefetchnta
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
629 // Core - 256 / prefetchnta
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
630 // It will be used only when AllocatePrefetchStyle > 0
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
631
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
632 intx count = AllocatePrefetchDistance;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
633 if (count < 0) { // default ?
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
634 if (is_amd()) { // AMD
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
635 if (supports_sse2())
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
636 count = 256; // Opteron
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
637 else
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
638 count = 128; // Athlon
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
639 } else { // Intel
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
640 if (supports_sse2())
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
641 if (cpu_family() == 6) {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
642 count = 256; // Pentium M, Core, Core2
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
643 } else {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
644 count = 512; // Pentium 4
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
645 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
646 else
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
647 count = 128; // Pentium 3 (and all other old CPUs)
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
648 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
649 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
650 return count;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
651 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
652 static intx allocate_prefetch_style() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
653 assert(AllocatePrefetchStyle >= 0, "AllocatePrefetchStyle should be positive");
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
654 // Return 0 if AllocatePrefetchDistance was not defined.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
655 return AllocatePrefetchDistance > 0 ? AllocatePrefetchStyle : 0;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
656 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
657
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
658 // Prefetch interval for gc copy/scan == 9 dcache lines. Derived from
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
659 // 50-warehouse specjbb runs on a 2-way 1.8ghz opteron using a 4gb heap.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
660 // Tested intervals from 128 to 2048 in increments of 64 == one cache line.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
661 // 256 bytes (4 dcache lines) was the nearest runner-up to 576.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
662
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
663 // gc copy/scan is disabled if prefetchw isn't supported, because
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
664 // Prefetch::write emits an inlined prefetchw on Linux.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
665 // Do not use the 3dnow prefetchw instruction. It isn't supported on em64t.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
666 // The used prefetcht0 instruction works for both amd64 and em64t.
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
667 static intx prefetch_copy_interval_in_bytes() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
668 intx interval = PrefetchCopyIntervalInBytes;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
669 return interval >= 0 ? interval : 576;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
670 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
671 static intx prefetch_scan_interval_in_bytes() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
672 intx interval = PrefetchScanIntervalInBytes;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
673 return interval >= 0 ? interval : 576;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
674 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
675 static intx prefetch_fields_ahead() {
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
676 intx count = PrefetchFieldsAhead;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
677 return count >= 0 ? count : 1;
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
678 }
22e09c0f4b47 6808589: Merge vm_version_x86_{32,64}.{cpp,hpp}
twisti
parents:
diff changeset
679 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
680
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1914
diff changeset
681 #endif // CPU_X86_VM_VM_VERSION_X86_HPP