src/share/vm/opto/vectornode.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7201026 Cdiff src/share/vm/opto/vectornode.cpp

src/share/vm/opto/vectornode.cpp

Print this page

        

*** 241,250 **** --- 241,252 ---- // Return the vector version of a scalar operation node. 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); case Op_AddVS: return new (C) AddVSNode(n1, n2, vt); case Op_AddVI: return new (C) AddVINode(n1, n2, vt);
*** 284,294 **** case Op_AndV: return new (C) AndVNode(n1, n2, vt); case Op_OrV: return new (C) OrVNode (n1, n2, vt); case Op_XorV: return new (C) XorVNode(n1, n2, vt); } ! ShouldNotReachHere(); return NULL; } // Scalar promotion --- 286,296 ---- case Op_AndV: return new (C) AndVNode(n1, n2, vt); case Op_OrV: return new (C) OrVNode (n1, n2, vt); case Op_XorV: return new (C) XorVNode(n1, n2, vt); } ! fatal(err_msg_res("Missed vector creation for '%s'", NodeClassNames[vopc])); return NULL; } // Scalar promotion
*** 310,323 **** case T_FLOAT: return new (C) ReplicateFNode(s, vt); case T_DOUBLE: return new (C) ReplicateDNode(s, vt); } ! ShouldNotReachHere(); return NULL; } // Return initial Pack node. Additional operands added with add_opd() calls. PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) { const TypeVect* vt = TypeVect::make(bt, vlen); switch (bt) { case T_BOOLEAN: --- 312,343 ---- case T_FLOAT: return new (C) ReplicateFNode(s, vt); case T_DOUBLE: return new (C) ReplicateDNode(s, vt); } ! 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; + } + // Return initial Pack node. Additional operands added with add_opd() calls. PackNode* PackNode::make(Compile* C, Node* s, uint vlen, BasicType bt) { const TypeVect* vt = TypeVect::make(bt, vlen); switch (bt) { case T_BOOLEAN:
*** 333,343 **** case T_FLOAT: return new (C) PackFNode(s, vt); case T_DOUBLE: return new (C) PackDNode(s, vt); } ! ShouldNotReachHere(); return NULL; } // Create a binary tree form for Packs. [lo, hi) (half-open) range PackNode* PackNode::binary_tree_pack(Compile* C, int lo, int hi) { --- 353,363 ---- case T_FLOAT: return new (C) PackFNode(s, vt); case T_DOUBLE: return new (C) PackDNode(s, vt); } ! fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; } // Create a binary tree form for Packs. [lo, hi) (half-open) range PackNode* PackNode::binary_tree_pack(Compile* C, int lo, int hi) {
*** 369,389 **** case T_FLOAT: return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); case T_DOUBLE: return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); } ! ShouldNotReachHere(); } return NULL; } // Return the vector version of a scalar load node. LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, 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. StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, Node* adr, const TypePtr* atyp, Node* val, --- 389,408 ---- case T_FLOAT: return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); case T_DOUBLE: return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2)); } ! fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); } return NULL; } // Return the vector version of a scalar load node. LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, 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 the vector version of a scalar store node. StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem, Node* adr, const TypePtr* atyp, Node* val,
*** 411,419 **** case T_FLOAT: return new (C) ExtractFNode(v, pos); case T_DOUBLE: return new (C) ExtractDNode(v, pos); } ! ShouldNotReachHere(); return NULL; } --- 430,438 ---- case T_FLOAT: return new (C) ExtractFNode(v, pos); case T_DOUBLE: return new (C) ExtractDNode(v, pos); } ! fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt))); return NULL; }
src/share/vm/opto/vectornode.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File