Skip to content

Commit 9fb163d

Browse files
authored
Update (2023.09.19)
30718: Implement PopulateIndex 30721: Implement SignumF/D and SignumVF/D
1 parent 9044c55 commit 9fb163d

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

src/hotspot/cpu/loongarch/loongarch_64.ad

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9971,6 +9971,34 @@ instruct copySignD_reg(regD dst, regD src1, regD src2, immD_0 zero) %{
99719971
ins_pipe( fpu_arith );
99729972
%}
99739973

9974+
instruct signumF_reg(regF dst, regF src, regF zero, regF one, regF tmp) %{
9975+
match(Set dst (SignumF src (Binary zero one)));
9976+
effect(TEMP_DEF dst, TEMP tmp);
9977+
format %{ "signumF $dst, $src, $zero, $one\t# TEMP($tmp) @signumF_reg" %}
9978+
ins_encode %{
9979+
__ fcmp_clt_s(FCC0, $zero$$FloatRegister, $src$$FloatRegister);
9980+
__ fsel($dst$$FloatRegister, $src$$FloatRegister, $one$$FloatRegister, FCC0);
9981+
__ fcmp_clt_s(FCC0, $src$$FloatRegister, $zero$$FloatRegister);
9982+
__ fneg_s($tmp$$FloatRegister, $one$$FloatRegister);
9983+
__ fsel($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister, FCC0);
9984+
%}
9985+
ins_pipe( pipe_slow );
9986+
%}
9987+
9988+
instruct signumD_reg(regD dst, regD src, regD zero, regD one, regD tmp) %{
9989+
match(Set dst (SignumD src (Binary zero one)));
9990+
effect(TEMP_DEF dst, TEMP tmp);
9991+
format %{ "signumF $dst, $src, $zero, $one\t# TEMP($tmp) @signumD_reg" %}
9992+
ins_encode %{
9993+
__ fcmp_clt_d(FCC0, $zero$$FloatRegister, $src$$FloatRegister);
9994+
__ fsel($dst$$FloatRegister, $src$$FloatRegister, $one$$FloatRegister, FCC0);
9995+
__ fcmp_clt_d(FCC0, $src$$FloatRegister, $zero$$FloatRegister);
9996+
__ fneg_d($tmp$$FloatRegister, $one$$FloatRegister);
9997+
__ fsel($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister, FCC0);
9998+
%}
9999+
ins_pipe( pipe_slow );
10000+
%}
10001+
997410002
//----------------------------------Logical Instructions----------------------
997510003
//__________________________________Integer Logical Instructions-------------
997610004

@@ -15534,6 +15562,49 @@ instruct loadconV(vReg dst, immI_0 src) %{
1553415562
ins_pipe( pipe_slow );
1553515563
%}
1553615564

15565+
// ------------------------------ Populate Index to a Vector ------------------
15566+
15567+
instruct populateIndexV(vReg dst, mRegI src1, immI_1 src2) %{
15568+
match(Set dst (PopulateIndex src1 src2));
15569+
format %{ "(x)vpopulate_index $dst, $src1, $src2\t# @populateIndexV" %}
15570+
ins_encode %{
15571+
assert($src2$$constant == 1, "required");
15572+
BasicType bt = Matcher::vector_element_basic_type(this);
15573+
int offset = exact_log2(type2aelembytes(bt)) << 5;
15574+
__ li(AT, (long)(StubRoutines::la::vector_iota_indices() + offset));
15575+
if (Matcher::vector_length_in_bytes(this) > 16) {
15576+
__ xvld(fscratch, AT, (int)0);
15577+
switch (bt) {
15578+
case T_BYTE : __ xvreplgr2vr_b($dst$$FloatRegister, $src1$$Register);
15579+
__ xvadd_b($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15580+
case T_SHORT : __ xvreplgr2vr_h($dst$$FloatRegister, $src1$$Register);
15581+
__ xvadd_h($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15582+
case T_INT : __ xvreplgr2vr_w($dst$$FloatRegister, $src1$$Register);
15583+
__ xvadd_w($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15584+
case T_LONG : __ xvreplgr2vr_d($dst$$FloatRegister, $src1$$Register);
15585+
__ xvadd_d($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15586+
default:
15587+
ShouldNotReachHere();
15588+
}
15589+
} else {
15590+
__ vld(fscratch, AT, (int)0);
15591+
switch (bt) {
15592+
case T_BYTE : __ vreplgr2vr_b($dst$$FloatRegister, $src1$$Register);
15593+
__ vadd_b($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15594+
case T_SHORT : __ vreplgr2vr_h($dst$$FloatRegister, $src1$$Register);
15595+
__ vadd_h($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15596+
case T_INT : __ vreplgr2vr_w($dst$$FloatRegister, $src1$$Register);
15597+
__ vadd_w($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15598+
case T_LONG : __ vreplgr2vr_d($dst$$FloatRegister, $src1$$Register);
15599+
__ vadd_d($dst$$FloatRegister, $dst$$FloatRegister, fscratch); break;
15600+
default:
15601+
ShouldNotReachHere();
15602+
}
15603+
}
15604+
%}
15605+
ins_pipe( pipe_slow );
15606+
%}
15607+
1553715608
// ---------------------------- LOAD_SHUFFLE ----------------------------------
1553815609

1553915610
instruct loadShuffleVB(vReg dst) %{
@@ -15659,6 +15730,51 @@ instruct clzV(vReg dst, vReg src) %{
1565915730
ins_pipe( pipe_slow );
1566015731
%}
1566115732

15733+
// ------------------------------ Vector signum --------------------------------
15734+
15735+
instruct signumV(vReg dst, vReg src, vReg zero, vReg one, vReg tmp) %{
15736+
match(Set dst (SignumVF src (Binary zero one)));
15737+
match(Set dst (SignumVD src (Binary zero one)));
15738+
effect(TEMP_DEF dst, TEMP tmp);
15739+
format %{ "(x)vsignum $dst, $src, $zero, $one\t# TEMP($tmp) @signumV" %}
15740+
ins_encode %{
15741+
if (Matcher::vector_length_in_bytes(this) > 16) {
15742+
switch (Matcher::vector_element_basic_type(this, $src)) {
15743+
case T_FLOAT: __ xvfcmp_clt_s($dst$$FloatRegister, $zero$$FloatRegister, $src$$FloatRegister);
15744+
__ xvfcmp_clt_s($tmp$$FloatRegister, $src$$FloatRegister, $zero$$FloatRegister);
15745+
__ xvor_v($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister);
15746+
__ xvsrli_w($dst$$FloatRegister, $dst$$FloatRegister, 1);
15747+
break;
15748+
case T_DOUBLE: __ xvfcmp_clt_d($dst$$FloatRegister, $zero$$FloatRegister, $src$$FloatRegister);
15749+
__ xvfcmp_clt_d($tmp$$FloatRegister, $src$$FloatRegister, $zero$$FloatRegister);
15750+
__ xvor_v($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister);
15751+
__ xvsrli_d($dst$$FloatRegister, $dst$$FloatRegister, 1);
15752+
break;
15753+
default:
15754+
ShouldNotReachHere();
15755+
}
15756+
__ xvbitsel_v($dst$$FloatRegister, $src$$FloatRegister, $one$$FloatRegister, $dst$$FloatRegister);
15757+
} else {
15758+
switch (Matcher::vector_element_basic_type(this, $src)) {
15759+
case T_FLOAT: __ vfcmp_clt_s($dst$$FloatRegister, $zero$$FloatRegister, $src$$FloatRegister);
15760+
__ vfcmp_clt_s($tmp$$FloatRegister, $src$$FloatRegister, $zero$$FloatRegister);
15761+
__ vor_v($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister);
15762+
__ vsrli_w($dst$$FloatRegister, $dst$$FloatRegister, 1);
15763+
break;
15764+
case T_DOUBLE: __ vfcmp_clt_d($dst$$FloatRegister, $zero$$FloatRegister, $src$$FloatRegister);
15765+
__ vfcmp_clt_d($tmp$$FloatRegister, $src$$FloatRegister, $zero$$FloatRegister);
15766+
__ vor_v($dst$$FloatRegister, $dst$$FloatRegister, $tmp$$FloatRegister);
15767+
__ vsrli_d($dst$$FloatRegister, $dst$$FloatRegister, 1);
15768+
break;
15769+
default:
15770+
ShouldNotReachHere();
15771+
}
15772+
__ vbitsel_v($dst$$FloatRegister, $src$$FloatRegister, $one$$FloatRegister, $dst$$FloatRegister);
15773+
}
15774+
%}
15775+
ins_pipe(pipe_slow);
15776+
%}
15777+
1566215778

1566315779
//----------PEEPHOLE RULES-----------------------------------------------------
1566415780
// These must follow all instruction definitions as they use the names

0 commit comments

Comments
 (0)