@@ -6196,7 +6196,7 @@ instruct vshiftcnt(vec dst, rRegI cnt) %{
6196
6196
6197
6197
// Byte vector shift
6198
6198
instruct vshiftB(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6199
- predicate(Matcher::vector_length(n) <= 8 && VectorNode::is_vshift_cnt( n->in(2) ));
6199
+ predicate(Matcher::vector_length(n) <= 8 && ! n->as_ShiftV()->is_var_shift( ));
6200
6200
match(Set dst ( LShiftVB src shift));
6201
6201
match(Set dst ( RShiftVB src shift));
6202
6202
match(Set dst (URShiftVB src shift));
@@ -6216,7 +6216,7 @@ instruct vshiftB(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6216
6216
%}
6217
6217
6218
6218
instruct vshift16B(vec dst, vec src, vec shift, vec tmp1, vec tmp2, rRegI scratch) %{
6219
- predicate(Matcher::vector_length(n) == 16 && VectorNode::is_vshift_cnt( n->in(2) ) &&
6219
+ predicate(Matcher::vector_length(n) == 16 && ! n->as_ShiftV()->is_var_shift( ) &&
6220
6220
UseAVX <= 1);
6221
6221
match(Set dst ( LShiftVB src shift));
6222
6222
match(Set dst ( RShiftVB src shift));
@@ -6241,7 +6241,7 @@ instruct vshift16B(vec dst, vec src, vec shift, vec tmp1, vec tmp2, rRegI scratc
6241
6241
%}
6242
6242
6243
6243
instruct vshift16B_avx(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6244
- predicate(Matcher::vector_length(n) == 16 && VectorNode::is_vshift_cnt( n->in(2) ) &&
6244
+ predicate(Matcher::vector_length(n) == 16 && ! n->as_ShiftV()->is_var_shift( ) &&
6245
6245
UseAVX > 1);
6246
6246
match(Set dst ( LShiftVB src shift));
6247
6247
match(Set dst ( RShiftVB src shift));
@@ -6262,7 +6262,7 @@ instruct vshift16B_avx(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6262
6262
%}
6263
6263
6264
6264
instruct vshift32B_avx(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6265
- predicate(Matcher::vector_length(n) == 32 && VectorNode::is_vshift_cnt( n->in(2) ));
6265
+ predicate(Matcher::vector_length(n) == 32 && ! n->as_ShiftV()->is_var_shift( ));
6266
6266
match(Set dst ( LShiftVB src shift));
6267
6267
match(Set dst ( RShiftVB src shift));
6268
6268
match(Set dst (URShiftVB src shift));
@@ -6287,7 +6287,7 @@ instruct vshift32B_avx(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6287
6287
%}
6288
6288
6289
6289
instruct vshift64B_avx(vec dst, vec src, vec shift, vec tmp1, vec tmp2, rRegI scratch) %{
6290
- predicate(Matcher::vector_length(n) == 64 && VectorNode::is_vshift_cnt( n->in(2) ));
6290
+ predicate(Matcher::vector_length(n) == 64 && ! n->as_ShiftV()->is_var_shift( ));
6291
6291
match(Set dst ( LShiftVB src shift));
6292
6292
match(Set dst (RShiftVB src shift));
6293
6293
match(Set dst (URShiftVB src shift));
@@ -6320,7 +6320,7 @@ instruct vshift64B_avx(vec dst, vec src, vec shift, vec tmp1, vec tmp2, rRegI sc
6320
6320
// unsigned values.
6321
6321
// Shorts/Chars vector left shift
6322
6322
instruct vshiftS(vec dst, vec src, vec shift) %{
6323
- predicate(VectorNode::is_vshift_cnt( n->in(2) ));
6323
+ predicate(! n->as_ShiftV()->is_var_shift( ));
6324
6324
match(Set dst ( LShiftVS src shift));
6325
6325
match(Set dst ( RShiftVS src shift));
6326
6326
match(Set dst (URShiftVS src shift));
@@ -6351,7 +6351,7 @@ instruct vshiftS(vec dst, vec src, vec shift) %{
6351
6351
6352
6352
// Integers vector left shift
6353
6353
instruct vshiftI(vec dst, vec src, vec shift) %{
6354
- predicate(VectorNode::is_vshift_cnt( n->in(2) ));
6354
+ predicate(! n->as_ShiftV()->is_var_shift( ));
6355
6355
match(Set dst ( LShiftVI src shift));
6356
6356
match(Set dst ( RShiftVI src shift));
6357
6357
match(Set dst (URShiftVI src shift));
@@ -6405,7 +6405,7 @@ instruct vshiftI_imm(vec dst, vec src, immI8 shift) %{
6405
6405
6406
6406
// Longs vector shift
6407
6407
instruct vshiftL(vec dst, vec src, vec shift) %{
6408
- predicate(VectorNode::is_vshift_cnt( n->in(2) ));
6408
+ predicate(! n->as_ShiftV()->is_var_shift( ));
6409
6409
match(Set dst ( LShiftVL src shift));
6410
6410
match(Set dst (URShiftVL src shift));
6411
6411
effect(TEMP dst, USE src, USE shift);
@@ -6446,7 +6446,7 @@ instruct vshiftL_imm(vec dst, vec src, immI8 shift) %{
6446
6446
// -------------------ArithmeticRightShift -----------------------------------
6447
6447
// Long vector arithmetic right shift
6448
6448
instruct vshiftL_arith_reg(vec dst, vec src, vec shift, vec tmp, rRegI scratch) %{
6449
- predicate(VectorNode::is_vshift_cnt( n->in(2) ) && UseAVX <= 2);
6449
+ predicate(! n->as_ShiftV()->is_var_shift( ) && UseAVX <= 2);
6450
6450
match(Set dst (RShiftVL src shift));
6451
6451
effect(TEMP dst, TEMP tmp, TEMP scratch);
6452
6452
format %{ "vshiftq $dst,$src,$shift" %}
@@ -6475,7 +6475,7 @@ instruct vshiftL_arith_reg(vec dst, vec src, vec shift, vec tmp, rRegI scratch)
6475
6475
%}
6476
6476
6477
6477
instruct vshiftL_arith_reg_evex(vec dst, vec src, vec shift) %{
6478
- predicate(VectorNode::is_vshift_cnt( n->in(2) ) && UseAVX > 2);
6478
+ predicate(! n->as_ShiftV()->is_var_shift( ) && UseAVX > 2);
6479
6479
match(Set dst (RShiftVL src shift));
6480
6480
format %{ "vshiftq $dst,$src,$shift" %}
6481
6481
ins_encode %{
@@ -6489,7 +6489,7 @@ instruct vshiftL_arith_reg_evex(vec dst, vec src, vec shift) %{
6489
6489
// Byte variable shift
6490
6490
instruct vshift8B_var_nobw(vec dst, vec src, vec shift, vec vtmp, rRegP scratch) %{
6491
6491
predicate(Matcher::vector_length(n) <= 8 &&
6492
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6492
+ n->as_ShiftV()->is_var_shift( ) &&
6493
6493
!VM_Version::supports_avx512bw());
6494
6494
match(Set dst ( LShiftVB src shift));
6495
6495
match(Set dst ( RShiftVB src shift));
@@ -6509,7 +6509,7 @@ instruct vshift8B_var_nobw(vec dst, vec src, vec shift, vec vtmp, rRegP scratch)
6509
6509
6510
6510
instruct vshift16B_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, rRegP scratch) %{
6511
6511
predicate(Matcher::vector_length(n) == 16 &&
6512
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6512
+ n->as_ShiftV()->is_var_shift( ) &&
6513
6513
!VM_Version::supports_avx512bw());
6514
6514
match(Set dst ( LShiftVB src shift));
6515
6515
match(Set dst ( RShiftVB src shift));
@@ -6537,7 +6537,7 @@ instruct vshift16B_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, r
6537
6537
6538
6538
instruct vshift32B_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, vec vtmp3, vec vtmp4, rRegP scratch) %{
6539
6539
predicate(Matcher::vector_length(n) == 32 &&
6540
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6540
+ n->as_ShiftV()->is_var_shift( ) &&
6541
6541
!VM_Version::supports_avx512bw());
6542
6542
match(Set dst ( LShiftVB src shift));
6543
6543
match(Set dst ( RShiftVB src shift));
@@ -6573,7 +6573,7 @@ instruct vshift32B_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, v
6573
6573
6574
6574
instruct vshiftB_var_evex_bw(vec dst, vec src, vec shift, vec vtmp, rRegP scratch) %{
6575
6575
predicate(Matcher::vector_length(n) <= 32 &&
6576
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6576
+ n->as_ShiftV()->is_var_shift( ) &&
6577
6577
VM_Version::supports_avx512bw());
6578
6578
match(Set dst ( LShiftVB src shift));
6579
6579
match(Set dst ( RShiftVB src shift));
@@ -6592,7 +6592,7 @@ instruct vshiftB_var_evex_bw(vec dst, vec src, vec shift, vec vtmp, rRegP scratc
6592
6592
6593
6593
instruct vshift64B_var_evex_bw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, rRegP scratch) %{
6594
6594
predicate(Matcher::vector_length(n) == 64 &&
6595
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6595
+ n->as_ShiftV()->is_var_shift( ) &&
6596
6596
VM_Version::supports_avx512bw());
6597
6597
match(Set dst ( LShiftVB src shift));
6598
6598
match(Set dst ( RShiftVB src shift));
@@ -6616,7 +6616,7 @@ instruct vshift64B_var_evex_bw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2
6616
6616
// Short variable shift
6617
6617
instruct vshift8S_var_nobw(vec dst, vec src, vec shift, vec vtmp, rRegP scratch) %{
6618
6618
predicate(Matcher::vector_length(n) <= 8 &&
6619
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6619
+ n->as_ShiftV()->is_var_shift( ) &&
6620
6620
!VM_Version::supports_avx512bw());
6621
6621
match(Set dst ( LShiftVS src shift));
6622
6622
match(Set dst ( RShiftVS src shift));
@@ -6641,7 +6641,7 @@ instruct vshift8S_var_nobw(vec dst, vec src, vec shift, vec vtmp, rRegP scratch)
6641
6641
6642
6642
instruct vshift16S_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, rRegP scratch) %{
6643
6643
predicate(Matcher::vector_length(n) == 16 &&
6644
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6644
+ n->as_ShiftV()->is_var_shift( ) &&
6645
6645
!VM_Version::supports_avx512bw());
6646
6646
match(Set dst ( LShiftVS src shift));
6647
6647
match(Set dst ( RShiftVS src shift));
@@ -6676,7 +6676,7 @@ instruct vshift16S_var_nobw(vec dst, vec src, vec shift, vec vtmp1, vec vtmp2, r
6676
6676
%}
6677
6677
6678
6678
instruct vshift16S_var_evex_bw(vec dst, vec src, vec shift) %{
6679
- predicate(!VectorNode::is_vshift_cnt( n->in(2) ) &&
6679
+ predicate(n->as_ShiftV()->is_var_shift( ) &&
6680
6680
VM_Version::supports_avx512bw());
6681
6681
match(Set dst ( LShiftVS src shift));
6682
6682
match(Set dst ( RShiftVS src shift));
@@ -6697,7 +6697,7 @@ instruct vshift16S_var_evex_bw(vec dst, vec src, vec shift) %{
6697
6697
6698
6698
//Integer variable shift
6699
6699
instruct vshiftI_var(vec dst, vec src, vec shift) %{
6700
- predicate(!VectorNode::is_vshift_cnt( n->in(2) ));
6700
+ predicate(n->as_ShiftV()->is_var_shift( ));
6701
6701
match(Set dst ( LShiftVI src shift));
6702
6702
match(Set dst ( RShiftVI src shift));
6703
6703
match(Set dst (URShiftVI src shift));
@@ -6714,7 +6714,7 @@ instruct vshiftI_var(vec dst, vec src, vec shift) %{
6714
6714
6715
6715
//Long variable shift
6716
6716
instruct vshiftL_var(vec dst, vec src, vec shift) %{
6717
- predicate(!VectorNode::is_vshift_cnt( n->in(2) ));
6717
+ predicate(n->as_ShiftV()->is_var_shift( ));
6718
6718
match(Set dst ( LShiftVL src shift));
6719
6719
match(Set dst (URShiftVL src shift));
6720
6720
format %{ "vector_varshift_long $dst,$src,$shift\t!" %}
@@ -6731,7 +6731,7 @@ instruct vshiftL_var(vec dst, vec src, vec shift) %{
6731
6731
//Long variable right shift arithmetic
6732
6732
instruct vshiftL_arith_var(vec dst, vec src, vec shift, vec vtmp) %{
6733
6733
predicate(Matcher::vector_length(n) <= 4 &&
6734
- !VectorNode::is_vshift_cnt( n->in(2) ) &&
6734
+ n->as_ShiftV()->is_var_shift( ) &&
6735
6735
UseAVX == 2);
6736
6736
match(Set dst (RShiftVL src shift));
6737
6737
effect(TEMP dst, TEMP vtmp);
@@ -6746,7 +6746,7 @@ instruct vshiftL_arith_var(vec dst, vec src, vec shift, vec vtmp) %{
6746
6746
%}
6747
6747
6748
6748
instruct vshiftL_arith_var_evex(vec dst, vec src, vec shift) %{
6749
- predicate(!VectorNode::is_vshift_cnt( n->in(2) ) &&
6749
+ predicate(n->as_ShiftV()->is_var_shift( ) &&
6750
6750
UseAVX > 2);
6751
6751
match(Set dst (RShiftVL src shift));
6752
6752
format %{ "vector_varfshift_long $dst,$src,$shift\t!" %}
@@ -9033,6 +9033,7 @@ instruct vlshift_imm_masked(vec dst, immI8 shift, kReg mask) %{
9033
9033
%}
9034
9034
9035
9035
instruct vlshift_reg_masked(vec dst, vec src2, kReg mask) %{
9036
+ predicate(!n->as_ShiftV()->is_var_shift());
9036
9037
match(Set dst (LShiftVS (Binary dst src2) mask));
9037
9038
match(Set dst (LShiftVI (Binary dst src2) mask));
9038
9039
match(Set dst (LShiftVL (Binary dst src2) mask));
@@ -9041,9 +9042,24 @@ instruct vlshift_reg_masked(vec dst, vec src2, kReg mask) %{
9041
9042
int vlen_enc = vector_length_encoding(this);
9042
9043
BasicType bt = Matcher::vector_element_basic_type(this);
9043
9044
int opc = this->ideal_Opcode();
9044
- bool is_varshift = !VectorNode::is_vshift_cnt_opcode(in(2)->isa_Mach()->ideal_Opcode());
9045
9045
__ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9046
- $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, is_varshift);
9046
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, false);
9047
+ %}
9048
+ ins_pipe( pipe_slow );
9049
+ %}
9050
+
9051
+ instruct vlshiftv_reg_masked(vec dst, vec src2, kReg mask) %{
9052
+ predicate(n->as_ShiftV()->is_var_shift());
9053
+ match(Set dst (LShiftVS (Binary dst src2) mask));
9054
+ match(Set dst (LShiftVI (Binary dst src2) mask));
9055
+ match(Set dst (LShiftVL (Binary dst src2) mask));
9056
+ format %{ "vplshiftv_masked $dst, $dst, $src2, $mask\t! lshift masked operation" %}
9057
+ ins_encode %{
9058
+ int vlen_enc = vector_length_encoding(this);
9059
+ BasicType bt = Matcher::vector_element_basic_type(this);
9060
+ int opc = this->ideal_Opcode();
9061
+ __ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9062
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, true);
9047
9063
%}
9048
9064
ins_pipe( pipe_slow );
9049
9065
%}
@@ -9079,6 +9095,7 @@ instruct vrshift_imm_masked(vec dst, immI8 shift, kReg mask) %{
9079
9095
%}
9080
9096
9081
9097
instruct vrshift_reg_masked(vec dst, vec src2, kReg mask) %{
9098
+ predicate(!n->as_ShiftV()->is_var_shift());
9082
9099
match(Set dst (RShiftVS (Binary dst src2) mask));
9083
9100
match(Set dst (RShiftVI (Binary dst src2) mask));
9084
9101
match(Set dst (RShiftVL (Binary dst src2) mask));
@@ -9087,9 +9104,24 @@ instruct vrshift_reg_masked(vec dst, vec src2, kReg mask) %{
9087
9104
int vlen_enc = vector_length_encoding(this);
9088
9105
BasicType bt = Matcher::vector_element_basic_type(this);
9089
9106
int opc = this->ideal_Opcode();
9090
- bool is_varshift = !VectorNode::is_vshift_cnt_opcode(in(2)->isa_Mach()->ideal_Opcode());
9091
9107
__ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9092
- $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, is_varshift);
9108
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, false);
9109
+ %}
9110
+ ins_pipe( pipe_slow );
9111
+ %}
9112
+
9113
+ instruct vrshiftv_reg_masked(vec dst, vec src2, kReg mask) %{
9114
+ predicate(n->as_ShiftV()->is_var_shift());
9115
+ match(Set dst (RShiftVS (Binary dst src2) mask));
9116
+ match(Set dst (RShiftVI (Binary dst src2) mask));
9117
+ match(Set dst (RShiftVL (Binary dst src2) mask));
9118
+ format %{ "vprshiftv_masked $dst, $dst, $src2, $mask\t! rshift masked operation" %}
9119
+ ins_encode %{
9120
+ int vlen_enc = vector_length_encoding(this);
9121
+ BasicType bt = Matcher::vector_element_basic_type(this);
9122
+ int opc = this->ideal_Opcode();
9123
+ __ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9124
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, true);
9093
9125
%}
9094
9126
ins_pipe( pipe_slow );
9095
9127
%}
@@ -9125,6 +9157,7 @@ instruct vurshift_imm_masked(vec dst, immI8 shift, kReg mask) %{
9125
9157
%}
9126
9158
9127
9159
instruct vurshift_reg_masked(vec dst, vec src2, kReg mask) %{
9160
+ predicate(!n->as_ShiftV()->is_var_shift());
9128
9161
match(Set dst (URShiftVS (Binary dst src2) mask));
9129
9162
match(Set dst (URShiftVI (Binary dst src2) mask));
9130
9163
match(Set dst (URShiftVL (Binary dst src2) mask));
@@ -9133,9 +9166,24 @@ instruct vurshift_reg_masked(vec dst, vec src2, kReg mask) %{
9133
9166
int vlen_enc = vector_length_encoding(this);
9134
9167
BasicType bt = Matcher::vector_element_basic_type(this);
9135
9168
int opc = this->ideal_Opcode();
9136
- bool is_varshift = !VectorNode::is_vshift_cnt_opcode(in(2)->isa_Mach()->ideal_Opcode());
9137
9169
__ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9138
- $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, is_varshift);
9170
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, false);
9171
+ %}
9172
+ ins_pipe( pipe_slow );
9173
+ %}
9174
+
9175
+ instruct vurshiftv_reg_masked(vec dst, vec src2, kReg mask) %{
9176
+ predicate(n->as_ShiftV()->is_var_shift());
9177
+ match(Set dst (URShiftVS (Binary dst src2) mask));
9178
+ match(Set dst (URShiftVI (Binary dst src2) mask));
9179
+ match(Set dst (URShiftVL (Binary dst src2) mask));
9180
+ format %{ "vpurshiftv_masked $dst, $dst, $src2, $mask\t! urshift masked operation" %}
9181
+ ins_encode %{
9182
+ int vlen_enc = vector_length_encoding(this);
9183
+ BasicType bt = Matcher::vector_element_basic_type(this);
9184
+ int opc = this->ideal_Opcode();
9185
+ __ evmasked_op(opc, bt, $mask$$KRegister, $dst$$XMMRegister,
9186
+ $dst$$XMMRegister, $src2$$XMMRegister, true, vlen_enc, true);
9139
9187
%}
9140
9188
ins_pipe( pipe_slow );
9141
9189
%}
0 commit comments