1053 |
1053 |
1054 //------------------------------implemented--------------------------- |
1054 //------------------------------implemented--------------------------- |
1055 // Can code be generated for pack p? |
1055 // Can code be generated for pack p? |
1056 bool SuperWord::implemented(Node_List* p) { |
1056 bool SuperWord::implemented(Node_List* p) { |
1057 Node* p0 = p->at(0); |
1057 Node* p0 = p->at(0); |
|
1058 if (VectorNode::is_shift(p0) && in_bb(p0->in(2))) { |
|
1059 return false; // vector shift count should be loop's invariant. |
|
1060 } |
1058 return VectorNode::implemented(p0->Opcode(), p->size(), velt_basic_type(p0)); |
1061 return VectorNode::implemented(p0->Opcode(), p->size(), velt_basic_type(p0)); |
1059 } |
1062 } |
1060 |
1063 |
1061 //------------------------------profitable--------------------------- |
1064 //------------------------------profitable--------------------------- |
1062 // For pack p, are all operands and all uses (with in the block) vector? |
1065 // For pack p, are all operands and all uses (with in the block) vector? |
1402 } |
1405 } |
1403 } |
1406 } |
1404 |
1407 |
1405 if (same_opd) { |
1408 if (same_opd) { |
1406 if (opd->is_Vector() || opd->is_LoadVector()) { |
1409 if (opd->is_Vector() || opd->is_LoadVector()) { |
|
1410 assert(((opd_idx != 2) || !VectorNode::is_shift(p0)), "shift's count can't be vector"); |
1407 return opd; // input is matching vector |
1411 return opd; // input is matching vector |
1408 } |
1412 } |
1409 if ((opd_idx == 2) && VectorNode::is_shift(p0)) { |
1413 if ((opd_idx == 2) && VectorNode::is_shift(p0)) { |
1410 // No vector is needed for shift count. |
1414 // No vector is needed for shift count. |
1411 // Vector instructions do not mask shift count, do it here. |
1415 // Vector instructions do not mask shift count, do it here. |