< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page

        

*** 41,50 **** --- 41,52 ---- #include "utilities/macros.hpp" #if INCLUDE_ALL_GCS #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" #include "gc_implementation/g1/heapRegion.hpp" + #include "shenandoahBarrierSetAssembler_x86.hpp" + #include "gc_implementation/shenandoah/shenandoahHeap.inline.hpp" #endif // INCLUDE_ALL_GCS #ifdef PRODUCT #define BLOCK_COMMENT(str) /* nothing */ #define STOP(error) stop(error)
*** 4130,4140 **** jcc(Assembler::zero, not_weak); // Resolve jweak. movptr(value, Address(value, -JNIHandles::weak_tag_value)); verify_oop(value); #if INCLUDE_ALL_GCS ! if (UseG1GC) { g1_write_barrier_pre(noreg /* obj */, value /* pre_val */, thread /* thread */, tmp /* tmp */, true /* tosca_live */, --- 4132,4142 ---- jcc(Assembler::zero, not_weak); // Resolve jweak. movptr(value, Address(value, -JNIHandles::weak_tag_value)); verify_oop(value); #if INCLUDE_ALL_GCS ! if (UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) { g1_write_barrier_pre(noreg /* obj */, value /* pre_val */, thread /* thread */, tmp /* tmp */, true /* tosca_live */,
*** 4189,4207 **** Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_index())); Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_buf())); ! ! // Is marking active? ! if (in_bytes(PtrQueue::byte_width_of_active()) == 4) { ! cmpl(in_progress, 0); ! } else { ! assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption"); ! cmpb(in_progress, 0); } - jcc(Assembler::equal, done); // Do we need to load the previous value? if (obj != noreg) { load_heap_oop(pre_val, Address(obj, 0)); } --- 4191,4215 ---- Address index(thread, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_index())); Address buffer(thread, in_bytes(JavaThread::satb_mark_queue_offset() + PtrQueue::byte_offset_of_buf())); ! if (UseShenandoahGC) { ! Address gc_state(thread, in_bytes(JavaThread::gc_state_offset())); ! testb(gc_state, ShenandoahHeap::MARKING); ! jcc(Assembler::zero, done); ! } else { ! assert(UseG1GC, "Should be"); ! // Is marking active? ! if (in_bytes(PtrQueue::byte_width_of_active()) == 4) { ! cmpl(in_progress, 0); ! } else { ! assert(in_bytes(PtrQueue::byte_width_of_active()) == 1, "Assumption"); ! cmpb(in_progress, 0); ! } ! jcc(Assembler::equal, done); } // Do we need to load the previous value? if (obj != noreg) { load_heap_oop(pre_val, Address(obj, 0)); }
*** 4280,4289 **** --- 4288,4304 ---- Register tmp2) { #ifdef _LP64 assert(thread == r15_thread, "must be"); #endif // _LP64 + if (UseShenandoahGC) { + // No need for this in Shenandoah. + return; + } + + assert(UseG1GC, "expect G1 GC"); + Address queue_index(thread, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_index())); Address buffer(thread, in_bytes(JavaThread::dirty_card_queue_offset() + PtrQueue::byte_offset_of_buf()));
*** 4615,4683 **** } void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int num_fpu_regs_in_use) { pusha(); // if we are coming from c1, xmm registers may be live - int off = 0; - if (UseSSE == 1) { - subptr(rsp, sizeof(jdouble)*8); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm0); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm1); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm2); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm3); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm4); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm5); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm6); - movflt(Address(rsp,off++*sizeof(jdouble)),xmm7); - } else if (UseSSE >= 2) { - #ifdef COMPILER2 - if (MaxVectorSize > 16) { - assert(UseAVX > 0, "256bit vectors are supported only with AVX"); - // Save upper half of YMM registes - subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8)); - vextractf128h(Address(rsp, 0),xmm0); - vextractf128h(Address(rsp, 16),xmm1); - vextractf128h(Address(rsp, 32),xmm2); - vextractf128h(Address(rsp, 48),xmm3); - vextractf128h(Address(rsp, 64),xmm4); - vextractf128h(Address(rsp, 80),xmm5); - vextractf128h(Address(rsp, 96),xmm6); - vextractf128h(Address(rsp,112),xmm7); - #ifdef _LP64 - vextractf128h(Address(rsp,128),xmm8); - vextractf128h(Address(rsp,144),xmm9); - vextractf128h(Address(rsp,160),xmm10); - vextractf128h(Address(rsp,176),xmm11); - vextractf128h(Address(rsp,192),xmm12); - vextractf128h(Address(rsp,208),xmm13); - vextractf128h(Address(rsp,224),xmm14); - vextractf128h(Address(rsp,240),xmm15); - #endif - } - #endif - // Save whole 128bit (16 bytes) XMM regiters - subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8)); - movdqu(Address(rsp,off++*16),xmm0); - movdqu(Address(rsp,off++*16),xmm1); - movdqu(Address(rsp,off++*16),xmm2); - movdqu(Address(rsp,off++*16),xmm3); - movdqu(Address(rsp,off++*16),xmm4); - movdqu(Address(rsp,off++*16),xmm5); - movdqu(Address(rsp,off++*16),xmm6); - movdqu(Address(rsp,off++*16),xmm7); - #ifdef _LP64 - movdqu(Address(rsp,off++*16),xmm8); - movdqu(Address(rsp,off++*16),xmm9); - movdqu(Address(rsp,off++*16),xmm10); - movdqu(Address(rsp,off++*16),xmm11); - movdqu(Address(rsp,off++*16),xmm12); - movdqu(Address(rsp,off++*16),xmm13); - movdqu(Address(rsp,off++*16),xmm14); - movdqu(Address(rsp,off++*16),xmm15); - #endif - } // Preserve registers across runtime call int incoming_argument_and_return_value_offset = -1; if (num_fpu_regs_in_use > 1) { // Must preserve all other FPU regs (could alternatively convert --- 4630,4642 ---- } void MacroAssembler::fp_runtime_fallback(address runtime_entry, int nb_args, int num_fpu_regs_in_use) { pusha(); + save_vector_registers(); + // if we are coming from c1, xmm registers may be live // Preserve registers across runtime call int incoming_argument_and_return_value_offset = -1; if (num_fpu_regs_in_use > 1) { // Must preserve all other FPU regs (could alternatively convert
*** 4739,4749 **** } fld_d(Address(rsp, (nb_args-1)*sizeof(jdouble))); addptr(rsp, sizeof(jdouble) * nb_args); } ! off = 0; if (UseSSE == 1) { movflt(xmm0, Address(rsp,off++*sizeof(jdouble))); movflt(xmm1, Address(rsp,off++*sizeof(jdouble))); movflt(xmm2, Address(rsp,off++*sizeof(jdouble))); movflt(xmm3, Address(rsp,off++*sizeof(jdouble))); --- 4698,4774 ---- } fld_d(Address(rsp, (nb_args-1)*sizeof(jdouble))); addptr(rsp, sizeof(jdouble) * nb_args); } ! restore_vector_registers(); ! popa(); ! } ! ! void MacroAssembler::save_vector_registers() { ! int off = 0; ! if (UseSSE == 1) { ! subptr(rsp, sizeof(jdouble)*8); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm0); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm1); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm2); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm3); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm4); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm5); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm6); ! movflt(Address(rsp,off++*sizeof(jdouble)),xmm7); ! } else if (UseSSE >= 2) { ! #ifdef COMPILER2 ! if (MaxVectorSize > 16) { ! assert(UseAVX > 0, "256bit vectors are supported only with AVX"); ! // Save upper half of YMM registes ! subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8)); ! vextractf128h(Address(rsp, 0),xmm0); ! vextractf128h(Address(rsp, 16),xmm1); ! vextractf128h(Address(rsp, 32),xmm2); ! vextractf128h(Address(rsp, 48),xmm3); ! vextractf128h(Address(rsp, 64),xmm4); ! vextractf128h(Address(rsp, 80),xmm5); ! vextractf128h(Address(rsp, 96),xmm6); ! vextractf128h(Address(rsp,112),xmm7); ! #ifdef _LP64 ! vextractf128h(Address(rsp,128),xmm8); ! vextractf128h(Address(rsp,144),xmm9); ! vextractf128h(Address(rsp,160),xmm10); ! vextractf128h(Address(rsp,176),xmm11); ! vextractf128h(Address(rsp,192),xmm12); ! vextractf128h(Address(rsp,208),xmm13); ! vextractf128h(Address(rsp,224),xmm14); ! vextractf128h(Address(rsp,240),xmm15); ! #endif ! } ! #endif ! // Save whole 128bit (16 bytes) XMM regiters ! subptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8)); ! movdqu(Address(rsp,off++*16),xmm0); ! movdqu(Address(rsp,off++*16),xmm1); ! movdqu(Address(rsp,off++*16),xmm2); ! movdqu(Address(rsp,off++*16),xmm3); ! movdqu(Address(rsp,off++*16),xmm4); ! movdqu(Address(rsp,off++*16),xmm5); ! movdqu(Address(rsp,off++*16),xmm6); ! movdqu(Address(rsp,off++*16),xmm7); ! #ifdef _LP64 ! movdqu(Address(rsp,off++*16),xmm8); ! movdqu(Address(rsp,off++*16),xmm9); ! movdqu(Address(rsp,off++*16),xmm10); ! movdqu(Address(rsp,off++*16),xmm11); ! movdqu(Address(rsp,off++*16),xmm12); ! movdqu(Address(rsp,off++*16),xmm13); ! movdqu(Address(rsp,off++*16),xmm14); ! movdqu(Address(rsp,off++*16),xmm15); ! #endif ! } ! } ! ! void MacroAssembler::restore_vector_registers() { ! int off = 0; if (UseSSE == 1) { movflt(xmm0, Address(rsp,off++*sizeof(jdouble))); movflt(xmm1, Address(rsp,off++*sizeof(jdouble))); movflt(xmm2, Address(rsp,off++*sizeof(jdouble))); movflt(xmm3, Address(rsp,off++*sizeof(jdouble)));
*** 4796,4806 **** #endif addptr(rsp, 16 * LP64_ONLY(16) NOT_LP64(8)); } #endif } - popa(); } static const double pi_4 = 0.7853981633974483; void MacroAssembler::trigfunc(char trig, int num_fpu_regs_in_use) { --- 4821,4830 ----
*** 5232,5242 **** call(rax); // Caller pops the arguments (oop, message) and restores rax, r10 BLOCK_COMMENT("} verify_oop"); } - RegisterOrConstant MacroAssembler::delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset) { intptr_t value = *delayed_value_addr; if (value != 0) --- 5256,5265 ----
*** 5761,5770 **** --- 5784,5800 ---- #endif movptr(Address(dst, oopDesc::klass_offset_in_bytes()), src); } void MacroAssembler::load_heap_oop(Register dst, Address src) { + #if INCLUDE_ALL_GCS + if (UseShenandoahGC) { + ShenandoahBarrierSetAssembler::bsasm()->load_heap_oop(this, dst, src); + return; + } + #endif + #ifdef _LP64 // FIXME: Must change all places where we try to load the klass. if (UseCompressedOops) { movl(dst, src); decode_heap_oop(dst);
*** 5773,5782 **** --- 5803,5819 ---- movptr(dst, src); } // Doesn't do verfication, generates fixed size code void MacroAssembler::load_heap_oop_not_null(Register dst, Address src) { + #if INCLUDE_ALL_GCS + if (UseShenandoahGC) { + ShenandoahBarrierSetAssembler::bsasm()->load_heap_oop(this, dst, src); + return; + } + #endif + #ifdef _LP64 if (UseCompressedOops) { movl(dst, src); decode_heap_oop_not_null(dst); } else
< prev index next >