Mercurial > hg > graal-compiler
comparison src/share/vm/oops/oop.inline.hpp @ 1579:e9ff18c4ace7
Merge
author | jrose |
---|---|
date | Wed, 02 Jun 2010 22:45:42 -0700 |
parents | c18cbe5936b8 2d127394260e |
children | d55217dc206f |
comparison
equal
deleted
inserted
replaced
1562:dfe27f03244a | 1579:e9ff18c4ace7 |
---|---|
144 | 144 |
145 // Algorithm for encoding and decoding oops from 64 bit pointers to 32 bit | 145 // Algorithm for encoding and decoding oops from 64 bit pointers to 32 bit |
146 // offset from the heap base. Saving the check for null can save instructions | 146 // offset from the heap base. Saving the check for null can save instructions |
147 // in inner GC loops so these are separated. | 147 // in inner GC loops so these are separated. |
148 | 148 |
149 inline bool check_obj_alignment(oop obj) { | |
150 return (intptr_t)obj % MinObjAlignmentInBytes == 0; | |
151 } | |
152 | |
149 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { | 153 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { |
150 assert(!is_null(v), "oop value can never be zero"); | 154 assert(!is_null(v), "oop value can never be zero"); |
155 assert(check_obj_alignment(v), "Address not aligned"); | |
151 assert(Universe::heap()->is_in_reserved(v), "Address not in heap"); | 156 assert(Universe::heap()->is_in_reserved(v), "Address not in heap"); |
152 address base = Universe::narrow_oop_base(); | 157 address base = Universe::narrow_oop_base(); |
153 int shift = Universe::narrow_oop_shift(); | 158 int shift = Universe::narrow_oop_shift(); |
154 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); | 159 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); |
155 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); | 160 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); |
165 | 170 |
166 inline oop oopDesc::decode_heap_oop_not_null(narrowOop v) { | 171 inline oop oopDesc::decode_heap_oop_not_null(narrowOop v) { |
167 assert(!is_null(v), "narrow oop value can never be zero"); | 172 assert(!is_null(v), "narrow oop value can never be zero"); |
168 address base = Universe::narrow_oop_base(); | 173 address base = Universe::narrow_oop_base(); |
169 int shift = Universe::narrow_oop_shift(); | 174 int shift = Universe::narrow_oop_shift(); |
170 return (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift)); | 175 oop result = (oop)(void*)((uintptr_t)base + ((uintptr_t)v << shift)); |
176 assert(check_obj_alignment(result), "Address not aligned"); | |
177 return result; | |
171 } | 178 } |
172 | 179 |
173 inline oop oopDesc::decode_heap_oop(narrowOop v) { | 180 inline oop oopDesc::decode_heap_oop(narrowOop v) { |
174 return is_null(v) ? (oop)NULL : decode_heap_oop_not_null(v); | 181 return is_null(v) ? (oop)NULL : decode_heap_oop_not_null(v); |
175 } | 182 } |
520 | 527 |
521 inline bool oopDesc::has_bias_pattern() const { | 528 inline bool oopDesc::has_bias_pattern() const { |
522 return mark()->has_bias_pattern(); | 529 return mark()->has_bias_pattern(); |
523 } | 530 } |
524 | 531 |
525 inline bool check_obj_alignment(oop obj) { | |
526 return (intptr_t)obj % MinObjAlignmentInBytes == 0; | |
527 } | |
528 | |
529 | 532 |
530 // used only for asserts | 533 // used only for asserts |
531 inline bool oopDesc::is_oop(bool ignore_mark_word) const { | 534 inline bool oopDesc::is_oop(bool ignore_mark_word) const { |
532 oop obj = (oop) this; | 535 oop obj = (oop) this; |
533 if (!check_obj_alignment(obj)) return false; | 536 if (!check_obj_alignment(obj)) return false; |
598 return mark()->is_marked(); | 601 return mark()->is_marked(); |
599 } | 602 } |
600 | 603 |
601 // Used by scavengers | 604 // Used by scavengers |
602 inline void oopDesc::forward_to(oop p) { | 605 inline void oopDesc::forward_to(oop p) { |
606 assert(check_obj_alignment(p), | |
607 "forwarding to something not aligned"); | |
603 assert(Universe::heap()->is_in_reserved(p), | 608 assert(Universe::heap()->is_in_reserved(p), |
604 "forwarding to something not in heap"); | 609 "forwarding to something not in heap"); |
605 markOop m = markOopDesc::encode_pointer_as_mark(p); | 610 markOop m = markOopDesc::encode_pointer_as_mark(p); |
606 assert(m->decode_pointer() == p, "encoding must be reversable"); | 611 assert(m->decode_pointer() == p, "encoding must be reversable"); |
607 set_mark(m); | 612 set_mark(m); |
608 } | 613 } |
609 | 614 |
610 // Used by parallel scavengers | 615 // Used by parallel scavengers |
611 inline bool oopDesc::cas_forward_to(oop p, markOop compare) { | 616 inline bool oopDesc::cas_forward_to(oop p, markOop compare) { |
617 assert(check_obj_alignment(p), | |
618 "forwarding to something not aligned"); | |
612 assert(Universe::heap()->is_in_reserved(p), | 619 assert(Universe::heap()->is_in_reserved(p), |
613 "forwarding to something not in heap"); | 620 "forwarding to something not in heap"); |
614 markOop m = markOopDesc::encode_pointer_as_mark(p); | 621 markOop m = markOopDesc::encode_pointer_as_mark(p); |
615 assert(m->decode_pointer() == p, "encoding must be reversable"); | 622 assert(m->decode_pointer() == p, "encoding must be reversable"); |
616 return cas_set_mark(m, compare) == compare; | 623 return cas_set_mark(m, compare) == compare; |