@@ -2171,6 +2171,19 @@ const bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect*
21712171 return false;
21722172}
21732173
2174+ // Return true if Vector::rearrange needs preparation of the shuffle argument
2175+ const bool Matcher::vector_needs_load_shuffle(BasicType elem_bt, int vlen) {
2176+ switch (elem_bt) {
2177+ case T_BYTE: return false;
2178+ case T_SHORT: return !VM_Version::supports_avx512bw();
2179+ case T_INT: return !VM_Version::supports_avx();
2180+ case T_LONG: return vlen < 8 && !VM_Version::supports_avx512vl();
2181+ default:
2182+ ShouldNotReachHere();
2183+ return false;
2184+ }
2185+ }
2186+
21742187MachOper* Matcher::pd_specialize_generic_vector_operand(MachOper* generic_opnd, uint ideal_reg, bool is_temp) {
21752188 assert(Matcher::is_generic_vector(generic_opnd), "not generic");
21762189 bool legacy = (generic_opnd->opcode() == LEGVEC);
@@ -8406,17 +8419,6 @@ instruct VectorPopulateLIndex(vec dst, rRegL src1, immI_1 src2, vec vtmp) %{
84068419//-------------------------------- Rearrange ----------------------------------
84078420
84088421// LoadShuffle/Rearrange for Byte
8409-
8410- instruct loadShuffleB(vec dst) %{
8411- predicate(Matcher::vector_element_basic_type(n) == T_BYTE);
8412- match(Set dst (VectorLoadShuffle dst));
8413- format %{ "vector_load_shuffle $dst, $dst" %}
8414- ins_encode %{
8415- // empty
8416- %}
8417- ins_pipe( pipe_slow );
8418- %}
8419-
84208422instruct rearrangeB(vec dst, vec shuffle) %{
84218423 predicate(Matcher::vector_element_basic_type(n) == T_BYTE &&
84228424 Matcher::vector_length(n) < 32);
@@ -8483,7 +8485,7 @@ instruct rearrangeB_evex_vbmi(vec dst, vec src, vec shuffle) %{
84838485
84848486instruct loadShuffleS(vec dst, vec src, vec vtmp) %{
84858487 predicate(Matcher::vector_element_basic_type(n) == T_SHORT &&
8486- Matcher::vector_length(n) <= 16 && !VM_Version::supports_avx512bw()); // NB! aligned with rearrangeS
8488+ !VM_Version::supports_avx512bw());
84878489 match(Set dst (VectorLoadShuffle src));
84888490 effect(TEMP dst, TEMP vtmp);
84898491 format %{ "vector_load_shuffle $dst, $src\t! using $vtmp as TEMP" %}
@@ -8494,7 +8496,7 @@ instruct loadShuffleS(vec dst, vec src, vec vtmp) %{
84948496 if (UseAVX == 0) {
84958497 assert(vlen_in_bytes <= 16, "required");
84968498 // Multiply each shuffle by two to get byte index
8497- __ pmovzxbw ($vtmp$$XMMRegister, $src$$XMMRegister);
8499+ __ movdqu ($vtmp$$XMMRegister, $src$$XMMRegister);
84988500 __ psllw($vtmp$$XMMRegister, 1);
84998501
85008502 // Duplicate to create 2 copies of byte index
@@ -8509,8 +8511,7 @@ instruct loadShuffleS(vec dst, vec src, vec vtmp) %{
85098511 assert(UseAVX > 1 || vlen_in_bytes <= 16, "required");
85108512 int vlen_enc = vector_length_encoding(this);
85118513 // Multiply each shuffle by two to get byte index
8512- __ vpmovzxbw($vtmp$$XMMRegister, $src$$XMMRegister, vlen_enc);
8513- __ vpsllw($vtmp$$XMMRegister, $vtmp$$XMMRegister, 1, vlen_enc);
8514+ __ vpsllw($vtmp$$XMMRegister, $src$$XMMRegister, 1, vlen_enc);
85148515
85158516 // Duplicate to create 2 copies of byte index
85168517 __ vpsllw($dst$$XMMRegister, $vtmp$$XMMRegister, 8, vlen_enc);
@@ -8557,21 +8558,6 @@ instruct rearrangeS_avx(legVec dst, legVec src, vec shuffle, legVec vtmp1, legVe
85578558 ins_pipe( pipe_slow );
85588559%}
85598560
8560- instruct loadShuffleS_evex(vec dst, vec src) %{
8561- predicate(Matcher::vector_element_basic_type(n) == T_SHORT &&
8562- VM_Version::supports_avx512bw());
8563- match(Set dst (VectorLoadShuffle src));
8564- format %{ "vector_load_shuffle $dst, $src" %}
8565- ins_encode %{
8566- int vlen_enc = vector_length_encoding(this);
8567- if (!VM_Version::supports_avx512vl()) {
8568- vlen_enc = Assembler::AVX_512bit;
8569- }
8570- __ vpmovzxbw($dst$$XMMRegister, $src$$XMMRegister, vlen_enc);
8571- %}
8572- ins_pipe( pipe_slow );
8573- %}
8574-
85758561instruct rearrangeS_evex(vec dst, vec src, vec shuffle) %{
85768562 predicate(Matcher::vector_element_basic_type(n) == T_SHORT &&
85778563 VM_Version::supports_avx512bw());
@@ -8602,7 +8588,7 @@ instruct loadShuffleI(vec dst, vec src, vec vtmp) %{
86028588 // only byte shuffle instruction available on these platforms
86038589
86048590 // Duplicate and multiply each shuffle by 4
8605- __ pmovzxbd ($vtmp$$XMMRegister, $src$$XMMRegister);
8591+ __ movdqu ($vtmp$$XMMRegister, $src$$XMMRegister);
86068592 __ pshuflw($vtmp$$XMMRegister, $vtmp$$XMMRegister, 0xA0);
86078593 __ pshufhw($vtmp$$XMMRegister, $vtmp$$XMMRegister, 0xA0);
86088594 __ psllw($vtmp$$XMMRegister, 2);
@@ -8631,18 +8617,6 @@ instruct rearrangeI(vec dst, vec shuffle) %{
86318617 ins_pipe( pipe_slow );
86328618%}
86338619
8634- instruct loadShuffleI_avx(vec dst, vec src) %{
8635- predicate((Matcher::vector_element_basic_type(n) == T_INT || Matcher::vector_element_basic_type(n) == T_FLOAT) &&
8636- UseAVX > 0);
8637- match(Set dst (VectorLoadShuffle src));
8638- format %{ "vector_load_shuffle $dst, $src" %}
8639- ins_encode %{
8640- int vlen_enc = vector_length_encoding(this);
8641- __ vpmovzxbd($dst$$XMMRegister, $src$$XMMRegister, vlen_enc);
8642- %}
8643- ins_pipe( pipe_slow );
8644- %}
8645-
86468620instruct rearrangeI_avx(vec dst, vec src, vec shuffle) %{
86478621 predicate((Matcher::vector_element_basic_type(n) == T_INT || Matcher::vector_element_basic_type(n) == T_FLOAT) &&
86488622 UseAVX > 0);
@@ -8672,8 +8646,7 @@ instruct loadShuffleL(vec dst, vec src, vec vtmp) %{
86728646 // only double word shuffle instruction available on these platforms
86738647
86748648 // Multiply each shuffle by two to get double word index
8675- __ vpmovzxbq($vtmp$$XMMRegister, $src$$XMMRegister, vlen_enc);
8676- __ vpsllq($vtmp$$XMMRegister, $vtmp$$XMMRegister, 1, vlen_enc);
8649+ __ vpsllq($vtmp$$XMMRegister, $src$$XMMRegister, 1, vlen_enc);
86778650
86788651 // Duplicate each double word shuffle
86798652 __ vpsllq($dst$$XMMRegister, $vtmp$$XMMRegister, 32, vlen_enc);
@@ -8699,20 +8672,6 @@ instruct rearrangeL(vec dst, vec src, vec shuffle) %{
86998672 ins_pipe( pipe_slow );
87008673%}
87018674
8702- instruct loadShuffleL_evex(vec dst, vec src) %{
8703- predicate(is_double_word_type(Matcher::vector_element_basic_type(n)) && // T_LONG, T_DOUBLE
8704- (Matcher::vector_length(n) == 8 || VM_Version::supports_avx512vl()));
8705- match(Set dst (VectorLoadShuffle src));
8706- format %{ "vector_load_shuffle $dst, $src" %}
8707- ins_encode %{
8708- assert(UseAVX > 2, "required");
8709-
8710- int vlen_enc = vector_length_encoding(this);
8711- __ vpmovzxbq($dst$$XMMRegister, $src$$XMMRegister, vlen_enc);
8712- %}
8713- ins_pipe( pipe_slow );
8714- %}
8715-
87168675instruct rearrangeL_evex(vec dst, vec src, vec shuffle) %{
87178676 predicate(is_double_word_type(Matcher::vector_element_basic_type(n)) && // T_LONG, T_DOUBLE
87188677 (Matcher::vector_length(n) == 8 || VM_Version::supports_avx512vl()));
0 commit comments