annotate src/share/vm/utilities/globalDefinitions.hpp @ 1721:413ad0331a0c

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