src/share/vm/opto/vectornode.cpp

changeset 4134
859c45fb8cea
parent 4115
e626685e9f6c
child 4201
aaeb9add1ab3
     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  

mercurial