386 return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
387 case T_CHAR:
388 case T_SHORT:
389 return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
390 case T_INT:
391 return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
392 case T_LONG:
393 return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
394 case T_FLOAT:
395 return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
396 case T_DOUBLE:
397 return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
398 }
399 fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
400 }
401 return NULL;
402 }
403
404 // Return the vector version of a scalar load node.
405 LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
406 Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
407 const TypeVect* vt = TypeVect::make(bt, vlen);
408 return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt);
409 }
410
411 // Return the vector version of a scalar store node.
412 StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
413 Node* adr, const TypePtr* atyp, Node* val,
414 uint vlen) {
415 return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
416 }
417
418 // Extract a scalar element of vector.
419 Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
420 assert((int)position < Matcher::max_vector_size(bt), "pos in range");
421 ConINode* pos = ConINode::make(C, (int)position);
422 switch (bt) {
423 case T_BOOLEAN:
424 return new (C) ExtractUBNode(v, pos);
425 case T_BYTE:
426 return new (C) ExtractBNode(v, pos);
427 case T_CHAR:
428 return new (C) ExtractCNode(v, pos);
|
386 return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
387 case T_CHAR:
388 case T_SHORT:
389 return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
390 case T_INT:
391 return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
392 case T_LONG:
393 return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
394 case T_FLOAT:
395 return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
396 case T_DOUBLE:
397 return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
398 }
399 fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
400 }
401 return NULL;
402 }
403
404 // Return the vector version of a scalar load node.
405 LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
406 Node* adr, const TypePtr* atyp, uint vlen, BasicType bt,
407 ControlDependency control_dependency) {
408 const TypeVect* vt = TypeVect::make(bt, vlen);
409 return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
410 }
411
412 // Return the vector version of a scalar store node.
413 StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
414 Node* adr, const TypePtr* atyp, Node* val,
415 uint vlen) {
416 return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
417 }
418
419 // Extract a scalar element of vector.
420 Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
421 assert((int)position < Matcher::max_vector_size(bt), "pos in range");
422 ConINode* pos = ConINode::make(C, (int)position);
423 switch (bt) {
424 case T_BOOLEAN:
425 return new (C) ExtractUBNode(v, pos);
426 case T_BYTE:
427 return new (C) ExtractBNode(v, pos);
428 case T_CHAR:
429 return new (C) ExtractCNode(v, pos);
|