vectornode.hpp revision 0:a61af66fc99e
1/*
2 * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24//------------------------------VectorNode--------------------------------------
25// Vector Operation
26class VectorNode : public Node {
27 protected:
28  uint _length; // vector length
29  virtual BasicType elt_basic_type() const = 0; // Vector element basic type
30
31  static const Type* vect_type(BasicType elt_bt, uint len);
32  static const Type* vect_type(const Type* elt_type, uint len) {
33    return vect_type(elt_type->array_element_basic_type(), len);
34  }
35
36 public:
37  friend class VectorLoadNode;  // For vect_type
38  friend class VectorStoreNode; // ditto.
39
40  VectorNode(Node* n1, uint vlen) : Node(NULL, n1), _length(vlen) {
41    init_flags(Flag_is_Vector);
42  }
43  VectorNode(Node* n1, Node* n2, uint vlen) : Node(NULL, n1, n2), _length(vlen) {
44    init_flags(Flag_is_Vector);
45  }
46  virtual int Opcode() const;
47
48  uint length() const { return _length; } // Vector length
49
50  static uint max_vlen(BasicType bt) { // max vector length
51    return (uint)(Matcher::vector_width_in_bytes() / type2aelembytes[bt]);
52  }
53
54  // Element and vector type
55  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
56  const Type* vect_type() const { return vect_type(elt_basic_type(), length()); }
57
58  virtual const Type *bottom_type() const { return vect_type(); }
59  virtual uint        ideal_reg()   const { return Matcher::vector_ideal_reg(); }
60
61  // Vector opcode from scalar opcode
62  static int opcode(int sopc, uint vlen, const Type* opd_t);
63
64  static VectorNode* scalar2vector(Compile* C, Node* s, uint vlen, const Type* opd_t);
65
66  static VectorNode* make(Compile* C, int sopc, Node* n1, Node* n2, uint vlen, const Type* elt_t);
67
68};
69
70//===========================Vector=ALU=Operations====================================
71
72//------------------------------AddVBNode---------------------------------------
73// Vector add byte
74class AddVBNode : public VectorNode {
75 protected:
76  virtual BasicType elt_basic_type() const { return T_BYTE; }
77 public:
78  AddVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
79  virtual int Opcode() const;
80};
81
82//------------------------------AddVCNode---------------------------------------
83// Vector add char
84class AddVCNode : public VectorNode {
85 protected:
86  virtual BasicType elt_basic_type() const { return T_CHAR; }
87 public:
88  AddVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
89  virtual int Opcode() const;
90};
91
92//------------------------------AddVSNode---------------------------------------
93// Vector add short
94class AddVSNode : public VectorNode {
95 protected:
96  virtual BasicType elt_basic_type() const { return T_SHORT; }
97 public:
98  AddVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
99  virtual int Opcode() const;
100};
101
102//------------------------------AddVINode---------------------------------------
103// Vector add int
104class AddVINode : public VectorNode {
105 protected:
106  virtual BasicType elt_basic_type() const { return T_INT; }
107 public:
108  AddVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
109  virtual int Opcode() const;
110};
111
112//------------------------------AddVLNode---------------------------------------
113// Vector add long
114class AddVLNode : public VectorNode {
115 protected:
116  virtual BasicType elt_basic_type() const { return T_LONG; }
117 public:
118  AddVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
119  virtual int Opcode() const;
120};
121
122//------------------------------AddVFNode---------------------------------------
123// Vector add float
124class AddVFNode : public VectorNode {
125 protected:
126  virtual BasicType elt_basic_type() const { return T_FLOAT; }
127 public:
128  AddVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
129  virtual int Opcode() const;
130};
131
132//------------------------------AddVDNode---------------------------------------
133// Vector add double
134class AddVDNode : public VectorNode {
135 protected:
136  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
137 public:
138  AddVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
139  virtual int Opcode() const;
140};
141
142//------------------------------SubVBNode---------------------------------------
143// Vector subtract byte
144class SubVBNode : public VectorNode {
145 protected:
146  virtual BasicType elt_basic_type() const { return T_BYTE; }
147 public:
148  SubVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
149  virtual int Opcode() const;
150};
151
152//------------------------------SubVCNode---------------------------------------
153// Vector subtract char
154class SubVCNode : public VectorNode {
155 protected:
156  virtual BasicType elt_basic_type() const { return T_CHAR; }
157 public:
158  SubVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
159  virtual int Opcode() const;
160};
161
162//------------------------------SubVSNode---------------------------------------
163// Vector subtract short
164class SubVSNode : public VectorNode {
165 protected:
166  virtual BasicType elt_basic_type() const { return T_SHORT; }
167 public:
168  SubVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
169  virtual int Opcode() const;
170};
171
172//------------------------------SubVINode---------------------------------------
173// Vector subtract int
174class SubVINode : public VectorNode {
175 protected:
176  virtual BasicType elt_basic_type() const { return T_INT; }
177 public:
178  SubVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
179  virtual int Opcode() const;
180};
181
182//------------------------------SubVLNode---------------------------------------
183// Vector subtract long
184class SubVLNode : public VectorNode {
185 protected:
186  virtual BasicType elt_basic_type() const { return T_LONG; }
187 public:
188  SubVLNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
189  virtual int Opcode() const;
190};
191
192//------------------------------SubVFNode---------------------------------------
193// Vector subtract float
194class SubVFNode : public VectorNode {
195 protected:
196  virtual BasicType elt_basic_type() const { return T_FLOAT; }
197 public:
198  SubVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
199  virtual int Opcode() const;
200};
201
202//------------------------------SubVDNode---------------------------------------
203// Vector subtract double
204class SubVDNode : public VectorNode {
205 protected:
206  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
207 public:
208  SubVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
209  virtual int Opcode() const;
210};
211
212//------------------------------MulVFNode---------------------------------------
213// Vector multiply float
214class MulVFNode : public VectorNode {
215 protected:
216  virtual BasicType elt_basic_type() const { return T_FLOAT; }
217 public:
218  MulVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
219  virtual int Opcode() const;
220};
221
222//------------------------------MulVDNode---------------------------------------
223// Vector multiply double
224class MulVDNode : public VectorNode {
225 protected:
226  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
227 public:
228  MulVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
229  virtual int Opcode() const;
230};
231
232//------------------------------DivVFNode---------------------------------------
233// Vector divide float
234class DivVFNode : public VectorNode {
235 protected:
236  virtual BasicType elt_basic_type() const { return T_FLOAT; }
237 public:
238  DivVFNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
239  virtual int Opcode() const;
240};
241
242//------------------------------DivVDNode---------------------------------------
243// Vector Divide double
244class DivVDNode : public VectorNode {
245 protected:
246  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
247 public:
248  DivVDNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
249  virtual int Opcode() const;
250};
251
252//------------------------------LShiftVBNode---------------------------------------
253// Vector lshift byte
254class LShiftVBNode : public VectorNode {
255 protected:
256  virtual BasicType elt_basic_type() const { return T_BYTE; }
257 public:
258  LShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
259  virtual int Opcode() const;
260};
261
262//------------------------------LShiftVCNode---------------------------------------
263// Vector lshift chars
264class LShiftVCNode : public VectorNode {
265 protected:
266  virtual BasicType elt_basic_type() const { return T_CHAR; }
267 public:
268  LShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
269  virtual int Opcode() const;
270};
271
272//------------------------------LShiftVSNode---------------------------------------
273// Vector lshift shorts
274class LShiftVSNode : public VectorNode {
275 protected:
276  virtual BasicType elt_basic_type() const { return T_SHORT; }
277 public:
278  LShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
279  virtual int Opcode() const;
280};
281
282//------------------------------LShiftVINode---------------------------------------
283// Vector lshift ints
284class LShiftVINode : public VectorNode {
285 protected:
286  virtual BasicType elt_basic_type() const { return T_INT; }
287 public:
288  LShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
289  virtual int Opcode() const;
290};
291
292//------------------------------URShiftVBNode---------------------------------------
293// Vector urshift bytes
294class URShiftVBNode : public VectorNode {
295 protected:
296  virtual BasicType elt_basic_type() const { return T_BYTE; }
297 public:
298  URShiftVBNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
299  virtual int Opcode() const;
300};
301
302//------------------------------URShiftVCNode---------------------------------------
303// Vector urshift char
304class URShiftVCNode : public VectorNode {
305 protected:
306  virtual BasicType elt_basic_type() const { return T_SHORT; }
307 public:
308  URShiftVCNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
309  virtual int Opcode() const;
310};
311
312//------------------------------URShiftVSNode---------------------------------------
313// Vector urshift shorts
314class URShiftVSNode : public VectorNode {
315 protected:
316  virtual BasicType elt_basic_type() const { return T_SHORT; }
317 public:
318  URShiftVSNode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
319  virtual int Opcode() const;
320};
321
322//------------------------------URShiftVINode---------------------------------------
323// Vector urshift ints
324class URShiftVINode : public VectorNode {
325 protected:
326  virtual BasicType elt_basic_type() const { return T_INT; }
327 public:
328  URShiftVINode(Node* in1, Node* in2, uint vlen) : VectorNode(in1,in2,vlen) {}
329  virtual int Opcode() const;
330};
331
332//------------------------------AndVNode---------------------------------------
333// Vector and
334class AndVNode : public VectorNode {
335 protected:
336  BasicType _bt;
337  virtual BasicType elt_basic_type() const { return _bt; }
338 public:
339  AndVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
340  virtual int Opcode() const;
341};
342
343//------------------------------OrVNode---------------------------------------
344// Vector or
345class OrVNode : public VectorNode {
346 protected:
347  BasicType _bt;
348  virtual BasicType elt_basic_type() const { return _bt; }
349 public:
350  OrVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
351  virtual int Opcode() const;
352};
353
354//------------------------------XorVNode---------------------------------------
355// Vector xor
356class XorVNode : public VectorNode {
357 protected:
358  BasicType _bt;
359  virtual BasicType elt_basic_type() const { return _bt; }
360 public:
361  XorVNode(Node* in1, Node* in2, uint vlen, BasicType bt) : VectorNode(in1,in2,vlen), _bt(bt) {}
362  virtual int Opcode() const;
363};
364
365//================================= M E M O R Y ==================================
366
367
368//------------------------------VectorLoadNode--------------------------------------
369// Vector Load from memory
370class VectorLoadNode : public LoadNode {
371  virtual uint size_of() const { return sizeof(*this); }
372
373 protected:
374  virtual BasicType elt_basic_type()  const = 0; // Vector element basic type
375  // For use in constructor
376  static const Type* vect_type(const Type* elt_type, uint len) {
377    return VectorNode::vect_type(elt_type, len);
378  }
379
380 public:
381  VectorLoadNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *rt)
382    : LoadNode(c,mem,adr,at,rt) {
383      init_flags(Flag_is_Vector);
384  }
385  virtual int Opcode() const;
386
387  virtual uint  length() const = 0; // Vector length
388
389  // Element and vector type
390  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
391  const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
392
393  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(); }
394  virtual BasicType memory_type() const { return T_VOID; }
395  virtual int memory_size() const { return length()*type2aelembytes[elt_basic_type()]; }
396
397  // Vector opcode from scalar opcode
398  static int opcode(int sopc, uint vlen);
399
400  static VectorLoadNode* make(Compile* C, int opc, Node* ctl, Node* mem,
401                              Node* adr, const TypePtr* atyp, uint vlen);
402};
403
404//------------------------------Load16BNode--------------------------------------
405// Vector load of 16 bytes (8bits signed) from memory
406class Load16BNode : public VectorLoadNode {
407 protected:
408  virtual BasicType elt_basic_type() const { return T_BYTE; }
409 public:
410  Load16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
411    : VectorLoadNode(c,mem,adr,at,vect_type(ti,16)) {}
412  virtual int Opcode() const;
413  virtual int store_Opcode() const { return Op_Store16B; }
414  virtual uint length() const { return 16; }
415};
416
417//------------------------------Load8BNode--------------------------------------
418// Vector load of 8 bytes (8bits signed) from memory
419class Load8BNode : public VectorLoadNode {
420 protected:
421  virtual BasicType elt_basic_type() const { return T_BYTE; }
422 public:
423  Load8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
424    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
425  virtual int Opcode() const;
426  virtual int store_Opcode() const { return Op_Store8B; }
427  virtual uint length() const { return 8; }
428};
429
430//------------------------------Load4BNode--------------------------------------
431// Vector load of 4 bytes (8bits signed) from memory
432class Load4BNode : public VectorLoadNode {
433 protected:
434  virtual BasicType elt_basic_type() const { return T_BYTE; }
435 public:
436  Load4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::BYTE)
437    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
438  virtual int Opcode() const;
439  virtual int store_Opcode() const { return Op_Store4B; }
440  virtual uint length() const { return 4; }
441};
442
443//------------------------------Load8CNode--------------------------------------
444// Vector load of 8 chars (16bits unsigned) from memory
445class Load8CNode : public VectorLoadNode {
446 protected:
447  virtual BasicType elt_basic_type() const { return T_CHAR; }
448 public:
449  Load8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
450    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
451  virtual int Opcode() const;
452  virtual int store_Opcode() const { return Op_Store8C; }
453  virtual uint length() const { return 8; }
454};
455
456//------------------------------Load4CNode--------------------------------------
457// Vector load of 4 chars (16bits unsigned) from memory
458class Load4CNode : public VectorLoadNode {
459 protected:
460  virtual BasicType elt_basic_type() const { return T_CHAR; }
461 public:
462  Load4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
463    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
464  virtual int Opcode() const;
465  virtual int store_Opcode() const { return Op_Store4C; }
466  virtual uint length() const { return 4; }
467};
468
469//------------------------------Load2CNode--------------------------------------
470// Vector load of 2 chars (16bits unsigned) from memory
471class Load2CNode : public VectorLoadNode {
472 protected:
473  virtual BasicType elt_basic_type() const { return T_CHAR; }
474 public:
475  Load2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::CHAR)
476    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
477  virtual int Opcode() const;
478  virtual int store_Opcode() const { return Op_Store2C; }
479  virtual uint length() const { return 2; }
480};
481
482//------------------------------Load8SNode--------------------------------------
483// Vector load of 8 shorts (16bits signed) from memory
484class Load8SNode : public VectorLoadNode {
485 protected:
486  virtual BasicType elt_basic_type() const { return T_SHORT; }
487 public:
488  Load8SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
489    : VectorLoadNode(c,mem,adr,at,vect_type(ti,8)) {}
490  virtual int Opcode() const;
491  virtual int store_Opcode() const { return Op_Store8C; }
492  virtual uint length() const { return 8; }
493};
494
495//------------------------------Load4SNode--------------------------------------
496// Vector load of 4 shorts (16bits signed) from memory
497class Load4SNode : public VectorLoadNode {
498 protected:
499  virtual BasicType elt_basic_type() const { return T_SHORT; }
500 public:
501  Load4SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
502    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
503  virtual int Opcode() const;
504  virtual int store_Opcode() const { return Op_Store4C; }
505  virtual uint length() const { return 4; }
506};
507
508//------------------------------Load2SNode--------------------------------------
509// Vector load of 2 shorts (16bits signed) from memory
510class Load2SNode : public VectorLoadNode {
511 protected:
512  virtual BasicType elt_basic_type() const { return T_SHORT; }
513 public:
514  Load2SNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::SHORT)
515    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
516  virtual int Opcode() const;
517  virtual int store_Opcode() const { return Op_Store2C; }
518  virtual uint length() const { return 2; }
519};
520
521//------------------------------Load4INode--------------------------------------
522// Vector load of 4 integers (32bits signed) from memory
523class Load4INode : public VectorLoadNode {
524 protected:
525  virtual BasicType elt_basic_type() const { return T_INT; }
526 public:
527  Load4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
528    : VectorLoadNode(c,mem,adr,at,vect_type(ti,4)) {}
529  virtual int Opcode() const;
530  virtual int store_Opcode() const { return Op_Store4I; }
531  virtual uint length() const { return 4; }
532};
533
534//------------------------------Load2INode--------------------------------------
535// Vector load of 2 integers (32bits signed) from memory
536class Load2INode : public VectorLoadNode {
537 protected:
538  virtual BasicType elt_basic_type() const { return T_INT; }
539 public:
540  Load2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt *ti = TypeInt::INT)
541    : VectorLoadNode(c,mem,adr,at,vect_type(ti,2)) {}
542  virtual int Opcode() const;
543  virtual int store_Opcode() const { return Op_Store2I; }
544  virtual uint length() const { return 2; }
545};
546
547//------------------------------Load2LNode--------------------------------------
548// Vector load of 2 longs (64bits signed) from memory
549class Load2LNode : public VectorLoadNode {
550 protected:
551  virtual BasicType elt_basic_type() const { return T_LONG; }
552 public:
553  Load2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeLong *tl = TypeLong::LONG)
554    : VectorLoadNode(c,mem,adr,at,vect_type(tl,2)) {}
555  virtual int Opcode() const;
556  virtual int store_Opcode() const { return Op_Store2L; }
557  virtual uint length() const { return 2; }
558};
559
560//------------------------------Load4FNode--------------------------------------
561// Vector load of 4 floats (32bits) from memory
562class Load4FNode : public VectorLoadNode {
563 protected:
564  virtual BasicType elt_basic_type() const { return T_FLOAT; }
565 public:
566  Load4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
567    : VectorLoadNode(c,mem,adr,at,vect_type(t,4)) {}
568  virtual int Opcode() const;
569  virtual int store_Opcode() const { return Op_Store4F; }
570  virtual uint length() const { return 4; }
571};
572
573//------------------------------Load2FNode--------------------------------------
574// Vector load of 2 floats (32bits) from memory
575class Load2FNode : public VectorLoadNode {
576 protected:
577  virtual BasicType elt_basic_type() const { return T_FLOAT; }
578 public:
579  Load2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::FLOAT)
580    : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
581  virtual int Opcode() const;
582  virtual int store_Opcode() const { return Op_Store2F; }
583  virtual uint length() const { return 2; }
584};
585
586//------------------------------Load2DNode--------------------------------------
587// Vector load of 2 doubles (64bits) from memory
588class Load2DNode : public VectorLoadNode {
589 protected:
590  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
591 public:
592  Load2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const Type *t = Type::DOUBLE)
593    : VectorLoadNode(c,mem,adr,at,vect_type(t,2)) {}
594  virtual int Opcode() const;
595  virtual int store_Opcode() const { return Op_Store2D; }
596  virtual uint length() const { return 2; }
597};
598
599
600//------------------------------VectorStoreNode--------------------------------------
601// Vector Store to memory
602class VectorStoreNode : public StoreNode {
603  virtual uint size_of() const { return sizeof(*this); }
604
605 protected:
606  virtual BasicType elt_basic_type()  const = 0; // Vector element basic type
607
608 public:
609  VectorStoreNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
610    : StoreNode(c,mem,adr,at,val) {
611      init_flags(Flag_is_Vector);
612  }
613  virtual int Opcode() const;
614
615  virtual uint  length() const = 0; // Vector length
616
617  // Element and vector type
618  const Type* elt_type()  const { return Type::get_const_basic_type(elt_basic_type()); }
619  const Type* vect_type() const { return VectorNode::vect_type(elt_basic_type(), length()); }
620
621  virtual uint ideal_reg() const  { return Matcher::vector_ideal_reg(); }
622  virtual BasicType memory_type() const { return T_VOID; }
623  virtual int memory_size() const { return length()*type2aelembytes[elt_basic_type()]; }
624
625  // Vector opcode from scalar opcode
626  static int opcode(int sopc, uint vlen);
627
628  static VectorStoreNode* make(Compile* C, int opc, Node* ctl, Node* mem,
629                               Node* adr, const TypePtr* atyp, VectorNode* val,
630                               uint vlen);
631};
632
633//------------------------------Store16BNode--------------------------------------
634// Vector store of 16 bytes (8bits signed) to memory
635class Store16BNode : public VectorStoreNode {
636 protected:
637  virtual BasicType elt_basic_type() const { return T_BYTE; }
638 public:
639  Store16BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
640    : VectorStoreNode(c,mem,adr,at,val) {}
641  virtual int Opcode() const;
642  virtual uint length() const { return 16; }
643};
644
645//------------------------------Store8BNode--------------------------------------
646// Vector store of 8 bytes (8bits signed) to memory
647class Store8BNode : public VectorStoreNode {
648 protected:
649  virtual BasicType elt_basic_type() const { return T_BYTE; }
650 public:
651  Store8BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
652    : VectorStoreNode(c,mem,adr,at,val) {}
653  virtual int Opcode() const;
654  virtual uint length() const { return 8; }
655};
656
657//------------------------------Store4BNode--------------------------------------
658// Vector store of 4 bytes (8bits signed) to memory
659class Store4BNode : public VectorStoreNode {
660 protected:
661  virtual BasicType elt_basic_type() const { return T_BYTE; }
662 public:
663  Store4BNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
664    : VectorStoreNode(c,mem,adr,at,val) {}
665  virtual int Opcode() const;
666  virtual uint length() const { return 4; }
667};
668
669//------------------------------Store8CNode--------------------------------------
670// Vector store of 8 chars (16bits signed/unsigned) to memory
671class Store8CNode : public VectorStoreNode {
672 protected:
673  virtual BasicType elt_basic_type() const { return T_CHAR; }
674 public:
675  Store8CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
676    : VectorStoreNode(c,mem,adr,at,val) {}
677  virtual int Opcode() const;
678  virtual uint length() const { return 8; }
679};
680
681//------------------------------Store4CNode--------------------------------------
682// Vector store of 4 chars (16bits signed/unsigned) to memory
683class Store4CNode : public VectorStoreNode {
684 protected:
685  virtual BasicType elt_basic_type() const { return T_CHAR; }
686 public:
687  Store4CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
688    : VectorStoreNode(c,mem,adr,at,val) {}
689  virtual int Opcode() const;
690  virtual uint length() const { return 4; }
691};
692
693//------------------------------Store2CNode--------------------------------------
694// Vector store of 2 chars (16bits signed/unsigned) to memory
695class Store2CNode : public VectorStoreNode {
696 protected:
697  virtual BasicType elt_basic_type() const { return T_CHAR; }
698 public:
699  Store2CNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
700    : VectorStoreNode(c,mem,adr,at,val) {}
701  virtual int Opcode() const;
702  virtual uint length() const { return 2; }
703};
704
705//------------------------------Store4INode--------------------------------------
706// Vector store of 4 integers (32bits signed) to memory
707class Store4INode : public VectorStoreNode {
708 protected:
709  virtual BasicType elt_basic_type() const { return T_INT; }
710 public:
711  Store4INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
712    : VectorStoreNode(c,mem,adr,at,val) {}
713  virtual int Opcode() const;
714  virtual uint length() const { return 4; }
715};
716
717//------------------------------Store2INode--------------------------------------
718// Vector store of 2 integers (32bits signed) to memory
719class Store2INode : public VectorStoreNode {
720 protected:
721  virtual BasicType elt_basic_type() const { return T_INT; }
722 public:
723  Store2INode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
724    : VectorStoreNode(c,mem,adr,at,val) {}
725  virtual int Opcode() const;
726  virtual uint length() const { return 2; }
727};
728
729//------------------------------Store2LNode--------------------------------------
730// Vector store of 2 longs (64bits signed) to memory
731class Store2LNode : public VectorStoreNode {
732 protected:
733  virtual BasicType elt_basic_type() const { return T_LONG; }
734 public:
735  Store2LNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
736    : VectorStoreNode(c,mem,adr,at,val) {}
737  virtual int Opcode() const;
738  virtual uint length() const { return 2; }
739};
740
741//------------------------------Store4FNode--------------------------------------
742// Vector store of 4 floats (32bits) to memory
743class Store4FNode : public VectorStoreNode {
744 protected:
745  virtual BasicType elt_basic_type() const { return T_FLOAT; }
746 public:
747  Store4FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
748    : VectorStoreNode(c,mem,adr,at,val) {}
749  virtual int Opcode() const;
750  virtual uint length() const { return 4; }
751};
752
753//------------------------------Store2FNode--------------------------------------
754// Vector store of 2 floats (32bits) to memory
755class Store2FNode : public VectorStoreNode {
756 protected:
757  virtual BasicType elt_basic_type() const { return T_FLOAT; }
758 public:
759  Store2FNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
760    : VectorStoreNode(c,mem,adr,at,val) {}
761  virtual int Opcode() const;
762  virtual uint length() const { return 2; }
763};
764
765//------------------------------Store2DNode--------------------------------------
766// Vector store of 2 doubles (64bits) to memory
767class Store2DNode : public VectorStoreNode {
768 protected:
769  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
770 public:
771  Store2DNode(Node* c, Node* mem, Node* adr, const TypePtr* at, Node* val)
772    : VectorStoreNode(c,mem,adr,at,val) {}
773  virtual int Opcode() const;
774  virtual uint length() const { return 2; }
775};
776
777//=========================Promote_Scalar_to_Vector====================================
778
779//------------------------------Replicate16BNode---------------------------------------
780// Replicate byte scalar to be vector of 16 bytes
781class Replicate16BNode : public VectorNode {
782 protected:
783  virtual BasicType elt_basic_type() const { return T_BYTE; }
784 public:
785  Replicate16BNode(Node* in1) : VectorNode(in1, 16) {}
786  virtual int Opcode() const;
787};
788
789//------------------------------Replicate8BNode---------------------------------------
790// Replicate byte scalar to be vector of 8 bytes
791class Replicate8BNode : public VectorNode {
792 protected:
793  virtual BasicType elt_basic_type() const { return T_BYTE; }
794 public:
795  Replicate8BNode(Node* in1) : VectorNode(in1, 8) {}
796  virtual int Opcode() const;
797};
798
799//------------------------------Replicate4BNode---------------------------------------
800// Replicate byte scalar to be vector of 4 bytes
801class Replicate4BNode : public VectorNode {
802 protected:
803  virtual BasicType elt_basic_type() const { return T_BYTE; }
804 public:
805  Replicate4BNode(Node* in1) : VectorNode(in1, 4) {}
806  virtual int Opcode() const;
807};
808
809//------------------------------Replicate8CNode---------------------------------------
810// Replicate char scalar to be vector of 8 chars
811class Replicate8CNode : public VectorNode {
812 protected:
813  virtual BasicType elt_basic_type() const { return T_CHAR; }
814 public:
815  Replicate8CNode(Node* in1) : VectorNode(in1, 8) {}
816  virtual int Opcode() const;
817};
818
819//------------------------------Replicate4CNode---------------------------------------
820// Replicate char scalar to be vector of 4 chars
821class Replicate4CNode : public VectorNode {
822 protected:
823  virtual BasicType elt_basic_type() const { return T_CHAR; }
824 public:
825  Replicate4CNode(Node* in1) : VectorNode(in1, 4) {}
826  virtual int Opcode() const;
827};
828
829//------------------------------Replicate2CNode---------------------------------------
830// Replicate char scalar to be vector of 2 chars
831class Replicate2CNode : public VectorNode {
832 protected:
833  virtual BasicType elt_basic_type() const { return T_CHAR; }
834 public:
835  Replicate2CNode(Node* in1) : VectorNode(in1, 2) {}
836  virtual int Opcode() const;
837};
838
839//------------------------------Replicate8SNode---------------------------------------
840// Replicate short scalar to be vector of 8 shorts
841class Replicate8SNode : public VectorNode {
842 protected:
843  virtual BasicType elt_basic_type() const { return T_SHORT; }
844 public:
845  Replicate8SNode(Node* in1) : VectorNode(in1, 8) {}
846  virtual int Opcode() const;
847};
848
849//------------------------------Replicate4SNode---------------------------------------
850// Replicate short scalar to be vector of 4 shorts
851class Replicate4SNode : public VectorNode {
852 protected:
853  virtual BasicType elt_basic_type() const { return T_SHORT; }
854 public:
855  Replicate4SNode(Node* in1) : VectorNode(in1, 4) {}
856  virtual int Opcode() const;
857};
858
859//------------------------------Replicate2SNode---------------------------------------
860// Replicate short scalar to be vector of 2 shorts
861class Replicate2SNode : public VectorNode {
862 protected:
863  virtual BasicType elt_basic_type() const { return T_SHORT; }
864 public:
865  Replicate2SNode(Node* in1) : VectorNode(in1, 2) {}
866  virtual int Opcode() const;
867};
868
869//------------------------------Replicate4INode---------------------------------------
870// Replicate int scalar to be vector of 4 ints
871class Replicate4INode : public VectorNode {
872 protected:
873  virtual BasicType elt_basic_type() const { return T_INT; }
874 public:
875  Replicate4INode(Node* in1) : VectorNode(in1, 4) {}
876  virtual int Opcode() const;
877};
878
879//------------------------------Replicate2INode---------------------------------------
880// Replicate int scalar to be vector of 2 ints
881class Replicate2INode : public VectorNode {
882 protected:
883  virtual BasicType elt_basic_type() const { return T_INT; }
884 public:
885  Replicate2INode(Node* in1) : VectorNode(in1, 2) {}
886  virtual int Opcode() const;
887};
888
889//------------------------------Replicate2LNode---------------------------------------
890// Replicate long scalar to be vector of 2 longs
891class Replicate2LNode : public VectorNode {
892 protected:
893  virtual BasicType elt_basic_type() const { return T_LONG; }
894 public:
895  Replicate2LNode(Node* in1) : VectorNode(in1, 2) {}
896  virtual int Opcode() const;
897};
898
899//------------------------------Replicate4FNode---------------------------------------
900// Replicate float scalar to be vector of 4 floats
901class Replicate4FNode : public VectorNode {
902 protected:
903  virtual BasicType elt_basic_type() const { return T_FLOAT; }
904 public:
905  Replicate4FNode(Node* in1) : VectorNode(in1, 4) {}
906  virtual int Opcode() const;
907};
908
909//------------------------------Replicate2FNode---------------------------------------
910// Replicate float scalar to be vector of 2 floats
911class Replicate2FNode : public VectorNode {
912 protected:
913  virtual BasicType elt_basic_type() const { return T_FLOAT; }
914 public:
915  Replicate2FNode(Node* in1) : VectorNode(in1, 2) {}
916  virtual int Opcode() const;
917};
918
919//------------------------------Replicate2DNode---------------------------------------
920// Replicate double scalar to be vector of 2 doubles
921class Replicate2DNode : public VectorNode {
922 protected:
923  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
924 public:
925  Replicate2DNode(Node* in1) : VectorNode(in1, 2) {}
926  virtual int Opcode() const;
927};
928
929//========================Pack_Scalars_into_a_Vector==============================
930
931//------------------------------PackNode---------------------------------------
932// Pack parent class (not for code generation).
933class PackNode : public VectorNode {
934 public:
935  PackNode(Node* in1)  : VectorNode(in1, 1) {}
936  PackNode(Node* in1, Node* n2)  : VectorNode(in1, n2, 2) {}
937  virtual int Opcode() const;
938
939  void add_opd(Node* n) {
940    add_req(n);
941    _length++;
942    assert(_length == req() - 1, "vector length matches edge count");
943  }
944
945  // Create a binary tree form for Packs. [lo, hi) (half-open) range
946  Node* binaryTreePack(Compile* C, int lo, int hi);
947
948  static PackNode* make(Compile* C, Node* s, const Type* elt_t);
949};
950
951//------------------------------PackBNode---------------------------------------
952// Pack byte scalars into vector
953class PackBNode : public PackNode {
954 protected:
955  virtual BasicType elt_basic_type() const { return T_BYTE; }
956 public:
957  PackBNode(Node* in1)  : PackNode(in1) {}
958  virtual int Opcode() const;
959};
960
961//------------------------------PackCNode---------------------------------------
962// Pack char scalars into vector
963class PackCNode : public PackNode {
964 protected:
965  virtual BasicType elt_basic_type() const { return T_CHAR; }
966 public:
967  PackCNode(Node* in1)  : PackNode(in1) {}
968  virtual int Opcode() const;
969};
970
971//------------------------------PackSNode---------------------------------------
972// Pack short scalars into a vector
973class PackSNode : public PackNode {
974 protected:
975  virtual BasicType elt_basic_type() const { return T_SHORT; }
976 public:
977  PackSNode(Node* in1)  : PackNode(in1) {}
978  virtual int Opcode() const;
979};
980
981//------------------------------PackINode---------------------------------------
982// Pack integer scalars into a vector
983class PackINode : public PackNode {
984 protected:
985  virtual BasicType elt_basic_type() const { return T_INT; }
986 public:
987  PackINode(Node* in1)  : PackNode(in1) {}
988  PackINode(Node* in1, Node* in2) : PackNode(in1, in2) {}
989  virtual int Opcode() const;
990};
991
992//------------------------------PackLNode---------------------------------------
993// Pack long scalars into a vector
994class PackLNode : public PackNode {
995 protected:
996  virtual BasicType elt_basic_type() const { return T_LONG; }
997 public:
998  PackLNode(Node* in1)  : PackNode(in1) {}
999  PackLNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
1000  virtual int Opcode() const;
1001};
1002
1003//------------------------------PackFNode---------------------------------------
1004// Pack float scalars into vector
1005class PackFNode : public PackNode {
1006 protected:
1007  virtual BasicType elt_basic_type() const { return T_FLOAT; }
1008 public:
1009  PackFNode(Node* in1)  : PackNode(in1) {}
1010  PackFNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
1011  virtual int Opcode() const;
1012};
1013
1014//------------------------------PackDNode---------------------------------------
1015// Pack double scalars into a vector
1016class PackDNode : public PackNode {
1017 protected:
1018  virtual BasicType elt_basic_type() const { return T_DOUBLE; }
1019 public:
1020  PackDNode(Node* in1)  : PackNode(in1) {}
1021  PackDNode(Node* in1, Node* in2) : PackNode(in1, in2) {}
1022  virtual int Opcode() const;
1023};
1024
1025// The Pack2xN nodes assist code generation.  They are created from
1026// Pack4C, etc. nodes in final_graph_reshape in the form of a
1027// balanced, binary tree.
1028
1029//------------------------------Pack2x1BNode-----------------------------------------
1030// Pack 2 1-byte integers into vector of 2 bytes
1031class Pack2x1BNode : public PackNode {
1032 protected:
1033  virtual BasicType elt_basic_type() const { return T_BYTE; }
1034 public:
1035  Pack2x1BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
1036  virtual int Opcode() const;
1037  virtual uint ideal_reg() const { return Op_RegI; }
1038};
1039
1040//------------------------------Pack2x2BNode---------------------------------------
1041// Pack 2 2-byte integers into vector of 4 bytes
1042class Pack2x2BNode : public PackNode {
1043 protected:
1044  virtual BasicType elt_basic_type() const { return T_CHAR; }
1045 public:
1046  Pack2x2BNode(Node *in1, Node* in2) : PackNode(in1, in2) {}
1047  virtual int Opcode() const;
1048  virtual uint ideal_reg() const { return Op_RegI; }
1049};
1050
1051//========================Extract_Scalar_from_Vector===============================
1052
1053//------------------------------ExtractNode---------------------------------------
1054// Extract a scalar from a vector at position "pos"
1055class ExtractNode : public Node {
1056 public:
1057  ExtractNode(Node* src, ConINode* pos) : Node(NULL, src, (Node*)pos) {
1058    assert(in(2)->get_int() >= 0, "positive constants");
1059  }
1060  virtual int Opcode() const;
1061  uint  pos() const { return in(2)->get_int(); }
1062
1063  static Node* make(Compile* C, Node* v, uint position, const Type* opd_t);
1064};
1065
1066//------------------------------ExtractBNode---------------------------------------
1067// Extract a byte from a vector at position "pos"
1068class ExtractBNode : public ExtractNode {
1069 public:
1070  ExtractBNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1071  virtual int Opcode() const;
1072  virtual const Type *bottom_type() const { return TypeInt::INT; }
1073  virtual uint ideal_reg() const { return Op_RegI; }
1074};
1075
1076//------------------------------ExtractCNode---------------------------------------
1077// Extract a char from a vector at position "pos"
1078class ExtractCNode : public ExtractNode {
1079 public:
1080  ExtractCNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1081  virtual int Opcode() const;
1082  virtual const Type *bottom_type() const { return TypeInt::INT; }
1083  virtual uint ideal_reg() const { return Op_RegI; }
1084};
1085
1086//------------------------------ExtractSNode---------------------------------------
1087// Extract a short from a vector at position "pos"
1088class ExtractSNode : public ExtractNode {
1089 public:
1090  ExtractSNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1091  virtual int Opcode() const;
1092  virtual const Type *bottom_type() const { return TypeInt::INT; }
1093  virtual uint ideal_reg() const { return Op_RegI; }
1094};
1095
1096//------------------------------ExtractINode---------------------------------------
1097// Extract an int from a vector at position "pos"
1098class ExtractINode : public ExtractNode {
1099 public:
1100  ExtractINode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1101  virtual int Opcode() const;
1102  virtual const Type *bottom_type() const { return TypeInt::INT; }
1103  virtual uint ideal_reg() const { return Op_RegI; }
1104};
1105
1106//------------------------------ExtractLNode---------------------------------------
1107// Extract a long from a vector at position "pos"
1108class ExtractLNode : public ExtractNode {
1109 public:
1110  ExtractLNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1111  virtual int Opcode() const;
1112  virtual const Type *bottom_type() const { return TypeLong::LONG; }
1113  virtual uint ideal_reg() const { return Op_RegL; }
1114};
1115
1116//------------------------------ExtractFNode---------------------------------------
1117// Extract a float from a vector at position "pos"
1118class ExtractFNode : public ExtractNode {
1119 public:
1120  ExtractFNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1121  virtual int Opcode() const;
1122  virtual const Type *bottom_type() const { return Type::FLOAT; }
1123  virtual uint ideal_reg() const { return Op_RegF; }
1124};
1125
1126//------------------------------ExtractDNode---------------------------------------
1127// Extract a double from a vector at position "pos"
1128class ExtractDNode : public ExtractNode {
1129 public:
1130  ExtractDNode(Node* src, ConINode* pos) : ExtractNode(src, pos) {}
1131  virtual int Opcode() const;
1132  virtual const Type *bottom_type() const { return Type::DOUBLE; }
1133  virtual uint ideal_reg() const { return Op_RegD; }
1134};
1135