comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 9595:db2125285960

replaced wb_pre_call and wb_post_call assembler stubs with compiled stubs (GRAAL-81)
author Doug Simon <doug.simon@oracle.com>
date Tue, 07 May 2013 01:53:01 +0200
parents 743326387173
children
comparison
equal deleted inserted replaced
9594:743326387173 9595:db2125285960
415 return map; 415 return map;
416 } 416 }
417 417
418 #define __ sasm-> 418 #define __ sasm->
419 419
420 static OopMap* save_live_registers(GraalStubAssembler* sasm, int num_rt_args, 420 OopMap* save_live_registers(GraalStubAssembler* sasm, int num_rt_args,
421 bool save_fpu_registers = true) { 421 bool save_fpu_registers = true) {
422 __ block_comment("save_live_registers"); 422 __ block_comment("save_live_registers");
423 423
424 __ pusha(); // integer registers 424 __ pusha(); // integer registers
425 425
586 586
587 // stub code & info for the different stubs 587 // stub code & info for the different stubs
588 OopMapSet* oop_maps = NULL; 588 OopMapSet* oop_maps = NULL;
589 switch (id) { 589 switch (id) {
590 590
591 case wb_pre_call_id: {
592 Register obj = j_rarg0;
593 {
594 GraalStubFrame f(sasm, "graal_wb_pre_call", dont_gc_arguments);
595 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
596
597 // note: really a leaf routine but must setup last java sp
598 // => use call_RT for now (speed can be improved by
599 // doing last java sp setup manually)
600 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, wb_pre_call), obj);
601
602 oop_maps = new OopMapSet();
603 oop_maps->add_gc_map(call_offset, map);
604 restore_live_registers(sasm);
605 }
606 __ ret(0);
607 break;
608 }
609 case wb_post_call_id: {
610 Register obj = j_rarg0;
611 Register caddr = j_rarg1;
612 {
613 GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments);
614 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
615
616 // note: really a leaf routine but must setup last java sp
617 // => use call_RT for now (speed can be improved by
618 // doing last java sp setup manually)
619 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, wb_post_call), obj, caddr);
620
621 oop_maps = new OopMapSet();
622 oop_maps->add_gc_map(call_offset, map);
623 restore_live_registers(sasm);
624 }
625 __ ret(0);
626 break;
627 }
628
629 default: 591 default:
630 { GraalStubFrame f(sasm, "unimplemented entry", dont_gc_arguments); 592 { GraalStubFrame f(sasm, "unimplemented entry", dont_gc_arguments);
631 __ movptr(rax, (int)id); 593 __ movptr(rax, (int)id);
632 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax); 594 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
633 __ should_not_reach_here(); 595 __ should_not_reach_here();