1165 const TypePtr* atyp = n->adr_type(); |
1165 const TypePtr* atyp = n->adr_type(); |
1166 vn = VectorLoadNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen); |
1166 vn = VectorLoadNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen); |
1167 |
1167 |
1168 } else if (n->is_Store()) { |
1168 } else if (n->is_Store()) { |
1169 // Promote value to be stored to vector |
1169 // Promote value to be stored to vector |
1170 VectorNode* val = vector_opd(p, MemNode::ValueIn); |
1170 Node* val = vector_opd(p, MemNode::ValueIn); |
1171 |
1171 |
1172 int opc = n->Opcode(); |
1172 int opc = n->Opcode(); |
1173 Node* ctl = n->in(MemNode::Control); |
1173 Node* ctl = n->in(MemNode::Control); |
1174 Node* mem = first->in(MemNode::Memory); |
1174 Node* mem = first->in(MemNode::Memory); |
1175 Node* adr = low_adr->in(MemNode::Address); |
1175 Node* adr = low_adr->in(MemNode::Address); |
1197 } |
1197 } |
1198 } |
1198 } |
1199 |
1199 |
1200 //------------------------------vector_opd--------------------------- |
1200 //------------------------------vector_opd--------------------------- |
1201 // Create a vector operand for the nodes in pack p for operand: in(opd_idx) |
1201 // Create a vector operand for the nodes in pack p for operand: in(opd_idx) |
1202 VectorNode* SuperWord::vector_opd(Node_List* p, int opd_idx) { |
1202 Node* SuperWord::vector_opd(Node_List* p, int opd_idx) { |
1203 Node* p0 = p->at(0); |
1203 Node* p0 = p->at(0); |
1204 uint vlen = p->size(); |
1204 uint vlen = p->size(); |
1205 Node* opd = p0->in(opd_idx); |
1205 Node* opd = p0->in(opd_idx); |
1206 |
1206 |
1207 bool same_opd = true; |
1207 bool same_opd = true; |
1213 break; |
1213 break; |
1214 } |
1214 } |
1215 } |
1215 } |
1216 |
1216 |
1217 if (same_opd) { |
1217 if (same_opd) { |
1218 if (opd->is_Vector()) { |
1218 if (opd->is_Vector() || opd->is_VectorLoad()) { |
1219 return (VectorNode*)opd; // input is matching vector |
1219 return opd; // input is matching vector |
1220 } |
1220 } |
|
1221 assert(!opd->is_VectorStore(), "such vector is not expected here"); |
1221 // Convert scalar input to vector. Use p0's type because it's container |
1222 // Convert scalar input to vector. Use p0's type because it's container |
1222 // maybe smaller than the operand's container. |
1223 // maybe smaller than the operand's container. |
1223 const Type* opd_t = velt_type(!in_bb(opd) ? p0 : opd); |
1224 const Type* opd_t = velt_type(!in_bb(opd) ? p0 : opd); |
1224 const Type* p0_t = velt_type(p0); |
1225 const Type* p0_t = velt_type(p0); |
1225 if (p0_t->higher_equal(opd_t)) opd_t = p0_t; |
1226 if (p0_t->higher_equal(opd_t)) opd_t = p0_t; |