Mercurial > hg > graal-compiler
comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 9004:9f3a77848ea2
Merge with d2c34ddac70fe8636b79944417f44d396c0f9acf
author | Michael Haupt <michael.haupt@oracle.com> |
---|---|
date | Thu, 11 Apr 2013 11:26:38 +0200 |
parents | 4fc644c79b9f |
children | bb2447c64055 |
comparison
equal
deleted
inserted
replaced
9003:a8fea2979e63 | 9004:9f3a77848ea2 |
---|---|
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); |