< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 55589 : 8221817: [vector] No suitable species for indexMap of Gather/Scatter VectorAPI
Reviewed-by: duke

@@ -7234,10 +7234,37 @@
 
   Node* index_vect = unbox_vector(argument(7), vbox_idx_type, T_INT, num_elem);
   if (index_vect == NULL) {
     return false;
   }
+
+  const TypeVect* index_src_type = index_vect->as_Vector()->vect_type();
+  const TypeVect* index_dst_type = TypeVect::make(T_INT, num_elem);
+
+  if (Type::cmp(index_src_type, index_dst_type) != 0) {
+    // For DoubleMaxVector and LongMaxVector, indexVector's length is twice.
+    assert((elem_bt == T_DOUBLE || elem_bt == T_LONG) &&
+           index_src_type->element_basic_type() == T_INT &&
+           index_src_type->length() == index_dst_type->length() * 2,
+           "Expect double the length");
+
+    // Check whether resizing is support.
+    if (!arch_supports_vector(Op_VectorReinterpret,
+                              index_src_type->length(),
+                              index_src_type->element_basic_type(),
+                              VecMaskNotUsed)) {
+      return false;
+    }
+    if (!arch_supports_vector(Op_VectorReinterpret,
+                              num_elem,
+                              T_INT,
+                              VecMaskNotUsed)) {
+      return false;
+    }
+    index_vect = gvn().transform(new VectorReinterpretNode(index_vect, index_src_type, index_dst_type));
+  }
+
   const TypeVect* vector_type = TypeVect::make(elem_bt, num_elem);
   if (is_scatter) {
     Node* val = unbox_vector(argument(8), vbox_type, elem_bt, num_elem);
     if (val == NULL) {
       return false; // operand unboxing failed
< prev index next >