< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page
rev 49509 : [vector] Intrinsic support for resize

*** 337,350 **** bool inline_vector_reduction(); bool inline_vector_test(); bool inline_vector_blend(); bool inline_vector_compare(); bool inline_vector_broadcast_int(); ! bool inline_vector_rebracket(); Node* box_vector(Node* in, const TypeInstPtr* vbox_type, BasicType bt, int num_elem); Node* unbox_vector(Node* in, const TypeInstPtr* vbox_type, BasicType bt, int num_elem); Node* shift_count(Node* cnt, int shift_op, BasicType bt, int num_elem); void clear_upper_avx() { #ifdef X86 if (UseAVX >= 2) { C->set_clear_upper_avx(true); --- 337,351 ---- bool inline_vector_reduction(); bool inline_vector_test(); bool inline_vector_blend(); bool inline_vector_compare(); bool inline_vector_broadcast_int(); ! bool inline_vector_reinterpret(); Node* box_vector(Node* in, const TypeInstPtr* vbox_type, BasicType bt, int num_elem); Node* unbox_vector(Node* in, const TypeInstPtr* vbox_type, BasicType bt, int num_elem); Node* shift_count(Node* cnt, int shift_op, BasicType bt, int num_elem); + void set_vector_result(Node* result, bool set_res = true); void clear_upper_avx() { #ifdef X86 if (UseAVX >= 2) { C->set_clear_upper_avx(true);
*** 905,916 **** return inline_vector_blend(); case vmIntrinsics::_VectorCompare: return inline_vector_compare(); case vmIntrinsics::_VectorBroadcastInt: return inline_vector_broadcast_int(); ! case vmIntrinsics::_VectorRebracket: ! return inline_vector_rebracket(); default: // If you get here, it may be that someone has added a new intrinsic // to the list in vmSymbols.hpp without implementing it here. #ifndef PRODUCT --- 906,917 ---- return inline_vector_blend(); case vmIntrinsics::_VectorCompare: return inline_vector_compare(); case vmIntrinsics::_VectorBroadcastInt: return inline_vector_broadcast_int(); ! case vmIntrinsics::_VectorReinterpret: ! return inline_vector_reinterpret(); default: // If you get here, it may be that someone has added a new intrinsic // to the list in vmSymbols.hpp without implementing it here. #ifndef PRODUCT
*** 7185,7194 **** --- 7186,7208 ---- const TypeVect* vec_type = TypeVect::make(elem_bt, num_elem); Node* unbox = gvn().transform(new VectorUnboxNode(C, vec_type, v, merged_memory())); return unbox; } + void LibraryCallKit::set_vector_result(Node* result, bool set_res) { + if (DebugVectorApi) { + tty->print("============ "); + callee()->print(); + tty->print_cr(" ============"); + result->dump(5); + tty->print_cr("----------------------------------------------------"); + } + if (set_res) { + set_result(result); + } + } + bool LibraryCallKit::inline_vector_nary_operation(int n) { const TypeInt* opr = gvn().type(argument(0))->is_int(); const TypeInstPtr* vector_klass = gvn().type(argument(1))->is_instptr(); const TypeInstPtr* elem_klass = gvn().type(argument(2))->is_instptr(); const TypeInt* vlen = gvn().type(argument(3))->is_int();
*** 7251,7261 **** } default: fatal("unsupported arity: %d", n); } // Wrap it up in VectorBox to keep object type information. operation = box_vector(operation, vbox_type, elem_bt, num_elem); ! set_result(operation); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } --- 7265,7275 ---- } default: fatal("unsupported arity: %d", n); } // Wrap it up in VectorBox to keep object type information. operation = box_vector(operation, vbox_type, elem_bt, num_elem); ! set_vector_result(operation); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; }
*** 7316,7326 **** } Node* broadcast = VectorNode::scalar2vector(elem, num_elem, Type::get_const_basic_type(elem_bt)); broadcast = gvn().transform(broadcast); Node* box = box_vector(broadcast, vbox_type, elem_bt, num_elem); ! set_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } --- 7330,7340 ---- } Node* broadcast = VectorNode::scalar2vector(elem, num_elem, Type::get_const_basic_type(elem_bt)); broadcast = gvn().transform(broadcast); Node* box = box_vector(broadcast, vbox_type, elem_bt, num_elem); ! set_vector_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; }
*** 7377,7390 **** return false; // operand unboxing failed } set_all_memory(reset_memory()); Node* vstore = gvn().transform(StoreVectorNode::make(0, control(), memory(adr), adr, adr_type, val, num_elem)); set_memory(vstore, adr_type); } else { Node* vload = gvn().transform(LoadVectorNode::make(0, control(), memory(adr), adr, adr_type, num_elem, elem_bt)); Node* box = box_vector(vload, vbox_type, elem_bt, num_elem); ! set_result(box); } C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } --- 7391,7405 ---- return false; // operand unboxing failed } set_all_memory(reset_memory()); Node* vstore = gvn().transform(StoreVectorNode::make(0, control(), memory(adr), adr, adr_type, val, num_elem)); set_memory(vstore, adr_type); + set_vector_result(vstore, false); } else { Node* vload = gvn().transform(LoadVectorNode::make(0, control(), memory(adr), adr, adr_type, num_elem, elem_bt)); Node* box = box_vector(vload, vbox_type, elem_bt, num_elem); ! set_vector_result(box); } C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; }
*** 7448,7458 **** bits = rn; // no conversion needed break; } default: fatal("%s", type2name(elem_bt)); } ! set_result(bits); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } // static <V> boolean test(int cond, Class<?> vectorClass, Class<?> elementType, int vlen, --- 7463,7473 ---- bits = rn; // no conversion needed break; } default: fatal("%s", type2name(elem_bt)); } ! set_vector_result(bits); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } // static <V> boolean test(int cond, Class<?> vectorClass, Class<?> elementType, int vlen,
*** 7487,7497 **** if (opd1 == NULL || opd2 == NULL) { return false; // operand unboxing failed } Node* test = new VectorTestNode(opd1, opd2, booltest); test = _gvn.transform(test); ! set_result(test); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } // static --- 7502,7512 ---- if (opd1 == NULL || opd2 == NULL) { return false; // operand unboxing failed } Node* test = new VectorTestNode(opd1, opd2, booltest); test = _gvn.transform(test); ! set_vector_result(test); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } // static
*** 7535,7545 **** return false; // operand unboxing failed } Node* blend = _gvn.transform(new VectorBlendNode(v1, v2, mask)); Node* box = box_vector(blend, vbox_type, elem_bt, num_elem); ! set_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } --- 7550,7560 ---- return false; // operand unboxing failed } Node* blend = _gvn.transform(new VectorBlendNode(v1, v2, mask)); Node* box = box_vector(blend, vbox_type, elem_bt, num_elem); ! set_vector_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; }
*** 7589,7599 **** BoolTest::mask pred = (BoolTest::mask)cond->get_con(); const TypeVect* vt = TypeVect::make(mask_bt, num_elem); Node* operation = _gvn.transform(new VectorMaskCmpNode(pred, v1, v2, vt)); Node* box = box_vector(operation, mbox_type, mask_bt, num_elem); ! set_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } --- 7604,7614 ---- BoolTest::mask pred = (BoolTest::mask)cond->get_con(); const TypeVect* vt = TypeVect::make(mask_bt, num_elem); Node* operation = _gvn.transform(new VectorMaskCmpNode(pred, v1, v2, vt)); Node* box = box_vector(operation, mbox_type, mask_bt, num_elem); ! set_vector_result(box); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; }
*** 7653,7663 **** return false; } Node* operation = _gvn.transform(VectorNode::make(sopc, opd1, opd2, num_elem, elem_bt)); Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem); ! set_result(vbox); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } static BasicType extract_bt_from_box_class(ciType* t) { --- 7668,7678 ---- return false; } Node* operation = _gvn.transform(VectorNode::make(sopc, opd1, opd2, num_elem, elem_bt)); Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem); ! set_vector_result(vbox); C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt)))); return true; } static BasicType extract_bt_from_box_class(ciType* t) {
*** 7675,7693 **** } } return T_ILLEGAL; } ! bool LibraryCallKit::inline_vector_rebracket() { const TypeInstPtr* vector_klass_from = gvn().type(argument(0))->is_instptr(); const TypeInstPtr* elem_klass_from = gvn().type(argument(1))->is_instptr(); const TypeInt* vlen_from = gvn().type(argument(2))->is_int(); const TypeInstPtr* elem_klass_to = gvn().type(argument(3))->is_instptr(); if (vector_klass_from->const_oop() == NULL || elem_klass_from->const_oop() == NULL || !vlen_from->is_con() || ! elem_klass_to->const_oop() == NULL ) { return false; // not enough info for intrinsification } ciKlass* vbox_klass_from = vector_klass_from->const_oop()->as_instance()->java_lang_Class_klass(); if (!vbox_klass_from->is_vectorapi_vector()) { --- 7690,7709 ---- } } return T_ILLEGAL; } ! bool LibraryCallKit::inline_vector_reinterpret() { const TypeInstPtr* vector_klass_from = gvn().type(argument(0))->is_instptr(); const TypeInstPtr* elem_klass_from = gvn().type(argument(1))->is_instptr(); const TypeInt* vlen_from = gvn().type(argument(2))->is_int(); const TypeInstPtr* elem_klass_to = gvn().type(argument(3))->is_instptr(); + const TypeInt* vlen_to = gvn().type(argument(4))->is_int(); if (vector_klass_from->const_oop() == NULL || elem_klass_from->const_oop() == NULL || !vlen_from->is_con() || ! elem_klass_to->const_oop() == NULL || !vlen_to->is_con()) { return false; // not enough info for intrinsification } ciKlass* vbox_klass_from = vector_klass_from->const_oop()->as_instance()->java_lang_Class_klass(); if (!vbox_klass_from->is_vectorapi_vector()) {
*** 7713,7734 **** } if (is_mask && elem_bt_from != elem_bt_to) { return false; // type mismatch } int num_elem_from = vlen_from->get_con(); ! int num_elem_to = (type2aelembytes(elem_bt_from) * num_elem_from) / type2aelembytes(elem_bt_to); ! if (num_elem_to == 0) { return false; } ! if (is_mask) { ! elem_bt_to = getMaskBasicType(elem_bt_to); } const TypeInstPtr* vbox_type_from = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_from); ! Node* opd1 = unbox_vector(argument(4), vbox_type_from, elem_bt_from, num_elem_from); if (opd1 == NULL) { return false; } // Can assert when Phi merges vectors of different types: --- 7729,7762 ---- } if (is_mask && elem_bt_from != elem_bt_to) { return false; // type mismatch } int num_elem_from = vlen_from->get_con(); + int num_elem_to = vlen_to->get_con(); + if (is_mask) { + elem_bt_to = getMaskBasicType(elem_bt_to); + } ! // Check whether we can unbox to appropriate size. ! if (!arch_supports_vector(Op_VectorReinterpret, ! num_elem_from, ! elem_bt_from, ! is_mask ? VecMaskUseAll : VecMaskNotUsed)) { return false; } ! ! // Check whether we can support resizing/reinterpreting to the new size. ! if (!arch_supports_vector(Op_VectorReinterpret, ! num_elem_to, ! elem_bt_to, ! is_mask ? VecMaskUseAll : VecMaskNotUsed)) { ! return false; } const TypeInstPtr* vbox_type_from = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_from); ! Node* opd1 = unbox_vector(argument(5), vbox_type_from, elem_bt_from, num_elem_from); if (opd1 == NULL) { return false; } // Can assert when Phi merges vectors of different types:
*** 7742,7752 **** } ciKlass* vbox_klass_to = get_exact_klass_for_vector_box(vbox_klass_from, extract_bt_from_box_class(elem_type_to), num_elem_to, is_mask ? VECAPI_MASK : VECAPI_VECTOR); const TypeInstPtr* vbox_type_to = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_to); Node* vbox = box_vector(op, vbox_type_to, elem_bt_to, num_elem_to); ! set_result(vbox); return true; } //------------------------------get_state_from_sha_object----------------------- Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) { --- 7770,7780 ---- } ciKlass* vbox_klass_to = get_exact_klass_for_vector_box(vbox_klass_from, extract_bt_from_box_class(elem_type_to), num_elem_to, is_mask ? VECAPI_MASK : VECAPI_VECTOR); const TypeInstPtr* vbox_type_to = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_to); Node* vbox = box_vector(op, vbox_type_to, elem_bt_to, num_elem_to); ! set_vector_result(vbox); return true; } //------------------------------get_state_from_sha_object----------------------- Node * LibraryCallKit::get_state_from_sha_object(Node *sha_object) {
< prev index next >