Mercurial > hg > graal-jvmci-8
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); |