annotate src/share/vm/c1/c1_LIR.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents 7eca5de9e0b6
children 608b2e8a0063
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
2 * Copyright (c) 2000, 2012, 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: 1507
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
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: 1507
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
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
25 #ifndef SHARE_VM_C1_C1_LIR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
26 #define SHARE_VM_C1_C1_LIR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
28 #include "c1/c1_ValueType.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
29 #include "oops/method.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class BlockBegin;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class BlockList;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class LIR_Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class CodeEmitInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class CodeStub;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class CodeStubList;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ArrayCopyStub;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class LIR_Op;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class ciType;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class ValueType;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class FpuStackSim;
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //---------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // LIR Operands
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // LIR_OprDesc
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // LIR_OprPtr
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // LIR_Const
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // LIR_Address
a61af66fc99e Initial load
duke
parents:
diff changeset
50 //---------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class LIR_OprPtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class LIR_Const;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class LIR_Address;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class LIR_OprVisitor;
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 typedef LIR_OprDesc* LIR_Opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 typedef int RegNr;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 define_array(LIR_OprArray, LIR_Opr)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 define_stack(LIR_OprList, LIR_OprArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 define_array(LIR_OprRefArray, LIR_Opr*)
a61af66fc99e Initial load
duke
parents:
diff changeset
65 define_stack(LIR_OprRefList, LIR_OprRefArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 define_array(CodeEmitInfoArray, CodeEmitInfo*)
a61af66fc99e Initial load
duke
parents:
diff changeset
68 define_stack(CodeEmitInfoList, CodeEmitInfoArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 define_array(LIR_OpArray, LIR_Op*)
a61af66fc99e Initial load
duke
parents:
diff changeset
71 define_stack(LIR_OpList, LIR_OpArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // define LIR_OprPtr early so LIR_OprDesc can refer to it
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class LIR_OprPtr: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
76 bool is_oop_pointer() const { return (type() == T_OBJECT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 bool is_float_kind() const { BasicType t = type(); return (t == T_FLOAT) || (t == T_DOUBLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 virtual LIR_Const* as_constant() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
80 virtual LIR_Address* as_address() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
81 virtual BasicType type() const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 virtual void print_value_on(outputStream* out) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // LIR constants
a61af66fc99e Initial load
duke
parents:
diff changeset
88 class LIR_Const: public LIR_OprPtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
89 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
90 JavaValue _value;
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 void type_check(BasicType t) const { assert(type() == t, "type check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 void type_check(BasicType t1, BasicType t2) const { assert(type() == t1 || type() == t2, "type check"); }
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
94 void type_check(BasicType t1, BasicType t2, BasicType t3) const { assert(type() == t1 || type() == t2 || type() == t3, "type check"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 public:
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
97 LIR_Const(jint i, bool is_address=false) { _value.set_type(is_address?T_ADDRESS:T_INT); _value.set_jint(i); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98 LIR_Const(jlong l) { _value.set_type(T_LONG); _value.set_jlong(l); }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 LIR_Const(jfloat f) { _value.set_type(T_FLOAT); _value.set_jfloat(f); }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 LIR_Const(jdouble d) { _value.set_type(T_DOUBLE); _value.set_jdouble(d); }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 LIR_Const(jobject o) { _value.set_type(T_OBJECT); _value.set_jobject(o); }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 LIR_Const(void* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
104 assert(sizeof(jlong) >= sizeof(p), "too small");;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _value.set_type(T_LONG); _value.set_jlong((jlong)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(sizeof(jint) >= sizeof(p), "too small");;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _value.set_type(T_INT); _value.set_jint((jint)p);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
111 LIR_Const(Metadata* m) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
112 _value.set_type(T_METADATA);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
113 #ifdef _LP64
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
114 _value.set_jlong((jlong)m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
115 #else
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
116 _value.set_jint((jint)m);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
117 #endif // _LP64
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
118 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 virtual BasicType type() const { return _value.get_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 virtual LIR_Const* as_constant() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
123 jint as_jint() const { type_check(T_INT, T_ADDRESS); return _value.get_jint(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
124 jlong as_jlong() const { type_check(T_LONG ); return _value.get_jlong(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
125 jfloat as_jfloat() const { type_check(T_FLOAT ); return _value.get_jfloat(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
126 jdouble as_jdouble() const { type_check(T_DOUBLE); return _value.get_jdouble(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 jobject as_jobject() const { type_check(T_OBJECT); return _value.get_jobject(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 jint as_jint_lo() const { type_check(T_LONG ); return low(_value.get_jlong()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 jint as_jint_hi() const { type_check(T_LONG ); return high(_value.get_jlong()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
132 address as_pointer() const { type_check(T_LONG ); return (address)_value.get_jlong(); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
133 Metadata* as_metadata() const { type_check(T_METADATA); return (Metadata*)_value.get_jlong(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
134 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
135 address as_pointer() const { type_check(T_INT ); return (address)_value.get_jint(); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
136 Metadata* as_metadata() const { type_check(T_METADATA); return (Metadata*)_value.get_jint(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
140 jint as_jint_bits() const { type_check(T_FLOAT, T_INT, T_ADDRESS); return _value.get_jint(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 jint as_jint_lo_bits() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 if (type() == T_DOUBLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return low(jlong_cast(_value.get_jdouble()));
a61af66fc99e Initial load
duke
parents:
diff changeset
144 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 return as_jint_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 jint as_jint_hi_bits() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (type() == T_DOUBLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return high(jlong_cast(_value.get_jdouble()));
a61af66fc99e Initial load
duke
parents:
diff changeset
151 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return as_jint_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
155 jlong as_jlong_bits() const {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
156 if (type() == T_DOUBLE) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
157 return jlong_cast(_value.get_jdouble());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
158 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
159 return as_jlong();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
160 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
161 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 bool is_zero_float() {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 jfloat f = as_jfloat();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 jfloat ok = 0.0f;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 return jint_cast(f) == jint_cast(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 bool is_one_float() {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 jfloat f = as_jfloat();
a61af66fc99e Initial load
duke
parents:
diff changeset
174 return !g_isnan(f) && g_isfinite(f) && f == 1.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bool is_zero_double() {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 jdouble d = as_jdouble();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 jdouble ok = 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return jlong_cast(d) == jlong_cast(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 bool is_one_double() {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 jdouble d = as_jdouble();
a61af66fc99e Initial load
duke
parents:
diff changeset
185 return !g_isnan(d) && g_isfinite(d) && d == 1.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 };
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 //---------------------LIR Operand descriptor------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
191 //
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // The class LIR_OprDesc represents a LIR instruction operand;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // it can be a register (ALU/FPU), stack location or a constant;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Constants and addresses are represented as resource area allocated
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // structures (see above).
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Registers and stack locations are inlined into the this pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // (see value function).
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 class LIR_OprDesc: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // value structure:
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // data opr-type opr-kind
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // +--------------+-------+-------+
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // [max...........|7 6 5 4|3 2 1 0]
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // ^
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // is_pointer bit
a61af66fc99e Initial load
duke
parents:
diff changeset
207 //
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // lowest bit cleared, means it is a structure pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // we need 4 bits to represent types
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
212 friend class LIR_OprFact;
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // Conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
215 intptr_t value() const { return (intptr_t) this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 bool check_value_mask(intptr_t mask, intptr_t masked_value) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 return (value() & mask) == masked_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 enum OprKind {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 pointer_value = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
223 , stack_value = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
224 , cpu_register = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
225 , fpu_register = 5
a61af66fc99e Initial load
duke
parents:
diff changeset
226 , illegal_value = 7
a61af66fc99e Initial load
duke
parents:
diff changeset
227 };
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 enum OprBits {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 pointer_bits = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
231 , kind_bits = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
232 , type_bits = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
233 , size_bits = 2
a61af66fc99e Initial load
duke
parents:
diff changeset
234 , destroys_bits = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
235 , virtual_bits = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
236 , is_xmm_bits = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
237 , last_use_bits = 1
a61af66fc99e Initial load
duke
parents:
diff changeset
238 , is_fpu_stack_offset_bits = 1 // used in assertion checking on x86 for FPU stack slot allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
239 , non_data_bits = kind_bits + type_bits + size_bits + destroys_bits + last_use_bits +
a61af66fc99e Initial load
duke
parents:
diff changeset
240 is_fpu_stack_offset_bits + virtual_bits + is_xmm_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
241 , data_bits = BitsPerInt - non_data_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
242 , reg_bits = data_bits / 2 // for two registers in one value encoding
a61af66fc99e Initial load
duke
parents:
diff changeset
243 };
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 enum OprShift {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 kind_shift = 0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 , type_shift = kind_shift + kind_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
248 , size_shift = type_shift + type_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
249 , destroys_shift = size_shift + size_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
250 , last_use_shift = destroys_shift + destroys_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
251 , is_fpu_stack_offset_shift = last_use_shift + last_use_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
252 , virtual_shift = is_fpu_stack_offset_shift + is_fpu_stack_offset_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
253 , is_xmm_shift = virtual_shift + virtual_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
254 , data_shift = is_xmm_shift + is_xmm_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
255 , reg1_shift = data_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
256 , reg2_shift = data_shift + reg_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 };
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 enum OprSize {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 single_size = 0 << size_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
262 , double_size = 1 << size_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
263 };
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 enum OprMask {
a61af66fc99e Initial load
duke
parents:
diff changeset
266 kind_mask = right_n_bits(kind_bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
267 , type_mask = right_n_bits(type_bits) << type_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
268 , size_mask = right_n_bits(size_bits) << size_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
269 , last_use_mask = right_n_bits(last_use_bits) << last_use_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
270 , is_fpu_stack_offset_mask = right_n_bits(is_fpu_stack_offset_bits) << is_fpu_stack_offset_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
271 , virtual_mask = right_n_bits(virtual_bits) << virtual_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
272 , is_xmm_mask = right_n_bits(is_xmm_bits) << is_xmm_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
273 , pointer_mask = right_n_bits(pointer_bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
274 , lower_reg_mask = right_n_bits(reg_bits)
a61af66fc99e Initial load
duke
parents:
diff changeset
275 , no_type_mask = (int)(~(type_mask | last_use_mask | is_fpu_stack_offset_mask))
a61af66fc99e Initial load
duke
parents:
diff changeset
276 };
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 uintptr_t data() const { return value() >> data_shift; }
a61af66fc99e Initial load
duke
parents:
diff changeset
279 int lo_reg_half() const { return data() & lower_reg_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 int hi_reg_half() const { return (data() >> reg_bits) & lower_reg_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 OprKind kind_field() const { return (OprKind)(value() & kind_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 OprSize size_field() const { return (OprSize)(value() & size_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 static char type_char(BasicType t);
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
287 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 vreg_base = ConcreteRegisterImpl::number_of_registers,
a61af66fc99e Initial load
duke
parents:
diff changeset
289 vreg_max = (1 << data_bits) - 1
a61af66fc99e Initial load
duke
parents:
diff changeset
290 };
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 static inline LIR_Opr illegalOpr();
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 enum OprType {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 unknown_type = 0 << type_shift // means: not set (catch uninitialized types)
a61af66fc99e Initial load
duke
parents:
diff changeset
296 , int_type = 1 << type_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
297 , long_type = 2 << type_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
298 , object_type = 3 << type_shift
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
299 , address_type = 4 << type_shift
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 , float_type = 5 << type_shift
a61af66fc99e Initial load
duke
parents:
diff changeset
301 , double_type = 6 << type_shift
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
302 , metadata_type = 7 << type_shift
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303 };
a61af66fc99e Initial load
duke
parents:
diff changeset
304 friend OprType as_OprType(BasicType t);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 friend BasicType as_BasicType(OprType t);
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 OprType type_field_valid() const { assert(is_register() || is_stack(), "should not be called otherwise"); return (OprType)(value() & type_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
308 OprType type_field() const { return is_illegal() ? unknown_type : (OprType)(value() & type_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 static OprSize size_for(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 switch (t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 case T_LONG:
a61af66fc99e Initial load
duke
parents:
diff changeset
313 case T_DOUBLE:
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return double_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 case T_FLOAT:
a61af66fc99e Initial load
duke
parents:
diff changeset
318 case T_BOOLEAN:
a61af66fc99e Initial load
duke
parents:
diff changeset
319 case T_CHAR:
a61af66fc99e Initial load
duke
parents:
diff changeset
320 case T_BYTE:
a61af66fc99e Initial load
duke
parents:
diff changeset
321 case T_SHORT:
a61af66fc99e Initial load
duke
parents:
diff changeset
322 case T_INT:
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
323 case T_ADDRESS:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 case T_OBJECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
325 case T_ARRAY:
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
326 case T_METADATA:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 return single_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
328 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
329
a61af66fc99e Initial load
duke
parents:
diff changeset
330 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
331 ShouldNotReachHere();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
332 return single_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 void validate_type() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 BasicType type() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (is_pointer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return pointer()->type();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 return as_BasicType(type_field());
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 ValueType* value_type() const { return as_ValueType(type()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349 char type_char() const { return type_char((is_pointer()) ? pointer()->type() : type()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 bool is_equal(LIR_Opr opr) const { return this == opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // checks whether types are same
a61af66fc99e Initial load
duke
parents:
diff changeset
353 bool is_same_type(LIR_Opr opr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
354 assert(type_field() != unknown_type &&
a61af66fc99e Initial load
duke
parents:
diff changeset
355 opr->type_field() != unknown_type, "shouldn't see unknown_type");
a61af66fc99e Initial load
duke
parents:
diff changeset
356 return type_field() == opr->type_field();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 bool is_same_register(LIR_Opr opr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 return (is_register() && opr->is_register() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
360 kind_field() == opr->kind_field() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
361 (value() & no_type_mask) == (opr->value() & no_type_mask));
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 bool is_pointer() const { return check_value_mask(pointer_mask, pointer_value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 bool is_illegal() const { return kind_field() == illegal_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 bool is_valid() const { return kind_field() != illegal_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 bool is_register() const { return is_cpu_register() || is_fpu_register(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 bool is_virtual() const { return is_virtual_cpu() || is_virtual_fpu(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 bool is_constant() const { return is_pointer() && pointer()->as_constant() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 bool is_address() const { return is_pointer() && pointer()->as_address() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 bool is_float_kind() const { return is_pointer() ? pointer()->is_float_kind() : (kind_field() == fpu_register); }
a61af66fc99e Initial load
duke
parents:
diff changeset
375 bool is_oop() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // semantic for fpu- and xmm-registers:
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // * is_float and is_double return true for xmm_registers
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // (so is_single_fpu and is_single_xmm are true)
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // * So you must always check for is_???_xmm prior to is_???_fpu to
a61af66fc99e Initial load
duke
parents:
diff changeset
381 // distinguish between fpu- and xmm-registers
a61af66fc99e Initial load
duke
parents:
diff changeset
382
a61af66fc99e Initial load
duke
parents:
diff changeset
383 bool is_stack() const { validate_type(); return check_value_mask(kind_mask, stack_value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
384 bool is_single_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask, stack_value | single_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
385 bool is_double_stack() const { validate_type(); return check_value_mask(kind_mask | size_mask, stack_value | double_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 bool is_cpu_register() const { validate_type(); return check_value_mask(kind_mask, cpu_register); }
a61af66fc99e Initial load
duke
parents:
diff changeset
388 bool is_virtual_cpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register | virtual_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 bool is_fixed_cpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, cpu_register); }
a61af66fc99e Initial load
duke
parents:
diff changeset
390 bool is_single_cpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, cpu_register | single_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 bool is_double_cpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, cpu_register | double_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 bool is_fpu_register() const { validate_type(); return check_value_mask(kind_mask, fpu_register); }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 bool is_virtual_fpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register | virtual_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
395 bool is_fixed_fpu() const { validate_type(); return check_value_mask(kind_mask | virtual_mask, fpu_register); }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 bool is_single_fpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, fpu_register | single_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
397 bool is_double_fpu() const { validate_type(); return check_value_mask(kind_mask | size_mask, fpu_register | double_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 bool is_xmm_register() const { validate_type(); return check_value_mask(kind_mask | is_xmm_mask, fpu_register | is_xmm_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 bool is_single_xmm() const { validate_type(); return check_value_mask(kind_mask | size_mask | is_xmm_mask, fpu_register | single_size | is_xmm_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
401 bool is_double_xmm() const { validate_type(); return check_value_mask(kind_mask | size_mask | is_xmm_mask, fpu_register | double_size | is_xmm_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // fast accessor functions for special bits that do not work for pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // (in this functions, the check for is_pointer() is omitted)
a61af66fc99e Initial load
duke
parents:
diff changeset
405 bool is_single_word() const { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, single_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
406 bool is_double_word() const { assert(is_register() || is_stack(), "type check"); return check_value_mask(size_mask, double_size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 bool is_virtual_register() const { assert(is_register(), "type check"); return check_value_mask(virtual_mask, virtual_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
408 bool is_oop_register() const { assert(is_register() || is_stack(), "type check"); return type_field_valid() == object_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 BasicType type_register() const { assert(is_register() || is_stack(), "type check"); return as_BasicType(type_field_valid()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
a61af66fc99e Initial load
duke
parents:
diff changeset
411 bool is_last_use() const { assert(is_register(), "only works for registers"); return (value() & last_use_mask) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
412 bool is_fpu_stack_offset() const { assert(is_register(), "only works for registers"); return (value() & is_fpu_stack_offset_mask) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 LIR_Opr make_last_use() { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | last_use_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 LIR_Opr make_fpu_stack_offset() { assert(is_register(), "only works for registers"); return (LIR_Opr)(value() | is_fpu_stack_offset_mask); }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 int single_stack_ix() const { assert(is_single_stack() && !is_virtual(), "type check"); return (int)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
418 int double_stack_ix() const { assert(is_double_stack() && !is_virtual(), "type check"); return (int)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
419 RegNr cpu_regnr() const { assert(is_single_cpu() && !is_virtual(), "type check"); return (RegNr)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 RegNr cpu_regnrLo() const { assert(is_double_cpu() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 RegNr cpu_regnrHi() const { assert(is_double_cpu() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 RegNr fpu_regnr() const { assert(is_single_fpu() && !is_virtual(), "type check"); return (RegNr)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 RegNr fpu_regnrLo() const { assert(is_double_fpu() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 RegNr fpu_regnrHi() const { assert(is_double_fpu() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 RegNr xmm_regnr() const { assert(is_single_xmm() && !is_virtual(), "type check"); return (RegNr)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
426 RegNr xmm_regnrLo() const { assert(is_double_xmm() && !is_virtual(), "type check"); return (RegNr)lo_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
427 RegNr xmm_regnrHi() const { assert(is_double_xmm() && !is_virtual(), "type check"); return (RegNr)hi_reg_half(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
428 int vreg_number() const { assert(is_virtual(), "type check"); return (RegNr)data(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 LIR_OprPtr* pointer() const { assert(is_pointer(), "type check"); return (LIR_OprPtr*)this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
431 LIR_Const* as_constant_ptr() const { return pointer()->as_constant(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
432 LIR_Address* as_address_ptr() const { return pointer()->as_address(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
433
a61af66fc99e Initial load
duke
parents:
diff changeset
434 Register as_register() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 Register as_register_lo() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 Register as_register_hi() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
437
a61af66fc99e Initial load
duke
parents:
diff changeset
438 Register as_pointer_register() {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
440 if (is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
441 assert(as_register_lo() == as_register_hi(), "should be a single register");
a61af66fc99e Initial load
duke
parents:
diff changeset
442 return as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
445 return as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
446 }
a61af66fc99e Initial load
duke
parents:
diff changeset
447
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
448 #ifdef X86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 XMMRegister as_xmm_float_reg() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
450 XMMRegister as_xmm_double_reg() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
451 // for compatibility with RInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
452 int fpu () const { return lo_reg_half(); }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
453 #endif // X86
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
454 #if defined(SPARC) || defined(ARM) || defined(PPC)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
455 FloatRegister as_float_reg () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
456 FloatRegister as_double_reg () const;
a61af66fc99e Initial load
duke
parents:
diff changeset
457 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 jint as_jint() const { return as_constant_ptr()->as_jint(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
460 jlong as_jlong() const { return as_constant_ptr()->as_jlong(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 jfloat as_jfloat() const { return as_constant_ptr()->as_jfloat(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
462 jdouble as_jdouble() const { return as_constant_ptr()->as_jdouble(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
463 jobject as_jobject() const { return as_constant_ptr()->as_jobject(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 void print() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 void print(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 };
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469
a61af66fc99e Initial load
duke
parents:
diff changeset
470 inline LIR_OprDesc::OprType as_OprType(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 case T_INT: return LIR_OprDesc::int_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 case T_LONG: return LIR_OprDesc::long_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
474 case T_FLOAT: return LIR_OprDesc::float_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 case T_DOUBLE: return LIR_OprDesc::double_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 case T_OBJECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
477 case T_ARRAY: return LIR_OprDesc::object_type;
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
478 case T_ADDRESS: return LIR_OprDesc::address_type;
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
479 case T_METADATA: return LIR_OprDesc::metadata_type;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 case T_ILLEGAL: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
481 default: ShouldNotReachHere(); return LIR_OprDesc::unknown_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 inline BasicType as_BasicType(LIR_OprDesc::OprType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
486 switch (t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 case LIR_OprDesc::int_type: return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
488 case LIR_OprDesc::long_type: return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
489 case LIR_OprDesc::float_type: return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 case LIR_OprDesc::double_type: return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 case LIR_OprDesc::object_type: return T_OBJECT;
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
492 case LIR_OprDesc::address_type: return T_ADDRESS;
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
493 case LIR_OprDesc::metadata_type:return T_METADATA;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
494 case LIR_OprDesc::unknown_type: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
495 default: ShouldNotReachHere(); return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // LIR_Address
a61af66fc99e Initial load
duke
parents:
diff changeset
501 class LIR_Address: public LIR_OprPtr {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // NOTE: currently these must be the log2 of the scale factor (and
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // must also be equivalent to the ScaleFactor enum in
a61af66fc99e Initial load
duke
parents:
diff changeset
507 // assembler_i486.hpp)
a61af66fc99e Initial load
duke
parents:
diff changeset
508 enum Scale {
a61af66fc99e Initial load
duke
parents:
diff changeset
509 times_1 = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
510 times_2 = 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
511 times_4 = 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
512 times_8 = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
513 };
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
516 LIR_Opr _base;
a61af66fc99e Initial load
duke
parents:
diff changeset
517 LIR_Opr _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 Scale _scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 intx _disp;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
523 LIR_Address(LIR_Opr base, LIR_Opr index, BasicType type):
a61af66fc99e Initial load
duke
parents:
diff changeset
524 _base(base)
a61af66fc99e Initial load
duke
parents:
diff changeset
525 , _index(index)
a61af66fc99e Initial load
duke
parents:
diff changeset
526 , _scale(times_1)
a61af66fc99e Initial load
duke
parents:
diff changeset
527 , _type(type)
a61af66fc99e Initial load
duke
parents:
diff changeset
528 , _disp(0) { verify(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
530 LIR_Address(LIR_Opr base, intx disp, BasicType type):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 _base(base)
a61af66fc99e Initial load
duke
parents:
diff changeset
532 , _index(LIR_OprDesc::illegalOpr())
a61af66fc99e Initial load
duke
parents:
diff changeset
533 , _scale(times_1)
a61af66fc99e Initial load
duke
parents:
diff changeset
534 , _type(type)
a61af66fc99e Initial load
duke
parents:
diff changeset
535 , _disp(disp) { verify(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
537 LIR_Address(LIR_Opr base, BasicType type):
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
538 _base(base)
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
539 , _index(LIR_OprDesc::illegalOpr())
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
540 , _scale(times_1)
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
541 , _type(type)
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
542 , _disp(0) { verify(); }
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
543
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
544 #if defined(X86) || defined(ARM)
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
545 LIR_Address(LIR_Opr base, LIR_Opr index, Scale scale, intx disp, BasicType type):
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 _base(base)
a61af66fc99e Initial load
duke
parents:
diff changeset
547 , _index(index)
a61af66fc99e Initial load
duke
parents:
diff changeset
548 , _scale(scale)
a61af66fc99e Initial load
duke
parents:
diff changeset
549 , _type(type)
a61af66fc99e Initial load
duke
parents:
diff changeset
550 , _disp(disp) { verify(); }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
551 #endif // X86 || ARM
0
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 LIR_Opr base() const { return _base; }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 LIR_Opr index() const { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 Scale scale() const { return _scale; }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 intx disp() const { return _disp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
557
a61af66fc99e Initial load
duke
parents:
diff changeset
558 bool equals(LIR_Address* other) const { return base() == other->base() && index() == other->index() && disp() == other->disp() && scale() == other->scale(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 virtual LIR_Address* as_address() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 virtual BasicType type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 virtual void print_value_on(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 void verify() const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 static Scale scale(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 };
a61af66fc99e Initial load
duke
parents:
diff changeset
568
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // operand factory
a61af66fc99e Initial load
duke
parents:
diff changeset
571 class LIR_OprFact: public AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 static LIR_Opr illegalOpr;
a61af66fc99e Initial load
duke
parents:
diff changeset
575
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
576 static LIR_Opr single_cpu(int reg) {
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
577 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
578 LIR_OprDesc::int_type |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
579 LIR_OprDesc::cpu_register |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
580 LIR_OprDesc::single_size);
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
581 }
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
582 static LIR_Opr single_cpu_oop(int reg) {
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
583 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
584 LIR_OprDesc::object_type |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
585 LIR_OprDesc::cpu_register |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
586 LIR_OprDesc::single_size);
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
587 }
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
588 static LIR_Opr single_cpu_address(int reg) {
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
589 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
590 LIR_OprDesc::address_type |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
591 LIR_OprDesc::cpu_register |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
592 LIR_OprDesc::single_size);
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
593 }
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
594 static LIR_Opr single_cpu_metadata(int reg) {
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
595 return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
596 LIR_OprDesc::metadata_type |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
597 LIR_OprDesc::cpu_register |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
598 LIR_OprDesc::single_size);
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
599 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
600 static LIR_Opr double_cpu(int reg1, int reg2) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
601 LP64_ONLY(assert(reg1 == reg2, "must be identical"));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
602 return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
603 (reg2 << LIR_OprDesc::reg2_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
604 LIR_OprDesc::long_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
605 LIR_OprDesc::cpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
606 LIR_OprDesc::double_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
607 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
609 static LIR_Opr single_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
610 LIR_OprDesc::float_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
611 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
612 LIR_OprDesc::single_size); }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
613 #if defined(ARM)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
614 static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::fpu_register | LIR_OprDesc::double_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
615 static LIR_Opr single_softfp(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) | LIR_OprDesc::float_type | LIR_OprDesc::cpu_register | LIR_OprDesc::single_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
616 static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg1 << LIR_OprDesc::reg1_shift) | (reg2 << LIR_OprDesc::reg2_shift) | LIR_OprDesc::double_type | LIR_OprDesc::cpu_register | LIR_OprDesc::double_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
617 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
618 #ifdef SPARC
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
619 static LIR_Opr double_fpu(int reg1, int reg2) { return (LIR_Opr)(intptr_t)((reg1 << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
620 (reg2 << LIR_OprDesc::reg2_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
621 LIR_OprDesc::double_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
622 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
623 LIR_OprDesc::double_size); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
624 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
625 #ifdef X86
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
626 static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
627 (reg << LIR_OprDesc::reg2_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
628 LIR_OprDesc::double_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
629 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
630 LIR_OprDesc::double_size); }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
631
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
632 static LIR_Opr single_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
633 LIR_OprDesc::float_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
634 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
635 LIR_OprDesc::single_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
636 LIR_OprDesc::is_xmm_mask); }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
637 static LIR_Opr double_xmm(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
638 (reg << LIR_OprDesc::reg2_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
639 LIR_OprDesc::double_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
640 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
641 LIR_OprDesc::double_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
642 LIR_OprDesc::is_xmm_mask); }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
643 #endif // X86
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
644 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
645 static LIR_Opr double_fpu(int reg) { return (LIR_Opr)(intptr_t)((reg << LIR_OprDesc::reg1_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
646 (reg << LIR_OprDesc::reg2_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
647 LIR_OprDesc::double_type |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
648 LIR_OprDesc::fpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
649 LIR_OprDesc::double_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
650 static LIR_Opr single_softfp(int reg) { return (LIR_Opr)((reg << LIR_OprDesc::reg1_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
651 LIR_OprDesc::float_type |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
652 LIR_OprDesc::cpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
653 LIR_OprDesc::single_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
654 static LIR_Opr double_softfp(int reg1, int reg2) { return (LIR_Opr)((reg2 << LIR_OprDesc::reg1_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
655 (reg1 << LIR_OprDesc::reg2_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
656 LIR_OprDesc::double_type |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
657 LIR_OprDesc::cpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
658 LIR_OprDesc::double_size); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
659 #endif // PPC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 static LIR_Opr virtual_register(int index, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 LIR_Opr res;
a61af66fc99e Initial load
duke
parents:
diff changeset
663 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 case T_OBJECT: // fall through
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
665 case T_ARRAY:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
666 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
667 LIR_OprDesc::object_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
668 LIR_OprDesc::cpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
669 LIR_OprDesc::single_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
670 LIR_OprDesc::virtual_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
671 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
672
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
673 case T_METADATA:
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
674 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
675 LIR_OprDesc::metadata_type|
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
676 LIR_OprDesc::cpu_register |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
677 LIR_OprDesc::single_size |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
678 LIR_OprDesc::virtual_mask);
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
679 break;
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
680
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
681 case T_INT:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
682 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
683 LIR_OprDesc::int_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
684 LIR_OprDesc::cpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
685 LIR_OprDesc::single_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
686 LIR_OprDesc::virtual_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
687 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
688
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
689 case T_ADDRESS:
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
690 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
691 LIR_OprDesc::address_type |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
692 LIR_OprDesc::cpu_register |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
693 LIR_OprDesc::single_size |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
694 LIR_OprDesc::virtual_mask);
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
695 break;
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
696
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
697 case T_LONG:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
698 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
699 LIR_OprDesc::long_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
700 LIR_OprDesc::cpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
701 LIR_OprDesc::double_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
702 LIR_OprDesc::virtual_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
703 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
704
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
705 #ifdef __SOFTFP__
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
706 case T_FLOAT:
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
707 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
708 LIR_OprDesc::float_type |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
709 LIR_OprDesc::cpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
710 LIR_OprDesc::single_size |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
711 LIR_OprDesc::virtual_mask);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
712 break;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
713 case T_DOUBLE:
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
714 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
715 LIR_OprDesc::double_type |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
716 LIR_OprDesc::cpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
717 LIR_OprDesc::double_size |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
718 LIR_OprDesc::virtual_mask);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
719 break;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
720 #else // __SOFTFP__
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
721 case T_FLOAT:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
722 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
723 LIR_OprDesc::float_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
724 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
725 LIR_OprDesc::single_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
726 LIR_OprDesc::virtual_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
727 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
728
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
729 case
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
730 T_DOUBLE: res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
731 LIR_OprDesc::double_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
732 LIR_OprDesc::fpu_register |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
733 LIR_OprDesc::double_size |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
734 LIR_OprDesc::virtual_mask);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
735 break;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
736 #endif // __SOFTFP__
0
a61af66fc99e Initial load
duke
parents:
diff changeset
737 default: ShouldNotReachHere(); res = illegalOpr;
a61af66fc99e Initial load
duke
parents:
diff changeset
738 }
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
741 res->validate_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
742 assert(res->vreg_number() == index, "conversion check");
a61af66fc99e Initial load
duke
parents:
diff changeset
743 assert(index >= LIR_OprDesc::vreg_base, "must start at vreg_base");
a61af66fc99e Initial load
duke
parents:
diff changeset
744 assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // old-style calculation; check if old and new method are equal
a61af66fc99e Initial load
duke
parents:
diff changeset
747 LIR_OprDesc::OprType t = as_OprType(type);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
748 #ifdef __SOFTFP__
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
749 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
750 t |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
751 LIR_OprDesc::cpu_register |
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
752 LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
753 #else // __SOFTFP__
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
754 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) | t |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
755 ((type == T_FLOAT || type == T_DOUBLE) ? LIR_OprDesc::fpu_register : LIR_OprDesc::cpu_register) |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
756 LIR_OprDesc::size_for(type) | LIR_OprDesc::virtual_mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 assert(res == old_res, "old and new method not equal");
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
758 #endif // __SOFTFP__
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
759 #endif // ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // 'index' is computed by FrameMap::local_stack_pos(index); do not use other parameters as
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // the index is platform independent; a double stack useing indeces 2 and 3 has always
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // index 2.
a61af66fc99e Initial load
duke
parents:
diff changeset
767 static LIR_Opr stack(int index, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 LIR_Opr res;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 case T_OBJECT: // fall through
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
771 case T_ARRAY:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
772 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
773 LIR_OprDesc::object_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
774 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
775 LIR_OprDesc::single_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
776 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
777
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
778 case T_METADATA:
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
779 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
780 LIR_OprDesc::metadata_type |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
781 LIR_OprDesc::stack_value |
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
782 LIR_OprDesc::single_size);
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
783 break;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
784 case T_INT:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
785 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
786 LIR_OprDesc::int_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
787 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
788 LIR_OprDesc::single_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
789 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
790
1816
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
791 case T_ADDRESS:
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
792 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
793 LIR_OprDesc::address_type |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
794 LIR_OprDesc::stack_value |
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
795 LIR_OprDesc::single_size);
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
796 break;
87b64980e2f1 6972540: sun/nio/ch/SocketChannelImpl compilation crashed when executing CompileTheWorld
never
parents: 1791
diff changeset
797
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
798 case T_LONG:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
799 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
800 LIR_OprDesc::long_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
801 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
802 LIR_OprDesc::double_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
803 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
804
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
805 case T_FLOAT:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
806 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
807 LIR_OprDesc::float_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
808 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
809 LIR_OprDesc::single_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
810 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
811 case T_DOUBLE:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
812 res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
813 LIR_OprDesc::double_type |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
814 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
815 LIR_OprDesc::double_size);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
816 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 default: ShouldNotReachHere(); res = illegalOpr;
a61af66fc99e Initial load
duke
parents:
diff changeset
819 }
a61af66fc99e Initial load
duke
parents:
diff changeset
820
a61af66fc99e Initial load
duke
parents:
diff changeset
821 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
822 assert(index >= 0, "index must be positive");
a61af66fc99e Initial load
duke
parents:
diff changeset
823 assert(index <= (max_jint >> LIR_OprDesc::data_shift), "index is too big");
a61af66fc99e Initial load
duke
parents:
diff changeset
824
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
825 LIR_Opr old_res = (LIR_Opr)(intptr_t)((index << LIR_OprDesc::data_shift) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
826 LIR_OprDesc::stack_value |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
827 as_OprType(type) |
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
828 LIR_OprDesc::size_for(type));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829 assert(res == old_res, "old and new method not equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
830 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
831
a61af66fc99e Initial load
duke
parents:
diff changeset
832 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 }
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 static LIR_Opr intConst(jint i) { return (LIR_Opr)(new LIR_Const(i)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
836 static LIR_Opr longConst(jlong l) { return (LIR_Opr)(new LIR_Const(l)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 static LIR_Opr floatConst(jfloat f) { return (LIR_Opr)(new LIR_Const(f)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
838 static LIR_Opr doubleConst(jdouble d) { return (LIR_Opr)(new LIR_Const(d)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
839 static LIR_Opr oopConst(jobject o) { return (LIR_Opr)(new LIR_Const(o)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 static LIR_Opr address(LIR_Address* a) { return (LIR_Opr)a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
841 static LIR_Opr intptrConst(void* p) { return (LIR_Opr)(new LIR_Const(p)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 static LIR_Opr intptrConst(intptr_t v) { return (LIR_Opr)(new LIR_Const((void*)v)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
843 static LIR_Opr illegal() { return (LIR_Opr)-1; }
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
844 static LIR_Opr addressConst(jint i) { return (LIR_Opr)(new LIR_Const(i, true)); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
845 static LIR_Opr metadataConst(Metadata* m) { return (LIR_Opr)(new LIR_Const(m)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
846
a61af66fc99e Initial load
duke
parents:
diff changeset
847 static LIR_Opr value_type(ValueType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 static LIR_Opr dummy_value_type(ValueType* type);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 };
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851
a61af66fc99e Initial load
duke
parents:
diff changeset
852 //-------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
853 // LIR Instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
854 //-------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
855 //
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // Note:
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // - every instruction has a result operand
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // - every instruction has an CodeEmitInfo operand (can be revisited later)
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // - every instruction has a LIR_OpCode operand
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // - LIR_OpN, means an instruction that has N input operands
a61af66fc99e Initial load
duke
parents:
diff changeset
861 //
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // class hierarchy:
a61af66fc99e Initial load
duke
parents:
diff changeset
863 //
a61af66fc99e Initial load
duke
parents:
diff changeset
864 class LIR_Op;
a61af66fc99e Initial load
duke
parents:
diff changeset
865 class LIR_Op0;
a61af66fc99e Initial load
duke
parents:
diff changeset
866 class LIR_OpLabel;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 class LIR_Op1;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 class LIR_OpBranch;
a61af66fc99e Initial load
duke
parents:
diff changeset
869 class LIR_OpConvert;
a61af66fc99e Initial load
duke
parents:
diff changeset
870 class LIR_OpAllocObj;
a61af66fc99e Initial load
duke
parents:
diff changeset
871 class LIR_OpRoundFP;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 class LIR_Op2;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 class LIR_OpDelay;
a61af66fc99e Initial load
duke
parents:
diff changeset
874 class LIR_Op3;
a61af66fc99e Initial load
duke
parents:
diff changeset
875 class LIR_OpAllocArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
876 class LIR_OpCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
877 class LIR_OpJavaCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 class LIR_OpRTCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 class LIR_OpArrayCopy;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 class LIR_OpLock;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 class LIR_OpTypeCheck;
a61af66fc99e Initial load
duke
parents:
diff changeset
882 class LIR_OpCompareAndSwap;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 class LIR_OpProfileCall;
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886 // LIR operation codes
a61af66fc99e Initial load
duke
parents:
diff changeset
887 enum LIR_Code {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 lir_none
a61af66fc99e Initial load
duke
parents:
diff changeset
889 , begin_op0
a61af66fc99e Initial load
duke
parents:
diff changeset
890 , lir_word_align
a61af66fc99e Initial load
duke
parents:
diff changeset
891 , lir_label
a61af66fc99e Initial load
duke
parents:
diff changeset
892 , lir_nop
a61af66fc99e Initial load
duke
parents:
diff changeset
893 , lir_backwardbranch_target
a61af66fc99e Initial load
duke
parents:
diff changeset
894 , lir_std_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
895 , lir_osr_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
896 , lir_build_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
897 , lir_fpop_raw
a61af66fc99e Initial load
duke
parents:
diff changeset
898 , lir_24bit_FPU
a61af66fc99e Initial load
duke
parents:
diff changeset
899 , lir_reset_FPU
a61af66fc99e Initial load
duke
parents:
diff changeset
900 , lir_breakpoint
a61af66fc99e Initial load
duke
parents:
diff changeset
901 , lir_rtcall
a61af66fc99e Initial load
duke
parents:
diff changeset
902 , lir_membar
a61af66fc99e Initial load
duke
parents:
diff changeset
903 , lir_membar_acquire
a61af66fc99e Initial load
duke
parents:
diff changeset
904 , lir_membar_release
4966
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
905 , lir_membar_loadload
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
906 , lir_membar_storestore
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
907 , lir_membar_loadstore
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
908 , lir_membar_storeload
0
a61af66fc99e Initial load
duke
parents:
diff changeset
909 , lir_get_thread
a61af66fc99e Initial load
duke
parents:
diff changeset
910 , end_op0
a61af66fc99e Initial load
duke
parents:
diff changeset
911 , begin_op1
a61af66fc99e Initial load
duke
parents:
diff changeset
912 , lir_fxch
a61af66fc99e Initial load
duke
parents:
diff changeset
913 , lir_fld
a61af66fc99e Initial load
duke
parents:
diff changeset
914 , lir_ffree
a61af66fc99e Initial load
duke
parents:
diff changeset
915 , lir_push
a61af66fc99e Initial load
duke
parents:
diff changeset
916 , lir_pop
a61af66fc99e Initial load
duke
parents:
diff changeset
917 , lir_null_check
a61af66fc99e Initial load
duke
parents:
diff changeset
918 , lir_return
a61af66fc99e Initial load
duke
parents:
diff changeset
919 , lir_leal
a61af66fc99e Initial load
duke
parents:
diff changeset
920 , lir_neg
a61af66fc99e Initial load
duke
parents:
diff changeset
921 , lir_branch
a61af66fc99e Initial load
duke
parents:
diff changeset
922 , lir_cond_float_branch
a61af66fc99e Initial load
duke
parents:
diff changeset
923 , lir_move
a61af66fc99e Initial load
duke
parents:
diff changeset
924 , lir_prefetchr
a61af66fc99e Initial load
duke
parents:
diff changeset
925 , lir_prefetchw
a61af66fc99e Initial load
duke
parents:
diff changeset
926 , lir_convert
a61af66fc99e Initial load
duke
parents:
diff changeset
927 , lir_alloc_object
a61af66fc99e Initial load
duke
parents:
diff changeset
928 , lir_monaddr
a61af66fc99e Initial load
duke
parents:
diff changeset
929 , lir_roundfp
a61af66fc99e Initial load
duke
parents:
diff changeset
930 , lir_safepoint
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
931 , lir_pack64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
932 , lir_unpack64
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
933 , lir_unwind
0
a61af66fc99e Initial load
duke
parents:
diff changeset
934 , end_op1
a61af66fc99e Initial load
duke
parents:
diff changeset
935 , begin_op2
a61af66fc99e Initial load
duke
parents:
diff changeset
936 , lir_cmp
a61af66fc99e Initial load
duke
parents:
diff changeset
937 , lir_cmp_l2i
a61af66fc99e Initial load
duke
parents:
diff changeset
938 , lir_ucmp_fd2i
a61af66fc99e Initial load
duke
parents:
diff changeset
939 , lir_cmp_fd2i
a61af66fc99e Initial load
duke
parents:
diff changeset
940 , lir_cmove
a61af66fc99e Initial load
duke
parents:
diff changeset
941 , lir_add
a61af66fc99e Initial load
duke
parents:
diff changeset
942 , lir_sub
a61af66fc99e Initial load
duke
parents:
diff changeset
943 , lir_mul
a61af66fc99e Initial load
duke
parents:
diff changeset
944 , lir_mul_strictfp
a61af66fc99e Initial load
duke
parents:
diff changeset
945 , lir_div
a61af66fc99e Initial load
duke
parents:
diff changeset
946 , lir_div_strictfp
a61af66fc99e Initial load
duke
parents:
diff changeset
947 , lir_rem
a61af66fc99e Initial load
duke
parents:
diff changeset
948 , lir_sqrt
a61af66fc99e Initial load
duke
parents:
diff changeset
949 , lir_abs
a61af66fc99e Initial load
duke
parents:
diff changeset
950 , lir_sin
a61af66fc99e Initial load
duke
parents:
diff changeset
951 , lir_cos
a61af66fc99e Initial load
duke
parents:
diff changeset
952 , lir_tan
a61af66fc99e Initial load
duke
parents:
diff changeset
953 , lir_log
a61af66fc99e Initial load
duke
parents:
diff changeset
954 , lir_log10
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
955 , lir_exp
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
956 , lir_pow
0
a61af66fc99e Initial load
duke
parents:
diff changeset
957 , lir_logic_and
a61af66fc99e Initial load
duke
parents:
diff changeset
958 , lir_logic_or
a61af66fc99e Initial load
duke
parents:
diff changeset
959 , lir_logic_xor
a61af66fc99e Initial load
duke
parents:
diff changeset
960 , lir_shl
a61af66fc99e Initial load
duke
parents:
diff changeset
961 , lir_shr
a61af66fc99e Initial load
duke
parents:
diff changeset
962 , lir_ushr
a61af66fc99e Initial load
duke
parents:
diff changeset
963 , lir_alloc_array
a61af66fc99e Initial load
duke
parents:
diff changeset
964 , lir_throw
a61af66fc99e Initial load
duke
parents:
diff changeset
965 , lir_compare_to
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
966 , lir_xadd
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
967 , lir_xchg
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 , end_op2
a61af66fc99e Initial load
duke
parents:
diff changeset
969 , begin_op3
a61af66fc99e Initial load
duke
parents:
diff changeset
970 , lir_idiv
a61af66fc99e Initial load
duke
parents:
diff changeset
971 , lir_irem
a61af66fc99e Initial load
duke
parents:
diff changeset
972 , end_op3
a61af66fc99e Initial load
duke
parents:
diff changeset
973 , begin_opJavaCall
a61af66fc99e Initial load
duke
parents:
diff changeset
974 , lir_static_call
a61af66fc99e Initial load
duke
parents:
diff changeset
975 , lir_optvirtual_call
a61af66fc99e Initial load
duke
parents:
diff changeset
976 , lir_icvirtual_call
a61af66fc99e Initial load
duke
parents:
diff changeset
977 , lir_virtual_call
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
978 , lir_dynamic_call
0
a61af66fc99e Initial load
duke
parents:
diff changeset
979 , end_opJavaCall
a61af66fc99e Initial load
duke
parents:
diff changeset
980 , begin_opArrayCopy
a61af66fc99e Initial load
duke
parents:
diff changeset
981 , lir_arraycopy
a61af66fc99e Initial load
duke
parents:
diff changeset
982 , end_opArrayCopy
a61af66fc99e Initial load
duke
parents:
diff changeset
983 , begin_opLock
a61af66fc99e Initial load
duke
parents:
diff changeset
984 , lir_lock
a61af66fc99e Initial load
duke
parents:
diff changeset
985 , lir_unlock
a61af66fc99e Initial load
duke
parents:
diff changeset
986 , end_opLock
a61af66fc99e Initial load
duke
parents:
diff changeset
987 , begin_delay_slot
a61af66fc99e Initial load
duke
parents:
diff changeset
988 , lir_delay_slot
a61af66fc99e Initial load
duke
parents:
diff changeset
989 , end_delay_slot
a61af66fc99e Initial load
duke
parents:
diff changeset
990 , begin_opTypeCheck
a61af66fc99e Initial load
duke
parents:
diff changeset
991 , lir_instanceof
a61af66fc99e Initial load
duke
parents:
diff changeset
992 , lir_checkcast
a61af66fc99e Initial load
duke
parents:
diff changeset
993 , lir_store_check
a61af66fc99e Initial load
duke
parents:
diff changeset
994 , end_opTypeCheck
a61af66fc99e Initial load
duke
parents:
diff changeset
995 , begin_opCompareAndSwap
a61af66fc99e Initial load
duke
parents:
diff changeset
996 , lir_cas_long
a61af66fc99e Initial load
duke
parents:
diff changeset
997 , lir_cas_obj
a61af66fc99e Initial load
duke
parents:
diff changeset
998 , lir_cas_int
a61af66fc99e Initial load
duke
parents:
diff changeset
999 , end_opCompareAndSwap
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 , begin_opMDOProfile
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 , lir_profile_call
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 , end_opMDOProfile
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1004
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 enum LIR_Condition {
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 lir_cond_equal
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 , lir_cond_notEqual
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 , lir_cond_less
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 , lir_cond_lessEqual
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 , lir_cond_greaterEqual
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 , lir_cond_greater
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 , lir_cond_belowEqual
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 , lir_cond_aboveEqual
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 , lir_cond_always
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 , lir_cond_unknown = -1
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
a61af66fc99e Initial load
duke
parents:
diff changeset
1019
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 enum LIR_PatchCode {
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 lir_patch_none,
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 lir_patch_low,
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 lir_patch_high,
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 lir_patch_normal
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 enum LIR_MoveKind {
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 lir_move_normal,
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 lir_move_volatile,
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 lir_move_unaligned,
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1032 lir_move_wide,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 lir_move_max_flag
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1035
a61af66fc99e Initial load
duke
parents:
diff changeset
1036
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // LIR_Op
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 class LIR_Op: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 const char * _file;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1048
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 LIR_Opr _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 unsigned short _code;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 unsigned short _flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 int _id; // value id for register allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 int _fpu_pop_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 Instruction* _source; // for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 static void print_condition(outputStream* out, LIR_Condition cond) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 static bool is_in_range(LIR_Code test, LIR_Code start, LIR_Code end) { return start < test && test < end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 LIR_Op()
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 : _result(LIR_OprFact::illegalOpr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 , _code(lir_none)
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 , _flags(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 , _info(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 , _file(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 , _line(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 , _fpu_pop_count(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 , _source(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 , _id(-1) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 LIR_Op(LIR_Code code, LIR_Opr result, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 : _result(result)
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 , _code(code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 , _flags(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 , _info(info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 , _file(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 , _line(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 , _fpu_pop_count(0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 , _source(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 , _id(-1) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1089
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 LIR_Code code() const { return (LIR_Code)_code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 LIR_Opr result_opr() const { return _result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 void set_result_opr(LIR_Opr opr) { _result = opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1094
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 void set_file_and_line(const char * file, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 _file = file;
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 _line = line;
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 virtual const char * name() const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 int id() const { return _id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 void set_id(int id) { _id = id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1106
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // FPU stack simulation helpers -- only used on Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 void set_fpu_pop_count(int count) { assert(count >= 0 && count <= 1, "currently only 0 and 1 are valid"); _fpu_pop_count = count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 int fpu_pop_count() const { return _fpu_pop_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 bool pop_fpu_stack() { return _fpu_pop_count > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 Instruction* source() const { return _source; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 void set_source(Instruction* ins) { _source = ins; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1114
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 virtual void emit_code(LIR_Assembler* masm) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 virtual void print_instr(outputStream* out) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 virtual void print_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1118
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 virtual LIR_OpCall* as_OpCall() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 virtual LIR_OpJavaCall* as_OpJavaCall() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 virtual LIR_OpLabel* as_OpLabel() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 virtual LIR_OpDelay* as_OpDelay() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 virtual LIR_OpLock* as_OpLock() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 virtual LIR_OpAllocArray* as_OpAllocArray() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 virtual LIR_OpAllocObj* as_OpAllocObj() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 virtual LIR_OpRoundFP* as_OpRoundFP() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 virtual LIR_OpBranch* as_OpBranch() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 virtual LIR_OpRTCall* as_OpRTCall() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 virtual LIR_OpConvert* as_OpConvert() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 virtual LIR_Op0* as_Op0() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 virtual LIR_Op1* as_Op1() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 virtual LIR_Op2* as_Op2() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 virtual LIR_Op3* as_Op3() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 virtual void verify() const {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 // for calls
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 class LIR_OpCall: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 address _addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 LIR_OprList* _arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 LIR_OpCall(LIR_Code code, address addr, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 LIR_OprList* arguments, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 : LIR_Op(code, result, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 , _arguments(arguments)
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 , _addr(addr) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1155
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 address addr() const { return _addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 const LIR_OprList* arguments() const { return _arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 virtual LIR_OpCall* as_OpCall() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
a61af66fc99e Initial load
duke
parents:
diff changeset
1162
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 // LIR_OpJavaCall
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 class LIR_OpJavaCall: public LIR_OpCall {
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 private:
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1170 ciMethod* _method;
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1171 LIR_Opr _receiver;
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1172 LIR_Opr _method_handle_invoke_SP_save_opr; // Used in LIR_OpVisitState::visit to store the reference to FrameMap::method_handle_invoke_SP_save_opr.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 LIR_OpJavaCall(LIR_Code code, ciMethod* method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 LIR_Opr receiver, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 address addr, LIR_OprList* arguments,
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 : LIR_OpCall(code, addr, result, arguments, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 , _receiver(receiver)
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1181 , _method(method)
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1182 , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1183 { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 LIR_OpJavaCall(LIR_Code code, ciMethod* method,
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 LIR_Opr receiver, LIR_Opr result, intptr_t vtable_offset,
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 LIR_OprList* arguments, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 : LIR_OpCall(code, (address)vtable_offset, result, arguments, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 , _receiver(receiver)
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1190 , _method(method)
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1191 , _method_handle_invoke_SP_save_opr(LIR_OprFact::illegalOpr)
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1507
diff changeset
1192 { assert(is_in_range(code, begin_opJavaCall, end_opJavaCall), "code check"); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1193
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 LIR_Opr receiver() const { return _receiver; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1197 // JSR 292 support.
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1198 bool is_invokedynamic() const { return code() == lir_dynamic_call; }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1199 bool is_method_handle_invoke() const {
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1200 return
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1201 is_invokedynamic() // An invokedynamic is always a MethodHandle call site.
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1202 ||
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1203 method()->is_compiled_lambda_form() // Java-generated adapter
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1204 ||
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1205 method()->is_method_handle_intrinsic(); // JVM-generated MH intrinsic
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1206 }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1207
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 intptr_t vtable_offset() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 assert(_code == lir_virtual_call, "only have vtable for real vcall");
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 return (intptr_t) addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 virtual LIR_OpJavaCall* as_OpJavaCall() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 // LIR_OpLabel
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 // Location where a branch can continue
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 class LIR_OpLabel: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 Label* _label;
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 LIR_OpLabel(Label* lbl)
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 : LIR_Op(lir_label, LIR_OprFact::illegalOpr, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 , _label(lbl) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 Label* label() const { return _label; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1232
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 virtual LIR_OpLabel* as_OpLabel() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1237
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 // LIR_OpArrayCopy
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 class LIR_OpArrayCopy: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1241
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 ArrayCopyStub* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 LIR_Opr _src;
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 LIR_Opr _src_pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 LIR_Opr _dst;
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 LIR_Opr _dst_pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 LIR_Opr _length;
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 LIR_Opr _tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 ciArrayKlass* _expected_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 int _flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 enum Flags {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 src_null_check = 1 << 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 dst_null_check = 1 << 1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 src_pos_positive_check = 1 << 2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 dst_pos_positive_check = 1 << 3,
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 length_positive_check = 1 << 4,
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 src_range_check = 1 << 5,
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 dst_range_check = 1 << 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 type_check = 1 << 7,
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2357
diff changeset
1263 overlapping = 1 << 8,
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2357
diff changeset
1264 unaligned = 1 << 9,
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2357
diff changeset
1265 src_objarray = 1 << 10,
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2357
diff changeset
1266 dst_objarray = 1 << 11,
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2357
diff changeset
1267 all_flags = (1 << 12) - 1
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1269
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 LIR_OpArrayCopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 ciArrayKlass* expected_type, int flags, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 LIR_Opr src() const { return _src; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 LIR_Opr src_pos() const { return _src_pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 LIR_Opr dst() const { return _dst; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 LIR_Opr dst_pos() const { return _dst_pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 LIR_Opr length() const { return _length; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 LIR_Opr tmp() const { return _tmp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 int flags() const { return _flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 ciArrayKlass* expected_type() const { return _expected_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 ArrayCopyStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1282
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 virtual LIR_OpArrayCopy* as_OpArrayCopy() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 // LIR_Op0
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 class LIR_Op0: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 LIR_Op0(LIR_Code code)
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 : LIR_Op(code, LIR_OprFact::illegalOpr, NULL) { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 LIR_Op0(LIR_Code code, LIR_Opr result, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 : LIR_Op(code, result, info) { assert(is_in_range(code, begin_op0, end_op0), "code check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1300
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 virtual LIR_Op0* as_Op0() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1305
a61af66fc99e Initial load
duke
parents:
diff changeset
1306
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 // LIR_Op1
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 // --------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1310
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 class LIR_Op1: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1313
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 LIR_Opr _opr; // input operand
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 BasicType _type; // Operand types
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 LIR_PatchCode _patch; // only required with patchin (NEEDS_CLEANUP: do we want a special instruction for patching?)
a61af66fc99e Initial load
duke
parents:
diff changeset
1318
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 static void print_patch_code(outputStream* out, LIR_PatchCode code);
a61af66fc99e Initial load
duke
parents:
diff changeset
1320
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 void set_kind(LIR_MoveKind kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 assert(code() == lir_move, "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 _flags = kind;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1325
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 LIR_Op1(LIR_Code code, LIR_Opr opr, LIR_Opr result = LIR_OprFact::illegalOpr, BasicType type = T_ILLEGAL, LIR_PatchCode patch = lir_patch_none, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 : LIR_Op(code, result, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 , _opr(opr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 , _patch(patch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 , _type(type) { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1332
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 LIR_Op1(LIR_Code code, LIR_Opr opr, LIR_Opr result, BasicType type, LIR_PatchCode patch, CodeEmitInfo* info, LIR_MoveKind kind)
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 : LIR_Op(code, result, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 , _opr(opr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 , _patch(patch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 , _type(type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 assert(code == lir_move, "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 set_kind(kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 LIR_Op1(LIR_Code code, LIR_Opr opr, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 , _opr(opr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 , _patch(lir_patch_none)
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 , _type(T_ILLEGAL) { assert(is_in_range(code, begin_op1, end_op1), "code check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1347
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 LIR_Opr in_opr() const { return _opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 LIR_PatchCode patch_code() const { return _patch; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 BasicType type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1351
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 LIR_MoveKind move_kind() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 assert(code() == lir_move, "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 return (LIR_MoveKind)_flags;
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1356
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 virtual LIR_Op1* as_Op1() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 virtual const char * name() const PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 void set_in_opr(LIR_Opr opr) { _opr = opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1362
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 virtual void verify() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1366
a61af66fc99e Initial load
duke
parents:
diff changeset
1367
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 // for runtime calls
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 class LIR_OpRTCall: public LIR_OpCall {
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 LIR_Opr _tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 LIR_OpRTCall(address addr, LIR_Opr tmp,
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 LIR_Opr result, LIR_OprList* arguments, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 : LIR_OpCall(lir_rtcall, addr, result, arguments, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 , _tmp(tmp) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1379
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 virtual LIR_OpRTCall* as_OpRTCall() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 LIR_Opr tmp() const { return _tmp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1385
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 virtual void verify() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 class LIR_OpBranch: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 LIR_Condition _cond;
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 Label* _label;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 BlockBegin* _block; // if this is a branch to a block, this is the block
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 BlockBegin* _ublock; // if this is a float-branch, this is the unorderd block
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 CodeStub* _stub; // if this is a branch to a stub, this is the stub
a61af66fc99e Initial load
duke
parents:
diff changeset
1400
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 public:
4816
9164b8236699 7131028: Switch statement takes wrong path
iveresov
parents: 3957
diff changeset
1402 LIR_OpBranch(LIR_Condition cond, BasicType type, Label* lbl)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 : LIR_Op(lir_branch, LIR_OprFact::illegalOpr, (CodeEmitInfo*) NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 , _cond(cond)
4816
9164b8236699 7131028: Switch statement takes wrong path
iveresov
parents: 3957
diff changeset
1405 , _type(type)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 , _label(lbl)
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 , _block(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 , _ublock(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 , _stub(NULL) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1410
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 LIR_OpBranch(LIR_Condition cond, BasicType type, CodeStub* stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 // for unordered comparisons
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 LIR_OpBranch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* ublock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1416
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 LIR_Condition cond() const { return _cond; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 BasicType type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 Label* label() const { return _label; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 BlockBegin* block() const { return _block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 BlockBegin* ublock() const { return _ublock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 CodeStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1423
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 void change_block(BlockBegin* b);
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 void change_ublock(BlockBegin* b);
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 void negate_cond();
a61af66fc99e Initial load
duke
parents:
diff changeset
1427
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 virtual LIR_OpBranch* as_OpBranch() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 class ConversionStub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 class LIR_OpConvert: public LIR_Op1 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 Bytecodes::Code _bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 ConversionStub* _stub;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1442 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1443 LIR_Opr _tmp1;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1444 LIR_Opr _tmp2;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1445 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 : LIR_Op1(lir_convert, opr, result)
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 , _stub(stub)
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1451 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1452 , _tmp1(LIR_OprDesc::illegalOpr())
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1453 , _tmp2(LIR_OprDesc::illegalOpr())
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1454 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 , _bytecode(code) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1457 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1458 LIR_OpConvert(Bytecodes::Code code, LIR_Opr opr, LIR_Opr result, ConversionStub* stub
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1459 ,LIR_Opr tmp1, LIR_Opr tmp2)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1460 : LIR_Op1(lir_convert, opr, result)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1461 , _stub(stub)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1462 , _tmp1(tmp1)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1463 , _tmp2(tmp2)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1464 , _bytecode(code) {}
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1465 #endif
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1466
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 Bytecodes::Code bytecode() const { return _bytecode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 ConversionStub* stub() const { return _stub; }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1469 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1470 LIR_Opr tmp1() const { return _tmp1; }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1471 LIR_Opr tmp2() const { return _tmp2; }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1472 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1473
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 virtual LIR_OpConvert* as_OpConvert() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1477
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 static void print_bytecode(outputStream* out, Bytecodes::Code code) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1480
a61af66fc99e Initial load
duke
parents:
diff changeset
1481
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 // LIR_OpAllocObj
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 class LIR_OpAllocObj : public LIR_Op1 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 LIR_Opr _tmp1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 LIR_Opr _tmp2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 LIR_Opr _tmp3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 LIR_Opr _tmp4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 int _hdr_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 int _obj_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 CodeStub* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 bool _init_check;
a61af66fc99e Initial load
duke
parents:
diff changeset
1495
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 LIR_OpAllocObj(LIR_Opr klass, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4,
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 int hdr_size, int obj_size, bool init_check, CodeStub* stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 : LIR_Op1(lir_alloc_object, klass, result)
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 , _tmp1(t1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 , _tmp2(t2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 , _tmp3(t3)
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 , _tmp4(t4)
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 , _hdr_size(hdr_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 , _obj_size(obj_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 , _init_check(init_check)
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 , _stub(stub) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1509
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 LIR_Opr klass() const { return in_opr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 LIR_Opr obj() const { return result_opr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 LIR_Opr tmp1() const { return _tmp1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 LIR_Opr tmp2() const { return _tmp2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 LIR_Opr tmp3() const { return _tmp3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 LIR_Opr tmp4() const { return _tmp4; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 int header_size() const { return _hdr_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 int object_size() const { return _obj_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 bool init_check() const { return _init_check; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 CodeStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1520
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 virtual LIR_OpAllocObj * as_OpAllocObj () { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 // LIR_OpRoundFP
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 class LIR_OpRoundFP : public LIR_Op1 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1530
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 LIR_Opr _tmp;
a61af66fc99e Initial load
duke
parents:
diff changeset
1533
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 LIR_OpRoundFP(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result)
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 : LIR_Op1(lir_roundfp, reg, result)
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 , _tmp(stack_loc_temp) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1538
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 LIR_Opr tmp() const { return _tmp; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 virtual LIR_OpRoundFP* as_OpRoundFP() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1543
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 // LIR_OpTypeCheck
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 class LIR_OpTypeCheck: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1547
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 LIR_Opr _object;
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 LIR_Opr _array;
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 ciKlass* _klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 LIR_Opr _tmp1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 LIR_Opr _tmp2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 LIR_Opr _tmp3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 bool _fast_check;
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 CodeEmitInfo* _info_for_patch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 CodeEmitInfo* _info_for_exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 CodeStub* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 ciMethod* _profiled_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 int _profiled_bci;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1561 bool _should_profile;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1562
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 LIR_OpTypeCheck(LIR_Code code, LIR_Opr result, LIR_Opr object, ciKlass* klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1566 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 LIR_OpTypeCheck(LIR_Code code, LIR_Opr object, LIR_Opr array,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1568 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 LIR_Opr object() const { return _object; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 LIR_Opr array() const { assert(code() == lir_store_check, "not valid"); return _array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 LIR_Opr tmp1() const { return _tmp1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 LIR_Opr tmp2() const { return _tmp2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 LIR_Opr tmp3() const { return _tmp3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 ciKlass* klass() const { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _klass; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 bool fast_check() const { assert(code() == lir_instanceof || code() == lir_checkcast, "not valid"); return _fast_check; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 CodeEmitInfo* info_for_patch() const { return _info_for_patch; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 CodeEmitInfo* info_for_exception() const { return _info_for_exception; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 CodeStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1580
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
1581 // MethodData* profiling
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1582 void set_profiled_method(ciMethod *method) { _profiled_method = method; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1583 void set_profiled_bci(int bci) { _profiled_bci = bci; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1584 void set_should_profile(bool b) { _should_profile = b; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1585 ciMethod* profiled_method() const { return _profiled_method; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1586 int profiled_bci() const { return _profiled_bci; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1587 bool should_profile() const { return _should_profile; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1588
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 virtual LIR_OpTypeCheck* as_OpTypeCheck() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1593
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 // LIR_Op2
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 class LIR_Op2: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 int _fpu_stack_size; // for sin/cos implementation on Intel
a61af66fc99e Initial load
duke
parents:
diff changeset
1599
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 LIR_Opr _opr1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 LIR_Opr _opr2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 BasicType _type;
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1604 LIR_Opr _tmp1;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1605 LIR_Opr _tmp2;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1606 LIR_Opr _tmp3;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1607 LIR_Opr _tmp4;
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1608 LIR_Opr _tmp5;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 LIR_Condition _condition;
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 void verify() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 , _opr1(opr1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 , _opr2(opr2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 , _type(T_ILLEGAL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 , _condition(condition)
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 , _fpu_stack_size(0)
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1621 , _tmp1(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1622 , _tmp2(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1623 , _tmp3(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1624 , _tmp4(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1625 , _tmp5(LIR_OprFact::illegalOpr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 assert(code == lir_cmp, "code check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1628
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
1629 LIR_Op2(LIR_Code code, LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 : LIR_Op(code, result, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 , _opr1(opr1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 , _opr2(opr2)
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
1633 , _type(type)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 , _condition(condition)
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 , _fpu_stack_size(0)
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1636 , _tmp1(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1637 , _tmp2(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1638 , _tmp3(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1639 , _tmp4(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1640 , _tmp5(LIR_OprFact::illegalOpr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 assert(code == lir_cmove, "code check");
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
1642 assert(type != T_ILLEGAL, "cmove should have type");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1644
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result = LIR_OprFact::illegalOpr,
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 CodeEmitInfo* info = NULL, BasicType type = T_ILLEGAL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 : LIR_Op(code, result, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 , _opr1(opr1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 , _opr2(opr2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 , _type(type)
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 , _condition(lir_cond_unknown)
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 , _fpu_stack_size(0)
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1653 , _tmp1(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1654 , _tmp2(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1655 , _tmp3(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1656 , _tmp4(LIR_OprFact::illegalOpr)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1657 , _tmp5(LIR_OprFact::illegalOpr) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1660
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1661 LIR_Op2(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2 = LIR_OprFact::illegalOpr,
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1662 LIR_Opr tmp3 = LIR_OprFact::illegalOpr, LIR_Opr tmp4 = LIR_OprFact::illegalOpr, LIR_Opr tmp5 = LIR_OprFact::illegalOpr)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 : LIR_Op(code, result, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 , _opr1(opr1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 , _opr2(opr2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 , _type(T_ILLEGAL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 , _condition(lir_cond_unknown)
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 , _fpu_stack_size(0)
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1669 , _tmp1(tmp1)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1670 , _tmp2(tmp2)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1671 , _tmp3(tmp3)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1672 , _tmp4(tmp4)
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1673 , _tmp5(tmp5) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 assert(code != lir_cmp && is_in_range(code, begin_op2, end_op2), "code check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1676
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 LIR_Opr in_opr1() const { return _opr1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 LIR_Opr in_opr2() const { return _opr2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 BasicType type() const { return _type; }
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1680 LIR_Opr tmp1_opr() const { return _tmp1; }
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1681 LIR_Opr tmp2_opr() const { return _tmp2; }
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1682 LIR_Opr tmp3_opr() const { return _tmp3; }
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1683 LIR_Opr tmp4_opr() const { return _tmp4; }
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
1684 LIR_Opr tmp5_opr() const { return _tmp5; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 LIR_Condition condition() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); return _condition;
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1688 void set_condition(LIR_Condition condition) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1689 assert(code() == lir_cmp || code() == lir_cmove, "only valid for cmp and cmove"); _condition = condition;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1690 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1691
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 void set_fpu_stack_size(int size) { _fpu_stack_size = size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1693 int fpu_stack_size() const { return _fpu_stack_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1694
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 void set_in_opr1(LIR_Opr opr) { _opr1 = opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 void set_in_opr2(LIR_Opr opr) { _opr2 = opr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1697
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 virtual LIR_Op2* as_Op2() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1702
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 class LIR_OpAllocArray : public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1705
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 LIR_Opr _klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 LIR_Opr _len;
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 LIR_Opr _tmp1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 LIR_Opr _tmp2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 LIR_Opr _tmp3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 LIR_Opr _tmp4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 BasicType _type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 CodeStub* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1715
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 LIR_OpAllocArray(LIR_Opr klass, LIR_Opr len, LIR_Opr result, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, BasicType type, CodeStub* stub)
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 : LIR_Op(lir_alloc_array, result, NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 , _klass(klass)
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 , _len(len)
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 , _tmp1(t1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 , _tmp2(t2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 , _tmp3(t3)
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 , _tmp4(t4)
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 , _type(type)
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 , _stub(stub) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1727
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 LIR_Opr klass() const { return _klass; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 LIR_Opr len() const { return _len; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 LIR_Opr obj() const { return result_opr(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 LIR_Opr tmp1() const { return _tmp1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 LIR_Opr tmp2() const { return _tmp2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 LIR_Opr tmp3() const { return _tmp3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 LIR_Opr tmp4() const { return _tmp4; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 BasicType type() const { return _type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 CodeStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1737
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 virtual LIR_OpAllocArray * as_OpAllocArray () { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1742
a61af66fc99e Initial load
duke
parents:
diff changeset
1743
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 class LIR_Op3: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1746
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 LIR_Opr _opr1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 LIR_Opr _opr2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 LIR_Opr _opr3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 LIR_Op3(LIR_Code code, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr opr3, LIR_Opr result, CodeEmitInfo* info = NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 : LIR_Op(code, result, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 , _opr1(opr1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 , _opr2(opr2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 , _opr3(opr3) { assert(is_in_range(code, begin_op3, end_op3), "code check"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 LIR_Opr in_opr1() const { return _opr1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 LIR_Opr in_opr2() const { return _opr2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 LIR_Opr in_opr3() const { return _opr3; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1760
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 virtual LIR_Op3* as_Op3() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1765
a61af66fc99e Initial load
duke
parents:
diff changeset
1766
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 //--------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 class LabelObj: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 Label _label;
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 LabelObj() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 Label* label() { return &_label; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1775
a61af66fc99e Initial load
duke
parents:
diff changeset
1776
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 class LIR_OpLock: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1779
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 LIR_Opr _hdr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 LIR_Opr _obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 LIR_Opr _lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 LIR_Opr _scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 CodeStub* _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 LIR_OpLock(LIR_Code code, LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 : LIR_Op(code, LIR_OprFact::illegalOpr, info)
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 , _hdr(hdr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 , _obj(obj)
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 , _lock(lock)
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 , _scratch(scratch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 , _stub(stub) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
1794
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 LIR_Opr hdr_opr() const { return _hdr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 LIR_Opr obj_opr() const { return _obj; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 LIR_Opr lock_opr() const { return _lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 LIR_Opr scratch_opr() const { return _scratch; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 CodeStub* stub() const { return _stub; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1800
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 virtual LIR_OpLock* as_OpLock() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1805
a61af66fc99e Initial load
duke
parents:
diff changeset
1806
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 class LIR_OpDelay: public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1809
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 LIR_Op* _op;
a61af66fc99e Initial load
duke
parents:
diff changeset
1812
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 LIR_OpDelay(LIR_Op* op, CodeEmitInfo* info):
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 LIR_Op(lir_delay_slot, LIR_OprFact::illegalOpr, info),
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 _op(op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 assert(op->code() == lir_nop || LIRFillDelaySlots, "should be filling with nops");
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 virtual LIR_OpDelay* as_OpDelay() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 LIR_Op* delay_op() const { return _op; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 CodeEmitInfo* call_info() const { return info(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1825
a61af66fc99e Initial load
duke
parents:
diff changeset
1826
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 // LIR_OpCompareAndSwap
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 class LIR_OpCompareAndSwap : public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1830
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 LIR_Opr _addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 LIR_Opr _cmp_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 LIR_Opr _new_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 LIR_Opr _tmp1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 LIR_Opr _tmp2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1837
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 public:
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1839 LIR_OpCompareAndSwap(LIR_Code code, LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1840 LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
1841 : LIR_Op(code, result, NULL) // no result, no info
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 , _addr(addr)
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 , _cmp_value(cmp_value)
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 , _new_value(new_value)
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 , _tmp1(t1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 , _tmp2(t2) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1847
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 LIR_Opr addr() const { return _addr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 LIR_Opr cmp_value() const { return _cmp_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 LIR_Opr new_value() const { return _new_value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 LIR_Opr tmp1() const { return _tmp1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 LIR_Opr tmp2() const { return _tmp2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1853
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 virtual LIR_OpCompareAndSwap * as_OpCompareAndSwap () { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1858
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 // LIR_OpProfileCall
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 class LIR_OpProfileCall : public LIR_Op {
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 friend class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
1862
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 ciMethod* _profiled_method;
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1865 int _profiled_bci;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1866 ciMethod* _profiled_callee;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1867 LIR_Opr _mdo;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1868 LIR_Opr _recv;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1869 LIR_Opr _tmp1;
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1870 ciKlass* _known_holder;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1871
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 // Destroys recv
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1874 LIR_OpProfileCall(LIR_Code code, ciMethod* profiled_method, int profiled_bci, ciMethod* profiled_callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* known_holder)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 : LIR_Op(code, LIR_OprFact::illegalOpr, NULL) // no result, no info
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 , _profiled_method(profiled_method)
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 , _profiled_bci(profiled_bci)
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1878 , _profiled_callee(profiled_callee)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 , _mdo(mdo)
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 , _recv(recv)
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 , _tmp1(t1)
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 , _known_holder(known_holder) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
1883
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 ciMethod* profiled_method() const { return _profiled_method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 int profiled_bci() const { return _profiled_bci; }
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
1886 ciMethod* profiled_callee() const { return _profiled_callee; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 LIR_Opr mdo() const { return _mdo; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 LIR_Opr recv() const { return _recv; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 LIR_Opr tmp1() const { return _tmp1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 ciKlass* known_holder() const { return _known_holder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1891
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 virtual void emit_code(LIR_Assembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 virtual LIR_OpProfileCall* as_OpProfileCall() { return this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 virtual void print_instr(outputStream* out) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1896
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 class LIR_InsertionBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
1898
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 //--------------------------------LIR_List---------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 // Maintains a list of LIR instructions (one instance of LIR_List per basic block)
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // The LIR instructions are appended by the LIR_List class itself;
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // Notes:
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // - all offsets are(should be) in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // - local positions are specified with an offset, with offset 0 being local 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1906
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 class LIR_List: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 LIR_OpList _operations;
a61af66fc99e Initial load
duke
parents:
diff changeset
1910
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 Compilation* _compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 BlockBegin* _block;
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 const char * _file;
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1919
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 void append(LIR_Op* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 if (op->source() == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 op->set_source(_compilation->current_instruction());
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 if (PrintIRWithLIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 _compilation->maybe_print_current_instruction();
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 op->print(); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1929
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 _operations.append(op);
a61af66fc99e Initial load
duke
parents:
diff changeset
1931
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 op->verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 op->set_file_and_line(_file, _line);
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 _file = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 _line = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1939
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 LIR_List(Compilation* compilation, BlockBegin* block = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 void set_file_and_line(const char * file, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1946
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 //---------- accessors ---------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 LIR_OpList* instructions_list() { return &_operations; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 int length() const { return _operations.length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 LIR_Op* at(int i) const { return _operations.at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1951
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 NOT_PRODUCT(BlockBegin* block() const { return _block; });
a61af66fc99e Initial load
duke
parents:
diff changeset
1953
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 // insert LIR_Ops in buffer to right places in LIR_List
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 void append(LIR_InsertionBuffer* buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 //---------- mutators ---------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 void insert_before(int i, LIR_List* op_list) { _operations.insert_before(i, op_list->instructions_list()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 void insert_before(int i, LIR_Op* op) { _operations.insert_before(i, op); }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1960 void remove_at(int i) { _operations.remove_at(i); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1961
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 //---------- printing -------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 void print_instructions() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1964
a61af66fc99e Initial load
duke
parents:
diff changeset
1965
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 //---------- instructions -------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 void call_opt_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 address dest, LIR_OprList* arguments,
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 append(new LIR_OpJavaCall(lir_optvirtual_call, method, receiver, result, dest, arguments, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 void call_static(ciMethod* method, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 append(new LIR_OpJavaCall(lir_static_call, method, LIR_OprFact::illegalOpr, result, dest, arguments, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 void call_icvirtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 append(new LIR_OpJavaCall(lir_icvirtual_call, method, receiver, result, dest, arguments, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 void call_virtual(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 intptr_t vtable_offset, LIR_OprList* arguments, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 append(new LIR_OpJavaCall(lir_virtual_call, method, receiver, result, vtable_offset, arguments, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 }
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1984 void call_dynamic(ciMethod* method, LIR_Opr receiver, LIR_Opr result,
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1985 address dest, LIR_OprList* arguments, CodeEmitInfo* info) {
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1986 append(new LIR_OpJavaCall(lir_dynamic_call, method, receiver, result, dest, arguments, info));
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1175
diff changeset
1987 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1988
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 void get_thread(LIR_Opr result) { append(new LIR_Op0(lir_get_thread, result)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 void word_align() { append(new LIR_Op0(lir_word_align)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 void membar() { append(new LIR_Op0(lir_membar)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 void membar_acquire() { append(new LIR_Op0(lir_membar_acquire)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 void membar_release() { append(new LIR_Op0(lir_membar_release)); }
4966
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
1994 void membar_loadload() { append(new LIR_Op0(lir_membar_loadload)); }
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
1995 void membar_storestore() { append(new LIR_Op0(lir_membar_storestore)); }
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
1996 void membar_loadstore() { append(new LIR_Op0(lir_membar_loadstore)); }
701a83c86f28 7120481: storeStore barrier in constructor with final field
jiangli
parents: 4816
diff changeset
1997 void membar_storeload() { append(new LIR_Op0(lir_membar_storeload)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1998
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 void nop() { append(new LIR_Op0(lir_nop)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 void build_frame() { append(new LIR_Op0(lir_build_frame)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2001
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 void std_entry(LIR_Opr receiver) { append(new LIR_Op0(lir_std_entry, receiver)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 void osr_entry(LIR_Opr osrPointer) { append(new LIR_Op0(lir_osr_entry, osrPointer)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 void branch_destination(Label* lbl) { append(new LIR_OpLabel(lbl)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2006
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 void negate(LIR_Opr from, LIR_Opr to) { append(new LIR_Op1(lir_neg, from, to)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 void leal(LIR_Opr from, LIR_Opr result_reg) { append(new LIR_Op1(lir_leal, from, result_reg)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2009
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 // result is a stack location for old backend and vreg for UseLinearScan
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 // stack_loc_temp is an illegal register for old backend
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 void roundfp(LIR_Opr reg, LIR_Opr stack_loc_temp, LIR_Opr result) { append(new LIR_OpRoundFP(reg, stack_loc_temp, result)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 void unaligned_move(LIR_Address* src, LIR_Opr dst) { append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, dst->type(), lir_patch_none, NULL, lir_move_unaligned)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 void unaligned_move(LIR_Opr src, LIR_Address* dst) { append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), src->type(), lir_patch_none, NULL, lir_move_unaligned)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 void unaligned_move(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, NULL, lir_move_unaligned)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 void move(LIR_Opr src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 void move(LIR_Address* src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, src->type(), lir_patch_none, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 void move(LIR_Opr src, LIR_Address* dst, CodeEmitInfo* info = NULL) { append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), dst->type(), lir_patch_none, info)); }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2019 void move_wide(LIR_Address* src, LIR_Opr dst, CodeEmitInfo* info = NULL) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2020 if (UseCompressedOops) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2021 append(new LIR_Op1(lir_move, LIR_OprFact::address(src), dst, src->type(), lir_patch_none, info, lir_move_wide));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2022 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2023 move(src, dst, info);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2024 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2025 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2026 void move_wide(LIR_Opr src, LIR_Address* dst, CodeEmitInfo* info = NULL) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2027 if (UseCompressedOops) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2028 append(new LIR_Op1(lir_move, src, LIR_OprFact::address(dst), dst->type(), lir_patch_none, info, lir_move_wide));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2029 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2030 move(src, dst, info);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2031 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2032 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 void volatile_move(LIR_Opr src, LIR_Opr dst, BasicType type, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none) { append(new LIR_Op1(lir_move, src, dst, type, patch_code, info, lir_move_volatile)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2034
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
2035 void oop2reg (jobject o, LIR_Opr reg) { assert(reg->type() == T_OBJECT, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::oopConst(o), reg)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 void oop2reg_patch(jobject o, LIR_Opr reg, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2037
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6725
diff changeset
2038 void metadata2reg (Metadata* o, LIR_Opr reg) { assert(reg->type() == T_METADATA, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg)); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2039 void klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2040
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 void return_op(LIR_Opr result) { append(new LIR_Op1(lir_return, result)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2042
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 void safepoint(LIR_Opr tmp, CodeEmitInfo* info) { append(new LIR_Op1(lir_safepoint, tmp, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2045 #ifdef PPC
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2046 void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_OpConvert(code, left, dst, NULL, tmp1, tmp2)); }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2047 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, ConversionStub* stub = NULL/*, bool is_32bit = false*/) { append(new LIR_OpConvert(code, left, dst, stub)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2049
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 void logical_and (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_and, left, right, dst)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 void logical_or (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_or, left, right, dst)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 void logical_xor (LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_logic_xor, left, right, dst)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2053
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2054 void pack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_pack64, src, dst, T_LONG, lir_patch_none, NULL)); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2055 void unpack64(LIR_Opr src, LIR_Opr dst) { append(new LIR_Op1(lir_unpack64, src, dst, T_LONG, lir_patch_none, NULL)); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2056
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 void null_check(LIR_Opr opr, CodeEmitInfo* info) { append(new LIR_Op1(lir_null_check, opr, info)); }
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2058 void throw_exception(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2059 append(new LIR_Op2(lir_throw, exceptionPC, exceptionOop, LIR_OprFact::illegalOpr, info));
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2060 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2061 void unwind_exception(LIR_Opr exceptionOop) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2062 append(new LIR_Op1(lir_unwind, exceptionOop));
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1297
diff changeset
2063 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2064
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 void compare_to (LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 append(new LIR_Op2(lir_compare_to, left, right, dst));
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2068
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 void push(LIR_Opr opr) { append(new LIR_Op1(lir_push, opr)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 void pop(LIR_Opr reg) { append(new LIR_Op1(lir_pop, reg)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 void cmp(LIR_Condition condition, LIR_Opr left, LIR_Opr right, CodeEmitInfo* info = NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 append(new LIR_Op2(lir_cmp, condition, left, right, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 void cmp(LIR_Condition condition, LIR_Opr left, int right, CodeEmitInfo* info = NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 cmp(condition, left, LIR_OprFact::intConst(right), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2078
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 void cmp_mem_int(LIR_Condition condition, LIR_Opr base, int disp, int c, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 void cmp_reg_mem(LIR_Condition condition, LIR_Opr reg, LIR_Address* addr, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2081
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
2082 void cmove(LIR_Condition condition, LIR_Opr src1, LIR_Opr src2, LIR_Opr dst, BasicType type) {
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2002
diff changeset
2083 append(new LIR_Op2(lir_cmove, condition, src1, src2, dst, type));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2086 void cas_long(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2087 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2088 void cas_obj(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2089 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2090 void cas_int(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2091 LIR_Opr t1, LIR_Opr t2, LIR_Opr result = LIR_OprFact::illegalOpr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2092
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 void abs (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_abs , from, tmp, to)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 void sqrt(LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_sqrt, from, tmp, to)); }
953
ff1a29907b6c 6855215: Calculation error (NaN) after about 1500 calculations
never
parents: 337
diff changeset
2095 void log (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log, from, LIR_OprFact::illegalOpr, to, tmp)); }
ff1a29907b6c 6855215: Calculation error (NaN) after about 1500 calculations
never
parents: 337
diff changeset
2096 void log10 (LIR_Opr from, LIR_Opr to, LIR_Opr tmp) { append(new LIR_Op2(lir_log10, from, LIR_OprFact::illegalOpr, to, tmp)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 void sin (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_sin , from, tmp1, to, tmp2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 void cos (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_cos , from, tmp1, to, tmp2)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 void tan (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_Op2(lir_tan , from, tmp1, to, tmp2)); }
6084
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
2100 void exp (LIR_Opr from, LIR_Opr to, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_exp , from, tmp1, to, tmp2, tmp3, tmp4, tmp5)); }
6759698e3140 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 4966
diff changeset
2101 void pow (LIR_Opr arg1, LIR_Opr arg2, LIR_Opr res, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, LIR_Opr tmp4, LIR_Opr tmp5) { append(new LIR_Op2(lir_pow, arg1, arg2, res, tmp1, tmp2, tmp3, tmp4, tmp5)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2102
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 void add (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_add, left, right, res)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 void sub (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_sub, left, right, res, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 void mul (LIR_Opr left, LIR_Opr right, LIR_Opr res) { append(new LIR_Op2(lir_mul, left, right, res)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 void mul_strictfp (LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_mul_strictfp, left, right, res, tmp)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 void div (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_div, left, right, res, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 void div_strictfp (LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_div_strictfp, left, right, res, tmp)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 void rem (LIR_Opr left, LIR_Opr right, LIR_Opr res, CodeEmitInfo* info = NULL) { append(new LIR_Op2(lir_rem, left, right, res, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2110
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 void volatile_load_mem_reg(LIR_Address* address, LIR_Opr dst, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 void volatile_load_unsafe_reg(LIR_Opr base, LIR_Opr offset, LIR_Opr dst, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
2113
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 void load(LIR_Address* addr, LIR_Opr src, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2115
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 void prefetch(LIR_Address* addr, bool is_store);
a61af66fc99e Initial load
duke
parents:
diff changeset
2117
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 void store_mem_int(jint v, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 void store_mem_oop(jobject o, LIR_Opr base, int offset_in_bytes, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 void store(LIR_Opr src, LIR_Address* addr, CodeEmitInfo* info = NULL, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 void volatile_store_mem_reg(LIR_Opr src, LIR_Address* address, CodeEmitInfo* info, LIR_PatchCode patch_code = lir_patch_none);
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 void volatile_store_unsafe_reg(LIR_Opr src, LIR_Opr base, LIR_Opr offset, BasicType type, CodeEmitInfo* info, LIR_PatchCode patch_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
2123
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 void idiv(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 void idiv(LIR_Opr left, int right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 void irem(LIR_Opr left, LIR_Opr right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 void irem(LIR_Opr left, int right, LIR_Opr res, LIR_Opr tmp, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2128
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 void allocate_object(LIR_Opr dst, LIR_Opr t1, LIR_Opr t2, LIR_Opr t3, LIR_Opr t4, int header_size, int object_size, LIR_Opr klass, bool init_check, CodeStub* stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 void allocate_array(LIR_Opr dst, LIR_Opr len, LIR_Opr t1,LIR_Opr t2, LIR_Opr t3,LIR_Opr t4, BasicType type, LIR_Opr klass, CodeStub* stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
2131
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 // jump is an unconditional branch
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 void jump(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, block));
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 void jump(CodeStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 append(new LIR_OpBranch(lir_cond_always, T_ILLEGAL, stub));
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 }
4816
9164b8236699 7131028: Switch statement takes wrong path
iveresov
parents: 3957
diff changeset
2139 void branch(LIR_Condition cond, BasicType type, Label* lbl) { append(new LIR_OpBranch(cond, type, lbl)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 void branch(LIR_Condition cond, BasicType type, BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 append(new LIR_OpBranch(cond, type, block));
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 void branch(LIR_Condition cond, BasicType type, CodeStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 assert(type != T_FLOAT && type != T_DOUBLE, "no fp comparisons");
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 append(new LIR_OpBranch(cond, type, stub));
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 void branch(LIR_Condition cond, BasicType type, BlockBegin* block, BlockBegin* unordered) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 assert(type == T_FLOAT || type == T_DOUBLE, "fp comparisons only");
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 append(new LIR_OpBranch(cond, type, block, unordered));
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2152
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 void shift_left(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 void shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 void unsigned_shift_right(LIR_Opr value, LIR_Opr count, LIR_Opr dst, LIR_Opr tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2156
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 void shift_left(LIR_Opr value, int count, LIR_Opr dst) { shift_left(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 void shift_right(LIR_Opr value, int count, LIR_Opr dst) { shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 void unsigned_shift_right(LIR_Opr value, int count, LIR_Opr dst) { unsigned_shift_right(value, LIR_OprFact::intConst(count), dst, LIR_OprFact::illegalOpr); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2160
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 void lcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst) { append(new LIR_Op2(lir_cmp_l2i, left, right, dst)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 void fcmp2int(LIR_Opr left, LIR_Opr right, LIR_Opr dst, bool is_unordered_less);
a61af66fc99e Initial load
duke
parents:
diff changeset
2163
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 void call_runtime_leaf(address routine, LIR_Opr tmp, LIR_Opr result, LIR_OprList* arguments) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 append(new LIR_OpRTCall(routine, tmp, result, arguments));
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2167
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 void call_runtime(address routine, LIR_Opr tmp, LIR_Opr result,
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 LIR_OprList* arguments, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 append(new LIR_OpRTCall(routine, tmp, result, arguments, info));
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2172
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 void load_stack_address_monitor(int monitor_ix, LIR_Opr dst) { append(new LIR_Op1(lir_monaddr, LIR_OprFact::intConst(monitor_ix), dst)); }
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
2174 void unlock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 void lock_object(LIR_Opr hdr, LIR_Opr obj, LIR_Opr lock, LIR_Opr scratch, CodeStub* stub, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2176
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 void set_24bit_fpu() { append(new LIR_Op0(lir_24bit_FPU )); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 void restore_fpu() { append(new LIR_Op0(lir_reset_FPU )); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 void breakpoint() { append(new LIR_Op0(lir_breakpoint)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2180
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 void arraycopy(LIR_Opr src, LIR_Opr src_pos, LIR_Opr dst, LIR_Opr dst_pos, LIR_Opr length, LIR_Opr tmp, ciArrayKlass* expected_type, int flags, CodeEmitInfo* info) { append(new LIR_OpArrayCopy(src, src_pos, dst, dst_pos, length, tmp, expected_type, flags, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2182
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 void fpop_raw() { append(new LIR_Op0(lir_fpop_raw)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2184
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1783
diff changeset
2185 void instanceof(LIR_Opr result, LIR_Opr object, ciKlass* klass, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check, CodeEmitInfo* info_for_patch, ciMethod* profiled_method, int profiled_bci);
3957
5cceda753a4a 7091764: Tiered: enable aastore profiling
iveresov
parents: 2446
diff changeset
2186 void store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception, ciMethod* profiled_method, int profiled_bci);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2187
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 void checkcast (LIR_Opr result, LIR_Opr object, ciKlass* klass,
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 CodeEmitInfo* info_for_exception, CodeEmitInfo* info_for_patch, CodeStub* stub,
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 ciMethod* profiled_method, int profiled_bci);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6266
diff changeset
2192 // MethodData* profiling
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
2193 void profile_call(ciMethod* method, int bci, ciMethod* callee, LIR_Opr mdo, LIR_Opr recv, LIR_Opr t1, ciKlass* cha_klass) {
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6084
diff changeset
2194 append(new LIR_OpProfileCall(lir_profile_call, method, bci, callee, mdo, recv, t1, cha_klass));
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2195 }
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2196
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2197 void xadd(LIR_Opr src, LIR_Opr add, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xadd, src, add, res, tmp)); }
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2198 void xchg(LIR_Opr src, LIR_Opr set, LIR_Opr res, LIR_Opr tmp) { append(new LIR_Op2(lir_xchg, src, set, res, tmp)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2200
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 void print_LIR(BlockList* blocks);
a61af66fc99e Initial load
duke
parents:
diff changeset
2202
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 class LIR_InsertionBuffer : public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 LIR_List* _lir; // the lir list where ops of this buffer should be inserted later (NULL when uninitialized)
a61af66fc99e Initial load
duke
parents:
diff changeset
2206
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 // list of insertion points. index and count are stored alternately:
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 // _index_and_count[i * 2]: the index into lir list where "count" ops should be inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 // _index_and_count[i * 2 + 1]: the number of ops to be inserted at index
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 intStack _index_and_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2211
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 // the LIR_Ops to be inserted
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 LIR_OpList _ops;
a61af66fc99e Initial load
duke
parents:
diff changeset
2214
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 void append_new(int index, int count) { _index_and_count.append(index); _index_and_count.append(count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 void set_index_at(int i, int value) { _index_and_count.at_put((i << 1), value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 void set_count_at(int i, int value) { _index_and_count.at_put((i << 1) + 1, value); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2218
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 void verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 LIR_InsertionBuffer() : _lir(NULL), _index_and_count(8), _ops(8) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
2224
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // must be called before using the insertion buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 void init(LIR_List* lir) { assert(!initialized(), "already initialized"); _lir = lir; _index_and_count.clear(); _ops.clear(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 bool initialized() const { return _lir != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 // called automatically when the buffer is appended to the LIR_List
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 void finish() { _lir = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2230
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 LIR_List* lir_list() const { return _lir; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 int number_of_insertion_points() const { return _index_and_count.length() >> 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 int index_at(int i) const { return _index_and_count.at((i << 1)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 int count_at(int i) const { return _index_and_count.at((i << 1) + 1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2236
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 int number_of_ops() const { return _ops.length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 LIR_Op* op_at(int i) const { return _ops.at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2239
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 // append an instruction to the buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 void append(int index, LIR_Op* op);
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 // instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 void move(int index, LIR_Opr src, LIR_Opr dst, CodeEmitInfo* info = NULL) { append(index, new LIR_Op1(lir_move, src, dst, dst->type(), lir_patch_none, info)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2246
a61af66fc99e Initial load
duke
parents:
diff changeset
2247
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 // LIR_OpVisitState is used for manipulating LIR_Ops in an abstract way.
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 // Calling a LIR_Op's visit function with a LIR_OpVisitState causes
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 // information about the input, output and temporaries used by the
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 // op to be recorded. It also records whether the op has call semantics
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 // and also records all the CodeEmitInfos used by this op.
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2255
a61af66fc99e Initial load
duke
parents:
diff changeset
2256
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 class LIR_OpVisitState: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 typedef enum { inputMode, firstMode = inputMode, tempMode, outputMode, numModes, invalidMode = -1 } OprMode;
a61af66fc99e Initial load
duke
parents:
diff changeset
2260
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 enum {
1175
614b7e3a9f48 6879943: CTW failure jdk6_18/hotspot/src/share/vm/c1/c1_LIR.hpp:2029
never
parents: 953
diff changeset
2262 maxNumberOfOperands = 16,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 maxNumberOfInfos = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2265
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 LIR_Op* _op;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 // optimization: the operands and infos are not stored in a variable-length
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 // list, but in a fixed-size array to save time of size checks and resizing
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 int _oprs_len[numModes];
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 LIR_Opr* _oprs_new[numModes][maxNumberOfOperands];
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 int _info_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 CodeEmitInfo* _info_new[maxNumberOfInfos];
a61af66fc99e Initial load
duke
parents:
diff changeset
2275
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 bool _has_call;
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 bool _has_slow_case;
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
a61af66fc99e Initial load
duke
parents:
diff changeset
2279
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 // only include register operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 // addresses are decomposed to the base and index registers
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 // constants and stack operands are ignored
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 void append(LIR_Opr& opr, OprMode mode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 assert(opr->is_valid(), "should not call this otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 assert(mode >= 0 && mode < numModes, "bad mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2286
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 if (opr->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 _oprs_new[mode][_oprs_len[mode]++] = &opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2290
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 } else if (opr->is_pointer()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 LIR_Address* address = opr->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 if (address != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 // special handling for addresses: add base and index register of the address
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2295 // both are always input operands or temp if we want to extend
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2296 // their liveness!
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2297 if (mode == outputMode) {
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2298 mode = inputMode;
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2299 }
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2300 assert (mode == inputMode || mode == tempMode, "input or temp only for addresses");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 if (address->_base->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 assert(address->_base->is_register(), "must be");
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2303 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2304 _oprs_new[mode][_oprs_len[mode]++] = &address->_base;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 if (address->_index->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 assert(address->_index->is_register(), "must be");
6795
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2308 assert(_oprs_len[mode] < maxNumberOfOperands, "array overflow");
7eca5de9e0b6 7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
roland
parents: 6739
diff changeset
2309 _oprs_new[mode][_oprs_len[mode]++] = &address->_index;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2311
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 assert(opr->is_constant(), "constant operands are not processed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 assert(opr->is_stack(), "stack operands are not processed");
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2319
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 void append(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 assert(info != NULL, "should not call this otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 assert(_info_len < maxNumberOfInfos, "array overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 _info_new[_info_len++] = info;
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2325
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 LIR_OpVisitState() { reset(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2328
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 LIR_Op* op() const { return _op; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 void set_op(LIR_Op* op) { reset(); _op = op; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2331
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 bool has_call() const { return _has_call; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 bool has_slow_case() const { return _has_slow_case; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2334
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 void reset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 _op = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 _has_call = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 _has_slow_case = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2339
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 _oprs_len[inputMode] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 _oprs_len[tempMode] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 _oprs_len[outputMode] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 _info_len = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2345
a61af66fc99e Initial load
duke
parents:
diff changeset
2346
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 int opr_count(OprMode mode) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 assert(mode >= 0 && mode < numModes, "bad mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 return _oprs_len[mode];
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2351
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 LIR_Opr opr_at(OprMode mode, int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 assert(mode >= 0 && mode < numModes, "bad mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 return *_oprs_new[mode][index];
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2357
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 void set_opr_at(OprMode mode, int index, LIR_Opr opr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 assert(mode >= 0 && mode < numModes, "bad mode");
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 assert(index >= 0 && index < _oprs_len[mode], "index out of bound");
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 *_oprs_new[mode][index] = opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2363
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 int info_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 return _info_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2367
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 CodeEmitInfo* info_at(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 assert(index < _info_len, "index out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 return _info_new[index];
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2372
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 XHandlers* all_xhandler();
a61af66fc99e Initial load
duke
parents:
diff changeset
2374
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 // collects all register operands of the instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 void visit(LIR_Op* op);
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 #if ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2379 // check that an operation has no operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 bool no_operands(LIR_Op* op);
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2382
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 // LIR_Op visitor functions use these to fill in the state
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 void do_input(LIR_Opr& opr) { append(opr, LIR_OpVisitState::inputMode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 void do_output(LIR_Opr& opr) { append(opr, LIR_OpVisitState::outputMode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 void do_temp(LIR_Opr& opr) { append(opr, LIR_OpVisitState::tempMode); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 void do_info(CodeEmitInfo* info) { append(info); }
a61af66fc99e Initial load
duke
parents:
diff changeset
2388
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 void do_stub(CodeStub* stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 void do_call() { _has_call = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 void do_slow_case() { _has_slow_case = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 void do_slow_case(CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 _has_slow_case = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 append(info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 };
a61af66fc99e Initial load
duke
parents:
diff changeset
2397
a61af66fc99e Initial load
duke
parents:
diff changeset
2398
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 inline LIR_Opr LIR_OprDesc::illegalOpr() { return LIR_OprFact::illegalOpr; };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
2400
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1816
diff changeset
2401 #endif // SHARE_VM_C1_C1_LIR_HPP