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