src/cpu/sparc/vm/c1_Runtime1_sparc.cpp

Print this page
rev 4136 : 7153771: array bound check elimination for c1
Summary: when possible optimize out array bound checks, inserting predicates when needed.
Reviewed-by:


 970 
 971         __ mov(tmp2, L0);
 972         __ mov(tmp3, L1);
 973         __ mov(tmp4, L2);
 974 
 975         __ call_VM_leaf(L7_thread_cache,
 976                         CAST_FROM_FN_PTR(address,
 977                                          DirtyCardQueueSet::handle_zero_index_for_thread),
 978                                          G2_thread);
 979 
 980         __ mov(L0, tmp2);
 981         __ mov(L1, tmp3);
 982         __ mov(L2, tmp4);
 983 
 984         __ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
 985         __ delayed()->restore();
 986       }
 987       break;
 988 #endif // INCLUDE_ALL_GCS
 989 



















 990     default:
 991       { __ set_info("unimplemented entry", dont_gc_arguments);
 992         __ save_frame(0);
 993         __ set((int)id, O1);
 994         __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), O1);
 995         __ should_not_reach_here();
 996       }
 997       break;
 998   }
 999   return oop_maps;
1000 }
1001 
1002 
1003 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler* sasm) {
1004   __ block_comment("generate_handle_exception");
1005 
1006   // Save registers, if required.
1007   OopMapSet* oop_maps = new OopMapSet();
1008   OopMap* oop_map = NULL;
1009   switch (id) {




 970 
 971         __ mov(tmp2, L0);
 972         __ mov(tmp3, L1);
 973         __ mov(tmp4, L2);
 974 
 975         __ call_VM_leaf(L7_thread_cache,
 976                         CAST_FROM_FN_PTR(address,
 977                                          DirtyCardQueueSet::handle_zero_index_for_thread),
 978                                          G2_thread);
 979 
 980         __ mov(L0, tmp2);
 981         __ mov(L1, tmp3);
 982         __ mov(L2, tmp4);
 983 
 984         __ br(Assembler::always, /*annul*/false, Assembler::pt, restart);
 985         __ delayed()->restore();
 986       }
 987       break;
 988 #endif // INCLUDE_ALL_GCS
 989 
 990     case predicate_failed_trap_id:
 991       { 
 992         __ set_info("throw_incompatible_class_cast_exception", dont_gc_arguments);
 993         OopMap* oop_map = save_live_registers(sasm);
 994 
 995         int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, predicate_failed_trap));
 996 
 997         oop_maps = new OopMapSet();
 998         oop_maps->add_gc_map(call_offset, oop_map);
 999 
1000         DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob();
1001         assert(deopt_blob != NULL, "deoptimization blob must have been created");
1002         restore_live_registers(sasm);
1003         __ restore();
1004         __ br(Assembler::always, false, Assembler::pt, deopt_blob->unpack_with_reexecution(), relocInfo::runtime_call_type);
1005         __ delayed()->nop();
1006       }
1007       break;
1008 
1009     default:
1010       { __ set_info("unimplemented entry", dont_gc_arguments);
1011         __ save_frame(0);
1012         __ set((int)id, O1);
1013         __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), O1);
1014         __ should_not_reach_here();
1015       }
1016       break;
1017   }
1018   return oop_maps;
1019 }
1020 
1021 
1022 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler* sasm) {
1023   __ block_comment("generate_handle_exception");
1024 
1025   // Save registers, if required.
1026   OopMapSet* oop_maps = new OopMapSet();
1027   OopMap* oop_map = NULL;
1028   switch (id) {