@@ -2954,11 +2954,9 @@ instruct vmask_gen_I(vRegMask dst, iRegI src) %{
2954
2954
format %{ "vmask_gen_I $dst, $src" %}
2955
2955
ins_encode %{
2956
2956
BasicType bt = Matcher::vector_element_basic_type(this);
2957
- Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
2958
2957
__ vsetvli_helper(bt, Matcher::vector_length(this));
2959
- __ vmclr_m(as_VectorRegister($dst$$reg));
2960
- __ vsetvli(t0, $src$$Register, sew);
2961
- __ vmset_m(as_VectorRegister($dst$$reg));
2958
+ __ vid_v(as_VectorRegister($dst$$reg));
2959
+ __ vmsltu_vx(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), $src$$Register);
2962
2960
%}
2963
2961
ins_pipe(pipe_slow);
2964
2962
%}
@@ -2968,26 +2966,30 @@ instruct vmask_gen_L(vRegMask dst, iRegL src) %{
2968
2966
format %{ "vmask_gen_L $dst, $src" %}
2969
2967
ins_encode %{
2970
2968
BasicType bt = Matcher::vector_element_basic_type(this);
2971
- Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
2972
2969
__ vsetvli_helper(bt, Matcher::vector_length(this));
2973
- __ vmclr_m(as_VectorRegister($dst$$reg));
2974
- __ vsetvli(t0, $src$$Register, sew);
2975
- __ vmset_m(as_VectorRegister($dst$$reg));
2970
+ __ vid_v(as_VectorRegister($dst$$reg));
2971
+ __ vmsltu_vx(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), $src$$Register);
2976
2972
%}
2977
2973
ins_pipe(pipe_slow);
2978
2974
%}
2979
2975
2980
2976
instruct vmask_gen_imm(vRegMask dst, immL con) %{
2977
+ predicate(n->in(1)->get_long() <= 16 ||
2978
+ n->in(1)->get_long() == Matcher::vector_length(n));
2981
2979
match(Set dst (VectorMaskGen con));
2982
2980
format %{ "vmask_gen_imm $dst, $con" %}
2983
2981
ins_encode %{
2984
2982
BasicType bt = Matcher::vector_element_basic_type(this);
2985
- if ($con$$constant != Matcher::vector_length(this)) {
2986
- __ vsetvli_helper(bt, Matcher::vector_length(this));
2983
+ __ vsetvli_helper(bt, Matcher::vector_length(this));
2984
+ if ((uint)($con$$constant) == 0) {
2987
2985
__ vmclr_m(as_VectorRegister($dst$$reg));
2986
+ } else if ((uint)($con$$constant) == Matcher::vector_length(this)) {
2987
+ __ vmset_m(as_VectorRegister($dst$$reg));
2988
+ } else {
2989
+ assert((uint)($con$$constant) < Matcher::vector_length(this), "unsupported input lane_cnt");
2990
+ __ vid_v(as_VectorRegister($dst$$reg));
2991
+ __ vmsleu_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (uint)($con$$constant) - 1);
2988
2992
}
2989
- __ vsetvli_helper(bt, (uint)($con$$constant));
2990
- __ vmset_m(as_VectorRegister($dst$$reg));
2991
2993
%}
2992
2994
ins_pipe(pipe_slow);
2993
2995
%}
@@ -3551,18 +3553,16 @@ instruct extractD(fRegD dst, vReg src, immI idx, vReg tmp)
3551
3553
3552
3554
// ------------------------------ Compress/Expand Operations -------------------
3553
3555
3554
- instruct mcompress(vRegMask dst, vRegMask src, iRegLNoSp tmp) %{
3556
+ instruct mcompress(vRegMask dst, vRegMask src, vReg tmp) %{
3555
3557
match(Set dst (CompressM src));
3556
- effect(TEMP_DEF dst, TEMP tmp);
3558
+ effect(TEMP tmp);
3557
3559
format %{ "mcompress $dst, $src\t# KILL $tmp" %}
3558
3560
ins_encode %{
3559
3561
BasicType bt = Matcher::vector_element_basic_type(this);
3560
- Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
3561
3562
__ vsetvli_helper(bt, Matcher::vector_length(this));
3562
- __ vmclr_m(as_VectorRegister($dst$$reg));
3563
- __ vcpop_m($tmp$$Register, as_VectorRegister($src$$reg));
3564
- __ vsetvli(t0, $tmp$$Register, sew);
3565
- __ vmset_m(as_VectorRegister($dst$$reg));
3563
+ __ vid_v(as_VectorRegister($tmp$$reg));
3564
+ __ vcpop_m(t0, as_VectorRegister($src$$reg));
3565
+ __ vmsltu_vx(as_VectorRegister($dst$$reg), as_VectorRegister($tmp$$reg), t0);
3566
3566
%}
3567
3567
ins_pipe(pipe_slow);
3568
3568
%}
0 commit comments