comparison src/cpu/x86/vm/vm_version_x86.cpp @ 1622:76efbe666d6c

6964774: Adjust optimization flags setting Summary: Adjust performance flags settings. Reviewed-by: never, phh
author kvn
date Tue, 29 Jun 2010 10:34:00 -0700
parents c18cbe5936b8
children f55c4f82ab9d
comparison
equal deleted inserted replaced
1621:6027dddc26c6 1622:76efbe666d6c
1 /* 1 /*
2 * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
32 int VM_Version::_cpuFeatures; 32 int VM_Version::_cpuFeatures;
33 const char* VM_Version::_features_str = ""; 33 const char* VM_Version::_features_str = "";
34 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, }; 34 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
35 35
36 static BufferBlob* stub_blob; 36 static BufferBlob* stub_blob;
37 static const int stub_size = 300; 37 static const int stub_size = 400;
38 38
39 extern "C" { 39 extern "C" {
40 typedef void (*getPsrInfo_stub_t)(void*); 40 typedef void (*getPsrInfo_stub_t)(void*);
41 } 41 }
42 static getPsrInfo_stub_t getPsrInfo_stub = NULL; 42 static getPsrInfo_stub_t getPsrInfo_stub = NULL;
54 // Values for when we don't have a CPUID instruction. 54 // Values for when we don't have a CPUID instruction.
55 const int CPU_FAMILY_SHIFT = 8; 55 const int CPU_FAMILY_SHIFT = 8;
56 const uint32_t CPU_FAMILY_386 = (3 << CPU_FAMILY_SHIFT); 56 const uint32_t CPU_FAMILY_386 = (3 << CPU_FAMILY_SHIFT);
57 const uint32_t CPU_FAMILY_486 = (4 << CPU_FAMILY_SHIFT); 57 const uint32_t CPU_FAMILY_486 = (4 << CPU_FAMILY_SHIFT);
58 58
59 Label detect_486, cpu486, detect_586, std_cpuid1; 59 Label detect_486, cpu486, detect_586, std_cpuid1, std_cpuid4;
60 Label ext_cpuid1, ext_cpuid5, done; 60 Label ext_cpuid1, ext_cpuid5, done;
61 61
62 StubCodeMark mark(this, "VM_Version", "getPsrInfo_stub"); 62 StubCodeMark mark(this, "VM_Version", "getPsrInfo_stub");
63 # define __ _masm-> 63 # define __ _masm->
64 64
129 __ movl(Address(rsi, 0), rax); 129 __ movl(Address(rsi, 0), rax);
130 __ movl(Address(rsi, 4), rbx); 130 __ movl(Address(rsi, 4), rbx);
131 __ movl(Address(rsi, 8), rcx); 131 __ movl(Address(rsi, 8), rcx);
132 __ movl(Address(rsi,12), rdx); 132 __ movl(Address(rsi,12), rdx);
133 133
134 __ cmpl(rax, 3); // Is cpuid(0x4) supported? 134 __ cmpl(rax, 0xa); // Is cpuid(0xB) supported?
135 __ jccb(Assembler::belowEqual, std_cpuid1); 135 __ jccb(Assembler::belowEqual, std_cpuid4);
136
137 //
138 // cpuid(0xB) Processor Topology
139 //
140 __ movl(rax, 0xb);
141 __ xorl(rcx, rcx); // Threads level
142 __ cpuid();
143
144 __ lea(rsi, Address(rbp, in_bytes(VM_Version::tpl_cpuidB0_offset())));
145 __ movl(Address(rsi, 0), rax);
146 __ movl(Address(rsi, 4), rbx);
147 __ movl(Address(rsi, 8), rcx);
148 __ movl(Address(rsi,12), rdx);
149
150 __ movl(rax, 0xb);
151 __ movl(rcx, 1); // Cores level
152 __ cpuid();
153 __ push(rax);
154 __ andl(rax, 0x1f); // Determine if valid topology level
155 __ orl(rax, rbx); // eax[4:0] | ebx[0:15] == 0 indicates invalid level
156 __ andl(rax, 0xffff);
157 __ pop(rax);
158 __ jccb(Assembler::equal, std_cpuid4);
159
160 __ lea(rsi, Address(rbp, in_bytes(VM_Version::tpl_cpuidB1_offset())));
161 __ movl(Address(rsi, 0), rax);
162 __ movl(Address(rsi, 4), rbx);
163 __ movl(Address(rsi, 8), rcx);
164 __ movl(Address(rsi,12), rdx);
165
166 __ movl(rax, 0xb);
167 __ movl(rcx, 2); // Packages level
168 __ cpuid();
169 __ push(rax);
170 __ andl(rax, 0x1f); // Determine if valid topology level
171 __ orl(rax, rbx); // eax[4:0] | ebx[0:15] == 0 indicates invalid level
172 __ andl(rax, 0xffff);
173 __ pop(rax);
174 __ jccb(Assembler::equal, std_cpuid4);
175
176 __ lea(rsi, Address(rbp, in_bytes(VM_Version::tpl_cpuidB2_offset())));
177 __ movl(Address(rsi, 0), rax);
178 __ movl(Address(rsi, 4), rbx);
179 __ movl(Address(rsi, 8), rcx);
180 __ movl(Address(rsi,12), rdx);
136 181
137 // 182 //
138 // cpuid(0x4) Deterministic cache params 183 // cpuid(0x4) Deterministic cache params
139 // 184 //
185 __ bind(std_cpuid4);
140 __ movl(rax, 4); 186 __ movl(rax, 4);
187 __ cmpl(rax, Address(rbp, in_bytes(VM_Version::std_cpuid0_offset()))); // Is cpuid(0x4) supported?
188 __ jccb(Assembler::greater, std_cpuid1);
189
141 __ xorl(rcx, rcx); // L1 cache 190 __ xorl(rcx, rcx); // L1 cache
142 __ cpuid(); 191 __ cpuid();
143 __ push(rax); 192 __ push(rax);
144 __ andl(rax, 0x1f); // Determine if valid cache parameters used 193 __ andl(rax, 0x1f); // Determine if valid cache parameters used
145 __ orl(rax, rax); // eax[4:0] == 0 indicates invalid cache 194 __ orl(rax, rax); // eax[4:0] == 0 indicates invalid cache
458 AllocatePrefetchLines = 1; // Conservative value 507 AllocatePrefetchLines = 1; // Conservative value
459 508
460 AllocatePrefetchDistance = allocate_prefetch_distance(); 509 AllocatePrefetchDistance = allocate_prefetch_distance();
461 AllocatePrefetchStyle = allocate_prefetch_style(); 510 AllocatePrefetchStyle = allocate_prefetch_style();
462 511
463 if( AllocatePrefetchStyle == 2 && is_intel() && 512 if( is_intel() && cpu_family() == 6 && supports_sse3() ) {
464 cpu_family() == 6 && supports_sse3() ) { // watermark prefetching on Core 513 if( AllocatePrefetchStyle == 2 ) { // watermark prefetching on Core
465 #ifdef _LP64 514 #ifdef _LP64
466 AllocatePrefetchDistance = 384; 515 AllocatePrefetchDistance = 384;
467 #else 516 #else
468 AllocatePrefetchDistance = 320; 517 AllocatePrefetchDistance = 320;
469 #endif 518 #endif
519 }
520 if( supports_sse4_2() && supports_ht() ) { // Nehalem based cpus
521 AllocatePrefetchDistance = 192;
522 AllocatePrefetchLines = 4;
523 }
470 } 524 }
471 assert(AllocatePrefetchDistance % AllocatePrefetchStepSize == 0, "invalid value"); 525 assert(AllocatePrefetchDistance % AllocatePrefetchStepSize == 0, "invalid value");
472 526
473 #ifdef _LP64 527 #ifdef _LP64
474 // Prefetch settings 528 // Prefetch settings