< prev index next >

src/hotspot/cpu/x86/c1_Runtime1_x86.cpp

Print this page
rev 50030 : 8201593: Print array length in ArrayIndexOutOfBoundsException.
Reviewed-by: dholmes, mdoerr, smonteith, shade


 594 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
 595                                    bool save_fpu_registers = true) {
 596   __ save_live_registers_no_oop_map(save_fpu_registers);
 597   return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
 598 }
 599 
 600 static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
 601   __ restore_live_registers(restore_fpu_registers);
 602 }
 603 
 604 static void restore_live_registers_except_rax(StubAssembler* sasm, bool restore_fpu_registers = true) {
 605   sasm->restore_live_registers_except_rax(restore_fpu_registers);
 606 }
 607 
 608 
 609 void Runtime1::initialize_pd() {
 610   // nothing to do
 611 }
 612 
 613 
 614 // target: the entry point of the method that creates and posts the exception oop
 615 // has_argument: true if the exception needs an argument (passed on stack because registers must be preserved)
 616 
 617 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
 618   // preserve all registers
 619   int num_rt_args = has_argument ? 2 : 1;
 620   OopMap* oop_map = save_live_registers(sasm, num_rt_args);
 621 
 622   // now all registers are saved and can be used freely
 623   // verify that no old value is used accidentally
 624   __ invalidate_registers(true, true, true, true, true, true);
 625 
 626   // registers used by this stub
 627   const Register temp_reg = rbx;
 628 
 629   // load argument for exception that is passed as an argument into the stub
 630   if (has_argument) {
 631 #ifdef _LP64
 632     __ movptr(c_rarg1, Address(rbp, 2*BytesPerWord));

 633 #else


 634     __ movptr(temp_reg, Address(rbp, 2*BytesPerWord));
 635     __ push(temp_reg);
 636 #endif // _LP64
 637   }
 638   int call_offset = __ call_RT(noreg, noreg, target, num_rt_args - 1);
 639 
 640   OopMapSet* oop_maps = new OopMapSet();
 641   oop_maps->add_gc_map(call_offset, oop_map);
 642 
 643   __ stop("should not reach here");
 644 
 645   return oop_maps;
 646 }
 647 
 648 
 649 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
 650   __ block_comment("generate_handle_exception");
 651 
 652   // incoming parameters
 653   const Register exception_oop = rax;




 594 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
 595                                    bool save_fpu_registers = true) {
 596   __ save_live_registers_no_oop_map(save_fpu_registers);
 597   return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
 598 }
 599 
 600 static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
 601   __ restore_live_registers(restore_fpu_registers);
 602 }
 603 
 604 static void restore_live_registers_except_rax(StubAssembler* sasm, bool restore_fpu_registers = true) {
 605   sasm->restore_live_registers_except_rax(restore_fpu_registers);
 606 }
 607 
 608 
 609 void Runtime1::initialize_pd() {
 610   // nothing to do
 611 }
 612 
 613 
 614 // Target: the entry point of the method that creates and posts the exception oop.
 615 // has_argument: true if the exception needs arguments (passed on the stack because
 616 //               registers must be preserved).
 617 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
 618   // Preserve all registers.
 619   int num_rt_args = has_argument ? (2 + 1) : 1;
 620   OopMap* oop_map = save_live_registers(sasm, num_rt_args);
 621 
 622   // Now all registers are saved and can be used freely.
 623   // Verify that no old value is used accidentally.
 624   __ invalidate_registers(true, true, true, true, true, true);
 625 
 626   // Registers used by this stub.
 627   const Register temp_reg = rbx;
 628 
 629   // Load arguments for exception that are passed as arguments into the stub.
 630   if (has_argument) {
 631 #ifdef _LP64
 632     __ movptr(c_rarg1, Address(rbp, 2*BytesPerWord));
 633     __ movptr(c_rarg2, Address(rbp, 3*BytesPerWord));
 634 #else
 635     __ movptr(temp_reg, Address(rbp, 3*BytesPerWord));
 636     __ push(temp_reg);
 637     __ movptr(temp_reg, Address(rbp, 2*BytesPerWord));
 638     __ push(temp_reg);
 639 #endif // _LP64
 640   }
 641   int call_offset = __ call_RT(noreg, noreg, target, num_rt_args - 1);
 642 
 643   OopMapSet* oop_maps = new OopMapSet();
 644   oop_maps->add_gc_map(call_offset, oop_map);
 645 
 646   __ stop("should not reach here");
 647 
 648   return oop_maps;
 649 }
 650 
 651 
 652 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
 653   __ block_comment("generate_handle_exception");
 654 
 655   // incoming parameters
 656   const Register exception_oop = rax;


< prev index next >