comparison src/cpu/sparc/vm/macroAssembler_sparc.cpp @ 14422:2b8e28fdf503

Merge
author kvn
date Tue, 05 Nov 2013 17:38:04 -0800
parents b4aa8fc5d0d5
children be525e91f65b
comparison
equal deleted inserted replaced
14421:3068270ba476 14422:2b8e28fdf503
3331 assert_different_registers(top, t1, t2, t3, G4, G5 /* preserve G4 and G5 */); 3331 assert_different_registers(top, t1, t2, t3, G4, G5 /* preserve G4 and G5 */);
3332 Label do_refill, discard_tlab; 3332 Label do_refill, discard_tlab;
3333 3333
3334 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) { 3334 if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
3335 // No allocation in the shared eden. 3335 // No allocation in the shared eden.
3336 ba_short(slow_case); 3336 ba(slow_case);
3337 delayed()->nop();
3337 } 3338 }
3338 3339
3339 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_top_offset()), top); 3340 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_top_offset()), top);
3340 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_end_offset()), t1); 3341 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_end_offset()), t1);
3341 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), t2); 3342 ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), t2);
3356 // increment number of slow_allocations 3357 // increment number of slow_allocations
3357 ld(G2_thread, in_bytes(JavaThread::tlab_slow_allocations_offset()), t2); 3358 ld(G2_thread, in_bytes(JavaThread::tlab_slow_allocations_offset()), t2);
3358 add(t2, 1, t2); 3359 add(t2, 1, t2);
3359 stw(t2, G2_thread, in_bytes(JavaThread::tlab_slow_allocations_offset())); 3360 stw(t2, G2_thread, in_bytes(JavaThread::tlab_slow_allocations_offset()));
3360 } 3361 }
3361 ba_short(try_eden); 3362 ba(try_eden);
3363 delayed()->nop();
3362 3364
3363 bind(discard_tlab); 3365 bind(discard_tlab);
3364 if (TLABStats) { 3366 if (TLABStats) {
3365 // increment number of refills 3367 // increment number of refills
3366 ld(G2_thread, in_bytes(JavaThread::tlab_number_of_refills_offset()), t2); 3368 ld(G2_thread, in_bytes(JavaThread::tlab_number_of_refills_offset()), t2);
3418 #endif // ASSERT 3420 #endif // ASSERT
3419 add(top, t1, top); // t1 is tlab_size 3421 add(top, t1, top); // t1 is tlab_size
3420 sub(top, ThreadLocalAllocBuffer::alignment_reserve_in_bytes(), top); 3422 sub(top, ThreadLocalAllocBuffer::alignment_reserve_in_bytes(), top);
3421 st_ptr(top, G2_thread, in_bytes(JavaThread::tlab_end_offset())); 3423 st_ptr(top, G2_thread, in_bytes(JavaThread::tlab_end_offset()));
3422 verify_tlab(); 3424 verify_tlab();
3423 ba_short(retry); 3425 ba(retry);
3426 delayed()->nop();
3424 } 3427 }
3425 3428
3426 void MacroAssembler::incr_allocated_bytes(RegisterOrConstant size_in_bytes, 3429 void MacroAssembler::incr_allocated_bytes(RegisterOrConstant size_in_bytes,
3427 Register t1, Register t2) { 3430 Register t1, Register t2) {
3428 // Bump total bytes allocated by this thread 3431 // Bump total bytes allocated by this thread
3750 CodeBuffer buf(bb); 3753 CodeBuffer buf(bb);
3751 MacroAssembler masm(&buf); 3754 MacroAssembler masm(&buf);
3752 #define __ masm. 3755 #define __ masm.
3753 address start = __ pc(); 3756 address start = __ pc();
3754 3757
3755 Label not_already_dirty, restart, refill; 3758 Label not_already_dirty, restart, refill, young_card;
3756 3759
3757 #ifdef _LP64 3760 #ifdef _LP64
3758 __ srlx(O0, CardTableModRefBS::card_shift, O0); 3761 __ srlx(O0, CardTableModRefBS::card_shift, O0);
3759 #else 3762 #else
3760 __ srl(O0, CardTableModRefBS::card_shift, O0); 3763 __ srl(O0, CardTableModRefBS::card_shift, O0);
3761 #endif 3764 #endif
3762 AddressLiteral addrlit(byte_map_base); 3765 AddressLiteral addrlit(byte_map_base);
3763 __ set(addrlit, O1); // O1 := <card table base> 3766 __ set(addrlit, O1); // O1 := <card table base>
3764 __ ldub(O0, O1, O2); // O2 := [O0 + O1] 3767 __ ldub(O0, O1, O2); // O2 := [O0 + O1]
3765 3768
3769 __ cmp_and_br_short(O2, G1SATBCardTableModRefBS::g1_young_card_val(), Assembler::equal, Assembler::pt, young_card);
3770
3771 __ membar(Assembler::Membar_mask_bits(Assembler::StoreLoad));
3772 __ ldub(O0, O1, O2); // O2 := [O0 + O1]
3773
3766 assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code"); 3774 assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
3767 __ cmp_and_br_short(O2, G0, Assembler::notEqual, Assembler::pt, not_already_dirty); 3775 __ cmp_and_br_short(O2, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
3768 3776
3777 __ bind(young_card);
3769 // We didn't take the branch, so we're already dirty: return. 3778 // We didn't take the branch, so we're already dirty: return.
3770 // Use return-from-leaf 3779 // Use return-from-leaf
3771 __ retl(); 3780 __ retl();
3772 __ delayed()->nop(); 3781 __ delayed()->nop();
3773 3782
3909 3918
3910 void MacroAssembler::load_klass(Register src_oop, Register klass) { 3919 void MacroAssembler::load_klass(Register src_oop, Register klass) {
3911 // The number of bytes in this code is used by 3920 // The number of bytes in this code is used by
3912 // MachCallDynamicJavaNode::ret_addr_offset() 3921 // MachCallDynamicJavaNode::ret_addr_offset()
3913 // if this changes, change that. 3922 // if this changes, change that.
3914 if (UseCompressedKlassPointers) { 3923 if (UseCompressedClassPointers) {
3915 lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass); 3924 lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass);
3916 decode_klass_not_null(klass); 3925 decode_klass_not_null(klass);
3917 } else { 3926 } else {
3918 ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass); 3927 ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass);
3919 } 3928 }
3920 } 3929 }
3921 3930
3922 void MacroAssembler::store_klass(Register klass, Register dst_oop) { 3931 void MacroAssembler::store_klass(Register klass, Register dst_oop) {
3923 if (UseCompressedKlassPointers) { 3932 if (UseCompressedClassPointers) {
3924 assert(dst_oop != klass, "not enough registers"); 3933 assert(dst_oop != klass, "not enough registers");
3925 encode_klass_not_null(klass); 3934 encode_klass_not_null(klass);
3926 st(klass, dst_oop, oopDesc::klass_offset_in_bytes()); 3935 st(klass, dst_oop, oopDesc::klass_offset_in_bytes());
3927 } else { 3936 } else {
3928 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); 3937 st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes());
3929 } 3938 }
3930 } 3939 }
3931 3940
3932 void MacroAssembler::store_klass_gap(Register s, Register d) { 3941 void MacroAssembler::store_klass_gap(Register s, Register d) {
3933 if (UseCompressedKlassPointers) { 3942 if (UseCompressedClassPointers) {
3934 assert(s != d, "not enough registers"); 3943 assert(s != d, "not enough registers");
3935 st(s, d, oopDesc::klass_gap_offset_in_bytes()); 3944 st(s, d, oopDesc::klass_gap_offset_in_bytes());
3936 } 3945 }
3937 } 3946 }
3938 3947
4087 if (Universe::narrow_oop_base() != NULL) 4096 if (Universe::narrow_oop_base() != NULL)
4088 add(dst, G6_heapbase, dst); 4097 add(dst, G6_heapbase, dst);
4089 } 4098 }
4090 4099
4091 void MacroAssembler::encode_klass_not_null(Register r) { 4100 void MacroAssembler::encode_klass_not_null(Register r) {
4092 assert (UseCompressedKlassPointers, "must be compressed"); 4101 assert (UseCompressedClassPointers, "must be compressed");
4093 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); 4102 if (Universe::narrow_klass_base() != NULL) {
4094 assert(r != G6_heapbase, "bad register choice"); 4103 assert(r != G6_heapbase, "bad register choice");
4095 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); 4104 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
4096 sub(r, G6_heapbase, r); 4105 sub(r, G6_heapbase, r);
4097 if (Universe::narrow_klass_shift() != 0) { 4106 if (Universe::narrow_klass_shift() != 0) {
4098 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong"); 4107 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
4099 srlx(r, LogKlassAlignmentInBytes, r); 4108 srlx(r, LogKlassAlignmentInBytes, r);
4100 } 4109 }
4101 reinit_heapbase(); 4110 reinit_heapbase();
4111 } else {
4112 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
4113 srlx(r, Universe::narrow_klass_shift(), r);
4114 }
4102 } 4115 }
4103 4116
4104 void MacroAssembler::encode_klass_not_null(Register src, Register dst) { 4117 void MacroAssembler::encode_klass_not_null(Register src, Register dst) {
4105 if (src == dst) { 4118 if (src == dst) {
4106 encode_klass_not_null(src); 4119 encode_klass_not_null(src);
4107 } else { 4120 } else {
4108 assert (UseCompressedKlassPointers, "must be compressed"); 4121 assert (UseCompressedClassPointers, "must be compressed");
4109 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); 4122 if (Universe::narrow_klass_base() != NULL) {
4110 set((intptr_t)Universe::narrow_klass_base(), dst); 4123 set((intptr_t)Universe::narrow_klass_base(), dst);
4111 sub(src, dst, dst); 4124 sub(src, dst, dst);
4112 if (Universe::narrow_klass_shift() != 0) { 4125 if (Universe::narrow_klass_shift() != 0) {
4113 srlx(dst, LogKlassAlignmentInBytes, dst); 4126 srlx(dst, LogKlassAlignmentInBytes, dst);
4127 }
4128 } else {
4129 // shift src into dst
4130 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
4131 srlx(src, Universe::narrow_klass_shift(), dst);
4114 } 4132 }
4115 } 4133 }
4116 } 4134 }
4117 4135
4118 // Function instr_size_for_decode_klass_not_null() counts the instructions 4136 // Function instr_size_for_decode_klass_not_null() counts the instructions
4119 // generated by decode_klass_not_null() and reinit_heapbase(). Hence, if 4137 // generated by decode_klass_not_null() and reinit_heapbase(). Hence, if
4120 // the instructions they generate change, then this method needs to be updated. 4138 // the instructions they generate change, then this method needs to be updated.
4121 int MacroAssembler::instr_size_for_decode_klass_not_null() { 4139 int MacroAssembler::instr_size_for_decode_klass_not_null() {
4122 assert (UseCompressedKlassPointers, "only for compressed klass ptrs"); 4140 assert (UseCompressedClassPointers, "only for compressed klass ptrs");
4123 // set + add + set 4141 int num_instrs = 1; // shift src,dst or add
4124 int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 + 4142 if (Universe::narrow_klass_base() != NULL) {
4125 insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base()); 4143 // set + add + set
4126 if (Universe::narrow_klass_shift() == 0) { 4144 num_instrs += insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) +
4127 return num_instrs * BytesPerInstWord; 4145 insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base());
4128 } else { // sllx 4146 if (Universe::narrow_klass_shift() != 0) {
4129 return (num_instrs + 1) * BytesPerInstWord; 4147 num_instrs += 1; // sllx
4130 } 4148 }
4149 }
4150 return num_instrs * BytesPerInstWord;
4131 } 4151 }
4132 4152
4133 // !!! If the instructions that get generated here change then function 4153 // !!! If the instructions that get generated here change then function
4134 // instr_size_for_decode_klass_not_null() needs to get updated. 4154 // instr_size_for_decode_klass_not_null() needs to get updated.
4135 void MacroAssembler::decode_klass_not_null(Register r) { 4155 void MacroAssembler::decode_klass_not_null(Register r) {
4136 // Do not add assert code to this unless you change vtableStubs_sparc.cpp 4156 // Do not add assert code to this unless you change vtableStubs_sparc.cpp
4137 // pd_code_size_limit. 4157 // pd_code_size_limit.
4138 assert (UseCompressedKlassPointers, "must be compressed"); 4158 assert (UseCompressedClassPointers, "must be compressed");
4139 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); 4159 if (Universe::narrow_klass_base() != NULL) {
4140 assert(r != G6_heapbase, "bad register choice"); 4160 assert(r != G6_heapbase, "bad register choice");
4141 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); 4161 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
4142 if (Universe::narrow_klass_shift() != 0) 4162 if (Universe::narrow_klass_shift() != 0)
4143 sllx(r, LogKlassAlignmentInBytes, r); 4163 sllx(r, LogKlassAlignmentInBytes, r);
4144 add(r, G6_heapbase, r); 4164 add(r, G6_heapbase, r);
4145 reinit_heapbase(); 4165 reinit_heapbase();
4166 } else {
4167 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
4168 sllx(r, Universe::narrow_klass_shift(), r);
4169 }
4146 } 4170 }
4147 4171
4148 void MacroAssembler::decode_klass_not_null(Register src, Register dst) { 4172 void MacroAssembler::decode_klass_not_null(Register src, Register dst) {
4149 if (src == dst) { 4173 if (src == dst) {
4150 decode_klass_not_null(src); 4174 decode_klass_not_null(src);
4151 } else { 4175 } else {
4152 // Do not add assert code to this unless you change vtableStubs_sparc.cpp 4176 // Do not add assert code to this unless you change vtableStubs_sparc.cpp
4153 // pd_code_size_limit. 4177 // pd_code_size_limit.
4154 assert (UseCompressedKlassPointers, "must be compressed"); 4178 assert (UseCompressedClassPointers, "must be compressed");
4155 assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized"); 4179 if (Universe::narrow_klass_base() != NULL) {
4156 if (Universe::narrow_klass_shift() != 0) { 4180 if (Universe::narrow_klass_shift() != 0) {
4157 assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice"); 4181 assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice");
4158 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase); 4182 set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
4159 sllx(src, LogKlassAlignmentInBytes, dst); 4183 sllx(src, LogKlassAlignmentInBytes, dst);
4160 add(dst, G6_heapbase, dst); 4184 add(dst, G6_heapbase, dst);
4161 reinit_heapbase(); 4185 reinit_heapbase();
4186 } else {
4187 set((intptr_t)Universe::narrow_klass_base(), dst);
4188 add(src, dst, dst);
4189 }
4162 } else { 4190 } else {
4163 set((intptr_t)Universe::narrow_klass_base(), dst); 4191 // shift/mov src into dst.
4164 add(src, dst, dst); 4192 assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift() || Universe::narrow_klass_shift() == 0, "decode alg wrong");
4193 sllx(src, Universe::narrow_klass_shift(), dst);
4165 } 4194 }
4166 } 4195 }
4167 } 4196 }
4168 4197
4169 void MacroAssembler::reinit_heapbase() { 4198 void MacroAssembler::reinit_heapbase() {
4170 if (UseCompressedOops || UseCompressedKlassPointers) { 4199 if (UseCompressedOops || UseCompressedClassPointers) {
4171 if (Universe::heap() != NULL) { 4200 if (Universe::heap() != NULL) {
4172 set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase); 4201 set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase);
4173 } else { 4202 } else {
4174 AddressLiteral base(Universe::narrow_ptrs_base_addr()); 4203 AddressLiteral base(Universe::narrow_ptrs_base_addr());
4175 load_ptr_contents(base, G6_heapbase); 4204 load_ptr_contents(base, G6_heapbase);