annotate src/share/vm/utilities/globalDefinitions.hpp @ 2152:0fa27f37d4d4

6977804: G1: remove the zero-filling thread Summary: This changeset removes the zero-filling thread from G1 and collapses the two free region lists we had before (the "free" and "unclean" lists) into one. The new free list uses the new heap region sets / lists abstractions that we'll ultimately use it to keep track of all regions in the heap. A heap region set was also introduced for the humongous regions. Finally, this change increases the concurrency between the thread that completes freeing regions (after a cleanup pause) and the rest of the system (before we'd have to wait for said thread to complete before allocating a new region). The changest also includes a lot of refactoring and code simplification. Reviewed-by: jcoomes, johnc
author tonyp
date Wed, 19 Jan 2011 19:30:42 -0500
parents f95d63e2154a
children d25d4ca69222 b92c45f2bc75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 1972
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1311
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: 1311
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
25 #ifndef SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
26 #define SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
28 #ifdef TARGET_COMPILER_gcc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
29 # include "utilities/globalDefinitions_gcc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
30 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
31 #ifdef TARGET_COMPILER_visCPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
32 # include "utilities/globalDefinitions_visCPP.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
33 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
34 #ifdef TARGET_COMPILER_sparcWorks
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
35 # include "utilities/globalDefinitions_sparcWorks.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
36 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
37
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
38 #include "utilities/macros.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
39
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // This file holds all globally used constants & types, class (forward)
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // declarations and a few frequently used utility functions.
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Constants
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 const int LogBytesPerShort = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 const int LogBytesPerInt = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
49 const int LogBytesPerWord = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
51 const int LogBytesPerWord = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
53 const int LogBytesPerLong = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 const int BytesPerShort = 1 << LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 const int BytesPerInt = 1 << LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 const int BytesPerWord = 1 << LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 const int BytesPerLong = 1 << LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 const int LogBitsPerByte = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 const int LogBitsPerShort = LogBitsPerByte + LogBytesPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const int LogBitsPerInt = LogBitsPerByte + LogBytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 const int LogBitsPerWord = LogBitsPerByte + LogBytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 const int LogBitsPerLong = LogBitsPerByte + LogBytesPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 const int BitsPerByte = 1 << LogBitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 const int BitsPerShort = 1 << LogBitsPerShort;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 const int BitsPerInt = 1 << LogBitsPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 const int BitsPerWord = 1 << LogBitsPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 const int BitsPerLong = 1 << LogBitsPerLong;
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 const int WordAlignmentMask = (1 << LogBytesPerWord) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 const int LongAlignmentMask = (1 << LogBytesPerLong) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 const int WordsPerLong = 2; // Number of stack entries for longs
a61af66fc99e Initial load
duke
parents:
diff changeset
76
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
77 const int oopSize = sizeof(char*); // Full-width oop
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
78 extern int heapOopSize; // Oop within a java object
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 const int wordSize = sizeof(char*);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 const int longSize = sizeof(jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 const int jintSize = sizeof(jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 const int size_tSize = sizeof(size_t);
a61af66fc99e Initial load
duke
parents:
diff changeset
83
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
84 const int BytesPerOop = BytesPerWord; // Full-width oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
86 extern int LogBytesPerHeapOop; // Oop within a java object
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
87 extern int LogBitsPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
88 extern int BytesPerHeapOop;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
89 extern int BitsPerHeapOop;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
91 // Oop encoding heap max
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
92 extern uint64_t OopEncodingHeapMax;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
93
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 const int BitsPerJavaInteger = 32;
559
7628781568e1 6795362: 32bit server compiler leads to wrong results on solaris-x86
twisti
parents: 361
diff changeset
95 const int BitsPerJavaLong = 64;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 const int BitsPerSize_t = size_tSize * BitsPerByte;
a61af66fc99e Initial load
duke
parents:
diff changeset
97
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
98 // Size of a char[] needed to represent a jint as a string in decimal.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
99 const int jintAsStringSize = 12;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
100
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // In fact this should be
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // log2_intptr(sizeof(class JavaThread)) - log2_intptr(64);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // see os::set_memory_serialize_page()
a61af66fc99e Initial load
duke
parents:
diff changeset
104 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
105 const int SerializePageShiftCount = 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
107 const int SerializePageShiftCount = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // An opaque struct of heap-word width, so that HeapWord* can be a generic
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // pointer into the heap. We require that object sizes be measured in
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // units of heap words, so that that
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // HeapWord* hw;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // hw += oop(hw)->foo();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // works, where foo is a method (like size or scavenge) that returns the
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // object size.
a61af66fc99e Initial load
duke
parents:
diff changeset
117 class HeapWord {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 friend class VMStructs;
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
119 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 char* i;
361
a4f9ef0c0375 6743059: Error in spaceDecorator.cpp "optimized" build.
jmasa
parents: 269
diff changeset
121 #ifndef PRODUCT
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
122 public:
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
123 char* value() { return i; }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 145
diff changeset
124 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125 };
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // HeapWordSize must be 2^LogHeapWordSize.
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
128 const int HeapWordSize = sizeof(HeapWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
129 #ifdef _LP64
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
130 const int LogHeapWordSize = 3;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #else
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
132 const int LogHeapWordSize = 2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
134 const int HeapWordsPerLong = BytesPerLong / HeapWordSize;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
135 const int LogHeapWordsPerLong = LogBytesPerLong - LogHeapWordSize;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // The larger HeapWordSize for 64bit requires larger heaps
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // for the same application running in 64bit. See bug 4967770.
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // The minimum alignment to a heap word size is done. Other
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // parts of the memory system may required additional alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // and are responsible for those alignments.
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
143 #define ScaleForWordSize(x) align_size_down_((x) * 13 / 10, HeapWordSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
144 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #define ScaleForWordSize(x) (x)
a61af66fc99e Initial load
duke
parents:
diff changeset
146 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // The minimum number of native machine words necessary to contain "byte_size"
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
150 inline size_t heap_word_size(size_t byte_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 return (byte_size + (HeapWordSize-1)) >> LogHeapWordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 const size_t K = 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 const size_t M = K*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 const size_t G = M*K;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 const size_t HWperKB = K / sizeof(HeapWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
159
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 726
diff changeset
160 const size_t LOG_K = 10;
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 726
diff changeset
161 const size_t LOG_M = 2 * LOG_K;
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 726
diff changeset
162 const size_t LOG_G = 2 * LOG_M;
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 726
diff changeset
163
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164 const jint min_jint = (jint)1 << (sizeof(jint)*BitsPerByte-1); // 0x80000000 == smallest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
165 const jint max_jint = (juint)min_jint - 1; // 0x7FFFFFFF == largest jint
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Constants for converting from a base unit to milli-base units. For
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // example from seconds to milliseconds and microseconds
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 const int MILLIUNITS = 1000; // milli units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
171 const int MICROUNITS = 1000000; // micro units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
172 const int NANOUNITS = 1000000000; // nano units per base unit
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 inline const char* proper_unit_for_byte_size(size_t s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 if (s >= 10*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 return "M";
a61af66fc99e Initial load
duke
parents:
diff changeset
177 } else if (s >= 10*K) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 return "K";
a61af66fc99e Initial load
duke
parents:
diff changeset
179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return "B";
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 inline size_t byte_size_in_proper_unit(size_t s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (s >= 10*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return s/M;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 } else if (s >= 10*K) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return s/K;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return s;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194
a61af66fc99e Initial load
duke
parents:
diff changeset
195 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // VM type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // intx and uintx are the 'extended' int and 'extended' unsigned int types;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // they are 32bit wide on a 32-bit platform, and 64bit wide on a 64bit platform.
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 typedef intptr_t intx;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 typedef uintptr_t uintx;
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 const intx min_intx = (intx)1 << (sizeof(intx)*BitsPerByte-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 const intx max_intx = (uintx)min_intx - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
206 const uintx max_uintx = (uintx)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Table of values:
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // sizeof intx 4 8
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // min_intx 0x80000000 0x8000000000000000
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // max_intx 0x7FFFFFFF 0x7FFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // max_uintx 0xFFFFFFFF 0xFFFFFFFFFFFFFFFF
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 typedef unsigned int uint; NEEDS_CLEANUP
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Java type definitions
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // All kinds of 'plain' byte addresses
a61af66fc99e Initial load
duke
parents:
diff changeset
221 typedef signed char s_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
222 typedef unsigned char u_char;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 typedef u_char* address;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 typedef uintptr_t address_word; // unsigned integer which will hold a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // except for some implementations of a C++
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // linkage pointer to function. Should never
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // need one of those to be placed in this
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // type anyway.
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // Utility functions to "portably" (?) bit twiddle pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Where portable means keep ANSI C++ compilers quiet
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 inline address set_address_bits(address x, int m) { return address(intptr_t(x) | m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 inline address clear_address_bits(address x, int m) { return address(intptr_t(x) & ~m); }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Utility functions to "portably" make cast to/from function pointers.
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 inline address_word mask_address_bits(address x, int m) { return address_word(x) & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 inline address_word castable_address(address x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 inline address_word castable_address(void* x) { return address_word(x) ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
241
a61af66fc99e Initial load
duke
parents:
diff changeset
242 // Pointer subtraction.
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // The idea here is to avoid ptrdiff_t, which is signed and so doesn't have
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // the range we might need to find differences from one end of the heap
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // to the other.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 // A typical use might be:
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // if (pointer_delta(end(), top()) >= size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // // enough room for an object of size
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
250 // and then additions like
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // ... top() + size ...
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // are safe because we know that top() is at least size below end().
a61af66fc99e Initial load
duke
parents:
diff changeset
253 inline size_t pointer_delta(const void* left,
a61af66fc99e Initial load
duke
parents:
diff changeset
254 const void* right,
a61af66fc99e Initial load
duke
parents:
diff changeset
255 size_t element_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 return (((uintptr_t) left) - ((uintptr_t) right)) / element_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // A version specialized for HeapWord*'s.
a61af66fc99e Initial load
duke
parents:
diff changeset
259 inline size_t pointer_delta(const HeapWord* left, const HeapWord* right) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return pointer_delta(left, right, sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 //
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // ANSI C++ does not allow casting from one pointer type to a function pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // directly without at best a warning. This macro accomplishes it silently
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // In every case that is present at this point the value be cast is a pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // to a C linkage function. In somecase the type used for the cast reflects
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // that linkage and a picky compiler would not complain. In other cases because
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // there is no convenient place to place a typedef with extern C linkage (i.e
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // a platform dependent header file) it doesn't. At this point no compiler seems
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // picky enough to catch these instances (which are few). It is possible that
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // using templates could fix these for all cases. This use of templates is likely
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // so far from the middle of the road that it is likely to be problematic in
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // many C++ compilers.
a61af66fc99e Initial load
duke
parents:
diff changeset
275 //
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #define CAST_TO_FN_PTR(func_type, value) ((func_type)(castable_address(value)))
a61af66fc99e Initial load
duke
parents:
diff changeset
277 #define CAST_FROM_FN_PTR(new_type, func_ptr) ((new_type)((address_word)(func_ptr)))
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // Unsigned byte types for os and stream.hpp
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Unsigned one, two, four and eigth byte quantities used for describing
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // the .class file format. See JVM book chapter 4.
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 typedef jubyte u1;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 typedef jushort u2;
a61af66fc99e Initial load
duke
parents:
diff changeset
286 typedef juint u4;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 typedef julong u8;
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 const jubyte max_jubyte = (jubyte)-1; // 0xFF largest jubyte
a61af66fc99e Initial load
duke
parents:
diff changeset
290 const jushort max_jushort = (jushort)-1; // 0xFFFF largest jushort
a61af66fc99e Initial load
duke
parents:
diff changeset
291 const juint max_juint = (juint)-1; // 0xFFFFFFFF largest juint
a61af66fc99e Initial load
duke
parents:
diff changeset
292 const julong max_julong = (julong)-1; // 0xFF....FF largest julong
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // JVM spec restrictions
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 const int max_method_code_size = 64*K - 1; // JVM spec, 2nd ed. section 4.8.1 (p.134)
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // HotSwap - for JVMTI aka Class File Replacement and PopFrame
a61af66fc99e Initial load
duke
parents:
diff changeset
302 //
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // Determines whether on-the-fly class replacement and frame popping are enabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 #define HOTSWAP
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Object alignment, in units of HeapWords.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 //
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // Minimum is max(BytesPerLong, BytesPerDouble, BytesPerOop) / HeapWordSize, so jlong, jdouble and
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // reference fields can be naturally aligned.
a61af66fc99e Initial load
duke
parents:
diff changeset
312
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
313 extern int MinObjAlignment;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
314 extern int MinObjAlignmentInBytes;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
315 extern int MinObjAlignmentInBytesMask;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
317 extern int LogMinObjAlignment;
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
318 extern int LogMinObjAlignmentInBytes;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
319
0
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Machine dependent stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
321
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
322 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
323 # include "globalDefinitions_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
324 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
325 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
326 # include "globalDefinitions_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
327 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
328 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
329 # include "globalDefinitions_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
330 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
331
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // The byte alignment to be used by Arena::Amalloc. See bugid 4169348.
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // Note: this value must be a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 #define ARENA_AMALLOC_ALIGNMENT (2*BytesPerWord)
a61af66fc99e Initial load
duke
parents:
diff changeset
337
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // Signed variants of alignment helpers. There are two versions of each, a macro
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // for use in places like enum definitions that require compile-time constant
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // expressions and a function for all other places so as to get type checking.
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 #define align_size_up_(size, alignment) (((size) + ((alignment) - 1)) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 inline intptr_t align_size_up(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
345 return align_size_up_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 #define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 inline intptr_t align_size_down(intptr_t size, intptr_t alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 return align_size_down_(size, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 // Align objects by rounding up their size, in HeapWord units.
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 #define align_object_size_(size) align_size_up_(size, MinObjAlignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 inline intptr_t align_object_size(intptr_t size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 return align_size_up(size, MinObjAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
362 inline bool is_object_aligned(intptr_t addr) {
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
363 return addr == align_object_size(addr);
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
364 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1311
diff changeset
366 // Pad out certain offsets to jlong alignment, in HeapWord units.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 inline intptr_t align_object_offset(intptr_t offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 return align_size_up(offset, HeapWordsPerLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
1665
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
372 // The expected size in bytes of a cache line, used to pad data structures.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
373 #define DEFAULT_CACHE_LINE_SIZE 64
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
374
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
375 // Bytes needed to pad type to avoid cache-line sharing; alignment should be the
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
376 // expected cache line size (a power of two). The first addend avoids sharing
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
377 // when the start address is not a multiple of alignment; the second maintains
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
378 // alignment of starting addresses that happen to be a multiple.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
379 #define PADDING_SIZE(type, alignment) \
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
380 ((alignment) + align_size_up_(sizeof(type), alignment))
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
381
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
382 // Templates to create a subclass padded to avoid cache line sharing. These are
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
383 // effective only when applied to derived-most (leaf) classes.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
384
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
385 // When no args are passed to the base ctor.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
386 template <class T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
387 class Padded: public T {
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
388 private:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
389 char _pad_buf_[PADDING_SIZE(T, alignment)];
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
390 };
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
391
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
392 // When either 0 or 1 args may be passed to the base ctor.
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
393 template <class T, typename Arg1T, size_t alignment = DEFAULT_CACHE_LINE_SIZE>
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
394 class Padded01: public T {
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
395 public:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
396 Padded01(): T() { }
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
397 Padded01(Arg1T arg1): T(arg1) { }
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
398 private:
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
399 char _pad_buf_[PADDING_SIZE(T, alignment)];
a93a9eda13f7 6962947: shared TaskQueue statistics
jcoomes
parents: 1579
diff changeset
400 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // Utility macros for compilers
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // used to silence compiler warnings
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 #define Unused_Variable(var) var
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Miscellaneous
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // 6302670 Eliminate Hotspot __fabsf dependency
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // All fabs() callers should call this function instead, which will implicitly
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // convert the operand to double, avoiding a dependency on __fabsf which
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // doesn't exist in early versions of Solaris 8.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 inline double fabsd(double value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 return fabs(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
419
a61af66fc99e Initial load
duke
parents:
diff changeset
420 inline jint low (jlong value) { return jint(value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 inline jint high(jlong value) { return jint(value >> 32); }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // the fancy casts are a hopefully portable way
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // to do unsigned 32 to 64 bit type conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
425 inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32;
a61af66fc99e Initial load
duke
parents:
diff changeset
426 *value |= (jlong)(julong)(juint)low; }
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
429 *value |= (jlong)high << 32; }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 inline jlong jlong_from(jint h, jint l) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 jlong result = 0; // initialization to avoid warning
a61af66fc99e Initial load
duke
parents:
diff changeset
433 set_high(&result, h);
a61af66fc99e Initial load
duke
parents:
diff changeset
434 set_low(&result, l);
a61af66fc99e Initial load
duke
parents:
diff changeset
435 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 union jlong_accessor {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 jint words[2];
a61af66fc99e Initial load
duke
parents:
diff changeset
440 jlong long_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
441 };
a61af66fc99e Initial load
duke
parents:
diff changeset
442
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
443 void basic_types_init(); // cannot define here; uses assert
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
447 enum BasicType {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 T_BOOLEAN = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
449 T_CHAR = 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
450 T_FLOAT = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
451 T_DOUBLE = 7,
a61af66fc99e Initial load
duke
parents:
diff changeset
452 T_BYTE = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
453 T_SHORT = 9,
a61af66fc99e Initial load
duke
parents:
diff changeset
454 T_INT = 10,
a61af66fc99e Initial load
duke
parents:
diff changeset
455 T_LONG = 11,
a61af66fc99e Initial load
duke
parents:
diff changeset
456 T_OBJECT = 12,
a61af66fc99e Initial load
duke
parents:
diff changeset
457 T_ARRAY = 13,
a61af66fc99e Initial load
duke
parents:
diff changeset
458 T_VOID = 14,
a61af66fc99e Initial load
duke
parents:
diff changeset
459 T_ADDRESS = 15,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
460 T_NARROWOOP= 16,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
461 T_CONFLICT = 17, // for stack value type with conflicting contents
0
a61af66fc99e Initial load
duke
parents:
diff changeset
462 T_ILLEGAL = 99
a61af66fc99e Initial load
duke
parents:
diff changeset
463 };
a61af66fc99e Initial load
duke
parents:
diff changeset
464
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
465 inline bool is_java_primitive(BasicType t) {
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
466 return T_BOOLEAN <= t && t <= T_LONG;
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
467 }
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
468
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
469 inline bool is_subword_type(BasicType t) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
470 // these guys are processed exactly like T_INT in calling sequences:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
471 return (t == T_BOOLEAN || t == T_CHAR || t == T_BYTE || t == T_SHORT);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
472 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
473
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
474 inline bool is_signed_subword_type(BasicType t) {
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
475 return (t == T_BYTE || t == T_SHORT);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
476 }
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 605
diff changeset
477
0
a61af66fc99e Initial load
duke
parents:
diff changeset
478 // Convert a char from a classfile signature to a BasicType
a61af66fc99e Initial load
duke
parents:
diff changeset
479 inline BasicType char2type(char c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 switch( c ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 case 'B': return T_BYTE;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 case 'C': return T_CHAR;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 case 'D': return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
484 case 'F': return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 case 'I': return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 case 'J': return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 case 'S': return T_SHORT;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 case 'Z': return T_BOOLEAN;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 case 'V': return T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 case 'L': return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 case '[': return T_ARRAY;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 extern char type2char_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
497 inline char type2char(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2char_tab[t] : 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 extern int type2size[T_CONFLICT+1]; // Map BasicType to result stack elements
a61af66fc99e Initial load
duke
parents:
diff changeset
499 extern const char* type2name_tab[T_CONFLICT+1]; // Map a BasicType to a jchar
a61af66fc99e Initial load
duke
parents:
diff changeset
500 inline const char* type2name(BasicType t) { return (uint)t < T_CONFLICT+1 ? type2name_tab[t] : NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 extern BasicType name2type(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // Auxilary math routines
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // least common multiple
a61af66fc99e Initial load
duke
parents:
diff changeset
505 extern size_t lcm(size_t a, size_t b);
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/runtime/BasicType.java
a61af66fc99e Initial load
duke
parents:
diff changeset
509 enum BasicTypeSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
510 T_BOOLEAN_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 T_CHAR_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
512 T_FLOAT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
513 T_DOUBLE_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
514 T_BYTE_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
515 T_SHORT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
516 T_INT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
517 T_LONG_size = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
518 T_OBJECT_size = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
519 T_ARRAY_size = 1,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
520 T_NARROWOOP_size = 1,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
521 T_VOID_size = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
522 };
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // maps a BasicType to its instance field storage type:
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // all sub-word integral types are widened to T_INT
a61af66fc99e Initial load
duke
parents:
diff changeset
527 extern BasicType type2field[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
528 extern BasicType type2wfield[T_CONFLICT+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
532 enum ArrayElementSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
533 T_BOOLEAN_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
534 T_CHAR_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
535 T_FLOAT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
536 T_DOUBLE_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
537 T_BYTE_aelem_bytes = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
538 T_SHORT_aelem_bytes = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
539 T_INT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
540 T_LONG_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
541 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
542 T_OBJECT_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
543 T_ARRAY_aelem_bytes = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
544 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
545 T_OBJECT_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
546 T_ARRAY_aelem_bytes = 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
547 #endif
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 29
diff changeset
548 T_NARROWOOP_aelem_bytes = 4,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 T_VOID_aelem_bytes = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 };
a61af66fc99e Initial load
duke
parents:
diff changeset
551
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
552 extern int _type2aelembytes[T_CONFLICT+1]; // maps a BasicType to nof bytes used by its array element
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
553 #ifdef ASSERT
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
554 extern int type2aelembytes(BasicType t, bool allow_address = false); // asserts
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
555 #else
1763
d6f45b55c972 4809552: Optimize Arrays.fill(...)
never
parents: 1665
diff changeset
556 inline int type2aelembytes(BasicType t, bool allow_address = false) { return _type2aelembytes[t]; }
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
557 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // JavaValue serves as a container for arbitrary Java values.
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 class JavaValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
565 typedef union JavaCallValue {
a61af66fc99e Initial load
duke
parents:
diff changeset
566 jfloat f;
a61af66fc99e Initial load
duke
parents:
diff changeset
567 jdouble d;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 jint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
569 jlong l;
a61af66fc99e Initial load
duke
parents:
diff changeset
570 jobject h;
a61af66fc99e Initial load
duke
parents:
diff changeset
571 } JavaCallValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
574 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
575 JavaCallValue _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 JavaValue(BasicType t = T_ILLEGAL) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 JavaValue(jfloat value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 _type = T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
582 _value.f = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
583 }
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 JavaValue(jdouble value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 _type = T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _value.d = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 jfloat get_jfloat() const { return _value.f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
591 jdouble get_jdouble() const { return _value.d; }
a61af66fc99e Initial load
duke
parents:
diff changeset
592 jint get_jint() const { return _value.i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
593 jlong get_jlong() const { return _value.l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 jobject get_jobject() const { return _value.h; }
a61af66fc99e Initial load
duke
parents:
diff changeset
595 JavaCallValue* get_value_addr() { return &_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
596 BasicType get_type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 void set_jfloat(jfloat f) { _value.f = f;}
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void set_jdouble(jdouble d) { _value.d = d;}
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void set_jint(jint i) { _value.i = i;}
a61af66fc99e Initial load
duke
parents:
diff changeset
601 void set_jlong(jlong l) { _value.l = l;}
a61af66fc99e Initial load
duke
parents:
diff changeset
602 void set_jobject(jobject h) { _value.h = h;}
a61af66fc99e Initial load
duke
parents:
diff changeset
603 void set_type(BasicType t) { _type = t; }
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 jboolean get_jboolean() const { return (jboolean) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
606 jbyte get_jbyte() const { return (jbyte) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
607 jchar get_jchar() const { return (jchar) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
608 jshort get_jshort() const { return (jshort) (_value.i);}
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 };
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 #define STACK_BIAS 0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 // V9 Sparc CPU's running in 64 Bit mode use a stack bias of 7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // in order to extend the reach of the stack pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
616 #if defined(SPARC) && defined(_LP64)
a61af66fc99e Initial load
duke
parents:
diff changeset
617 #undef STACK_BIAS
a61af66fc99e Initial load
duke
parents:
diff changeset
618 #define STACK_BIAS 0x7ff
a61af66fc99e Initial load
duke
parents:
diff changeset
619 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 // TosState describes the top-of-stack state before and after the execution of
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // a bytecode or method. The top-of-stack value may be cached in one or more CPU
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // registers. The TosState corresponds to the 'machine represention' of this cached
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // value. There's 4 states corresponding to the JAVA types int, long, float & double
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // as well as a 5th state in case the top-of-stack value is actually on the top
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // of stack (in memory) and thus not cached. The atos state corresponds to the itos
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // state when it comes to machine representation but is used separately for (oop)
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // type specific operations (e.g. verification code).
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 enum TosState { // describes the tos cache contents
a61af66fc99e Initial load
duke
parents:
diff changeset
632 btos = 0, // byte, bool tos cached
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
633 ctos = 1, // char tos cached
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
634 stos = 2, // short tos cached
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 itos = 3, // int tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
636 ltos = 4, // long tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
637 ftos = 5, // float tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
638 dtos = 6, // double tos cached
a61af66fc99e Initial load
duke
parents:
diff changeset
639 atos = 7, // object cached
a61af66fc99e Initial load
duke
parents:
diff changeset
640 vtos = 8, // tos not cached
a61af66fc99e Initial load
duke
parents:
diff changeset
641 number_of_states,
a61af66fc99e Initial load
duke
parents:
diff changeset
642 ilgl // illegal state: should not occur
a61af66fc99e Initial load
duke
parents:
diff changeset
643 };
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 inline TosState as_TosState(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
648 case T_BYTE : return btos;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
649 case T_BOOLEAN: return btos; // FIXME: Add ztos
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 case T_CHAR : return ctos;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 case T_SHORT : return stos;
a61af66fc99e Initial load
duke
parents:
diff changeset
652 case T_INT : return itos;
a61af66fc99e Initial load
duke
parents:
diff changeset
653 case T_LONG : return ltos;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 case T_FLOAT : return ftos;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 case T_DOUBLE : return dtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
656 case T_VOID : return vtos;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 case T_ARRAY : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
658 case T_OBJECT : return atos;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660 return ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
663 inline BasicType as_BasicType(TosState state) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
664 switch (state) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
665 //case ztos: return T_BOOLEAN;//FIXME
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
666 case btos : return T_BYTE;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
667 case ctos : return T_CHAR;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
668 case stos : return T_SHORT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
669 case itos : return T_INT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
670 case ltos : return T_LONG;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
671 case ftos : return T_FLOAT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
672 case dtos : return T_DOUBLE;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
673 case atos : return T_OBJECT;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
674 case vtos : return T_VOID;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
675 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
676 return T_ILLEGAL;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
677 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
678
0
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // Helper function to convert BasicType info into TosState
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // Note: Cannot define here as it uses global constant at the time being.
a61af66fc99e Initial load
duke
parents:
diff changeset
682 TosState as_TosState(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // ReferenceType is used to distinguish between java/lang/ref/Reference subclasses
a61af66fc99e Initial load
duke
parents:
diff changeset
686
a61af66fc99e Initial load
duke
parents:
diff changeset
687 enum ReferenceType {
a61af66fc99e Initial load
duke
parents:
diff changeset
688 REF_NONE, // Regular class
a61af66fc99e Initial load
duke
parents:
diff changeset
689 REF_OTHER, // Subclass of java/lang/ref/Reference, but not subclass of one of the classes below
a61af66fc99e Initial load
duke
parents:
diff changeset
690 REF_SOFT, // Subclass of java/lang/ref/SoftReference
a61af66fc99e Initial load
duke
parents:
diff changeset
691 REF_WEAK, // Subclass of java/lang/ref/WeakReference
a61af66fc99e Initial load
duke
parents:
diff changeset
692 REF_FINAL, // Subclass of java/lang/ref/FinalReference
a61af66fc99e Initial load
duke
parents:
diff changeset
693 REF_PHANTOM // Subclass of java/lang/ref/PhantomReference
a61af66fc99e Initial load
duke
parents:
diff changeset
694 };
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // JavaThreadState keeps track of which part of the code a thread is executing in. This
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // information is needed by the safepoint code.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 //
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // There are 4 essential states:
a61af66fc99e Initial load
duke
parents:
diff changeset
701 //
a61af66fc99e Initial load
duke
parents:
diff changeset
702 // _thread_new : Just started, but not executed init. code yet (most likely still in OS init code)
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // _thread_in_native : In native code. This is a safepoint region, since all oops will be in jobject handles
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // _thread_in_vm : Executing in the vm
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // _thread_in_Java : Executing either interpreted or compiled Java code (or could be in a stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
706 //
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Each state has an associated xxxx_trans state, which is an intermediate state used when a thread is in
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // a transition from one state to another. These extra states makes it possible for the safepoint code to
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // handle certain thread_states without having to suspend the thread - making the safepoint code faster.
a61af66fc99e Initial load
duke
parents:
diff changeset
710 //
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // Given a state, the xxx_trans state can always be found by adding 1.
a61af66fc99e Initial load
duke
parents:
diff changeset
712 //
a61af66fc99e Initial load
duke
parents:
diff changeset
713 enum JavaThreadState {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 _thread_uninitialized = 0, // should never happen (missing initialization)
a61af66fc99e Initial load
duke
parents:
diff changeset
715 _thread_new = 2, // just starting up, i.e., in process of being initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
716 _thread_new_trans = 3, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
717 _thread_in_native = 4, // running in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
718 _thread_in_native_trans = 5, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
719 _thread_in_vm = 6, // running in VM
a61af66fc99e Initial load
duke
parents:
diff changeset
720 _thread_in_vm_trans = 7, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
721 _thread_in_Java = 8, // running in Java or in stub code
a61af66fc99e Initial load
duke
parents:
diff changeset
722 _thread_in_Java_trans = 9, // corresponding transition state (not used, included for completness)
a61af66fc99e Initial load
duke
parents:
diff changeset
723 _thread_blocked = 10, // blocked in vm
a61af66fc99e Initial load
duke
parents:
diff changeset
724 _thread_blocked_trans = 11, // corresponding transition state
a61af66fc99e Initial load
duke
parents:
diff changeset
725 _thread_max_state = 12 // maximum thread state+1 - used for statistics allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
726 };
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // Handy constants for deciding which compiler mode to use.
a61af66fc99e Initial load
duke
parents:
diff changeset
730 enum MethodCompilation {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 InvocationEntryBci = -1, // i.e., not a on-stack replacement compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
732 InvalidOSREntryBci = -2
a61af66fc99e Initial load
duke
parents:
diff changeset
733 };
a61af66fc99e Initial load
duke
parents:
diff changeset
734
a61af66fc99e Initial load
duke
parents:
diff changeset
735 // Enumeration to distinguish tiers of compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
736 enum CompLevel {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
737 CompLevel_any = -1,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
738 CompLevel_all = -1,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
739 CompLevel_none = 0, // Interpreter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
740 CompLevel_simple = 1, // C1
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
741 CompLevel_limited_profile = 2, // C1, invocation & backedge counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
742 CompLevel_full_profile = 3, // C1, invocation & backedge counters + mdo
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
743 CompLevel_full_optimization = 4, // C2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
744
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
745 #if defined(COMPILER2)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
746 CompLevel_highest_tier = CompLevel_full_optimization, // pure C2 and tiered
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
747 #elif defined(COMPILER1)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
748 CompLevel_highest_tier = CompLevel_simple, // pure C1
0
a61af66fc99e Initial load
duke
parents:
diff changeset
749 #else
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
750 CompLevel_highest_tier = CompLevel_none,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
751 #endif
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
752
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
753 #if defined(TIERED)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
754 CompLevel_initial_compile = CompLevel_full_profile // tiered
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
755 #elif defined(COMPILER1)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
756 CompLevel_initial_compile = CompLevel_simple // pure C1
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
757 #elif defined(COMPILER2)
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
758 CompLevel_initial_compile = CompLevel_full_optimization // pure C2
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
759 #else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
760 CompLevel_initial_compile = CompLevel_none
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
761 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
762 };
a61af66fc99e Initial load
duke
parents:
diff changeset
763
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
764 inline bool is_c1_compile(int comp_level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
765 return comp_level > CompLevel_none && comp_level < CompLevel_full_optimization;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
766 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
767
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
768 inline bool is_c2_compile(int comp_level) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
769 return comp_level == CompLevel_full_optimization;
a61af66fc99e Initial load
duke
parents:
diff changeset
770 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1763
diff changeset
771
0
a61af66fc99e Initial load
duke
parents:
diff changeset
772 inline bool is_highest_tier_compile(int comp_level) {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 return comp_level == CompLevel_highest_tier;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // 'Forward' declarations of frequently used classes
a61af66fc99e Initial load
duke
parents:
diff changeset
778 // (in order to reduce interface dependencies & reduce
a61af66fc99e Initial load
duke
parents:
diff changeset
779 // number of unnecessary compilations after changes)
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 class symbolTable;
a61af66fc99e Initial load
duke
parents:
diff changeset
782 class ClassFileStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784 class Event;
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 class Thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
787 class VMThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
788 class JavaThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
789 class Threads;
a61af66fc99e Initial load
duke
parents:
diff changeset
790
a61af66fc99e Initial load
duke
parents:
diff changeset
791 class VM_Operation;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 class VMOperationQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 class CodeBlob;
a61af66fc99e Initial load
duke
parents:
diff changeset
795 class nmethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
796 class OSRAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
797 class I2CAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
798 class C2IAdapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 class CompiledIC;
a61af66fc99e Initial load
duke
parents:
diff changeset
800 class relocInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
801 class ScopeDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
802 class PcDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
803
a61af66fc99e Initial load
duke
parents:
diff changeset
804 class Recompiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
805 class Recompilee;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 class RecompilationPolicy;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 class RFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 class CompiledRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
809 class InterpretedRFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 class frame;
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 class vframe;
a61af66fc99e Initial load
duke
parents:
diff changeset
814 class javaVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 class interpretedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 class compiledVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
817 class deoptimizedVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
818 class externalVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 class entryVFrame;
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 class RegisterMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 class Mutex;
a61af66fc99e Initial load
duke
parents:
diff changeset
824 class Monitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
825 class BasicLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 class BasicObjectLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
827
a61af66fc99e Initial load
duke
parents:
diff changeset
828 class PeriodicTask;
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 class JavaCallWrapper;
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 class oopDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834 class NativeCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 class zone;
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 class StubQueue;
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 class outputStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 class ResourceArea;
a61af66fc99e Initial load
duke
parents:
diff changeset
843
a61af66fc99e Initial load
duke
parents:
diff changeset
844 class DebugInformationRecorder;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 class ScopeValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
846 class CompressedStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 class DebugInfoReadStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
848 class DebugInfoWriteStream;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 class LocationValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
850 class ConstantValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 class IllegalValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
852
a61af66fc99e Initial load
duke
parents:
diff changeset
853 class PrivilegedElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 class MonitorArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 class MonitorInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
857
a61af66fc99e Initial load
duke
parents:
diff changeset
858 class OffsetClosure;
a61af66fc99e Initial load
duke
parents:
diff changeset
859 class OopMapCache;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 class InterpreterOopMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
861 class OopMapCacheEntry;
a61af66fc99e Initial load
duke
parents:
diff changeset
862 class OSThread;
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 typedef int (*OSThreadStartFunc)(void*);
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 class Space;
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 class JavaValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
869 class methodHandle;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 class JavaCallArguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // Basic support for errors (general debug facilities not defined at this point fo the include phase)
a61af66fc99e Initial load
duke
parents:
diff changeset
873
a61af66fc99e Initial load
duke
parents:
diff changeset
874 extern void basic_fatal(const char* msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
875
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // Special constants for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 const jint badInt = -3; // generic "bad int" value
a61af66fc99e Initial load
duke
parents:
diff changeset
881 const long badAddressVal = -2; // generic "bad address" value
a61af66fc99e Initial load
duke
parents:
diff changeset
882 const long badOopVal = -1; // generic "bad oop" value
a61af66fc99e Initial load
duke
parents:
diff changeset
883 const intptr_t badHeapOopVal = (intptr_t) CONST64(0x2BAD4B0BBAADBABE); // value used to zap heap after GC
a61af66fc99e Initial load
duke
parents:
diff changeset
884 const int badHandleValue = 0xBC; // value used to zap vm handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
885 const int badResourceValue = 0xAB; // value used to zap resource area
a61af66fc99e Initial load
duke
parents:
diff changeset
886 const int freeBlockPad = 0xBA; // value used to pad freed blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
887 const int uninitBlockPad = 0xF1; // value used to zap newly malloc'd blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
888 const intptr_t badJNIHandleVal = (intptr_t) CONST64(0xFEFEFEFEFEFEFEFE); // value used to zap jni handle area
a61af66fc99e Initial load
duke
parents:
diff changeset
889 const juint badHeapWordVal = 0xBAADBABE; // value used to zap heap after GC
a61af66fc99e Initial load
duke
parents:
diff changeset
890 const int badCodeHeapNewVal= 0xCC; // value used to zap Code heap at allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
891 const int badCodeHeapFreeVal = 0xDD; // value used to zap Code heap at deallocation
a61af66fc99e Initial load
duke
parents:
diff changeset
892
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894 // (These must be implemented as #defines because C++ compilers are
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // not obligated to inline non-integral constants!)
a61af66fc99e Initial load
duke
parents:
diff changeset
896 #define badAddress ((address)::badAddressVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
897 #define badOop ((oop)::badOopVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
898 #define badHeapWord (::badHeapWordVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
899 #define badJNIHandle ((oop)::badJNIHandleVal)
a61af66fc99e Initial load
duke
parents:
diff changeset
900
1311
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
901 // Default TaskQueue size is 16K (32-bit) or 128K (64-bit)
2a1472c30599 4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents: 1261
diff changeset
902 #define TASKQUEUE_SIZE (NOT_LP64(1<<14) LP64_ONLY(1<<17))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // Utility functions for bitfield manipulations
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 const intptr_t AllBits = ~0; // all bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
908 const intptr_t NoBits = 0; // no bits set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
909 const jlong NoLongBits = 0; // no bits set in a long
a61af66fc99e Initial load
duke
parents:
diff changeset
910 const intptr_t OneBit = 1; // only right_most bit set in a word
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // get a word with the n.th or the right-most or left-most n bits set
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // (note: #define used only so that they can be used in enum constant definitions)
a61af66fc99e Initial load
duke
parents:
diff changeset
914 #define nth_bit(n) (n >= BitsPerWord ? 0 : OneBit << (n))
a61af66fc99e Initial load
duke
parents:
diff changeset
915 #define right_n_bits(n) (nth_bit(n) - 1)
a61af66fc99e Initial load
duke
parents:
diff changeset
916 #define left_n_bits(n) (right_n_bits(n) << (n >= BitsPerWord ? 0 : (BitsPerWord - n)))
a61af66fc99e Initial load
duke
parents:
diff changeset
917
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // bit-operations using a mask m
a61af66fc99e Initial load
duke
parents:
diff changeset
919 inline void set_bits (intptr_t& x, intptr_t m) { x |= m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
920 inline void clear_bits (intptr_t& x, intptr_t m) { x &= ~m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
921 inline intptr_t mask_bits (intptr_t x, intptr_t m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
922 inline jlong mask_long_bits (jlong x, jlong m) { return x & m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 inline bool mask_bits_are_true (intptr_t flags, intptr_t mask) { return (flags & mask) == mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
924
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // bit-operations using the n.th bit
a61af66fc99e Initial load
duke
parents:
diff changeset
926 inline void set_nth_bit(intptr_t& x, int n) { set_bits (x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
927 inline void clear_nth_bit(intptr_t& x, int n) { clear_bits(x, nth_bit(n)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
928 inline bool is_set_nth_bit(intptr_t x, int n) { return mask_bits (x, nth_bit(n)) != NoBits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // returns the bitfield of x starting at start_bit_no with length field_length (no sign-extension!)
a61af66fc99e Initial load
duke
parents:
diff changeset
931 inline intptr_t bitfield(intptr_t x, int start_bit_no, int field_length) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 return mask_bits(x >> start_bit_no, right_n_bits(field_length));
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // Utility functions for integers
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Avoid use of global min/max macros which may cause unwanted double
a61af66fc99e Initial load
duke
parents:
diff changeset
940 // evaluation of arguments.
a61af66fc99e Initial load
duke
parents:
diff changeset
941 #ifdef max
a61af66fc99e Initial load
duke
parents:
diff changeset
942 #undef max
a61af66fc99e Initial load
duke
parents:
diff changeset
943 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 #ifdef min
a61af66fc99e Initial load
duke
parents:
diff changeset
946 #undef min
a61af66fc99e Initial load
duke
parents:
diff changeset
947 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
948
a61af66fc99e Initial load
duke
parents:
diff changeset
949 #define max(a,b) Do_not_use_max_use_MAX2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
950 #define min(a,b) Do_not_use_min_use_MIN2_instead
a61af66fc99e Initial load
duke
parents:
diff changeset
951
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // It is necessary to use templates here. Having normal overloaded
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // functions does not work because it is necessary to provide both 32-
a61af66fc99e Initial load
duke
parents:
diff changeset
954 // and 64-bit overloaded functions, which does not work, and having
a61af66fc99e Initial load
duke
parents:
diff changeset
955 // explicitly-typed versions of these routines (i.e., MAX2I, MAX2L)
a61af66fc99e Initial load
duke
parents:
diff changeset
956 // will be even more error-prone than macros.
a61af66fc99e Initial load
duke
parents:
diff changeset
957 template<class T> inline T MAX2(T a, T b) { return (a > b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
958 template<class T> inline T MIN2(T a, T b) { return (a < b) ? a : b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
959 template<class T> inline T MAX3(T a, T b, T c) { return MAX2(MAX2(a, b), c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
960 template<class T> inline T MIN3(T a, T b, T c) { return MIN2(MIN2(a, b), c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
961 template<class T> inline T MAX4(T a, T b, T c, T d) { return MAX2(MAX3(a, b, c), d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 template<class T> inline T MIN4(T a, T b, T c, T d) { return MIN2(MIN3(a, b, c), d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 template<class T> inline T ABS(T x) { return (x > 0) ? x : -x; }
a61af66fc99e Initial load
duke
parents:
diff changeset
965
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // true if x is a power of 2, false otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
967 inline bool is_power_of_2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
968 return ((x != NoBits) && (mask_bits(x, x - 1) == NoBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971 // long version of is_power_of_2
a61af66fc99e Initial load
duke
parents:
diff changeset
972 inline bool is_power_of_2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 return ((x != NoLongBits) && (mask_long_bits(x, x - 1) == NoLongBits));
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
977 // A negative value of 'x' will return '31'
a61af66fc99e Initial load
duke
parents:
diff changeset
978 inline int log2_intptr(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 uintptr_t p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
981 while (p != 0 && p <= (uintptr_t)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
983 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
984 }
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
986 // (if p = 0 then overflow occurred and i = 31)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 //* largest i such that 2^i <= x
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // A negative value of 'x' will return '63'
a61af66fc99e Initial load
duke
parents:
diff changeset
992 inline int log2_long(jlong x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 int i = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
994 julong p = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
995 while (p != 0 && p <= (julong)x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // p = 2^(i+1) && p <= x (i.e., 2^(i+1) <= x)
a61af66fc99e Initial load
duke
parents:
diff changeset
997 i++; p *= 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // p = 2^(i+1) && x < p (i.e., 2^i <= x < 2^(i+1))
605
98cb887364d3 6810672: Comment typos
twisti
parents: 570
diff changeset
1000 // (if p = 0 then overflow occurred and i = 63)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 //* the argument must be exactly a power of 2
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 inline int exact_log2(intptr_t x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 if (!is_power_of_2(x)) basic_fatal("x must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 return log2_intptr(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1011
568
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1012 //* the argument must be exactly a power of 2
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1013 inline int exact_log2_long(jlong x) {
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1014 #ifdef ASSERT
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1015 if (!is_power_of_2_long(x)) basic_fatal("x must be a power of 2");
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1016 #endif
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1017 return log2_long(x);
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1018 }
30663ca5e8f4 6805724: ModLNode::Ideal() generates functionally incorrect graph when divisor is any (2^k-1) constant.
twisti
parents: 559
diff changeset
1019
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1020
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 // returns integer round-up to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 inline intptr_t round_to(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 return mask_bits(x + m, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1029
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // returns integer round-down to the nearest multiple of s (s must be a power of two)
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 inline intptr_t round_down(intptr_t x, uintx s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 const uintx m = s - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 return mask_bits(x, ~m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 inline bool is_odd (intx x) { return x & 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 inline bool is_even(intx x) { return !is_odd(x); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 // "to" should be greater than "from."
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 inline intx byte_size(void* from, void* to) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 return (address)to - (address)from;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 // Avoid non-portable casts with these routines (DEPRECATED)
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // NOTE: USE Bytes class INSTEAD WHERE POSSIBLE
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // Bytes is optimized machine-specifically and may be much faster then the portable routines below.
a61af66fc99e Initial load
duke
parents:
diff changeset
1053
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 // Given sequence of four bytes, build into a 32-bit word
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // following the conventions used in class files.
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 // On the 386, this could be realized with a simple address cast.
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 // This routine takes eight bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 inline u8 build_u8_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1061 return (( u8(c1) << 56 ) & ( u8(0xff) << 56 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1062 | (( u8(c2) << 48 ) & ( u8(0xff) << 48 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1063 | (( u8(c3) << 40 ) & ( u8(0xff) << 40 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1064 | (( u8(c4) << 32 ) & ( u8(0xff) << 32 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1065 | (( u8(c5) << 24 ) & ( u8(0xff) << 24 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1066 | (( u8(c6) << 16 ) & ( u8(0xff) << 16 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1067 | (( u8(c7) << 8 ) & ( u8(0xff) << 8 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1068 | (( u8(c8) << 0 ) & ( u8(0xff) << 0 ));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 // This routine takes four bytes:
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 inline u4 build_u4_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1073 return (( u4(c1) << 24 ) & 0xff000000)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1074 | (( u4(c2) << 16 ) & 0x00ff0000)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1075 | (( u4(c3) << 8 ) & 0x0000ff00)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1076 | (( u4(c4) << 0 ) & 0x000000ff);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // And this one works if the four bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 inline u4 build_u4_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 return build_u4_from( p[0], p[1], p[2], p[3] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1083
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // Ditto for two-byte ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 inline u2 build_u2_from( u1 c1, u1 c2 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1086 return u2((( u2(c1) << 8 ) & 0xff00)
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1087 | (( u2(c2) << 0 ) & 0x00ff));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // And this one works if the two bytes are contiguous in memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 inline u2 build_u2_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 return build_u2_from( p[0], p[1] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 // Ditto for floats:
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 inline jfloat build_float_from( u1 c1, u1 c2, u1 c3, u1 c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 u4 u = build_u4_from( c1, c2, c3, c4 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 inline jfloat build_float_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 u4 u = build_u4_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 return *(jfloat*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // now (64-bit) longs
a61af66fc99e Initial load
duke
parents:
diff changeset
1108
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 inline jlong build_long_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
1789
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1110 return (( jlong(c1) << 56 ) & ( jlong(0xff) << 56 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1111 | (( jlong(c2) << 48 ) & ( jlong(0xff) << 48 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1112 | (( jlong(c3) << 40 ) & ( jlong(0xff) << 40 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1113 | (( jlong(c4) << 32 ) & ( jlong(0xff) << 32 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1114 | (( jlong(c5) << 24 ) & ( jlong(0xff) << 24 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1115 | (( jlong(c6) << 16 ) & ( jlong(0xff) << 16 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1116 | (( jlong(c7) << 8 ) & ( jlong(0xff) << 8 ))
a83b0246bb77 6934483: GCC 4.5 errors "suggest parentheses around something..." when compiling with -Werror and -Wall
twisti
parents: 1783
diff changeset
1117 | (( jlong(c8) << 0 ) & ( jlong(0xff) << 0 ));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 inline jlong build_long_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 return build_long_from( p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7] );
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // Doubles, too!
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 inline jdouble build_double_from( u1 c1, u1 c2, u1 c3, u1 c4, u1 c5, u1 c6, u1 c7, u1 c8 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 jlong u = build_long_from( c1, c2, c3, c4, c5, c6, c7, c8 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 inline jdouble build_double_from( u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 jlong u = build_long_from( p );
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 return *(jdouble*)&u;
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1135
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 // Portable routines to go the other way:
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 inline void explode_short_to( u2 x, u1& c1, u1& c2 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 c1 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 c2 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1143
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 inline void explode_short_to( u2 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 explode_short_to( x, p[0], p[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 inline void explode_int_to( u4 x, u1& c1, u1& c2, u1& c3, u1& c4 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 c1 = u1(x >> 24);
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 c2 = u1(x >> 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 c3 = u1(x >> 8);
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 c4 = u1(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 inline void explode_int_to( u4 x, u1* p ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 explode_int_to( x, p[0], p[1], p[2], p[3]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1158
a61af66fc99e Initial load
duke
parents:
diff changeset
1159
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // Pack and extract shorts to/from ints:
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 inline int extract_low_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 return x & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 inline int extract_high_short_from_int(jint x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 return (x >> 16) & 0xffff;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1169
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 inline int build_int_from_shorts( jushort low, jushort high ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 return ((int)((unsigned int)high << 16) | (unsigned int)low);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // Printf-style formatters for fixed- and variable-width types as pointers and
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // integers.
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 // Each compiler-specific definitions file (e.g., globalDefinitions_gcc.hpp)
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 // must define the macro FORMAT64_MODIFIER, which is the modifier for '%x' or
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 // '%d' formats to indicate a 64-bit quantity; commonly "l" (in LP64) or "ll"
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // (in ILP32).
a61af66fc99e Initial load
duke
parents:
diff changeset
1181
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 1972
diff changeset
1182 #define BOOL_TO_STR(__b) (__b) ? "true" : "false"
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 1972
diff changeset
1183
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 // Format 32-bit quantities.
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 #define INT32_FORMAT "%d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 #define UINT32_FORMAT "%u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 #define INT32_FORMAT_W(width) "%" #width "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 #define UINT32_FORMAT_W(width) "%" #width "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1189
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 #define PTR32_FORMAT "0x%08x"
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // Format 64-bit quantities.
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 #define INT64_FORMAT "%" FORMAT64_MODIFIER "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 #define UINT64_FORMAT "%" FORMAT64_MODIFIER "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 #define PTR64_FORMAT "0x%016" FORMAT64_MODIFIER "x"
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 #define INT64_FORMAT_W(width) "%" #width FORMAT64_MODIFIER "d"
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 #define UINT64_FORMAT_W(width) "%" #width FORMAT64_MODIFIER "u"
a61af66fc99e Initial load
duke
parents:
diff changeset
1199
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // Format macros that allow the field width to be specified. The width must be
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // a string literal (e.g., "8") or a macro that evaluates to one.
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 #ifdef _LP64
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1203 #define UINTX_FORMAT_W(width) UINT64_FORMAT_W(width)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 #define SSIZE_FORMAT_W(width) INT64_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 #define SIZE_FORMAT_W(width) UINT64_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 #else
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1207 #define UINTX_FORMAT_W(width) UINT32_FORMAT_W(width)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 #define SSIZE_FORMAT_W(width) INT32_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 #define SIZE_FORMAT_W(width) UINT32_FORMAT_W(width)
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1211
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // Format pointers and size_t (or size_t-like integer types) which change size
513
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1213 // between 32- and 64-bit. The pointer format theoretically should be "%p",
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1214 // however, it has different output on different platforms. On Windows, the data
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1215 // will be padded with zeros automatically. On Solaris, we can use "%016p" &
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1216 // "%08p" on 64 bit & 32 bit platforms to make the data padded with extra zeros.
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1217 // On Linux, "%016p" or "%08p" is not be allowed, at least on the latest GCC
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1218 // 4.3.2. So we have to use "%016x" or "%08x" to simulate the printing format.
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1219 // GCC 4.3.2, however requires the data to be converted to "intptr_t" when
2328d1d3f8cf 6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents: 361
diff changeset
1220 // using "%x".
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 #define PTR_FORMAT PTR64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 #define UINTX_FORMAT UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 #define INTX_FORMAT INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 #define SIZE_FORMAT UINT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 #define SSIZE_FORMAT INT64_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 #else // !_LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 #define PTR_FORMAT PTR32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 #define UINTX_FORMAT UINT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 #define INTX_FORMAT INT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 #define SIZE_FORMAT UINT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 #define SSIZE_FORMAT INT32_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 #endif // _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 #define INTPTR_FORMAT PTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 // Enable zap-a-lot if in debug version.
a61af66fc99e Initial load
duke
parents:
diff changeset
1238
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 # ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 # ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 # define ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 #endif /* COMPILER2 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 # endif /* ASSERT */
a61af66fc99e Initial load
duke
parents:
diff changeset
1244
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 #define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
1246
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1789
diff changeset
1247 #endif // SHARE_VM_UTILITIES_GLOBALDEFINITIONS_HPP