@@ -4795,12 +4795,11 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
47954795
47964796// ------------------------------ Vector Load Gather ---------------------------
47974797
4798- instruct gather_load(vReg dst, indirect mem, vReg idx) %{
4799- predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
4800- type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4798+ instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{
4799+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
48014800 match(Set dst (LoadVectorGather mem idx));
48024801 effect(TEMP_DEF dst);
4803- format %{ "gather_load $dst, $mem, $idx" %}
4802+ format %{ "gather_loadS $dst, $mem, $idx" %}
48044803 ins_encode %{
48054804 __ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
48064805 BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4813,12 +4812,28 @@ instruct gather_load(vReg dst, indirect mem, vReg idx) %{
48134812 ins_pipe(pipe_slow);
48144813%}
48154814
4816- instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4817- predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
4818- type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4815+ instruct gather_loadD(vReg dst, indirect mem, vReg idx) %{
4816+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4817+ match(Set dst (LoadVectorGather mem idx));
4818+ effect(TEMP_DEF dst);
4819+ format %{ "gather_loadD $dst, $mem, $idx" %}
4820+ ins_encode %{
4821+ BasicType bt = Matcher::vector_element_basic_type(this);
4822+ Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4823+ __ vsetvli_helper(bt, Matcher::vector_length(this));
4824+ __ vzext_vf2(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
4825+ __ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew);
4826+ __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
4827+ as_VectorRegister($dst$$reg));
4828+ %}
4829+ ins_pipe(pipe_slow);
4830+ %}
4831+
4832+ instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4833+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
48194834 match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
48204835 effect(TEMP_DEF dst, TEMP tmp);
4821- format %{ "gather_load_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
4836+ format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
48224837 ins_encode %{
48234838 __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48244839 BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4833,14 +4848,32 @@ instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vR
48334848 ins_pipe(pipe_slow);
48344849%}
48354850
4851+ instruct gather_loadD_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4852+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4853+ match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
4854+ effect(TEMP_DEF dst, TEMP tmp);
4855+ format %{ "gather_loadD_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
4856+ ins_encode %{
4857+ BasicType bt = Matcher::vector_element_basic_type(this);
4858+ Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4859+ __ vsetvli_helper(bt, Matcher::vector_length(this));
4860+ __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4861+ __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4862+ __ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg),
4863+ as_VectorRegister($dst$$reg));
4864+ __ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
4865+ as_VectorRegister($tmp$$reg), Assembler::v0_t);
4866+ %}
4867+ ins_pipe(pipe_slow);
4868+ %}
4869+
48364870// ------------------------------ Vector Store Scatter -------------------------
48374871
4838- instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
4839- predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
4840- type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4872+ instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{
4873+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
48414874 match(Set mem (StoreVectorScatter mem (Binary src idx)));
48424875 effect(TEMP tmp);
4843- format %{ "scatter_store $mem, $idx, $src\t# KILL $tmp" %}
4876+ format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
48444877 ins_encode %{
48454878 __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48464879 BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4853,12 +4886,28 @@ instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
48534886 ins_pipe(pipe_slow);
48544887%}
48554888
4856- instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4857- predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
4858- type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4889+ instruct scatter_storeD(indirect mem, vReg src, vReg idx, vReg tmp) %{
4890+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4891+ match(Set mem (StoreVectorScatter mem (Binary src idx)));
4892+ effect(TEMP tmp);
4893+ format %{ "scatter_storeD $mem, $idx, $src\t# KILL $tmp" %}
4894+ ins_encode %{
4895+ BasicType bt = Matcher::vector_element_basic_type(this, $src);
4896+ Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4897+ __ vsetvli_helper(bt, Matcher::vector_length(this, $src));
4898+ __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4899+ __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4900+ __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
4901+ as_VectorRegister($tmp$$reg));
4902+ %}
4903+ ins_pipe(pipe_slow);
4904+ %}
4905+
4906+ instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4907+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
48594908 match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
48604909 effect(TEMP tmp);
4861- format %{ "scatter_store_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
4910+ format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
48624911 ins_encode %{
48634912 __ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48644913 BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4871,6 +4920,23 @@ instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0,
48714920 ins_pipe(pipe_slow);
48724921%}
48734922
4923+ instruct scatter_storeD_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4924+ predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4925+ match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
4926+ effect(TEMP tmp);
4927+ format %{ "scatter_storeD_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
4928+ ins_encode %{
4929+ BasicType bt = Matcher::vector_element_basic_type(this, $src);
4930+ Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4931+ __ vsetvli_helper(bt, Matcher::vector_length(this, $src));
4932+ __ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4933+ __ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4934+ __ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
4935+ as_VectorRegister($tmp$$reg), Assembler::v0_t);
4936+ %}
4937+ ins_pipe(pipe_slow);
4938+ %}
4939+
48744940// ------------------------------ Populate Index to a Vector -------------------
48754941
48764942instruct populateindex(vReg dst, iRegIorL2I src1, iRegIorL2I src2, vReg tmp) %{
0 commit comments