1150 // count - element count |
1150 // count - element count |
1151 // |
1151 // |
1152 // Destroy no registers! |
1152 // Destroy no registers! |
1153 // |
1153 // |
1154 void gen_write_ref_array_pre_barrier(Register addr, Register count) { |
1154 void gen_write_ref_array_pre_barrier(Register addr, Register count) { |
1155 #if 0 // G1 - only |
|
1156 assert_different_registers(addr, c_rarg1); |
|
1157 assert_different_registers(count, c_rarg0); |
|
1158 BarrierSet* bs = Universe::heap()->barrier_set(); |
1155 BarrierSet* bs = Universe::heap()->barrier_set(); |
1159 switch (bs->kind()) { |
1156 switch (bs->kind()) { |
1160 case BarrierSet::G1SATBCT: |
1157 case BarrierSet::G1SATBCT: |
1161 case BarrierSet::G1SATBCTLogging: |
1158 case BarrierSet::G1SATBCTLogging: |
1162 { |
1159 { |
1163 __ pushaq(); // push registers |
1160 __ pushaq(); // push registers |
1164 __ movq(c_rarg0, addr); |
1161 if (count == c_rarg0) { |
1165 __ movq(c_rarg1, count); |
1162 if (addr == c_rarg1) { |
1166 __ call(RuntimeAddress(BarrierSet::static_write_ref_array_pre)); |
1163 // exactly backwards!! |
|
1164 __ xchgq(c_rarg1, c_rarg0); |
|
1165 } else { |
|
1166 __ movq(c_rarg1, count); |
|
1167 __ movq(c_rarg0, addr); |
|
1168 } |
|
1169 |
|
1170 } else { |
|
1171 __ movq(c_rarg0, addr); |
|
1172 __ movq(c_rarg1, count); |
|
1173 } |
|
1174 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_pre))); |
1167 __ popaq(); |
1175 __ popaq(); |
1168 } |
1176 } |
1169 break; |
1177 break; |
1170 case BarrierSet::CardTableModRef: |
1178 case BarrierSet::CardTableModRef: |
1171 case BarrierSet::CardTableExtension: |
1179 case BarrierSet::CardTableExtension: |
1172 case BarrierSet::ModRef: |
1180 case BarrierSet::ModRef: |
1173 break; |
1181 break; |
1174 default : |
1182 default: |
1175 ShouldNotReachHere(); |
1183 ShouldNotReachHere(); |
1176 |
1184 |
1177 } |
1185 } |
1178 #endif // 0 G1 - only |
|
1179 } |
1186 } |
1180 |
1187 |
1181 // |
1188 // |
1182 // Generate code for an array write post barrier |
1189 // Generate code for an array write post barrier |
1183 // |
1190 // |
1190 // The ending address is inclusive. |
1197 // The ending address is inclusive. |
1191 void gen_write_ref_array_post_barrier(Register start, Register end, Register scratch) { |
1198 void gen_write_ref_array_post_barrier(Register start, Register end, Register scratch) { |
1192 assert_different_registers(start, end, scratch); |
1199 assert_different_registers(start, end, scratch); |
1193 BarrierSet* bs = Universe::heap()->barrier_set(); |
1200 BarrierSet* bs = Universe::heap()->barrier_set(); |
1194 switch (bs->kind()) { |
1201 switch (bs->kind()) { |
1195 #if 0 // G1 - only |
|
1196 case BarrierSet::G1SATBCT: |
1202 case BarrierSet::G1SATBCT: |
1197 case BarrierSet::G1SATBCTLogging: |
1203 case BarrierSet::G1SATBCTLogging: |
1198 |
1204 |
1199 { |
1205 { |
1200 __ pushaq(); // push registers (overkill) |
1206 __ pushaq(); // push registers (overkill) |
1203 __ leaq(scratch, Address(end, wordSize)); |
1209 __ leaq(scratch, Address(end, wordSize)); |
1204 __ subq(scratch, start); |
1210 __ subq(scratch, start); |
1205 __ shrq(scratch, LogBytesPerWord); |
1211 __ shrq(scratch, LogBytesPerWord); |
1206 __ movq(c_rarg0, start); |
1212 __ movq(c_rarg0, start); |
1207 __ movq(c_rarg1, scratch); |
1213 __ movq(c_rarg1, scratch); |
1208 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post)); |
1214 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, BarrierSet::static_write_ref_array_post))); |
1209 __ popaq(); |
1215 __ popaq(); |
1210 } |
1216 } |
1211 break; |
1217 break; |
1212 #endif // 0 G1 - only |
|
1213 case BarrierSet::CardTableModRef: |
1218 case BarrierSet::CardTableModRef: |
1214 case BarrierSet::CardTableExtension: |
1219 case BarrierSet::CardTableExtension: |
1215 { |
1220 { |
1216 CardTableModRefBS* ct = (CardTableModRefBS*)bs; |
1221 CardTableModRefBS* ct = (CardTableModRefBS*)bs; |
1217 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); |
1222 assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); |
1228 __ BIND(L_loop); |
1233 __ BIND(L_loop); |
1229 __ movb(Address(start, count, Address::times_1), 0); |
1234 __ movb(Address(start, count, Address::times_1), 0); |
1230 __ decrementq(count); |
1235 __ decrementq(count); |
1231 __ jcc(Assembler::greaterEqual, L_loop); |
1236 __ jcc(Assembler::greaterEqual, L_loop); |
1232 } |
1237 } |
1233 } |
1238 break; |
1234 } |
1239 default: |
|
1240 ShouldNotReachHere(); |
|
1241 |
|
1242 } |
|
1243 } |
1235 |
1244 |
1236 // Copy big chunks forward |
1245 // Copy big chunks forward |
1237 // |
1246 // |
1238 // Inputs: |
1247 // Inputs: |
1239 // end_from - source arrays end address |
1248 // end_from - source arrays end address |