comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 8506:c3657d00e343

-Merge with tip
author Christos Kotselidis <christos.kotselidis@oracle.com>
date Thu, 21 Mar 2013 14:11:13 +0100
parents ff4fa8b0516e 25691fcb505a
children e41c32a4d573
comparison
equal deleted inserted replaced
8505:dee7c8b578c7 8506:c3657d00e343
44 // setup registers 44 // setup registers
45 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread); // is callee-saved register (Visual C++ calling conventions) 45 const Register thread = NOT_LP64(rdi) LP64_ONLY(r15_thread); // is callee-saved register (Visual C++ calling conventions)
46 assert(!(oop_result1->is_valid() || metadata_result->is_valid()) || oop_result1 != metadata_result, "registers must be different"); 46 assert(!(oop_result1->is_valid() || metadata_result->is_valid()) || oop_result1 != metadata_result, "registers must be different");
47 assert(oop_result1 != thread && metadata_result != thread, "registers must be different"); 47 assert(oop_result1 != thread && metadata_result != thread, "registers must be different");
48 assert(args_size >= 0, "illegal args_size"); 48 assert(args_size >= 0, "illegal args_size");
49 bool align_stack = false;
50 #ifdef _LP64
51 // At a method handle call, the stack may not be properly aligned
52 // when returning with an exception.
53 align_stack = (stub_id() == false /*GraalRuntime::handle_exception_from_callee_id*/);
54 #endif
55 49
56 #ifdef _LP64 50 #ifdef _LP64
57 mov(c_rarg0, thread); 51 mov(c_rarg0, thread);
58 set_num_rt_args(0); // Nothing on stack 52 set_num_rt_args(0); // Nothing on stack
59 #else 53 #else
63 get_thread(thread); 57 get_thread(thread);
64 push(thread); 58 push(thread);
65 #endif // _LP64 59 #endif // _LP64
66 60
67 int call_offset; 61 int call_offset;
68 if (!align_stack) { 62 set_last_Java_frame(thread, rsp, noreg, NULL);
69 set_last_Java_frame(thread, noreg, rbp, NULL);
70 } else {
71 address the_pc = pc();
72 call_offset = offset();
73 set_last_Java_frame(thread, noreg, rbp, the_pc);
74 andptr(rsp, -(StackAlignmentInBytes)); // Align stack
75 }
76 63
77 // do the call 64 // do the call
78 call(RuntimeAddress(entry)); 65 call(RuntimeAddress(entry));
79 if (!align_stack) { 66 call_offset = offset();
80 call_offset = offset();
81 }
82 // verify callee-saved register 67 // verify callee-saved register
83 #ifdef ASSERT 68 #ifdef ASSERT
84 guarantee(thread != rax, "change this code"); 69 guarantee(thread != rax, "change this code");
85 push(rax); 70 push(rax);
86 { Label L; 71 { Label L;
91 stop("GraalStubAssembler::call_RT: rdi not callee saved?"); 76 stop("GraalStubAssembler::call_RT: rdi not callee saved?");
92 bind(L); 77 bind(L);
93 } 78 }
94 pop(rax); 79 pop(rax);
95 #endif 80 #endif
96 reset_last_Java_frame(thread, true, align_stack); 81 reset_last_Java_frame(thread, true, false);
97 82
98 // discard thread and arguments 83 // discard thread and arguments
99 NOT_LP64(addptr(rsp, num_rt_args()*BytesPerWord)); 84 NOT_LP64(addptr(rsp, num_rt_args()*BytesPerWord));
100 85
101 // check for pending exceptions 86 // check for pending exceptions
113 } 98 }
114 // (thomaswue) Deoptimize in case of an exception. 99 // (thomaswue) Deoptimize in case of an exception.
115 restore_live_registers(this, false); 100 restore_live_registers(this, false);
116 movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD); 101 movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD);
117 leave(); 102 leave();
118 movl(rscratch1, Deoptimization::make_trap_request(Deoptimization::Reason_constraint, Deoptimization::Action_reinterpret)); 103 movl(Address(thread, ThreadShadow::pending_deoptimization_offset()), Deoptimization::make_trap_request(Deoptimization::Reason_constraint, Deoptimization::Action_reinterpret));
119 jump(RuntimeAddress(SharedRuntime::deopt_blob()->uncommon_trap())); 104 jump(RuntimeAddress(SharedRuntime::deopt_blob()->uncommon_trap()));
120 bind(L); 105 bind(L);
121 } 106 }
122 // get oop results if there are any and reset the values in the thread 107 // get oop results if there are any and reset the values in the thread
123 if (oop_result1->is_valid()) { 108 if (oop_result1->is_valid()) {
354 OopMap* map = new OopMap(frame_size_in_slots, 0); 339 OopMap* map = new OopMap(frame_size_in_slots, 0);
355 map->set_callee_saved(VMRegImpl::stack2reg(rax_off + num_rt_args), rax->as_VMReg()); 340 map->set_callee_saved(VMRegImpl::stack2reg(rax_off + num_rt_args), rax->as_VMReg());
356 map->set_callee_saved(VMRegImpl::stack2reg(rcx_off + num_rt_args), rcx->as_VMReg()); 341 map->set_callee_saved(VMRegImpl::stack2reg(rcx_off + num_rt_args), rcx->as_VMReg());
357 map->set_callee_saved(VMRegImpl::stack2reg(rdx_off + num_rt_args), rdx->as_VMReg()); 342 map->set_callee_saved(VMRegImpl::stack2reg(rdx_off + num_rt_args), rdx->as_VMReg());
358 map->set_callee_saved(VMRegImpl::stack2reg(rbx_off + num_rt_args), rbx->as_VMReg()); 343 map->set_callee_saved(VMRegImpl::stack2reg(rbx_off + num_rt_args), rbx->as_VMReg());
344 map->set_callee_saved(VMRegImpl::stack2reg(rbp_off + num_rt_args), rbp->as_VMReg());
359 map->set_callee_saved(VMRegImpl::stack2reg(rsi_off + num_rt_args), rsi->as_VMReg()); 345 map->set_callee_saved(VMRegImpl::stack2reg(rsi_off + num_rt_args), rsi->as_VMReg());
360 map->set_callee_saved(VMRegImpl::stack2reg(rdi_off + num_rt_args), rdi->as_VMReg()); 346 map->set_callee_saved(VMRegImpl::stack2reg(rdi_off + num_rt_args), rdi->as_VMReg());
361 #ifdef _LP64 347 #ifdef _LP64
362 map->set_callee_saved(VMRegImpl::stack2reg(r8_off + num_rt_args), r8->as_VMReg()); 348 map->set_callee_saved(VMRegImpl::stack2reg(r8_off + num_rt_args), r8->as_VMReg());
363 map->set_callee_saved(VMRegImpl::stack2reg(r9_off + num_rt_args), r9->as_VMReg()); 349 map->set_callee_saved(VMRegImpl::stack2reg(r9_off + num_rt_args), r9->as_VMReg());
371 // This is stupid but needed. 357 // This is stupid but needed.
372 map->set_callee_saved(VMRegImpl::stack2reg(raxH_off + num_rt_args), rax->as_VMReg()->next()); 358 map->set_callee_saved(VMRegImpl::stack2reg(raxH_off + num_rt_args), rax->as_VMReg()->next());
373 map->set_callee_saved(VMRegImpl::stack2reg(rcxH_off + num_rt_args), rcx->as_VMReg()->next()); 359 map->set_callee_saved(VMRegImpl::stack2reg(rcxH_off + num_rt_args), rcx->as_VMReg()->next());
374 map->set_callee_saved(VMRegImpl::stack2reg(rdxH_off + num_rt_args), rdx->as_VMReg()->next()); 360 map->set_callee_saved(VMRegImpl::stack2reg(rdxH_off + num_rt_args), rdx->as_VMReg()->next());
375 map->set_callee_saved(VMRegImpl::stack2reg(rbxH_off + num_rt_args), rbx->as_VMReg()->next()); 361 map->set_callee_saved(VMRegImpl::stack2reg(rbxH_off + num_rt_args), rbx->as_VMReg()->next());
362 map->set_callee_saved(VMRegImpl::stack2reg(rbpH_off + num_rt_args), rbp->as_VMReg()->next());
376 map->set_callee_saved(VMRegImpl::stack2reg(rsiH_off + num_rt_args), rsi->as_VMReg()->next()); 363 map->set_callee_saved(VMRegImpl::stack2reg(rsiH_off + num_rt_args), rsi->as_VMReg()->next());
377 map->set_callee_saved(VMRegImpl::stack2reg(rdiH_off + num_rt_args), rdi->as_VMReg()->next()); 364 map->set_callee_saved(VMRegImpl::stack2reg(rdiH_off + num_rt_args), rdi->as_VMReg()->next());
378 365
379 map->set_callee_saved(VMRegImpl::stack2reg(r8H_off + num_rt_args), r8->as_VMReg()->next()); 366 map->set_callee_saved(VMRegImpl::stack2reg(r8H_off + num_rt_args), r8->as_VMReg()->next());
380 map->set_callee_saved(VMRegImpl::stack2reg(r9H_off + num_rt_args), r9->as_VMReg()->next()); 367 map->set_callee_saved(VMRegImpl::stack2reg(r9H_off + num_rt_args), r9->as_VMReg()->next());
636 623
637 // Save registers, if required. 624 // Save registers, if required.
638 OopMapSet* oop_maps = new OopMapSet(); 625 OopMapSet* oop_maps = new OopMapSet();
639 OopMap* oop_map = NULL; 626 OopMap* oop_map = NULL;
640 switch (id) { 627 switch (id) {
641 case graal_handle_exception_nofpu_id: 628 case handle_exception_nofpu_id:
642 // At this point all registers MAY be live. 629 // At this point all registers MAY be live.
643 oop_map = save_live_registers(sasm, 1 /*thread*/, id == graal_handle_exception_nofpu_id); 630 oop_map = save_live_registers(sasm, 1 /*thread*/, id == handle_exception_nofpu_id);
644 break; 631 break;
645 default: ShouldNotReachHere(); 632 default: ShouldNotReachHere();
646 } 633 }
647 634
648 #ifdef TIERED 635 #ifdef TIERED
710 697
711 // patch the return address, this stub will directly return to the exception handler 698 // patch the return address, this stub will directly return to the exception handler
712 __ movptr(Address(rbp, 1*BytesPerWord), rax); 699 __ movptr(Address(rbp, 1*BytesPerWord), rax);
713 700
714 switch (id) { 701 switch (id) {
715 case graal_handle_exception_nofpu_id: 702 case handle_exception_nofpu_id:
716 // Restore the registers that were saved at the beginning. 703 // Restore the registers that were saved at the beginning.
717 restore_live_registers(sasm, id == graal_handle_exception_nofpu_id); 704 restore_live_registers(sasm, id == handle_exception_nofpu_id);
718 break; 705 break;
719 default: ShouldNotReachHere(); 706 default: ShouldNotReachHere();
720 } 707 }
721 708
722 return oop_maps; 709 return oop_maps;
822 809
823 // stub code & info for the different stubs 810 // stub code & info for the different stubs
824 OopMapSet* oop_maps = NULL; 811 OopMapSet* oop_maps = NULL;
825 switch (id) { 812 switch (id) {
826 813
827 case graal_new_instance_id: 814 case new_instance_id:
828 { 815 {
829 Register klass = rdx; // Incoming 816 Register klass = rdx; // Incoming
830 Register obj = rax; // Result 817 Register obj = rax; // Result
831 __ set_info("new_instance", dont_gc_arguments); 818 __ set_info("new_instance", dont_gc_arguments);
832 __ enter(); 819 __ enter();
842 // rax,: new instance 829 // rax,: new instance
843 } 830 }
844 831
845 break; 832 break;
846 833
847 case graal_new_array_id: 834 case new_array_id:
848 { 835 {
849 Register length = rbx; // Incoming 836 Register length = rbx; // Incoming
850 Register klass = rdx; // Incoming 837 Register klass = rdx; // Incoming
851 Register obj = rax; // Result 838 Register obj = rax; // Result
852 839
867 854
868 // rax,: new array 855 // rax,: new array
869 } 856 }
870 break; 857 break;
871 858
872 case graal_new_multi_array_id: 859 case new_multi_array_id:
873 { GraalStubFrame f(sasm, "new_multi_array", dont_gc_arguments); 860 { GraalStubFrame f(sasm, "new_multi_array", dont_gc_arguments);
874 // rax,: klass 861 // rax,: klass
875 // rbx,: rank 862 // rbx,: rank
876 // rcx: address of 1st dimension 863 // rcx: address of 1st dimension
877 OopMap* map = save_live_registers(sasm, 4); 864 OopMap* map = save_live_registers(sasm, 4);
884 // rax,: new multi array 871 // rax,: new multi array
885 __ verify_oop(rax); 872 __ verify_oop(rax);
886 } 873 }
887 break; 874 break;
888 875
889 case graal_register_finalizer_id: 876 case register_finalizer_id:
890 { 877 {
891 __ set_info("register_finalizer", dont_gc_arguments); 878 __ set_info("register_finalizer", dont_gc_arguments);
892 879
893 // This is called via call_runtime so the arguments 880 // This is called via call_runtime so the arguments
894 // will be place in C abi locations 881 // will be place in C abi locations
925 __ leave(); 912 __ leave();
926 __ ret(0); 913 __ ret(0);
927 } 914 }
928 break; 915 break;
929 916
930 case graal_handle_exception_nofpu_id: 917 case handle_exception_nofpu_id:
931 { GraalStubFrame f(sasm, "handle_exception", dont_gc_arguments); 918 { GraalStubFrame f(sasm, "handle_exception", dont_gc_arguments);
932 oop_maps = generate_handle_exception(id, sasm); 919 oop_maps = generate_handle_exception(id, sasm);
933 } 920 }
934 break; 921 break;
935 922
936 case graal_slow_subtype_check_id: 923 case unwind_exception_call_id: {
937 {
938 // Typical calling sequence:
939 // __ push(klass_RInfo); // object klass or other subclass
940 // __ push(sup_k_RInfo); // array element klass or other superclass
941 // __ call(slow_subtype_check);
942 // Note that the subclass is pushed first, and is therefore deepest.
943 // Previous versions of this code reversed the names 'sub' and 'super'.
944 // This was operationally harmless but made the code unreadable.
945 enum layout {
946 rax_off, SLOT2(raxH_off)
947 rcx_off, SLOT2(rcxH_off)
948 rsi_off, SLOT2(rsiH_off)
949 rdi_off, SLOT2(rdiH_off)
950 // saved_rbp_off, SLOT2(saved_rbpH_off)
951 return_off, SLOT2(returnH_off)
952 sup_k_off, SLOT2(sup_kH_off)
953 klass_off, SLOT2(superH_off)
954 framesize,
955 result_off = klass_off // deepest argument is also the return value
956 };
957
958 __ set_info("slow_subtype_check", dont_gc_arguments);
959 __ push(rdi);
960 __ push(rsi);
961 __ push(rcx);
962 __ push(rax);
963
964 // This is called by pushing args and not with C abi
965 __ movptr(rsi, Address(rsp, (klass_off) * VMRegImpl::stack_slot_size)); // subclass
966 __ movptr(rax, Address(rsp, (sup_k_off) * VMRegImpl::stack_slot_size)); // superclass
967
968 Label miss;
969 Label success;
970 __ check_klass_subtype_fast_path(rsi, rax, rcx, &success, &miss, NULL);
971
972 __ check_klass_subtype_slow_path(rsi, rax, rcx, rdi, NULL, &miss);
973
974 // fallthrough on success:
975 __ bind(success);
976 __ movptr(Address(rsp, (result_off) * VMRegImpl::stack_slot_size), 1); // result
977 __ pop(rax);
978 __ pop(rcx);
979 __ pop(rsi);
980 __ pop(rdi);
981 __ ret(0);
982
983 __ bind(miss);
984 __ movptr(Address(rsp, (result_off) * VMRegImpl::stack_slot_size), NULL_WORD); // result
985 __ pop(rax);
986 __ pop(rcx);
987 __ pop(rsi);
988 __ pop(rdi);
989 __ ret(0);
990 }
991 break;
992
993 case graal_unwind_exception_call_id: {
994 // remove the frame from the stack 924 // remove the frame from the stack
995 __ movptr(rsp, rbp); 925 __ movptr(rsp, rbp);
996 __ pop(rbp); 926 __ pop(rbp);
997 // exception_oop is passed using ordinary java calling conventions
998 __ movptr(rax, j_rarg0);
999
1000 Label nonNullExceptionOop;
1001 __ testptr(rax, rax);
1002 __ jcc(Assembler::notZero, nonNullExceptionOop);
1003 {
1004 __ enter();
1005 oop_maps = new OopMapSet();
1006 OopMap* oop_map = save_live_registers(sasm, 0);
1007 int call_offset = __ call_RT(rax, noreg, (address)graal_create_null_exception, 0);
1008 oop_maps->add_gc_map(call_offset, oop_map);
1009 __ leave();
1010 }
1011 __ bind(nonNullExceptionOop);
1012 927
1013 __ set_info("unwind_exception", dont_gc_arguments); 928 __ set_info("unwind_exception", dont_gc_arguments);
1014 // note: no stubframe since we are about to leave the current 929 // note: no stubframe since we are about to leave the current
1015 // activation and we are calling a leaf VM function only. 930 // activation and we are calling a leaf VM function only.
1016 generate_unwind_exception(sasm); 931 generate_unwind_exception(sasm);
1017 __ should_not_reach_here(); 932 __ should_not_reach_here();
1018 break; 933 break;
1019 } 934 }
1020 935
1021 case graal_OSR_migration_end_id: { 936 case OSR_migration_end_id: {
1022 __ enter(); 937 __ enter();
1023 save_live_registers(sasm, 0); 938 save_live_registers(sasm, 0);
1024 __ movptr(c_rarg0, j_rarg0); 939 __ movptr(c_rarg0, j_rarg0);
1025 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_end))); 940 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_end)));
1026 restore_live_registers(sasm); 941 restore_live_registers(sasm);
1027 __ leave(); 942 __ leave();
1028 __ ret(0); 943 __ ret(0);
1029 break; 944 break;
1030 } 945 }
1031 946
1032 case graal_set_deopt_info_id: { 947 case create_null_pointer_exception_id: {
1033 __ movptr(Address(r15_thread, JavaThread::graal_deopt_info_offset()), rscratch1);
1034 __ ret(0);
1035 break;
1036 }
1037
1038 case graal_create_null_pointer_exception_id: {
1039 __ enter(); 948 __ enter();
1040 oop_maps = new OopMapSet(); 949 oop_maps = new OopMapSet();
1041 OopMap* oop_map = save_live_registers(sasm, 0); 950 OopMap* oop_map = save_live_registers(sasm, 0);
1042 int call_offset = __ call_RT(rax, noreg, (address)graal_create_null_exception, 0); 951 int call_offset = __ call_RT(rax, noreg, (address)create_null_exception, 0);
1043 oop_maps->add_gc_map(call_offset, oop_map); 952 oop_maps->add_gc_map(call_offset, oop_map);
1044 __ leave(); 953 __ leave();
1045 __ ret(0); 954 __ ret(0);
1046 break; 955 break;
1047 } 956 }
1048 957
1049 case graal_create_out_of_bounds_exception_id: { 958 case create_out_of_bounds_exception_id: {
1050 __ enter(); 959 __ enter();
1051 oop_maps = new OopMapSet(); 960 oop_maps = new OopMapSet();
1052 OopMap* oop_map = save_live_registers(sasm, 0); 961 OopMap* oop_map = save_live_registers(sasm, 0);
1053 int call_offset = __ call_RT(rax, noreg, (address)graal_create_out_of_bounds_exception, j_rarg0); 962 int call_offset = __ call_RT(rax, noreg, (address)create_out_of_bounds_exception, j_rarg0);
1054 oop_maps->add_gc_map(call_offset, oop_map); 963 oop_maps->add_gc_map(call_offset, oop_map);
1055 __ leave(); 964 __ leave();
1056 __ ret(0); 965 __ ret(0);
1057 break; 966 break;
1058 } 967 }
1059 968
1060 case graal_vm_error_id: { 969 case vm_error_id: {
1061 __ enter(); 970 __ enter();
1062 oop_maps = new OopMapSet(); 971 oop_maps = new OopMapSet();
1063 OopMap* oop_map = save_live_registers(sasm, 0); 972 OopMap* oop_map = save_live_registers(sasm, 0);
1064 int call_offset = __ call_RT(noreg, noreg, (address)graal_vm_error, j_rarg0, j_rarg1, j_rarg2); 973 int call_offset = __ call_RT(noreg, noreg, (address)vm_error, j_rarg0, j_rarg1, j_rarg2);
1065 oop_maps->add_gc_map(call_offset, oop_map); 974 oop_maps->add_gc_map(call_offset, oop_map);
1066 restore_live_registers(sasm); 975 restore_live_registers(sasm);
1067 __ leave(); 976 __ leave();
1068 __ ret(0); 977 __ ret(0);
1069 break; 978 break;
1070 } 979 }
1071 980
1072 case graal_log_printf_id: { 981 case log_printf_id: {
1073 __ enter(); 982 __ enter();
1074 oop_maps = new OopMapSet(); 983 oop_maps = new OopMapSet();
1075 OopMap* oop_map = save_live_registers(sasm, 0); 984 OopMap* oop_map = save_live_registers(sasm, 0);
1076 int call_offset = __ call_RT(noreg, noreg, (address)graal_log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3); 985 int call_offset = __ call_RT(noreg, noreg, (address)log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3);
1077 oop_maps->add_gc_map(call_offset, oop_map); 986 oop_maps->add_gc_map(call_offset, oop_map);
1078 restore_live_registers(sasm); 987 restore_live_registers(sasm);
1079 __ leave(); 988 __ leave();
1080 __ ret(0); 989 __ ret(0);
1081 break; 990 break;
1082 } 991 }
1083 992
1084 case graal_log_primitive_id: { 993 case log_primitive_id: {
1085 __ enter(); 994 __ enter();
1086 oop_maps = new OopMapSet(); 995 oop_maps = new OopMapSet();
1087 OopMap* oop_map = save_live_registers(sasm, 0); 996 OopMap* oop_map = save_live_registers(sasm, 0);
1088 int call_offset = __ call_RT(noreg, noreg, (address)graal_log_primitive, j_rarg0, j_rarg1, j_rarg2); 997 int call_offset = __ call_RT(noreg, noreg, (address)log_primitive, j_rarg0, j_rarg1, j_rarg2);
1089 oop_maps->add_gc_map(call_offset, oop_map); 998 oop_maps->add_gc_map(call_offset, oop_map);
1090 restore_live_registers(sasm); 999 restore_live_registers(sasm);
1091 __ leave(); 1000 __ leave();
1092 __ ret(0); 1001 __ ret(0);
1093 break; 1002 break;
1094 } 1003 }
1095 1004
1096 case graal_log_object_id: { 1005 case log_object_id: {
1097 __ enter(); 1006 __ enter();
1098 oop_maps = new OopMapSet(); 1007 oop_maps = new OopMapSet();
1099 OopMap* oop_map = save_live_registers(sasm, 0); 1008 OopMap* oop_map = save_live_registers(sasm, 0);
1100 int call_offset = __ call_RT(noreg, noreg, (address)graal_log_object, j_rarg0, j_rarg1); 1009 int call_offset = __ call_RT(noreg, noreg, (address)log_object, j_rarg0, j_rarg1);
1101 oop_maps->add_gc_map(call_offset, oop_map); 1010 oop_maps->add_gc_map(call_offset, oop_map);
1102 restore_live_registers(sasm); 1011 restore_live_registers(sasm);
1103 __ leave(); 1012 __ leave();
1104 __ ret(0); 1013 __ ret(0);
1105 break; 1014 break;
1106 } 1015 }
1107 1016
1108 case graal_verify_oop_id: { 1017 case verify_oop_id: {
1109 // We use enter & leave so that a better stack trace is produced in the hs_err file 1018 // We use enter & leave so that a better stack trace is produced in the hs_err file
1110 __ enter(); 1019 __ enter();
1111 __ verify_oop(r13, "Graal verify oop"); 1020 __ verify_oop(r13, "Graal verify oop");
1112 __ leave(); 1021 __ leave();
1113 __ ret(0); 1022 __ ret(0);
1114 break; 1023 break;
1115 } 1024 }
1116 1025
1117 case graal_arithmetic_frem_id: { 1026 case arithmetic_frem_id: {
1118 __ subptr(rsp, 8); 1027 __ subptr(rsp, 8);
1119 __ movflt(Address(rsp, 0), xmm1); 1028 __ movflt(Address(rsp, 0), xmm1);
1120 __ fld_s(Address(rsp, 0)); 1029 __ fld_s(Address(rsp, 0));
1121 __ movflt(Address(rsp, 0), xmm0); 1030 __ movflt(Address(rsp, 0), xmm0);
1122 __ fld_s(Address(rsp, 0)); 1031 __ fld_s(Address(rsp, 0));
1133 __ movflt(xmm0, Address(rsp, 0)); 1042 __ movflt(xmm0, Address(rsp, 0));
1134 __ addptr(rsp, 8); 1043 __ addptr(rsp, 8);
1135 __ ret(0); 1044 __ ret(0);
1136 break; 1045 break;
1137 } 1046 }
1138 case graal_arithmetic_drem_id: { 1047 case arithmetic_drem_id: {
1139 __ subptr(rsp, 8); 1048 __ subptr(rsp, 8);
1140 __ movdbl(Address(rsp, 0), xmm1); 1049 __ movdbl(Address(rsp, 0), xmm1);
1141 __ fld_d(Address(rsp, 0)); 1050 __ fld_d(Address(rsp, 0));
1142 __ movdbl(Address(rsp, 0), xmm0); 1051 __ movdbl(Address(rsp, 0), xmm0);
1143 __ fld_d(Address(rsp, 0)); 1052 __ fld_d(Address(rsp, 0));
1154 __ movdbl(xmm0, Address(rsp, 0)); 1063 __ movdbl(xmm0, Address(rsp, 0));
1155 __ addptr(rsp, 8); 1064 __ addptr(rsp, 8);
1156 __ ret(0); 1065 __ ret(0);
1157 break; 1066 break;
1158 } 1067 }
1159 case graal_monitorenter_id: { 1068 case monitorenter_id: {
1160 Register obj = j_rarg0; 1069 Register obj = j_rarg0;
1161 Register lock = j_rarg1; 1070 Register lock = j_rarg1;
1162 { 1071 {
1163 GraalStubFrame f(sasm, "graal_monitorenter", dont_gc_arguments); 1072 GraalStubFrame f(sasm, "monitorenter", dont_gc_arguments);
1164 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1073 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
1165 1074
1166 // Called with store_parameter and not C abi 1075 // Called with store_parameter and not C abi
1167 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_monitorenter), obj, lock); 1076 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorenter), obj, lock);
1168 1077
1169 oop_maps = new OopMapSet(); 1078 oop_maps = new OopMapSet();
1170 oop_maps->add_gc_map(call_offset, map); 1079 oop_maps->add_gc_map(call_offset, map);
1171 restore_live_registers(sasm, save_fpu_registers); 1080 restore_live_registers(sasm, save_fpu_registers);
1172 } 1081 }
1173 __ ret(0); 1082 __ ret(0);
1174 break; 1083 break;
1175 } 1084 }
1176 case graal_monitorexit_id: { 1085 case monitorexit_id: {
1177 Register obj = j_rarg0; 1086 Register obj = j_rarg0;
1178 Register lock = j_rarg1; 1087 Register lock = j_rarg1;
1179 { 1088 {
1180 GraalStubFrame f(sasm, "graal_monitorexit", dont_gc_arguments); 1089 GraalStubFrame f(sasm, "monitorexit", dont_gc_arguments);
1181 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1090 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
1182 1091
1183 // note: really a leaf routine but must setup last java sp 1092 // note: really a leaf routine but must setup last java sp
1184 // => use call_RT for now (speed can be improved by 1093 // => use call_RT for now (speed can be improved by
1185 // doing last java sp setup manually) 1094 // doing last java sp setup manually)
1186 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_monitorexit), obj, lock); 1095 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), obj, lock);
1187 1096
1188 oop_maps = new OopMapSet(); 1097 oop_maps = new OopMapSet();
1189 oop_maps->add_gc_map(call_offset, map); 1098 oop_maps->add_gc_map(call_offset, map);
1190 restore_live_registers(sasm, save_fpu_registers); 1099 restore_live_registers(sasm, save_fpu_registers);
1191 } 1100 }
1192 __ ret(0); 1101 __ ret(0);
1193 break; 1102 break;
1194 } 1103 }
1195 case graal_wb_pre_call_id: { 1104 case wb_pre_call_id: {
1196 Register obj = j_rarg0; 1105 Register obj = j_rarg0;
1197 { 1106 {
1198 GraalStubFrame f(sasm, "graal_wb_pre_call", dont_gc_arguments); 1107 GraalStubFrame f(sasm, "graal_wb_pre_call", dont_gc_arguments);
1199 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1108 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
1200 1109
1201 // note: really a leaf routine but must setup last java sp 1110 // note: really a leaf routine but must setup last java sp
1202 // => use call_RT for now (speed can be improved by 1111 // => use call_RT for now (speed can be improved by
1203 // doing last java sp setup manually) 1112 // doing last java sp setup manually)
1204 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_wb_pre_call), obj); 1113 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, wb_pre_call), obj);
1205 1114
1206 oop_maps = new OopMapSet(); 1115 oop_maps = new OopMapSet();
1207 oop_maps->add_gc_map(call_offset, map); 1116 oop_maps->add_gc_map(call_offset, map);
1208 restore_live_registers(sasm); 1117 restore_live_registers(sasm);
1209 } 1118 }
1210 __ ret(0); 1119 __ ret(0);
1211 break; 1120 break;
1212 } 1121 }
1213 case graal_wb_post_call_id: { 1122 case wb_post_call_id: {
1214 Register obj = j_rarg0; 1123 Register obj = j_rarg0;
1215 Register caddr = j_rarg1; 1124 Register caddr = j_rarg1;
1216 { 1125 {
1217 GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments); 1126 GraalStubFrame f(sasm, "graal_wb_post_call", dont_gc_arguments);
1218 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1127 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers);
1219 1128
1220 // note: really a leaf routine but must setup last java sp 1129 // note: really a leaf routine but must setup last java sp
1221 // => use call_RT for now (speed can be improved by 1130 // => use call_RT for now (speed can be improved by
1222 // doing last java sp setup manually) 1131 // doing last java sp setup manually)
1223 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_wb_post_call), obj, caddr); 1132 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, wb_post_call), obj, caddr);
1224 1133
1225 oop_maps = new OopMapSet(); 1134 oop_maps = new OopMapSet();
1226 oop_maps->add_gc_map(call_offset, map); 1135 oop_maps->add_gc_map(call_offset, map);
1227 restore_live_registers(sasm); 1136 restore_live_registers(sasm);
1228 } 1137 }
1229 __ ret(0); 1138 __ ret(0);
1230 break; 1139 break;
1231 } 1140 }
1232 1141
1233 case graal_identity_hash_code_id: { 1142
1143 case identity_hash_code_id: {
1234 Register obj = j_rarg0; // Incoming 1144 Register obj = j_rarg0; // Incoming
1235 __ set_info("identity_hash_code", dont_gc_arguments); 1145 __ set_info("identity_hash_code", dont_gc_arguments);
1236 __ enter(); 1146 __ enter();
1237 OopMap* map = save_live_registers(sasm, 1); 1147 OopMap* map = save_live_registers(sasm, 1);
1238 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_identity_hash_code), obj); 1148 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, identity_hash_code), obj);
1239 oop_maps = new OopMapSet(); 1149 oop_maps = new OopMapSet();
1240 oop_maps->add_gc_map(call_offset, map); 1150 oop_maps->add_gc_map(call_offset, map);
1241 restore_live_registers_except_rax(sasm); 1151 restore_live_registers_except_rax(sasm);
1242 __ leave(); 1152 __ leave();
1243 __ ret(0); 1153 __ ret(0);
1244 break; 1154 break;
1245 } 1155 }
1246 case graal_thread_is_interrupted_id: { 1156 case thread_is_interrupted_id: {
1247 Register thread = j_rarg0; 1157 Register thread = j_rarg0;
1248 Register clear_interrupted = j_rarg1; 1158 Register clear_interrupted = j_rarg1;
1249 1159
1250 __ set_info("identity_hash_code", dont_gc_arguments); 1160 __ set_info("identity_hash_code", dont_gc_arguments);
1251 __ enter(); 1161 __ enter();
1252 OopMap* map = save_live_registers(sasm, 1); 1162 OopMap* map = save_live_registers(sasm, 1);
1253 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, graal_thread_is_interrupted), thread, clear_interrupted); 1163 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, thread_is_interrupted), thread, clear_interrupted);
1254 oop_maps = new OopMapSet(); 1164 oop_maps = new OopMapSet();
1255 oop_maps->add_gc_map(call_offset, map); 1165 oop_maps->add_gc_map(call_offset, map);
1256 restore_live_registers_except_rax(sasm); 1166 restore_live_registers_except_rax(sasm);
1257 __ leave(); 1167 __ leave();
1258 __ ret(0); 1168 __ ret(0);