< prev index next >

src/hotspot/cpu/aarch64/gc/shared/barrierSetAssembler_aarch64.cpp

Print this page
rev 50637 : [mq]: JDK-8205336.patch
rev 50638 : [mq]: JDK-8205336-01.patch


 141   if (var_size_in_bytes == noreg) {
 142     __ lea(end, Address(obj, con_size_in_bytes));
 143   } else {
 144     __ lea(end, Address(obj, var_size_in_bytes));
 145   }
 146   __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
 147   __ cmp(end, rscratch1);
 148   __ br(Assembler::HI, slow_case);
 149 
 150   // update the tlab top pointer
 151   __ str(end, Address(rthread, JavaThread::tlab_top_offset()));
 152 
 153   // recover var_size_in_bytes if necessary
 154   if (var_size_in_bytes == end) {
 155     __ sub(var_size_in_bytes, var_size_in_bytes, obj);
 156   }
 157   // verify_tlab();
 158 }
 159 
 160 // Defines obj, preserves var_size_in_bytes
 161 void BarrierSetAssembler::eden_allocate(MacroAssembler* masm,Register thread, Register obj,
 162                                         Register var_size_in_bytes,
 163                                         int con_size_in_bytes,
 164                                         Register t1,
 165                                         Label& slow_case) {
 166   assert_different_registers(obj, var_size_in_bytes, t1);
 167   if (!Universe::heap()->supports_inline_contig_alloc()) {
 168     __ b(slow_case);
 169   } else {
 170     Register end = t1;
 171     Register heap_end = rscratch2;
 172     Label retry;
 173     __ bind(retry);
 174     {
 175       unsigned long offset;
 176       __ adrp(rscratch1, ExternalAddress((address) Universe::heap()->end_addr()), offset);
 177       __ ldr(heap_end, Address(rscratch1, offset));
 178     }
 179 
 180     ExternalAddress heap_top((address) Universe::heap()->top_addr());
 181 


 193     }
 194 
 195     // Adjust it my the size of our new object
 196     if (var_size_in_bytes == noreg) {
 197       __ lea(end, Address(obj, con_size_in_bytes));
 198     } else {
 199       __ lea(end, Address(obj, var_size_in_bytes));
 200     }
 201 
 202     // if end < obj then we wrapped around high memory
 203     __ cmp(end, obj);
 204     __ br(Assembler::LO, slow_case);
 205 
 206     __ cmp(end, heap_end);
 207     __ br(Assembler::HI, slow_case);
 208 
 209     // If heap_top hasn't been changed by some other thread, update it.
 210     __ stlxr(rscratch2, end, rscratch1);
 211     __ cbnzw(rscratch2, retry);
 212 
 213     incr_allocated_bytes(masm, thread, var_size_in_bytes, con_size_in_bytes, t1);
 214   }
 215 }
 216 
 217 void BarrierSetAssembler::incr_allocated_bytes(MacroAssembler* masm, Register thread,
 218                                                Register var_size_in_bytes,
 219                                                int con_size_in_bytes,
 220                                                Register t1) {
 221   if (!thread->is_valid()) {
 222     thread = rthread;
 223   }
 224   assert(t1->is_valid(), "need temp reg");
 225 
 226   __ ldr(t1, Address(thread, in_bytes(JavaThread::allocated_bytes_offset())));
 227   if (var_size_in_bytes->is_valid()) {
 228     __ add(t1, t1, var_size_in_bytes);
 229   } else {
 230     __ add(t1, t1, con_size_in_bytes);
 231   }
 232   __ str(t1, Address(thread, in_bytes(JavaThread::allocated_bytes_offset())));
 233 }
 234 


 141   if (var_size_in_bytes == noreg) {
 142     __ lea(end, Address(obj, con_size_in_bytes));
 143   } else {
 144     __ lea(end, Address(obj, var_size_in_bytes));
 145   }
 146   __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset()));
 147   __ cmp(end, rscratch1);
 148   __ br(Assembler::HI, slow_case);
 149 
 150   // update the tlab top pointer
 151   __ str(end, Address(rthread, JavaThread::tlab_top_offset()));
 152 
 153   // recover var_size_in_bytes if necessary
 154   if (var_size_in_bytes == end) {
 155     __ sub(var_size_in_bytes, var_size_in_bytes, obj);
 156   }
 157   // verify_tlab();
 158 }
 159 
 160 // Defines obj, preserves var_size_in_bytes
 161 void BarrierSetAssembler::eden_allocate(MacroAssembler* masm, Register obj,
 162                                         Register var_size_in_bytes,
 163                                         int con_size_in_bytes,
 164                                         Register t1,
 165                                         Label& slow_case) {
 166   assert_different_registers(obj, var_size_in_bytes, t1);
 167   if (!Universe::heap()->supports_inline_contig_alloc()) {
 168     __ b(slow_case);
 169   } else {
 170     Register end = t1;
 171     Register heap_end = rscratch2;
 172     Label retry;
 173     __ bind(retry);
 174     {
 175       unsigned long offset;
 176       __ adrp(rscratch1, ExternalAddress((address) Universe::heap()->end_addr()), offset);
 177       __ ldr(heap_end, Address(rscratch1, offset));
 178     }
 179 
 180     ExternalAddress heap_top((address) Universe::heap()->top_addr());
 181 


 193     }
 194 
 195     // Adjust it my the size of our new object
 196     if (var_size_in_bytes == noreg) {
 197       __ lea(end, Address(obj, con_size_in_bytes));
 198     } else {
 199       __ lea(end, Address(obj, var_size_in_bytes));
 200     }
 201 
 202     // if end < obj then we wrapped around high memory
 203     __ cmp(end, obj);
 204     __ br(Assembler::LO, slow_case);
 205 
 206     __ cmp(end, heap_end);
 207     __ br(Assembler::HI, slow_case);
 208 
 209     // If heap_top hasn't been changed by some other thread, update it.
 210     __ stlxr(rscratch2, end, rscratch1);
 211     __ cbnzw(rscratch2, retry);
 212 
 213     incr_allocated_bytes(masm, var_size_in_bytes, con_size_in_bytes, t1);
 214   }
 215 }
 216 
 217 void BarrierSetAssembler::incr_allocated_bytes(MacroAssembler* masm,
 218                                                Register var_size_in_bytes,
 219                                                int con_size_in_bytes,
 220                                                Register t1) {



 221   assert(t1->is_valid(), "need temp reg");
 222 
 223   __ ldr(t1, Address(rthread, in_bytes(JavaThread::allocated_bytes_offset())));
 224   if (var_size_in_bytes->is_valid()) {
 225     __ add(t1, t1, var_size_in_bytes);
 226   } else {
 227     __ add(t1, t1, con_size_in_bytes);
 228   }
 229   __ str(t1, Address(rthread, in_bytes(JavaThread::allocated_bytes_offset())));
 230 }
 231 
< prev index next >