Skip to content

Commit 571e6f3

Browse files
authored
Merge pull request #2 from nsjian/vector-conversion-fix
AArch64: Incorrect SVE double to int and float to long vector conversion
2 parents c9a7722 + 779ba7a commit 571e6f3

File tree

2 files changed

+36
-18
lines changed

2 files changed

+36
-18
lines changed

src/hotspot/cpu/aarch64/aarch64_sve.ad

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
%}

src/hotspot/cpu/aarch64/aarch64_sve_ad.m4

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2301,20 +2301,29 @@ instruct vcvtFtoX_narrow(vReg dst, vReg src, vReg tmp)
23012301
ins_pipe(pipe_slow);
23022302
%}
23032303

2304-
instruct vcvtFtoX_extend(vReg dst, vReg src)
2304+
instruct vcvtFtoI(vReg dst, vReg src)
23052305
%{
23062306
predicate(UseSVE > 0 &&
2307-
(n->bottom_type()->is_vect()->element_basic_type() == T_INT ||
2308-
n->bottom_type()->is_vect()->element_basic_type() == T_LONG));
2307+
(n->bottom_type()->is_vect()->element_basic_type() == T_INT));
23092308
match(Set dst (VectorCastF2X src));
23102309
ins_cost(SVE_COST);
2311-
format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to I/L vector" %}
2310+
format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to I vector" %}
23122311
ins_encode %{
2313-
BasicType to_bt = Matcher::vector_element_basic_type(this);
23142312
__ sve_fcvtzs(as_FloatRegister($dst$$reg), __ S, ptrue, as_FloatRegister($src$$reg), __ S);
2315-
if (to_bt == T_LONG) {
2316-
__ sve_vector_extend(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($dst$$reg), __ S);
2317-
}
2313+
%}
2314+
ins_pipe(pipe_slow);
2315+
%}
2316+
2317+
instruct vcvtFtoL(vReg dst, vReg src)
2318+
%{
2319+
predicate(UseSVE > 0 &&
2320+
(n->bottom_type()->is_vect()->element_basic_type() == T_LONG));
2321+
match(Set dst (VectorCastF2X src));
2322+
ins_cost(SVE_COST * 2);
2323+
format %{ "sve_vectorcast_f2x $dst, $src\t# convert F to L vector" %}
2324+
ins_encode %{
2325+
__ sve_sunpklo(as_FloatRegister($dst$$reg), __ D, as_FloatRegister($src$$reg));
2326+
__ sve_fcvtzs(as_FloatRegister($dst$$reg), __ D, ptrue, as_FloatRegister($dst$$reg), __ S);
23182327
%}
23192328
ins_pipe(pipe_slow);
23202329
%}
@@ -2346,7 +2355,7 @@ instruct vcvtDtoX_narrow(vReg dst, vReg src, vReg tmp)
23462355
ins_encode %{
23472356
BasicType to_bt = Matcher::vector_element_basic_type(this);
23482357
Assembler::SIMD_RegVariant to_size = __ elemType_to_regVariant(to_bt);
2349-
__ sve_fcvtzs(as_FloatRegister($dst$$reg), __ D, ptrue, as_FloatRegister($src$$reg), __ D);
2358+
__ sve_fcvtzs(as_FloatRegister($dst$$reg), __ S, ptrue, as_FloatRegister($src$$reg), __ D);
23502359
__ sve_vector_narrow(as_FloatRegister($dst$$reg), to_size,
23512360
as_FloatRegister($dst$$reg), __ D, as_FloatRegister($tmp$$reg));
23522361
%}

0 commit comments

Comments
 (0)