@@ -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
1553915610instruct 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