Mercurial > hg > graal-compiler
comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 167:feeb96a45707
6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
Summary: decouple set_klass() with zeroing the gap when compressed.
Reviewed-by: kvn, ysr, jrose
author | coleenp |
---|---|
date | Wed, 28 May 2008 21:06:24 -0700 |
parents | c436414a719e |
children | 1f809e010142 |
comparison
equal
deleted
inserted
replaced
166:aaa1137c5ef4 | 167:feeb96a45707 |
---|---|
3419 delayed()->nop(); | 3419 delayed()->nop(); |
3420 | 3420 |
3421 set((intptr_t)markOopDesc::prototype()->copy_set_hash(0x2), t2); | 3421 set((intptr_t)markOopDesc::prototype()->copy_set_hash(0x2), t2); |
3422 st_ptr(t2, top, oopDesc::mark_offset_in_bytes()); // set up the mark word | 3422 st_ptr(t2, top, oopDesc::mark_offset_in_bytes()); // set up the mark word |
3423 // set klass to intArrayKlass | 3423 // set klass to intArrayKlass |
3424 set((intptr_t)Universe::intArrayKlassObj_addr(), t2); | |
3425 ld_ptr(t2, 0, t2); | |
3426 store_klass(t2, top); | |
3427 sub(t1, typeArrayOopDesc::header_size(T_INT), t1); | 3424 sub(t1, typeArrayOopDesc::header_size(T_INT), t1); |
3428 add(t1, ThreadLocalAllocBuffer::alignment_reserve(), t1); | 3425 add(t1, ThreadLocalAllocBuffer::alignment_reserve(), t1); |
3429 sll_ptr(t1, log2_intptr(HeapWordSize/sizeof(jint)), t1); | 3426 sll_ptr(t1, log2_intptr(HeapWordSize/sizeof(jint)), t1); |
3430 st(t1, top, arrayOopDesc::length_offset_in_bytes()); | 3427 st(t1, top, arrayOopDesc::length_offset_in_bytes()); |
3428 set((intptr_t)Universe::intArrayKlassObj_addr(), t2); | |
3429 ld_ptr(t2, 0, t2); | |
3430 // store klass last. concurrent gcs assumes klass length is valid if | |
3431 // klass field is not null. | |
3432 store_klass(t2, top); | |
3431 verify_oop(top); | 3433 verify_oop(top); |
3432 | 3434 |
3433 // refill the tlab with an eden allocation | 3435 // refill the tlab with an eden allocation |
3434 bind(do_refill); | 3436 bind(do_refill); |
3435 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_size_offset()), t1); | 3437 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_size_offset()), t1); |
3566 | 3568 |
3567 void MacroAssembler::store_klass(Register klass, Register dst_oop) { | 3569 void MacroAssembler::store_klass(Register klass, Register dst_oop) { |
3568 if (UseCompressedOops) { | 3570 if (UseCompressedOops) { |
3569 assert(dst_oop != klass, "not enough registers"); | 3571 assert(dst_oop != klass, "not enough registers"); |
3570 encode_heap_oop_not_null(klass); | 3572 encode_heap_oop_not_null(klass); |
3571 sllx(klass, BitsPerInt, klass); | 3573 st(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3572 stx(klass, dst_oop, oopDesc::klass_offset_in_bytes()); | |
3573 } else { | 3574 } else { |
3574 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); | 3575 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); |
3576 } | |
3577 } | |
3578 | |
3579 void MacroAssembler::store_klass_gap(Register s, Register d) { | |
3580 if (UseCompressedOops) { | |
3581 assert(s != d, "not enough registers"); | |
3582 st(s, d, oopDesc::klass_gap_offset_in_bytes()); | |
3575 } | 3583 } |
3576 } | 3584 } |
3577 | 3585 |
3578 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) { | 3586 void MacroAssembler::load_heap_oop(const Address& s, Register d, int offset) { |
3579 if (UseCompressedOops) { | 3587 if (UseCompressedOops) { |