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
|