326 // call the runtime patching routine, returns non-zero if nmethod got deopted. 327 int call_offset = __ call_RT(noreg, noreg, target); 328 OopMapSet* oop_maps = new OopMapSet(); 329 oop_maps->add_gc_map(call_offset, oop_map); 330 331 // re-execute the patched instruction or, if the nmethod was deoptmized, return to the 332 // deoptimization handler entry that will cause re-execution of the current bytecode 333 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob(); 334 assert(deopt_blob != NULL, "deoptimization blob must have been created"); 335 336 Label no_deopt; 337 __ tst(O0); 338 __ brx(Assembler::equal, false, Assembler::pt, no_deopt); 339 __ delayed()->nop(); 340 341 // return to the deoptimization handler entry for unpacking and rexecute 342 // if we simply returned the we'd deopt as if any call we patched had just 343 // returned. 344 345 restore_live_registers(sasm); 346 __ restore(); 347 __ br(Assembler::always, false, Assembler::pt, deopt_blob->unpack_with_reexecution(), relocInfo::runtime_call_type); 348 __ delayed()->nop(); 349 350 __ bind(no_deopt); 351 restore_live_registers(sasm); 352 __ ret(); 353 __ delayed()->restore(); 354 355 return oop_maps; 356 } 357 358 OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { 359 360 OopMapSet* oop_maps = NULL; 361 // for better readability 362 const bool must_gc_arguments = true; 363 const bool dont_gc_arguments = false; 364 365 // stub code & info for the different stubs 366 switch (id) { 367 case forward_exception_id: 368 { | 326 // call the runtime patching routine, returns non-zero if nmethod got deopted. 327 int call_offset = __ call_RT(noreg, noreg, target); 328 OopMapSet* oop_maps = new OopMapSet(); 329 oop_maps->add_gc_map(call_offset, oop_map); 330 331 // re-execute the patched instruction or, if the nmethod was deoptmized, return to the 332 // deoptimization handler entry that will cause re-execution of the current bytecode 333 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob(); 334 assert(deopt_blob != NULL, "deoptimization blob must have been created"); 335 336 Label no_deopt; 337 __ tst(O0); 338 __ brx(Assembler::equal, false, Assembler::pt, no_deopt); 339 __ delayed()->nop(); 340 341 // return to the deoptimization handler entry for unpacking and rexecute 342 // if we simply returned the we'd deopt as if any call we patched had just 343 // returned. 344 345 restore_live_registers(sasm); 346 AddressLiteral dest(deopt_blob->unpack_with_reexecution()); 347 __ jump_to(dest, O0); 348 __ delayed()->restore(); 349 350 __ bind(no_deopt); 351 restore_live_registers(sasm); 352 __ ret(); 353 __ delayed()->restore(); 354 355 return oop_maps; 356 } 357 358 OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) { 359 360 OopMapSet* oop_maps = NULL; 361 // for better readability 362 const bool must_gc_arguments = true; 363 const bool dont_gc_arguments = false; 364 365 // stub code & info for the different stubs 366 switch (id) { 367 case forward_exception_id: 368 { |