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