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()));
|