@@ -4795,12 +4795,11 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
4795
4795
4796
4796
// ------------------------------ Vector Load Gather ---------------------------
4797
4797
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);
4801
4800
match(Set dst (LoadVectorGather mem idx));
4802
4801
effect(TEMP_DEF dst);
4803
- format %{ "gather_load $dst, $mem, $idx" %}
4802
+ format %{ "gather_loadS $dst, $mem, $idx" %}
4804
4803
ins_encode %{
4805
4804
__ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
4806
4805
BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4813,12 +4812,28 @@ instruct gather_load(vReg dst, indirect mem, vReg idx) %{
4813
4812
ins_pipe(pipe_slow);
4814
4813
%}
4815
4814
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);
4819
4834
match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
4820
4835
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" %}
4822
4837
ins_encode %{
4823
4838
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4824
4839
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
4833
4848
ins_pipe(pipe_slow);
4834
4849
%}
4835
4850
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
+
4836
4870
// ------------------------------ Vector Store Scatter -------------------------
4837
4871
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);
4841
4874
match(Set mem (StoreVectorScatter mem (Binary src idx)));
4842
4875
effect(TEMP tmp);
4843
- format %{ "scatter_store $mem, $idx, $src\t# KILL $tmp" %}
4876
+ format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
4844
4877
ins_encode %{
4845
4878
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4846
4879
BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4853,12 +4886,28 @@ instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
4853
4886
ins_pipe(pipe_slow);
4854
4887
%}
4855
4888
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);
4859
4908
match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
4860
4909
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" %}
4862
4911
ins_encode %{
4863
4912
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4864
4913
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,
4871
4920
ins_pipe(pipe_slow);
4872
4921
%}
4873
4922
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
+
4874
4940
// ------------------------------ Populate Index to a Vector -------------------
4875
4941
4876
4942
instruct populateindex(vReg dst, iRegIorL2I src1, iRegIorL2I src2, vReg tmp) %{
0 commit comments