1220 |
1220 |
1221 __ shrq(start, CardTableModRefBS::card_shift); |
1221 __ shrq(start, CardTableModRefBS::card_shift); |
1222 __ shrq(end, CardTableModRefBS::card_shift); |
1222 __ shrq(end, CardTableModRefBS::card_shift); |
1223 __ subq(end, start); // number of bytes to copy |
1223 __ subq(end, start); // number of bytes to copy |
1224 |
1224 |
|
1225 intptr_t disp = (intptr_t) ct->byte_map_base; |
|
1226 if (__ is_simm32(disp)) { |
|
1227 Address cardtable(noreg, noreg, Address::no_scale, disp); |
|
1228 __ lea(scratch, cardtable); |
|
1229 } else { |
|
1230 ExternalAddress cardtable((address)disp); |
|
1231 __ lea(scratch, cardtable); |
|
1232 } |
|
1233 |
1225 const Register count = end; // 'end' register contains bytes count now |
1234 const Register count = end; // 'end' register contains bytes count now |
1226 __ lea(scratch, ExternalAddress((address)ct->byte_map_base)); |
|
1227 __ addq(start, scratch); |
1235 __ addq(start, scratch); |
1228 __ BIND(L_loop); |
1236 __ BIND(L_loop); |
1229 __ movb(Address(start, count, Address::times_1), 0); |
1237 __ movb(Address(start, count, Address::times_1), 0); |
1230 __ decrementq(count); |
1238 __ decrementq(count); |
1231 __ jcc(Assembler::greaterEqual, L_loop); |
1239 __ jcc(Assembler::greaterEqual, L_loop); |