9402 ins_cost(INSN_COST); 9403 format %{ "mov dst, $src\t# compressed ptr -> int" %} 9404 ins_encode %{ 9405 __ movw($dst$$Register, $src$$Register); 9406 %} 9407 9408 ins_pipe(ialu_reg); 9409 %} 9410 9411 instruct shenandoahRB(iRegPNoSp dst, iRegP src, rFlagsReg cr) %{ 9412 match(Set dst (ShenandoahReadBarrier src)); 9413 format %{ "shenandoah_rb $dst,$src" %} 9414 ins_encode %{ 9415 Register s = $src$$Register; 9416 Register d = $dst$$Register; 9417 __ ldr(d, Address(s, BrooksPointer::byte_offset())); 9418 %} 9419 ins_pipe(pipe_class_memory); 9420 %} 9421 9422 instruct shenandoahWB(iRegP_R0 dst, iRegP src, rFlagsReg cr) %{ 9423 match(Set dst (ShenandoahWriteBarrier src)); 9424 effect(KILL cr); 9425 9426 format %{ "shenandoah_wb $dst,$src" %} 9427 ins_encode %{ 9428 #if INCLUDE_SHENANDOAHGC 9429 Label done; 9430 Register s = $src$$Register; 9431 Register d = $dst$$Register; 9432 assert(d == r0, "result in r0"); 9433 __ block_comment("Shenandoah write barrier {"); 9434 // We need that first read barrier in order to trigger a SEGV/NPE on incoming NULL. 9435 // Also, it brings s into d in preparation for the call to shenandoah_write_barrier(). 9436 __ ldr(d, Address(s, BrooksPointer::byte_offset())); 9437 __ shenandoah_write_barrier(d); 9438 __ block_comment("} Shenandoah write barrier"); 9439 #else 9440 ShouldNotReachHere(); 9441 #endif 9442 %} 9443 ins_pipe(pipe_slow); 9444 %} 9445 9446 9447 // Convert oop pointer into compressed form 9448 instruct encodeHeapOop(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{ 9449 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); 9450 match(Set dst (EncodeP src)); 9451 effect(KILL cr); 9452 ins_cost(INSN_COST * 3); 9453 format %{ "encode_heap_oop $dst, $src" %} 9454 ins_encode %{ 9455 Register s = $src$$Register; 9456 Register d = $dst$$Register; 9457 __ encode_heap_oop(d, s); 9458 %} 9459 ins_pipe(ialu_reg); 9460 %} 9461 9462 instruct encodeHeapOop_not_null(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{ 9463 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); 9464 match(Set dst (EncodeP src)); 9465 ins_cost(INSN_COST * 3); | 9402 ins_cost(INSN_COST); 9403 format %{ "mov dst, $src\t# compressed ptr -> int" %} 9404 ins_encode %{ 9405 __ movw($dst$$Register, $src$$Register); 9406 %} 9407 9408 ins_pipe(ialu_reg); 9409 %} 9410 9411 instruct shenandoahRB(iRegPNoSp dst, iRegP src, rFlagsReg cr) %{ 9412 match(Set dst (ShenandoahReadBarrier src)); 9413 format %{ "shenandoah_rb $dst,$src" %} 9414 ins_encode %{ 9415 Register s = $src$$Register; 9416 Register d = $dst$$Register; 9417 __ ldr(d, Address(s, BrooksPointer::byte_offset())); 9418 %} 9419 ins_pipe(pipe_class_memory); 9420 %} 9421 9422 9423 // Convert oop pointer into compressed form 9424 instruct encodeHeapOop(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{ 9425 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); 9426 match(Set dst (EncodeP src)); 9427 effect(KILL cr); 9428 ins_cost(INSN_COST * 3); 9429 format %{ "encode_heap_oop $dst, $src" %} 9430 ins_encode %{ 9431 Register s = $src$$Register; 9432 Register d = $dst$$Register; 9433 __ encode_heap_oop(d, s); 9434 %} 9435 ins_pipe(ialu_reg); 9436 %} 9437 9438 instruct encodeHeapOop_not_null(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{ 9439 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull); 9440 match(Set dst (EncodeP src)); 9441 ins_cost(INSN_COST * 3); |