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