comparison src/cpu/x86/vm/graalRuntime_x86.cpp @ 8976:4fc644c79b9f

Correctly restore registers after runtime calls that create exceptions.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 09 Apr 2013 21:55:58 +0200
parents e41c32a4d573
children bb2447c64055
comparison
equal deleted inserted replaced
8975:ed49e2135abe 8976:4fc644c79b9f
928 __ enter(); 928 __ enter();
929 oop_maps = new OopMapSet(); 929 oop_maps = new OopMapSet();
930 OopMap* oop_map = save_live_registers(sasm, 0); 930 OopMap* oop_map = save_live_registers(sasm, 0);
931 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);
932 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);
933 __ leave(); 934 __ leave();
934 __ ret(0); 935 __ ret(0);
935 break; 936 break;
936 } 937 }
937 938
938 case create_out_of_bounds_exception_id: { 939 case create_out_of_bounds_exception_id: {
939 __ enter(); 940 __ enter();
940 oop_maps = new OopMapSet(); 941 oop_maps = new OopMapSet();
941 OopMap* oop_map = save_live_registers(sasm, 0); 942 OopMap* oop_map = save_live_registers(sasm, 1);
942 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);
943 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);
944 __ leave(); 946 __ leave();
945 __ ret(0); 947 __ ret(0);
946 break; 948 break;
947 } 949 }
948 950
949 case vm_error_id: { 951 case vm_error_id: {
950 __ enter(); 952 __ enter();
951 oop_maps = new OopMapSet(); 953 oop_maps = new OopMapSet();
952 OopMap* oop_map = save_live_registers(sasm, 0); 954 OopMap* oop_map = save_live_registers(sasm, 3);
953 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);
954 oop_maps->add_gc_map(call_offset, oop_map); 956 oop_maps->add_gc_map(call_offset, oop_map);
955 restore_live_registers(sasm); 957 restore_live_registers(sasm);
956 __ leave(); 958 __ leave();
957 __ ret(0); 959 __ ret(0);
959 } 961 }
960 962
961 case log_printf_id: { 963 case log_printf_id: {
962 __ enter(); 964 __ enter();
963 oop_maps = new OopMapSet(); 965 oop_maps = new OopMapSet();
964 OopMap* oop_map = save_live_registers(sasm, 0); 966 OopMap* oop_map = save_live_registers(sasm, 4);
965 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);
966 oop_maps->add_gc_map(call_offset, oop_map); 968 oop_maps->add_gc_map(call_offset, oop_map);
967 restore_live_registers(sasm); 969 restore_live_registers(sasm);
968 __ leave(); 970 __ leave();
969 __ ret(0); 971 __ ret(0);
971 } 973 }
972 974
973 case log_primitive_id: { 975 case log_primitive_id: {
974 __ enter(); 976 __ enter();
975 oop_maps = new OopMapSet(); 977 oop_maps = new OopMapSet();
976 OopMap* oop_map = save_live_registers(sasm, 0); 978 OopMap* oop_map = save_live_registers(sasm, 3);
977 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);
978 oop_maps->add_gc_map(call_offset, oop_map); 980 oop_maps->add_gc_map(call_offset, oop_map);
979 restore_live_registers(sasm); 981 restore_live_registers(sasm);
980 __ leave(); 982 __ leave();
981 __ ret(0); 983 __ ret(0);
983 } 985 }
984 986
985 case log_object_id: { 987 case log_object_id: {
986 __ enter(); 988 __ enter();
987 oop_maps = new OopMapSet(); 989 oop_maps = new OopMapSet();
988 OopMap* oop_map = save_live_registers(sasm, 0); 990 OopMap* oop_map = save_live_registers(sasm, 2);
989 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);
990 oop_maps->add_gc_map(call_offset, oop_map); 992 oop_maps->add_gc_map(call_offset, oop_map);
991 restore_live_registers(sasm); 993 restore_live_registers(sasm);
992 __ leave(); 994 __ leave();
993 __ ret(0); 995 __ ret(0);