Mercurial > hg > graal-compiler
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); |