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/cfgnode.hpp"
  28 #include "opto/vectornode.hpp"
  29 
  30 //------------------------------VectorNode--------------------------------------
  31 
  32 // Return the vector operator for the specified scalar operation
  33 // and vector length.
  34 int VectorNode::opcode(int sopc, BasicType bt) {
  35   switch (sopc) {
  36   case Op_AddI:
  37     switch (bt) {
  38     case T_BOOLEAN:
  39     case T_BYTE:      return Op_AddVB;
  40     case T_CHAR:
  41     case T_SHORT:     return Op_AddVS;
  42     case T_INT:       return Op_AddVI;
  43     default:          ShouldNotReachHere(); return 0;
  44     }
  45   case Op_AddL:
  46     assert(bt == T_LONG, "must be");
  47     return Op_AddVL;
  48   case Op_AddF:
  49     assert(bt == T_FLOAT, "must be");
  50     return Op_AddVF;
  51   case Op_AddD:
  52     assert(bt == T_DOUBLE, "must be");
  53     return Op_AddVD;
  54   case Op_SubI:
  55     switch (bt) {
  56     case T_BOOLEAN:
  57     case T_BYTE:   return Op_SubVB;
  58     case T_CHAR:
  59     case T_SHORT:  return Op_SubVS;
  60     case T_INT:    return Op_SubVI;
  61     default:       ShouldNotReachHere(); return 0;
  62     }
  63   case Op_SubL:
  64     assert(bt == T_LONG, "must be");
  65     return Op_SubVL;
  66   case Op_SubF:
  67     assert(bt == T_FLOAT, "must be");
  68     return Op_SubVF;
  69   case Op_SubD:
  70     assert(bt == T_DOUBLE, "must be");
  71     return Op_SubVD;
  72   case Op_MulI:
  73     switch (bt) {
  74     case T_BOOLEAN:
  75     case T_BYTE:   return Op_MulVB;
  76     case T_CHAR:
  77     case T_SHORT:  return Op_MulVS;
  78     case T_INT:    return Op_MulVI;
  79     default:       ShouldNotReachHere(); return 0;
  80     }
  81   case Op_MulL:
  82     assert(bt == T_LONG, "must be");
  83     return Op_MulVL;
  84   case Op_MulF:
  85     assert(bt == T_FLOAT, "must be");
  86     return Op_MulVF;
  87   case Op_MulD:
  88     assert(bt == T_DOUBLE, "must be");
  89     return Op_MulVD;
  90   case Op_FmaD:
  91     assert(bt == T_DOUBLE, "must be");
  92     return Op_FmaVD;
  93   case Op_FmaF:
  94     assert(bt == T_FLOAT, "must be");
  95     return Op_FmaVF;
  96   case Op_CMoveF:
  97     assert(bt == T_FLOAT, "must be");
  98     return Op_CMoveVF;
  99   case Op_CMoveD:
 100     assert(bt == T_DOUBLE, "must be");
 101     return Op_CMoveVD;
 102   case Op_DivF:
 103     assert(bt == T_FLOAT, "must be");
 104     return Op_DivVF;
 105   case Op_DivD:
 106     assert(bt == T_DOUBLE, "must be");
 107     return Op_DivVD;
 108   case Op_MinI:
 109     switch (bt) {
 110     case T_BOOLEAN:
 111     case T_CHAR:   return 0;
 112     case T_BYTE:
 113     case T_SHORT:
 114     case T_INT:    return Op_MinV;
 115     default:       ShouldNotReachHere(); return 0;
 116     }
 117   case Op_MinL:
 118     assert(bt == T_LONG, "must be");
 119     return Op_MinV;
 120   case Op_MinF:
 121     assert(bt == T_FLOAT, "must be");
 122     return Op_MinV;
 123   case Op_MinD:
 124     assert(bt == T_DOUBLE, "must be");
 125     return Op_MinV;
 126   case Op_MaxI:
 127     switch (bt) {
 128     case T_BOOLEAN:
 129     case T_CHAR:   return 0;
 130     case T_BYTE:
 131     case T_SHORT:
 132     case T_INT:    return Op_MaxV;
 133     default:       ShouldNotReachHere(); return 0;
 134     }
 135   case Op_MaxL:
 136     assert(bt == T_LONG, "must be");
 137     return Op_MaxV;
 138   case Op_MaxF:
 139     assert(bt == T_FLOAT, "must be");
 140     return Op_MaxV;
 141   case Op_MaxD:
 142     assert(bt == T_DOUBLE, "must be");
 143     return Op_MaxV;
 144   case Op_AbsI:
 145     switch (bt) {
 146     case T_BOOLEAN:
 147     case T_CHAR:  return 0; // abs does not make sense for unsigned
 148     case T_BYTE:
 149     case T_SHORT:
 150     case T_INT:
 151     case T_LONG:  return Op_AbsV;
 152     default: ShouldNotReachHere(); return 0;
 153     }
 154   case Op_AbsF:
 155     assert(bt == T_FLOAT, "must be");
 156     return Op_AbsVF;
 157   case Op_AbsD:
 158     assert(bt == T_DOUBLE, "must be");
 159     return Op_AbsVD;
 160   case Op_NegI:
 161     assert(bt == T_INT, "must be");
 162     return Op_NegVI;
 163   case Op_NegF:
 164     assert(bt == T_FLOAT, "must be");
 165     return Op_NegVF;
 166   case Op_NegD:
 167     assert(bt == T_DOUBLE, "must be");
 168     return Op_NegVD;
 169   case Op_SqrtF:
 170     assert(bt == T_FLOAT, "must be");
 171     return Op_SqrtVF;
 172   case Op_SqrtD:
 173     assert(bt == T_DOUBLE, "must be");
 174     return Op_SqrtVD;
 175   case Op_Not:
 176     return Op_NotV;
 177   case Op_PopCountI:
 178     if (bt == T_INT) {
 179       return Op_PopCountVI;
 180     }
 181     // Unimplemented for subword types since bit count changes
 182     // depending on size of lane (and sign bit).
 183     return 0;
 184   case Op_LShiftI:
 185     switch (bt) {
 186     case T_BOOLEAN:
 187     case T_BYTE:   return Op_LShiftVB;
 188     case T_CHAR:
 189     case T_SHORT:  return Op_LShiftVS;
 190     case T_INT:    return Op_LShiftVI;
 191       default:       ShouldNotReachHere(); return 0;
 192     }
 193   case Op_LShiftL:
 194     assert(bt == T_LONG, "must be");
 195     return Op_LShiftVL;
 196   case Op_RShiftI:
 197     switch (bt) {
 198     case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value
 199     case T_CHAR:   return Op_URShiftVS; // char is unsigned value
 200     case T_BYTE:   return Op_RShiftVB;
 201     case T_SHORT:  return Op_RShiftVS;
 202     case T_INT:    return Op_RShiftVI;
 203     default:       ShouldNotReachHere(); return 0;
 204     }
 205   case Op_RShiftL:
 206     assert(bt == T_LONG, "must be");
 207     return Op_RShiftVL;
 208   case Op_URShiftI:
 209     switch (bt) {
 210     case T_BOOLEAN:return Op_URShiftVB;
 211     case T_CHAR:   return Op_URShiftVS;
 212     case T_BYTE:
 213     case T_SHORT:  return 0; // Vector logical right shift for signed short
 214                              // values produces incorrect Java result for
 215                              // negative data because java code should convert
 216                              // a short value into int value with sign
 217                              // extension before a shift.
 218     case T_INT:    return Op_URShiftVI;
 219     default:       ShouldNotReachHere(); return 0;
 220     }
 221   case Op_URShiftL:
 222     assert(bt == T_LONG, "must be");
 223     return Op_URShiftVL;
 224   case Op_AndI:
 225   case Op_AndL:
 226     return Op_AndV;
 227   case Op_OrI:
 228   case Op_OrL:
 229     return Op_OrV;
 230   case Op_XorI:
 231   case Op_XorL:
 232     return Op_XorV;
 233 
 234   case Op_LoadB:
 235   case Op_LoadUB:
 236   case Op_LoadUS:
 237   case Op_LoadS:
 238   case Op_LoadI:
 239   case Op_LoadL:
 240   case Op_LoadF:
 241   case Op_LoadD:
 242     return Op_LoadVector;
 243 
 244   case Op_StoreB:
 245   case Op_StoreC:
 246   case Op_StoreI:
 247   case Op_StoreL:
 248   case Op_StoreF:
 249   case Op_StoreD:
 250     return Op_StoreVector;
 251 
 252   case Op_AddVB:
 253   case Op_AddVS:
 254   case Op_AddVI:
 255   case Op_AddVL:
 256   case Op_AddVF:
 257   case Op_AddVD:
 258   case Op_SubVB:
 259   case Op_SubVS:
 260   case Op_SubVI:
 261   case Op_SubVL:
 262   case Op_SubVF:
 263   case Op_SubVD:
 264   case Op_MulVB:
 265   case Op_MulVS:
 266   case Op_MulVI:
 267   case Op_MulVL:
 268   case Op_MulVF:
 269   case Op_MulVD:
 270   case Op_DivVF:
 271   case Op_DivVD:
 272   case Op_MinV:
 273   case Op_MaxV:
 274   case Op_AbsV:
 275   case Op_AbsVF:
 276   case Op_AbsVD:
 277   case Op_NegVI:
 278   case Op_NegVF:
 279   case Op_NegVD:
 280   case Op_SqrtVF:
 281   case Op_SqrtVD:
 282   case Op_NotV:
 283   case Op_LShiftVB:
 284   case Op_LShiftVS:
 285   case Op_LShiftVI:
 286   case Op_LShiftVL:
 287   case Op_RShiftVB:
 288   case Op_RShiftVS:
 289   case Op_RShiftVI:
 290   case Op_RShiftVL:
 291   case Op_URShiftVB:
 292   case Op_URShiftVS:
 293   case Op_URShiftVI:
 294   case Op_URShiftVL:
 295   case Op_AndV:
 296   case Op_OrV:
 297   case Op_XorV:
 298     // When op is already vectorized, return that directly.
 299     return sopc;
 300 
 301   default:
 302     return 0; // Unimplemented
 303   }
 304 }
 305 
 306 int VectorNode::replicate_opcode(BasicType bt) {
 307   switch(bt) {
 308     case T_BOOLEAN:
 309     case T_BYTE:
 310       return Op_ReplicateB;
 311     case T_SHORT:
 312     case T_CHAR:
 313       return Op_ReplicateS;
 314     case T_INT:
 315       return Op_ReplicateI;
 316     case T_LONG:
 317       return Op_ReplicateL;
 318     case T_FLOAT:
 319       return Op_ReplicateF;
 320     case T_DOUBLE:
 321       return Op_ReplicateD;
 322     default:
 323       break;
 324   }
 325 
 326   return 0;
 327 }
 328 
 329 // Also used to check if the code generator
 330 // supports the vector operation.
 331 bool VectorNode::implemented(int opc, uint vlen, BasicType bt) {
 332   if (is_java_primitive(bt) &&
 333       (vlen > 1) && is_power_of_2(vlen) &&
 334       Matcher::vector_size_supported(bt, vlen)) {
 335     int vopc = VectorNode::opcode(opc, bt);
 336     return vopc > 0 && Matcher::match_rule_supported_vector(vopc, vlen, bt);
 337   }
 338   return false;
 339 }
 340 
 341 bool VectorNode::is_shift(Node* n) {
 342   switch (n->Opcode()) {
 343   case Op_LShiftI:
 344   case Op_LShiftL:
 345   case Op_RShiftI:
 346   case Op_RShiftL:
 347   case Op_URShiftI:
 348   case Op_URShiftL:
 349     return true;
 350   default:
 351     return false;
 352   }
 353 }
 354 
 355 // Check if input is loop invariant vector.
 356 bool VectorNode::is_invariant_vector(Node* n) {
 357   // Only Replicate vector nodes are loop invariant for now.
 358   switch (n->Opcode()) {
 359   case Op_ReplicateB:
 360   case Op_ReplicateS:
 361   case Op_ReplicateI:
 362   case Op_ReplicateL:
 363   case Op_ReplicateF:
 364   case Op_ReplicateD:
 365     return true;
 366   default:
 367     return false;
 368   }
 369 }
 370 
 371 // [Start, end) half-open range defining which operands are vectors
 372 void VectorNode::vector_operands(Node* n, uint* start, uint* end) {
 373   switch (n->Opcode()) {
 374   case Op_LoadB:   case Op_LoadUB:
 375   case Op_LoadS:   case Op_LoadUS:
 376   case Op_LoadI:   case Op_LoadL:
 377   case Op_LoadF:   case Op_LoadD:
 378   case Op_LoadP:   case Op_LoadN:
 379     *start = 0;
 380     *end   = 0; // no vector operands
 381     break;
 382   case Op_StoreB:  case Op_StoreC:
 383   case Op_StoreI:  case Op_StoreL:
 384   case Op_StoreF:  case Op_StoreD:
 385   case Op_StoreP:  case Op_StoreN:
 386     *start = MemNode::ValueIn;
 387     *end   = MemNode::ValueIn + 1; // 1 vector operand
 388     break;
 389   case Op_LShiftI:  case Op_LShiftL:
 390   case Op_RShiftI:  case Op_RShiftL:
 391   case Op_URShiftI: case Op_URShiftL:
 392     *start = 1;
 393     *end   = 2; // 1 vector operand
 394     break;
 395   case Op_AddI: case Op_AddL: case Op_AddF: case Op_AddD:
 396   case Op_SubI: case Op_SubL: case Op_SubF: case Op_SubD:
 397   case Op_MulI: case Op_MulL: case Op_MulF: case Op_MulD:
 398   case Op_DivF: case Op_DivD:
 399   case Op_AndI: case Op_AndL:
 400   case Op_OrI:  case Op_OrL:
 401   case Op_XorI: case Op_XorL:
 402     *start = 1;
 403     *end   = 3; // 2 vector operands
 404     break;
 405   case Op_CMoveI:  case Op_CMoveL:  case Op_CMoveF:  case Op_CMoveD:
 406     *start = 2;
 407     *end   = n->req();
 408     break;
 409   case Op_FmaD:
 410   case Op_FmaF:
 411     *start = 1;
 412     *end   = 4; // 3 vector operands
 413     break;
 414   default:
 415     *start = 1;
 416     *end   = n->req(); // default is all operands
 417   }
 418 }
 419 
 420 // Return the vector version of a scalar operation node.
 421 VectorNode* VectorNode::make(int opc, Node* n1, Node* n2, uint vlen, BasicType bt) {
 422   const TypeVect* vt = TypeVect::make(bt, vlen);
 423   int vopc = VectorNode::opcode(opc, bt);
 424   // This method should not be called for unimplemented vectors.
 425   guarantee(vopc > 0, "Vector for '%s' is not implemented", NodeClassNames[opc]);
 426   switch (vopc) {
 427   case Op_AddVB: return new AddVBNode(n1, n2, vt);
 428   case Op_AddVS: return new AddVSNode(n1, n2, vt);
 429   case Op_AddVI: return new AddVINode(n1, n2, vt);
 430   case Op_AddVL: return new AddVLNode(n1, n2, vt);
 431   case Op_AddVF: return new AddVFNode(n1, n2, vt);
 432   case Op_AddVD: return new AddVDNode(n1, n2, vt);
 433 
 434   case Op_SubVB: return new SubVBNode(n1, n2, vt);
 435   case Op_SubVS: return new SubVSNode(n1, n2, vt);
 436   case Op_SubVI: return new SubVINode(n1, n2, vt);
 437   case Op_SubVL: return new SubVLNode(n1, n2, vt);
 438   case Op_SubVF: return new SubVFNode(n1, n2, vt);
 439   case Op_SubVD: return new SubVDNode(n1, n2, vt);
 440 
 441   case Op_MulVB: return new MulVBNode(n1, n2, vt);
 442   case Op_MulVS: return new MulVSNode(n1, n2, vt);
 443   case Op_MulVI: return new MulVINode(n1, n2, vt);
 444   case Op_MulVL: return new MulVLNode(n1, n2, vt);
 445   case Op_MulVF: return new MulVFNode(n1, n2, vt);
 446   case Op_MulVD: return new MulVDNode(n1, n2, vt);
 447 
 448   case Op_DivVF: return new DivVFNode(n1, n2, vt);
 449   case Op_DivVD: return new DivVDNode(n1, n2, vt);
 450 
 451   case Op_MinV: return new MinVNode(n1, n2, vt);
 452   case Op_MaxV: return new MaxVNode(n1, n2, vt);
 453 
 454   case Op_AbsV: return new AbsVNode(n1, vt);
 455   case Op_AbsVF: return new AbsVFNode(n1, vt);
 456   case Op_AbsVD: return new AbsVDNode(n1, vt);
 457 
 458   case Op_NegVI: return new NegVINode(n1, vt);
 459   case Op_NegVF: return new NegVFNode(n1, vt);
 460   case Op_NegVD: return new NegVDNode(n1, vt);
 461 
 462   case Op_SqrtVF: return new SqrtVFNode(n1, vt);
 463   case Op_SqrtVD: return new SqrtVDNode(n1, vt);
 464 
 465   case Op_PopCountVI: return new PopCountVINode(n1, vt);
 466   case Op_NotV: return new NotVNode(n1, vt);
 467 
 468   case Op_LShiftVB: return new LShiftVBNode(n1, n2, vt);
 469   case Op_LShiftVS: return new LShiftVSNode(n1, n2, vt);
 470   case Op_LShiftVI: return new LShiftVINode(n1, n2, vt);
 471   case Op_LShiftVL: return new LShiftVLNode(n1, n2, vt);
 472 
 473   case Op_RShiftVB: return new RShiftVBNode(n1, n2, vt);
 474   case Op_RShiftVS: return new RShiftVSNode(n1, n2, vt);
 475   case Op_RShiftVI: return new RShiftVINode(n1, n2, vt);
 476   case Op_RShiftVL: return new RShiftVLNode(n1, n2, vt);
 477 
 478   case Op_URShiftVB: return new URShiftVBNode(n1, n2, vt);
 479   case Op_URShiftVS: return new URShiftVSNode(n1, n2, vt);
 480   case Op_URShiftVI: return new URShiftVINode(n1, n2, vt);
 481   case Op_URShiftVL: return new URShiftVLNode(n1, n2, vt);
 482 
 483   case Op_AndV: return new AndVNode(n1, n2, vt);
 484   case Op_OrV:  return new OrVNode (n1, n2, vt);
 485   case Op_XorV: return new XorVNode(n1, n2, vt);
 486   
 487   case Op_ConvertVF2VD:
 488     if (bt == T_DOUBLE) {
 489       return new ConvertVF2VDNode(n1, vt);
 490     }
 491   default:
 492     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
 493     return NULL;
 494   }
 495 }
 496 
 497 VectorNode* VectorNode::make(int opc, Node* n1, Node* n2, Node* n3, uint vlen, BasicType bt) {
 498   const TypeVect* vt = TypeVect::make(bt, vlen);
 499   int vopc = VectorNode::opcode(opc, bt);
 500   // This method should not be called for unimplemented vectors.
 501   guarantee(vopc > 0, "Vector for '%s' is not implemented", NodeClassNames[opc]);
 502   switch (vopc) {
 503   case Op_FmaVD: return new FmaVDNode(n1, n2, n3, vt);
 504   case Op_FmaVF: return new FmaVFNode(n1, n2, n3, vt);
 505   default:
 506     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
 507     return NULL;
 508   }
 509 }
 510 
 511 // Scalar promotion
 512 VectorNode* VectorNode::scalar2vector(Node* s, uint vlen, const Type* opd_t) {
 513   BasicType bt = opd_t->array_element_basic_type();
 514   const TypeVect* vt = opd_t->singleton() ? TypeVect::make(opd_t, vlen)
 515                                           : TypeVect::make(bt, vlen);
 516   switch (bt) {
 517   case T_BOOLEAN:
 518   case T_BYTE:
 519     return new ReplicateBNode(s, vt);
 520   case T_CHAR:
 521   case T_SHORT:
 522     return new ReplicateSNode(s, vt);
 523   case T_INT:
 524     return new ReplicateINode(s, vt);
 525   case T_LONG:
 526     return new ReplicateLNode(s, vt);
 527   case T_FLOAT:
 528     return new ReplicateFNode(s, vt);
 529   case T_DOUBLE:
 530     return new ReplicateDNode(s, vt);
 531   default:
 532     fatal("Type '%s' is not supported for vectors", type2name(bt));
 533     return NULL;
 534   }
 535 }
 536 
 537 VectorNode* VectorNode::shift_count(int opc, Node* cnt, uint vlen, BasicType bt) {
 538   assert(!cnt->is_Con(), "only variable shift count");
 539   // Match shift count type with shift vector type.
 540   const TypeVect* vt = TypeVect::make(bt, vlen);
 541   switch (opc) {
 542   case Op_LShiftI:
 543   case Op_LShiftL:
 544     return new LShiftCntVNode(cnt, vt);
 545   case Op_RShiftI:
 546   case Op_RShiftL:
 547   case Op_URShiftI:
 548   case Op_URShiftL:
 549     return new RShiftCntVNode(cnt, vt);
 550   default:
 551     fatal("Missed vector creation for '%s'", NodeClassNames[opc]);
 552     return NULL;
 553   }
 554 }
 555 
 556 // Return initial Pack node. Additional operands added with add_opd() calls.
 557 PackNode* PackNode::make(Node* s, uint vlen, BasicType bt) {
 558   const TypeVect* vt = TypeVect::make(bt, vlen);
 559   switch (bt) {
 560   case T_BOOLEAN:
 561   case T_BYTE:
 562     return new PackBNode(s, vt);
 563   case T_CHAR:
 564   case T_SHORT:
 565     return new PackSNode(s, vt);
 566   case T_INT:
 567     return new PackINode(s, vt);
 568   case T_LONG:
 569     return new PackLNode(s, vt);
 570   case T_FLOAT:
 571     return new PackFNode(s, vt);
 572   case T_DOUBLE:
 573     return new PackDNode(s, vt);
 574   default:
 575     fatal("Type '%s' is not supported for vectors", type2name(bt));
 576     return NULL;
 577   }
 578 }
 579 
 580 // Create a binary tree form for Packs. [lo, hi) (half-open) range
 581 PackNode* PackNode::binary_tree_pack(int lo, int hi) {
 582   int ct = hi - lo;
 583   assert(is_power_of_2(ct), "power of 2");
 584   if (ct == 2) {
 585     PackNode* pk = PackNode::make(in(lo), 2, vect_type()->element_basic_type());
 586     pk->add_opd(in(lo+1));
 587     return pk;
 588   } else {
 589     int mid = lo + ct/2;
 590     PackNode* n1 = binary_tree_pack(lo,  mid);
 591     PackNode* n2 = binary_tree_pack(mid, hi );
 592 
 593     BasicType bt = n1->vect_type()->element_basic_type();
 594     assert(bt == n2->vect_type()->element_basic_type(), "should be the same");
 595     switch (bt) {
 596     case T_BOOLEAN:
 597     case T_BYTE:
 598       return new PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
 599     case T_CHAR:
 600     case T_SHORT:
 601       return new PackINode(n1, n2, TypeVect::make(T_INT, 2));
 602     case T_INT:
 603       return new PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
 604     case T_LONG:
 605       return new Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
 606     case T_FLOAT:
 607       return new PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 608     case T_DOUBLE:
 609       return new Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 610     default:
 611       fatal("Type '%s' is not supported for vectors", type2name(bt));
 612       return NULL;
 613     }
 614   }
 615 }
 616 
 617 // Return the vector version of a scalar load node.
 618 LoadVectorNode* LoadVectorNode::make(int opc, Node* ctl, Node* mem,
 619                                      Node* adr, const TypePtr* atyp,
 620                                      uint vlen, BasicType bt,
 621                                      ControlDependency control_dependency) {
 622   const TypeVect* vt = TypeVect::make(bt, vlen);
 623   return new LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
 624 }
 625 
 626 // Return the vector version of a scalar store node.
 627 StoreVectorNode* StoreVectorNode::make(int opc, Node* ctl, Node* mem,
 628                                        Node* adr, const TypePtr* atyp, Node* val,
 629                                        uint vlen) {
 630   return new StoreVectorNode(ctl, mem, adr, atyp, val);
 631 }
 632 
 633 // Extract a scalar element of vector.
 634 Node* ExtractNode::make(Node* v, uint position, BasicType bt) {
 635   assert((int)position < Matcher::max_vector_size(bt), "pos in range");
 636   ConINode* pos = ConINode::make((int)position);
 637   switch (bt) {
 638   case T_BOOLEAN:
 639     return new ExtractUBNode(v, pos);
 640   case T_BYTE:
 641     return new ExtractBNode(v, pos);
 642   case T_CHAR:
 643     return new ExtractCNode(v, pos);
 644   case T_SHORT:
 645     return new ExtractSNode(v, pos);
 646   case T_INT:
 647     return new ExtractINode(v, pos);
 648   case T_LONG:
 649     return new ExtractLNode(v, pos);
 650   case T_FLOAT:
 651     return new ExtractFNode(v, pos);
 652   case T_DOUBLE:
 653     return new ExtractDNode(v, pos);
 654   default:
 655     fatal("Type '%s' is not supported for vectors", type2name(bt));
 656     return NULL;
 657   }
 658 }
 659 
 660 int ReductionNode::opcode(int opc, BasicType bt) {
 661   int vopc = opc;
 662   switch (opc) {
 663     case Op_AddI:
 664       switch (bt) {
 665         case T_BOOLEAN:
 666         case T_CHAR: return 0;
 667         case T_BYTE:
 668         case T_SHORT:
 669         case T_INT:       
 670           vopc = Op_AddReductionVI;
 671           break;
 672         default:          ShouldNotReachHere(); return 0;
 673       }
 674       break;
 675     case Op_AddL:
 676       assert(bt == T_LONG, "must be");
 677       vopc = Op_AddReductionVL;
 678       break;
 679     case Op_AddF:
 680       assert(bt == T_FLOAT, "must be");
 681       vopc = Op_AddReductionVF;
 682       break;
 683     case Op_AddD:
 684       assert(bt == T_DOUBLE, "must be");
 685       vopc = Op_AddReductionVD;
 686       break;
 687     case Op_MulI:
 688       assert(bt == T_INT, "must be");
 689       vopc = Op_MulReductionVI;
 690       break;
 691     case Op_MulL:
 692       assert(bt == T_LONG, "must be");
 693       vopc = Op_MulReductionVL;
 694       break;
 695     case Op_MulF:
 696       assert(bt == T_FLOAT, "must be");
 697       vopc = Op_MulReductionVF;
 698       break;
 699     case Op_MulD:
 700       assert(bt == T_DOUBLE, "must be");
 701       vopc = Op_MulReductionVD;
 702       break;
 703     case Op_AndI:
 704       switch (bt) {
 705       case T_BOOLEAN:
 706       case T_CHAR: return 0;
 707       case T_BYTE:
 708       case T_SHORT:
 709       case T_INT:
 710         vopc = Op_AndReductionV;
 711         break;
 712       default:          ShouldNotReachHere(); return 0;
 713       }
 714       break;
 715     case Op_AndL:
 716       assert(bt == T_LONG, "must be");
 717       vopc = Op_AndReductionV;
 718       break;
 719     case Op_OrI:
 720       assert(bt == T_INT, "must be");
 721       vopc = Op_OrReductionV;
 722       break;
 723     case Op_OrL:
 724       assert(bt == T_LONG, "must be");
 725       vopc = Op_OrReductionV;
 726       break;
 727     case Op_XorI:
 728       assert(bt == T_INT, "must be");
 729       vopc = Op_XorReductionV;
 730       break;
 731     case Op_XorL:
 732       assert(bt == T_LONG, "must be");
 733       vopc = Op_XorReductionV;
 734       break;
 735     case Op_SubI:
 736       assert(bt == T_INT, "must be");
 737       vopc = Op_SubReductionV;
 738       break;
 739     case Op_SubL:
 740       assert(bt == T_LONG, "must be");
 741       vopc = Op_SubReductionV;
 742       break;
 743     // TODO: add MulL for targets that support it
 744     default:
 745       break;
 746   }
 747   return vopc;
 748 }
 749 
 750 // Return the appropriate reduction node.
 751 ReductionNode* ReductionNode::make(int opc, Node *ctrl, Node* n1, Node* n2, BasicType bt) {
 752 
 753   int vopc = opcode(opc, bt);
 754 
 755   // This method should not be called for unimplemented vectors.
 756   guarantee(vopc != opc, "Vector for '%s' is not implemented", NodeClassNames[opc]);
 757 
 758   switch (vopc) {
 759   case Op_AddReductionVI: return new AddReductionVINode(ctrl, n1, n2);
 760   case Op_AddReductionVL: return new AddReductionVLNode(ctrl, n1, n2);
 761   case Op_AddReductionVF: return new AddReductionVFNode(ctrl, n1, n2);
 762   case Op_AddReductionVD: return new AddReductionVDNode(ctrl, n1, n2);
 763   case Op_MulReductionVI: return new MulReductionVINode(ctrl, n1, n2);
 764   case Op_MulReductionVL: return new MulReductionVLNode(ctrl, n1, n2);
 765   case Op_MulReductionVF: return new MulReductionVFNode(ctrl, n1, n2);
 766   case Op_MulReductionVD: return new MulReductionVDNode(ctrl, n1, n2);
 767   case Op_AndReductionV: return new AndReductionVNode(ctrl, n1, n2);
 768   case Op_OrReductionV: return new OrReductionVNode(ctrl, n1, n2);
 769   case Op_XorReductionV: return new XorReductionVNode(ctrl, n1, n2);
 770   case Op_SubReductionV: return new SubReductionVNode(ctrl, n1, n2);
 771   default:
 772     fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
 773     return NULL;
 774   }
 775 }
 776 
 777 Node* ReductionNode::make_reduction_input(PhaseGVN& gvn, int opc, BasicType bt) {
 778   int vopc = opcode(opc, bt);
 779   guarantee(vopc != opc, "Vector reduction for '%s' is not implemented", NodeClassNames[opc]);
 780 
 781   switch (vopc) {
 782     case Op_AndReductionV:
 783       switch (bt) {
 784         case T_BYTE:
 785         case T_SHORT:
 786         case T_INT:
 787           return gvn.makecon(TypeInt::MINUS_1);
 788         case T_LONG:
 789           return gvn.makecon(TypeLong::MINUS_1);
 790         default:
 791           fatal("Missed vector creation for '%s' as the basic type is not correct.", NodeClassNames[vopc]);
 792           return NULL;
 793       }
 794       break;
 795     case Op_AddReductionVI: // fallthrough
 796     case Op_AddReductionVL: // fallthrough
 797     case Op_AddReductionVF: // fallthrough
 798     case Op_AddReductionVD:
 799     case Op_OrReductionV:
 800     case Op_XorReductionV:
 801     case Op_SubReductionV:
 802       return gvn.zerocon(bt);
 803     case Op_MulReductionVI:
 804       return gvn.makecon(TypeInt::ONE);
 805     case Op_MulReductionVL:
 806       return gvn.makecon(TypeLong::ONE);
 807     case Op_MulReductionVF:
 808       return gvn.makecon(TypeF::ONE);
 809     case Op_MulReductionVD:
 810       return gvn.makecon(TypeD::ONE);
 811     default:
 812       fatal("Missed vector creation for '%s'", NodeClassNames[vopc]);
 813       return NULL;
 814   }
 815 }
 816 
 817 bool ReductionNode::implemented(int opc, uint vlen, BasicType bt) {
 818   if (is_java_primitive(bt) &&
 819       (vlen > 1) && is_power_of_2(vlen) &&
 820       Matcher::vector_size_supported(bt, vlen)) {
 821     int vopc = ReductionNode::opcode(opc, bt);
 822     return vopc != opc && Matcher::match_rule_supported(vopc);
 823   }
 824   return false;
 825 }
 826 
 827 #ifndef PRODUCT
 828 void VectorBoxAllocateNode::dump_spec(outputStream *st) const {
 829   CallStaticJavaNode::dump_spec(st);
 830 }
 831 
 832 void VectorMaskCmpNode::dump_spec(outputStream *st) const {
 833   st->print(" %d #", _predicate); _type->dump_on(st);
 834 }
 835 #endif // PRODUCT
 836 
 837 Node* VectorUnboxNode::Identity(PhaseGVN *phase) {
 838   Node* n = obj()->uncast();
 839   if (n->Opcode() == Op_VectorBox) {
 840     return n->in(VectorBoxNode::Value);
 841   }
 842   return this;
 843 }
 844 
 845 const TypeFunc* VectorBoxNode::vec_box_type(const TypeInstPtr* box_type) {
 846   const Type** fields = TypeTuple::fields(0);
 847   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms, fields);
 848 
 849   fields = TypeTuple::fields(1);
 850   fields[TypeFunc::Parms+0] = box_type;
 851   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
 852 
 853   return TypeFunc::make(domain, range);
 854 }
 855 
 856 Node* SubReductionVNode::Ideal(PhaseGVN* phase, bool can_reshape) {
 857   Node* ctrl = in(0);
 858   Node* in1 = in(1);
 859   Node* in2 = in(2);
 860 
 861   if (phase->type(in1)->isa_int()) {
 862                 assert(phase->type(in2)->is_vect()->element_type()->is_int(), "must be consistent");
 863     return new NegINode(phase->transform(new AddReductionVINode(ctrl,in1,in2)));
 864   } else if (phase->type(in1)->isa_long()) {
 865     return new NegLNode(phase->transform(new AddReductionVLNode(ctrl,in1,in2)));
 866   } else {
 867     Unimplemented();
 868     return NULL;
 869   } 
 870 }