1 /*
   2  * Copyright (c) 2020, 2026, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "ci/ciSymbols.hpp"
  26 #include "classfile/vmSymbols.hpp"
  27 #include "opto/library_call.hpp"
  28 #include "opto/rootnode.hpp"
  29 #include "opto/runtime.hpp"
  30 #include "opto/vectornode.hpp"
  31 #include "prims/vectorSupport.hpp"
  32 #include "runtime/stubRoutines.hpp"
  33 
  34 #ifdef ASSERT
  35 static bool is_vector(ciKlass* klass) {
  36   return klass->is_subclass_of(ciEnv::current()->vector_VectorPayload_klass());
  37 }
  38 
  39 static bool check_vbox(const TypeInstPtr* vbox_type) {
  40   assert(vbox_type->klass_is_exact(), "");
  41 
  42   ciInstanceKlass* ik = vbox_type->instance_klass();
  43   assert(is_vector(ik), "not a vector");
  44 
  45   ciField* fd1 = ik->get_field_by_name(ciSymbols::ETYPE_name(), ciSymbols::class_signature(), /* is_static */ true);
  46   assert(fd1 != nullptr, "element type info is missing");
  47 
  48   ciConstant val1 = fd1->constant_value();
  49   BasicType elem_bt = val1.as_object()->as_instance()->java_mirror_type()->basic_type();
  50   assert(is_java_primitive(elem_bt), "element type info is missing");
  51 
  52   ciField* fd2 = ik->get_field_by_name(ciSymbols::VLENGTH_name(), ciSymbols::int_signature(), /* is_static */ true);
  53   assert(fd2 != nullptr, "vector length info is missing");
  54 
  55   ciConstant val2 = fd2->constant_value();
  56   assert(val2.as_int() > 0, "vector length info is missing");
  57 
  58   return true;
  59 }
  60 #endif
  61 
  62 #define log_if_needed(...)        \
  63   if (C->print_intrinsics()) {    \
  64     tty->print_cr(__VA_ARGS__);   \
  65   }
  66 
  67 #ifndef PRODUCT
  68 #define non_product_log_if_needed(...) log_if_needed(__VA_ARGS__)
  69 #else
  70 #define non_product_log_if_needed(...)
  71 #endif
  72 
  73 static bool is_vector_mask(ciKlass* klass) {
  74   return klass->is_subclass_of(ciEnv::current()->vector_VectorMask_klass());
  75 }
  76 
  77 bool LibraryCallKit::arch_supports_vector_rotate(int opc, int num_elem, BasicType elem_bt,
  78                                                  VectorMaskUseType mask_use_type, bool has_scalar_args) {
  79   bool is_supported = true;
  80 
  81   // has_scalar_args flag is true only for non-constant scalar shift count,
  82   // since in this case shift needs to be broadcasted.
  83   if (!Matcher::match_rule_supported_vector(opc, num_elem, elem_bt) ||
  84        (has_scalar_args && !arch_supports_vector(Op_Replicate, num_elem, elem_bt, VecMaskNotUsed))) {
  85     is_supported = false;
  86   }
  87 
  88   if (is_supported) {
  89     // Check if mask unboxing is supported, this is a two step process which first loads the contents
  90     // of boolean array into vector followed by either lane expansion to match the lane size of masked
  91     // vector operation or populate the predicate register.
  92     if ((mask_use_type & VecMaskUseLoad) != 0) {
  93       if (!Matcher::match_rule_supported_vector(Op_VectorLoadMask, num_elem, elem_bt) ||
  94           !Matcher::match_rule_supported_vector(Op_LoadVector, num_elem, T_BOOLEAN)) {
  95         non_product_log_if_needed("  ** Rejected vector mask loading (%s,%s,%d) because architecture does not support it",
  96                                   NodeClassNames[Op_VectorLoadMask], type2name(elem_bt), num_elem);
  97         return false;
  98       }
  99     }
 100 
 101     if ((mask_use_type & VecMaskUsePred) != 0) {
 102       if (!Matcher::has_predicated_vectors() ||
 103           !Matcher::match_rule_supported_vector_masked(opc, num_elem, elem_bt)) {
 104         non_product_log_if_needed("Rejected vector mask predicate using (%s,%s,%d) because architecture does not support it",
 105                                   NodeClassNames[opc], type2name(elem_bt), num_elem);
 106         return false;
 107       }
 108     }
 109   }
 110 
 111   int lshiftopc, rshiftopc;
 112   switch(elem_bt) {
 113     case T_BYTE:
 114       lshiftopc = Op_LShiftI;
 115       rshiftopc = Op_URShiftB;
 116       break;
 117     case T_SHORT:
 118       lshiftopc = Op_LShiftI;
 119       rshiftopc = Op_URShiftS;
 120       break;
 121     case T_INT:
 122       lshiftopc = Op_LShiftI;
 123       rshiftopc = Op_URShiftI;
 124       break;
 125     case T_LONG:
 126       lshiftopc = Op_LShiftL;
 127       rshiftopc = Op_URShiftL;
 128       break;
 129     default: fatal("Unexpected type: %s", type2name(elem_bt));
 130   }
 131   int lshiftvopc = VectorNode::opcode(lshiftopc, elem_bt);
 132   int rshiftvopc = VectorNode::opcode(rshiftopc, elem_bt);
 133   if (!is_supported &&
 134       arch_supports_vector(lshiftvopc, num_elem, elem_bt, VecMaskNotUsed, has_scalar_args) &&
 135       arch_supports_vector(rshiftvopc, num_elem, elem_bt, VecMaskNotUsed, has_scalar_args) &&
 136       arch_supports_vector(Op_OrV, num_elem, elem_bt, VecMaskNotUsed)) {
 137     is_supported = true;
 138   }
 139   return is_supported;
 140 }
 141 
 142 Node* GraphKit::box_vector(Node* vector, const TypeInstPtr* vbox_type, BasicType elem_bt, int num_elem, bool deoptimize_on_exception) {
 143   assert(EnableVectorSupport, "");
 144 
 145   PreserveReexecuteState preexecs(this);
 146   jvms()->set_should_reexecute(true);
 147 
 148   VectorBoxAllocateNode* alloc = new VectorBoxAllocateNode(C, vbox_type);
 149   set_edges_for_java_call(alloc, /*must_throw=*/false, /*separate_io_proj=*/true);
 150   make_slow_call_ex(alloc, env()->Throwable_klass(), /*separate_io_proj=*/true, deoptimize_on_exception);
 151   set_i_o(gvn().transform( new ProjNode(alloc, TypeFunc::I_O) ));
 152   set_all_memory(gvn().transform( new ProjNode(alloc, TypeFunc::Memory) ));
 153   Node* ret = gvn().transform(new ProjNode(alloc, TypeFunc::Parms));
 154 
 155   assert(check_vbox(vbox_type), "");
 156   const TypeVect* vt = TypeVect::make(elem_bt, num_elem, is_vector_mask(vbox_type->instance_klass()));
 157   VectorBoxNode* vbox = new VectorBoxNode(C, ret, vector, vbox_type, vt);
 158   return gvn().transform(vbox);
 159 }
 160 
 161 Node* GraphKit::unbox_vector(Node* v, const TypeInstPtr* vbox_type, BasicType elem_bt, int num_elem) {
 162   assert(EnableVectorSupport, "");
 163   const TypeInstPtr* vbox_type_v = gvn().type(v)->isa_instptr();
 164   if (vbox_type_v == nullptr || vbox_type->instance_klass() != vbox_type_v->instance_klass()) {
 165     return nullptr; // arguments don't agree on vector shapes
 166   }
 167   if (vbox_type_v->maybe_null()) {
 168     return nullptr; // no nulls are allowed
 169   }
 170   assert(check_vbox(vbox_type), "");
 171   const TypeVect* vt = TypeVect::make(elem_bt, num_elem, is_vector_mask(vbox_type->instance_klass()));
 172   Node* unbox = gvn().transform(new VectorUnboxNode(C, vt, v, merged_memory()));
 173   return unbox;
 174 }
 175 
 176 Node* GraphKit::vector_shift_count(Node* cnt, int shift_op, BasicType bt, int num_elem) {
 177   assert(bt == T_INT || bt == T_LONG || bt == T_SHORT || bt == T_BYTE, "byte, short, long and int are supported");
 178   juint mask = (type2aelembytes(bt) * BitsPerByte - 1);
 179   Node* nmask = gvn().transform(ConNode::make(TypeInt::make(mask)));
 180   Node* mcnt = gvn().transform(new AndINode(cnt, nmask));
 181   return gvn().transform(VectorNode::shift_count(shift_op, mcnt, num_elem, bt));
 182 }
 183 
 184 bool LibraryCallKit::arch_supports_vector(int sopc, int num_elem, BasicType type, VectorMaskUseType mask_use_type, bool has_scalar_args) {
 185   // Check that the operation is valid.
 186   if (sopc <= 0) {
 187     non_product_log_if_needed("  ** Rejected intrinsification because no valid vector op could be extracted");
 188     return false;
 189   }
 190 
 191   if (VectorNode::is_vector_rotate(sopc)) {
 192     if(!arch_supports_vector_rotate(sopc, num_elem, type, mask_use_type, has_scalar_args)) {
 193       non_product_log_if_needed("  ** Rejected vector op (%s,%s,%d) because architecture does not support variable vector shifts",
 194                                 NodeClassNames[sopc], type2name(type), num_elem);
 195       return false;
 196     }
 197   } else if (VectorNode::is_vector_integral_negate(sopc)) {
 198     if (!VectorNode::is_vector_integral_negate_supported(sopc, num_elem, type, false)) {
 199       non_product_log_if_needed("  ** Rejected vector op (%s,%s,%d) because architecture does not support integral vector negate",
 200                                 NodeClassNames[sopc], type2name(type), num_elem);
 201       return false;
 202     }
 203   } else {
 204     // Check that architecture supports this op-size-type combination.
 205     if (!Matcher::match_rule_supported_vector(sopc, num_elem, type)) {
 206       non_product_log_if_needed("  ** Rejected vector op (%s,%s,%d) because architecture does not support it",
 207                                 NodeClassNames[sopc], type2name(type), num_elem);
 208       return false;
 209     } else {
 210       assert(Matcher::match_rule_supported(sopc), "must be supported");
 211     }
 212   }
 213 
 214   if (num_elem == 1) {
 215     if (mask_use_type != VecMaskNotUsed) {
 216       non_product_log_if_needed("  ** Rejected vector mask op (%s,%s,%d) because architecture does not support it",
 217                                 NodeClassNames[sopc], type2name(type), num_elem);
 218       return false;
 219     }
 220 
 221     if (sopc != 0) {
 222       if (sopc != Op_LoadVector && sopc != Op_StoreVector) {
 223         non_product_log_if_needed("  ** Not a svml call or load/store vector op (%s,%s,%d)",
 224                                   NodeClassNames[sopc], type2name(type), num_elem);
 225         return false;
 226       }
 227     }
 228   }
 229 
 230   if (!has_scalar_args && VectorNode::is_vector_shift(sopc) &&
 231       Matcher::supports_vector_variable_shifts() == false) {
 232     log_if_needed("  ** Rejected vector op (%s,%s,%d) because architecture does not support variable vector shifts",
 233                   NodeClassNames[sopc], type2name(type), num_elem);
 234     return false;
 235   }
 236 
 237   // Check if mask unboxing is supported, this is a two step process which first loads the contents
 238   // of boolean array into vector followed by either lane expansion to match the lane size of masked
 239   // vector operation or populate the predicate register.
 240   if ((mask_use_type & VecMaskUseLoad) != 0) {
 241     if (!Matcher::match_rule_supported_vector(Op_VectorLoadMask, num_elem, type) ||
 242         !Matcher::match_rule_supported_vector(Op_LoadVector, num_elem, T_BOOLEAN)) {
 243       non_product_log_if_needed("  ** Rejected vector mask loading (%s,%s,%d) because architecture does not support it",
 244                                 NodeClassNames[Op_VectorLoadMask], type2name(type), num_elem);
 245       return false;
 246     }
 247   }
 248 
 249   // Check if mask boxing is supported, this is a two step process which first stores the contents
 250   // of mask vector / predicate register into a boolean vector followed by vector store operation to
 251   // transfer the contents to underlined storage of mask boxes which is a boolean array.
 252   if ((mask_use_type & VecMaskUseStore) != 0) {
 253     if (!Matcher::match_rule_supported_vector(Op_VectorStoreMask, num_elem, type) ||
 254         !Matcher::match_rule_supported_vector(Op_StoreVector, num_elem, T_BOOLEAN)) {
 255       non_product_log_if_needed("Rejected vector mask storing (%s,%s,%d) because architecture does not support it",
 256                                 NodeClassNames[Op_VectorStoreMask], type2name(type), num_elem);
 257       return false;
 258     }
 259   }
 260 
 261   if ((mask_use_type & VecMaskUsePred) != 0) {
 262     bool is_supported = false;
 263     if (Matcher::has_predicated_vectors()) {
 264       if (VectorNode::is_vector_integral_negate(sopc)) {
 265         is_supported = VectorNode::is_vector_integral_negate_supported(sopc, num_elem, type, true);
 266       } else {
 267         is_supported = Matcher::match_rule_supported_vector_masked(sopc, num_elem, type);
 268       }
 269     }
 270     is_supported |= Matcher::supports_vector_predicate_op_emulation(sopc, num_elem, type);
 271 
 272     if (!is_supported) {
 273       non_product_log_if_needed("Rejected vector mask predicate using (%s,%s,%d) because architecture does not support it",
 274                                 NodeClassNames[sopc], type2name(type), num_elem);
 275       return false;
 276     }
 277   }
 278 
 279   return true;
 280 }
 281 
 282 static bool is_klass_initialized(const TypeInstPtr* vec_klass) {
 283   if (vec_klass->const_oop() == nullptr) {
 284     return false; // uninitialized or some kind of unsafe access
 285   }
 286   assert(vec_klass->const_oop()->as_instance()->java_lang_Class_klass() != nullptr, "klass instance expected");
 287   ciInstanceKlass* klass =  vec_klass->const_oop()->as_instance()->java_lang_Class_klass()->as_instance_klass();
 288   return klass->is_initialized();
 289 }
 290 
 291 // public static
 292 // <V extends Vector<E>,
 293 //  M extends VectorMask<E>,
 294 //  E>
 295 // V unaryOp(int oprId, Class<? extends V> vmClass, Class<? extends M> maskClass, Class<E> elementType,
 296 //           int length, V v, M m,
 297 //           UnaryOperation<V, M> defaultImpl)
 298 //
 299 // public static
 300 // <V,
 301 //  M extends VectorMask<E>,
 302 //  E>
 303 // V binaryOp(int oprId, Class<? extends V> vmClass, Class<? extends M> maskClass, Class<E> elementType,
 304 //            int length, V v1, V v2, M m,
 305 //            BinaryOperation<V, M> defaultImpl)
 306 //
 307 // public static
 308 // <V extends Vector<E>,
 309 //  M extends VectorMask<E>,
 310 //  E>
 311 // V ternaryOp(int oprId, Class<? extends V> vmClass, Class<? extends M> maskClass, Class<E> elementType,
 312 //             int length, V v1, V v2, V v3, M m,
 313 //             TernaryOperation<V, M> defaultImpl)
 314 //
 315 bool LibraryCallKit::inline_vector_nary_operation(int n) {
 316   const TypeInt*     opr          = gvn().type(argument(0))->isa_int();
 317   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
 318   const TypeInstPtr* mask_klass   = gvn().type(argument(2))->isa_instptr();
 319   const TypeInstPtr* elem_klass   = gvn().type(argument(3))->isa_instptr();
 320   const TypeInt*     vlen         = gvn().type(argument(4))->isa_int();
 321 
 322   if (opr          == nullptr || !opr->is_con() ||
 323       vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
 324       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
 325       vlen         == nullptr || !vlen->is_con()) {
 326     log_if_needed("  ** missing constant: opr=%s vclass=%s etype=%s vlen=%s",
 327                     NodeClassNames[argument(0)->Opcode()],
 328                     NodeClassNames[argument(1)->Opcode()],
 329                     NodeClassNames[argument(3)->Opcode()],
 330                     NodeClassNames[argument(4)->Opcode()]);
 331     return false; // not enough info for intrinsification
 332   }
 333 
 334   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
 335   if (!elem_type->is_primitive_type()) {
 336     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
 337     return false; // should be primitive type
 338   }
 339   if (!is_klass_initialized(vector_klass)) {
 340     log_if_needed("  ** klass argument not initialized");
 341     return false;
 342   }
 343 
 344   // "argument(n + 5)" should be the mask object. We assume it is "null" when no mask
 345   // is used to control this operation.
 346   const Type* vmask_type = gvn().type(argument(n + 5));
 347   bool is_masked_op = vmask_type != TypePtr::NULL_PTR;
 348   if (is_masked_op) {
 349     if (mask_klass == nullptr || mask_klass->const_oop() == nullptr) {
 350       log_if_needed("  ** missing constant: maskclass=%s", NodeClassNames[argument(2)->Opcode()]);
 351       return false; // not enough info for intrinsification
 352     }
 353 
 354     if (!is_klass_initialized(mask_klass)) {
 355       log_if_needed("  ** mask klass argument not initialized");
 356       return false;
 357     }
 358 
 359     if (vmask_type->maybe_null()) {
 360       log_if_needed("  ** null mask values are not allowed for masked op");
 361       return false;
 362     }
 363   }
 364 
 365   BasicType elem_bt = elem_type->basic_type();
 366   bool has_scalar_op = VectorSupport::has_scalar_op(opr->get_con());
 367   bool is_unsigned = VectorSupport::is_unsigned_op(opr->get_con());
 368 
 369   int num_elem = vlen->get_con();
 370   int opc = VectorSupport::vop2ideal(opr->get_con(), elem_bt);
 371   int sopc = has_scalar_op ? VectorNode::opcode(opc, elem_bt) : opc;
 372   if (sopc == 0 || num_elem == 1) {
 373     log_if_needed("  ** operation not supported: arity=%d opc=%s[%d] vlen=%d etype=%s",
 374                     n, NodeClassNames[opc], opc, num_elem, type2name(elem_bt));
 375     return false; // operation not supported
 376   }
 377   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
 378   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
 379 
 380   if (is_vector_mask(vbox_klass)) {
 381     assert(!is_masked_op, "mask operations do not need mask to control");
 382   }
 383 
 384   // When using mask, mask use type needs to be VecMaskUseLoad.
 385   VectorMaskUseType mask_use_type = is_vector_mask(vbox_klass) ? VecMaskUseAll
 386                                       : is_masked_op ? VecMaskUseLoad : VecMaskNotUsed;
 387   if (!arch_supports_vector(sopc, num_elem, elem_bt, mask_use_type)) {
 388     log_if_needed("  ** not supported: arity=%d opc=%d vlen=%d etype=%s ismask=%d is_masked_op=%d",
 389                     n, sopc, num_elem, type2name(elem_bt),
 390                     is_vector_mask(vbox_klass) ? 1 : 0, is_masked_op ? 1 : 0);
 391     return false; // not supported
 392   }
 393 
 394   // Return true if current platform has implemented the masked operation with predicate feature.
 395   bool use_predicate = is_masked_op && arch_supports_vector(sopc, num_elem, elem_bt, VecMaskUsePred);
 396   if (is_masked_op && !use_predicate && !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)) {
 397     log_if_needed("  ** not supported: arity=%d opc=%d vlen=%d etype=%s ismask=0 is_masked_op=1",
 398                     n, sopc, num_elem, type2name(elem_bt));
 399     return false;
 400   }
 401 
 402   Node* opd1 = nullptr; Node* opd2 = nullptr; Node* opd3 = nullptr;
 403   switch (n) {
 404     case 3: {
 405       opd3 = unbox_vector(argument(7), vbox_type, elem_bt, num_elem);
 406       if (opd3 == nullptr) {
 407         log_if_needed("  ** unbox failed v3=%s",
 408                         NodeClassNames[argument(7)->Opcode()]);
 409         return false;
 410       }
 411       // fall-through
 412     }
 413     case 2: {
 414       opd2 = unbox_vector(argument(6), vbox_type, elem_bt, num_elem);
 415       if (opd2 == nullptr) {
 416         log_if_needed("  ** unbox failed v2=%s",
 417                         NodeClassNames[argument(6)->Opcode()]);
 418         return false;
 419       }
 420       // fall-through
 421     }
 422     case 1: {
 423       opd1 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
 424       if (opd1 == nullptr) {
 425         log_if_needed("  ** unbox failed v1=%s",
 426                         NodeClassNames[argument(5)->Opcode()]);
 427         return false;
 428       }
 429       break;
 430     }
 431     default: fatal("unsupported arity: %d", n);
 432   }
 433 
 434   Node* mask = nullptr;
 435   if (is_masked_op) {
 436     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
 437     assert(is_vector_mask(mbox_klass), "argument(2) should be a mask class");
 438     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
 439     mask = unbox_vector(argument(n + 5), mbox_type, elem_bt, num_elem);
 440     if (mask == nullptr) {
 441       log_if_needed("  ** unbox failed mask=%s",
 442                       NodeClassNames[argument(n + 5)->Opcode()]);
 443       return false;
 444     }
 445   }
 446 
 447   Node* operation = nullptr;
 448   const TypeVect* vt = TypeVect::make(elem_bt, num_elem, is_vector_mask(vbox_klass));
 449   switch (n) {
 450     case 1:
 451     case 2: {
 452       operation = VectorNode::make(sopc, opd1, opd2, vt, is_vector_mask(vbox_klass), VectorNode::is_shift_opcode(opc), is_unsigned);
 453       break;
 454     }
 455     case 3: {
 456       operation = VectorNode::make(sopc, opd1, opd2, opd3, vt);
 457       break;
 458     }
 459     default: fatal("unsupported arity: %d", n);
 460   }
 461 
 462   if (is_masked_op && mask != nullptr) {
 463     if (use_predicate) {
 464       operation->add_req(mask);
 465       operation->add_flag(Node::Flag_is_predicated_vector);
 466     } else {
 467       operation->add_flag(Node::Flag_is_predicated_using_blend);
 468       operation = gvn().transform(operation);
 469       operation = new VectorBlendNode(opd1, operation, mask);
 470     }
 471   }
 472   operation = gvn().transform(operation);
 473 
 474   // Wrap it up in VectorBox to keep object type information.
 475   Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
 476   set_result(vbox);
 477   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
 478   return true;
 479 }
 480 
 481 // public static
 482 // <V extends Vector<E>, E>
 483 // V libraryUnaryOp(long address, Class<? extends V> vClass, Class<E> elementType, int length, String debugName,
 484 //                  V v,
 485 //                  UnaryOperation<V, ?> defaultImpl)
 486 //
 487 // public static
 488 // <V extends VectorPayload, E>
 489 // V libraryBinaryOp(long address, Class<? extends V> vClass, Class<E> elementType, int length, String debugName,
 490 //            V v1, V v2,
 491 //            BinaryOperation<V, ?> defaultImpl)
 492 bool LibraryCallKit::inline_vector_call(int arity) {
 493   assert(Matcher::supports_vector_calling_convention(), "required");
 494 
 495   const TypeLong*    entry          = gvn().type(argument(0))->isa_long();
 496   const TypeInstPtr* vector_klass   = gvn().type(argument(2))->isa_instptr();
 497   const TypeInstPtr* elem_klass     = gvn().type(argument(3))->isa_instptr();
 498   const TypeInt*     vlen           = gvn().type(argument(4))->isa_int();
 499   const TypeInstPtr* debug_name_oop = gvn().type(argument(5))->isa_instptr();
 500 
 501   if (entry        == nullptr   || !entry->is_con() ||
 502       vector_klass == nullptr   || vector_klass->const_oop() == nullptr ||
 503       elem_klass   == nullptr   || elem_klass->const_oop() == nullptr ||
 504       vlen         == nullptr   || !vlen->is_con() ||
 505       debug_name_oop == nullptr || debug_name_oop->const_oop() == nullptr) {
 506     log_if_needed("  ** missing constant: opr=%s vclass=%s etype=%s vlen=%s debug_name=%s",
 507                   NodeClassNames[argument(0)->Opcode()],
 508                   NodeClassNames[argument(2)->Opcode()],
 509                   NodeClassNames[argument(3)->Opcode()],
 510                   NodeClassNames[argument(4)->Opcode()],
 511                   NodeClassNames[argument(5)->Opcode()]);
 512     return false; // not enough info for intrinsification
 513   }
 514 
 515   if (entry->get_con() == 0) {
 516     log_if_needed("  ** missing entry point");
 517     return false;
 518   }
 519 
 520   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
 521   if (!elem_type->is_primitive_type()) {
 522     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
 523     return false; // should be primitive type
 524   }
 525   if (!is_klass_initialized(vector_klass)) {
 526     log_if_needed("  ** klass argument not initialized");
 527     return false;
 528   }
 529 
 530   BasicType elem_bt = elem_type->basic_type();
 531   int num_elem = vlen->get_con();
 532   if (!Matcher::vector_size_supported(elem_bt, num_elem)) {
 533     log_if_needed("  ** vector size (vlen=%d, etype=%s) is not supported",
 534                   num_elem, type2name(elem_bt));
 535     return false;
 536   }
 537 
 538   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
 539   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
 540 
 541   Node* opd1 = unbox_vector(argument(6), vbox_type, elem_bt, num_elem);
 542   if (opd1 == nullptr) {
 543     log_if_needed("  ** unbox failed v1=%s", NodeClassNames[argument(6)->Opcode()]);
 544     return false;
 545   }
 546 
 547   Node* opd2 = nullptr;
 548   if (arity > 1) {
 549     opd2 = unbox_vector(argument(7), vbox_type, elem_bt, num_elem);
 550     if (opd2 == nullptr) {
 551       log_if_needed("  ** unbox failed v2=%s", NodeClassNames[argument(7)->Opcode()]);
 552       return false;
 553     }
 554   }
 555   assert(arity == 1 || arity == 2, "arity %d not supported", arity);
 556   const TypeVect* vt = TypeVect::make(elem_bt, num_elem);
 557   const TypeFunc* call_type = OptoRuntime::Math_Vector_Vector_Type(arity, vt, vt);
 558   address entry_addr = (address)entry->get_con();
 559 
 560   const char* debug_name = "<unknown>";
 561   if (!debug_name_oop->const_oop()->is_null_object()) {
 562     size_t buflen = 100;
 563     char* buf = NEW_ARENA_ARRAY(C->comp_arena(), char, buflen);
 564     debug_name = debug_name_oop->const_oop()->as_instance()->java_lang_String_str(buf, buflen);
 565   }
 566   Node* vcall = make_runtime_call(RC_VECTOR,
 567                                   call_type,
 568                                   entry_addr,
 569                                   debug_name,
 570                                   TypePtr::BOTTOM,
 571                                   opd1,
 572                                   opd2);
 573 
 574   vcall = gvn().transform(new ProjNode(gvn().transform(vcall), TypeFunc::Parms));
 575 
 576   // Wrap it up in VectorBox to keep object type information.
 577   Node* vbox = box_vector(vcall, vbox_type, elem_bt, num_elem);
 578   set_result(vbox);
 579   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
 580   return true;
 581 }
 582 
 583 // <E, M>
 584 // long maskReductionCoerced(int oper, Class<? extends M> maskClass, Class<?> elemClass,
 585 //                          int length, M m, VectorMaskOp<M> defaultImpl)
 586 bool LibraryCallKit::inline_vector_mask_operation() {
 587   const TypeInt*     oper       = gvn().type(argument(0))->isa_int();
 588   const TypeInstPtr* mask_klass = gvn().type(argument(1))->isa_instptr();
 589   const TypeInstPtr* elem_klass = gvn().type(argument(2))->isa_instptr();
 590   const TypeInt*     vlen       = gvn().type(argument(3))->isa_int();
 591   Node*              mask       = argument(4);
 592 
 593   if (mask_klass == nullptr || mask_klass->const_oop() == nullptr ||
 594       elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
 595       vlen       == nullptr || !vlen->is_con() ||
 596       oper       == nullptr || !oper->is_con() ||
 597       mask->is_top()) {
 598     return false; // dead code
 599   }
 600 
 601   if (!is_klass_initialized(mask_klass)) {
 602     log_if_needed("  ** klass argument not initialized");
 603     return false;
 604   }
 605 
 606   int num_elem = vlen->get_con();
 607   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
 608   BasicType elem_bt = elem_type->basic_type();
 609 
 610   int mopc = VectorSupport::vop2ideal(oper->get_con(), elem_bt);
 611   if (!arch_supports_vector(mopc, num_elem, elem_bt, VecMaskUseLoad)) {
 612     log_if_needed("  ** not supported: arity=1 op=cast#%d/3 vlen2=%d etype2=%s",
 613                     mopc, num_elem, type2name(elem_bt));
 614     return false; // not supported
 615   }
 616 
 617   ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
 618   const TypeInstPtr* mask_box_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
 619   Node* mask_vec = unbox_vector(mask, mask_box_type, elem_bt, num_elem);
 620   if (mask_vec == nullptr) {
 621     log_if_needed("  ** unbox failed mask=%s",
 622                       NodeClassNames[argument(4)->Opcode()]);
 623     return false;
 624   }
 625 
 626   if (!Matcher::mask_op_prefers_predicate(mopc, mask_vec->bottom_type()->is_vect())) {
 627     mask_vec = gvn().transform(VectorStoreMaskNode::make(gvn(), mask_vec, elem_bt, num_elem));
 628   }
 629   const Type* maskoper_ty = mopc == Op_VectorMaskToLong ? (const Type*)TypeLong::LONG : (const Type*)TypeInt::INT;
 630   Node* maskoper = gvn().transform(VectorMaskOpNode::make(mask_vec, maskoper_ty, mopc));
 631   if (mopc != Op_VectorMaskToLong) {
 632     maskoper = ConvI2L(maskoper);
 633   }
 634   set_result(maskoper);
 635 
 636   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
 637   return true;
 638 }
 639 
 640 // public static
 641 // <M,
 642 //  S extends VectorSpecies<E>,
 643 //  E>
 644 // M fromBitsCoerced(Class<? extends M> vmClass, Class<E> elementType, int length,
 645 //                    long bits, int mode, S s,
 646 //                    BroadcastOperation<M, E, S> defaultImpl)
 647 bool LibraryCallKit::inline_vector_frombits_coerced() {
 648   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
 649   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
 650   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
 651   const TypeLong*    bits_type    = gvn().type(argument(3))->isa_long();
 652   // Mode argument determines the mode of operation it can take following values:-
 653   // MODE_BROADCAST for vector Vector.broadcast and VectorMask.maskAll operations.
 654   // MODE_BITS_COERCED_LONG_TO_MASK for VectorMask.fromLong operation.
 655   const TypeInt*     mode         = gvn().type(argument(5))->isa_int();
 656 
 657   if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
 658       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
 659       vlen         == nullptr || !vlen->is_con() ||
 660       bits_type    == nullptr ||
 661       mode         == nullptr || !mode->is_con()) {
 662     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s bitwise=%s",
 663                     NodeClassNames[argument(0)->Opcode()],
 664                     NodeClassNames[argument(1)->Opcode()],
 665                     NodeClassNames[argument(2)->Opcode()],
 666                     NodeClassNames[argument(5)->Opcode()]);
 667     return false; // not enough info for intrinsification
 668   }
 669 
 670   if (!is_klass_initialized(vector_klass)) {
 671     log_if_needed("  ** klass argument not initialized");
 672     return false;
 673   }
 674   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
 675   if (!elem_type->is_primitive_type()) {
 676     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
 677     return false; // should be primitive type
 678   }
 679   BasicType elem_bt = elem_type->basic_type();
 680   int num_elem = vlen->get_con();
 681   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
 682   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
 683 
 684   bool is_mask = is_vector_mask(vbox_klass);
 685   int  bcast_mode = mode->get_con();
 686   VectorMaskUseType checkFlags = (VectorMaskUseType)(is_mask ? VecMaskUseAll : VecMaskNotUsed);
 687   int opc = bcast_mode == VectorSupport::MODE_BITS_COERCED_LONG_TO_MASK ? Op_VectorLongToMask : Op_Replicate;
 688 
 689   if (!arch_supports_vector(opc, num_elem, elem_bt, checkFlags, true /*has_scalar_args*/)) {
 690     // If the input long sets or unsets all lanes and Replicate is supported,
 691     // generate a MaskAll or Replicate instead.
 692 
 693     // The "maskAll" API uses the corresponding integer types for floating-point data.
 694     BasicType maskall_bt = elem_bt == T_DOUBLE ? T_LONG : (elem_bt == T_FLOAT ? T_INT: elem_bt);
 695     if (!(opc == Op_VectorLongToMask &&
 696           VectorNode::is_maskall_type(bits_type, num_elem) &&
 697           arch_supports_vector(Op_Replicate, num_elem, maskall_bt, checkFlags, true /*has_scalar_args*/))) {
 698       log_if_needed("  ** not supported: arity=0 op=broadcast vlen=%d etype=%s ismask=%d bcast_mode=%d",
 699                       num_elem, type2name(elem_bt),
 700                       is_mask ? 1 : 0,
 701                       bcast_mode);
 702       return false; // not supported
 703     }
 704   }
 705 
 706   Node* broadcast = nullptr;
 707   Node* bits = argument(3);
 708   Node* elem = bits;
 709 
 710   if (opc == Op_VectorLongToMask) {
 711     const TypeVect* vt = TypeVect::makemask(elem_bt, num_elem);
 712     if (Matcher::mask_op_prefers_predicate(opc, vt)) {
 713       broadcast = gvn().transform(new VectorLongToMaskNode(elem, vt));
 714     } else {
 715       const TypeVect* mvt = TypeVect::make(T_BOOLEAN, num_elem);
 716       broadcast = gvn().transform(new VectorLongToMaskNode(elem, mvt));
 717       broadcast = gvn().transform(new VectorLoadMaskNode(broadcast, vt));
 718     }
 719   } else {
 720     switch (elem_bt) {
 721       case T_BOOLEAN: // fall-through
 722       case T_BYTE:    // fall-through
 723       case T_SHORT:   // fall-through
 724       case T_CHAR:    // fall-through
 725       case T_INT: {
 726         elem = gvn().transform(new ConvL2INode(bits));
 727         break;
 728       }
 729       case T_DOUBLE: {
 730         elem = gvn().transform(new MoveL2DNode(bits));
 731         break;
 732       }
 733       case T_FLOAT: {
 734         bits = gvn().transform(new ConvL2INode(bits));
 735         elem = gvn().transform(new MoveI2FNode(bits));
 736         break;
 737       }
 738       case T_LONG: {
 739         // no conversion needed
 740         break;
 741       }
 742       default: fatal("%s", type2name(elem_bt));
 743     }
 744     broadcast = VectorNode::scalar2vector(elem, num_elem, elem_bt, is_mask);
 745     broadcast = gvn().transform(broadcast);
 746   }
 747 
 748   Node* box = box_vector(broadcast, vbox_type, elem_bt, num_elem);
 749   set_result(box);
 750   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
 751   return true;
 752 }
 753 
 754 static bool elem_consistent_with_arr(BasicType elem_bt, const TypeAryPtr* arr_type, bool mismatched_ms) {
 755   assert(arr_type != nullptr, "unexpected");
 756   BasicType arr_elem_bt = arr_type->elem()->array_element_basic_type();
 757   if (elem_bt == arr_elem_bt) {
 758     return true;
 759   } else if (elem_bt == T_SHORT && arr_elem_bt == T_CHAR) {
 760     // Load/store of short vector from/to char[] is supported
 761     return true;
 762   } else if (elem_bt == T_BYTE && arr_elem_bt == T_BOOLEAN) {
 763     // Load/store of byte vector from/to boolean[] is supported
 764     return true;
 765   } else {
 766     return mismatched_ms;
 767   }
 768 }
 769 
 770 //  public static
 771 //  <C,
 772 //   VM extends VectorPayload,
 773 //   E,
 774 //   S extends VectorSpecies<E>>
 775 //  VM load(Class<? extends VM> vmClass, Class<E> eClass,
 776 //          int length,
 777 //          Object base, long offset,            // Unsafe addressing
 778 //          boolean fromSegment,
 779 //          C container, long index, S s,        // Arguments for default implementation
 780 //          LoadOperation<C, VM, S> defaultImpl) {
 781 //  public static
 782 //  <C,
 783 //   V extends VectorPayload>
 784 //  void store(Class<?> vClass, Class<?> eClass,
 785 //             int length,
 786 //             Object base, long offset,        // Unsafe addressing
 787 //             boolean fromSegment,
 788 //             V v, C container, long index,    // Arguments for default implementation
 789 //             StoreVectorOperation<C, V> defaultImpl) {
 790 bool LibraryCallKit::inline_vector_mem_operation(bool is_store) {
 791   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
 792   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
 793   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
 794   const TypeInt*     from_ms      = gvn().type(argument(6))->isa_int();
 795 
 796   if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
 797       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
 798       vlen         == nullptr || !vlen->is_con() ||
 799       from_ms      == nullptr || !from_ms->is_con()) {
 800     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s from_ms=%s",
 801                     NodeClassNames[argument(0)->Opcode()],
 802                     NodeClassNames[argument(1)->Opcode()],
 803                     NodeClassNames[argument(2)->Opcode()],
 804                     NodeClassNames[argument(6)->Opcode()]);
 805     return false; // not enough info for intrinsification
 806   }
 807   if (!is_klass_initialized(vector_klass)) {
 808     log_if_needed("  ** klass argument not initialized");
 809     return false;
 810   }
 811 
 812   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
 813   if (!elem_type->is_primitive_type()) {
 814     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
 815     return false; // should be primitive type
 816   }
 817   BasicType elem_bt = elem_type->basic_type();
 818   int num_elem = vlen->get_con();
 819 
 820   // TODO When mask usage is supported, VecMaskNotUsed needs to be VecMaskUseLoad.
 821   if (!arch_supports_vector(is_store ? Op_StoreVector : Op_LoadVector, num_elem, elem_bt, VecMaskNotUsed)) {
 822     log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s ismask=no",
 823                     is_store, is_store ? "store" : "load",
 824                     num_elem, type2name(elem_bt));
 825     return false; // not supported
 826   }
 827 
 828   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
 829   bool is_mask = is_vector_mask(vbox_klass);
 830 
 831   Node* base = argument(3);
 832   Node* offset = ConvL2X(argument(4));
 833 
 834   // Save state and restore on bailout
 835   SavedState old_state(this);
 836 
 837   Node* addr = make_unsafe_address(base, offset, (is_mask ? T_BOOLEAN : elem_bt), true);
 838 
 839   // The memory barrier checks are based on ones for unsafe access.
 840   // This is not 1-1 implementation.
 841   const Type *const base_type = gvn().type(base);
 842 
 843   const TypePtr *addr_type = gvn().type(addr)->isa_ptr();
 844   const TypeAryPtr* arr_type = addr_type->isa_aryptr();
 845 
 846   const bool in_native = TypePtr::NULL_PTR == base_type; // base always null
 847   const bool in_heap   = !TypePtr::NULL_PTR->higher_equal(base_type); // base never null
 848 
 849   const bool is_mixed_access = !in_heap && !in_native;
 850 
 851   const bool is_mismatched_access = in_heap && (addr_type->isa_aryptr() == nullptr);
 852 
 853   const bool needs_cpu_membar = is_mixed_access || is_mismatched_access;
 854 
 855   // For non-masked mismatched memory segment vector read/write accesses, intrinsification can continue
 856   // with unknown backing storage type and compiler can skip inserting explicit reinterpretation IR after
 857   // loading from or before storing to backing storage which is mandatory for semantic correctness of
 858   // big-endian memory layout.
 859   bool mismatched_ms = LITTLE_ENDIAN_ONLY(false)
 860       BIG_ENDIAN_ONLY(from_ms->get_con() && !is_mask && arr_type != nullptr &&
 861                       arr_type->elem()->array_element_basic_type() != elem_bt);
 862   BasicType mem_elem_bt = mismatched_ms ? arr_type->elem()->array_element_basic_type() : elem_bt;
 863   if (!is_java_primitive(mem_elem_bt)) {
 864     log_if_needed("  ** non-primitive array element type");
 865     return false;
 866   }
 867   int mem_num_elem = mismatched_ms ? (num_elem * type2aelembytes(elem_bt)) / type2aelembytes(mem_elem_bt) : num_elem;
 868   if (arr_type != nullptr && !is_mask && !elem_consistent_with_arr(elem_bt, arr_type, mismatched_ms)) {
 869     log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s atype=%s ismask=no",
 870                     is_store, is_store ? "store" : "load",
 871                     num_elem, type2name(elem_bt), type2name(arr_type->elem()->array_element_basic_type()));
 872     return false;
 873   }
 874 
 875   // In case of mismatched memory segment accesses, we need to double check that the source type memory operations are supported by backend.
 876   if (mismatched_ms) {
 877     if (is_store) {
 878       if (!arch_supports_vector(Op_StoreVector, num_elem, elem_bt, VecMaskNotUsed)
 879           || !arch_supports_vector(Op_VectorReinterpret, mem_num_elem, mem_elem_bt, VecMaskNotUsed)) {
 880         log_if_needed("  ** not supported: arity=%d op=%s vlen=%d*8 etype=%s/8 ismask=no",
 881                         is_store, "store",
 882                         num_elem, type2name(elem_bt));
 883         return false; // not supported
 884       }
 885     } else {
 886       if (!arch_supports_vector(Op_LoadVector, mem_num_elem, mem_elem_bt, VecMaskNotUsed)
 887           || !arch_supports_vector(Op_VectorReinterpret, num_elem, elem_bt, VecMaskNotUsed)) {
 888         log_if_needed("  ** not supported: arity=%d op=%s vlen=%d*8 etype=%s/8 ismask=no",
 889                         is_store, "load",
 890                         mem_num_elem, type2name(mem_elem_bt));
 891         return false; // not supported
 892       }
 893     }
 894   }
 895   if (is_mask) {
 896     if (!is_store) {
 897       if (!arch_supports_vector(Op_LoadVector, num_elem, elem_bt, VecMaskUseLoad)) {
 898         return false; // not supported
 899       }
 900     } else {
 901       if (!arch_supports_vector(Op_StoreVector, num_elem, elem_bt, VecMaskUseStore)) {
 902         return false; // not supported
 903       }
 904     }
 905   }
 906 
 907   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
 908 
 909   if (needs_cpu_membar) {
 910     insert_mem_bar(Op_MemBarCPUOrder);
 911   }
 912 
 913   if (is_store) {
 914     Node* val = unbox_vector(argument(7), vbox_type, elem_bt, num_elem);
 915     if (val == nullptr) {
 916       return false; // operand unboxing failed
 917     }
 918     set_all_memory(reset_memory());
 919 
 920     // In case the store needs to happen to byte array, reinterpret the incoming vector to byte vector.
 921     int store_num_elem = num_elem;
 922     if (mismatched_ms) {
 923       store_num_elem = mem_num_elem;
 924       const TypeVect* to_vect_type = TypeVect::make(mem_elem_bt, store_num_elem);
 925       val = gvn().transform(new VectorReinterpretNode(val, val->bottom_type()->is_vect(), to_vect_type));
 926     }
 927     if (is_mask) {
 928       val = gvn().transform(VectorStoreMaskNode::make(gvn(), val, elem_bt, num_elem));
 929     }
 930     Node* vstore = gvn().transform(StoreVectorNode::make(0, control(), memory(addr), addr, addr_type, val, store_num_elem));
 931     set_memory(vstore, addr_type);
 932   } else {
 933     // When using byte array, we need to load as byte then reinterpret the value. Otherwise, do a simple vector load.
 934     Node* vload = nullptr;
 935     if (mismatched_ms) {
 936       vload = gvn().transform(LoadVectorNode::make(0, control(), memory(addr), addr, addr_type, mem_num_elem, mem_elem_bt));
 937       const TypeVect* to_vect_type = TypeVect::make(elem_bt, num_elem);
 938       vload = gvn().transform(new VectorReinterpretNode(vload, vload->bottom_type()->is_vect(), to_vect_type));
 939     } else {
 940       // Special handle for masks
 941       if (is_mask) {
 942         vload = gvn().transform(LoadVectorNode::make(0, control(), memory(addr), addr, addr_type, num_elem, T_BOOLEAN));
 943         vload = gvn().transform(new VectorLoadMaskNode(vload, TypeVect::makemask(elem_bt, num_elem)));
 944       } else {
 945         vload = gvn().transform(LoadVectorNode::make(0, control(), memory(addr), addr, addr_type, num_elem, elem_bt));
 946       }
 947     }
 948     Node* box = box_vector(vload, vbox_type, elem_bt, num_elem);
 949     set_result(box);
 950   }
 951 
 952   old_state.discard();
 953 
 954   if (needs_cpu_membar) {
 955     insert_mem_bar(Op_MemBarCPUOrder);
 956   }
 957 
 958   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
 959   return true;
 960 }
 961 
 962 //  public static
 963 //  <C,
 964 //   V extends Vector<?>,
 965 //   E,
 966 //   S extends VectorSpecies<E>,
 967 //   M extends VectorMask<E>>
 968 //  V loadMasked(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass,
 969 //               int length, Object base, long offset,          // Unsafe addressing
 970 //               boolean fromSegment,
 971 //               M m, int offsetInRange,
 972 //               C container, long index, S s,                  // Arguments for default implementation
 973 //               LoadVectorMaskedOperation<C, V, S, M> defaultImpl) {
 974 //  public static
 975 //  <C,
 976 //   V extends Vector<E>,
 977 //   M extends VectorMask<E>,
 978 //   E>
 979 //  void storeMasked(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass,
 980 //                   int length,
 981 //                   Object base, long offset,                  // Unsafe addressing
 982 //                   boolean fromSegment,
 983 //                   V v, M m, C container, long index,         // Arguments for default implementation
 984 //                   StoreVectorMaskedOperation<C, V, M> defaultImpl) {
 985 
 986 bool LibraryCallKit::inline_vector_mem_masked_operation(bool is_store) {
 987   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
 988   const TypeInstPtr* mask_klass   = gvn().type(argument(1))->isa_instptr();
 989   const TypeInstPtr* elem_klass   = gvn().type(argument(2))->isa_instptr();
 990   const TypeInt*     vlen         = gvn().type(argument(3))->isa_int();
 991   const TypeInt*     from_ms      = gvn().type(argument(7))->isa_int();
 992 
 993   if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
 994       mask_klass   == nullptr || mask_klass->const_oop()   == nullptr ||
 995       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
 996       vlen         == nullptr || !vlen->is_con() ||
 997       from_ms      == nullptr || !from_ms->is_con()) {
 998     log_if_needed("  ** missing constant: vclass=%s mclass=%s etype=%s vlen=%s from_ms=%s",
 999                     NodeClassNames[argument(0)->Opcode()],
1000                     NodeClassNames[argument(1)->Opcode()],
1001                     NodeClassNames[argument(2)->Opcode()],
1002                     NodeClassNames[argument(3)->Opcode()],
1003                     NodeClassNames[argument(7)->Opcode()]);
1004     return false; // not enough info for intrinsification
1005   }
1006   if (!is_klass_initialized(vector_klass)) {
1007     log_if_needed("  ** klass argument not initialized");
1008     return false;
1009   }
1010 
1011   if (!is_klass_initialized(mask_klass)) {
1012     log_if_needed("  ** mask klass argument not initialized");
1013     return false;
1014   }
1015 
1016   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1017   if (!elem_type->is_primitive_type()) {
1018     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1019     return false; // should be primitive type
1020   }
1021 
1022   BasicType elem_bt = elem_type->basic_type();
1023   int num_elem = vlen->get_con();
1024 
1025   Node* base = argument(4);
1026   Node* offset = ConvL2X(argument(5));
1027 
1028   // Save state and restore on bailout
1029   SavedState old_state(this);
1030 
1031   Node* addr = make_unsafe_address(base, offset, elem_bt, true);
1032   const TypePtr *addr_type = gvn().type(addr)->isa_ptr();
1033   const TypeAryPtr* arr_type = addr_type->isa_aryptr();
1034 
1035   bool mismatched_ms = from_ms->get_con() && arr_type != nullptr && arr_type->elem()->array_element_basic_type() != elem_bt;
1036   BIG_ENDIAN_ONLY(if (mismatched_ms) return false;)
1037   // If there is no consistency between array and vector element types, it must be special byte array case
1038   if (arr_type != nullptr && !elem_consistent_with_arr(elem_bt, arr_type, mismatched_ms)) {
1039     log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s atype=%s",
1040                     is_store, is_store ? "storeMasked" : "loadMasked",
1041                     num_elem, type2name(elem_bt), type2name(arr_type->elem()->array_element_basic_type()));
1042     return false;
1043   }
1044 
1045   int mem_num_elem = mismatched_ms ? num_elem * type2aelembytes(elem_bt) : num_elem;
1046   BasicType mem_elem_bt = mismatched_ms ? T_BYTE : elem_bt;
1047   bool supports_predicate = arch_supports_vector(is_store ? Op_StoreVectorMasked : Op_LoadVectorMasked,
1048                                                 mem_num_elem, mem_elem_bt, VecMaskUseLoad);
1049 
1050   // If current arch does not support the predicated operations, we have to bail
1051   // out when current case uses the predicate feature.
1052   if (!supports_predicate) {
1053     bool needs_predicate = false;
1054     if (is_store) {
1055       // Masked vector store always uses the predicated store.
1056       needs_predicate = true;
1057     } else {
1058       // Masked vector load with IOOBE always uses the predicated load.
1059       const TypeInt* offset_in_range = gvn().type(argument(9))->isa_int();
1060       if (!offset_in_range->is_con()) {
1061         log_if_needed("  ** missing constant: offsetInRange=%s",
1062                         NodeClassNames[argument(8)->Opcode()]);
1063         return false;
1064       }
1065       needs_predicate = (offset_in_range->get_con() == 0);
1066     }
1067 
1068     if (needs_predicate) {
1069       log_if_needed("  ** not supported: op=%s vlen=%d etype=%s mismatched_ms=%d",
1070                       is_store ? "storeMasked" : "loadMasked",
1071                       num_elem, type2name(elem_bt), mismatched_ms ? 1 : 0);
1072       return false;
1073     }
1074   }
1075 
1076   // This only happens for masked vector load. If predicate is not supported, then check whether
1077   // the normal vector load and blend operations are supported by backend.
1078   if (!supports_predicate && (!arch_supports_vector(Op_LoadVector, mem_num_elem, mem_elem_bt, VecMaskNotUsed) ||
1079       !arch_supports_vector(Op_VectorBlend, mem_num_elem, mem_elem_bt, VecMaskUseLoad))) {
1080     log_if_needed("  ** not supported: op=loadMasked vlen=%d etype=%s mismatched_ms=%d",
1081                     num_elem, type2name(elem_bt), mismatched_ms ? 1 : 0);
1082     return false;
1083   }
1084 
1085   // Since we are using byte array, we need to double check that the vector reinterpret operation
1086   // with byte type is supported by backend.
1087   if (mismatched_ms) {
1088     if (!arch_supports_vector(Op_VectorReinterpret, mem_num_elem, T_BYTE, VecMaskNotUsed)) {
1089       log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s mismatched_ms=1",
1090                       is_store, is_store ? "storeMasked" : "loadMasked",
1091                       num_elem, type2name(elem_bt));
1092       return false;
1093     }
1094   }
1095 
1096   // Since it needs to unbox the mask, we need to double check that the related load operations
1097   // for mask are supported by backend.
1098   if (!arch_supports_vector(Op_LoadVector, num_elem, elem_bt, VecMaskUseLoad)) {
1099     log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s",
1100                       is_store, is_store ? "storeMasked" : "loadMasked",
1101                       num_elem, type2name(elem_bt));
1102     return false;
1103   }
1104 
1105   // Can base be null? Otherwise, always on-heap access.
1106   bool can_access_non_heap = TypePtr::NULL_PTR->higher_equal(gvn().type(base));
1107   if (can_access_non_heap) {
1108     insert_mem_bar(Op_MemBarCPUOrder);
1109   }
1110 
1111   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1112   ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1113   assert(!is_vector_mask(vbox_klass) && is_vector_mask(mbox_klass), "Invalid class type");
1114   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1115   const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1116 
1117   Node* mask = unbox_vector(is_store ? argument(9) : argument(8), mbox_type, elem_bt, num_elem);
1118   if (mask == nullptr) {
1119     log_if_needed("  ** unbox failed mask=%s",
1120                     is_store ? NodeClassNames[argument(9)->Opcode()]
1121                              : NodeClassNames[argument(8)->Opcode()]);
1122     return false;
1123   }
1124 
1125   if (is_store) {
1126     Node* val = unbox_vector(argument(8), vbox_type, elem_bt, num_elem);
1127     if (val == nullptr) {
1128       log_if_needed("  ** unbox failed vector=%s",
1129                       NodeClassNames[argument(8)->Opcode()]);
1130       return false; // operand unboxing failed
1131     }
1132     set_all_memory(reset_memory());
1133 
1134     if (mismatched_ms) {
1135       // Reinterpret the incoming vector to byte vector.
1136       const TypeVect* to_vect_type = TypeVect::make(mem_elem_bt, mem_num_elem);
1137       val = gvn().transform(new VectorReinterpretNode(val, val->bottom_type()->is_vect(), to_vect_type));
1138       // Reinterpret the vector mask to byte type.
1139       const TypeVect* from_mask_type = TypeVect::makemask(elem_bt, num_elem);
1140       const TypeVect* to_mask_type = TypeVect::makemask(mem_elem_bt, mem_num_elem);
1141       mask = gvn().transform(new VectorReinterpretNode(mask, from_mask_type, to_mask_type));
1142     }
1143     Node* vstore = gvn().transform(new StoreVectorMaskedNode(control(), memory(addr), addr, val, addr_type, mask));
1144     set_memory(vstore, addr_type);
1145   } else {
1146     Node* vload = nullptr;
1147 
1148     if (mismatched_ms) {
1149       // Reinterpret the vector mask to byte type.
1150       const TypeVect* from_mask_type = TypeVect::makemask(elem_bt, num_elem);
1151       const TypeVect* to_mask_type = TypeVect::makemask(mem_elem_bt, mem_num_elem);
1152       mask = gvn().transform(new VectorReinterpretNode(mask, from_mask_type, to_mask_type));
1153     }
1154 
1155     if (supports_predicate) {
1156       // Generate masked load vector node if predicate feature is supported.
1157       const TypeVect* vt = TypeVect::make(mem_elem_bt, mem_num_elem);
1158       vload = gvn().transform(new LoadVectorMaskedNode(control(), memory(addr), addr, addr_type, vt, mask));
1159     } else {
1160       // Use the vector blend to implement the masked load vector. The biased elements are zeros.
1161       Node* zero = gvn().transform(gvn().zerocon(mem_elem_bt));
1162       zero = gvn().transform(VectorNode::scalar2vector(zero, mem_num_elem, mem_elem_bt));
1163       vload = gvn().transform(LoadVectorNode::make(0, control(), memory(addr), addr, addr_type, mem_num_elem, mem_elem_bt));
1164       vload = gvn().transform(new VectorBlendNode(zero, vload, mask));
1165     }
1166 
1167     if (mismatched_ms) {
1168       const TypeVect* to_vect_type = TypeVect::make(elem_bt, num_elem);
1169       vload = gvn().transform(new VectorReinterpretNode(vload, vload->bottom_type()->is_vect(), to_vect_type));
1170     }
1171 
1172     Node* box = box_vector(vload, vbox_type, elem_bt, num_elem);
1173     set_result(box);
1174   }
1175 
1176   old_state.discard();
1177 
1178   if (can_access_non_heap) {
1179     insert_mem_bar(Op_MemBarCPUOrder);
1180   }
1181 
1182   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1183   return true;
1184 }
1185 
1186 //
1187 //  <C,
1188 //   V extends Vector<?>,
1189 //   W extends Vector<Integer>,
1190 //   S extends VectorSpecies<E>,
1191 //   M extends VectorMask<E>,
1192 //   E>
1193 //   V loadWithMap(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass, int length,
1194 //                 Class<? extends Vector<Integer>> vectorIndexClass, int indexLength,
1195 //                 Object base, long offset,
1196 //                 W indexVector1, W indexVector2, W indexVector3, W indexVector4,
1197 //                 M m, C container, int index, int[] indexMap, int indexM, S s,
1198 //                 LoadVectorOperationWithMap<C, V, S, M> defaultImpl)
1199 //
1200 //  <C,
1201 //   V extends Vector<E>,
1202 //   W extends Vector<Integer>,
1203 //   M extends VectorMask<E>,
1204 //   E>
1205 //   void storeWithMap(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass, int length,
1206 //                     Class<? extends Vector<Integer>> vectorIndexClass, int indexLength,
1207 //                     Object base, long offset, // Unsafe addressing
1208 //                     W indexVector, V v, M m,
1209 //                     C container, int index, int[] indexMap, int indexM, // Arguments for default implementation
1210 //                     StoreVectorOperationWithMap<C, V, M> defaultImpl)
1211 //
1212 bool LibraryCallKit::inline_vector_gather_scatter(bool is_scatter) {
1213   const TypeInstPtr* vector_klass     = gvn().type(argument(0))->isa_instptr();
1214   const TypeInstPtr* mask_klass       = gvn().type(argument(1))->isa_instptr();
1215   const TypeInstPtr* elem_klass       = gvn().type(argument(2))->isa_instptr();
1216   const TypeInt*     vlen             = gvn().type(argument(3))->isa_int();
1217   const TypeInstPtr* vector_idx_klass = gvn().type(argument(4))->isa_instptr();
1218   const TypeInt*     idx_vlen         = gvn().type(argument(5))->isa_int();
1219 
1220   if (vector_klass     == nullptr || vector_klass->const_oop()     == nullptr ||
1221       elem_klass       == nullptr || elem_klass->const_oop()       == nullptr ||
1222       vlen             == nullptr || !vlen->is_con() ||
1223       vector_idx_klass == nullptr || vector_idx_klass->const_oop() == nullptr ||
1224       idx_vlen         == nullptr || !idx_vlen->is_con()) {
1225     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s viclass=%s idx_vlen=%s",
1226                     NodeClassNames[argument(0)->Opcode()],
1227                     NodeClassNames[argument(2)->Opcode()],
1228                     NodeClassNames[argument(3)->Opcode()],
1229                     NodeClassNames[argument(4)->Opcode()],
1230                     NodeClassNames[argument(5)->Opcode()]);
1231     return false; // not enough info for intrinsification
1232   }
1233 
1234   if (!is_klass_initialized(vector_klass) || !is_klass_initialized(vector_idx_klass)) {
1235     log_if_needed("  ** klass argument not initialized");
1236     return false;
1237   }
1238 
1239   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1240   if (!elem_type->is_primitive_type()) {
1241     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1242     return false; // should be primitive type
1243   }
1244 
1245   BasicType elem_bt = elem_type->basic_type();
1246   int num_elem = vlen->get_con();
1247   int idx_num_elem = idx_vlen->get_con();
1248 
1249   Node* m = is_scatter ? argument(11) : argument(13);
1250   const Type* vmask_type = gvn().type(m);
1251   bool is_masked_op = vmask_type != TypePtr::NULL_PTR;
1252   if (is_masked_op) {
1253     if (mask_klass == nullptr || mask_klass->const_oop() == nullptr) {
1254       log_if_needed("  ** missing constant: maskclass=%s", NodeClassNames[argument(1)->Opcode()]);
1255       return false; // not enough info for intrinsification
1256     }
1257 
1258     if (!is_klass_initialized(mask_klass)) {
1259       log_if_needed("  ** mask klass argument not initialized");
1260       return false;
1261     }
1262 
1263     if (vmask_type->maybe_null()) {
1264       log_if_needed("  ** null mask values are not allowed for masked op");
1265       return false;
1266     }
1267 
1268     // Check whether the predicated gather/scatter node is supported by architecture.
1269     VectorMaskUseType mask = (VectorMaskUseType) (VecMaskUseLoad | VecMaskUsePred);
1270     if (!arch_supports_vector(is_scatter ? Op_StoreVectorScatterMasked : Op_LoadVectorGatherMasked, num_elem, elem_bt, mask)) {
1271       log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s is_masked_op=1",
1272                       is_scatter, is_scatter ? "scatterMasked" : "gatherMasked",
1273                       num_elem, type2name(elem_bt));
1274       return false; // not supported
1275     }
1276   } else {
1277     // Check whether the normal gather/scatter node is supported for non-masked operation.
1278     if (!arch_supports_vector(is_scatter ? Op_StoreVectorScatter : Op_LoadVectorGather, num_elem, elem_bt, VecMaskNotUsed)) {
1279       log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s is_masked_op=0",
1280                       is_scatter, is_scatter ? "scatter" : "gather",
1281                       num_elem, type2name(elem_bt));
1282       return false; // not supported
1283     }
1284   }
1285 
1286   // Check that the vector holding indices is supported by architecture
1287   // For sub-word gathers expander receive index array.
1288   if (!is_subword_type(elem_bt) && !arch_supports_vector(Op_LoadVector, idx_num_elem, T_INT, VecMaskNotUsed)) {
1289     log_if_needed("  ** not supported: arity=%d op=%s/loadindex vlen=%d etype=int is_masked_op=%d",
1290                   is_scatter, is_scatter ? "scatter" : "gather",
1291                   idx_num_elem, is_masked_op ? 1 : 0);
1292     return false; // not supported
1293   }
1294 
1295   Node* base = argument(6);
1296   Node* offset = ConvL2X(argument(7));
1297 
1298   // Save state and restore on bailout
1299   SavedState old_state(this);
1300 
1301   Node* addr = nullptr;
1302   if (!is_subword_type(elem_bt)) {
1303     addr = make_unsafe_address(base, offset, elem_bt, true);
1304   } else {
1305     assert(!is_scatter, "Only supports gather operation for subword types now");
1306     uint header = arrayOopDesc::base_offset_in_bytes(elem_bt);
1307     assert(offset->is_Con() && offset->bottom_type()->is_long()->get_con() == header,
1308            "offset must be the array base offset");
1309     Node* index = argument(15);
1310     addr = array_element_address(base, index, elem_bt);
1311   }
1312 
1313   const TypePtr* addr_type = gvn().type(addr)->isa_ptr();
1314   const TypeAryPtr* arr_type = addr_type->isa_aryptr();
1315 
1316   // The array must be consistent with vector type
1317   if (arr_type == nullptr || (arr_type != nullptr && !elem_consistent_with_arr(elem_bt, arr_type, false))) {
1318     log_if_needed("  ** not supported: arity=%d op=%s vlen=%d etype=%s atype=%s ismask=no",
1319                     is_scatter, is_scatter ? "scatter" : "gather",
1320                     num_elem, type2name(elem_bt), type2name(arr_type->elem()->array_element_basic_type()));
1321     return false;
1322   }
1323 
1324   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1325   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1326   ciKlass* vbox_idx_klass = vector_idx_klass->const_oop()->as_instance()->java_lang_Class_klass();
1327   if (vbox_idx_klass == nullptr) {
1328     return false;
1329   }
1330 
1331   // Get the indexes for gather/scatter.
1332   Node* indexes = nullptr;
1333   const TypeInstPtr* vbox_idx_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_idx_klass);
1334   if (is_subword_type(elem_bt)) {
1335     Node* indexMap = argument(16);
1336     Node* indexM   = argument(17);
1337     indexes = array_element_address(indexMap, indexM, T_INT);
1338   } else {
1339     // Get the first index vector.
1340     indexes = unbox_vector(argument(9), vbox_idx_type, T_INT, idx_num_elem);
1341     if (indexes == nullptr) {
1342       return false;
1343     }
1344   }
1345 
1346   // Get the vector mask value.
1347   Node* mask = nullptr;
1348   if (is_masked_op) {
1349     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1350     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1351     mask = unbox_vector(m, mbox_type, elem_bt, num_elem);
1352     if (mask == nullptr) {
1353       log_if_needed("  ** unbox failed mask=%s", NodeClassNames[m->Opcode()]);
1354       return false;
1355     }
1356   }
1357 
1358   const TypeVect* vector_type = TypeVect::make(elem_bt, num_elem);
1359   if (is_scatter) {
1360     Node* val = unbox_vector(argument(10), vbox_type, elem_bt, num_elem);
1361     if (val == nullptr) {
1362       return false; // operand unboxing failed
1363     }
1364     set_all_memory(reset_memory());
1365 
1366     Node* vstore = nullptr;
1367     if (mask != nullptr) {
1368       vstore = gvn().transform(new StoreVectorScatterMaskedNode(control(), memory(addr), addr, addr_type, val, indexes, mask));
1369     } else {
1370       vstore = gvn().transform(new StoreVectorScatterNode(control(), memory(addr), addr, addr_type, val, indexes));
1371     }
1372     set_memory(vstore, addr_type);
1373   } else {
1374     Node* vload = nullptr;
1375     if (mask != nullptr) {
1376       vload = gvn().transform(new LoadVectorGatherMaskedNode(control(), memory(addr), addr, addr_type, vector_type, indexes, mask));
1377     } else {
1378       vload = gvn().transform(new LoadVectorGatherNode(control(), memory(addr), addr, addr_type, vector_type, indexes));
1379     }
1380     Node* box = box_vector(vload, vbox_type, elem_bt, num_elem);
1381     set_result(box);
1382   }
1383 
1384   old_state.discard();
1385   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1386   return true;
1387 }
1388 
1389 // public static
1390 // <V extends Vector<E>,
1391 //  M extends VectorMask<E>,
1392 //  E>
1393 // long reductionCoerced(int oprId, Class<? extends V> vectorClass, Class<? extends M> maskClass,
1394 //                       Class<E> elementType, int length, V v, M m,
1395 //                       ReductionOperation<V, M> defaultImpl)
1396 bool LibraryCallKit::inline_vector_reduction() {
1397   const TypeInt*     opr          = gvn().type(argument(0))->isa_int();
1398   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
1399   const TypeInstPtr* mask_klass   = gvn().type(argument(2))->isa_instptr();
1400   const TypeInstPtr* elem_klass   = gvn().type(argument(3))->isa_instptr();
1401   const TypeInt*     vlen         = gvn().type(argument(4))->isa_int();
1402 
1403   if (opr          == nullptr || !opr->is_con() ||
1404       vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1405       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
1406       vlen         == nullptr || !vlen->is_con()) {
1407     log_if_needed("  ** missing constant: opr=%s vclass=%s etype=%s vlen=%s",
1408                     NodeClassNames[argument(0)->Opcode()],
1409                     NodeClassNames[argument(1)->Opcode()],
1410                     NodeClassNames[argument(3)->Opcode()],
1411                     NodeClassNames[argument(4)->Opcode()]);
1412     return false; // not enough info for intrinsification
1413   }
1414   if (!is_klass_initialized(vector_klass)) {
1415     log_if_needed("  ** klass argument not initialized");
1416     return false;
1417   }
1418   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1419   if (!elem_type->is_primitive_type()) {
1420     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1421     return false; // should be primitive type
1422   }
1423 
1424   const Type* vmask_type = gvn().type(argument(6));
1425   bool is_masked_op = vmask_type != TypePtr::NULL_PTR;
1426   if (is_masked_op) {
1427     if (mask_klass == nullptr || mask_klass->const_oop() == nullptr) {
1428       log_if_needed("  ** missing constant: maskclass=%s", NodeClassNames[argument(2)->Opcode()]);
1429       return false; // not enough info for intrinsification
1430     }
1431 
1432     if (!is_klass_initialized(mask_klass)) {
1433       log_if_needed("  ** mask klass argument not initialized");
1434       return false;
1435     }
1436 
1437     if (vmask_type->maybe_null()) {
1438       log_if_needed("  ** null mask values are not allowed for masked op");
1439       return false;
1440     }
1441   }
1442 
1443   BasicType elem_bt = elem_type->basic_type();
1444   int num_elem = vlen->get_con();
1445   int opc  = VectorSupport::vop2ideal(opr->get_con(), elem_bt);
1446   int sopc = ReductionNode::opcode(opc, elem_bt);
1447 
1448   // Ensure reduction operation for lanewise operation
1449   // When using mask, mask use type needs to be VecMaskUseLoad.
1450   if (sopc == opc || !arch_supports_vector(sopc, num_elem, elem_bt, is_masked_op ? VecMaskUseLoad : VecMaskNotUsed)) {
1451     log_if_needed("  ** not supported: arity=1 op=%d/reduce vlen=%d etype=%s is_masked_op=%d",
1452                     sopc, num_elem, type2name(elem_bt), is_masked_op ? 1 : 0);
1453     return false;
1454   }
1455 
1456   // Return true if current platform has implemented the masked operation with predicate feature.
1457   bool use_predicate = is_masked_op && arch_supports_vector(sopc, num_elem, elem_bt, VecMaskUsePred);
1458   if (is_masked_op && !use_predicate && !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)) {
1459     log_if_needed("  ** not supported: arity=1 op=%d/reduce vlen=%d etype=%s is_masked_op=1",
1460                     sopc, num_elem, type2name(elem_bt));
1461     return false;
1462   }
1463 
1464   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1465   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1466 
1467   Node* opd = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1468   if (opd == nullptr) {
1469     return false; // operand unboxing failed
1470   }
1471 
1472   Node* mask = nullptr;
1473   if (is_masked_op) {
1474     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1475     assert(is_vector_mask(mbox_klass), "argument(2) should be a mask class");
1476     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1477     mask = unbox_vector(argument(6), mbox_type, elem_bt, num_elem);
1478     if (mask == nullptr) {
1479       log_if_needed("  ** unbox failed mask=%s",
1480                       NodeClassNames[argument(6)->Opcode()]);
1481       return false;
1482     }
1483   }
1484 
1485   Node* init = ReductionNode::make_identity_con_scalar(gvn(), opc, elem_bt);
1486   Node* value = opd;
1487 
1488   assert(mask != nullptr || !is_masked_op, "Masked op needs the mask value never null");
1489   if (mask != nullptr && !use_predicate) {
1490     Node* reduce_identity = gvn().transform(VectorNode::scalar2vector(init, num_elem, elem_bt));
1491     value = gvn().transform(new VectorBlendNode(reduce_identity, value, mask));
1492   }
1493 
1494   // Make an unordered Reduction node. This affects only AddReductionVF/VD and MulReductionVF/VD,
1495   // as these operations are allowed to be associative (not requiring strict order) in VectorAPI.
1496   value = ReductionNode::make(opc, nullptr, init, value, elem_bt, /* requires_strict_order */ false);
1497 
1498   if (mask != nullptr && use_predicate) {
1499     value->add_req(mask);
1500     value->add_flag(Node::Flag_is_predicated_vector);
1501   }
1502 
1503   value = gvn().transform(value);
1504 
1505   Node* bits = nullptr;
1506   switch (elem_bt) {
1507     case T_BYTE:
1508     case T_SHORT:
1509     case T_INT: {
1510       bits = gvn().transform(new ConvI2LNode(value));
1511       break;
1512     }
1513     case T_FLOAT: {
1514       value = gvn().transform(new MoveF2INode(value));
1515       bits  = gvn().transform(new ConvI2LNode(value));
1516       break;
1517     }
1518     case T_DOUBLE: {
1519       bits = gvn().transform(new MoveD2LNode(value));
1520       break;
1521     }
1522     case T_LONG: {
1523       bits = value; // no conversion needed
1524       break;
1525     }
1526     default: fatal("%s", type2name(elem_bt));
1527   }
1528   set_result(bits);
1529   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1530   return true;
1531 }
1532 
1533 // public static <V> boolean test(int cond, Class<?> vectorClass, Class<?> elementType, int vlen,
1534 //                                V v1, V v2,
1535 //                                BiFunction<V, V, Boolean> defaultImpl)
1536 //
1537 bool LibraryCallKit::inline_vector_test() {
1538   const TypeInt*     cond         = gvn().type(argument(0))->isa_int();
1539   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
1540   const TypeInstPtr* elem_klass   = gvn().type(argument(2))->isa_instptr();
1541   const TypeInt*     vlen         = gvn().type(argument(3))->isa_int();
1542 
1543   if (cond         == nullptr || !cond->is_con() ||
1544       vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
1545       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
1546       vlen         == nullptr || !vlen->is_con()) {
1547     log_if_needed("  ** missing constant: cond=%s vclass=%s etype=%s vlen=%s",
1548                     NodeClassNames[argument(0)->Opcode()],
1549                     NodeClassNames[argument(1)->Opcode()],
1550                     NodeClassNames[argument(2)->Opcode()],
1551                     NodeClassNames[argument(3)->Opcode()]);
1552     return false; // not enough info for intrinsification
1553   }
1554   if (!is_klass_initialized(vector_klass)) {
1555     log_if_needed("  ** klass argument not initialized");
1556     return false;
1557   }
1558   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1559   if (!elem_type->is_primitive_type()) {
1560     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1561     return false; // should be primitive type
1562   }
1563   BasicType elem_bt = elem_type->basic_type();
1564   int num_elem = vlen->get_con();
1565   BoolTest::mask booltest = (BoolTest::mask)cond->get_con();
1566   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1567   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1568 
1569   if (!arch_supports_vector(Op_VectorTest, num_elem, elem_bt, is_vector_mask(vbox_klass) ? VecMaskUseLoad : VecMaskNotUsed)) {
1570     log_if_needed("  ** not supported: arity=2 op=test/%d vlen=%d etype=%s ismask=%d",
1571                     cond->get_con(), num_elem, type2name(elem_bt),
1572                     is_vector_mask(vbox_klass));
1573     return false;
1574   }
1575 
1576   Node* opd1 = unbox_vector(argument(4), vbox_type, elem_bt, num_elem);
1577   Node* opd2;
1578   if (Matcher::vectortest_needs_second_argument(booltest == BoolTest::overflow,
1579                                                 opd1->bottom_type()->isa_vectmask())) {
1580     opd2 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1581   } else {
1582     opd2 = opd1;
1583   }
1584   if (opd1 == nullptr || opd2 == nullptr) {
1585     return false; // operand unboxing failed
1586   }
1587 
1588   Node* cmp = gvn().transform(new VectorTestNode(opd1, opd2, booltest));
1589   BoolTest::mask test = Matcher::vectortest_mask(booltest == BoolTest::overflow,
1590                                                  opd1->bottom_type()->isa_vectmask(), num_elem);
1591   Node* bol = gvn().transform(new BoolNode(cmp, test));
1592   Node* res = gvn().transform(new CMoveINode(bol, gvn().intcon(0), gvn().intcon(1), TypeInt::BOOL));
1593 
1594   set_result(res);
1595   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1596   return true;
1597 }
1598 
1599 // public static
1600 // <V extends Vector<E>,
1601 //  M extends VectorMask<E>,
1602 //  E>
1603 // V blend(Class<? extends V> vectorClass, Class<M> maskClass, Class<E> elementType, int vlen,
1604 //         V v1, V v2, M m,
1605 //         VectorBlendOp<V, M, E> defaultImpl)
1606 bool LibraryCallKit::inline_vector_blend() {
1607   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
1608   const TypeInstPtr* mask_klass   = gvn().type(argument(1))->isa_instptr();
1609   const TypeInstPtr* elem_klass   = gvn().type(argument(2))->isa_instptr();
1610   const TypeInt*     vlen         = gvn().type(argument(3))->isa_int();
1611 
1612   if (mask_klass == nullptr || vector_klass == nullptr || elem_klass == nullptr || vlen == nullptr) {
1613     return false; // dead code
1614   }
1615   if (mask_klass->const_oop() == nullptr || vector_klass->const_oop() == nullptr ||
1616       elem_klass->const_oop() == nullptr || !vlen->is_con()) {
1617     log_if_needed("  ** missing constant: vclass=%s mclass=%s etype=%s vlen=%s",
1618                     NodeClassNames[argument(0)->Opcode()],
1619                     NodeClassNames[argument(1)->Opcode()],
1620                     NodeClassNames[argument(2)->Opcode()],
1621                     NodeClassNames[argument(3)->Opcode()]);
1622     return false; // not enough info for intrinsification
1623   }
1624   if (!is_klass_initialized(vector_klass) || !is_klass_initialized(mask_klass)) {
1625     log_if_needed("  ** klass argument not initialized");
1626     return false;
1627   }
1628   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1629   if (!elem_type->is_primitive_type()) {
1630     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1631     return false; // should be primitive type
1632   }
1633   BasicType elem_bt = elem_type->basic_type();
1634   BasicType mask_bt = elem_bt;
1635   int num_elem = vlen->get_con();
1636 
1637   if (!arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)) {
1638     log_if_needed("  ** not supported: arity=2 op=blend vlen=%d etype=%s ismask=useload",
1639                     num_elem, type2name(elem_bt));
1640     return false; // not supported
1641   }
1642   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1643   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1644 
1645   ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1646   const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1647 
1648   Node* v1   = unbox_vector(argument(4), vbox_type, elem_bt, num_elem);
1649   Node* v2   = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1650   Node* mask = unbox_vector(argument(6), mbox_type, mask_bt, num_elem);
1651 
1652   if (v1 == nullptr || v2 == nullptr || mask == nullptr) {
1653     return false; // operand unboxing failed
1654   }
1655 
1656   Node* blend = gvn().transform(new VectorBlendNode(v1, v2, mask));
1657 
1658   Node* box = box_vector(blend, vbox_type, elem_bt, num_elem);
1659   set_result(box);
1660   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1661   return true;
1662 }
1663 
1664 //  public static
1665 //  <V extends Vector<E>,
1666 //   M extends VectorMask<E>,
1667 //   E>
1668 //  M compare(int cond, Class<? extends V> vectorClass, Class<M> maskClass, Class<E> elementType, int vlen,
1669 //            V v1, V v2, M m,
1670 //            VectorCompareOp<V,M> defaultImpl)
1671 bool LibraryCallKit::inline_vector_compare() {
1672   const TypeInt*     cond         = gvn().type(argument(0))->isa_int();
1673   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
1674   const TypeInstPtr* mask_klass   = gvn().type(argument(2))->isa_instptr();
1675   const TypeInstPtr* elem_klass   = gvn().type(argument(3))->isa_instptr();
1676   const TypeInt*     vlen         = gvn().type(argument(4))->isa_int();
1677 
1678   if (cond == nullptr || vector_klass == nullptr || mask_klass == nullptr || elem_klass == nullptr || vlen == nullptr) {
1679     return false; // dead code
1680   }
1681   if (!cond->is_con() || vector_klass->const_oop() == nullptr || mask_klass->const_oop() == nullptr ||
1682       elem_klass->const_oop() == nullptr || !vlen->is_con()) {
1683     log_if_needed("  ** missing constant: cond=%s vclass=%s mclass=%s etype=%s vlen=%s",
1684                     NodeClassNames[argument(0)->Opcode()],
1685                     NodeClassNames[argument(1)->Opcode()],
1686                     NodeClassNames[argument(2)->Opcode()],
1687                     NodeClassNames[argument(3)->Opcode()],
1688                     NodeClassNames[argument(4)->Opcode()]);
1689     return false; // not enough info for intrinsification
1690   }
1691   if (!is_klass_initialized(vector_klass) || !is_klass_initialized(mask_klass)) {
1692     log_if_needed("  ** klass argument not initialized");
1693     return false;
1694   }
1695   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1696   if (!elem_type->is_primitive_type()) {
1697     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1698     return false; // should be primitive type
1699   }
1700 
1701   int num_elem = vlen->get_con();
1702   BasicType elem_bt = elem_type->basic_type();
1703   BasicType mask_bt = elem_bt;
1704 
1705   if ((cond->get_con() & BoolTest::unsigned_compare) != 0) {
1706     if (!Matcher::supports_vector_comparison_unsigned(num_elem, elem_bt)) {
1707       log_if_needed("  ** not supported: unsigned comparison op=comp/%d vlen=%d etype=%s ismask=usestore",
1708                       cond->get_con() & (BoolTest::unsigned_compare - 1), num_elem, type2name(elem_bt));
1709       return false;
1710     }
1711   }
1712 
1713   if (!arch_supports_vector(Op_VectorMaskCmp, num_elem, elem_bt, VecMaskUseStore)) {
1714     log_if_needed("  ** not supported: arity=2 op=comp/%d vlen=%d etype=%s ismask=usestore",
1715                     cond->get_con(), num_elem, type2name(elem_bt));
1716     return false;
1717   }
1718 
1719   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1720   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1721 
1722   ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1723   const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1724 
1725   Node* v1 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1726   Node* v2 = unbox_vector(argument(6), vbox_type, elem_bt, num_elem);
1727 
1728   bool is_masked_op = argument(7)->bottom_type() != TypePtr::NULL_PTR;
1729   Node* mask = is_masked_op ? unbox_vector(argument(7), mbox_type, elem_bt, num_elem) : nullptr;
1730   if (is_masked_op && mask == nullptr) {
1731     log_if_needed("  ** not supported: mask = null arity=2 op=comp/%d vlen=%d etype=%s ismask=usestore is_masked_op=1",
1732                     cond->get_con(), num_elem, type2name(elem_bt));
1733     return false;
1734   }
1735 
1736   bool use_predicate = is_masked_op && arch_supports_vector(Op_VectorMaskCmp, num_elem, elem_bt, VecMaskUsePred);
1737   if (is_masked_op && !use_predicate && !arch_supports_vector(Op_AndV, num_elem, elem_bt, VecMaskUseLoad)) {
1738     log_if_needed("  ** not supported: arity=2 op=comp/%d vlen=%d etype=%s ismask=usestore is_masked_op=1",
1739                     cond->get_con(), num_elem, type2name(elem_bt));
1740     return false;
1741   }
1742 
1743   if (v1 == nullptr || v2 == nullptr) {
1744     return false; // operand unboxing failed
1745   }
1746   BoolTest::mask pred = (BoolTest::mask)cond->get_con();
1747   ConINode* pred_node = (ConINode*)gvn().makecon(cond);
1748 
1749   const TypeVect* vmask_type = TypeVect::makemask(mask_bt, num_elem);
1750   Node* operation = new VectorMaskCmpNode(pred, v1, v2, pred_node, vmask_type);
1751 
1752   if (is_masked_op) {
1753     if (use_predicate) {
1754       operation->add_req(mask);
1755       operation->add_flag(Node::Flag_is_predicated_vector);
1756     } else {
1757       operation = gvn().transform(operation);
1758       operation = VectorNode::make(Op_AndV, operation, mask, vmask_type);
1759     }
1760   }
1761 
1762   operation = gvn().transform(operation);
1763 
1764   Node* box = box_vector(operation, mbox_type, mask_bt, num_elem);
1765   set_result(box);
1766   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1767   return true;
1768 }
1769 
1770 // public static
1771 // <V extends Vector<E>,
1772 //  Sh extends VectorShuffle<E>,
1773 //  M extends VectorMask<E>,
1774 //  E>
1775 // V rearrangeOp(Class<? extends V> vectorClass, Class<Sh> shuffleClass, Class<M> maskClass, Class<E> elementType, int vlen,
1776 //               V v1, Sh sh, M m,
1777 //               VectorRearrangeOp<V, Sh, M, E> defaultImpl)
1778 bool LibraryCallKit::inline_vector_rearrange() {
1779   const TypeInstPtr* vector_klass  = gvn().type(argument(0))->isa_instptr();
1780   const TypeInstPtr* shuffle_klass = gvn().type(argument(1))->isa_instptr();
1781   const TypeInstPtr* mask_klass    = gvn().type(argument(2))->isa_instptr();
1782   const TypeInstPtr* elem_klass    = gvn().type(argument(3))->isa_instptr();
1783   const TypeInt*     vlen          = gvn().type(argument(4))->isa_int();
1784 
1785   if (vector_klass == nullptr  || shuffle_klass == nullptr ||  elem_klass == nullptr || vlen == nullptr) {
1786     return false; // dead code
1787   }
1788   if (shuffle_klass->const_oop() == nullptr ||
1789       vector_klass->const_oop()  == nullptr ||
1790       elem_klass->const_oop()    == nullptr ||
1791       !vlen->is_con()) {
1792     log_if_needed("  ** missing constant: vclass=%s sclass=%s etype=%s vlen=%s",
1793                     NodeClassNames[argument(0)->Opcode()],
1794                     NodeClassNames[argument(1)->Opcode()],
1795                     NodeClassNames[argument(3)->Opcode()],
1796                     NodeClassNames[argument(4)->Opcode()]);
1797     return false; // not enough info for intrinsification
1798   }
1799   if (!is_klass_initialized(vector_klass)  ||
1800       !is_klass_initialized(shuffle_klass)) {
1801     log_if_needed("  ** klass argument not initialized");
1802     return false;
1803   }
1804   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1805   if (!elem_type->is_primitive_type()) {
1806     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1807     return false; // should be primitive type
1808   }
1809 
1810   BasicType elem_bt = elem_type->basic_type();
1811   BasicType shuffle_bt = elem_bt;
1812   if (shuffle_bt == T_FLOAT) {
1813     shuffle_bt = T_INT;
1814   } else if (shuffle_bt == T_DOUBLE) {
1815     shuffle_bt = T_LONG;
1816   }
1817 
1818   int num_elem = vlen->get_con();
1819   bool need_load_shuffle = Matcher::vector_rearrange_requires_load_shuffle(shuffle_bt, num_elem);
1820 
1821   if (need_load_shuffle && !arch_supports_vector(Op_VectorLoadShuffle, num_elem, shuffle_bt, VecMaskNotUsed)) {
1822     if (C->print_intrinsics()) {
1823       tty->print_cr("  ** not supported: arity=0 op=load/shuffle vlen=%d etype=%s ismask=no",
1824                     num_elem, type2name(shuffle_bt));
1825     }
1826     return false; // not supported
1827   }
1828 
1829   bool is_masked_op = argument(7)->bottom_type() != TypePtr::NULL_PTR;
1830   bool use_predicate = is_masked_op;
1831   if (is_masked_op &&
1832       (mask_klass == nullptr ||
1833        mask_klass->const_oop() == nullptr ||
1834        !is_klass_initialized(mask_klass))) {
1835     log_if_needed("  ** mask_klass argument not initialized");
1836   }
1837   if (!arch_supports_vector(Op_AndV, num_elem, elem_bt, VecMaskNotUsed)) {
1838     log_if_needed("  ** not supported: arity=2 op=and vlen=%d etype=%s ismask=no",
1839                       num_elem, type2name(elem_bt));
1840     return false;
1841   }
1842   VectorMaskUseType checkFlags = (VectorMaskUseType)(is_masked_op ? (VecMaskUseLoad | VecMaskUsePred) : VecMaskNotUsed);
1843   if (!arch_supports_vector(Op_VectorRearrange, num_elem, elem_bt, checkFlags)) {
1844     use_predicate = false;
1845     if(!is_masked_op ||
1846        (!arch_supports_vector(Op_VectorRearrange, num_elem, elem_bt, VecMaskNotUsed) ||
1847         !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)     ||
1848         !arch_supports_vector(Op_Replicate, num_elem, elem_bt, VecMaskNotUsed))) {
1849       log_if_needed("  ** not supported: arity=2 op=shuffle/rearrange vlen=%d etype=%s ismask=no",
1850                       num_elem, type2name(elem_bt));
1851       return false; // not supported
1852     }
1853   }
1854   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1855   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1856 
1857   ciKlass* shbox_klass = shuffle_klass->const_oop()->as_instance()->java_lang_Class_klass();
1858   const TypeInstPtr* shbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, shbox_klass);
1859 
1860   Node* v1 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1861   Node* shuffle = unbox_vector(argument(6), shbox_type, shuffle_bt, num_elem);
1862   const TypeVect* st = TypeVect::make(shuffle_bt, num_elem);
1863 
1864   if (v1 == nullptr || shuffle == nullptr) {
1865     return false; // operand unboxing failed
1866   }
1867 
1868   assert(is_power_of_2(num_elem), "wrapping invalid");
1869   Node* wrapping_mask_elem = gvn().makecon(TypeInteger::make(num_elem - 1, num_elem - 1, Type::WidenMin, shuffle_bt == T_LONG ? T_LONG : T_INT));
1870   Node* wrapping_mask = gvn().transform(VectorNode::scalar2vector(wrapping_mask_elem, num_elem, shuffle_bt));
1871   shuffle = gvn().transform(new AndVNode(shuffle, wrapping_mask, st));
1872 
1873   Node* mask = nullptr;
1874   if (is_masked_op) {
1875     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
1876     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
1877     mask = unbox_vector(argument(7), mbox_type, elem_bt, num_elem);
1878     if (mask == nullptr) {
1879       log_if_needed("  ** not supported: arity=3 op=shuffle/rearrange vlen=%d etype=%s ismask=useload is_masked_op=1",
1880                       num_elem, type2name(elem_bt));
1881       return false;
1882     }
1883   }
1884 
1885   if (need_load_shuffle) {
1886     shuffle = gvn().transform(new VectorLoadShuffleNode(shuffle, st));
1887   }
1888 
1889   Node* rearrange = new VectorRearrangeNode(v1, shuffle);
1890   if (is_masked_op) {
1891     if (use_predicate) {
1892       rearrange->add_req(mask);
1893       rearrange->add_flag(Node::Flag_is_predicated_vector);
1894     } else {
1895       rearrange = gvn().transform(rearrange);
1896       Node* zero = gvn().makecon(Type::get_zero_type(elem_bt));
1897       Node* zerovec = gvn().transform(VectorNode::scalar2vector(zero, num_elem, elem_bt));
1898       rearrange = new VectorBlendNode(zerovec, rearrange, mask);
1899     }
1900   }
1901   rearrange = gvn().transform(rearrange);
1902 
1903   Node* box = box_vector(rearrange, vbox_type, elem_bt, num_elem);
1904   set_result(box);
1905   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
1906   return true;
1907 }
1908 
1909 //    public static
1910 //    <V extends Vector<E>,
1911 //     M  extends VectorMask<E>,
1912 //     E>
1913 //    V selectFromOp(Class<? extends V> vClass, Class<M> mClass, Class<E> eClass,
1914 //                   int length, V v1, V v2, M m,
1915 //                   VectorSelectFromOp<V, M> defaultImpl)
1916 bool LibraryCallKit::inline_vector_select_from() {
1917   const TypeInstPtr* vector_klass  = gvn().type(argument(0))->isa_instptr();
1918   const TypeInstPtr* mask_klass    = gvn().type(argument(1))->isa_instptr();
1919   const TypeInstPtr* elem_klass    = gvn().type(argument(2))->isa_instptr();
1920   const TypeInt*     vlen          = gvn().type(argument(3))->isa_int();
1921 
1922   if (vector_klass == nullptr  || elem_klass == nullptr || vlen == nullptr ||
1923       vector_klass->const_oop()  == nullptr ||
1924       elem_klass->const_oop()    == nullptr ||
1925       !vlen->is_con()) {
1926     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s",
1927                     NodeClassNames[argument(0)->Opcode()],
1928                     NodeClassNames[argument(2)->Opcode()],
1929                     NodeClassNames[argument(3)->Opcode()]);
1930     return false; // not enough info for intrinsification
1931   }
1932   if (!is_klass_initialized(vector_klass)) {
1933     log_if_needed("  ** klass argument not initialized");
1934     return false;
1935   }
1936   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
1937   if (!elem_type->is_primitive_type()) {
1938     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
1939     return false; // should be primitive type
1940   }
1941   BasicType elem_bt = elem_type->basic_type();
1942   int num_elem = vlen->get_con();
1943   if (!is_power_of_2(num_elem)) {
1944     log_if_needed("  ** vlen not power of two=%d", num_elem);
1945     return false;
1946   }
1947 
1948   BasicType shuffle_bt = elem_bt;
1949   if (shuffle_bt == T_FLOAT) {
1950     shuffle_bt = T_INT;
1951   } else if (shuffle_bt == T_DOUBLE) {
1952     shuffle_bt = T_LONG;
1953   }
1954   bool need_load_shuffle = Matcher::vector_rearrange_requires_load_shuffle(shuffle_bt, num_elem);
1955 
1956   int cast_vopc = VectorCastNode::opcode(-1, elem_bt); // from vector of type elem_bt
1957   if ((need_load_shuffle && !arch_supports_vector(Op_VectorLoadShuffle, num_elem, elem_bt, VecMaskNotUsed)) ||
1958       (elem_bt != shuffle_bt && !arch_supports_vector(cast_vopc, num_elem, shuffle_bt, VecMaskNotUsed))     ||
1959       !arch_supports_vector(Op_AndV, num_elem, shuffle_bt, VecMaskNotUsed) ||
1960       !arch_supports_vector(Op_Replicate, num_elem, shuffle_bt, VecMaskNotUsed)) {
1961     log_if_needed("  ** not supported: arity=0 op=selectFrom vlen=%d etype=%s ismask=no",
1962                     num_elem, type2name(elem_bt));
1963     return false; // not supported
1964   }
1965 
1966   bool is_masked_op = argument(6)->bottom_type() != TypePtr::NULL_PTR;
1967   bool use_predicate = is_masked_op;
1968   if (is_masked_op &&
1969       (mask_klass == nullptr ||
1970        mask_klass->const_oop() == nullptr ||
1971        !is_klass_initialized(mask_klass))) {
1972     log_if_needed("  ** mask_klass argument not initialized");
1973     return false; // not supported
1974   }
1975   VectorMaskUseType checkFlags = (VectorMaskUseType)(is_masked_op ? (VecMaskUseLoad | VecMaskUsePred) : VecMaskNotUsed);
1976   if (!arch_supports_vector(Op_VectorRearrange, num_elem, elem_bt, checkFlags)) {
1977     use_predicate = false;
1978     if(!is_masked_op ||
1979        (!arch_supports_vector(Op_VectorRearrange, num_elem, elem_bt, VecMaskNotUsed) ||
1980         !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)     ||
1981         !arch_supports_vector(Op_Replicate, num_elem, elem_bt, VecMaskNotUsed))) {
1982       log_if_needed("  ** not supported: op=selectFrom vlen=%d etype=%s is_masked_op=%d",
1983                       num_elem, type2name(elem_bt), is_masked_op);
1984       return false; // not supported
1985     }
1986   }
1987   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
1988   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
1989 
1990   // v1 is the index vector
1991   Node* v1 = unbox_vector(argument(4), vbox_type, elem_bt, num_elem);
1992   // v2 is the vector being rearranged
1993   Node* v2 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
1994 
1995   if (v1 == nullptr) {
1996     log_if_needed("  ** unbox failed v1=%s", NodeClassNames[argument(4)->Opcode()]);
1997     return false; // operand unboxing failed
1998   }
1999 
2000   if (v2 == nullptr) {
2001     log_if_needed("  ** unbox failed v2=%s", NodeClassNames[argument(5)->Opcode()]);
2002     return false; // operand unboxing failed
2003   }
2004 
2005   Node* mask = nullptr;
2006   if (is_masked_op) {
2007     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
2008     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
2009     mask = unbox_vector(argument(6), mbox_type, elem_bt, num_elem);
2010     if (mask == nullptr) {
2011       log_if_needed("  ** unbox failed mask=%s", NodeClassNames[argument(6)->Opcode()]);
2012       return false;
2013     }
2014   }
2015 
2016   // cast index vector from elem_bt vector to byte vector
2017   const TypeVect* shuffle_vt = TypeVect::make(shuffle_bt, num_elem);
2018   Node* shuffle = v1;
2019 
2020   if (shuffle_bt != elem_bt) {
2021     shuffle = gvn().transform(VectorCastNode::make(cast_vopc, v1, shuffle_bt, num_elem));
2022   }
2023 
2024   // wrap the byte vector lanes to (num_elem - 1) to form the shuffle vector where num_elem is vector length
2025   // this is a simple AND operation as we come here only for power of two vector length
2026   Node* mod_val = gvn().makecon(TypeInteger::make(num_elem - 1, num_elem - 1, Type::WidenMin, shuffle_bt == T_LONG ? T_LONG : T_INT));
2027   Node* bcast_mod = gvn().transform(VectorNode::scalar2vector(mod_val, num_elem, shuffle_bt));
2028   shuffle = gvn().transform(VectorNode::make(Op_AndV, shuffle, bcast_mod, shuffle_vt));
2029 
2030   // load the shuffle to use in rearrange
2031   if (need_load_shuffle) {
2032     shuffle = gvn().transform(new VectorLoadShuffleNode(shuffle, shuffle_vt));
2033   }
2034 
2035   // and finally rearrange
2036   Node* rearrange = new VectorRearrangeNode(v2, shuffle);
2037   if (is_masked_op) {
2038     if (use_predicate) {
2039       // masked rearrange is supported so use that directly
2040       rearrange->add_req(mask);
2041       rearrange->add_flag(Node::Flag_is_predicated_vector);
2042     } else {
2043       // masked rearrange is not supported so emulate usig blend
2044       const TypeVect* vt = v1->bottom_type()->is_vect();
2045       rearrange = gvn().transform(rearrange);
2046 
2047       // create a zero vector with each lane element set as zero
2048       Node* zero = gvn().makecon(Type::get_zero_type(elem_bt));
2049       Node* zerovec = gvn().transform(VectorNode::scalar2vector(zero, num_elem, elem_bt));
2050 
2051       // For each lane for which mask is set, blend in the rearranged lane into zero vector
2052       rearrange = new VectorBlendNode(zerovec, rearrange, mask);
2053     }
2054   }
2055   rearrange = gvn().transform(rearrange);
2056 
2057   // box the result
2058   Node* box = box_vector(rearrange, vbox_type, elem_bt, num_elem);
2059   set_result(box);
2060 
2061   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2062   return true;
2063 }
2064 
2065 //  public static
2066 //  <V extends Vector<E>,
2067 //   M extends VectorMask<E>,
2068 //   E>
2069 //  V broadcastInt(int opr, Class<? extends V> vectorClass, Class<? extends M> maskClass,
2070 //                 Class<E> elementType, int length,
2071 //                 V v, int n, M m,
2072 //                 VectorBroadcastIntOp<V, M> defaultImpl)
2073 bool LibraryCallKit::inline_vector_broadcast_int() {
2074   const TypeInt*     opr          = gvn().type(argument(0))->isa_int();
2075   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
2076   const TypeInstPtr* mask_klass   = gvn().type(argument(2))->isa_instptr();
2077   const TypeInstPtr* elem_klass   = gvn().type(argument(3))->isa_instptr();
2078   const TypeInt*     vlen         = gvn().type(argument(4))->isa_int();
2079 
2080   if (opr == nullptr || vector_klass == nullptr || elem_klass == nullptr || vlen == nullptr) {
2081     return false; // dead code
2082   }
2083   if (!opr->is_con() || vector_klass->const_oop() == nullptr || elem_klass->const_oop() == nullptr || !vlen->is_con()) {
2084     log_if_needed("  ** missing constant: opr=%s vclass=%s etype=%s vlen=%s",
2085                     NodeClassNames[argument(0)->Opcode()],
2086                     NodeClassNames[argument(1)->Opcode()],
2087                     NodeClassNames[argument(3)->Opcode()],
2088                     NodeClassNames[argument(4)->Opcode()]);
2089     return false; // not enough info for intrinsification
2090   }
2091   if (!is_klass_initialized(vector_klass)) {
2092     log_if_needed("  ** klass argument not initialized");
2093     return false;
2094   }
2095 
2096   const Type* vmask_type = gvn().type(argument(7));
2097   bool is_masked_op = vmask_type != TypePtr::NULL_PTR;
2098   if (is_masked_op) {
2099     if (mask_klass == nullptr || mask_klass->const_oop() == nullptr) {
2100       log_if_needed("  ** missing constant: maskclass=%s", NodeClassNames[argument(2)->Opcode()]);
2101       return false; // not enough info for intrinsification
2102     }
2103 
2104     if (!is_klass_initialized(mask_klass)) {
2105       log_if_needed("  ** mask klass argument not initialized");
2106       return false;
2107     }
2108 
2109     if (vmask_type->maybe_null()) {
2110       log_if_needed("  ** null mask values are not allowed for masked op");
2111       return false;
2112     }
2113   }
2114 
2115   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2116   if (!elem_type->is_primitive_type()) {
2117     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2118     return false; // should be primitive type
2119   }
2120 
2121   int num_elem = vlen->get_con();
2122   BasicType elem_bt = elem_type->basic_type();
2123   int opc = VectorSupport::vop2ideal(opr->get_con(), elem_bt);
2124 
2125   bool is_shift  = VectorNode::is_shift_opcode(opc);
2126   bool is_rotate = VectorNode::is_rotate_opcode(opc);
2127 
2128   if (opc == 0 || (!is_shift && !is_rotate)) {
2129     log_if_needed("  ** operation not supported: op=%d bt=%s", opr->get_con(), type2name(elem_bt));
2130     return false; // operation not supported
2131   }
2132 
2133   int sopc = VectorNode::opcode(opc, elem_bt);
2134   if (sopc == 0) {
2135     log_if_needed("  ** operation not supported: opc=%s bt=%s", NodeClassNames[opc], type2name(elem_bt));
2136     return false; // operation not supported
2137   }
2138 
2139   Node* cnt  = argument(6);
2140   const TypeInt* cnt_type = cnt->bottom_type()->isa_int();
2141 
2142   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2143   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2144 
2145   // If CPU supports vector constant rotate instructions pass it directly
2146   bool is_const_rotate = is_rotate && cnt_type && cnt_type->is_con() &&
2147                          Matcher::supports_vector_constant_rotates(cnt_type->get_con());
2148   bool has_scalar_args = is_rotate ? !is_const_rotate : true;
2149 
2150   VectorMaskUseType checkFlags = (VectorMaskUseType)(is_masked_op ? (VecMaskUseLoad | VecMaskUsePred) : VecMaskNotUsed);
2151   bool use_predicate = is_masked_op;
2152 
2153   if (!arch_supports_vector(sopc, num_elem, elem_bt, checkFlags, has_scalar_args)) {
2154     use_predicate = false;
2155     if (!is_masked_op ||
2156         (!arch_supports_vector(sopc, num_elem, elem_bt, VecMaskNotUsed, has_scalar_args) ||
2157          !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad))) {
2158 
2159       log_if_needed("  ** not supported: arity=0 op=int/%d vlen=%d etype=%s is_masked_op=%d",
2160                       sopc, num_elem, type2name(elem_bt), is_masked_op ? 1 : 0);
2161       return false; // not supported
2162     }
2163   }
2164 
2165   Node* opd1 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
2166   Node* opd2 = nullptr;
2167   if (is_shift) {
2168     opd2 = vector_shift_count(cnt, opc, elem_bt, num_elem);
2169   } else {
2170     assert(is_rotate, "unexpected operation");
2171     if (!is_const_rotate) {
2172       cnt = elem_bt == T_LONG ? gvn().transform(new ConvI2LNode(cnt)) : cnt;
2173       opd2 = gvn().transform(VectorNode::scalar2vector(cnt, num_elem, elem_bt));
2174     } else {
2175       // Constant shift value.
2176       opd2 = cnt;
2177     }
2178   }
2179 
2180   if (opd1 == nullptr || opd2 == nullptr) {
2181     return false;
2182   }
2183 
2184   Node* mask = nullptr;
2185   if (is_masked_op) {
2186     ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
2187     const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
2188     mask = unbox_vector(argument(7), mbox_type, elem_bt, num_elem);
2189     if (mask == nullptr) {
2190       log_if_needed("  ** unbox failed mask=%s", NodeClassNames[argument(7)->Opcode()]);
2191       return false;
2192     }
2193   }
2194 
2195   Node* operation = VectorNode::make(opc, opd1, opd2, num_elem, elem_bt);
2196   if (is_masked_op && mask != nullptr) {
2197     if (use_predicate) {
2198       operation->add_req(mask);
2199       operation->add_flag(Node::Flag_is_predicated_vector);
2200     } else {
2201       operation = gvn().transform(operation);
2202       operation = new VectorBlendNode(opd1, operation, mask);
2203     }
2204   }
2205   operation = gvn().transform(operation);
2206   Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
2207   set_result(vbox);
2208   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2209   return true;
2210 }
2211 
2212 // public static <VOUT extends VectorPayload,
2213 //                 VIN extends VectorPayload,
2214 //                   S extends VectorSpecies>
2215 // VOUT convert(int oprId,
2216 //           Class<?> fromVectorClass, Class<?> fromElementType, int fromVLen,
2217 //           Class<?>   toVectorClass, Class<?>   toElementType, int   toVLen,
2218 //           VIN v, S s,
2219 //           VectorConvertOp<VOUT, VIN, S> defaultImpl)
2220 //
2221 bool LibraryCallKit::inline_vector_convert() {
2222   const TypeInt*     opr               = gvn().type(argument(0))->isa_int();
2223 
2224   const TypeInstPtr* vector_klass_from = gvn().type(argument(1))->isa_instptr();
2225   const TypeInstPtr* elem_klass_from   = gvn().type(argument(2))->isa_instptr();
2226   const TypeInt*     vlen_from         = gvn().type(argument(3))->isa_int();
2227 
2228   const TypeInstPtr* vector_klass_to   = gvn().type(argument(4))->isa_instptr();
2229   const TypeInstPtr* elem_klass_to     = gvn().type(argument(5))->isa_instptr();
2230   const TypeInt*     vlen_to           = gvn().type(argument(6))->isa_int();
2231 
2232   if (opr == nullptr ||
2233       vector_klass_from == nullptr || elem_klass_from == nullptr || vlen_from == nullptr ||
2234       vector_klass_to   == nullptr || elem_klass_to   == nullptr || vlen_to   == nullptr) {
2235     return false; // dead code
2236   }
2237   if (!opr->is_con() ||
2238       vector_klass_from->const_oop() == nullptr || elem_klass_from->const_oop() == nullptr || !vlen_from->is_con() ||
2239       vector_klass_to->const_oop() == nullptr || elem_klass_to->const_oop() == nullptr || !vlen_to->is_con()) {
2240     log_if_needed("  ** missing constant: opr=%s vclass_from=%s etype_from=%s vlen_from=%s vclass_to=%s etype_to=%s vlen_to=%s",
2241                     NodeClassNames[argument(0)->Opcode()],
2242                     NodeClassNames[argument(1)->Opcode()],
2243                     NodeClassNames[argument(2)->Opcode()],
2244                     NodeClassNames[argument(3)->Opcode()],
2245                     NodeClassNames[argument(4)->Opcode()],
2246                     NodeClassNames[argument(5)->Opcode()],
2247                     NodeClassNames[argument(6)->Opcode()]);
2248     return false; // not enough info for intrinsification
2249   }
2250   if (!is_klass_initialized(vector_klass_from) || !is_klass_initialized(vector_klass_to)) {
2251     log_if_needed("  ** klass argument not initialized");
2252     return false;
2253   }
2254 
2255   assert(opr->get_con() == VectorSupport::VECTOR_OP_CAST  ||
2256          opr->get_con() == VectorSupport::VECTOR_OP_UCAST ||
2257          opr->get_con() == VectorSupport::VECTOR_OP_REINTERPRET, "wrong opcode");
2258   bool is_cast = (opr->get_con() == VectorSupport::VECTOR_OP_CAST || opr->get_con() == VectorSupport::VECTOR_OP_UCAST);
2259   bool is_ucast = (opr->get_con() == VectorSupport::VECTOR_OP_UCAST);
2260 
2261   ciKlass* vbox_klass_from = vector_klass_from->const_oop()->as_instance()->java_lang_Class_klass();
2262   ciKlass* vbox_klass_to = vector_klass_to->const_oop()->as_instance()->java_lang_Class_klass();
2263 
2264   bool is_mask = is_vector_mask(vbox_klass_from);
2265 
2266   ciType* elem_type_from = elem_klass_from->const_oop()->as_instance()->java_mirror_type();
2267   if (!elem_type_from->is_primitive_type()) {
2268     return false; // should be primitive type
2269   }
2270   BasicType elem_bt_from = elem_type_from->basic_type();
2271   ciType* elem_type_to = elem_klass_to->const_oop()->as_instance()->java_mirror_type();
2272   if (!elem_type_to->is_primitive_type()) {
2273     return false; // should be primitive type
2274   }
2275   BasicType elem_bt_to = elem_type_to->basic_type();
2276 
2277   int num_elem_from = vlen_from->get_con();
2278   int num_elem_to = vlen_to->get_con();
2279 
2280   // Check whether we can unbox to appropriate size. Even with casting, checking for reinterpret is needed
2281   // since we may need to change size.
2282   if (!arch_supports_vector(Op_VectorReinterpret,
2283                             num_elem_from,
2284                             elem_bt_from,
2285                             is_mask ? VecMaskUseAll : VecMaskNotUsed)) {
2286     log_if_needed("  ** not supported: arity=1 op=%s/1 vlen1=%d etype1=%s ismask=%d",
2287                     is_cast ? "cast" : "reinterpret",
2288                     num_elem_from, type2name(elem_bt_from), is_mask);
2289     return false;
2290   }
2291 
2292   // Check whether we can support resizing/reinterpreting to the new size.
2293   if (!arch_supports_vector(Op_VectorReinterpret,
2294                             num_elem_to,
2295                             elem_bt_to,
2296                             is_mask ? VecMaskUseAll : VecMaskNotUsed)) {
2297     log_if_needed("  ** not supported: arity=1 op=%s/2 vlen2=%d etype2=%s ismask=%d",
2298                     is_cast ? "cast" : "reinterpret",
2299                     num_elem_to, type2name(elem_bt_to), is_mask);
2300     return false;
2301   }
2302 
2303   // At this point, we know that both input and output vector registers are supported
2304   // by the architecture. Next check if the casted type is simply to same type - which means
2305   // that it is actually a resize and not a cast.
2306   if (is_cast && elem_bt_from == elem_bt_to) {
2307     is_cast = false;
2308   }
2309 
2310   const TypeInstPtr* vbox_type_from = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_from);
2311 
2312   Node* opd1 = unbox_vector(argument(7), vbox_type_from, elem_bt_from, num_elem_from);
2313   if (opd1 == nullptr) {
2314     return false;
2315   }
2316 
2317   const TypeVect* src_type = TypeVect::make(elem_bt_from, num_elem_from, is_mask);
2318   const TypeVect* dst_type = TypeVect::make(elem_bt_to, num_elem_to, is_mask);
2319 
2320   // Safety check to prevent casting if source mask is of type vector
2321   // and destination mask of type predicate vector and vice-versa.
2322   // From X86 standpoint, this case will only arise over KNL target,
2323   // where certain masks (depending on the species) are either propagated
2324   // through a vector or predicate register.
2325   if (is_mask &&
2326       ((src_type->isa_vectmask() == nullptr && dst_type->isa_vectmask()) ||
2327        (dst_type->isa_vectmask() == nullptr && src_type->isa_vectmask()))) {
2328     return false;
2329   }
2330 
2331   Node* op = opd1;
2332   if (is_cast) {
2333     assert(!is_mask || num_elem_from == num_elem_to, "vector mask cast needs the same elem num");
2334 
2335     // Make sure the precondition of VectorCastNode::opcode holds: we can only have
2336     // unsigned casts for integral types (excluding long). VectorAPI code is not
2337     // expected to violate this at runtime, but we may compile unreachable code
2338     // where such impossible combinations arise.
2339     if (is_ucast && (!is_integral_type(elem_bt_from) || elem_bt_from == T_LONG)) {
2340       // Halt-and-catch fire here. This condition should never happen at runtime.
2341       stringStream ss;
2342       ss.print("impossible combination: unsigned vector cast from %s", type2name(elem_bt_from));
2343       halt(control(), frameptr(), ss.as_string(C->comp_arena()));
2344       stop_and_kill_map();
2345       log_if_needed("  ** impossible combination: unsigned cast from %s", type2name(elem_bt_from));
2346       return true;
2347     }
2348 
2349     int cast_vopc = VectorCastNode::opcode(-1, elem_bt_from, !is_ucast);
2350 
2351     // Make sure that vector cast is implemented to particular type/size combination if it is
2352     // not a mask casting.
2353     if (!is_mask && !arch_supports_vector(cast_vopc, num_elem_to, elem_bt_to, VecMaskNotUsed)) {
2354       log_if_needed("  ** not supported: arity=1 op=cast#%d/3 vlen2=%d etype2=%s ismask=%d",
2355                       cast_vopc, num_elem_to, type2name(elem_bt_to), is_mask);
2356       return false;
2357     }
2358 
2359     if (num_elem_from < num_elem_to) {
2360       // Since input and output number of elements are not consistent, we need to make sure we
2361       // properly size. Thus, first make a cast that retains the number of elements from source.
2362       int num_elem_for_cast = num_elem_from;
2363 
2364       // It is possible that arch does not support this intermediate vector size
2365       // TODO More complex logic required here to handle this corner case for the sizes.
2366       if (!arch_supports_vector(cast_vopc, num_elem_for_cast, elem_bt_to, VecMaskNotUsed)) {
2367         log_if_needed("  ** not supported: arity=1 op=cast#%d/4 vlen1=%d etype2=%s ismask=%d",
2368                         cast_vopc,
2369                         num_elem_for_cast, type2name(elem_bt_to), is_mask);
2370         return false;
2371       }
2372 
2373       op = gvn().transform(VectorCastNode::make(cast_vopc, op, elem_bt_to, num_elem_for_cast));
2374       // Now ensure that the destination gets properly resized to needed size.
2375       op = gvn().transform(new VectorReinterpretNode(op, op->bottom_type()->is_vect(), dst_type));
2376     } else if (num_elem_from > num_elem_to) {
2377       // Since number of elements from input is larger than output, simply reduce size of input
2378       // (we are supposed to drop top elements anyway).
2379       int num_elem_for_resize = num_elem_to;
2380 
2381       // It is possible that arch does not support this intermediate vector size
2382       // TODO More complex logic required here to handle this corner case for the sizes.
2383       if (!arch_supports_vector(Op_VectorReinterpret,
2384                                 num_elem_for_resize,
2385                                 elem_bt_from,
2386                                 VecMaskNotUsed)) {
2387         log_if_needed("  ** not supported: arity=1 op=cast/5 vlen2=%d etype1=%s ismask=%d",
2388                         num_elem_for_resize, type2name(elem_bt_from), is_mask);
2389         return false;
2390       }
2391 
2392       const TypeVect* resize_type = TypeVect::make(elem_bt_from, num_elem_for_resize);
2393       op = gvn().transform(new VectorReinterpretNode(op, src_type, resize_type));
2394       op = gvn().transform(VectorCastNode::make(cast_vopc, op, elem_bt_to, num_elem_to));
2395     } else { // num_elem_from == num_elem_to
2396       if (is_mask) {
2397         // Make sure that cast for vector mask is implemented to particular type/size combination.
2398         if (!arch_supports_vector(Op_VectorMaskCast, num_elem_to, elem_bt_to, VecMaskNotUsed)) {
2399           log_if_needed("  ** not supported: arity=1 op=maskcast vlen2=%d etype2=%s ismask=%d",
2400                           num_elem_to, type2name(elem_bt_to), is_mask);
2401           return false;
2402         }
2403         op = gvn().transform(new VectorMaskCastNode(op, dst_type));
2404       } else {
2405         // Since input and output number of elements match, and since we know this vector size is
2406         // supported, simply do a cast with no resize needed.
2407         op = gvn().transform(VectorCastNode::make(cast_vopc, op, elem_bt_to, num_elem_to));
2408       }
2409     }
2410   } else if (!Type::equals(src_type, dst_type)) {
2411     assert(!is_cast, "must be reinterpret");
2412     op = gvn().transform(new VectorReinterpretNode(op, src_type, dst_type));
2413   }
2414 
2415   const TypeInstPtr* vbox_type_to = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass_to);
2416   Node* vbox = box_vector(op, vbox_type_to, elem_bt_to, num_elem_to);
2417   set_result(vbox);
2418   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem_to * type2aelembytes(elem_bt_to))));
2419   return true;
2420 }
2421 
2422 //  public static
2423 //  <V extends Vector<E>,
2424 //   E>
2425 //  V insert(Class<? extends V> vectorClass, Class<E> elementType, int vlen,
2426 //           V vec, int ix, long val,
2427 //           VecInsertOp<V> defaultImpl)
2428 bool LibraryCallKit::inline_vector_insert() {
2429   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2430   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
2431   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
2432   const TypeInt*     idx          = gvn().type(argument(4))->isa_int();
2433 
2434   if (vector_klass == nullptr || elem_klass == nullptr || vlen == nullptr || idx == nullptr) {
2435     return false; // dead code
2436   }
2437   if (vector_klass->const_oop() == nullptr || elem_klass->const_oop() == nullptr || !vlen->is_con() || !idx->is_con()) {
2438     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s idx=%s",
2439                     NodeClassNames[argument(0)->Opcode()],
2440                     NodeClassNames[argument(1)->Opcode()],
2441                     NodeClassNames[argument(2)->Opcode()],
2442                     NodeClassNames[argument(4)->Opcode()]);
2443     return false; // not enough info for intrinsification
2444   }
2445   if (!is_klass_initialized(vector_klass)) {
2446     log_if_needed("  ** klass argument not initialized");
2447     return false;
2448   }
2449   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2450   if (!elem_type->is_primitive_type()) {
2451     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2452     return false; // should be primitive type
2453   }
2454   BasicType elem_bt = elem_type->basic_type();
2455   int num_elem = vlen->get_con();
2456   if (!arch_supports_vector(Op_VectorInsert, num_elem, elem_bt, VecMaskNotUsed)) {
2457     log_if_needed("  ** not supported: arity=1 op=insert vlen=%d etype=%s ismask=no",
2458                     num_elem, type2name(elem_bt));
2459     return false; // not supported
2460   }
2461 
2462   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2463   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2464 
2465   Node* opd = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2466   if (opd == nullptr) {
2467     return false;
2468   }
2469 
2470   Node* insert_val = argument(5);
2471   assert(gvn().type(insert_val)->isa_long() != nullptr, "expected to be long");
2472 
2473   // Convert insert value back to its appropriate type.
2474   switch (elem_bt) {
2475     case T_BYTE:
2476       insert_val = gvn().transform(new ConvL2INode(insert_val, TypeInt::BYTE));
2477       break;
2478     case T_SHORT:
2479       insert_val = gvn().transform(new ConvL2INode(insert_val, TypeInt::SHORT));
2480       break;
2481     case T_INT:
2482       insert_val = gvn().transform(new ConvL2INode(insert_val));
2483       break;
2484     case T_FLOAT:
2485       insert_val = gvn().transform(new ConvL2INode(insert_val));
2486       insert_val = gvn().transform(new MoveI2FNode(insert_val));
2487       break;
2488     case T_DOUBLE:
2489       insert_val = gvn().transform(new MoveL2DNode(insert_val));
2490       break;
2491     case T_LONG:
2492       // no conversion needed
2493       break;
2494     default: fatal("%s", type2name(elem_bt)); break;
2495   }
2496 
2497   Node* operation = gvn().transform(VectorInsertNode::make(opd, insert_val, idx->get_con(), gvn()));
2498 
2499   Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
2500   set_result(vbox);
2501   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2502   return true;
2503 }
2504 
2505 //  public static
2506 //  <VM extends VectorPayload,
2507 //   E>
2508 //  long extract(Class<? extends VM> vClass, Class<E> eClass,
2509 //               int length,
2510 //               VM vm, int i,
2511 //               VecExtractOp<VM> defaultImpl)
2512 bool LibraryCallKit::inline_vector_extract() {
2513   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2514   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
2515   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
2516   const TypeInt*     idx          = gvn().type(argument(4))->isa_int();
2517 
2518   if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
2519       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
2520       vlen         == nullptr || !vlen->is_con() ||
2521       idx          == nullptr) {
2522     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s",
2523                     NodeClassNames[argument(0)->Opcode()],
2524                     NodeClassNames[argument(1)->Opcode()],
2525                     NodeClassNames[argument(2)->Opcode()]);
2526     return false; // not enough info for intrinsification
2527   }
2528   if (!is_klass_initialized(vector_klass)) {
2529     log_if_needed("  ** klass argument not initialized");
2530     return false;
2531   }
2532   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2533   if (!elem_type->is_primitive_type()) {
2534     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2535     return false; // should be primitive type
2536   }
2537   BasicType elem_bt = elem_type->basic_type();
2538   int num_elem = vlen->get_con();
2539 
2540   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2541   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2542 
2543   Node* opd = nullptr;
2544 
2545   if (is_vector_mask(vbox_klass)) {
2546     // vbox_klass is mask. This is used for VectorMask.laneIsSet(int).
2547 
2548     Node* pos = argument(4); // can be variable
2549     if (arch_supports_vector(Op_ExtractUB, num_elem, elem_bt, VecMaskUseAll)) {
2550       // Transform mask to vector with type of boolean and utilize ExtractUB node.
2551       opd = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2552       if (opd == nullptr) {
2553         return false;
2554       }
2555       opd = gvn().transform(VectorStoreMaskNode::make(gvn(), opd, elem_bt, num_elem));
2556       opd = gvn().transform(new ExtractUBNode(opd, pos));
2557       opd = gvn().transform(new ConvI2LNode(opd));
2558     } else if (arch_supports_vector(Op_VectorMaskToLong, num_elem, elem_bt, VecMaskUseLoad)) {
2559       opd = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2560       if (opd == nullptr) {
2561         return false;
2562       }
2563       // VectorMaskToLongNode requires the input is either a mask or a vector with BOOLEAN type.
2564       if (!Matcher::mask_op_prefers_predicate(Op_VectorMaskToLong, opd->bottom_type()->is_vect())) {
2565         opd = gvn().transform(VectorStoreMaskNode::make(gvn(), opd, elem_bt, num_elem));
2566       }
2567       // ((toLong() >>> pos) & 1L
2568       opd = gvn().transform(new VectorMaskToLongNode(opd, TypeLong::LONG));
2569       opd = gvn().transform(new URShiftLNode(opd, pos));
2570       opd = gvn().transform(new AndLNode(opd, gvn().makecon(TypeLong::ONE)));
2571     } else {
2572       log_if_needed("  ** Rejected mask extraction because architecture does not support it");
2573       return false; // not supported
2574     }
2575   } else {
2576     // vbox_klass is vector. This is used for Vector.lane(int).
2577     if (!idx->is_con()) {
2578       log_if_needed("  ** missing constant: idx=%s", NodeClassNames[argument(4)->Opcode()]);
2579       return false; // not enough info for intrinsification
2580     }
2581 
2582     int vopc = ExtractNode::opcode(elem_bt);
2583     if (!arch_supports_vector(vopc, num_elem, elem_bt, VecMaskNotUsed)) {
2584       log_if_needed("  ** not supported: arity=1 op=extract vlen=%d etype=%s ismask=no",
2585                       num_elem, type2name(elem_bt));
2586       return false; // not supported
2587     }
2588 
2589     opd = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2590     if (opd == nullptr) {
2591       return false;
2592     }
2593     ConINode* idx_con = gvn().intcon(idx->get_con())->as_ConI();
2594 
2595     opd = gvn().transform(ExtractNode::make(opd, idx_con, elem_bt));
2596     switch (elem_bt) {
2597       case T_BYTE:
2598       case T_SHORT:
2599       case T_INT: {
2600         opd = gvn().transform(new ConvI2LNode(opd));
2601         break;
2602       }
2603       case T_FLOAT: {
2604         opd = gvn().transform(new MoveF2INode(opd));
2605         opd = gvn().transform(new ConvI2LNode(opd));
2606         break;
2607       }
2608       case T_DOUBLE: {
2609         opd = gvn().transform(new MoveD2LNode(opd));
2610         break;
2611       }
2612       case T_LONG: {
2613         // no conversion needed
2614         break;
2615       }
2616       default: fatal("%s", type2name(elem_bt));
2617     }
2618   }
2619   set_result(opd);
2620   return true;
2621 }
2622 
2623 static Node* LowerSelectFromTwoVectorOperation(PhaseGVN& phase, Node* index_vec, Node* src1, Node* src2, const TypeVect* vt) {
2624   int num_elem = vt->length();
2625   BasicType elem_bt = vt->element_basic_type();
2626 
2627   // Lower selectFrom operation into its constituent operations.
2628   //   SelectFromTwoVectorNode =
2629   //     (VectorBlend
2630   //         (VectorRearrange SRC1 (WRAPED_INDEX AND (VLEN-1))
2631   //         (VectorRearrange SRC2 (WRAPED_INDEX AND (VLEN-1))
2632   //      MASK)
2633   // Where
2634   //   WRAPED_INDEX are computed by wrapping incoming indexes
2635   //   to two vector index range [0, VLEN*2) and
2636   //   MASK = WRAPED_INDEX < VLEN
2637   //
2638   // IR lowering prevents intrinsification failure and associated argument
2639   // boxing penalties.
2640   //
2641 
2642   BasicType shuffle_bt = elem_bt;
2643   if (shuffle_bt == T_FLOAT) {
2644     shuffle_bt = T_INT;
2645   } else if (shuffle_bt == T_DOUBLE) {
2646     shuffle_bt = T_LONG;
2647   }
2648   const TypeVect* st = TypeVect::make(shuffle_bt, num_elem);
2649 
2650   // Cast index vector to the corresponding bit type
2651   if (elem_bt != shuffle_bt) {
2652     int cast_vopc = VectorCastNode::opcode(0, elem_bt, true);
2653     index_vec = phase.transform(VectorCastNode::make(cast_vopc, index_vec, shuffle_bt, num_elem));
2654   }
2655 
2656   // Wrap indexes into two vector index range [0, VLEN * 2)
2657   Node* two_vect_lane_cnt_m1 = phase.makecon(TypeInteger::make(2 * num_elem - 1, 2 * num_elem - 1, Type::WidenMin, shuffle_bt == T_LONG ? T_LONG : T_INT));
2658   Node* bcast_two_vect_lane_cnt_m1_vec = phase.transform(VectorNode::scalar2vector(two_vect_lane_cnt_m1, num_elem,
2659                                                                                    shuffle_bt, false));
2660   index_vec = phase.transform(VectorNode::make(Op_AndV, index_vec, bcast_two_vect_lane_cnt_m1_vec, st));
2661 
2662   // Compute the blend mask for merging two independently permitted vectors
2663   // using shuffle index in two vector index range [0, VLEN * 2).
2664   BoolTest::mask pred = BoolTest::le;
2665   ConINode* pred_node = phase.makecon(TypeInt::make(pred))->as_ConI();
2666   const TypeVect* vmask_type = TypeVect::makemask(shuffle_bt, num_elem);
2667   Node* lane_cnt_m1 = phase.makecon(TypeInteger::make(num_elem - 1, num_elem - 1, Type::WidenMin, shuffle_bt == T_LONG ? T_LONG : T_INT));
2668   Node* bcast_lane_cnt_m1_vec = phase.transform(VectorNode::scalar2vector(lane_cnt_m1, num_elem, shuffle_bt, false));
2669   Node* mask = phase.transform(new VectorMaskCmpNode(pred, index_vec, bcast_lane_cnt_m1_vec, pred_node, vmask_type));
2670 
2671   // Rearrange expects the indexes to lie within single vector index range [0, VLEN).
2672   Node* wrapped_index_vec = phase.transform(VectorNode::make(Op_AndV, index_vec, bcast_lane_cnt_m1_vec, st));
2673 
2674   // Load indexes from byte vector and appropriately transform them to target
2675   // specific permutation index format.
2676   if (Matcher::vector_rearrange_requires_load_shuffle(shuffle_bt, num_elem)) {
2677     wrapped_index_vec = phase.transform(new VectorLoadShuffleNode(wrapped_index_vec, st));
2678   }
2679 
2680   vmask_type = TypeVect::makemask(elem_bt, num_elem);
2681   mask = phase.transform(new VectorMaskCastNode(mask, vmask_type));
2682 
2683   Node* p1 = phase.transform(new VectorRearrangeNode(src1, wrapped_index_vec));
2684   Node* p2 = phase.transform(new VectorRearrangeNode(src2, wrapped_index_vec));
2685 
2686   return new VectorBlendNode(p2, p1, mask);
2687 }
2688 
2689 //  public static
2690 //  <V extends Vector<E>,
2691 //   E>
2692 //  V selectFromTwoVectorOp(Class<? extends V> vClass, Class<E> eClass, int length,
2693 //                          V v1, V v2, V v3,
2694 //                          SelectFromTwoVector<V> defaultImpl)
2695 bool LibraryCallKit::inline_vector_select_from_two_vectors() {
2696   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2697   const TypeInstPtr* elem_klass = gvn().type(argument(1))->isa_instptr();
2698   const TypeInt* vlen = gvn().type(argument(2))->isa_int();
2699 
2700   if (vector_klass == nullptr || elem_klass == nullptr || vlen == nullptr || vector_klass->const_oop() == nullptr ||
2701       elem_klass->const_oop() == nullptr ||!vlen->is_con()) {
2702     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s",
2703                     NodeClassNames[argument(0)->Opcode()],
2704                     NodeClassNames[argument(1)->Opcode()],
2705                     NodeClassNames[argument(2)->Opcode()]);
2706     return false; // not enough info for intrinsification
2707   }
2708 
2709   if (!is_klass_initialized(vector_klass)) {
2710     log_if_needed("  ** klass argument not initialized");
2711     return false;
2712   }
2713 
2714   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2715   if (!elem_type->is_primitive_type()) {
2716     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2717     return false; // should be primitive type
2718   }
2719 
2720   int num_elem = vlen->get_con();
2721   if (!is_power_of_2(num_elem)) {
2722     log_if_needed("  ** vlen is not power of two=%d", num_elem);
2723     return false;
2724   }
2725 
2726   BasicType elem_bt = elem_type->basic_type();
2727   BasicType index_elem_bt = elem_bt;
2728   if (elem_bt == T_FLOAT) {
2729     index_elem_bt = T_INT;
2730   } else if (elem_bt == T_DOUBLE) {
2731     index_elem_bt = T_LONG;
2732   }
2733 
2734   // Check if the platform requires a VectorLoadShuffle node to be generated
2735   bool need_load_shuffle = Matcher::vector_rearrange_requires_load_shuffle(index_elem_bt, num_elem);
2736 
2737   bool lowerSelectFromOp = false;
2738   if (!arch_supports_vector(Op_SelectFromTwoVector, num_elem, elem_bt, VecMaskNotUsed)) {
2739     int cast_vopc = VectorCastNode::opcode(-1, elem_bt, true);
2740     if ((elem_bt != index_elem_bt && !arch_supports_vector(cast_vopc, num_elem, index_elem_bt, VecMaskNotUsed)) ||
2741         !arch_supports_vector(Op_VectorMaskCmp, num_elem, index_elem_bt, VecMaskNotUsed)     ||
2742         !arch_supports_vector(Op_AndV, num_elem, index_elem_bt, VecMaskNotUsed)              ||
2743         !arch_supports_vector(Op_VectorMaskCast, num_elem, elem_bt, VecMaskNotUsed)          ||
2744         !arch_supports_vector(Op_VectorBlend, num_elem, elem_bt, VecMaskUseLoad)             ||
2745         !arch_supports_vector(Op_VectorRearrange, num_elem, elem_bt, VecMaskNotUsed)         ||
2746         (need_load_shuffle && !arch_supports_vector(Op_VectorLoadShuffle, num_elem, index_elem_bt, VecMaskNotUsed)) ||
2747         !arch_supports_vector(Op_Replicate, num_elem, index_elem_bt, VecMaskNotUsed)) {
2748       log_if_needed("  ** not supported: opc=%d vlen=%d etype=%s ismask=useload",
2749                     Op_SelectFromTwoVector, num_elem, type2name(elem_bt));
2750       return false; // not supported
2751     }
2752     lowerSelectFromOp = true;
2753   }
2754 
2755   int cast_vopc = VectorCastNode::opcode(-1, elem_bt, true);
2756   if (!lowerSelectFromOp) {
2757     if (!arch_supports_vector(Op_AndV, num_elem, index_elem_bt, VecMaskNotUsed)      ||
2758         !arch_supports_vector(Op_Replicate, num_elem, index_elem_bt, VecMaskNotUsed) ||
2759         (is_floating_point_type(elem_bt) &&
2760          !arch_supports_vector(cast_vopc, num_elem, index_elem_bt, VecMaskNotUsed))) {
2761       log_if_needed("  ** index wrapping not supported: vlen=%d etype=%s" ,
2762                      num_elem, type2name(elem_bt));
2763       return false; // not supported
2764     }
2765   }
2766 
2767   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2768   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2769 
2770   Node* opd1 = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2771   if (opd1 == nullptr) {
2772     log_if_needed("  ** unbox failed v1=%s",
2773                   NodeClassNames[argument(3)->Opcode()]);
2774     return false;
2775   }
2776   Node* opd2 = unbox_vector(argument(4), vbox_type, elem_bt, num_elem);
2777   if (opd2 == nullptr) {
2778     log_if_needed("  ** unbox failed v2=%s",
2779                   NodeClassNames[argument(4)->Opcode()]);
2780     return false;
2781   }
2782   Node* opd3 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
2783   if (opd3 == nullptr) {
2784     log_if_needed("  ** unbox failed v3=%s",
2785                   NodeClassNames[argument(5)->Opcode()]);
2786     return false;
2787   }
2788 
2789   const TypeVect* vt = TypeVect::make(elem_bt, num_elem);
2790 
2791   Node* operation = nullptr;
2792   if (lowerSelectFromOp) {
2793     operation = gvn().transform(LowerSelectFromTwoVectorOperation(gvn(), opd1, opd2, opd3, vt));
2794   } else {
2795     if (index_elem_bt != elem_bt) {
2796       opd1 = gvn().transform(VectorCastNode::make(cast_vopc, opd1, index_elem_bt, num_elem));
2797     }
2798     int indexRangeMask = 2 * num_elem - 1;
2799     Node* wrap_mask = gvn().makecon(TypeInteger::make(indexRangeMask, indexRangeMask, Type::WidenMin, index_elem_bt != T_LONG ? T_INT : index_elem_bt));
2800     Node* wrap_mask_vec = gvn().transform(VectorNode::scalar2vector(wrap_mask, num_elem, index_elem_bt, false));
2801     opd1 = gvn().transform(VectorNode::make(Op_AndV, opd1, wrap_mask_vec, opd1->bottom_type()->is_vect()));
2802     operation = gvn().transform(VectorNode::make(Op_SelectFromTwoVector, opd1, opd2, opd3, vt));
2803   }
2804 
2805   // Wrap it up in VectorBox to keep object type information.
2806   Node* vbox = box_vector(operation, vbox_type, elem_bt, num_elem);
2807   set_result(vbox);
2808   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2809   return true;
2810 }
2811 
2812 // public static
2813 // <V extends Vector<E>,
2814 //  M extends VectorMask<E>,
2815 //  E>
2816 //  V compressExpandOp(int opr,
2817 //                    Class<? extends V> vClass, Class<? extends M> mClass, Class<E> eClass,
2818 //                    int length, V v, M m,
2819 //                    CompressExpandOperation<V, M> defaultImpl)
2820 bool LibraryCallKit::inline_vector_compress_expand() {
2821   const TypeInt*     opr          = gvn().type(argument(0))->isa_int();
2822   const TypeInstPtr* vector_klass = gvn().type(argument(1))->isa_instptr();
2823   const TypeInstPtr* mask_klass   = gvn().type(argument(2))->isa_instptr();
2824   const TypeInstPtr* elem_klass   = gvn().type(argument(3))->isa_instptr();
2825   const TypeInt*     vlen         = gvn().type(argument(4))->isa_int();
2826 
2827   if (opr          == nullptr || !opr->is_con() ||
2828       vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
2829       mask_klass   == nullptr || mask_klass->const_oop()   == nullptr ||
2830       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
2831       vlen         == nullptr || !vlen->is_con()) {
2832     log_if_needed("  ** missing constant: opr=%s vclass=%s mclass=%s etype=%s vlen=%s",
2833                     NodeClassNames[argument(0)->Opcode()],
2834                     NodeClassNames[argument(1)->Opcode()],
2835                     NodeClassNames[argument(2)->Opcode()],
2836                     NodeClassNames[argument(3)->Opcode()],
2837                     NodeClassNames[argument(4)->Opcode()]);
2838     return false; // not enough info for intrinsification
2839   }
2840 
2841   if (!is_klass_initialized(vector_klass) || !is_klass_initialized(mask_klass)) {
2842     log_if_needed("  ** klass argument not initialized");
2843     return false;
2844   }
2845 
2846   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2847   if (!elem_type->is_primitive_type()) {
2848     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2849     return false; // should be primitive type
2850   }
2851 
2852   int num_elem = vlen->get_con();
2853   BasicType elem_bt = elem_type->basic_type();
2854   int opc = VectorSupport::vop2ideal(opr->get_con(), elem_bt);
2855 
2856   if (!arch_supports_vector(opc, num_elem, elem_bt, VecMaskUseLoad)) {
2857     log_if_needed("  ** not supported: opc=%d vlen=%d etype=%s ismask=useload",
2858                     opc, num_elem, type2name(elem_bt));
2859     return false; // not supported
2860   }
2861 
2862   Node* opd1 = nullptr;
2863   const TypeInstPtr* vbox_type = nullptr;
2864   if (opc != Op_CompressM) {
2865     ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2866     vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2867     opd1 = unbox_vector(argument(5), vbox_type, elem_bt, num_elem);
2868     if (opd1 == nullptr) {
2869       log_if_needed("  ** unbox failed vector=%s",
2870                       NodeClassNames[argument(5)->Opcode()]);
2871       return false;
2872     }
2873   }
2874 
2875   ciKlass* mbox_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
2876   assert(is_vector_mask(mbox_klass), "argument(6) should be a mask class");
2877   const TypeInstPtr* mbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, mbox_klass);
2878 
2879   Node* mask = unbox_vector(argument(6), mbox_type, elem_bt, num_elem);
2880   if (mask == nullptr) {
2881     log_if_needed("  ** unbox failed mask=%s",
2882                     NodeClassNames[argument(6)->Opcode()]);
2883     return false;
2884   }
2885 
2886   const TypeVect* vt = TypeVect::make(elem_bt, num_elem, opc == Op_CompressM);
2887   Node* operation = gvn().transform(VectorNode::make(opc, opd1, mask, vt));
2888 
2889   // Wrap it up in VectorBox to keep object type information.
2890   const TypeInstPtr* box_type = opc == Op_CompressM ? mbox_type : vbox_type;
2891   Node* vbox = box_vector(operation, box_type, elem_bt, num_elem);
2892   set_result(vbox);
2893   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
2894   return true;
2895 }
2896 
2897 // public static
2898 // <V extends Vector<E>,
2899 //  E,
2900 //  S extends VectorSpecies<E>>
2901 //  V indexVector(Class<? extends V> vClass, Class<E> eClass,
2902 //                int length,
2903 //                V v, int step, S s,
2904 //                IndexOperation<V, S> defaultImpl)
2905 bool LibraryCallKit::inline_index_vector() {
2906   const TypeInstPtr* vector_klass = gvn().type(argument(0))->isa_instptr();
2907   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
2908   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
2909 
2910   if (vector_klass == nullptr || vector_klass->const_oop() == nullptr ||
2911       elem_klass   == nullptr || elem_klass->const_oop()   == nullptr ||
2912       vlen         == nullptr || !vlen->is_con() ) {
2913     log_if_needed("  ** missing constant: vclass=%s etype=%s vlen=%s",
2914                     NodeClassNames[argument(0)->Opcode()],
2915                     NodeClassNames[argument(1)->Opcode()],
2916                     NodeClassNames[argument(2)->Opcode()]);
2917     return false; // not enough info for intrinsification
2918   }
2919 
2920   if (!is_klass_initialized(vector_klass)) {
2921     log_if_needed("  ** klass argument not initialized");
2922     return false;
2923   }
2924 
2925   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
2926   if (!elem_type->is_primitive_type()) {
2927     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
2928     return false; // should be primitive type
2929   }
2930 
2931   int num_elem = vlen->get_con();
2932   BasicType elem_bt = elem_type->basic_type();
2933 
2934   // Check whether the iota index generation op is supported by the current hardware
2935   if (!arch_supports_vector(Op_VectorLoadConst, num_elem, elem_bt, VecMaskNotUsed)) {
2936     log_if_needed("  ** not supported: vlen=%d etype=%s", num_elem, type2name(elem_bt));
2937     return false; // not supported
2938   }
2939 
2940   int mul_op = VectorSupport::vop2ideal(VectorSupport::VECTOR_OP_MUL, elem_bt);
2941   int vmul_op = VectorNode::opcode(mul_op, elem_bt);
2942   bool needs_mul = true;
2943   Node* scale = argument(4);
2944   const TypeInt* scale_type = gvn().type(scale)->isa_int();
2945   // Multiply is not needed if the scale is a constant "1".
2946   if (scale_type && scale_type->is_con() && scale_type->get_con() == 1) {
2947     needs_mul = false;
2948   } else {
2949     // Check whether the vector multiply op is supported by the current hardware
2950     if (!arch_supports_vector(vmul_op, num_elem, elem_bt, VecMaskNotUsed)) {
2951       log_if_needed("  ** not supported: vlen=%d etype=%s", num_elem, type2name(elem_bt));
2952       return false; // not supported
2953     }
2954 
2955     // Check whether the scalar cast op is supported by the current hardware
2956     if (is_floating_point_type(elem_bt) || elem_bt == T_LONG) {
2957       int cast_op = elem_bt == T_LONG ? Op_ConvI2L :
2958                     elem_bt == T_FLOAT? Op_ConvI2F : Op_ConvI2D;
2959       if (!Matcher::match_rule_supported(cast_op)) {
2960         log_if_needed("  ** Rejected op (%s) because architecture does not support it",
2961                         NodeClassNames[cast_op]);
2962         return false; // not supported
2963       }
2964     }
2965   }
2966 
2967   ciKlass* vbox_klass = vector_klass->const_oop()->as_instance()->java_lang_Class_klass();
2968   const TypeInstPtr* vbox_type = TypeInstPtr::make_exact(TypePtr::NotNull, vbox_klass);
2969   Node* opd = unbox_vector(argument(3), vbox_type, elem_bt, num_elem);
2970   if (opd == nullptr) {
2971     log_if_needed("  ** unbox failed vector=%s",
2972                     NodeClassNames[argument(3)->Opcode()]);
2973     return false;
2974   }
2975 
2976   int add_op = VectorSupport::vop2ideal(VectorSupport::VECTOR_OP_ADD, elem_bt);
2977   int vadd_op = VectorNode::opcode(add_op, elem_bt);
2978   bool needs_add = true;
2979   // The addition is not needed if all the element values of "opd" are zero
2980   if (VectorNode::is_all_zeros_vector(opd)) {
2981     needs_add = false;
2982   } else {
2983     // Check whether the vector addition op is supported by the current hardware
2984     if (!arch_supports_vector(vadd_op, num_elem, elem_bt, VecMaskNotUsed)) {
2985       log_if_needed("  ** not supported: vlen=%d etype=%s", num_elem, type2name(elem_bt));
2986       return false; // not supported
2987     }
2988   }
2989 
2990   // Compute the iota indice vector
2991   const TypeVect* vt = TypeVect::make(elem_bt, num_elem);
2992   Node* index = gvn().transform(new VectorLoadConstNode(gvn().makecon(TypeInt::ZERO), vt));
2993 
2994   // Broadcast the "scale" to a vector, and multiply the "scale" with iota indice vector.
2995   if (needs_mul) {
2996     switch (elem_bt) {
2997       case T_BOOLEAN: // fall-through
2998       case T_BYTE:    // fall-through
2999       case T_SHORT:   // fall-through
3000       case T_CHAR:    // fall-through
3001       case T_INT: {
3002         // no conversion needed
3003         break;
3004       }
3005       case T_LONG: {
3006         scale = gvn().transform(new ConvI2LNode(scale));
3007         break;
3008       }
3009       case T_FLOAT: {
3010         scale = gvn().transform(new ConvI2FNode(scale));
3011         break;
3012       }
3013       case T_DOUBLE: {
3014         scale = gvn().transform(new ConvI2DNode(scale));
3015         break;
3016       }
3017       default: fatal("%s", type2name(elem_bt));
3018     }
3019     scale = gvn().transform(VectorNode::scalar2vector(scale, num_elem, elem_bt));
3020     index = gvn().transform(VectorNode::make(vmul_op, index, scale, vt));
3021   }
3022 
3023   // Add "opd" if addition is needed.
3024   if (needs_add) {
3025     index = gvn().transform(VectorNode::make(vadd_op, opd, index, vt));
3026   }
3027   Node* vbox = box_vector(index, vbox_type, elem_bt, num_elem);
3028   set_result(vbox);
3029   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
3030   return true;
3031 }
3032 
3033 // public static
3034 // <E,
3035 //  M extends VectorMask<E>>
3036 // M indexPartiallyInUpperRange(Class<? extends M> mClass, Class<E> eClass, int length,
3037 //                              long offset, long limit,
3038 //                              IndexPartiallyInUpperRangeOperation<E, M> defaultImpl)
3039 bool LibraryCallKit::inline_index_partially_in_upper_range() {
3040   const TypeInstPtr* mask_klass   = gvn().type(argument(0))->isa_instptr();
3041   const TypeInstPtr* elem_klass   = gvn().type(argument(1))->isa_instptr();
3042   const TypeInt*     vlen         = gvn().type(argument(2))->isa_int();
3043 
3044   if (mask_klass == nullptr || mask_klass->const_oop() == nullptr ||
3045       elem_klass == nullptr || elem_klass->const_oop() == nullptr ||
3046       vlen       == nullptr || !vlen->is_con()) {
3047     log_if_needed("  ** missing constant: mclass=%s etype=%s vlen=%s",
3048                     NodeClassNames[argument(0)->Opcode()],
3049                     NodeClassNames[argument(1)->Opcode()],
3050                     NodeClassNames[argument(2)->Opcode()]);
3051     return false; // not enough info for intrinsification
3052   }
3053 
3054   if (!is_klass_initialized(mask_klass)) {
3055     log_if_needed("  ** klass argument not initialized");
3056     return false;
3057   }
3058 
3059   ciType* elem_type = elem_klass->const_oop()->as_instance()->java_mirror_type();
3060   if (!elem_type->is_primitive_type()) {
3061     log_if_needed("  ** not a primitive bt=%d", elem_type->basic_type());
3062     return false; // should be primitive type
3063   }
3064 
3065   int num_elem = vlen->get_con();
3066   BasicType elem_bt = elem_type->basic_type();
3067 
3068   // Check whether the necessary ops are supported by current hardware.
3069   bool supports_mask_gen = arch_supports_vector(Op_VectorMaskGen, num_elem, elem_bt, VecMaskUseStore);
3070   if (!supports_mask_gen) {
3071     if (!arch_supports_vector(Op_VectorLoadConst, num_elem, elem_bt, VecMaskNotUsed) ||
3072         !arch_supports_vector(Op_Replicate, num_elem, elem_bt, VecMaskNotUsed) ||
3073         !arch_supports_vector(Op_VectorMaskCmp, num_elem, elem_bt, VecMaskUseStore)) {
3074       log_if_needed("  ** not supported: vlen=%d etype=%s", num_elem, type2name(elem_bt));
3075       return false; // not supported
3076     }
3077 
3078     // Check whether the scalar cast operation is supported by current hardware.
3079     if (elem_bt != T_LONG) {
3080       int cast_op = is_integral_type(elem_bt) ? Op_ConvL2I
3081                                               : (elem_bt == T_FLOAT ? Op_ConvL2F : Op_ConvL2D);
3082       if (!Matcher::match_rule_supported(cast_op)) {
3083         log_if_needed("  ** Rejected op (%s) because architecture does not support it",
3084                         NodeClassNames[cast_op]);
3085         return false; // not supported
3086       }
3087     }
3088   }
3089 
3090   Node* offset = argument(3);
3091   Node* limit = argument(5);
3092   if (offset == nullptr || limit == nullptr) {
3093     log_if_needed("  ** offset or limit argument is null");
3094     return false; // not supported
3095   }
3096 
3097   ciKlass* box_klass = mask_klass->const_oop()->as_instance()->java_lang_Class_klass();
3098   assert(is_vector_mask(box_klass), "argument(0) should be a mask class");
3099   const TypeInstPtr* box_type = TypeInstPtr::make_exact(TypePtr::NotNull, box_klass);
3100 
3101   // We assume "offset > 0 && limit >= offset && limit - offset < num_elem".
3102   // So directly get indexLimit with "indexLimit = limit - offset".
3103   Node* indexLimit = gvn().transform(new SubLNode(limit, offset));
3104   Node* mask = nullptr;
3105   if (supports_mask_gen) {
3106     mask = gvn().transform(VectorMaskGenNode::make(indexLimit, elem_bt, num_elem));
3107   } else {
3108     // Generate the vector mask based on "mask = iota < indexLimit".
3109     // Broadcast "indexLimit" to a vector.
3110     switch (elem_bt) {
3111       case T_BOOLEAN: // fall-through
3112       case T_BYTE:    // fall-through
3113       case T_SHORT:   // fall-through
3114       case T_CHAR:    // fall-through
3115       case T_INT: {
3116         indexLimit = gvn().transform(new ConvL2INode(indexLimit));
3117         break;
3118       }
3119       case T_DOUBLE: {
3120         indexLimit = gvn().transform(new ConvL2DNode(indexLimit));
3121         break;
3122       }
3123       case T_FLOAT: {
3124         indexLimit = gvn().transform(new ConvL2FNode(indexLimit));
3125         break;
3126       }
3127       case T_LONG: {
3128         // no conversion needed
3129         break;
3130       }
3131       default: fatal("%s", type2name(elem_bt));
3132     }
3133     indexLimit = gvn().transform(VectorNode::scalar2vector(indexLimit, num_elem, elem_bt));
3134 
3135     // Load the "iota" vector.
3136     const TypeVect* vt = TypeVect::make(elem_bt, num_elem);
3137     Node* iota = gvn().transform(new VectorLoadConstNode(gvn().makecon(TypeInt::ZERO), vt));
3138 
3139     // Compute the vector mask with "mask = iota < indexLimit".
3140     ConINode* pred_node = (ConINode*)gvn().makecon(TypeInt::make(BoolTest::lt));
3141     const TypeVect* vmask_type = TypeVect::makemask(elem_bt, num_elem);
3142     mask = gvn().transform(new VectorMaskCmpNode(BoolTest::lt, iota, indexLimit, pred_node, vmask_type));
3143   }
3144   Node* vbox = box_vector(mask, box_type, elem_bt, num_elem);
3145   set_result(vbox);
3146   C->set_max_vector_size(MAX2(C->max_vector_size(), (uint)(num_elem * type2aelembytes(elem_bt))));
3147   return true;
3148 }
3149 
3150 #undef non_product_log_if_needed
3151 #undef log_if_needed