comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 178:6d172e3548cb

6695819: verify_oopx rax: broken oop in decode_heap_oop Summary: Code in gen_subtype_check was encoding rax as an oop on a path where rax was not an oop. Reviewed-by: never, kvn
author coleenp
date Thu, 05 Jun 2008 17:02:54 -0400
parents b130b98db9cf
children 1f809e010142
comparison
equal deleted inserted replaced
177:2a8ec427fbe1 178:6d172e3548cb
3620 } 3620 }
3621 3621
3622 3622
3623 void MacroAssembler::encode_heap_oop(Register src, Register dst) { 3623 void MacroAssembler::encode_heap_oop(Register src, Register dst) {
3624 assert (UseCompressedOops, "must be compressed"); 3624 assert (UseCompressedOops, "must be compressed");
3625 verify_oop(src);
3625 Label done; 3626 Label done;
3626 if (src == dst) { 3627 if (src == dst) {
3627 // optimize for frequent case src == dst 3628 // optimize for frequent case src == dst
3628 bpr(rc_nz, true, Assembler::pt, src, done); 3629 bpr(rc_nz, true, Assembler::pt, src, done);
3629 delayed() -> sub(src, G6_heapbase, dst); // annuled if not taken 3630 delayed() -> sub(src, G6_heapbase, dst); // annuled if not taken
3641 } 3642 }
3642 3643
3643 3644
3644 void MacroAssembler::encode_heap_oop_not_null(Register r) { 3645 void MacroAssembler::encode_heap_oop_not_null(Register r) {
3645 assert (UseCompressedOops, "must be compressed"); 3646 assert (UseCompressedOops, "must be compressed");
3647 verify_oop(r);
3646 sub(r, G6_heapbase, r); 3648 sub(r, G6_heapbase, r);
3647 srlx(r, LogMinObjAlignmentInBytes, r); 3649 srlx(r, LogMinObjAlignmentInBytes, r);
3648 } 3650 }
3649 3651
3650 void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) { 3652 void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) {
3651 assert (UseCompressedOops, "must be compressed"); 3653 assert (UseCompressedOops, "must be compressed");
3654 verify_oop(src);
3652 sub(src, G6_heapbase, dst); 3655 sub(src, G6_heapbase, dst);
3653 srlx(dst, LogMinObjAlignmentInBytes, dst); 3656 srlx(dst, LogMinObjAlignmentInBytes, dst);
3654 } 3657 }
3655 3658
3656 // Same algorithm as oops.inline.hpp decode_heap_oop. 3659 // Same algorithm as oops.inline.hpp decode_heap_oop.
3659 Label done; 3662 Label done;
3660 sllx(src, LogMinObjAlignmentInBytes, dst); 3663 sllx(src, LogMinObjAlignmentInBytes, dst);
3661 bpr(rc_nz, true, Assembler::pt, dst, done); 3664 bpr(rc_nz, true, Assembler::pt, dst, done);
3662 delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken 3665 delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken
3663 bind(done); 3666 bind(done);
3667 verify_oop(dst);
3664 } 3668 }
3665 3669
3666 void MacroAssembler::decode_heap_oop_not_null(Register r) { 3670 void MacroAssembler::decode_heap_oop_not_null(Register r) {
3667 // Do not add assert code to this unless you change vtableStubs_sparc.cpp 3671 // Do not add assert code to this unless you change vtableStubs_sparc.cpp
3668 // pd_code_size_limit. 3672 // pd_code_size_limit.
3673 // Also do not verify_oop as this is called by verify_oop.
3669 assert (UseCompressedOops, "must be compressed"); 3674 assert (UseCompressedOops, "must be compressed");
3670 sllx(r, LogMinObjAlignmentInBytes, r); 3675 sllx(r, LogMinObjAlignmentInBytes, r);
3671 add(r, G6_heapbase, r); 3676 add(r, G6_heapbase, r);
3672 } 3677 }
3673 3678
3674 void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) { 3679 void MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) {
3675 // Do not add assert code to this unless you change vtableStubs_sparc.cpp 3680 // Do not add assert code to this unless you change vtableStubs_sparc.cpp
3676 // pd_code_size_limit. 3681 // pd_code_size_limit.
3682 // Also do not verify_oop as this is called by verify_oop.
3677 assert (UseCompressedOops, "must be compressed"); 3683 assert (UseCompressedOops, "must be compressed");
3678 sllx(src, LogMinObjAlignmentInBytes, dst); 3684 sllx(src, LogMinObjAlignmentInBytes, dst);
3679 add(dst, G6_heapbase, dst); 3685 add(dst, G6_heapbase, dst);
3680 } 3686 }
3681 3687