< prev index next >

src/cpu/x86/vm/assembler_x86.hpp

Print this page

        

*** 2223,2230 **** --- 2223,2268 ---- // Set embedded opmask register specifier. void set_embedded_opmask_register_specifier(KRegister mask) { _embedded_opmask_register_specifier = (*mask).encoding() & 0x7; } + // This is shared between the interpreter and C1, and needs to be in multiple + // places for each. The code to invoke the actual sampling methods needs + // to be provided by the user; thus, a macro. + #define HEAP_MONITORING(ma, thread, var_size_in_bytes, con_size_in_bytes, object, t1, t2, sample_invocation) \ + do { \ + { \ + SkipIfEqual skip_if(ma, HeapMonitoring::initialized_address() , 0); \ + Label skip_sample; \ + Register thr = thread; \ + if (!thr->is_valid()) { \ + NOT_LP64(assert(t1 != noreg, \ + "Need temporary register for constants")); \ + thr = NOT_LP64(t1) LP64_ONLY(r15_thread); \ + NOT_LP64(ma -> get_thread(thr);) \ + } \ + /* Trigger heap monitoring event */ \ + Address bus(thr, \ + JavaThread::bytes_until_sample_offset()); \ + \ + if (var_size_in_bytes->is_valid()) { \ + ma -> NOT_LP64(subl) LP64_ONLY(subq)(bus, var_size_in_bytes); \ + } else { \ + int csib = (con_size_in_bytes); \ + assert(t2 != noreg, \ + "Need temporary register for constants"); \ + ma -> NOT_LP64(movl) LP64_ONLY(mov64)(t2, csib); \ + ma -> NOT_LP64(subl) LP64_ONLY(subq)(bus, t2); \ + } \ + \ + ma -> jcc(Assembler::positive, skip_sample); \ + \ + { \ + sample_invocation \ + } \ + ma -> bind(skip_sample); \ + } \ + } while(0) + }; #endif // CPU_X86_VM_ASSEMBLER_X86_HPP
< prev index next >