1.1 --- a/src/share/vm/opto/vectornode.cpp Mon Oct 01 14:50:10 2012 -0700 1.2 +++ b/src/share/vm/opto/vectornode.cpp Tue Oct 02 12:25:13 2012 -0700 1.3 @@ -243,6 +243,8 @@ 1.4 VectorNode* VectorNode::make(Compile* C, int opc, Node* n1, Node* n2, uint vlen, BasicType bt) { 1.5 const TypeVect* vt = TypeVect::make(bt, vlen); 1.6 int vopc = VectorNode::opcode(opc, bt); 1.7 + // This method should not be called for unimplemented vectors. 1.8 + guarantee(vopc > 0, err_msg_res("Vector for '%s' is not implemented", NodeClassNames[opc])); 1.9 1.10 switch (vopc) { 1.11 case Op_AddVB: return new (C) AddVBNode(n1, n2, vt); 1.12 @@ -286,7 +288,7 @@ 1.13 case Op_OrV: return new (C) OrVNode (n1, n2, vt); 1.14 case Op_XorV: return new (C) XorVNode(n1, n2, vt); 1.15 } 1.16 - ShouldNotReachHere(); 1.17 + fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc])); 1.18 return NULL; 1.19 1.20 } 1.21 @@ -312,7 +314,25 @@ 1.22 case T_DOUBLE: 1.23 return new (C) ReplicateDNode(s, vt); 1.24 } 1.25 - ShouldNotReachHere(); 1.26 + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); 1.27 + return NULL; 1.28 +} 1.29 + 1.30 +VectorNode* VectorNode::shift_count(Compile* C, Node* shift, Node* cnt, uint vlen, BasicType bt) { 1.31 + assert(VectorNode::is_shift(shift) && !cnt->is_Con(), "only variable shift count"); 1.32 + // Match shift count type with shift vector type. 1.33 + const TypeVect* vt = TypeVect::make(bt, vlen); 1.34 + switch (shift->Opcode()) { 1.35 + case Op_LShiftI: 1.36 + case Op_LShiftL: 1.37 + return new (C) LShiftCntVNode(cnt, vt); 1.38 + case Op_RShiftI: 1.39 + case Op_RShiftL: 1.40 + case Op_URShiftI: 1.41 + case Op_URShiftL: 1.42 + return new (C) RShiftCntVNode(cnt, vt); 1.43 + } 1.44 + fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[shift->Opcode()])); 1.45 return NULL; 1.46 } 1.47 1.48 @@ -335,7 +355,7 @@ 1.49 case T_DOUBLE: 1.50 return new (C) PackDNode(s, vt); 1.51 } 1.52 - ShouldNotReachHere(); 1.53 + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); 1.54 return NULL; 1.55 } 1.56 1.57 @@ -371,7 +391,7 @@ 1.58 case T_DOUBLE: 1.59 return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); 1.60 } 1.61 - ShouldNotReachHere(); 1.62 + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); 1.63 } 1.64 return NULL; 1.65 } 1.66 @@ -381,7 +401,6 @@ 1.67 Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) { 1.68 const TypeVect* vt = TypeVect::make(bt, vlen); 1.69 return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt); 1.70 - return NULL; 1.71 } 1.72 1.73 // Return the vector version of a scalar store node. 1.74 @@ -413,7 +432,7 @@ 1.75 case T_DOUBLE: 1.76 return new (C) ExtractDNode(v, pos); 1.77 } 1.78 - ShouldNotReachHere(); 1.79 + fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); 1.80 return NULL; 1.81 } 1.82