< 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 >