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