< prev index next >

src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp

Print this page




1090       { StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments);
1091         oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
1092       }
1093       break;
1094 
1095     case throw_array_store_exception_id:
1096       { StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments);
1097         // tos + 0: link
1098         //     + 1: return address
1099         oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
1100       }
1101       break;
1102 
1103 #if INCLUDE_ALL_GCS
1104 
1105     case g1_pre_barrier_slow_id:
1106       {
1107         StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
1108         // arg0 : previous value of memory
1109 
1110         BarrierSet* bs = Universe::heap()->barrier_set();
1111         if (bs->kind() != BarrierSet::G1BarrierSet) {
1112           __ mov(r0, (int)id);
1113           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), r0);
1114           __ should_not_reach_here();
1115           break;
1116         }
1117 
1118         const Register pre_val = r0;
1119         const Register thread = rthread;
1120         const Register tmp = rscratch1;
1121 
1122         Address in_progress(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
1123         Address queue_index(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
1124         Address buffer(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));
1125 
1126         Label done;
1127         Label runtime;
1128 
1129         // Is marking still active?
1130         if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {


1142         __ sub(tmp, tmp, wordSize);
1143         __ str(tmp, queue_index);
1144         __ ldr(rscratch2, buffer);
1145         __ add(tmp, tmp, rscratch2);
1146         f.load_argument(0, rscratch2);
1147         __ str(rscratch2, Address(tmp, 0));
1148         __ b(done);
1149 
1150         __ bind(runtime);
1151         __ push_call_clobbered_registers();
1152         f.load_argument(0, pre_val);
1153         __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
1154         __ pop_call_clobbered_registers();
1155         __ bind(done);
1156       }
1157       break;
1158     case g1_post_barrier_slow_id:
1159       {
1160         StubFrame f(sasm, "g1_post_barrier", dont_gc_arguments);
1161 
1162         BarrierSet* bs = Universe::heap()->barrier_set();
1163         if (bs->kind() != BarrierSet::G1BarrierSet) {
1164           __ mov(r0, (int)id);
1165           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), r0);
1166           __ should_not_reach_here();
1167           break;
1168         }
1169 
1170         // arg0: store_address
1171         Address store_addr(rfp, 2*BytesPerWord);
1172 
1173         Label done;
1174         Label runtime;
1175 
1176         // At this point we know new_value is non-NULL and the new_value crosses regions.
1177         // Must check to see if card is already dirty
1178 
1179         const Register thread = rthread;
1180 
1181         Address queue_index(thread, in_bytes(G1ThreadLocalData::dirty_card_queue_index_offset()));
1182         Address buffer(thread, in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset()));




1090       { StubFrame f(sasm, "index_range_check_failed", dont_gc_arguments);
1091         oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_index_exception), true);
1092       }
1093       break;
1094 
1095     case throw_array_store_exception_id:
1096       { StubFrame f(sasm, "throw_array_store_exception", dont_gc_arguments);
1097         // tos + 0: link
1098         //     + 1: return address
1099         oop_maps = generate_exception_throw(sasm, CAST_FROM_FN_PTR(address, throw_array_store_exception), true);
1100       }
1101       break;
1102 
1103 #if INCLUDE_ALL_GCS
1104 
1105     case g1_pre_barrier_slow_id:
1106       {
1107         StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
1108         // arg0 : previous value of memory
1109 
1110         BarrierSet* bs = BarrierSet::barrier_set();
1111         if (bs->kind() != BarrierSet::G1BarrierSet) {
1112           __ mov(r0, (int)id);
1113           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), r0);
1114           __ should_not_reach_here();
1115           break;
1116         }
1117 
1118         const Register pre_val = r0;
1119         const Register thread = rthread;
1120         const Register tmp = rscratch1;
1121 
1122         Address in_progress(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset()));
1123         Address queue_index(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset()));
1124         Address buffer(thread, in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset()));
1125 
1126         Label done;
1127         Label runtime;
1128 
1129         // Is marking still active?
1130         if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {


1142         __ sub(tmp, tmp, wordSize);
1143         __ str(tmp, queue_index);
1144         __ ldr(rscratch2, buffer);
1145         __ add(tmp, tmp, rscratch2);
1146         f.load_argument(0, rscratch2);
1147         __ str(rscratch2, Address(tmp, 0));
1148         __ b(done);
1149 
1150         __ bind(runtime);
1151         __ push_call_clobbered_registers();
1152         f.load_argument(0, pre_val);
1153         __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), pre_val, thread);
1154         __ pop_call_clobbered_registers();
1155         __ bind(done);
1156       }
1157       break;
1158     case g1_post_barrier_slow_id:
1159       {
1160         StubFrame f(sasm, "g1_post_barrier", dont_gc_arguments);
1161 
1162         BarrierSet* bs = BarrierSet::barrier_set();
1163         if (bs->kind() != BarrierSet::G1BarrierSet) {
1164           __ mov(r0, (int)id);
1165           __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), r0);
1166           __ should_not_reach_here();
1167           break;
1168         }
1169 
1170         // arg0: store_address
1171         Address store_addr(rfp, 2*BytesPerWord);
1172 
1173         Label done;
1174         Label runtime;
1175 
1176         // At this point we know new_value is non-NULL and the new_value crosses regions.
1177         // Must check to see if card is already dirty
1178 
1179         const Register thread = rthread;
1180 
1181         Address queue_index(thread, in_bytes(G1ThreadLocalData::dirty_card_queue_index_offset()));
1182         Address buffer(thread, in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset()));


< prev index next >