annotate src/share/vm/opto/vectornode.hpp @ 1941:79d04223b8a5

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