2208 2209 // Set the Evex.Z field to be used to clear all non directed XMM/YMM/ZMM components 2210 void reset_is_clear_context(void) { _is_clear_context = false; } 2211 2212 // Map back to current asembler so that we can manage object level assocation 2213 void set_current_assembler(Assembler *current_assembler) { _current_assembler = current_assembler; } 2214 2215 // Address modifiers used for compressed displacement calculation 2216 void set_address_attributes(int tuple_type, int input_size_in_bits) { 2217 if (VM_Version::supports_evex()) { 2218 _tuple_type = tuple_type; 2219 _input_size_in_bits = input_size_in_bits; 2220 } 2221 } 2222 2223 // Set embedded opmask register specifier. 2224 void set_embedded_opmask_register_specifier(KRegister mask) { 2225 _embedded_opmask_register_specifier = (*mask).encoding() & 0x7; 2226 } 2227 2228 }; 2229 2230 #endif // CPU_X86_VM_ASSEMBLER_X86_HPP | 2208 2209 // Set the Evex.Z field to be used to clear all non directed XMM/YMM/ZMM components 2210 void reset_is_clear_context(void) { _is_clear_context = false; } 2211 2212 // Map back to current asembler so that we can manage object level assocation 2213 void set_current_assembler(Assembler *current_assembler) { _current_assembler = current_assembler; } 2214 2215 // Address modifiers used for compressed displacement calculation 2216 void set_address_attributes(int tuple_type, int input_size_in_bits) { 2217 if (VM_Version::supports_evex()) { 2218 _tuple_type = tuple_type; 2219 _input_size_in_bits = input_size_in_bits; 2220 } 2221 } 2222 2223 // Set embedded opmask register specifier. 2224 void set_embedded_opmask_register_specifier(KRegister mask) { 2225 _embedded_opmask_register_specifier = (*mask).encoding() & 0x7; 2226 } 2227 2228 // This is shared between the interpreter and C1, and needs to be in multiple 2229 // places for each. The code to invoke the actual sampling methods needs 2230 // to be provided by the user; thus, a macro. 2231 #define HEAP_MONITORING(ma, thread, var_size_in_bytes, con_size_in_bytes, object, t1, t2, sample_invocation) \ 2232 do { \ 2233 { \ 2234 SkipIfEqual skip_if(ma, HeapMonitoring::initialized_address() , 0); \ 2235 Label skip_sample; \ 2236 Register thr = thread; \ 2237 if (!thr->is_valid()) { \ 2238 NOT_LP64(assert(t1 != noreg, \ 2239 "Need temporary register for constants")); \ 2240 thr = NOT_LP64(t1) LP64_ONLY(r15_thread); \ 2241 NOT_LP64(ma -> get_thread(thr);) \ 2242 } \ 2243 /* Trigger heap monitoring event */ \ 2244 Address bus(thr, \ 2245 JavaThread::bytes_until_sample_offset()); \ 2246 \ 2247 if (var_size_in_bytes->is_valid()) { \ 2248 ma -> NOT_LP64(subl) LP64_ONLY(subq)(bus, var_size_in_bytes); \ 2249 } else { \ 2250 int csib = (con_size_in_bytes); \ 2251 assert(t2 != noreg, \ 2252 "Need temporary register for constants"); \ 2253 ma -> NOT_LP64(movl) LP64_ONLY(mov64)(t2, csib); \ 2254 ma -> NOT_LP64(subl) LP64_ONLY(subq)(bus, t2); \ 2255 } \ 2256 \ 2257 ma -> jcc(Assembler::positive, skip_sample); \ 2258 \ 2259 { \ 2260 sample_invocation \ 2261 } \ 2262 ma -> bind(skip_sample); \ 2263 } \ 2264 } while(0) 2265 2266 }; 2267 2268 #endif // CPU_X86_VM_ASSEMBLER_X86_HPP |