1 /*
2  * Copyright (c) 2007, 2017, 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 #include "precompiled.hpp"
25 #include "memory/allocation.inline.hpp"
26 #include "opto/connode.hpp"
27 #include "opto/vectornode.hpp"
28 
29 //------------------------------VectorNode--------------------------------------
30 
31 // Return the vector operator for the specified scalar operation
32 // and vector length.
opcode(int sopc,BasicType bt)33 int VectorNode::opcode(int sopc, BasicType bt) {
34   switch (sopc) {
35   case Op_AddI:
36     switch (bt) {
37     case T_BOOLEAN:
38     case T_BYTE:      return Op_AddVB;
39     case T_CHAR:
40     case T_SHORT:     return Op_AddVS;
41     case T_INT:       return Op_AddVI;
42     default:          ShouldNotReachHere(); return 0;
43     }
44   case Op_AddL:
45     assert(bt == T_LONG, "must be");
46     return Op_AddVL;
47   case Op_AddF:
48     assert(bt == T_FLOAT, "must be");
49     return Op_AddVF;
50   case Op_AddD:
51     assert(bt == T_DOUBLE, "must be");
52     return Op_AddVD;
53   case Op_SubI:
54     switch (bt) {
55     case T_BOOLEAN:
56     case T_BYTE:   return Op_SubVB;
57     case T_CHAR:
58     case T_SHORT:  return Op_SubVS;
59     case T_INT:    return Op_SubVI;
60     default:       ShouldNotReachHere(); return 0;
61     }
62   case Op_SubL:
63     assert(bt == T_LONG, "must be");
64     return Op_SubVL;
65   case Op_SubF:
66     assert(bt == T_FLOAT, "must be");
67     return Op_SubVF;
68   case Op_SubD:
69     assert(bt == T_DOUBLE, "must be");
70     return Op_SubVD;
71   case Op_MulI:
72     switch (bt) {
73     case T_BOOLEAN:return 0;
74     case T_BYTE:   return Op_MulVB;
75     case T_CHAR:
76     case T_SHORT:  return Op_MulVS;
77     case T_INT:    return Op_MulVI;
78     default:       ShouldNotReachHere(); return 0;
79     }
80   case Op_MulL:
81     assert(bt == T_LONG, "must be");
82     return Op_MulVL;
83   case Op_MulF:
84     assert(bt == T_FLOAT, "must be");
85     return Op_MulVF;
86   case Op_MulD:
87     assert(bt == T_DOUBLE, "must be");
88     return Op_MulVD;
89   case Op_FmaD:
90     assert(bt == T_DOUBLE, "must be");
91     return Op_FmaVD;
92   case Op_FmaF:
93     assert(bt == T_FLOAT, "must be");
94     return Op_FmaVF;
95   case Op_CMoveF:
96     assert(bt == T_FLOAT, "must be");
97     return Op_CMoveVF;
98   case Op_CMoveD:
99     assert(bt == T_DOUBLE, "must be");
100     return Op_CMoveVD;
101   case Op_DivF:
102     assert(bt == T_FLOAT, "must be");
103     return Op_DivVF;
104   case Op_DivD:
105     assert(bt == T_DOUBLE, "must be");
106     return Op_DivVD;
107   case Op_AbsI:
108     switch (bt) {
109     case T_BOOLEAN:
110     case T_CHAR:  return 0; // abs does not make sense for unsigned
111     case T_BYTE:  return Op_AbsVB;
112     case T_SHORT: return Op_AbsVS;
113     case T_INT:   return Op_AbsVI;
114     default: ShouldNotReachHere(); return 0;
115     }
116   case Op_AbsL:
117     assert(bt == T_LONG, "must be");
118     return Op_AbsVL;
119   case Op_AbsF:
120     assert(bt == T_FLOAT, "must be");
121     return Op_AbsVF;
122   case Op_AbsD:
123     assert(bt == T_DOUBLE, "must be");
124     return Op_AbsVD;
125   case Op_NegF:
126     assert(bt == T_FLOAT, "must be");
127     return Op_NegVF;
128   case Op_NegD:
129     assert(bt == T_DOUBLE, "must be");
130     return Op_NegVD;
131   case Op_RoundDoubleMode:
132     assert(bt == T_DOUBLE, "must be");
133     return Op_RoundDoubleModeV;
134   case Op_SqrtF:
135     assert(bt == T_FLOAT, "must be");
136     return Op_SqrtVF;
137   case Op_SqrtD:
138     assert(bt == T_DOUBLE, "must be");
139     return Op_SqrtVD;
140   case Op_PopCountI:
141     if (bt == T_INT) {
142       return Op_PopCountVI;
143     }
144     // Unimplemented for subword types since bit count changes
145     // depending on size of lane (and sign bit).
146     return 0;
147   case Op_LShiftI:
148     switch (bt) {
149     case T_BOOLEAN:
150     case T_BYTE:   return Op_LShiftVB;
151     case T_CHAR:
152     case T_SHORT:  return Op_LShiftVS;
153     case T_INT:    return Op_LShiftVI;
154       default:       ShouldNotReachHere(); return 0;
155     }
156   case Op_LShiftL:
157     assert(bt == T_LONG, "must be");
158     return Op_LShiftVL;
159   case Op_RShiftI:
160     switch (bt) {
161     case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value
162     case T_CHAR:   return Op_URShiftVS; // char is unsigned value
163     case T_BYTE:   return Op_RShiftVB;
164     case T_SHORT:  return Op_RShiftVS;
165     case T_INT:    return Op_RShiftVI;
166     default:       ShouldNotReachHere(); return 0;
167     }
168   case Op_RShiftL:
169     assert(bt == T_LONG, "must be");
170     return Op_RShiftVL;
171   case Op_URShiftI:
172     switch (bt) {
173     case T_BOOLEAN:return Op_URShiftVB;
174     case T_CHAR:   return Op_URShiftVS;
175     case T_BYTE:
176     case T_SHORT:  return 0; // Vector logical right shift for signed short
177                              // values produces incorrect Java result for
178                              // negative data because java code should convert
179                              // a short value into int value with sign
180                              // extension before a shift.
181     case T_INT:    return Op_URShiftVI;
182     default:       ShouldNotReachHere(); return 0;
183     }
184   case Op_URShiftL:
185     assert(bt == T_LONG, "must be");
186     return Op_URShiftVL;
187   case Op_AndI:
188   case Op_AndL:
189     return Op_AndV;
190   case Op_OrI:
191   case Op_OrL:
192     return Op_OrV;
193   case Op_XorI:
194   case Op_XorL:
195     return Op_XorV;
196   case Op_MinF:
197     assert(bt == T_FLOAT, "must be");
198     return Op_MinV;
199   case Op_MinD:
200     assert(bt == T_DOUBLE, "must be");
201     return Op_MinV;
202   case Op_MaxF:
203     assert(bt == T_FLOAT, "must be");
204     return Op_MaxV;
205   case Op_MaxD:
206     assert(bt == T_DOUBLE, "must be");
207     return Op_MaxV;
208 
209   case Op_LoadB:
210   case Op_LoadUB:
211   case Op_LoadUS:
212   case Op_LoadS:
213   case Op_LoadI:
214   case Op_LoadL:
215   case Op_LoadF:
216   case Op_LoadD:
217     return Op_LoadVector;
218 
219   case Op_StoreB:
220   case Op_StoreC:
221   case Op_StoreI:
222   case Op_StoreL:
223   case Op_StoreF:
224   case Op_StoreD:
225     return Op_StoreVector;
226 
227   default:
228     return 0; // Unimplemented
229   }
230 }
231 
232 // Also used to check if the code generator
233 // supports the vector operation.
implemented(int opc,uint vlen,BasicType bt)234 bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
235   if (is_java_primitive(bt) &&
236       (vlen > 1) && is_power_of_2(vlen) &&
237       Matcher::vector_size_supported(bt, vlen)) {
238     int vopc = VectorNode::opcode(opc, bt);
239     return vopc > 0 && Matcher::match_rule_supported_vector(vopc, vlen);
240   }
241   return false;
242 }
243 
is_roundopD(Node * n)244 bool VectorNode::is_roundopD(Node *n) {
245   if (n->Opcode() == Op_RoundDoubleMode) {
246     return true;
247   }
248   return false;
249 }
250 
is_shift(Node * n)251 bool VectorNode::is_shift(Node* n) {
252   switch (n->Opcode()) {
253   case Op_LShiftI:
254   case Op_LShiftL:
255   case Op_RShiftI:
256   case Op_RShiftL:
257   case Op_URShiftI:
258   case Op_URShiftL:
259     return true;
260   default:
261     return false;
262   }
263 }
264 
265 // Check if input is loop invariant vector.
is_invariant_vector(Node * n)266 bool VectorNode::is_invariant_vector(Node* n) {
267   // Only Replicate vector nodes are loop invariant for now.
268   switch (n->Opcode()) {
269   case Op_ReplicateB:
270   case Op_ReplicateS:
271   case Op_ReplicateI:
272   case Op_ReplicateL:
273   case Op_ReplicateF:
274   case Op_ReplicateD:
275     return true;
276   default:
277     return false;
278   }
279 }
280 
281 // [Start, end) half-open range defining which operands are vectors
vector_operands(Node * n,uint * start,uint * end)282 void VectorNode::vector_operands(Node* n, uint* start, uint* end) {
283   switch (n->Opcode()) {
284   case Op_LoadB:   case Op_LoadUB:
285   case Op_LoadS:   case Op_LoadUS:
286   case Op_LoadI:   case Op_LoadL:
287   case Op_LoadF:   case Op_LoadD:
288   case Op_LoadP:   case Op_LoadN:
289   case Op_LoadBarrierSlowReg:
290   case Op_LoadBarrierWeakSlowReg:
291     *start = 0;
292     *end   = 0; // no vector operands
293     break;
294   case Op_StoreB:  case Op_StoreC:
295   case Op_StoreI:  case Op_StoreL:
296   case Op_StoreF:  case Op_StoreD:
297   case Op_StoreP:  case Op_StoreN:
298     *start = MemNode::ValueIn;
299     *end   = MemNode::ValueIn + 1; // 1 vector operand
300     break;
301   case Op_LShiftI:  case Op_LShiftL:
302   case Op_RShiftI:  case Op_RShiftL:
303   case Op_URShiftI: case Op_URShiftL:
304     *start = 1;
305     *end   = 2; // 1 vector operand
306     break;
307   case Op_AddI: case Op_AddL: case Op_AddF: case Op_AddD:
308   case Op_SubI: case Op_SubL: case Op_SubF: case Op_SubD:
309   case Op_MulI: case Op_MulL: case Op_MulF: case Op_MulD:
310   case Op_DivF: case Op_DivD:
311   case Op_AndI: case Op_AndL:
312   case Op_OrI:  case Op_OrL:
313   case Op_XorI: case Op_XorL:
314     *start = 1;
315     *end   = 3; // 2 vector operands
316     break;
317   case Op_CMoveI:  case Op_CMoveL:  case Op_CMoveF:  case Op_CMoveD:
318     *start = 2;
319     *end   = n->req();
320     break;
321   case Op_FmaD:
322   case Op_FmaF:
323     *start = 1;
324     *end   = 4; // 3 vector operands
325     break;
326   default:
327     *start = 1;
328     *end   = n->req(); // default is all operands
329   }
330 }
331 
332 // Return the vector version of a scalar operation node.
make(int opc,Node * n1,Node * n2,uint vlen,BasicType bt)333 VectorNode* VectorNode::make(int opc, Node* n1, Node* n2, uint vlen, BasicType bt) {
334   const TypeVect* vt = TypeVect::make(bt, vlen);
335   int vopc = VectorNode::opcode(opc, bt);
336   // This method should not be called for unimplemented vectors.
337   guarantee(vopc > 0, "Vector for '%s' is not implemented", NodeClassNames[opc]);
338   switch (vopc) {
339   case Op_AddVB: return new AddVBNode(n1, n2, vt);
340   case Op_AddVS: return new AddVSNode(n1, n2, vt);
341   case Op_AddVI: return new AddVINode(n1, n2, vt);
342   case Op_AddVL: return new AddVLNode(n1, n2, vt);
343   case Op_AddVF: return new AddVFNode(n1, n2, vt);
344   case Op_AddVD: return new AddVDNode(n1, n2, vt);
345 
346   case Op_SubVB: return new SubVBNode(n1, n2, vt);
347   case Op_SubVS: return new SubVSNode(n1, n2, vt);
348   case Op_SubVI: return new SubVINode(n1, n2, vt);
349   case Op_SubVL: return new SubVLNode(n1, n2, vt);
350   case Op_SubVF: return new SubVFNode(n1, n2, vt);
351   case Op_SubVD: return new SubVDNode(n1, n2, vt);
352 
353   case Op_MulVB: return new MulVBNode(n1, n2, vt);
354   case Op_MulVS: return new MulVSNode(n1, n2, vt);
355   case Op_MulVI: return new MulVINode(n1, n2, vt);
356   case Op_MulVL: return new MulVLNode(n1, n2, vt);
357   case Op_MulVF: return new MulVFNode(n1, n2, vt);
358   case Op_MulVD: return new MulVDNode(n1, n2, vt);
359 
360   case Op_DivVF: return new DivVFNode(n1, n2, vt);
361   case Op_DivVD: return new DivVDNode(n1, n2, vt);
362 
363   case Op_AbsVB: return new AbsVBNode(n1, vt);
364   case Op_AbsVS: return new AbsVSNode(n1, vt);
365   case Op_AbsVI: return new AbsVINode(n1, vt);
366   case Op_AbsVL: return new AbsVLNode(n1, vt);
367   case Op_AbsVF: return new AbsVFNode(n1, vt);
368   case Op_AbsVD: return new AbsVDNode(n1, vt);
369 
370   case Op_NegVF: return new NegVFNode(n1, vt);
371   case Op_NegVD: return new NegVDNode(n1, vt);
372 
373   case Op_SqrtVF: return new SqrtVFNode(n1, vt);
374   case Op_SqrtVD: return new SqrtVDNode(n1, vt);
375 
376   case Op_PopCountVI: return new PopCountVINode(n1, vt);
377 
378   case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt);
379   case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt);
380   case Op_LShiftVI: return new LShiftVINode(n1, n2, vt);
381   case Op_LShiftVL: return new LShiftVLNode(n1, n2, vt);
382 
383   case Op_RShiftVB: return new RShiftVBNode(n1, n2, vt);
384   case Op_RShiftVS: return new RShiftVSNode(n1, n2, vt);
385   case Op_RShiftVI: return new RShiftVINode(n1, n2, vt);
386   case Op_RShiftVL: return new RShiftVLNode(n1, n2, vt);
387 
388   case Op_URShiftVB: return new URShiftVBNode(n1, n2, vt);
389   case Op_URShiftVS: return new URShiftVSNode(n1, n2, vt);
390   case Op_URShiftVI: return new URShiftVINode(n1, n2, vt);
391   case Op_URShiftVL: return new URShiftVLNode(n1, n2, vt);
392 
393   case Op_AndV: return new AndVNode(n1, n2, vt);
394   case Op_OrV:  return new OrVNode (n1, n2, vt);
395   case Op_XorV: return new XorVNode(n1, n2, vt);
396 
397   case Op_MinV: return new MinVNode(n1, n2, vt);
398   case Op_MaxV: return new MaxVNode(n1, n2, vt);
399 
400   case Op_RoundDoubleModeV: return new RoundDoubleModeVNode(n1, n2, vt);
401   default:
402     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
403     return NULL;
404   }
405 }
406 
make(int opc,Node * n1,Node * n2,Node * n3,uint vlen,BasicType bt)407 VectorNode* VectorNode::make(int opc, Node* n1, Node* n2, Node* n3, uint vlen, BasicType bt) {
408   const TypeVect* vt = TypeVect::make(bt, vlen);
409   int vopc = VectorNode::opcode(opc, bt);
410   // This method should not be called for unimplemented vectors.
411   guarantee(vopc > 0, "Vector for '%s' is not implemented", NodeClassNames[opc]);
412   switch (vopc) {
413   case Op_FmaVD: return new FmaVDNode(n1, n2, n3, vt);
414   case Op_FmaVF: return new FmaVFNode(n1, n2, n3, vt);
415   default:
416     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
417     return NULL;
418   }
419 }
420 
421 // Scalar promotion
scalar2vector(Node * s,uint vlen,const Type * opd_t)422 VectorNode* VectorNode::scalar2vector(Node* s, uint vlen, const Type* opd_t) {
423   BasicType bt = opd_t->array_element_basic_type();
424   const TypeVect* vt = opd_t->singleton() ? TypeVect::make(opd_t, vlen)
425                                           : TypeVect::make(bt, vlen);
426   switch (bt) {
427   case T_BOOLEAN:
428   case T_BYTE:
429     return new ReplicateBNode(s, vt);
430   case T_CHAR:
431   case T_SHORT:
432     return new ReplicateSNode(s, vt);
433   case T_INT:
434     return new ReplicateINode(s, vt);
435   case T_LONG:
436     return new ReplicateLNode(s, vt);
437   case T_FLOAT:
438     return new ReplicateFNode(s, vt);
439   case T_DOUBLE:
440     return new ReplicateDNode(s, vt);
441   default:
442     fatal("Type '%s' is not supported for vectors", type2name(bt));
443     return NULL;
444   }
445 }
446 
shift_count(Node * shift,Node * cnt,uint vlen,BasicType bt)447 VectorNode* VectorNode::shift_count(Node* shift, Node* cnt, uint vlen, BasicType bt) {
448   assert(VectorNode::is_shift(shift) && !cnt->is_Con(), "only variable shift count");
449   // Match shift count type with shift vector type.
450   const TypeVect* vt = TypeVect::make(bt, vlen);
451   switch (shift->Opcode()) {
452   case Op_LShiftI:
453   case Op_LShiftL:
454     return new LShiftCntVNode(cnt, vt);
455   case Op_RShiftI:
456   case Op_RShiftL:
457   case Op_URShiftI:
458   case Op_URShiftL:
459     return new RShiftCntVNode(cnt, vt);
460   default:
461     fatal("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()]);
462     return NULL;
463   }
464 }
465 
466 // Return initial Pack node. Additional operands added with add_opd() calls.
make(Node * s,uint vlen,BasicType bt)467 PackNode* PackNode::make(Node* s, uint vlen, BasicType bt) {
468   const TypeVect* vt = TypeVect::make(bt, vlen);
469   switch (bt) {
470   case T_BOOLEAN:
471   case T_BYTE:
472     return new PackBNode(s, vt);
473   case T_CHAR:
474   case T_SHORT:
475     return new PackSNode(s, vt);
476   case T_INT:
477     return new PackINode(s, vt);
478   case T_LONG:
479     return new PackLNode(s, vt);
480   case T_FLOAT:
481     return new PackFNode(s, vt);
482   case T_DOUBLE:
483     return new PackDNode(s, vt);
484   default:
485     fatal("Type '%s' is not supported for vectors", type2name(bt));
486     return NULL;
487   }
488 }
489 
490 // Create a binary tree form for Packs. [lo, hi) (half-open) range
binary_tree_pack(int lo,int hi)491 PackNode* PackNode::binary_tree_pack(int lo, int hi) {
492   int ct = hi - lo;
493   assert(is_power_of_2(ct), "power of 2");
494   if (ct == 2) {
495     PackNode* pk = PackNode::make(in(lo), 2, vect_type()->element_basic_type());
496     pk->add_opd(in(lo+1));
497     return pk;
498   } else {
499     int mid = lo + ct/2;
500     PackNode* n1 = binary_tree_pack(lo,  mid);
501     PackNode* n2 = binary_tree_pack(mid, hi );
502 
503     BasicType bt = n1->vect_type()->element_basic_type();
504     assert(bt == n2->vect_type()->element_basic_type(), "should be the same");
505     switch (bt) {
506     case T_BOOLEAN:
507     case T_BYTE:
508       return new PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
509     case T_CHAR:
510     case T_SHORT:
511       return new PackINode(n1, n2, TypeVect::make(T_INT, 2));
512     case T_INT:
513       return new PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
514     case T_LONG:
515       return new Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
516     case T_FLOAT:
517       return new PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
518     case T_DOUBLE:
519       return new Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
520     default:
521       fatal("Type '%s' is not supported for vectors", type2name(bt));
522       return NULL;
523     }
524   }
525 }
526 
527 // Return the vector version of a scalar load node.
make(int opc,Node * ctl,Node * mem,Node * adr,const TypePtr * atyp,uint vlen,BasicType bt,ControlDependency control_dependency)528 LoadVectorNode* LoadVectorNode::make(int opc, Node* ctl, Node* mem,
529                                      Node* adr, const TypePtr* atyp,
530                                      uint vlen, BasicType bt,
531                                      ControlDependency control_dependency) {
532   const TypeVect* vt = TypeVect::make(bt, vlen);
533   return new LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
534 }
535 
536 // Return the vector version of a scalar store node.
make(int opc,Node * ctl,Node * mem,Node * adr,const TypePtr * atyp,Node * val,uint vlen)537 StoreVectorNode* StoreVectorNode::make(int opc, Node* ctl, Node* mem,
538                                        Node* adr, const TypePtr* atyp, Node* val,
539                                        uint vlen) {
540   return new StoreVectorNode(ctl, mem, adr, atyp, val);
541 }
542 
543 // Extract a scalar element of vector.
make(Node * v,uint position,BasicType bt)544 Node* ExtractNode::make(Node* v, uint position, BasicType bt) {
545   assert((int)position < Matcher::max_vector_size(bt), "pos in range");
546   ConINode* pos = ConINode::make((int)position);
547   switch (bt) {
548   case T_BOOLEAN:
549     return new ExtractUBNode(v, pos);
550   case T_BYTE:
551     return new ExtractBNode(v, pos);
552   case T_CHAR:
553     return new ExtractCNode(v, pos);
554   case T_SHORT:
555     return new ExtractSNode(v, pos);
556   case T_INT:
557     return new ExtractINode(v, pos);
558   case T_LONG:
559     return new ExtractLNode(v, pos);
560   case T_FLOAT:
561     return new ExtractFNode(v, pos);
562   case T_DOUBLE:
563     return new ExtractDNode(v, pos);
564   default:
565     fatal("Type '%s' is not supported for vectors", type2name(bt));
566     return NULL;
567   }
568 }
569 
opcode(int opc,BasicType bt)570 int ReductionNode::opcode(int opc, BasicType bt) {
571   int vopc = opc;
572   switch (opc) {
573     case Op_AddI:
574       assert(bt == T_INT, "must be");
575       vopc = Op_AddReductionVI;
576       break;
577     case Op_AddL:
578       assert(bt == T_LONG, "must be");
579       vopc = Op_AddReductionVL;
580       break;
581     case Op_AddF:
582       assert(bt == T_FLOAT, "must be");
583       vopc = Op_AddReductionVF;
584       break;
585     case Op_AddD:
586       assert(bt == T_DOUBLE, "must be");
587       vopc = Op_AddReductionVD;
588       break;
589     case Op_MulI:
590       assert(bt == T_INT, "must be");
591       vopc = Op_MulReductionVI;
592       break;
593     case Op_MulL:
594       assert(bt == T_LONG, "must be");
595       vopc = Op_MulReductionVL;
596       break;
597     case Op_MulF:
598       assert(bt == T_FLOAT, "must be");
599       vopc = Op_MulReductionVF;
600       break;
601     case Op_MulD:
602       assert(bt == T_DOUBLE, "must be");
603       vopc = Op_MulReductionVD;
604       break;
605     case Op_MinF:
606       assert(bt == T_FLOAT, "must be");
607       vopc = Op_MinReductionV;
608       break;
609     case Op_MinD:
610       assert(bt == T_DOUBLE, "must be");
611       vopc = Op_MinReductionV;
612       break;
613     case Op_MaxF:
614       assert(bt == T_FLOAT, "must be");
615       vopc = Op_MaxReductionV;
616       break;
617     case Op_MaxD:
618       assert(bt == T_DOUBLE, "must be");
619       vopc = Op_MaxReductionV;
620       break;
621     // TODO: add MulL for targets that support it
622     default:
623       break;
624   }
625   return vopc;
626 }
627 
628 // Return the appropriate reduction node.
make(int opc,Node * ctrl,Node * n1,Node * n2,BasicType bt)629 ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, BasicType bt) {
630 
631   int vopc = opcode(opc, bt);
632 
633   // This method should not be called for unimplemented vectors.
634   guarantee(vopc != opc, "Vector for '%s' is not implemented", NodeClassNames[opc]);
635 
636   switch (vopc) {
637   case Op_AddReductionVI: return new AddReductionVINode(ctrl, n1, n2);
638   case Op_AddReductionVL: return new AddReductionVLNode(ctrl, n1, n2);
639   case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2);
640   case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2);
641   case Op_MulReductionVI: return new MulReductionVINode(ctrl, n1, n2);
642   case Op_MulReductionVL: return new MulReductionVLNode(ctrl, n1, n2);
643   case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2);
644   case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2);
645   case Op_MinReductionV: return new MinReductionVNode(ctrl, n1, n2);
646   case Op_MaxReductionV: return new MaxReductionVNode(ctrl, n1, n2);
647   default:
648     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
649     return NULL;
650   }
651 }
652 
implemented(int opc,uint vlen,BasicType bt)653 bool ReductionNode::implemented(int opc, uint vlen, BasicType bt) {
654   if (is_java_primitive(bt) &&
655       (vlen > 1) && is_power_of_2(vlen) &&
656       Matcher::vector_size_supported(bt, vlen)) {
657     int vopc = ReductionNode::opcode(opc, bt);
658     return vopc != opc && Matcher::match_rule_supported(vopc);
659   }
660   return false;
661 }
662