< 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


7219 
7220   // The array must be consistent with vector type
7221   if (arr_type == NULL || (arr_type != NULL && elem_bt != arr_type->elem()->array_element_basic_type())) {
7222     return false;
7223   }
7224   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
7225   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
7226 
7227   ciKlass* vbox_idx_klass = vector_idx_klass->const_oop()->as_instance()->java_lang_Class_klass();
7228 
7229   if (vbox_idx_klass == NULL) {
7230     return false;
7231   }
7232 
7233   const TypeInstPtr* vbox_idx_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_idx_klass);
7234 
7235   Node* index_vect = unbox_vector(argument(7), vbox_idx_type, T_INT, num_elem);
7236   if (index_vect == NULL) {
7237     return false;
7238   }



























7239   const TypeVect* vector_type = TypeVect::make(elem_bt, num_elem);
7240   if (is_scatter) {
7241     Node* val = unbox_vector(argument(8), vbox_type, elem_bt, num_elem);
7242     if (val == NULL) {
7243       return false; // operand unboxing failed
7244     }
7245     set_all_memory(reset_memory());
7246 
7247     Node* vstore = gvn().transform(new StoreVectorScatterNode(control(), memory(addr), addr, addr_type, val, index_vect));
7248     set_memory(vstore, addr_type);
7249     set_vector_result(vstore, false);
7250  } else {
7251     Node* vload = gvn().transform(new LoadVectorGatherNode(control(), memory(addr), addr, addr_type, vector_type, index_vect));
7252 
7253     Node* box = box_vector(vload, vbox_type, elem_bt, num_elem);
7254     set_vector_result(box);
7255   }
7256 
7257   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
7258   return true;




7219 
7220   // The array must be consistent with vector type
7221   if (arr_type == NULL || (arr_type != NULL && elem_bt != arr_type->elem()->array_element_basic_type())) {
7222     return false;
7223   }
7224   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
7225   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
7226 
7227   ciKlass* vbox_idx_klass = vector_idx_klass->const_oop()->as_instance()->java_lang_Class_klass();
7228 
7229   if (vbox_idx_klass == NULL) {
7230     return false;
7231   }
7232 
7233   const TypeInstPtr* vbox_idx_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_idx_klass);
7234 
7235   Node* index_vect = unbox_vector(argument(7), vbox_idx_type, T_INT, num_elem);
7236   if (index_vect == NULL) {
7237     return false;
7238   }
7239 
7240   const TypeVect* index_src_type = index_vect->as_Vector()->vect_type();
7241   const TypeVect* index_dst_type = TypeVect::make(T_INT, num_elem);
7242 
7243   if (Type::cmp(index_src_type, index_dst_type) != 0) {
7244     // For DoubleMaxVector and LongMaxVector, indexVector's length is twice.
7245     assert((elem_bt == T_DOUBLE || elem_bt == T_LONG) &&
7246            index_src_type->element_basic_type() == T_INT &&
7247            index_src_type->length() == index_dst_type->length() * 2,
7248            "Expect double the length");
7249 
7250     // Check whether resizing is support.
7251     if (!arch_supports_vector(Op_VectorReinterpret,
7252                               index_src_type->length(),
7253                               index_src_type->element_basic_type(),
7254                               VecMaskNotUsed)) {
7255       return false;
7256     }
7257     if (!arch_supports_vector(Op_VectorReinterpret,
7258                               num_elem,
7259                               T_INT,
7260                               VecMaskNotUsed)) {
7261       return false;
7262     }
7263     index_vect = gvn().transform(new VectorReinterpretNode(index_vect, index_src_type, index_dst_type));
7264   }
7265 
7266   const TypeVect* vector_type = TypeVect::make(elem_bt, num_elem);
7267   if (is_scatter) {
7268     Node* val = unbox_vector(argument(8), vbox_type, elem_bt, num_elem);
7269     if (val == NULL) {
7270       return false; // operand unboxing failed
7271     }
7272     set_all_memory(reset_memory());
7273 
7274     Node* vstore = gvn().transform(new StoreVectorScatterNode(control(), memory(addr), addr, addr_type, val, index_vect));
7275     set_memory(vstore, addr_type);
7276     set_vector_result(vstore, false);
7277  } else {
7278     Node* vload = gvn().transform(new LoadVectorGatherNode(control(), memory(addr), addr, addr_type, vector_type, index_vect));
7279 
7280     Node* box = box_vector(vload, vbox_type, elem_bt, num_elem);
7281     set_vector_result(box);
7282   }
7283 
7284   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
7285   return true;


< prev index next >