< prev index next >

src/hotspot/share/opto/vectorIntrinsics.cpp

Print this page

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);
< prev index next >