1210 // V extends Vector<E>,
1211 // W extends Vector<Integer>,
1212 // M extends VectorMask<E>,
1213 // E>
1214 // void storeWithMap(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass, int length,
1215 // Class<? extends Vector<Integer>> vectorIndexClass, int indexLength,
1216 // Object base, long offset, // Unsafe addressing
1217 // W indexVector, V v, M m,
1218 // C container, int index, int[] indexMap, int indexM, // Arguments for default implementation
1219 // StoreVectorOperationWithMap<C, V, M> defaultImpl)
1220 //
1221 bool LibraryCallKit::inline_vector_gather_scatter(bool is_scatter) {
1222 const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
1223 const TypeInstPtr* mask_klass = gvn().type(argument(1))->isa_instptr();
1224 const TypeInstPtr* elem_klass = gvn().type(argument(2))->isa_instptr();
1225 const TypeInt* vlen = gvn().type(argument(3))->isa_int();
1226 const TypeInstPtr* vector_idx_klass = gvn().type(argument(4))->isa_instptr();
1227 const TypeInt* idx_vlen = gvn().type(argument(5))->isa_int();
1228
1229 if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1230 elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
1231 vlen == nullptr || !vlen->is_con() ||
1232 vector_idx_klass == nullptr || vector_idx_klass->const_oop() == nullptr ||
1233 idx_vlen == nullptr || !idx_vlen->is_con()) {
1234 log_if_needed(" ** missing constant: vclass=%s etype=%s vlen=%s viclass=%s idx_vlen=%s",
1235 NodeClassNames[argument(0)->Opcode()],
1236 NodeClassNames[argument(2)->Opcode()],
1237 NodeClassNames[argument(3)->Opcode()],
1238 NodeClassNames[argument(4)->Opcode()],
1239 NodeClassNames[argument(5)->Opcode()]);
1240 return false; // not enough info for intrinsification
1241 }
1242
1243 if (!is_klass_initialized(vector_klass) || !is_klass_initialized(vector_idx_klass)) {
1244 log_if_needed(" ** klass argument not initialized");
1245 return false;
1246 }
1247
1248 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1249 if (!elem_type->is_primitive_type()) {
1394 C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1395 return true;
1396 }
1397
1398 // public static
1399 // <V extends Vector<E>,
1400 // M extends VectorMask<E>,
1401 // E>
1402 // long reductionCoerced(int oprId, Class<? extends V> vectorClass, Class<? extends M> maskClass,
1403 // Class<E> elementType, int length, V v, M m,
1404 // ReductionOperation<V, M> defaultImpl)
1405 bool LibraryCallKit::inline_vector_reduction() {
1406 const TypeInt* opr = gvn().type(argument(0))->isa_int();
1407 const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
1408 const TypeInstPtr* mask_klass = gvn().type(argument(2))->isa_instptr();
1409 const TypeInstPtr* elem_klass = gvn().type(argument(3))->isa_instptr();
1410 const TypeInt* vlen = gvn().type(argument(4))->isa_int();
1411
1412 if (opr == nullptr || !opr->is_con() ||
1413 vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1414 elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
1415 vlen == nullptr || !vlen->is_con()) {
1416 log_if_needed(" ** missing constant: opr=%s vclass=%s etype=%s vlen=%s",
1417 NodeClassNames[argument(0)->Opcode()],
1418 NodeClassNames[argument(1)->Opcode()],
1419 NodeClassNames[argument(3)->Opcode()],
1420 NodeClassNames[argument(4)->Opcode()]);
1421 return false; // not enough info for intrinsification
1422 }
1423 if (!is_klass_initialized(vector_klass)) {
1424 log_if_needed(" ** klass argument not initialized");
1425 return false;
1426 }
1427 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1428 if (!elem_type->is_primitive_type()) {
1429 log_if_needed(" ** not a primitive bt=%d", elem_type->basic_type());
1430 return false; // should be primitive type
1431 }
1432
1433 const Type* vmask_type = gvn().type(argument(6));
2511
2512 Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
2513 set_result(vbox);
2514 C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2515 return true;
2516 }
2517
2518 // public static
2519 // <VM extends VectorPayload,
2520 // E>
2521 // long extract(Class<? extends VM> vClass, Class<E> eClass,
2522 // int length,
2523 // VM vm, int i,
2524 // VecExtractOp<VM> defaultImpl)
2525 bool LibraryCallKit::inline_vector_extract() {
2526 const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2527 const TypeInstPtr* elem_klass = gvn().type(argument(1))->isa_instptr();
2528 const TypeInt* vlen = gvn().type(argument(2))->isa_int();
2529 const TypeInt* idx = gvn().type(argument(4))->isa_int();
2530
2531 if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
2532 elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
2533 vlen == nullptr || !vlen->is_con() ||
2534 idx == nullptr) {
2535 log_if_needed(" ** missing constant: vclass=%s etype=%s vlen=%s",
2536 NodeClassNames[argument(0)->Opcode()],
2537 NodeClassNames[argument(1)->Opcode()],
2538 NodeClassNames[argument(2)->Opcode()]);
2539 return false; // not enough info for intrinsification
2540 }
2541 if (!is_klass_initialized(vector_klass)) {
2542 log_if_needed(" ** klass argument not initialized");
2543 return false;
2544 }
2545 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2546 if (!elem_type->is_primitive_type()) {
2547 log_if_needed(" ** not a primitive bt=%d", elem_type->basic_type());
2548 return false; // should be primitive type
2549 }
2550 BasicType elem_bt = elem_type->basic_type();
2551 int num_elem = vlen->get_con();
2552
2553 ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2554 const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
|
1210 // V extends Vector<E>,
1211 // W extends Vector<Integer>,
1212 // M extends VectorMask<E>,
1213 // E>
1214 // void storeWithMap(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass, int length,
1215 // Class<? extends Vector<Integer>> vectorIndexClass, int indexLength,
1216 // Object base, long offset, // Unsafe addressing
1217 // W indexVector, V v, M m,
1218 // C container, int index, int[] indexMap, int indexM, // Arguments for default implementation
1219 // StoreVectorOperationWithMap<C, V, M> defaultImpl)
1220 //
1221 bool LibraryCallKit::inline_vector_gather_scatter(bool is_scatter) {
1222 const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
1223 const TypeInstPtr* mask_klass = gvn().type(argument(1))->isa_instptr();
1224 const TypeInstPtr* elem_klass = gvn().type(argument(2))->isa_instptr();
1225 const TypeInt* vlen = gvn().type(argument(3))->isa_int();
1226 const TypeInstPtr* vector_idx_klass = gvn().type(argument(4))->isa_instptr();
1227 const TypeInt* idx_vlen = gvn().type(argument(5))->isa_int();
1228
1229 if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1230 // mask_klass == nullptr || mask_klass->const_oop() == nullptr ||
1231 elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
1232 vlen == nullptr || !vlen->is_con() ||
1233 vector_idx_klass == nullptr || vector_idx_klass->const_oop() == nullptr ||
1234 idx_vlen == nullptr || !idx_vlen->is_con()) {
1235 log_if_needed(" ** missing constant: vclass=%s etype=%s vlen=%s viclass=%s idx_vlen=%s",
1236 NodeClassNames[argument(0)->Opcode()],
1237 NodeClassNames[argument(2)->Opcode()],
1238 NodeClassNames[argument(3)->Opcode()],
1239 NodeClassNames[argument(4)->Opcode()],
1240 NodeClassNames[argument(5)->Opcode()]);
1241 return false; // not enough info for intrinsification
1242 }
1243
1244 if (!is_klass_initialized(vector_klass) || !is_klass_initialized(vector_idx_klass)) {
1245 log_if_needed(" ** klass argument not initialized");
1246 return false;
1247 }
1248
1249 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1250 if (!elem_type->is_primitive_type()) {
1395 C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1396 return true;
1397 }
1398
1399 // public static
1400 // <V extends Vector<E>,
1401 // M extends VectorMask<E>,
1402 // E>
1403 // long reductionCoerced(int oprId, Class<? extends V> vectorClass, Class<? extends M> maskClass,
1404 // Class<E> elementType, int length, V v, M m,
1405 // ReductionOperation<V, M> defaultImpl)
1406 bool LibraryCallKit::inline_vector_reduction() {
1407 const TypeInt* opr = gvn().type(argument(0))->isa_int();
1408 const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
1409 const TypeInstPtr* mask_klass = gvn().type(argument(2))->isa_instptr();
1410 const TypeInstPtr* elem_klass = gvn().type(argument(3))->isa_instptr();
1411 const TypeInt* vlen = gvn().type(argument(4))->isa_int();
1412
1413 if (opr == nullptr || !opr->is_con() ||
1414 vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1415 // mask_klass == nullptr || mask_klass->const_oop() == nullptr ||
1416 elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
1417 vlen == nullptr || !vlen->is_con()) {
1418 log_if_needed(" ** missing constant: opr=%s vclass=%s etype=%s vlen=%s",
1419 NodeClassNames[argument(0)->Opcode()],
1420 NodeClassNames[argument(1)->Opcode()],
1421 NodeClassNames[argument(3)->Opcode()],
1422 NodeClassNames[argument(4)->Opcode()]);
1423 return false; // not enough info for intrinsification
1424 }
1425 if (!is_klass_initialized(vector_klass)) {
1426 log_if_needed(" ** klass argument not initialized");
1427 return false;
1428 }
1429 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1430 if (!elem_type->is_primitive_type()) {
1431 log_if_needed(" ** not a primitive bt=%d", elem_type->basic_type());
1432 return false; // should be primitive type
1433 }
1434
1435 const Type* vmask_type = gvn().type(argument(6));
2513
2514 Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
2515 set_result(vbox);
2516 C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2517 return true;
2518 }
2519
2520 // public static
2521 // <VM extends VectorPayload,
2522 // E>
2523 // long extract(Class<? extends VM> vClass, Class<E> eClass,
2524 // int length,
2525 // VM vm, int i,
2526 // VecExtractOp<VM> defaultImpl)
2527 bool LibraryCallKit::inline_vector_extract() {
2528 const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2529 const TypeInstPtr* elem_klass = gvn().type(argument(1))->isa_instptr();
2530 const TypeInt* vlen = gvn().type(argument(2))->isa_int();
2531 const TypeInt* idx = gvn().type(argument(4))->isa_int();
2532
2533 if (vector_klass == nullptr || elem_klass == nullptr || vlen == nullptr || idx == nullptr) {
2534 return false; // dead code
2535 }
2536 if (vector_klass->const_oop() == nullptr || elem_klass->const_oop() == nullptr || !vlen->is_con()) {
2537 log_if_needed(" ** missing constant: vclass=%s etype=%s vlen=%s",
2538 NodeClassNames[argument(0)->Opcode()],
2539 NodeClassNames[argument(1)->Opcode()],
2540 NodeClassNames[argument(2)->Opcode()]);
2541 return false; // not enough info for intrinsification
2542 }
2543 if (!is_klass_initialized(vector_klass)) {
2544 log_if_needed(" ** klass argument not initialized");
2545 return false;
2546 }
2547 ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2548 if (!elem_type->is_primitive_type()) {
2549 log_if_needed(" ** not a primitive bt=%d", elem_type->basic_type());
2550 return false; // should be primitive type
2551 }
2552 BasicType elem_bt = elem_type->basic_type();
2553 int num_elem = vlen->get_con();
2554
2555 ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2556 const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
|