diff -r f6b0eb4e44cf -r 859c45fb8cea src/share/vm/opto/vectornode.cpp --- a/src/share/vm/opto/vectornode.cpp Mon Oct 01 14:50:10 2012 -0700 +++ b/src/share/vm/opto/vectornode.cpp Tue Oct 02 12:25:13 2012 -0700 @@ -243,6 +243,8 @@ VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt) { const TypeVect* vt = TypeVect::make(bt, vlen); int vopc = VectorNode::opcode(opc, bt); + // This method should not be called for unimplemented vectors. + guarantee(vopc > 0, err_msg_res("Vector for '%s' is not implemented", NodeClassNames[opc])); switch (vopc) { case Op_AddVB: return new (C) AddVBNode(n1, n2, vt); @@ -286,7 +288,7 @@ case Op_OrV: return new (C) OrVNode (n1, n2, vt); case Op_XorV: return new (C) XorVNode(n1, n2, vt); } - ShouldNotReachHere(); + fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc])); return NULL; } @@ -312,7 +314,25 @@ case T_DOUBLE: return new (C) ReplicateDNode(s, vt); } - ShouldNotReachHere(); + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); + return NULL; +} + +VectorNode* VectorNode::shift_count(Compile* C, Node* shift, Node* cnt, uint vlen, BasicType bt) { + assert(VectorNode::is_shift(shift) && !cnt->is_Con(), "only variable shift count"); + // Match shift count type with shift vector type. + const TypeVect* vt = TypeVect::make(bt, vlen); + switch (shift->Opcode()) { + case Op_LShiftI: + case Op_LShiftL: + return new (C) LShiftCntVNode(cnt, vt); + case Op_RShiftI: + case Op_RShiftL: + case Op_URShiftI: + case Op_URShiftL: + return new (C) RShiftCntVNode(cnt, vt); + } + fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()])); return NULL; } @@ -335,7 +355,7 @@ case T_DOUBLE: return new (C) PackDNode(s, vt); } - ShouldNotReachHere(); + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; } @@ -371,7 +391,7 @@ case T_DOUBLE: return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); } - ShouldNotReachHere(); + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); } return NULL; } @@ -381,7 +401,6 @@ Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) { const TypeVect* vt = TypeVect::make(bt, vlen); return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt); - return NULL; } // Return the vector version of a scalar store node. @@ -413,7 +432,7 @@ case T_DOUBLE: return new (C) ExtractDNode(v, pos); } - ShouldNotReachHere(); + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; }