@@ -4550,20 +4550,29 @@ instruct vcvtFtoX_narrow(vReg dst, vReg src, vReg tmp)
45504550 ins_pipe(pipe_slow);
45514551%}
45524552
4553- instruct vcvtFtoX_extend (vReg dst, vReg src)
4553+ instruct vcvtFtoI (vReg dst, vReg src)
45544554%{
45554555 predicate(UseSVE > 0 &&
4556- (n->bottom_type()->is_vect()->element_basic_type() == T_INT ||
4557- n->bottom_type()->is_vect()->element_basic_type() == T_LONG));
4556+ (n->bottom_type()->is_vect()->element_basic_type() == T_INT));
45584557 match(Set dst (VectorCastF2X src));
45594558 ins_cost(SVE_COST);
4560- format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to I/L vector" %}
4559+ format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to I vector" %}
45614560 ins_encode %{
4562- BasicType to_bt = Matcher::vector_element_basic_type(this);
45634561 __ sve_fcvtzs(as_FloatRegister($dst$$reg), __ S, ptrue, as_FloatRegister($src$$reg), __ S);
4564- if (to_bt == T_LONG) {
4565- __ sve_vector_extend(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($dst$$reg), __ S);
4566- }
4562+ %}
4563+ ins_pipe(pipe_slow);
4564+ %}
4565+
4566+ instruct vcvtFtoL(vReg dst, vReg src)
4567+ %{
4568+ predicate(UseSVE > 0 &&
4569+ (n->bottom_type()->is_vect()->element_basic_type() == T_LONG));
4570+ match(Set dst (VectorCastF2X src));
4571+ ins_cost(SVE_COST * 2);
4572+ format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to L vector" %}
4573+ ins_encode %{
4574+ __ sve_sunpklo(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($src$$reg));
4575+ __ sve_fcvtzs(as_FloatRegister($dst$$reg), __ D, ptrue, as_FloatRegister($dst$$reg), __ S);
45674576 %}
45684577 ins_pipe(pipe_slow);
45694578%}
@@ -4595,7 +4604,7 @@ instruct vcvtDtoX_narrow(vReg dst, vReg src, vReg tmp)
45954604 ins_encode %{
45964605 BasicType to_bt = Matcher::vector_element_basic_type(this);
45974606 Assembler::SIMD_RegVariant to_size = __ elemType_to_regVariant(to_bt);
4598- __ sve_fcvtzs(as_FloatRegister($dst$$reg), __ D , ptrue, as_FloatRegister($src$$reg), __ D);
4607+ __ sve_fcvtzs(as_FloatRegister($dst$$reg), __ S , ptrue, as_FloatRegister($src$$reg), __ D);
45994608 __ sve_vector_narrow(as_FloatRegister($dst$$reg), to_size,
46004609 as_FloatRegister($dst$$reg), __ D, as_FloatRegister($tmp$$reg));
46014610 %}
0 commit comments