src/share/vm/utilities/globalDefinitions.hpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 796
a4f9ef0c0375
child 948
2328d1d3f8cf
child 994
7628781568e1
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

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

mercurial