50 init_req(2, n2); 51 init_req(3, n3); 52 } 53 54 const TypeVect* vect_type() const { return type()->is_vect(); } 55 uint length() const { return vect_type()->length(); } // Vector length 56 uint length_in_bytes() const { return vect_type()->length_in_bytes(); } 57 58 virtual int Opcode() const; 59 60 virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } 61 62 static VectorNode* scalar2vector(Node* s, uint vlen, const Type* opd_t); 63 static VectorNode* shift_count(Node* shift, Node* cnt, uint vlen, BasicType bt); 64 static VectorNode* make(int opc, Node* n1, Node* n2, uint vlen, BasicType bt); 65 static VectorNode* make(int opc, Node* n1, Node* n2, Node* n3, uint vlen, BasicType bt); 66 67 static int opcode(int opc, BasicType bt); 68 static bool implemented(int opc, uint vlen, BasicType bt); 69 static bool is_shift(Node* n); 70 static bool is_invariant_vector(Node* n); 71 // [Start, end) half-open range defining which operands are vectors 72 static void vector_operands(Node* n, uint* start, uint* end); 73 }; 74 75 //===========================Vector=ALU=Operations============================= 76 77 //------------------------------AddVBNode-------------------------------------- 78 // Vector add byte 79 class AddVBNode : public VectorNode { 80 public: 81 AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 82 virtual int Opcode() const; 83 }; 84 85 //------------------------------AddVSNode-------------------------------------- 86 // Vector add char/short 87 class AddVSNode : public VectorNode { 88 public: 89 AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 242 class MulVLNode : public VectorNode { 243 public: 244 MulVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 245 virtual int Opcode() const; 246 }; 247 248 //------------------------------MulVFNode-------------------------------------- 249 // Vector multiply float 250 class MulVFNode : public VectorNode { 251 public: 252 MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 253 virtual int Opcode() const; 254 }; 255 256 //------------------------------MulVDNode-------------------------------------- 257 // Vector multiply double 258 class MulVDNode : public VectorNode { 259 public: 260 MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 261 virtual int Opcode() const; 262 }; 263 264 //------------------------------FmaVDNode-------------------------------------- 265 // Vector multiply double 266 class FmaVDNode : public VectorNode { 267 public: 268 FmaVDNode(Node* in1, Node* in2, Node* in3, const TypeVect* vt) : VectorNode(in1, in2, in3, vt) {} 269 virtual int Opcode() const; 270 }; 271 272 //------------------------------FmaVFNode-------------------------------------- 273 // Vector multiply float 274 class FmaVFNode : public VectorNode { 275 public: 276 FmaVFNode(Node* in1, Node* in2, Node* in3, const TypeVect* vt) : VectorNode(in1, in2, in3, vt) {} 277 virtual int Opcode() const; 278 }; 279 280 //------------------------------CMoveVFNode-------------------------------------- 281 // Vector float conditional move | 50 init_req(2, n2); 51 init_req(3, n3); 52 } 53 54 const TypeVect* vect_type() const { return type()->is_vect(); } 55 uint length() const { return vect_type()->length(); } // Vector length 56 uint length_in_bytes() const { return vect_type()->length_in_bytes(); } 57 58 virtual int Opcode() const; 59 60 virtual uint ideal_reg() const { return Matcher::vector_ideal_reg(vect_type()->length_in_bytes()); } 61 62 static VectorNode* scalar2vector(Node* s, uint vlen, const Type* opd_t); 63 static VectorNode* shift_count(Node* shift, Node* cnt, uint vlen, BasicType bt); 64 static VectorNode* make(int opc, Node* n1, Node* n2, uint vlen, BasicType bt); 65 static VectorNode* make(int opc, Node* n1, Node* n2, Node* n3, uint vlen, BasicType bt); 66 67 static int opcode(int opc, BasicType bt); 68 static bool implemented(int opc, uint vlen, BasicType bt); 69 static bool is_shift(Node* n); 70 static bool is_type_transition_short_to_int(Node* n); 71 static bool is_type_transition_to_int(Node* n); 72 static bool is_muladds2i(Node* n); 73 static bool is_invariant_vector(Node* n); 74 // [Start, end) half-open range defining which operands are vectors 75 static void vector_operands(Node* n, uint* start, uint* end); 76 }; 77 78 //===========================Vector=ALU=Operations============================= 79 80 //------------------------------AddVBNode-------------------------------------- 81 // Vector add byte 82 class AddVBNode : public VectorNode { 83 public: 84 AddVBNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 85 virtual int Opcode() const; 86 }; 87 88 //------------------------------AddVSNode-------------------------------------- 89 // Vector add char/short 90 class AddVSNode : public VectorNode { 91 public: 92 AddVSNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1,in2,vt) {} 245 class MulVLNode : public VectorNode { 246 public: 247 MulVLNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 248 virtual int Opcode() const; 249 }; 250 251 //------------------------------MulVFNode-------------------------------------- 252 // Vector multiply float 253 class MulVFNode : public VectorNode { 254 public: 255 MulVFNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 256 virtual int Opcode() const; 257 }; 258 259 //------------------------------MulVDNode-------------------------------------- 260 // Vector multiply double 261 class MulVDNode : public VectorNode { 262 public: 263 MulVDNode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 264 virtual int Opcode() const; 265 }; 266 267 //------------------------------MulAddVS2VINode-------------------------------- 268 // Vector multiply shorts to int and add adjacent ints. 269 class MulAddVS2VINode : public VectorNode { 270 public: 271 MulAddVS2VINode(Node* in1, Node* in2, const TypeVect* vt) : VectorNode(in1, in2, vt) {} 272 virtual int Opcode() const; 273 }; 274 275 //------------------------------FmaVDNode-------------------------------------- 276 // Vector multiply double 277 class FmaVDNode : public VectorNode { 278 public: 279 FmaVDNode(Node* in1, Node* in2, Node* in3, const TypeVect* vt) : VectorNode(in1, in2, in3, vt) {} 280 virtual int Opcode() const; 281 }; 282 283 //------------------------------FmaVFNode-------------------------------------- 284 // Vector multiply float 285 class FmaVFNode : public VectorNode { 286 public: 287 FmaVFNode(Node* in1, Node* in2, Node* in3, const TypeVect* vt) : VectorNode(in1, in2, in3, vt) {} 288 virtual int Opcode() const; 289 }; 290 291 //------------------------------CMoveVFNode-------------------------------------- 292 // Vector float conditional move |