@@ -18922,6 +18922,216 @@ instruct vsrl2L_imm(vecX dst, vecX src, immI shift) %{
18922
18922
ins_pipe(vshift128_imm);
18923
18923
%}
18924
18924
18925
+ instruct vsraa8B_imm(vecD dst, vecD src, immI shift) %{
18926
+ predicate(n->as_Vector()->length() == 8);
18927
+ match(Set dst (AddVB dst (RShiftVB src (RShiftCntV shift))));
18928
+ ins_cost(INSN_COST);
18929
+ format %{ "ssra $dst, $src, $shift\t# vector (8B)" %}
18930
+ ins_encode %{
18931
+ int sh = (int)$shift$$constant;
18932
+ if (sh >= 8) sh = 7;
18933
+ __ ssra(as_FloatRegister($dst$$reg), __ T8B,
18934
+ as_FloatRegister($src$$reg), sh);
18935
+ %}
18936
+ ins_pipe(vshift64_imm);
18937
+ %}
18938
+
18939
+ instruct vsraa16B_imm(vecX dst, vecX src, immI shift) %{
18940
+ predicate(n->as_Vector()->length() == 16);
18941
+ match(Set dst (AddVB dst (RShiftVB src (RShiftCntV shift))));
18942
+ ins_cost(INSN_COST);
18943
+ format %{ "ssra $dst, $src, $shift\t# vector (16B)" %}
18944
+ ins_encode %{
18945
+ int sh = (int)$shift$$constant;
18946
+ if (sh >= 8) sh = 7;
18947
+ __ ssra(as_FloatRegister($dst$$reg), __ T16B,
18948
+ as_FloatRegister($src$$reg), sh);
18949
+ %}
18950
+ ins_pipe(vshift128_imm);
18951
+ %}
18952
+
18953
+ instruct vsraa4S_imm(vecD dst, vecD src, immI shift) %{
18954
+ predicate(n->as_Vector()->length() == 4);
18955
+ match(Set dst (AddVS dst (RShiftVS src (RShiftCntV shift))));
18956
+ ins_cost(INSN_COST);
18957
+ format %{ "ssra $dst, $src, $shift\t# vector (4H)" %}
18958
+ ins_encode %{
18959
+ int sh = (int)$shift$$constant;
18960
+ if (sh >= 16) sh = 15;
18961
+ __ ssra(as_FloatRegister($dst$$reg), __ T4H,
18962
+ as_FloatRegister($src$$reg), sh);
18963
+ %}
18964
+ ins_pipe(vshift64_imm);
18965
+ %}
18966
+
18967
+ instruct vsraa8S_imm(vecX dst, vecX src, immI shift) %{
18968
+ predicate(n->as_Vector()->length() == 8);
18969
+ match(Set dst (AddVS dst (RShiftVS src (RShiftCntV shift))));
18970
+ ins_cost(INSN_COST);
18971
+ format %{ "ssra $dst, $src, $shift\t# vector (8H)" %}
18972
+ ins_encode %{
18973
+ int sh = (int)$shift$$constant;
18974
+ if (sh >= 16) sh = 15;
18975
+ __ ssra(as_FloatRegister($dst$$reg), __ T8H,
18976
+ as_FloatRegister($src$$reg), sh);
18977
+ %}
18978
+ ins_pipe(vshift128_imm);
18979
+ %}
18980
+
18981
+ instruct vsraa2I_imm(vecD dst, vecD src, immI shift) %{
18982
+ predicate(n->as_Vector()->length() == 2);
18983
+ match(Set dst (AddVI dst (RShiftVI src (RShiftCntV shift))));
18984
+ ins_cost(INSN_COST);
18985
+ format %{ "ssra $dst, $src, $shift\t# vector (2S)" %}
18986
+ ins_encode %{
18987
+ __ ssra(as_FloatRegister($dst$$reg), __ T2S,
18988
+ as_FloatRegister($src$$reg),
18989
+ (int)$shift$$constant);
18990
+ %}
18991
+ ins_pipe(vshift64_imm);
18992
+ %}
18993
+
18994
+ instruct vsraa4I_imm(vecX dst, vecX src, immI shift) %{
18995
+ predicate(n->as_Vector()->length() == 4);
18996
+ match(Set dst (AddVI dst (RShiftVI src (RShiftCntV shift))));
18997
+ ins_cost(INSN_COST);
18998
+ format %{ "ssra $dst, $src, $shift\t# vector (4S)" %}
18999
+ ins_encode %{
19000
+ __ ssra(as_FloatRegister($dst$$reg), __ T4S,
19001
+ as_FloatRegister($src$$reg),
19002
+ (int)$shift$$constant);
19003
+ %}
19004
+ ins_pipe(vshift128_imm);
19005
+ %}
19006
+
19007
+ instruct vsraa2L_imm(vecX dst, vecX src, immI shift) %{
19008
+ predicate(n->as_Vector()->length() == 2);
19009
+ match(Set dst (AddVL dst (RShiftVL src (RShiftCntV shift))));
19010
+ ins_cost(INSN_COST);
19011
+ format %{ "ssra $dst, $src, $shift\t# vector (2D)" %}
19012
+ ins_encode %{
19013
+ __ ssra(as_FloatRegister($dst$$reg), __ T2D,
19014
+ as_FloatRegister($src$$reg),
19015
+ (int)$shift$$constant);
19016
+ %}
19017
+ ins_pipe(vshift128_imm);
19018
+ %}
19019
+
19020
+ instruct vsrla8B_imm(vecD dst, vecD src, immI shift) %{
19021
+ predicate(n->as_Vector()->length() == 8);
19022
+ match(Set dst (AddVB dst (URShiftVB src (RShiftCntV shift))));
19023
+ ins_cost(INSN_COST);
19024
+ format %{ "usra $dst, $src, $shift\t# vector (8B)" %}
19025
+ ins_encode %{
19026
+ int sh = (int)$shift$$constant;
19027
+ if (sh >= 8) {
19028
+ __ eor(as_FloatRegister($src$$reg), __ T8B,
19029
+ as_FloatRegister($src$$reg),
19030
+ as_FloatRegister($src$$reg));
19031
+ } else {
19032
+ __ usra(as_FloatRegister($dst$$reg), __ T8B,
19033
+ as_FloatRegister($src$$reg), sh);
19034
+ }
19035
+ %}
19036
+ ins_pipe(vshift64_imm);
19037
+ %}
19038
+
19039
+ instruct vsrla16B_imm(vecX dst, vecX src, immI shift) %{
19040
+ predicate(n->as_Vector()->length() == 16);
19041
+ match(Set dst (AddVB dst (URShiftVB src (RShiftCntV shift))));
19042
+ ins_cost(INSN_COST);
19043
+ format %{ "usra $dst, $src, $shift\t# vector (16B)" %}
19044
+ ins_encode %{
19045
+ int sh = (int)$shift$$constant;
19046
+ if (sh >= 8) {
19047
+ __ eor(as_FloatRegister($src$$reg), __ T16B,
19048
+ as_FloatRegister($src$$reg),
19049
+ as_FloatRegister($src$$reg));
19050
+ } else {
19051
+ __ usra(as_FloatRegister($dst$$reg), __ T16B,
19052
+ as_FloatRegister($src$$reg), sh);
19053
+ }
19054
+ %}
19055
+ ins_pipe(vshift128_imm);
19056
+ %}
19057
+
19058
+ instruct vsrla4S_imm(vecD dst, vecD src, immI shift) %{
19059
+ predicate(n->as_Vector()->length() == 4);
19060
+ match(Set dst (AddVS dst (URShiftVS src (RShiftCntV shift))));
19061
+ ins_cost(INSN_COST);
19062
+ format %{ "usra $dst, $src, $shift\t# vector (4H)" %}
19063
+ ins_encode %{
19064
+ int sh = (int)$shift$$constant;
19065
+ if (sh >= 16) {
19066
+ __ eor(as_FloatRegister($src$$reg), __ T8B,
19067
+ as_FloatRegister($src$$reg),
19068
+ as_FloatRegister($src$$reg));
19069
+ } else {
19070
+ __ ushr(as_FloatRegister($dst$$reg), __ T4H,
19071
+ as_FloatRegister($src$$reg), sh);
19072
+ }
19073
+ %}
19074
+ ins_pipe(vshift64_imm);
19075
+ %}
19076
+
19077
+ instruct vsrla8S_imm(vecX dst, vecX src, immI shift) %{
19078
+ predicate(n->as_Vector()->length() == 8);
19079
+ match(Set dst (AddVS dst (URShiftVS src (RShiftCntV shift))));
19080
+ ins_cost(INSN_COST);
19081
+ format %{ "usra $dst, $src, $shift\t# vector (8H)" %}
19082
+ ins_encode %{
19083
+ int sh = (int)$shift$$constant;
19084
+ if (sh >= 16) {
19085
+ __ eor(as_FloatRegister($src$$reg), __ T16B,
19086
+ as_FloatRegister($src$$reg),
19087
+ as_FloatRegister($src$$reg));
19088
+ } else {
19089
+ __ usra(as_FloatRegister($dst$$reg), __ T8H,
19090
+ as_FloatRegister($src$$reg), sh);
19091
+ }
19092
+ %}
19093
+ ins_pipe(vshift128_imm);
19094
+ %}
19095
+
19096
+ instruct vsrla2I_imm(vecD dst, vecD src, immI shift) %{
19097
+ predicate(n->as_Vector()->length() == 2);
19098
+ match(Set dst (AddVI dst (URShiftVI src (RShiftCntV shift))));
19099
+ ins_cost(INSN_COST);
19100
+ format %{ "usra $dst, $src, $shift\t# vector (2S)" %}
19101
+ ins_encode %{
19102
+ __ usra(as_FloatRegister($dst$$reg), __ T2S,
19103
+ as_FloatRegister($src$$reg),
19104
+ (int)$shift$$constant);
19105
+ %}
19106
+ ins_pipe(vshift64_imm);
19107
+ %}
19108
+
19109
+ instruct vsrla4I_imm(vecX dst, vecX src, immI shift) %{
19110
+ predicate(n->as_Vector()->length() == 4);
19111
+ match(Set dst (AddVI dst (URShiftVI src (RShiftCntV shift))));
19112
+ ins_cost(INSN_COST);
19113
+ format %{ "usra $dst, $src, $shift\t# vector (4S)" %}
19114
+ ins_encode %{
19115
+ __ usra(as_FloatRegister($dst$$reg), __ T4S,
19116
+ as_FloatRegister($src$$reg),
19117
+ (int)$shift$$constant);
19118
+ %}
19119
+ ins_pipe(vshift128_imm);
19120
+ %}
19121
+
19122
+ instruct vsrla2L_imm(vecX dst, vecX src, immI shift) %{
19123
+ predicate(n->as_Vector()->length() == 2);
19124
+ match(Set dst (AddVL dst (URShiftVL src (RShiftCntV shift))));
19125
+ ins_cost(INSN_COST);
19126
+ format %{ "usra $dst, $src, $shift\t# vector (2D)" %}
19127
+ ins_encode %{
19128
+ __ usra(as_FloatRegister($dst$$reg), __ T2D,
19129
+ as_FloatRegister($src$$reg),
19130
+ (int)$shift$$constant);
19131
+ %}
19132
+ ins_pipe(vshift128_imm);
19133
+ %}
19134
+
18925
19135
instruct vmax2F(vecD dst, vecD src1, vecD src2)
18926
19136
%{
18927
19137
predicate(n->as_Vector()->length() == 2 && n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
0 commit comments