comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 9114:01958088b87d

Merge.
author Christian Haeubl <haeubl@ssw.jku.at>
date Mon, 15 Apr 2013 08:49:14 +0200
parents 4fc644c79b9f
children bb2447c64055
comparison
equal deleted inserted replaced
9112:6c33b2076d7c 9114:01958088b87d
877 { 877 {
878 __ set_info("register_finalizer", dont_gc_arguments); 878 __ set_info("register_finalizer", dont_gc_arguments);
879 879
880 // This is called via call_runtime so the arguments 880 // This is called via call_runtime so the arguments
881 // will be place in C abi locations 881 // will be place in C abi locations
882
883 #ifdef _LP64
884 __ verify_oop(j_rarg0); 882 __ verify_oop(j_rarg0);
885 __ mov(rax, j_rarg0);
886 #else
887 // The object is passed on the stack and we haven't pushed a
888 // frame yet so it's one work away from top of stack.
889 __ movptr(rax, Address(rsp, 1 * BytesPerWord));
890 __ verify_oop(rax);
891 #endif // _LP64
892
893 // load the klass and check the has finalizer flag
894 Label register_finalizer;
895 Register t = rsi;
896 __ load_klass(t, rax);
897 __ movl(t, Address(t, Klass::access_flags_offset()));
898 __ testl(t, JVM_ACC_HAS_FINALIZER);
899 __ jcc(Assembler::notZero, register_finalizer);
900 __ ret(0);
901
902 __ bind(register_finalizer);
903 __ enter(); 883 __ enter();
904 OopMap* oop_map = save_live_registers(sasm, 2 /*num_rt_args */); 884 OopMap* oop_map = save_live_registers(sasm, 2 /*num_rt_args */);
905 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), rax); 885 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), j_rarg0);
906 oop_maps = new OopMapSet(); 886 oop_maps = new OopMapSet();
907 oop_maps->add_gc_map(call_offset, oop_map); 887 oop_maps->add_gc_map(call_offset, oop_map);
908 888
909 // Now restore all the live registers 889 // Now restore all the live registers
910 restore_live_registers(sasm); 890 restore_live_registers(sasm);
948 __ enter(); 928 __ enter();
949 oop_maps = new OopMapSet(); 929 oop_maps = new OopMapSet();
950 OopMap* oop_map = save_live_registers(sasm, 0); 930 OopMap* oop_map = save_live_registers(sasm, 0);
951 int call_offset = __ call_RT(rax, noreg, (address)create_null_exception, 0); 931 int call_offset = __ call_RT(rax, noreg, (address)create_null_exception, 0);
952 oop_maps->add_gc_map(call_offset, oop_map); 932 oop_maps->add_gc_map(call_offset, oop_map);
933 restore_live_registers_except_rax(sasm);
953 __ leave(); 934 __ leave();
954 __ ret(0); 935 __ ret(0);
955 break; 936 break;
956 } 937 }
957 938
958 case create_out_of_bounds_exception_id: { 939 case create_out_of_bounds_exception_id: {
959 __ enter(); 940 __ enter();
960 oop_maps = new OopMapSet(); 941 oop_maps = new OopMapSet();
961 OopMap* oop_map = save_live_registers(sasm, 0); 942 OopMap* oop_map = save_live_registers(sasm, 1);
962 int call_offset = __ call_RT(rax, noreg, (address)create_out_of_bounds_exception, j_rarg0); 943 int call_offset = __ call_RT(rax, noreg, (address)create_out_of_bounds_exception, j_rarg0);
963 oop_maps->add_gc_map(call_offset, oop_map); 944 oop_maps->add_gc_map(call_offset, oop_map);
945 restore_live_registers_except_rax(sasm);
964 __ leave(); 946 __ leave();
965 __ ret(0); 947 __ ret(0);
966 break; 948 break;
967 } 949 }
968 950
969 case vm_error_id: { 951 case vm_error_id: {
970 __ enter(); 952 __ enter();
971 oop_maps = new OopMapSet(); 953 oop_maps = new OopMapSet();
972 OopMap* oop_map = save_live_registers(sasm, 0); 954 OopMap* oop_map = save_live_registers(sasm, 3);
973 int call_offset = __ call_RT(noreg, noreg, (address)vm_error, j_rarg0, j_rarg1, j_rarg2); 955 int call_offset = __ call_RT(noreg, noreg, (address)vm_error, j_rarg0, j_rarg1, j_rarg2);
974 oop_maps->add_gc_map(call_offset, oop_map); 956 oop_maps->add_gc_map(call_offset, oop_map);
975 restore_live_registers(sasm); 957 restore_live_registers(sasm);
976 __ leave(); 958 __ leave();
977 __ ret(0); 959 __ ret(0);
979 } 961 }
980 962
981 case log_printf_id: { 963 case log_printf_id: {
982 __ enter(); 964 __ enter();
983 oop_maps = new OopMapSet(); 965 oop_maps = new OopMapSet();
984 OopMap* oop_map = save_live_registers(sasm, 0); 966 OopMap* oop_map = save_live_registers(sasm, 4);
985 int call_offset = __ call_RT(noreg, noreg, (address)log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3); 967 int call_offset = __ call_RT(noreg, noreg, (address)log_printf, j_rarg0, j_rarg1, j_rarg2, j_rarg3);
986 oop_maps->add_gc_map(call_offset, oop_map); 968 oop_maps->add_gc_map(call_offset, oop_map);
987 restore_live_registers(sasm); 969 restore_live_registers(sasm);
988 __ leave(); 970 __ leave();
989 __ ret(0); 971 __ ret(0);
991 } 973 }
992 974
993 case log_primitive_id: { 975 case log_primitive_id: {
994 __ enter(); 976 __ enter();
995 oop_maps = new OopMapSet(); 977 oop_maps = new OopMapSet();
996 OopMap* oop_map = save_live_registers(sasm, 0); 978 OopMap* oop_map = save_live_registers(sasm, 3);
997 int call_offset = __ call_RT(noreg, noreg, (address)log_primitive, j_rarg0, j_rarg1, j_rarg2); 979 int call_offset = __ call_RT(noreg, noreg, (address)log_primitive, j_rarg0, j_rarg1, j_rarg2);
998 oop_maps->add_gc_map(call_offset, oop_map); 980 oop_maps->add_gc_map(call_offset, oop_map);
999 restore_live_registers(sasm); 981 restore_live_registers(sasm);
1000 __ leave(); 982 __ leave();
1001 __ ret(0); 983 __ ret(0);
1003 } 985 }
1004 986
1005 case log_object_id: { 987 case log_object_id: {
1006 __ enter(); 988 __ enter();
1007 oop_maps = new OopMapSet(); 989 oop_maps = new OopMapSet();
1008 OopMap* oop_map = save_live_registers(sasm, 0); 990 OopMap* oop_map = save_live_registers(sasm, 2);
1009 int call_offset = __ call_RT(noreg, noreg, (address)log_object, j_rarg0, j_rarg1); 991 int call_offset = __ call_RT(noreg, noreg, (address)log_object, j_rarg0, j_rarg1);
1010 oop_maps->add_gc_map(call_offset, oop_map); 992 oop_maps->add_gc_map(call_offset, oop_map);
1011 restore_live_registers(sasm); 993 restore_live_registers(sasm);
1012 __ leave(); 994 __ leave();
1013 __ ret(0); 995 __ ret(0);