10571 %} 10572 ins_pipe(pipe_slow); // XXX 10573 %} 10574 10575 instruct convD2F_reg_mem(regF dst, memory src) 10576 %{ 10577 match(Set dst (ConvD2F (LoadD src))); 10578 10579 format %{ "cvtsd2ss $dst, $src" %} 10580 ins_encode %{ 10581 __ cvtsd2ss ($dst$$XMMRegister, $src$$Address); 10582 %} 10583 ins_pipe(pipe_slow); // XXX 10584 %} 10585 10586 // XXX do mem variants 10587 instruct convF2I_reg_reg(rRegI dst, regF src, rFlagsReg cr) 10588 %{ 10589 match(Set dst (ConvF2I src)); 10590 effect(KILL cr); 10591 10592 format %{ "cvttss2sil $dst, $src\t# f2i\n\t" 10593 "cmpl $dst, #0x80000000\n\t" 10594 "jne,s done\n\t" 10595 "subq rsp, #8\n\t" 10596 "movss [rsp], $src\n\t" 10597 "call f2i_fixup\n\t" 10598 "popq $dst\n" 10599 "done: "%} 10600 ins_encode %{ 10601 Label done; 10602 __ cvttss2sil($dst$$Register, $src$$XMMRegister); 10603 __ cmpl($dst$$Register, 0x80000000); 10604 __ jccb(Assembler::notEqual, done); 10605 __ subptr(rsp, 8); 10606 __ movflt(Address(rsp, 0), $src$$XMMRegister); 10607 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::f2i_fixup()))); 10608 __ pop($dst$$Register); 10609 __ bind(done); 10610 %} 10611 ins_pipe(pipe_slow); 10612 %} 10613 10614 instruct convF2L_reg_reg(rRegL dst, regF src, rFlagsReg cr) 10615 %{ 10616 match(Set dst (ConvF2L src)); 10617 effect(KILL cr); 10618 10619 format %{ "cvttss2siq $dst, $src\t# f2l\n\t" 10620 "cmpq $dst, [0x8000000000000000]\n\t" 10621 "jne,s done\n\t" 10622 "subq rsp, #8\n\t" 10623 "movss [rsp], $src\n\t" 10624 "call f2l_fixup\n\t" 10625 "popq $dst\n" 10626 "done: "%} 10627 ins_encode %{ 10628 Label done; 10629 __ cvttss2siq($dst$$Register, $src$$XMMRegister); 10630 __ cmp64($dst$$Register, 10631 ExternalAddress((address) StubRoutines::x86::double_sign_flip())); 10632 __ jccb(Assembler::notEqual, done); 10633 __ subptr(rsp, 8); 10634 __ movflt(Address(rsp, 0), $src$$XMMRegister); 10635 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::f2l_fixup()))); 10636 __ pop($dst$$Register); 10637 __ bind(done); 10638 %} 10639 ins_pipe(pipe_slow); 10640 %} 10641 10642 instruct convD2I_reg_reg(rRegI dst, regD src, rFlagsReg cr) 10643 %{ 10644 match(Set dst (ConvD2I src)); 10645 effect(KILL cr); 10646 10647 format %{ "cvttsd2sil $dst, $src\t# d2i\n\t" 10648 "cmpl $dst, #0x80000000\n\t" 10649 "jne,s done\n\t" 10650 "subq rsp, #8\n\t" 10651 "movsd [rsp], $src\n\t" 10652 "call d2i_fixup\n\t" 10653 "popq $dst\n" 10654 "done: "%} 10655 ins_encode %{ 10656 Label done; 10657 __ cvttsd2sil($dst$$Register, $src$$XMMRegister); 10658 __ cmpl($dst$$Register, 0x80000000); 10659 __ jccb(Assembler::notEqual, done); 10660 __ subptr(rsp, 8); 10661 __ movdbl(Address(rsp, 0), $src$$XMMRegister); 10662 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::d2i_fixup()))); 10663 __ pop($dst$$Register); 10664 __ bind(done); 10665 %} 10666 ins_pipe(pipe_slow); 10667 %} 10668 10669 instruct convD2L_reg_reg(rRegL dst, regD src, rFlagsReg cr) 10670 %{ 10671 match(Set dst (ConvD2L src)); 10672 effect(KILL cr); 10673 10674 format %{ "cvttsd2siq $dst, $src\t# d2l\n\t" 10675 "cmpq $dst, [0x8000000000000000]\n\t" 10676 "jne,s done\n\t" 10677 "subq rsp, #8\n\t" 10678 "movsd [rsp], $src\n\t" 10679 "call d2l_fixup\n\t" 10680 "popq $dst\n" 10681 "done: "%} 10682 ins_encode %{ 10683 Label done; 10684 __ cvttsd2siq($dst$$Register, $src$$XMMRegister); 10685 __ cmp64($dst$$Register, 10686 ExternalAddress((address) StubRoutines::x86::double_sign_flip())); 10687 __ jccb(Assembler::notEqual, done); 10688 __ subptr(rsp, 8); 10689 __ movdbl(Address(rsp, 0), $src$$XMMRegister); 10690 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::d2l_fixup()))); 10691 __ pop($dst$$Register); 10692 __ bind(done); 10693 %} 10694 ins_pipe(pipe_slow); 10695 %} 10696 10697 instruct convI2F_reg_reg(regF dst, rRegI src) 10698 %{ 10699 predicate(!UseXmmI2F); 10700 match(Set dst (ConvI2F src)); 10701 10702 format %{ "cvtsi2ssl $dst, $src\t# i2f" %} 10703 ins_encode %{ 10704 __ cvtsi2ssl ($dst$$XMMRegister, $src$$Register); 10705 %} 10706 ins_pipe(pipe_slow); // XXX 10707 %} 10708 10709 instruct convI2F_reg_mem(regF dst, memory src) 10710 %{ 10711 match(Set dst (ConvI2F (LoadI src))); 10712 | 10571 %} 10572 ins_pipe(pipe_slow); // XXX 10573 %} 10574 10575 instruct convD2F_reg_mem(regF dst, memory src) 10576 %{ 10577 match(Set dst (ConvD2F (LoadD src))); 10578 10579 format %{ "cvtsd2ss $dst, $src" %} 10580 ins_encode %{ 10581 __ cvtsd2ss ($dst$$XMMRegister, $src$$Address); 10582 %} 10583 ins_pipe(pipe_slow); // XXX 10584 %} 10585 10586 // XXX do mem variants 10587 instruct convF2I_reg_reg(rRegI dst, regF src, rFlagsReg cr) 10588 %{ 10589 match(Set dst (ConvF2I src)); 10590 effect(KILL cr); 10591 format %{ "convert_f2i $dst,$src" %} 10592 ins_encode %{ 10593 __ convert_f2i($dst$$Register, $src$$XMMRegister); 10594 %} 10595 ins_pipe(pipe_slow); 10596 %} 10597 10598 instruct convF2L_reg_reg(rRegL dst, regF src, rFlagsReg cr) 10599 %{ 10600 match(Set dst (ConvF2L src)); 10601 effect(KILL cr); 10602 format %{ "convert_f2l $dst,$src"%} 10603 ins_encode %{ 10604 __ convert_f2l($dst$$Register, $src$$XMMRegister); 10605 %} 10606 ins_pipe(pipe_slow); 10607 %} 10608 10609 instruct convD2I_reg_reg(rRegI dst, regD src, rFlagsReg cr) 10610 %{ 10611 match(Set dst (ConvD2I src)); 10612 effect(KILL cr); 10613 format %{ "convert_d2i $dst,$src"%} 10614 ins_encode %{ 10615 __ convert_d2i($dst$$Register, $src$$XMMRegister); 10616 %} 10617 ins_pipe(pipe_slow); 10618 %} 10619 10620 instruct convD2L_reg_reg(rRegL dst, regD src, rFlagsReg cr) 10621 %{ 10622 match(Set dst (ConvD2L src)); 10623 effect(KILL cr); 10624 format %{ "convert_d2l $dst,$src"%} 10625 ins_encode %{ 10626 __ convert_d2l($dst$$Register, $src$$XMMRegister); 10627 %} 10628 ins_pipe(pipe_slow); 10629 %} 10630 10631 instruct convI2F_reg_reg(regF dst, rRegI src) 10632 %{ 10633 predicate(!UseXmmI2F); 10634 match(Set dst (ConvI2F src)); 10635 10636 format %{ "cvtsi2ssl $dst, $src\t# i2f" %} 10637 ins_encode %{ 10638 __ cvtsi2ssl ($dst$$XMMRegister, $src$$Register); 10639 %} 10640 ins_pipe(pipe_slow); // XXX 10641 %} 10642 10643 instruct convI2F_reg_mem(regF dst, memory src) 10644 %{ 10645 match(Set dst (ConvI2F (LoadI src))); 10646 |