6386 ins_encode %{
6387 __ movl($dst$$Register, $src$$Register);
6388 %}
6389 ins_pipe(ialu_reg_reg); // XXX
6390 %}
6391
6392 // Convert compressed oop into int for vectors alignment masking
6393 // in case of 32bit oops (heap < 4Gb).
6394 instruct convN2I(rRegI dst, rRegN src)
6395 %{
6396 predicate(Universe::narrow_oop_shift() == 0);
6397 match(Set dst (ConvL2I (CastP2X (DecodeN src))));
6398
6399 format %{ "movl $dst, $src\t# compressed ptr -> int" %}
6400 ins_encode %{
6401 __ movl($dst$$Register, $src$$Register);
6402 %}
6403 ins_pipe(ialu_reg_reg); // XXX
6404 %}
6405
6406 // Convert oop pointer into compressed form
6407 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
6408 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
6409 match(Set dst (EncodeP src));
6410 effect(KILL cr);
6411 format %{ "encode_heap_oop $dst,$src" %}
6412 ins_encode %{
6413 Register s = $src$$Register;
6414 Register d = $dst$$Register;
6415 if (s != d) {
6416 __ movq(d, s);
6417 }
6418 __ encode_heap_oop(d);
6419 %}
6420 ins_pipe(ialu_reg_long);
6421 %}
6422
6423 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
6424 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
6425 match(Set dst (EncodeP src));
|
6386 ins_encode %{
6387 __ movl($dst$$Register, $src$$Register);
6388 %}
6389 ins_pipe(ialu_reg_reg); // XXX
6390 %}
6391
6392 // Convert compressed oop into int for vectors alignment masking
6393 // in case of 32bit oops (heap < 4Gb).
6394 instruct convN2I(rRegI dst, rRegN src)
6395 %{
6396 predicate(Universe::narrow_oop_shift() == 0);
6397 match(Set dst (ConvL2I (CastP2X (DecodeN src))));
6398
6399 format %{ "movl $dst, $src\t# compressed ptr -> int" %}
6400 ins_encode %{
6401 __ movl($dst$$Register, $src$$Register);
6402 %}
6403 ins_pipe(ialu_reg_reg); // XXX
6404 %}
6405
6406 instruct shenandoahRB(rRegP dst, rRegP src, rFlagsReg cr) %{
6407 match(Set dst (ShenandoahReadBarrier src));
6408 effect(DEF dst, USE src);
6409 ins_cost(125); // XXX
6410 format %{ "shenandoah_rb $dst,$src" %}
6411 ins_encode %{
6412 Register s = $src$$Register;
6413 Register d = $dst$$Register;
6414 __ movptr(d, Address(s, -8));
6415 %}
6416 ins_pipe(ialu_reg_mem);
6417 %}
6418
6419 instruct shenandoahWB(rax_RegP dst, rdi_RegP src, rFlagsReg cr) %{
6420 match(Set dst (ShenandoahWriteBarrier src));
6421 effect(DEF dst, USE_KILL src, KILL cr);
6422 ins_cost(300); // XXX
6423 format %{ "shenandoah_wb $dst,$src" %}
6424 ins_encode %{
6425 Label done;
6426 Register s = $src$$Register;
6427 Register d = $dst$$Register;
6428 assert(s == rdi, "need rdi");
6429 assert(d == rax, "result in rax");
6430 Address evacuation_in_progress = Address(r15_thread, in_bytes(JavaThread::evacuation_in_progress_offset()));
6431 __ movptr(d, Address(s, -8));
6432 __ cmpb(evacuation_in_progress, 0);
6433 __ movptr(d, Address(s, -8));
6434 __ jcc(Assembler::equal, done);
6435 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::shenandoah_wb())));
6436 __ bind(done);
6437 %}
6438 ins_pipe(pipe_slow);
6439 %}
6440
6441 // Convert oop pointer into compressed form
6442 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
6443 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
6444 match(Set dst (EncodeP src));
6445 effect(KILL cr);
6446 format %{ "encode_heap_oop $dst,$src" %}
6447 ins_encode %{
6448 Register s = $src$$Register;
6449 Register d = $dst$$Register;
6450 if (s != d) {
6451 __ movq(d, s);
6452 }
6453 __ encode_heap_oop(d);
6454 %}
6455 ins_pipe(ialu_reg_long);
6456 %}
6457
6458 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
6459 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
6460 match(Set dst (EncodeP src));
|