438 } else { 439 __ add(var_size_in_bytes, var_size_in_bytes, BrooksPointer::byte_size()); 440 __ lea(end, Address(obj, var_size_in_bytes)); 441 } 442 __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset())); 443 __ cmp(end, rscratch1); 444 __ br(Assembler::HI, slow_case); 445 446 // update the tlab top pointer 447 __ str(end, Address(rthread, JavaThread::tlab_top_offset())); 448 449 __ add(obj, obj, BrooksPointer::byte_size()); 450 __ str(obj, Address(obj, BrooksPointer::byte_offset())); 451 452 // recover var_size_in_bytes if necessary 453 if (var_size_in_bytes == end) { 454 __ sub(var_size_in_bytes, var_size_in_bytes, obj); 455 } 456 } 457 458 void ShenandoahBarrierSetAssembler::resolve_for_read(MacroAssembler* masm, DecoratorSet decorators, Register obj) { 459 bool oop_not_null = (decorators & IS_NOT_NULL) != 0; 460 if (oop_not_null) { 461 read_barrier_not_null(masm, obj); 462 } else { 463 read_barrier(masm, obj); 464 } 465 } 466 467 void ShenandoahBarrierSetAssembler::resolve_for_write(MacroAssembler* masm, DecoratorSet decorators, Register obj) { 468 bool oop_not_null = (decorators & IS_NOT_NULL) != 0; 469 if (oop_not_null) { 470 write_barrier(masm, obj); 471 } else { 472 Label is_null; 473 __ cbz(obj, is_null); 474 write_barrier(masm, obj); 475 __ bind(is_null); 476 } 477 } 478 479 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val, 480 bool acquire, bool release, bool weak, bool encode, 481 Register tmp1, Register tmp2, Register tmp3, 482 Register result) { 483 484 if (encode) { 485 storeval_barrier(masm, new_val, tmp3); 486 } 487 488 if (UseCompressedOops) { 489 if (encode) { 490 __ encode_heap_oop(tmp1, expected); 491 expected = tmp1; 492 __ encode_heap_oop(tmp2, new_val); 493 new_val = tmp2; 494 } 495 } 496 bool is_cae = (result != noreg); 497 bool is_narrow = UseCompressedOops; 498 Assembler::operand_size size = is_narrow ? Assembler::word : Assembler::xword; | 438 } else { 439 __ add(var_size_in_bytes, var_size_in_bytes, BrooksPointer::byte_size()); 440 __ lea(end, Address(obj, var_size_in_bytes)); 441 } 442 __ ldr(rscratch1, Address(rthread, JavaThread::tlab_end_offset())); 443 __ cmp(end, rscratch1); 444 __ br(Assembler::HI, slow_case); 445 446 // update the tlab top pointer 447 __ str(end, Address(rthread, JavaThread::tlab_top_offset())); 448 449 __ add(obj, obj, BrooksPointer::byte_size()); 450 __ str(obj, Address(obj, BrooksPointer::byte_offset())); 451 452 // recover var_size_in_bytes if necessary 453 if (var_size_in_bytes == end) { 454 __ sub(var_size_in_bytes, var_size_in_bytes, obj); 455 } 456 } 457 458 void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val, 459 bool acquire, bool release, bool weak, bool encode, 460 Register tmp1, Register tmp2, Register tmp3, 461 Register result) { 462 463 if (encode) { 464 storeval_barrier(masm, new_val, tmp3); 465 } 466 467 if (UseCompressedOops) { 468 if (encode) { 469 __ encode_heap_oop(tmp1, expected); 470 expected = tmp1; 471 __ encode_heap_oop(tmp2, new_val); 472 new_val = tmp2; 473 } 474 } 475 bool is_cae = (result != noreg); 476 bool is_narrow = UseCompressedOops; 477 Assembler::operand_size size = is_narrow ? Assembler::word : Assembler::xword; |