annotate src/cpu/x86/vm/c1_LIRAssembler_x86.cpp @ 3096:8073f5ad1d87

IdealGraphVisualizer: Rename predecessors to "Nodes Above" and successors to "Nodes Below" and actions "Expand Predecessors" and "Expand Successors" to "Expand Above" and "Expand Below" to avoid ambiguity with the Graal concept of successors and predecessors
author Peter Hofer <peter.hofer@jku.at>
date Wed, 29 Jun 2011 18:27:14 +0200
parents 15c9a0e16269
children ccf072cdba91
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2112
55f868e91c3b 7010618: C1: array length should be treated at int on 64bit during array allocation
iveresov
parents: 2089
diff changeset
2 * Copyright (c) 2000, 2011, 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: 1491
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1491
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: 1491
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: 1848
diff changeset
25 #include "precompiled.hpp"
2415
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
26 #include "asm/assembler.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
27 #include "c1/c1_Compilation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
28 #include "c1/c1_LIRAssembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
29 #include "c1/c1_MacroAssembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
30 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
31 #include "c1/c1_ValueStack.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
32 #include "ci/ciArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
33 #include "ci/ciInstance.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
34 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
35 #include "memory/barrierSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
36 #include "memory/cardTableModRefBS.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
37 #include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
38 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1848
diff changeset
39 #include "runtime/sharedRuntime.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // These masks are used to provide 128-bit aligned bitmasks to the XMM
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // instructions, to allow sign-masking or sign-bit flipping. They allow
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // fast versions of NegF/NegD and AbsF/AbsD.
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // Note: 'double' and 'long long' have 32-bits alignment on x86.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Use the expression (adr)&(~0xF) to provide 128-bits aligned address
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // of 128-bits operands for SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 jlong *operand = (jlong*)(((long)adr)&((long)(~0xF)));
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Store the value to a 128-bits operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
52 operand[0] = lo;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 operand[1] = hi;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 return operand;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Buffer for 128-bits masks used by SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 static jlong fp_signmask_pool[(4+1)*2]; // 4*128bits(data) + 128bits(alignment)
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Static initialization during VM startup.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 static jlong *float_signmask_pool = double_quadword(&fp_signmask_pool[1*2], CONST64(0x7FFFFFFF7FFFFFFF), CONST64(0x7FFFFFFF7FFFFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
62 static jlong *double_signmask_pool = double_quadword(&fp_signmask_pool[2*2], CONST64(0x7FFFFFFFFFFFFFFF), CONST64(0x7FFFFFFFFFFFFFFF));
a61af66fc99e Initial load
duke
parents:
diff changeset
63 static jlong *float_signflip_pool = double_quadword(&fp_signmask_pool[3*2], CONST64(0x8000000080000000), CONST64(0x8000000080000000));
a61af66fc99e Initial load
duke
parents:
diff changeset
64 static jlong *double_signflip_pool = double_quadword(&fp_signmask_pool[4*2], CONST64(0x8000000000000000), CONST64(0x8000000000000000));
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 NEEDS_CLEANUP // remove this definitions ?
a61af66fc99e Initial load
duke
parents:
diff changeset
69 const Register IC_Klass = rax; // where the IC klass is cached
a61af66fc99e Initial load
duke
parents:
diff changeset
70 const Register SYNC_header = rax; // synchronization header
a61af66fc99e Initial load
duke
parents:
diff changeset
71 const Register SHIFT_count = rcx; // where count for shift operations must be
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 #define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static void select_different_registers(Register preserve,
a61af66fc99e Initial load
duke
parents:
diff changeset
77 Register extra,
a61af66fc99e Initial load
duke
parents:
diff changeset
78 Register &tmp1,
a61af66fc99e Initial load
duke
parents:
diff changeset
79 Register &tmp2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 if (tmp1 == preserve) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 assert_different_registers(tmp1, tmp2, extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 tmp1 = extra;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 } else if (tmp2 == preserve) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 assert_different_registers(tmp1, tmp2, extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 tmp2 = extra;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 assert_different_registers(preserve, tmp1, tmp2);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static void select_different_registers(Register preserve,
a61af66fc99e Initial load
duke
parents:
diff changeset
93 Register extra,
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Register &tmp1,
a61af66fc99e Initial load
duke
parents:
diff changeset
95 Register &tmp2,
a61af66fc99e Initial load
duke
parents:
diff changeset
96 Register &tmp3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 if (tmp1 == preserve) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 assert_different_registers(tmp1, tmp2, tmp3, extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 tmp1 = extra;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 } else if (tmp2 == preserve) {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 assert_different_registers(tmp1, tmp2, tmp3, extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
102 tmp2 = extra;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 } else if (tmp3 == preserve) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 assert_different_registers(tmp1, tmp2, tmp3, extra);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 tmp3 = extra;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert_different_registers(preserve, tmp1, tmp2, tmp3);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 bool LIR_Assembler::is_small_constant(LIR_Opr opr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 if (opr->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 LIR_Const* constant = opr->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 switch (constant->type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 case T_INT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
121 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
122 }
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 LIR_Opr LIR_Assembler::receiverOpr() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
129 return FrameMap::receiver_opr;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 LIR_Opr LIR_Assembler::incomingReceiverOpr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return receiverOpr();
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 LIR_Opr LIR_Assembler::osrBufferPointer() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
137 return FrameMap::as_pointer_opr(receiverOpr()->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 //--------------fpu register translations-----------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 address LIR_Assembler::float_constant(float f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
144 address const_addr = __ float_constant(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (const_addr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 bailout("const section overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
147 return __ code()->consts()->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 return const_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 address LIR_Assembler::double_constant(double d) {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 address const_addr = __ double_constant(d);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (const_addr == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bailout("const section overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
158 return __ code()->consts()->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
159 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 return const_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 }
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 void LIR_Assembler::set_24bit_FPU() {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 void LIR_Assembler::reset_FPU() {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 void LIR_Assembler::fpop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 __ fpop();
a61af66fc99e Initial load
duke
parents:
diff changeset
175 }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void LIR_Assembler::fxch(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 __ fxch(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void LIR_Assembler::fld(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 __ fld_s(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void LIR_Assembler::ffree(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 __ ffree(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void LIR_Assembler::breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 __ int3();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void LIR_Assembler::push(LIR_Opr opr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (opr->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 __ push_reg(opr->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
196 } else if (opr->is_double_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
197 NOT_LP64(__ push_reg(opr->as_register_hi()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
198 __ push_reg(opr->as_register_lo());
a61af66fc99e Initial load
duke
parents:
diff changeset
199 } else if (opr->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 __ push_addr(frame_map()->address_for_slot(opr->single_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
201 } else if (opr->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 LIR_Const* const_opr = opr->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (const_opr->type() == T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 __ push_oop(const_opr->as_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
205 } else if (const_opr->type() == T_INT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 __ push_jint(const_opr->as_jint());
a61af66fc99e Initial load
duke
parents:
diff changeset
207 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void LIR_Assembler::pop(LIR_Opr opr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (opr->is_single_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
218 __ pop_reg(opr->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
219 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
224 bool LIR_Assembler::is_literal_address(LIR_Address* addr) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
225 return addr->base()->is_illegal() && addr->index()->is_illegal();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
226 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
227
0
a61af66fc99e Initial load
duke
parents:
diff changeset
228 //-------------------------------------------
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
229
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Address LIR_Assembler::as_Address(LIR_Address* addr) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
231 return as_Address(addr, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
232 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
233
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
234 Address LIR_Assembler::as_Address(LIR_Address* addr, Register tmp) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (addr->base()->is_illegal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 assert(addr->index()->is_illegal(), "must be illegal too");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
237 AddressLiteral laddr((address)addr->disp(), relocInfo::none);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
238 if (! __ reachable(laddr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
239 __ movptr(tmp, laddr.addr());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
240 Address res(tmp, 0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
241 return res;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
242 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
243 return __ as_Address(laddr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
244 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
247 Register base = addr->base()->as_pointer_register();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if (addr->index()->is_illegal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 return Address( base, addr->disp());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
251 } else if (addr->index()->is_cpu_register()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
252 Register index = addr->index()->as_pointer_register();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 return Address(base, index, (Address::ScaleFactor) addr->scale(), addr->disp());
a61af66fc99e Initial load
duke
parents:
diff changeset
254 } else if (addr->index()->is_constant()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
255 intptr_t addr_offset = (addr->index()->as_constant_ptr()->as_jint() << addr->scale()) + addr->disp();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
256 assert(Assembler::is_simm32(addr_offset), "must be");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return Address(base, addr_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
259 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 return Address();
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 Address base = as_Address(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return Address(base._base, base._index, base._scale, base._disp + BytesPerWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 return as_Address(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 void LIR_Assembler::osr_entry() {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 offsets()->set_value(CodeOffsets::OSR_Entry, code_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
279 BlockBegin* osr_entry = compilation()->hir()->osr_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 ValueStack* entry_state = osr_entry->state();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 int number_of_locks = entry_state->locks_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // we jump here if osr happens with the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // state set up to continue at the beginning of the
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // loop that triggered osr - in particular, we have
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // the following registers setup:
a61af66fc99e Initial load
duke
parents:
diff changeset
287 //
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // rcx: osr buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
289 //
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 // build frame
a61af66fc99e Initial load
duke
parents:
diff changeset
292 ciMethod* m = compilation()->method();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 __ build_frame(initial_frame_size_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // OSR buffer is
a61af66fc99e Initial load
duke
parents:
diff changeset
296 //
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // locals[nlocals-1..0]
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // monitors[0..number_of_locks]
a61af66fc99e Initial load
duke
parents:
diff changeset
299 //
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // locals is a direct copy of the interpreter frame so in the osr buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // so first slot in the local array is the last local from the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // and last slot is local[0] (receiver) from the interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
303 //
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Similarly with locks. The first lock slot in the osr buffer is the nth lock
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // from the interpreter frame, the nth lock slot in the osr buffer is 0th lock
a61af66fc99e Initial load
duke
parents:
diff changeset
306 // in the interpreter frame (the method lock if a sync method)
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Initialize monitors in the compiled activation.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // rcx: pointer to osr buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
310 //
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // All other registers are dead at this point and the locals will be
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // copied into place by code emitted in the IR.
a61af66fc99e Initial load
duke
parents:
diff changeset
313
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
314 Register OSR_buf = osrBufferPointer()->as_pointer_register();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 int monitor_offset = BytesPerWord * method()->max_locals() +
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
317 (2 * BytesPerWord) * (number_of_locks - 1);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
318 // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
319 // the OSR buffer using 2 word entries: first the lock and then
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
320 // the oop.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 for (int i = 0; i < number_of_locks; i++) {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
322 int slot_offset = monitor_offset - ((i * 2) * BytesPerWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // verify the interpreter's monitor has a non-null object
a61af66fc99e Initial load
duke
parents:
diff changeset
325 {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 Label L;
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
327 __ cmpptr(Address(OSR_buf, slot_offset + 1*BytesPerWord), (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 __ jcc(Assembler::notZero, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 __ stop("locked object is NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
330 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 #endif
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
333 __ movptr(rbx, Address(OSR_buf, slot_offset + 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
334 __ movptr(frame_map()->address_for_monitor_lock(i), rbx);
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
335 __ movptr(rbx, Address(OSR_buf, slot_offset + 1*BytesPerWord));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
336 __ movptr(frame_map()->address_for_monitor_object(i), rbx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // inline cache check; done before the frame is built.
a61af66fc99e Initial load
duke
parents:
diff changeset
343 int LIR_Assembler::check_icache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
344 Register receiver = FrameMap::receiver_opr->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
345 Register ic_klass = IC_Klass;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
346 const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
347 const bool do_post_padding = VerifyOops || UseCompressedOops;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
348 if (!do_post_padding) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // insert some nops so that the verified entry point is aligned on CodeEntryAlignment
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
350 while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
354 int offset = __ offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 __ inline_cache_check(receiver, IC_Klass);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
356 assert(__ offset() % CodeEntryAlignment == 0 || do_post_padding, "alignment must be correct");
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
357 if (do_post_padding) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // force alignment after the cache check.
a61af66fc99e Initial load
duke
parents:
diff changeset
359 // It's been verified to be aligned if !VerifyOops
a61af66fc99e Initial load
duke
parents:
diff changeset
360 __ align(CodeEntryAlignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 jobject o = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
369 __ movoop(reg, o);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 patching_epilog(patch, lir_patch_normal, reg, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void LIR_Assembler::monitorexit(LIR_Opr obj_opr, LIR_Opr lock_opr, Register new_hdr, int monitor_no, Register exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (exception->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // preserve exception
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // note: the monitor_exit runtime call is a leaf routine
a61af66fc99e Initial load
duke
parents:
diff changeset
378 // and cannot block => no GC can happen
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // The slow case (MonitorAccessStub) uses the first two stack slots
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // ([esp+0] and [esp+4]), therefore we store the exception at [esp+8]
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
381 __ movptr (Address(rsp, 2*wordSize), exception);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 Register obj_reg = obj_opr->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
385 Register lock_reg = lock_opr->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
386
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // setup registers (lock_reg must be rax, for lock_object)
a61af66fc99e Initial load
duke
parents:
diff changeset
388 assert(obj_reg != SYNC_header && lock_reg != SYNC_header, "rax, must be available here");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 Register hdr = lock_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 assert(new_hdr == SYNC_header, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
391 lock_reg = new_hdr;
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // compute pointer to BasicLock
a61af66fc99e Initial load
duke
parents:
diff changeset
393 Address lock_addr = frame_map()->address_for_monitor_lock(monitor_no);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
394 __ lea(lock_reg, lock_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // unlock object
a61af66fc99e Initial load
duke
parents:
diff changeset
396 MonitorAccessStub* slow_case = new MonitorExitStub(lock_opr, true, monitor_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // _slow_case_stubs->append(slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // temporary fix: must be created after exceptionhandler, therefore as call stub
a61af66fc99e Initial load
duke
parents:
diff changeset
399 _slow_case_stubs->append(slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
400 if (UseFastLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // try inlined fast unlocking first, revert to slow locking if it fails
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // note: lock_reg points to the displaced header since the displaced header offset is 0!
a61af66fc99e Initial load
duke
parents:
diff changeset
403 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
a61af66fc99e Initial load
duke
parents:
diff changeset
404 __ unlock_object(hdr, obj_reg, lock_reg, *slow_case->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
405 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // always do slow unlocking
a61af66fc99e Initial load
duke
parents:
diff changeset
407 // note: the slow unlocking code could be inlined here, however if we use
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // slow unlocking, speed doesn't matter anyway and this solution is
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // simpler and requires less duplicated code - additionally, the
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // slow unlocking code is the same in either case which simplifies
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
412 __ jmp(*slow_case->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // done
a61af66fc99e Initial load
duke
parents:
diff changeset
415 __ bind(*slow_case->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 if (exception->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // restore exception
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
419 __ movptr (exception, Address(rsp, 2 * wordSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // This specifies the rsp decrement needed to build the frame
a61af66fc99e Initial load
duke
parents:
diff changeset
424 int LIR_Assembler::initial_frame_size_in_bytes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // if rounding, must let FrameMap know!
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
426
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
427 // The frame_map records size in slots (32bit word)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
428
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
429 // subtract two words to account for return address and link
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
430 return (frame_map()->framesize() - (2*VMRegImpl::slots_per_word)) * VMRegImpl::stack_slot_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
434 int LIR_Assembler::emit_exception_handler() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
435 // if the last instruction is a call (typically to do a throw which
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // is coming at the end after block reordering) the return address
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // must still point into the code area in order to avoid assertion
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // failures when searching for the corresponding bci => add a nop
a61af66fc99e Initial load
duke
parents:
diff changeset
439 // (was bug 5/14/1999 - gri)
a61af66fc99e Initial load
duke
parents:
diff changeset
440 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // generate code for exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
443 address handler_base = __ start_a_stub(exception_handler_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 if (handler_base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // not enough space left for the handler
a61af66fc99e Initial load
duke
parents:
diff changeset
446 bailout("exception handler overflow");
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
447 return -1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
448 }
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
449
0
a61af66fc99e Initial load
duke
parents:
diff changeset
450 int offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
451
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
452 // the exception oop and pc are in rax, and rdx
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // no other registers need to be preserved, so invalidate them
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
454 __ invalidate_registers(false, true, true, false, true, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // check that there is really an exception
a61af66fc99e Initial load
duke
parents:
diff changeset
457 __ verify_not_null_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
458
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
459 // search an exception handler (rax: exception oop, rdx: throwing pc)
2321
1b4e6a5d98e0 7012914: JSR 292 MethodHandlesTest C1: frame::verify_return_pc(return_address) failed: must be a return pc
twisti
parents: 2112
diff changeset
460 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::handle_exception_from_callee_id)));
1b4e6a5d98e0 7012914: JSR 292 MethodHandlesTest C1: frame::verify_return_pc(return_address) failed: must be a return pc
twisti
parents: 2112
diff changeset
461 __ should_not_reach_here();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
462 assert(code_offset() - offset <= exception_handler_size, "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
463 __ end_a_stub();
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
464
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
465 return offset;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
468
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
469 // Emit the code to remove the frame from the stack in the exception
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
470 // unwind path.
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
471 int LIR_Assembler::emit_unwind_handler() {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
472 #ifndef PRODUCT
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
473 if (CommentedAssembly) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
474 _masm->block_comment("Unwind handler");
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
475 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
476 #endif
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
477
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
478 int offset = code_offset();
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
479
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
480 // Fetch the exception from TLS and clear out exception related thread state
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
481 __ get_thread(rsi);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
482 __ movptr(rax, Address(rsi, JavaThread::exception_oop_offset()));
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
483 __ movptr(Address(rsi, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
484 __ movptr(Address(rsi, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
485
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
486 __ bind(_unwind_handler_entry);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
487 __ verify_not_null_oop(rax);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
488 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
489 __ mov(rsi, rax); // Preserve the exception
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
490 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
491
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
492 // Preform needed unlocking
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
493 MonitorExitStub* stub = NULL;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
494 if (method()->is_synchronized()) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
495 monitor_address(0, FrameMap::rax_opr);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
496 stub = new MonitorExitStub(FrameMap::rax_opr, true, 0);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
497 __ unlock_object(rdi, rbx, rax, *stub->entry());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
498 __ bind(*stub->continuation());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
499 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
500
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
501 if (compilation()->env()->dtrace_method_probes()) {
1830
a3f7f95b0165 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 1791
diff changeset
502 __ get_thread(rax);
a3f7f95b0165 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 1791
diff changeset
503 __ movptr(Address(rsp, 0), rax);
a3f7f95b0165 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 1791
diff changeset
504 __ movoop(Address(rsp, sizeof(void*)), method()->constant_encoding());
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
505 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit)));
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
506 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
507
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
508 if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
509 __ mov(rax, rsi); // Restore the exception
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
510 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
511
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
512 // remove the activation and dispatch to the unwind handler
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
513 __ remove_frame(initial_frame_size_in_bytes());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
514 __ jump(RuntimeAddress(Runtime1::entry_for(Runtime1::unwind_exception_id)));
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
515
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
516 // Emit the slow path assembly
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
517 if (stub != NULL) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
518 stub->emit_code(this);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
519 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
520
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
521 return offset;
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
522 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
523
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
524
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
525 int LIR_Assembler::emit_deopt_handler() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // if the last instruction is a call (typically to do a throw which
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // is coming at the end after block reordering) the return address
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // must still point into the code area in order to avoid assertion
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // failures when searching for the corresponding bci => add a nop
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // (was bug 5/14/1999 - gri)
a61af66fc99e Initial load
duke
parents:
diff changeset
531 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // generate code for exception handler
a61af66fc99e Initial load
duke
parents:
diff changeset
534 address handler_base = __ start_a_stub(deopt_handler_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (handler_base == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // not enough space left for the handler
a61af66fc99e Initial load
duke
parents:
diff changeset
537 bailout("deopt handler overflow");
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
538 return -1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539 }
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
540
0
a61af66fc99e Initial load
duke
parents:
diff changeset
541 int offset = code_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
542 InternalAddress here(__ pc());
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
543
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 __ pushptr(here.addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
545 __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
546
0
a61af66fc99e Initial load
duke
parents:
diff changeset
547 assert(code_offset() - offset <= deopt_handler_size, "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
548 __ end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
549
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
550 return offset;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 // This is the fast version of java.lang.String.compare; it has not
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // OSR-entry and therefore, we generate a slow version for OSR's
a61af66fc99e Initial load
duke
parents:
diff changeset
556 void LIR_Assembler::emit_string_compare(LIR_Opr arg0, LIR_Opr arg1, LIR_Opr dst, CodeEmitInfo* info) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
557 __ movptr (rbx, rcx); // receiver is in rcx
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
558 __ movptr (rax, arg1->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Get addresses of first characters from both Strings
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
561 __ load_heap_oop(rsi, Address(rax, java_lang_String::value_offset_in_bytes()));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
562 __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes()));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
563 __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
564
a61af66fc99e Initial load
duke
parents:
diff changeset
565
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // rbx, may be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
567 add_debug_info_for_null_check_here(info);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
568 __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes()));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
569 __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes()));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
570 __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // compute minimum length (in rax) and difference of lengths (on top of stack)
2415
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
573 __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes()));
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
574 __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes()));
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
575 __ mov (rcx, rbx);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
576 __ subptr(rbx, rax); // subtract lengths
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
577 __ push (rbx); // result
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
578 __ cmov (Assembler::lessEqual, rax, rcx);
09f96c3ff1ad 7032388: guarantee(VM_Version::supports_cmov()) failed: illegal instruction on i586 after 6919934
twisti
parents: 2404
diff changeset
579
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // is minimum length 0?
a61af66fc99e Initial load
duke
parents:
diff changeset
581 Label noLoop, haveResult;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
582 __ testptr (rax, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
583 __ jcc (Assembler::zero, noLoop);
a61af66fc99e Initial load
duke
parents:
diff changeset
584
a61af66fc99e Initial load
duke
parents:
diff changeset
585 // compare first characters
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 512
diff changeset
586 __ load_unsigned_short(rcx, Address(rdi, 0));
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 512
diff changeset
587 __ load_unsigned_short(rbx, Address(rsi, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
588 __ subl(rcx, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 __ jcc(Assembler::notZero, haveResult);
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // starting loop
a61af66fc99e Initial load
duke
parents:
diff changeset
591 __ decrement(rax); // we already tested index: skip one
a61af66fc99e Initial load
duke
parents:
diff changeset
592 __ jcc(Assembler::zero, noLoop);
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 // set rsi.edi to the end of the arrays (arrays have same length)
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // negate the index
a61af66fc99e Initial load
duke
parents:
diff changeset
596
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
597 __ lea(rsi, Address(rsi, rax, Address::times_2, type2aelembytes(T_CHAR)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
598 __ lea(rdi, Address(rdi, rax, Address::times_2, type2aelembytes(T_CHAR)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
599 __ negptr(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // compare the strings in a loop
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 Label loop;
a61af66fc99e Initial load
duke
parents:
diff changeset
604 __ align(wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 __ bind(loop);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 512
diff changeset
606 __ load_unsigned_short(rcx, Address(rdi, rax, Address::times_2, 0));
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 512
diff changeset
607 __ load_unsigned_short(rbx, Address(rsi, rax, Address::times_2, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 __ subl(rcx, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 __ jcc(Assembler::notZero, haveResult);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 __ increment(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
611 __ jcc(Assembler::notZero, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // strings are equal up to min length
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 __ bind(noLoop);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
616 __ pop(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
617 return_op(LIR_OprFact::illegalOpr);
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 __ bind(haveResult);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // leave instruction is going to discard the TOS value
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
621 __ mov (rax, rcx); // result of call is in rax,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 void LIR_Assembler::return_op(LIR_Opr result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 assert(result->is_illegal() || !result->is_single_cpu() || result->as_register() == rax, "word returns are in rax,");
a61af66fc99e Initial load
duke
parents:
diff changeset
627 if (!result->is_illegal() && result->is_float_kind() && !result->is_xmm_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 assert(result->fpu() == 0, "result must already be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // Pop the stack before the safepoint code
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
632 __ remove_frame(initial_frame_size_in_bytes());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 bool result_is_oop = result->is_valid() ? result->is_oop() : false;
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // Note: we do not need to round double result; float result has the right precision
a61af66fc99e Initial load
duke
parents:
diff changeset
637 // the poll sets the condition code, but no data registers
a61af66fc99e Initial load
duke
parents:
diff changeset
638 AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()),
a61af66fc99e Initial load
duke
parents:
diff changeset
639 relocInfo::poll_return_type);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
640
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
641 if (Assembler::is_polling_page_far()) {
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
642 __ lea(rscratch1, polling_page);
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
643 __ relocate(relocInfo::poll_return_type);
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
644 __ testl(rax, Address(rscratch1, 0));
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
645 } else {
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
646 __ testl(rax, polling_page);
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
647 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
648 __ ret(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()),
a61af66fc99e Initial load
duke
parents:
diff changeset
654 relocInfo::poll_type);
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
655 guarantee(info != NULL, "Shouldn't be NULL");
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
656 int offset = __ offset();
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
657 if (Assembler::is_polling_page_far()) {
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
658 __ lea(rscratch1, polling_page);
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
659 offset = __ offset();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660 add_debug_info_for_branch(info);
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
661 __ testl(rax, Address(rscratch1, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
662 } else {
2404
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
663 add_debug_info_for_branch(info);
b40d4fa697bf 6964776: c2 should ensure the polling page is reachable on 64 bit
iveresov
parents: 2321
diff changeset
664 __ testl(rax, polling_page);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 void LIR_Assembler::move_regs(Register from_reg, Register to_reg) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
671 if (from_reg != to_reg) __ mov(to_reg, from_reg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 void LIR_Assembler::swap_reg(Register a, Register b) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
675 __ xchgptr(a, b);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 void LIR_Assembler::const2reg(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
680 assert(src->is_constant(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
681 assert(dest->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
682 LIR_Const* c = src->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 switch (c->type()) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
685 case T_INT: {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
686 assert(patch_code == lir_patch_none, "no patching handled here");
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
687 __ movl(dest->as_register(), c->as_jint());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
688 break;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
689 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
690
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
691 case T_ADDRESS: {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 assert(patch_code == lir_patch_none, "no patching handled here");
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
693 __ movptr(dest->as_register(), c->as_jint());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 case T_LONG: {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 assert(patch_code == lir_patch_none, "no patching handled here");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
699 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
700 __ movptr(dest->as_register_lo(), (intptr_t)c->as_jlong());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
701 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
702 __ movptr(dest->as_register_lo(), c->as_jint_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
703 __ movptr(dest->as_register_hi(), c->as_jint_hi());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
704 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
705 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 case T_OBJECT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 if (patch_code != lir_patch_none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
710 jobject2reg_with_patching(dest->as_register(), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
711 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 __ movoop(dest->as_register(), c->as_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
713 }
a61af66fc99e Initial load
duke
parents:
diff changeset
714 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 case T_FLOAT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
719 if (c->is_zero_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 __ xorps(dest->as_xmm_float_reg(), dest->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
721 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 __ movflt(dest->as_xmm_float_reg(),
a61af66fc99e Initial load
duke
parents:
diff changeset
723 InternalAddress(float_constant(c->as_jfloat())));
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 assert(dest->is_single_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
727 assert(dest->fpu_regnr() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
728 if (c->is_zero_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 __ fldz();
a61af66fc99e Initial load
duke
parents:
diff changeset
730 } else if (c->is_one_float()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 __ fld1();
a61af66fc99e Initial load
duke
parents:
diff changeset
732 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 __ fld_s (InternalAddress(float_constant(c->as_jfloat())));
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
736 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 case T_DOUBLE: {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (c->is_zero_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
742 __ xorpd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
743 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 __ movdbl(dest->as_xmm_double_reg(),
a61af66fc99e Initial load
duke
parents:
diff changeset
745 InternalAddress(double_constant(c->as_jdouble())));
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
748 assert(dest->is_double_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
749 assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
750 if (c->is_zero_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
751 __ fldz();
a61af66fc99e Initial load
duke
parents:
diff changeset
752 } else if (c->is_one_double()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 __ fld1();
a61af66fc99e Initial load
duke
parents:
diff changeset
754 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 __ fld_d (InternalAddress(double_constant(c->as_jdouble())));
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757 }
a61af66fc99e Initial load
duke
parents:
diff changeset
758 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
762 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
767 assert(src->is_constant(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
768 assert(dest->is_stack(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
769 LIR_Const* c = src->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771 switch (c->type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
772 case T_INT: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
773 case T_FLOAT:
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
774 __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
775 break;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
776
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
777 case T_ADDRESS:
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
778 __ movptr(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 case T_OBJECT:
a61af66fc99e Initial load
duke
parents:
diff changeset
782 __ movoop(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
783 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 case T_LONG: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
786 case T_DOUBLE:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
787 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
788 __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
789 lo_word_offset_in_bytes), (intptr_t)c->as_jlong_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
790 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
791 __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
792 lo_word_offset_in_bytes), c->as_jint_lo_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
793 __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
794 hi_word_offset_in_bytes), c->as_jint_hi_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
795 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
799 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801 }
a61af66fc99e Initial load
duke
parents:
diff changeset
802
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
803 void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info, bool wide) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 assert(src->is_constant(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
805 assert(dest->is_address(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
806 LIR_Const* c = src->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
807 LIR_Address* addr = dest->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
808
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
809 int null_check_here = code_offset();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
810 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 case T_INT: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
812 case T_FLOAT:
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
813 __ movl(as_Address(addr), c->as_jint_bits());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
814 break;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
815
1297
c466efa608d5 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 1295
diff changeset
816 case T_ADDRESS:
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
817 __ movptr(as_Address(addr), c->as_jint_bits());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
818 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 case T_OBJECT: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
821 case T_ARRAY:
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (c->as_jobject() == NULL) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
823 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
824 __ movl(as_Address(addr), (int32_t)NULL_WORD);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
825 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
826 __ movptr(as_Address(addr), NULL_WORD);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
827 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
829 if (is_literal_address(addr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
830 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
831 __ movoop(as_Address(addr, noreg), c->as_jobject());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
832 } else {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
833 #ifdef _LP64
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
834 __ movoop(rscratch1, c->as_jobject());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
835 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
836 __ encode_heap_oop(rscratch1);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
837 null_check_here = code_offset();
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
838 __ movl(as_Address_lo(addr), rscratch1);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
839 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
840 null_check_here = code_offset();
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
841 __ movptr(as_Address_lo(addr), rscratch1);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
842 }
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
843 #else
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
844 __ movoop(as_Address(addr), c->as_jobject());
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
845 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
846 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 case T_LONG: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
851 case T_DOUBLE:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
852 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
853 if (is_literal_address(addr)) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
854 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
855 __ movptr(as_Address(addr, r15_thread), (intptr_t)c->as_jlong_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
856 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
857 __ movptr(r10, (intptr_t)c->as_jlong_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
858 null_check_here = code_offset();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
859 __ movptr(as_Address_lo(addr), r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
860 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
861 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
862 // Always reachable in 32bit so this doesn't produce useless move literal
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
863 __ movptr(as_Address_hi(addr), c->as_jint_hi_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
864 __ movptr(as_Address_lo(addr), c->as_jint_lo_bits());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
865 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
866 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
867
a61af66fc99e Initial load
duke
parents:
diff changeset
868 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
869 case T_BYTE:
a61af66fc99e Initial load
duke
parents:
diff changeset
870 __ movb(as_Address(addr), c->as_jint() & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
871 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 case T_CHAR: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
874 case T_SHORT:
a61af66fc99e Initial load
duke
parents:
diff changeset
875 __ movw(as_Address(addr), c->as_jint() & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
879 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
880 };
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
881
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
882 if (info != NULL) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
883 add_debug_info_for_null_check(null_check_here, info);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
884 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 void LIR_Assembler::reg2reg(LIR_Opr src, LIR_Opr dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
889 assert(src->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
890 assert(dest->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 // move between cpu-registers
a61af66fc99e Initial load
duke
parents:
diff changeset
893 if (dest->is_single_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
894 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
895 if (src->type() == T_LONG) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
896 // Can do LONG -> OBJECT
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
897 move_regs(src->as_register_lo(), dest->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
898 return;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
899 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
900 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901 assert(src->is_single_cpu(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
902 if (src->type() == T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
903 __ verify_oop(src->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905 move_regs(src->as_register(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 } else if (dest->is_double_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
908 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
909 if (src->type() == T_OBJECT || src->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
910 // Surprising to me but we can see move of a long to t_object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
911 __ verify_oop(src->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
912 move_regs(src->as_register(), dest->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
913 return;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
914 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
915 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
916 assert(src->is_double_cpu(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
917 Register f_lo = src->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
918 Register f_hi = src->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
919 Register t_lo = dest->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
920 Register t_hi = dest->as_register_hi();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
921 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
922 assert(f_hi == f_lo, "must be same");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
923 assert(t_hi == t_lo, "must be same");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
924 move_regs(f_lo, t_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
925 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
926 assert(f_lo != f_hi && t_lo != t_hi, "invalid register allocation");
a61af66fc99e Initial load
duke
parents:
diff changeset
927
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
928
0
a61af66fc99e Initial load
duke
parents:
diff changeset
929 if (f_lo == t_hi && f_hi == t_lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 swap_reg(f_lo, f_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 } else if (f_hi == t_lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 assert(f_lo != t_hi, "overwriting register");
a61af66fc99e Initial load
duke
parents:
diff changeset
933 move_regs(f_hi, t_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
934 move_regs(f_lo, t_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
936 assert(f_hi != t_lo, "overwriting register");
a61af66fc99e Initial load
duke
parents:
diff changeset
937 move_regs(f_lo, t_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
938 move_regs(f_hi, t_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
940 #endif // LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
941
a61af66fc99e Initial load
duke
parents:
diff changeset
942 // special moves from fpu-register to xmm-register
a61af66fc99e Initial load
duke
parents:
diff changeset
943 // necessary for method results
a61af66fc99e Initial load
duke
parents:
diff changeset
944 } else if (src->is_single_xmm() && !dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 __ movflt(Address(rsp, 0), src->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
946 __ fld_s(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
947 } else if (src->is_double_xmm() && !dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 __ movdbl(Address(rsp, 0), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
949 __ fld_d(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
950 } else if (dest->is_single_xmm() && !src->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
951 __ fstp_s(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
952 __ movflt(dest->as_xmm_float_reg(), Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
953 } else if (dest->is_double_xmm() && !src->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
954 __ fstp_d(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
955 __ movdbl(dest->as_xmm_double_reg(), Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // move between xmm-registers
a61af66fc99e Initial load
duke
parents:
diff changeset
958 } else if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 assert(src->is_single_xmm(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
960 __ movflt(dest->as_xmm_float_reg(), src->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
961 } else if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 assert(src->is_double_xmm(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
963 __ movdbl(dest->as_xmm_double_reg(), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
964
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // move between fpu-registers (no instruction necessary because of fpu-stack)
a61af66fc99e Initial load
duke
parents:
diff changeset
966 } else if (dest->is_single_fpu() || dest->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
967 assert(src->is_single_fpu() || src->is_double_fpu(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
968 assert(src->fpu() == dest->fpu(), "currently should be nothing to do");
a61af66fc99e Initial load
duke
parents:
diff changeset
969 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
970 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
971 }
a61af66fc99e Initial load
duke
parents:
diff changeset
972 }
a61af66fc99e Initial load
duke
parents:
diff changeset
973
a61af66fc99e Initial load
duke
parents:
diff changeset
974 void LIR_Assembler::reg2stack(LIR_Opr src, LIR_Opr dest, BasicType type, bool pop_fpu_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 assert(src->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
976 assert(dest->is_stack(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
977
a61af66fc99e Initial load
duke
parents:
diff changeset
978 if (src->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
979 Address dst = frame_map()->address_for_slot(dest->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
980 if (type == T_OBJECT || type == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
981 __ verify_oop(src->as_register());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
982 __ movptr (dst, src->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
983 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
984 __ movl (dst, src->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
985 }
a61af66fc99e Initial load
duke
parents:
diff changeset
986
a61af66fc99e Initial load
duke
parents:
diff changeset
987 } else if (src->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
988 Address dstLO = frame_map()->address_for_slot(dest->double_stack_ix(), lo_word_offset_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
989 Address dstHI = frame_map()->address_for_slot(dest->double_stack_ix(), hi_word_offset_in_bytes);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
990 __ movptr (dstLO, src->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
991 NOT_LP64(__ movptr (dstHI, src->as_register_hi()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993 } else if (src->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
994 Address dst_addr = frame_map()->address_for_slot(dest->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
995 __ movflt(dst_addr, src->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
996
a61af66fc99e Initial load
duke
parents:
diff changeset
997 } else if (src->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
998 Address dst_addr = frame_map()->address_for_slot(dest->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
999 __ movdbl(dst_addr, src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
1000
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 } else if (src->is_single_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 assert(src->fpu_regnr() == 0, "argument must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 Address dst_addr = frame_map()->address_for_slot(dest->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 if (pop_fpu_stack) __ fstp_s (dst_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 else __ fst_s (dst_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 } else if (src->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 assert(src->fpu_regnrLo() == 0, "argument must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 Address dst_addr = frame_map()->address_for_slot(dest->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 if (pop_fpu_stack) __ fstp_d (dst_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 else __ fst_d (dst_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1012
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1019 void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool /* unaligned */) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 LIR_Address* to_addr = dest->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 PatchingStub* patch = NULL;
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1022 Register compressed_src = rscratch1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 if (type == T_ARRAY || type == T_OBJECT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 __ verify_oop(src->as_register());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1026 #ifdef _LP64
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1027 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1028 __ movptr(compressed_src, src->as_register());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1029 __ encode_heap_oop(compressed_src);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1030 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1031 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1033
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 if (patch_code != lir_patch_none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1036 Address toa = as_Address(to_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1037 assert(toa.disp() != 0, "must have");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1039
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1040 int null_check_here = code_offset();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 case T_FLOAT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 if (src->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 __ movflt(as_Address(to_addr), src->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 assert(src->is_single_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 assert(src->fpu_regnr() == 0, "argument must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 if (pop_fpu_stack) __ fstp_s(as_Address(to_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 else __ fst_s (as_Address(to_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 case T_DOUBLE: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 if (src->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 __ movdbl(as_Address(to_addr), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 assert(src->is_double_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 assert(src->fpu_regnrLo() == 0, "argument must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 if (pop_fpu_stack) __ fstp_d(as_Address(to_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 else __ fst_d (as_Address(to_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1065
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 case T_ARRAY: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 case T_OBJECT: // fall through
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1068 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1069 __ movl(as_Address(to_addr), compressed_src);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1070 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1071 __ movptr(as_Address(to_addr), src->as_register());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1072 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1073 break;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1074 case T_ADDRESS:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1075 __ movptr(as_Address(to_addr), src->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1076 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 case T_INT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 __ movl(as_Address(to_addr), src->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1080
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 case T_LONG: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 Register from_lo = src->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 Register from_hi = src->as_register_hi();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1084 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1085 __ movptr(as_Address_lo(to_addr), from_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1086 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 Register base = to_addr->base()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 Register index = noreg;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 if (to_addr->index()->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 index = to_addr->index()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 if (base == from_lo || index == from_lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 assert(base != from_hi, "can't be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 assert(index == noreg || (index != base && index != from_hi), "can't handle this");
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 __ movl(as_Address_hi(to_addr), from_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 if (patch != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 patching_epilog(patch, lir_patch_high, base, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 patch_code = lir_patch_low;
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 __ movl(as_Address_lo(to_addr), from_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 assert(index == noreg || (index != base && index != from_lo), "can't handle this");
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 __ movl(as_Address_lo(to_addr), from_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 if (patch != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 patching_epilog(patch, lir_patch_low, base, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 patch_code = lir_patch_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 __ movl(as_Address_hi(to_addr), from_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1112 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1115
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 case T_BYTE: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 case T_BOOLEAN: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 Register src_reg = src->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 Address dst_addr = as_Address(to_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 assert(VM_Version::is_P6() || src_reg->has_byte_register(), "must use byte registers if not P6");
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 __ movb(dst_addr, src_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1124
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 case T_CHAR: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 case T_SHORT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 __ movw(as_Address(to_addr), src->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1129
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1133 if (info != NULL) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1134 add_debug_info_for_null_check(null_check_here, info);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1135 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1136
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 if (patch_code != lir_patch_none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 patching_epilog(patch, patch_code, to_addr->base()->as_register(), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 void LIR_Assembler::stack2reg(LIR_Opr src, LIR_Opr dest, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 assert(src->is_stack(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 assert(dest->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1146
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 if (dest->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 if (type == T_ARRAY || type == T_OBJECT) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1149 __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 __ verify_oop(dest->as_register());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1151 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1152 __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1154
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 } else if (dest->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 Address src_addr_LO = frame_map()->address_for_slot(src->double_stack_ix(), lo_word_offset_in_bytes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 Address src_addr_HI = frame_map()->address_for_slot(src->double_stack_ix(), hi_word_offset_in_bytes);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1158 __ movptr(dest->as_register_lo(), src_addr_LO);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1159 NOT_LP64(__ movptr(dest->as_register_hi(), src_addr_HI));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1160
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 } else if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 Address src_addr = frame_map()->address_for_slot(src->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 __ movflt(dest->as_xmm_float_reg(), src_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1164
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 } else if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 Address src_addr = frame_map()->address_for_slot(src->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 __ movdbl(dest->as_xmm_double_reg(), src_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1168
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 } else if (dest->is_single_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 assert(dest->fpu_regnr() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 Address src_addr = frame_map()->address_for_slot(src->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 __ fld_s(src_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 } else if (dest->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 Address src_addr = frame_map()->address_for_slot(src->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 __ fld_d(src_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1178
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 if (src->is_single_stack()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1187 if (type == T_OBJECT || type == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1188 __ pushptr(frame_map()->address_for_slot(src ->single_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1189 __ popptr (frame_map()->address_for_slot(dest->single_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1190 } else {
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1191 #ifndef _LP64
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1192 __ pushl(frame_map()->address_for_slot(src ->single_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1193 __ popl (frame_map()->address_for_slot(dest->single_stack_ix()));
1060
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1194 #else
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1195 //no pushl on 64bits
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1196 __ movl(rscratch1, frame_map()->address_for_slot(src ->single_stack_ix()));
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1197 __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), rscratch1);
323bd24c6520 6769124: various 64-bit fixes for c1
roland
parents: 989
diff changeset
1198 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1199 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1200
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 } else if (src->is_double_stack()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1202 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1203 __ pushptr(frame_map()->address_for_slot(src ->double_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1204 __ popptr (frame_map()->address_for_slot(dest->double_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1205 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1207 // push and pop the part at src + wordSize, adding wordSize for the previous push
321
6e7305abe64c 6746320: Hotspot regression test for 6512111 fails in -Xmixed mode
never
parents: 304
diff changeset
1208 __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 2 * wordSize));
6e7305abe64c 6746320: Hotspot regression test for 6512111 fails in -Xmixed mode
never
parents: 304
diff changeset
1209 __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 2 * wordSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 0));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1211 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1217
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1219 void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool /* unaligned */) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 assert(src->is_address(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 assert(dest->is_register(), "should not call otherwise");
a61af66fc99e Initial load
duke
parents:
diff changeset
1222
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 LIR_Address* addr = src->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 Address from_addr = as_Address(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1225
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 case T_BYTE: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 case T_CHAR: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 case T_SHORT:
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 if (!VM_Version::is_P6() && !from_addr.uses(dest->as_register())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // on pre P6 processors we may get partial register stalls
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // so blow away the value of to_rinfo before loading a
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // partial word into it. Do it here so that it precedes
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // the potential patch point below.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1236 __ xorptr(dest->as_register(), dest->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1240
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 PatchingStub* patch = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 if (patch_code != lir_patch_none) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1244 assert(from_addr.disp() != 0, "must have");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 if (info != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 add_debug_info_for_null_check_here(info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 case T_FLOAT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 __ movflt(dest->as_xmm_float_reg(), from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 assert(dest->is_single_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 assert(dest->fpu_regnr() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 __ fld_s(from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 case T_DOUBLE: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 __ movdbl(dest->as_xmm_double_reg(), from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 assert(dest->is_double_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 __ fld_d(from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1272
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 case T_OBJECT: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 case T_ARRAY: // fall through
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1275 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1276 __ movl(dest->as_register(), from_addr);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1277 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1278 __ movptr(dest->as_register(), from_addr);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1279 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1280 break;
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1281
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1282 case T_ADDRESS:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1283 __ movptr(dest->as_register(), from_addr);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1284 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 case T_INT:
1398
314e17ca2c23 6946892: c1 shouldn't sign-extend to upper 32bits on x64
iveresov
parents: 1378
diff changeset
1286 __ movl(dest->as_register(), from_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 case T_LONG: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 Register to_lo = dest->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 Register to_hi = dest->as_register_hi();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1292 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1293 __ movptr(to_lo, as_Address_lo(addr));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1294 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 Register base = addr->base()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 Register index = noreg;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 if (addr->index()->is_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 index = addr->index()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if ((base == to_lo && index == to_hi) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 (base == to_hi && index == to_lo)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // addresses with 2 registers are only formed as a result of
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 // array access so this code will never have to deal with
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 // patches or null checks.
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 assert(info == NULL && patch == NULL, "must be");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1306 __ lea(to_hi, as_Address(addr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 __ movl(to_lo, Address(to_hi, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 __ movl(to_hi, Address(to_hi, BytesPerWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 } else if (base == to_lo || index == to_lo) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 assert(base != to_hi, "can't be");
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 assert(index == noreg || (index != base && index != to_hi), "can't handle this");
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 __ movl(to_hi, as_Address_hi(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 if (patch != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 patching_epilog(patch, lir_patch_high, base, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 patch_code = lir_patch_low;
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 __ movl(to_lo, as_Address_lo(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 assert(index == noreg || (index != base && index != to_lo), "can't handle this");
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 __ movl(to_lo, as_Address_lo(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 if (patch != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 patching_epilog(patch, lir_patch_low, base, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 patch = new PatchingStub(_masm, PatchingStub::access_field_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 patch_code = lir_patch_high;
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 __ movl(to_hi, as_Address_hi(addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1329 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1332
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 case T_BYTE: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 Register dest_reg = dest->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 assert(VM_Version::is_P6() || dest_reg->has_byte_register(), "must use byte registers if not P6");
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1338 __ movsbl(dest_reg, from_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 __ movb(dest_reg, from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 __ shll(dest_reg, 24);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 __ sarl(dest_reg, 24);
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 case T_CHAR: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 Register dest_reg = dest->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 assert(VM_Version::is_P6() || dest_reg->has_byte_register(), "must use byte registers if not P6");
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1351 __ movzwl(dest_reg, from_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 __ movw(dest_reg, from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1357
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 case T_SHORT: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 Register dest_reg = dest->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1361 __ movswl(dest_reg, from_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 __ movw(dest_reg, from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 __ shll(dest_reg, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 __ sarl(dest_reg, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1369
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1373
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 if (patch != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 patching_epilog(patch, patch_code, addr->base()->as_register(), info);
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 if (type == T_ARRAY || type == T_OBJECT) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1379 #ifdef _LP64
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1380 if (UseCompressedOops && !wide) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1381 __ decode_heap_oop(dest->as_register());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1382 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1383 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 __ verify_oop(dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1387
a61af66fc99e Initial load
duke
parents:
diff changeset
1388
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 void LIR_Assembler::prefetchr(LIR_Opr src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 LIR_Address* addr = src->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 Address from_addr = as_Address(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 if (VM_Version::supports_sse()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 switch (ReadPrefetchInstr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 __ prefetchnta(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 __ prefetcht0(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 __ prefetcht2(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 ShouldNotReachHere(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 }
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 2446
diff changeset
1404 } else if (VM_Version::supports_3dnow_prefetch()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 __ prefetchr(from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 void LIR_Assembler::prefetchw(LIR_Opr src) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 LIR_Address* addr = src->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 Address from_addr = as_Address(addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1413
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if (VM_Version::supports_sse()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 switch (AllocatePrefetchInstr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 __ prefetchnta(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 __ prefetcht0(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 __ prefetcht2(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 case 3:
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 __ prefetchw(from_addr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 ShouldNotReachHere(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 }
2479
15c9a0e16269 7035713: 3DNow Prefetch Instruction Support
kvn
parents: 2446
diff changeset
1427 } else if (VM_Version::supports_3dnow_prefetch()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 __ prefetchw(from_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1431
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 NEEDS_CLEANUP; // This could be static?
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 Address::ScaleFactor LIR_Assembler::array_element_size(BasicType type) const {
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
1435 int elem_size = type2aelembytes(type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 switch (elem_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 case 1: return Address::times_1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 case 2: return Address::times_2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 case 4: return Address::times_4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 case 8: return Address::times_8;
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 return Address::no_scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 void LIR_Assembler::emit_op3(LIR_Op3* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 switch (op->code()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 case lir_idiv:
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 case lir_irem:
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 arithmetic_idiv(op->code(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 op->in_opr1(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 op->in_opr2(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 op->in_opr3(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 op->result_opr(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 default: ShouldNotReachHere(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1461
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label");
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 if (op->block() != NULL) _branch_target_blocks.append(op->block());
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 if (op->ublock() != NULL) _branch_target_blocks.append(op->ublock());
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1468
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 if (op->cond() == lir_cond_always) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 if (op->info() != NULL) add_debug_info_for_branch(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 __ jmp (*(op->label()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 Assembler::Condition acond = Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 if (op->code() == lir_cond_float_branch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 assert(op->ublock() != NULL, "must have unordered successor");
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 __ jcc(Assembler::parity, *(op->ublock()->label()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 switch(op->cond()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 case lir_cond_equal: acond = Assembler::equal; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 case lir_cond_notEqual: acond = Assembler::notEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 case lir_cond_less: acond = Assembler::below; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 case lir_cond_lessEqual: acond = Assembler::belowEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 case lir_cond_greaterEqual: acond = Assembler::aboveEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 case lir_cond_greater: acond = Assembler::above; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 switch (op->cond()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 case lir_cond_equal: acond = Assembler::equal; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 case lir_cond_notEqual: acond = Assembler::notEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 case lir_cond_less: acond = Assembler::less; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 case lir_cond_lessEqual: acond = Assembler::lessEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 case lir_cond_greaterEqual: acond = Assembler::greaterEqual;break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 case lir_cond_greater: acond = Assembler::greater; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 case lir_cond_belowEqual: acond = Assembler::belowEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 case lir_cond_aboveEqual: acond = Assembler::aboveEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 __ jcc(acond,*(op->label()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1502
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 void LIR_Assembler::emit_opConvert(LIR_OpConvert* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 LIR_Opr src = op->in_opr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 LIR_Opr dest = op->result_opr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1506
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 switch (op->bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 case Bytecodes::_i2l:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1509 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1510 __ movl2ptr(dest->as_register_lo(), src->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1511 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 move_regs(src->as_register(), dest->as_register_lo());
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 move_regs(src->as_register(), dest->as_register_hi());
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 __ sarl(dest->as_register_hi(), 31);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1515 #endif // LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1517
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 case Bytecodes::_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 move_regs(src->as_register_lo(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1521
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 case Bytecodes::_i2b:
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 move_regs(src->as_register(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 __ sign_extend_byte(dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1526
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 case Bytecodes::_i2c:
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 move_regs(src->as_register(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 __ andl(dest->as_register(), 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1531
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 case Bytecodes::_i2s:
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 move_regs(src->as_register(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 __ sign_extend_short(dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 case Bytecodes::_f2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 case Bytecodes::_d2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 __ cvtsd2ss(dest->as_xmm_float_reg(), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 } else if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 __ cvtss2sd(dest->as_xmm_double_reg(), src->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 assert(src->fpu() == dest->fpu(), "register must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 // do nothing (float result is rounded later through spilling)
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1549
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 case Bytecodes::_i2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 case Bytecodes::_i2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 if (dest->is_single_xmm()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1553 __ cvtsi2ssl(dest->as_xmm_float_reg(), src->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 } else if (dest->is_double_xmm()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1555 __ cvtsi2sdl(dest->as_xmm_double_reg(), src->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 assert(dest->fpu() == 0, "result must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 __ movl(Address(rsp, 0), src->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 __ fild_s(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 case Bytecodes::_f2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 case Bytecodes::_d2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 if (src->is_single_xmm()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1566 __ cvttss2sil(dest->as_register(), src->as_xmm_float_reg());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 } else if (src->is_double_xmm()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1568 __ cvttsd2sil(dest->as_register(), src->as_xmm_double_reg());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 assert(src->fpu() == 0, "input must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_trunc()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 __ fist_s(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 __ movl(dest->as_register(), Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1576
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // IA32 conversion instructions do not match JLS for overflow, underflow and NaN -> fixup in stub
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 assert(op->stub() != NULL, "stub required");
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 __ cmpl(dest->as_register(), 0x80000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 __ jcc(Assembler::equal, *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 __ bind(*op->stub()->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1583
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 case Bytecodes::_l2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 case Bytecodes::_l2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 assert(!dest->is_xmm_register(), "result in xmm register not supported (no SSE instruction present)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 assert(dest->fpu() == 0, "result must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
1588
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1589 __ movptr(Address(rsp, 0), src->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1590 NOT_LP64(__ movl(Address(rsp, BytesPerWord), src->as_register_hi()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 __ fild_d(Address(rsp, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 // float result is rounded later through spilling
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 case Bytecodes::_f2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 case Bytecodes::_d2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 assert(!src->is_xmm_register(), "input in xmm register not supported (no SSE instruction present)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 assert(src->fpu() == 0, "input must be on TOS");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1599 assert(dest == FrameMap::long0_opr, "runtime stub places result in these registers");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1600
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 // instruction sequence too long to inline it here
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::fpu2long_stub_id)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1606
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 void LIR_Assembler::emit_alloc_obj(LIR_OpAllocObj* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 if (op->init_check()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 __ cmpl(Address(op->klass()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)),
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 instanceKlass::fully_initialized);
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 add_debug_info_for_null_check_here(op->stub()->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 __ jcc(Assembler::notEqual, *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 __ allocate_object(op->obj()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 op->tmp1()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 op->tmp2()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 op->header_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 op->object_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 op->klass()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 __ bind(*op->stub()->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1628
a61af66fc99e Initial load
duke
parents:
diff changeset
1629 void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
2112
55f868e91c3b 7010618: C1: array length should be treated at int on 64bit during array allocation
iveresov
parents: 2089
diff changeset
1630 Register len = op->len()->as_register();
55f868e91c3b 7010618: C1: array length should be treated at int on 64bit during array allocation
iveresov
parents: 2089
diff changeset
1631 LP64_ONLY( __ movslq(len, len); )
55f868e91c3b 7010618: C1: array length should be treated at int on 64bit during array allocation
iveresov
parents: 2089
diff changeset
1632
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1633 if (UseSlowPath ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 (!UseFastNewObjectArray && (op->type() == T_OBJECT || op->type() == T_ARRAY)) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1635 (!UseFastNewTypeArray && (op->type() != T_OBJECT && op->type() != T_ARRAY))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 __ jmp(*op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 Register tmp1 = op->tmp1()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 Register tmp2 = op->tmp2()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 Register tmp3 = op->tmp3()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 if (len == tmp1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 tmp1 = tmp3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 } else if (len == tmp2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 tmp2 = tmp3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 } else if (len == tmp3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 // everything is ok
a61af66fc99e Initial load
duke
parents:
diff changeset
1647 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1648 __ mov(tmp3, len);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 __ allocate_array(op->obj()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 len,
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 tmp1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 tmp2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 arrayOopDesc::header_size(op->type()),
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 array_element_size(op->type()),
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 op->klass()->as_register(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 __ bind(*op->stub()->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1661
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1662 void LIR_Assembler::type_profile_helper(Register mdo,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1663 ciMethodData *md, ciProfileData *data,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1664 Register recv, Label* update_done) {
1808
5511edd5d719 6988779: c1_LIRAssembler_x86.cpp crashes VS2010 compiler
iveresov
parents: 1791
diff changeset
1665 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1666 Label next_test;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1667 // See if the receiver is receiver[n].
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1668 __ cmpptr(recv, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i))));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1669 __ jccb(Assembler::notEqual, next_test);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1670 Address data_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i)));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1671 __ addptr(data_addr, DataLayout::counter_increment);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1672 __ jmp(*update_done);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1673 __ bind(next_test);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1674 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1675
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1676 // Didn't find receiver; find next empty slot and fill it in
1808
5511edd5d719 6988779: c1_LIRAssembler_x86.cpp crashes VS2010 compiler
iveresov
parents: 1791
diff changeset
1677 for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1678 Label next_test;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1679 Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1680 __ cmpptr(recv_addr, (intptr_t)NULL_WORD);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1681 __ jccb(Assembler::notEqual, next_test);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1682 __ movptr(recv_addr, recv);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1683 __ movptr(Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i))), DataLayout::counter_increment);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1684 __ jmp(*update_done);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1685 __ bind(next_test);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1686 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1687 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1688
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1689 void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, Label* failure, Label* obj_is_null) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1690 // we always need a stub for the failure case.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1691 CodeStub* stub = op->stub();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1692 Register obj = op->object()->as_register();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1693 Register k_RInfo = op->tmp1()->as_register();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1694 Register klass_RInfo = op->tmp2()->as_register();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1695 Register dst = op->result_opr()->as_register();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1696 ciKlass* k = op->klass();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1697 Register Rtmp1 = noreg;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1698
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1699 // check if it needs to be profiled
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1700 ciMethodData* md;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1701 ciProfileData* data;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1702
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1703 if (op->should_profile()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1704 ciMethod* method = op->profiled_method();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1705 assert(method != NULL, "Should have method");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1706 int bci = op->profiled_bci();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
1707 md = method->method_data_or_null();
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
1708 assert(md != NULL, "Sanity");
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1709 data = md->bci_to_data(bci);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1710 assert(data != NULL, "need data for type check");
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1711 assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1712 }
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1713 Label profile_cast_success, profile_cast_failure;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1714 Label *success_target = op->should_profile() ? &profile_cast_success : success;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1715 Label *failure_target = op->should_profile() ? &profile_cast_failure : failure;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1716
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1717 if (obj == k_RInfo) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1718 k_RInfo = dst;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1719 } else if (obj == klass_RInfo) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1720 klass_RInfo = dst;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1721 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1722 if (k->is_loaded() && !UseCompressedOops) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1723 select_different_registers(obj, dst, k_RInfo, klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1724 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1725 Rtmp1 = op->tmp3()->as_register();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1726 select_different_registers(obj, dst, k_RInfo, klass_RInfo, Rtmp1);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1727 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1728
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1729 assert_different_registers(obj, k_RInfo, klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1730 if (!k->is_loaded()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1731 jobject2reg_with_patching(k_RInfo, op->info_for_patch());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1732 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1733 #ifdef _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1734 __ movoop(k_RInfo, k->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1735 #endif // _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1736 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1737 assert(obj != k_RInfo, "must be different");
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1738
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1739 __ cmpptr(obj, (int32_t)NULL_WORD);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1740 if (op->should_profile()) {
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1741 Label not_null;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1742 __ jccb(Assembler::notEqual, not_null);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1743 // Object is null; update MDO and exit
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1744 Register mdo = klass_RInfo;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1745 __ movoop(mdo, md->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1746 Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1747 int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1748 __ orl(data_addr, header_bits);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1749 __ jmp(*obj_is_null);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1750 __ bind(not_null);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1751 } else {
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1752 __ jcc(Assembler::equal, *obj_is_null);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1753 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1754 __ verify_oop(obj);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1755
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1756 if (op->fast_check()) {
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1757 // get object class
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1758 // not a safepoint as obj null check happens earlier
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1759 #ifdef _LP64
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1760 if (UseCompressedOops) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1761 __ load_klass(Rtmp1, obj);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1762 __ cmpptr(k_RInfo, Rtmp1);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1763 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1764 __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1765 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1766 #else
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1767 if (k->is_loaded()) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1768 __ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding());
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1769 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1770 __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1771 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1772 #endif
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1773 __ jcc(Assembler::notEqual, *failure_target);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1774 // successful cast, fall through to profile or jump
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1775 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1776 // get object class
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1777 // not a safepoint as obj null check happens earlier
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1778 __ load_klass(klass_RInfo, obj);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1779 if (k->is_loaded()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1780 // See if we get an immediate positive hit
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1781 #ifdef _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1782 __ cmpptr(k_RInfo, Address(klass_RInfo, k->super_check_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1783 #else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1784 __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1785 #endif // _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1786 if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() != k->super_check_offset()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1787 __ jcc(Assembler::notEqual, *failure_target);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1788 // successful cast, fall through to profile or jump
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1789 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1790 // See if we get an immediate positive hit
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1791 __ jcc(Assembler::equal, *success_target);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1792 // check for self
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1793 #ifdef _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1794 __ cmpptr(klass_RInfo, k_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1795 #else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1796 __ cmpoop(klass_RInfo, k->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1797 #endif // _LP64
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1798 __ jcc(Assembler::equal, *success_target);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1799
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1800 __ push(klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1801 #ifdef _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1802 __ push(k_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1803 #else
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1804 __ pushoop(k->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1805 #endif // _LP64
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1806 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1807 __ pop(klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1808 __ pop(klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1809 // result is a boolean
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1810 __ cmpl(klass_RInfo, 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1811 __ jcc(Assembler::equal, *failure_target);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1812 // successful cast, fall through to profile or jump
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1813 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1814 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1815 // perform the fast part of the checking logic
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1816 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1817 // call out-of-line instance of __ check_klass_subtype_slow_path(...):
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1818 __ push(klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1819 __ push(k_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1820 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1821 __ pop(klass_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1822 __ pop(k_RInfo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1823 // result is a boolean
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1824 __ cmpl(k_RInfo, 0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1825 __ jcc(Assembler::equal, *failure_target);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1826 // successful cast, fall through to profile or jump
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1827 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1828 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1829 if (op->should_profile()) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1830 Register mdo = klass_RInfo, recv = k_RInfo;
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1831 __ bind(profile_cast_success);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1832 __ movoop(mdo, md->constant_encoding());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1833 __ load_klass(recv, obj);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1834 Label update_done;
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1835 type_profile_helper(mdo, md, data, recv, success);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1836 __ jmp(*success);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1837
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1838 __ bind(profile_cast_failure);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1839 __ movoop(mdo, md->constant_encoding());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1840 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1841 __ subptr(counter_addr, DataLayout::counter_increment);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1842 __ jmp(*failure);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1843 }
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1844 __ jmp(*success);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
1845 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1846
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1847
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 LIR_Code code = op->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 if (code == lir_store_check) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 Register value = op->object()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 Register array = op->array()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 Register k_RInfo = op->tmp1()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 Register klass_RInfo = op->tmp2()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 Register Rtmp1 = op->tmp3()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1856
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 CodeStub* stub = op->stub();
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1858
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1859 // check if it needs to be profiled
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1860 ciMethodData* md;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1861 ciProfileData* data;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1862
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1863 if (op->should_profile()) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1864 ciMethod* method = op->profiled_method();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1865 assert(method != NULL, "Should have method");
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1866 int bci = op->profiled_bci();
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
1867 md = method->method_data_or_null();
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
1868 assert(md != NULL, "Sanity");
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1869 data = md->bci_to_data(bci);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1870 assert(data != NULL, "need data for type check");
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1871 assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1872 }
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1873 Label profile_cast_success, profile_cast_failure, done;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1874 Label *success_target = op->should_profile() ? &profile_cast_success : &done;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1875 Label *failure_target = op->should_profile() ? &profile_cast_failure : stub->entry();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1876
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1877 __ cmpptr(value, (int32_t)NULL_WORD);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1878 if (op->should_profile()) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1879 Label not_null;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1880 __ jccb(Assembler::notEqual, not_null);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1881 // Object is null; update MDO and exit
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1882 Register mdo = klass_RInfo;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1883 __ movoop(mdo, md->constant_encoding());
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1884 Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1885 int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1886 __ orl(data_addr, header_bits);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1887 __ jmp(done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1888 __ bind(not_null);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1889 } else {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1890 __ jcc(Assembler::equal, done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1891 }
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1892
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 add_debug_info_for_null_check_here(op->info_for_exception());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1894 __ load_klass(k_RInfo, array);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1895 __ load_klass(klass_RInfo, value);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1896
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1897 // get instance klass (it's already uncompressed)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1898 __ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 622
diff changeset
1899 // perform the fast part of the checking logic
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1900 __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 622
diff changeset
1901 // call out-of-line instance of __ check_klass_subtype_slow_path(...):
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1902 __ push(klass_RInfo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1903 __ push(k_RInfo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1905 __ pop(klass_RInfo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1906 __ pop(k_RInfo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1907 // result is a boolean
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 __ cmpl(k_RInfo, 0);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1909 __ jcc(Assembler::equal, *failure_target);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1910 // fall through to the success case
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1911
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1912 if (op->should_profile()) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1913 Register mdo = klass_RInfo, recv = k_RInfo;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1914 __ bind(profile_cast_success);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1915 __ movoop(mdo, md->constant_encoding());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1916 __ load_klass(recv, value);
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1917 Label update_done;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1918 type_profile_helper(mdo, md, data, recv, &done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1919 __ jmpb(done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1920
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1921 __ bind(profile_cast_failure);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1922 __ movoop(mdo, md->constant_encoding());
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1923 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1924 __ subptr(counter_addr, DataLayout::counter_increment);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1925 __ jmp(*stub->entry());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 }
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1927
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1928 __ bind(done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1929 } else
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1930 if (code == lir_checkcast) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1931 Register obj = op->object()->as_register();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1932 Register dst = op->result_opr()->as_register();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1933 Label success;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1934 emit_typecheck_helper(op, &success, op->stub()->entry(), &success);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1935 __ bind(success);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1936 if (dst != obj) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1937 __ mov(dst, obj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 }
1791
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1939 } else
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1940 if (code == lir_instanceof) {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1941 Register obj = op->object()->as_register();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1942 Register dst = op->result_opr()->as_register();
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1943 Label success, failure, done;
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1944 emit_typecheck_helper(op, &success, &failure, &failure);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1945 __ bind(failure);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1946 __ xorptr(dst, dst);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1947 __ jmpb(done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1948 __ bind(success);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1949 __ movptr(dst, 1);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1950 __ bind(done);
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1951 } else {
3a294e483abc 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 1790
diff changeset
1952 ShouldNotReachHere();
644
c517646eef23 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 622
diff changeset
1953 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1954
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1959 if (LP64_ONLY(false &&) op->code() == lir_cas_long && VM_Version::supports_cx8()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 assert(op->cmp_value()->as_register_lo() == rax, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 assert(op->cmp_value()->as_register_hi() == rdx, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 assert(op->new_value()->as_register_lo() == rbx, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 assert(op->new_value()->as_register_hi() == rcx, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 Register addr = op->addr()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 __ lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1968 NOT_LP64(__ cmpxchg8(Address(addr, 0)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1969
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1970 } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj ) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1971 NOT_LP64(assert(op->addr()->is_single_cpu(), "must be single");)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1972 Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 Register newval = op->new_value()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 Register cmpval = op->cmp_value()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 assert(cmpval == rax, "wrong register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 assert(newval != NULL, "new val must be register");
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 assert(cmpval != newval, "cmp and new values must be in different registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 assert(cmpval != addr, "cmp and addr must be in different registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 assert(newval != addr, "new value and addr must be in different registers");
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1980
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1981 if ( op->code() == lir_cas_obj) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1982 #ifdef _LP64
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1983 if (UseCompressedOops) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1984 __ encode_heap_oop(cmpval);
2013
ec8c74742417 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 2007
diff changeset
1985 __ mov(rscratch1, newval);
ec8c74742417 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 2007
diff changeset
1986 __ encode_heap_oop(rscratch1);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1987 if (os::is_MP()) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1988 __ lock();
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1989 }
2013
ec8c74742417 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 2007
diff changeset
1990 // cmpval (rax) is implicitly used by this instruction
ec8c74742417 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 2007
diff changeset
1991 __ cmpxchgl(rscratch1, Address(addr, 0));
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1992 } else
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1993 #endif
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1994 {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1995 if (os::is_MP()) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1996 __ lock();
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1997 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1998 __ cmpxchgptr(newval, Address(addr, 0));
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1999 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2000 } else {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2001 assert(op->code() == lir_cas_int, "lir_cas_int expected");
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2002 if (os::is_MP()) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2003 __ lock();
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
2004 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2005 __ cmpxchgl(newval, Address(addr, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2006 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2007 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2008 } else if (op->code() == lir_cas_long) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2009 Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2010 Register newval = op->new_value()->as_register_lo();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2011 Register cmpval = op->cmp_value()->as_register_lo();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2012 assert(cmpval == rax, "wrong register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2013 assert(newval != NULL, "new val must be register");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2014 assert(cmpval != newval, "cmp and new values must be in different registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2015 assert(cmpval != addr, "cmp and addr must be in different registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2016 assert(newval != addr, "new value and addr must be in different registers");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2017 if (os::is_MP()) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2018 __ lock();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2019 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2020 __ cmpxchgq(newval, Address(addr, 0));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2021 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
2089
037c727f35fb 7009231: C1: Incorrect CAS code for longs on SPARC 32bit
iveresov
parents: 2013
diff changeset
2027 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 Assembler::Condition acond, ncond;
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 switch (condition) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 case lir_cond_equal: acond = Assembler::equal; ncond = Assembler::notEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 case lir_cond_notEqual: acond = Assembler::notEqual; ncond = Assembler::equal; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 case lir_cond_less: acond = Assembler::less; ncond = Assembler::greaterEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 case lir_cond_lessEqual: acond = Assembler::lessEqual; ncond = Assembler::greater; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 case lir_cond_greaterEqual: acond = Assembler::greaterEqual; ncond = Assembler::less; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 case lir_cond_greater: acond = Assembler::greater; ncond = Assembler::lessEqual; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 case lir_cond_belowEqual: acond = Assembler::belowEqual; ncond = Assembler::above; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 case lir_cond_aboveEqual: acond = Assembler::aboveEqual; ncond = Assembler::below; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 if (opr1->is_cpu_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 reg2reg(opr1, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 } else if (opr1->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 stack2reg(opr1, result, result->type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 } else if (opr1->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 const2reg(opr1, result, lir_patch_none, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2050
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 if (VM_Version::supports_cmov() && !opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // optimized version that does not require a branch
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 if (opr2->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 assert(opr2->cpu_regnr() != result->cpu_regnr(), "opr2 already overwritten by previous move");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2055 __ cmov(ncond, result->as_register(), opr2->as_register());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 } else if (opr2->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 assert(opr2->cpu_regnrLo() != result->cpu_regnrLo() && opr2->cpu_regnrLo() != result->cpu_regnrHi(), "opr2 already overwritten by previous move");
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 assert(opr2->cpu_regnrHi() != result->cpu_regnrLo() && opr2->cpu_regnrHi() != result->cpu_regnrHi(), "opr2 already overwritten by previous move");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2059 __ cmovptr(ncond, result->as_register_lo(), opr2->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2060 NOT_LP64(__ cmovptr(ncond, result->as_register_hi(), opr2->as_register_hi());)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 } else if (opr2->is_single_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 __ cmovl(ncond, result->as_register(), frame_map()->address_for_slot(opr2->single_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 } else if (opr2->is_double_stack()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2064 __ cmovptr(ncond, result->as_register_lo(), frame_map()->address_for_slot(opr2->double_stack_ix(), lo_word_offset_in_bytes));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2065 NOT_LP64(__ cmovptr(ncond, result->as_register_hi(), frame_map()->address_for_slot(opr2->double_stack_ix(), hi_word_offset_in_bytes));)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2069
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 Label skip;
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 __ jcc (acond, skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 if (opr2->is_cpu_register()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 reg2reg(opr2, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 } else if (opr2->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 stack2reg(opr2, result, result->type());
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 } else if (opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 const2reg(opr2, result, lir_patch_none, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 __ bind(skip);
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
a61af66fc99e Initial load
duke
parents:
diff changeset
2086
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info, bool pop_fpu_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 assert(info == NULL, "should never be used, idiv/irem and ldiv/lrem not handled by this method");
a61af66fc99e Initial load
duke
parents:
diff changeset
2089
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 if (left->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2091 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 Register lreg = left->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2093
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 if (right->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 // cpu register - cpu register
a61af66fc99e Initial load
duke
parents:
diff changeset
2096 Register rreg = right->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 case lir_add: __ addl (lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 case lir_sub: __ subl (lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 case lir_mul: __ imull(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2103
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 } else if (right->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 // cpu register - stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 Address raddr = frame_map()->address_for_slot(right->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 case lir_add: __ addl(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 case lir_sub: __ subl(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2112
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 // cpu register - constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 jint c = right->as_constant_ptr()->as_jint();
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 case lir_add: {
1790
7f9553bedfd5 6984056: C1: incorrect code for integer constant addition on x64
iveresov
parents: 1783
diff changeset
2118 __ incrementl(lreg, c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 case lir_sub: {
1790
7f9553bedfd5 6984056: C1: incorrect code for integer constant addition on x64
iveresov
parents: 1783
diff changeset
2122 __ decrementl(lreg, c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2127
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2131
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 } else if (left->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 Register lreg_lo = left->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 Register lreg_hi = left->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2136
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 if (right->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 // cpu register - cpu register
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 Register rreg_lo = right->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 Register rreg_hi = right->as_register_hi();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2141 NOT_LP64(assert_different_registers(lreg_lo, lreg_hi, rreg_lo, rreg_hi));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2142 LP64_ONLY(assert_different_registers(lreg_lo, rreg_lo));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 case lir_add:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2145 __ addptr(lreg_lo, rreg_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2146 NOT_LP64(__ adcl(lreg_hi, rreg_hi));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 case lir_sub:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2149 __ subptr(lreg_lo, rreg_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2150 NOT_LP64(__ sbbl(lreg_hi, rreg_hi));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 case lir_mul:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2153 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2154 __ imulq(lreg_lo, rreg_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2155 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 assert(lreg_lo == rax && lreg_hi == rdx, "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 __ imull(lreg_hi, rreg_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 __ imull(rreg_hi, lreg_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 __ addl (rreg_hi, lreg_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 __ mull (rreg_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 __ addl (lreg_hi, rreg_hi);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2162 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2167
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 // cpu register - constant
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2170 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2171 jlong c = right->as_constant_ptr()->as_jlong_bits();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2172 __ movptr(r10, (intptr_t) c);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2173 switch (code) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2174 case lir_add:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2175 __ addptr(lreg_lo, r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2176 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2177 case lir_sub:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2178 __ subptr(lreg_lo, r10);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2179 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2180 default:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2181 ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2182 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2183 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 jint c_lo = right->as_constant_ptr()->as_jint_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 jint c_hi = right->as_constant_ptr()->as_jint_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 case lir_add:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2188 __ addptr(lreg_lo, c_lo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 __ adcl(lreg_hi, c_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 case lir_sub:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2192 __ subptr(lreg_lo, c_lo);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 __ sbbl(lreg_hi, c_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2198 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2199
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2203
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 } else if (left->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 XMMRegister lreg = left->as_xmm_float_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2207
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 if (right->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 XMMRegister rreg = right->as_xmm_float_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 case lir_add: __ addss(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 case lir_sub: __ subss(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 case lir_mul: __ mulss(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 case lir_div: __ divss(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 Address raddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 if (right->is_single_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 raddr = frame_map()->address_for_slot(right->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 // hack for now
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 raddr = __ as_Address(InternalAddress(float_constant(right->as_jfloat())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 case lir_add: __ addss(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 case lir_sub: __ subss(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 case lir_mul: __ mulss(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 case lir_div: __ divss(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2239
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 } else if (left->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 XMMRegister lreg = left->as_xmm_double_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 if (right->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 XMMRegister rreg = right->as_xmm_double_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 case lir_add: __ addsd(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 case lir_sub: __ subsd(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 case lir_mul: __ mulsd(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 case lir_div: __ divsd(lreg, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 Address raddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 if (right->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 raddr = frame_map()->address_for_slot(right->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 // hack for now
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 raddr = __ as_Address(InternalAddress(double_constant(right->as_jdouble())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 case lir_add: __ addsd(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 case lir_sub: __ subsd(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 case lir_mul: __ mulsd(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 case lir_div: __ divsd(lreg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2275
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 } else if (left->is_single_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 assert(dest->is_single_fpu(), "fpu stack allocation required");
a61af66fc99e Initial load
duke
parents:
diff changeset
2278
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 if (right->is_single_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 arith_fpu_implementation(code, left->fpu_regnr(), right->fpu_regnr(), dest->fpu_regnr(), pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
2281
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 assert(left->fpu_regnr() == 0, "left must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 assert(dest->fpu_regnr() == 0, "dest must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2285
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 Address raddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 if (right->is_single_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 raddr = frame_map()->address_for_slot(right->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 address const_addr = float_constant(right->as_jfloat());
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 assert(const_addr != NULL, "incorrect float/double constant maintainance");
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 // hack for now
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 raddr = __ as_Address(InternalAddress(const_addr));
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2297
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 case lir_add: __ fadd_s(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 case lir_sub: __ fsub_s(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 case lir_mul: __ fmul_s(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 case lir_div: __ fdiv_s(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2308
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 } else if (left->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 assert(dest->is_double_fpu(), "fpu stack allocation required");
a61af66fc99e Initial load
duke
parents:
diff changeset
2311
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 if (code == lir_mul_strictfp || code == lir_div_strictfp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 // Double values require special handling for strictfp mul/div on x86
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 __ fmulp(left->fpu_regnrLo() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2317
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 if (right->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 arith_fpu_implementation(code, left->fpu_regnrLo(), right->fpu_regnrLo(), dest->fpu_regnrLo(), pop_fpu_stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
2320
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 assert(left->fpu_regnrLo() == 0, "left must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 assert(dest->fpu_regnrLo() == 0, "dest must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2324
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 Address raddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 if (right->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 raddr = frame_map()->address_for_slot(right->double_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 // hack for now
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 raddr = __ as_Address(InternalAddress(double_constant(right->as_jdouble())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2334
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 case lir_add: __ fadd_d(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 case lir_sub: __ fsub_d(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 case lir_mul: __ fmul_d(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 case lir_div: __ fdiv_d(raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2345
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 if (code == lir_mul_strictfp || code == lir_div_strictfp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 // Double values require special handling for strictfp mul/div on x86
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 __ fmulp(dest->fpu_regnrLo() + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2351
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 } else if (left->is_single_stack() || left->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2354
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 Address laddr;
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 if (left->is_single_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 laddr = frame_map()->address_for_slot(left->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 } else if (left->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 laddr = as_Address(left->as_address_ptr());
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2363
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 if (right->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 Register rreg = right->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 case lir_add: __ addl(laddr, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 case lir_sub: __ subl(laddr, rreg); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 } else if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 jint c = right->as_constant_ptr()->as_jint();
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 case lir_add: {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2375 __ incrementl(laddr, c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 case lir_sub: {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2379 __ decrementl(laddr, c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2387
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2392
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 void LIR_Assembler::arith_fpu_implementation(LIR_Code code, int left_index, int right_index, int dest_index, bool pop_fpu_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 assert(pop_fpu_stack || (left_index == dest_index || right_index == dest_index), "invalid LIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 assert(!pop_fpu_stack || (left_index - 1 == dest_index || right_index - 1 == dest_index), "invalid LIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 assert(left_index == 0 || right_index == 0, "either must be on top of stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
2397
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 bool left_is_tos = (left_index == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 bool dest_is_tos = (dest_index == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 int non_tos_index = (left_is_tos ? right_index : left_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2401
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 case lir_add:
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 if (pop_fpu_stack) __ faddp(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 else if (dest_is_tos) __ fadd (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 else __ fadda(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2408
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 case lir_sub:
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 if (left_is_tos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 if (pop_fpu_stack) __ fsubrp(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 else if (dest_is_tos) __ fsub (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 else __ fsubra(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 if (pop_fpu_stack) __ fsubp (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 else if (dest_is_tos) __ fsubr (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 else __ fsuba (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2420
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 case lir_mul_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 case lir_mul:
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 if (pop_fpu_stack) __ fmulp(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 else if (dest_is_tos) __ fmul (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 else __ fmula(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 case lir_div_strictfp: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 case lir_div:
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 if (left_is_tos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 if (pop_fpu_stack) __ fdivrp(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 else if (dest_is_tos) __ fdiv (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 else __ fdivra(non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 if (pop_fpu_stack) __ fdivp (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 else if (dest_is_tos) __ fdivr (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 else __ fdiva (non_tos_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2440
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 case lir_rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 assert(left_is_tos && dest_is_tos && right_index == 1, "must be guaranteed by FPU stack allocation");
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 __ fremr(noreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2445
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2450
a61af66fc99e Initial load
duke
parents:
diff changeset
2451
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 void LIR_Assembler::intrinsic_op(LIR_Code code, LIR_Opr value, LIR_Opr unused, LIR_Opr dest, LIR_Op* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 if (value->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 switch(code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 case lir_abs :
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 {
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 __ andpd(dest->as_xmm_double_reg(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 ExternalAddress((address)double_signmask_pool));
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2464
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 case lir_sqrt: __ sqrtsd(dest->as_xmm_double_reg(), value->as_xmm_double_reg()); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 // all other intrinsics are not available in the SSE instruction set, so FPU is used
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2469
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 } else if (value->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 assert(value->fpu_regnrLo() == 0 && dest->fpu_regnrLo() == 0, "both must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 switch(code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 case lir_log : __ flog() ; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 case lir_log10 : __ flog10() ; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 case lir_abs : __ fabs() ; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 case lir_sqrt : __ fsqrt(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 case lir_sin :
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 // Should consider not saving rbx, if not necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 __ trigfunc('s', op->as_Op2()->fpu_stack_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 case lir_cos :
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 // Should consider not saving rbx, if not necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 assert(op->as_Op2()->fpu_stack_size() <= 6, "sin and cos need two free stack slots");
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 __ trigfunc('c', op->as_Op2()->fpu_stack_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 case lir_tan :
a61af66fc99e Initial load
duke
parents:
diff changeset
2487 // Should consider not saving rbx, if not necessary
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 __ trigfunc('t', op->as_Op2()->fpu_stack_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 // assert(left->destroys_register(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 if (left->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 Register reg = left->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 int val = right->as_constant_ptr()->as_jint();
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 case lir_logic_and: __ andl (reg, val); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 case lir_logic_or: __ orl (reg, val); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 case lir_logic_xor: __ xorl (reg, val); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 } else if (right->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 // added support for stack operands
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 Address raddr = frame_map()->address_for_slot(right->single_stack_ix());
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 case lir_logic_and: __ andl (reg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 case lir_logic_or: __ orl (reg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 case lir_logic_xor: __ xorl (reg, raddr); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 Register rright = right->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 switch (code) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2521 case lir_logic_and: __ andptr (reg, rright); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2522 case lir_logic_or : __ orptr (reg, rright); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2523 case lir_logic_xor: __ xorptr (reg, rright); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 move_regs(reg, dst->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 Register l_lo = left->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 Register l_hi = left->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 if (right->is_constant()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2532 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2533 __ mov64(rscratch1, right->as_constant_ptr()->as_jlong());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2534 switch (code) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2535 case lir_logic_and:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2536 __ andq(l_lo, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2537 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2538 case lir_logic_or:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2539 __ orq(l_lo, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2540 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2541 case lir_logic_xor:
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2542 __ xorq(l_lo, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2543 break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2544 default: ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2545 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2546 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 int r_lo = right->as_constant_ptr()->as_jint_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 int r_hi = right->as_constant_ptr()->as_jint_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 case lir_logic_and:
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 __ andl(l_lo, r_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 __ andl(l_hi, r_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 case lir_logic_or:
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 __ orl(l_lo, r_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 __ orl(l_hi, r_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 case lir_logic_xor:
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 __ xorl(l_lo, r_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 __ xorl(l_hi, r_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2564 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 } else {
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2566 #ifdef _LP64
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2567 Register r_lo;
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2568 if (right->type() == T_OBJECT || right->type() == T_ARRAY) {
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2569 r_lo = right->as_register();
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2570 } else {
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2571 r_lo = right->as_register_lo();
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2572 }
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2573 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 Register r_lo = right->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 Register r_hi = right->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 assert(l_lo != r_hi, "overwriting registers");
1572
87fc6aca31ab 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 1564
diff changeset
2577 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 case lir_logic_and:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2580 __ andptr(l_lo, r_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2581 NOT_LP64(__ andptr(l_hi, r_hi);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 case lir_logic_or:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2584 __ orptr(l_lo, r_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2585 NOT_LP64(__ orptr(l_hi, r_hi);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 case lir_logic_xor:
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2588 __ xorptr(l_lo, r_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2589 NOT_LP64(__ xorptr(l_hi, r_hi);)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2594
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 Register dst_lo = dst->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 Register dst_hi = dst->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2597
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2598 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2599 move_regs(l_lo, dst_lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2600 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 if (dst_lo == l_hi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 assert(dst_hi != l_lo, "overwriting registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 move_regs(l_hi, dst_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 move_regs(l_lo, dst_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 assert(dst_lo != l_hi, "overwriting registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 move_regs(l_lo, dst_lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 move_regs(l_hi, dst_hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2610 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2613
a61af66fc99e Initial load
duke
parents:
diff changeset
2614
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 // we assume that rax, and rdx can be overwritten
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2617
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 assert(left->is_single_cpu(), "left must be register");
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 assert(right->is_single_cpu() || right->is_constant(), "right must be register or constant");
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 assert(result->is_single_cpu(), "result must be register");
a61af66fc99e Initial load
duke
parents:
diff changeset
2621
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 // assert(left->destroys_register(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 // assert(right->destroys_register(), "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
2624
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 Register lreg = left->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 Register dreg = result->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2627
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 if (right->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 int divisor = right->as_constant_ptr()->as_jint();
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 assert(divisor > 0 && is_power_of_2(divisor), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 if (code == lir_idiv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 assert(lreg == rax, "must be rax,");
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 assert(temp->as_register() == rdx, "tmp register must be rdx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 __ cdql(); // sign extend into rdx:rax
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 if (divisor == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 __ subl(lreg, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 __ andl(rdx, divisor - 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 __ addl(lreg, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 __ sarl(lreg, log2_intptr(divisor));
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 move_regs(lreg, dreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 } else if (code == lir_irem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 Label done;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2645 __ mov(dreg, lreg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 __ andl(dreg, 0x80000000 | (divisor - 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 __ jcc(Assembler::positive, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 __ decrement(dreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 __ orl(dreg, ~(divisor - 1));
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 __ increment(dreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 Register rreg = right->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 assert(lreg == rax, "left register must be rax,");
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 assert(rreg != rdx, "right register must not be rdx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 assert(temp->as_register() == rdx, "tmp register must be rdx");
a61af66fc99e Initial load
duke
parents:
diff changeset
2660
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 move_regs(lreg, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2662
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 int idivl_offset = __ corrected_idivl(rreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 add_debug_info_for_div0(idivl_offset, info);
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 if (code == lir_irem) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 move_regs(rdx, dreg); // result is in rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 move_regs(rax, dreg);
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2672
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Op2* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 if (opr1->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 Register reg1 = opr1->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 if (opr2->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 // cpu register - cpu register
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2679 if (opr1->type() == T_OBJECT || opr1->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2680 __ cmpptr(reg1, opr2->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2681 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2682 assert(opr2->type() != T_OBJECT && opr2->type() != T_ARRAY, "cmp int, oop?");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2683 __ cmpl(reg1, opr2->as_register());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2684 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 } else if (opr2->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 // cpu register - stack
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2687 if (opr1->type() == T_OBJECT || opr1->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2688 __ cmpptr(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2689 } else {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2690 __ cmpl(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2691 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 } else if (opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 // cpu register - constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2694 LIR_Const* c = opr2->as_constant_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 if (c->type() == T_INT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 __ cmpl(reg1, c->as_jint());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2697 } else if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2698 // In 64bit oops are single register
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2699 jobject o = c->as_jobject();
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 if (o == NULL) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2701 __ cmpptr(reg1, (int32_t)NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2703 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2704 __ movoop(rscratch1, o);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2705 __ cmpptr(reg1, rscratch1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2706 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 __ cmpoop(reg1, c->as_jobject());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2708 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 // cpu register - address
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 } else if (opr2->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 __ cmpl(reg1, as_Address(opr2->as_address_ptr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2722
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 } else if(opr1->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 Register xlo = opr1->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 Register xhi = opr1->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 if (opr2->is_double_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2727 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2728 __ cmpptr(xlo, opr2->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2729 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 // cpu register - cpu register
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 Register ylo = opr2->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 Register yhi = opr2->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 __ subl(xlo, ylo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 __ sbbl(xhi, yhi);
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 if (condition == lir_cond_equal || condition == lir_cond_notEqual) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 __ orl(xhi, xlo);
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2738 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 } else if (opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 // cpu register - constant 0
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 assert(opr2->as_jlong() == (jlong)0, "only handles zero");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2742 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2743 __ cmpptr(xlo, (int32_t)opr2->as_jlong());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2744 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 assert(condition == lir_cond_equal || condition == lir_cond_notEqual, "only handles equals case");
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 __ orl(xhi, xlo);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2747 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2751
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 } else if (opr1->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 XMMRegister reg1 = opr1->as_xmm_float_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 if (opr2->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 // xmm register - xmm register
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 __ ucomiss(reg1, opr2->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 } else if (opr2->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 // xmm register - stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 __ ucomiss(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 } else if (opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 // xmm register - constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 __ ucomiss(reg1, InternalAddress(float_constant(opr2->as_jfloat())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 } else if (opr2->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 // xmm register - address
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 __ ucomiss(reg1, as_Address(opr2->as_address_ptr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2772
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 } else if (opr1->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 XMMRegister reg1 = opr1->as_xmm_double_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 if (opr2->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 // xmm register - xmm register
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 __ ucomisd(reg1, opr2->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 } else if (opr2->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 // xmm register - stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 __ ucomisd(reg1, frame_map()->address_for_slot(opr2->double_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 } else if (opr2->is_constant()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 // xmm register - constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 __ ucomisd(reg1, InternalAddress(double_constant(opr2->as_jdouble())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 } else if (opr2->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 // xmm register - address
a61af66fc99e Initial load
duke
parents:
diff changeset
2786 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 __ ucomisd(reg1, as_Address(opr2->pointer()->as_address()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 } else if(opr1->is_single_fpu() || opr1->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 assert(opr1->is_fpu_register() && opr1->fpu() == 0, "currently left-hand side must be on TOS (relax this restriction)");
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 assert(opr2->is_fpu_register(), "both must be registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
2797 __ fcmp(noreg, opr2->fpu(), op->fpu_pop_count() > 0, op->fpu_pop_count() > 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2798
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 } else if (opr1->is_address() && opr2->is_constant()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2800 LIR_Const* c = opr2->as_constant_ptr();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2801 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2802 if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2803 assert(condition == lir_cond_equal || condition == lir_cond_notEqual, "need to reverse");
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2804 __ movoop(rscratch1, c->as_jobject());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2805 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2806 #endif // LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 add_debug_info_for_null_check_here(op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 // special case: address - constant
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 LIR_Address* addr = opr1->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 if (c->type() == T_INT) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 __ cmpl(as_Address(addr), c->as_jint());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2814 } else if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2815 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2816 // %%% Make this explode if addr isn't reachable until we figure out a
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2817 // better strategy by giving noreg as the temp for as_Address
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2818 __ cmpptr(rscratch1, as_Address(addr, noreg));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2819 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 __ cmpoop(as_Address(addr), c->as_jobject());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2821 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2825
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2830
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 void LIR_Assembler::comp_fl2i(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst, LIR_Op2* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 if (code == lir_cmp_fd2i || code == lir_ucmp_fd2i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 if (left->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 assert(right->is_single_xmm(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 __ cmpss2int(left->as_xmm_float_reg(), right->as_xmm_float_reg(), dst->as_register(), code == lir_ucmp_fd2i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2836 } else if (left->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 assert(right->is_double_xmm(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 __ cmpsd2int(left->as_xmm_double_reg(), right->as_xmm_double_reg(), dst->as_register(), code == lir_ucmp_fd2i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2839
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 assert(left->is_single_fpu() || left->is_double_fpu(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 assert(right->is_single_fpu() || right->is_double_fpu(), "must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
2843
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 assert(left->fpu() == 0, "left must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 __ fcmp2int(dst->as_register(), code == lir_ucmp_fd2i, right->fpu(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 op->fpu_pop_count() > 0, op->fpu_pop_count() > 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 assert(code == lir_cmp_l2i, "check");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2850 #ifdef _LP64
1369
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2851 Label done;
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2852 Register dest = dst->as_register();
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2853 __ cmpptr(left->as_register_lo(), right->as_register_lo());
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2854 __ movl(dest, -1);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2855 __ jccb(Assembler::less, done);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2856 __ set_byte_if_not_zero(dest);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2857 __ movzbl(dest, dest);
0a43776437b6 6942223: c1 64 bit fixes
iveresov
parents: 1301
diff changeset
2858 __ bind(done);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2859 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 __ lcmp2int(left->as_register_hi(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 left->as_register_lo(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 right->as_register_hi(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 right->as_register_lo());
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 move_regs(left->as_register_hi(), dst->as_register());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2865 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2868
a61af66fc99e Initial load
duke
parents:
diff changeset
2869
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 void LIR_Assembler::align_call(LIR_Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 // make sure that the displacement word of the call ends up word aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 int offset = __ offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 case lir_static_call:
a61af66fc99e Initial load
duke
parents:
diff changeset
2876 case lir_optvirtual_call:
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2877 case lir_dynamic_call:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 offset += NativeCall::displacement_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 case lir_icvirtual_call:
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 case lir_virtual_call: // currently, sparc-specific for niagara
a61af66fc99e Initial load
duke
parents:
diff changeset
2884 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 while (offset++ % BytesPerWord != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2891
a61af66fc99e Initial load
duke
parents:
diff changeset
2892
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2893 void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 assert(!os::is_MP() || (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 "must be aligned");
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2896 __ call(AddressLiteral(op->addr(), rtype));
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1491
diff changeset
2897 add_call_info(code_offset(), op->info());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2899
a61af66fc99e Initial load
duke
parents:
diff changeset
2900
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2901 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 RelocationHolder rh = virtual_call_Relocation::spec(pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 __ movoop(IC_Klass, (jobject)Universe::non_oop_word());
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 assert(!os::is_MP() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 "must be aligned");
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2907 __ call(AddressLiteral(op->addr(), rh));
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 1491
diff changeset
2908 add_call_info(code_offset(), op->info());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2909 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 /* Currently, vtable-dispatch is only enabled for sparc platforms */
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2913 void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2916
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 1257
diff changeset
2917
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 void LIR_Assembler::emit_static_call_stub() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 address call_pc = __ pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 address stub = __ start_a_stub(call_stub_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 if (stub == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 bailout("static call stub overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2925
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 int start = __ offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 // make sure that the displacement word of the call ends up word aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 int offset = __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 while (offset++ % BytesPerWord != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 __ relocate(static_stub_Relocation::spec(call_pc));
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 __ movoop(rbx, (jobject)NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 // must be set to -1 at code generation time
a61af66fc99e Initial load
duke
parents:
diff changeset
2937 assert(!os::is_MP() || ((__ offset() + 1) % BytesPerWord) == 0, "must be aligned on MP");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2938 // On 64bit this will die since it will take a movq & jmp, must be only a jmp
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2939 __ jump(RuntimeAddress(__ pc()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2940
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1378
diff changeset
2941 assert(__ offset() - start <= call_stub_size, "stub too big");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 __ end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2944
a61af66fc99e Initial load
duke
parents:
diff changeset
2945
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2946 void LIR_Assembler::throw_op(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 assert(exceptionOop->as_register() == rax, "must match");
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2948 assert(exceptionPC->as_register() == rdx, "must match");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2949
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 // exception object is not added to oop map by LinearScan
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 // (LinearScan assumes that no oops are in fixed registers)
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 info->add_register_oop(exceptionOop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 Runtime1::StubID unwind_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
2954
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2955 // get current pc information
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2956 // pc is only needed if the method has an exception handler, the unwind code does not need it.
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2957 int pc_for_athrow_offset = __ offset();
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2958 InternalAddress pc_for_athrow(__ pc());
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2959 __ lea(exceptionPC->as_register(), pc_for_athrow);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2960 add_call_info(pc_for_athrow_offset, info); // for exception handler
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2961
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2962 __ verify_not_null_oop(rax);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2963 // search an exception handler (rax: exception oop, rdx: throwing pc)
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2964 if (compilation()->has_fpu_code()) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2965 unwind_id = Runtime1::handle_exception_id;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 } else {
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2967 unwind_id = Runtime1::handle_exception_nofpu_id;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 }
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2969 __ call(RuntimeAddress(Runtime1::entry_for(unwind_id)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2970
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 // enough room for two byte trap
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2974
a61af66fc99e Initial load
duke
parents:
diff changeset
2975
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2976 void LIR_Assembler::unwind_op(LIR_Opr exceptionOop) {
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2977 assert(exceptionOop->as_register() == rax, "must match");
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2978
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2979 __ jmp(_unwind_handler_entry);
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2980 }
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2981
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1369
diff changeset
2982
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, LIR_Opr count, LIR_Opr dest, LIR_Opr tmp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2984
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 // optimized version for linear scan:
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 // * count must be already in ECX (guaranteed by LinearScan)
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 // * left and dest must be equal
a61af66fc99e Initial load
duke
parents:
diff changeset
2988 // * tmp must be unused
a61af66fc99e Initial load
duke
parents:
diff changeset
2989 assert(count->as_register() == SHIFT_count, "count must be in ECX");
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 assert(left == dest, "left and dest must be equal");
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
a61af66fc99e Initial load
duke
parents:
diff changeset
2992
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 if (left->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 Register value = left->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 assert(value != SHIFT_count, "left cannot be ECX");
a61af66fc99e Initial load
duke
parents:
diff changeset
2996
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 case lir_shl: __ shll(value); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 case lir_shr: __ sarl(value); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3000 case lir_ushr: __ shrl(value); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3002 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 } else if (left->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 Register lo = left->as_register_lo();
a61af66fc99e Initial load
duke
parents:
diff changeset
3005 Register hi = left->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 assert(lo != SHIFT_count && hi != SHIFT_count, "left cannot be ECX");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3007 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3008 switch (code) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3009 case lir_shl: __ shlptr(lo); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3010 case lir_shr: __ sarptr(lo); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3011 case lir_ushr: __ shrptr(lo); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3012 default: ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3013 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3014 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3015
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 case lir_shl: __ lshl(hi, lo); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3018 case lir_shr: __ lshr(hi, lo, true); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 case lir_ushr: __ lshr(hi, lo, false); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3022 #endif // LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3027
a61af66fc99e Initial load
duke
parents:
diff changeset
3028
a61af66fc99e Initial load
duke
parents:
diff changeset
3029 void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, jint count, LIR_Opr dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 if (dest->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 // first move left into dest so that left is not destroyed by the shift
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 Register value = dest->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 count = count & 0x1F; // Java spec
a61af66fc99e Initial load
duke
parents:
diff changeset
3034
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 move_regs(left->as_register(), value);
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 case lir_shl: __ shll(value, count); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 case lir_shr: __ sarl(value, count); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 case lir_ushr: __ shrl(value, count); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 } else if (dest->is_double_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3043 #ifndef _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 Unimplemented();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3045 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3046 // first move left into dest so that left is not destroyed by the shift
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3047 Register value = dest->as_register_lo();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3048 count = count & 0x1F; // Java spec
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3049
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3050 move_regs(left->as_register_lo(), value);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3051 switch (code) {
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3052 case lir_shl: __ shlptr(value, count); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3053 case lir_shr: __ sarptr(value, count); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3054 case lir_ushr: __ shrptr(value, count); break;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3055 default: ShouldNotReachHere();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3056 }
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3057 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3062
a61af66fc99e Initial load
duke
parents:
diff changeset
3063
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 void LIR_Assembler::store_parameter(Register r, int offset_from_rsp_in_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3068 __ movptr (Address(rsp, offset_from_rsp_in_bytes), r);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3070
a61af66fc99e Initial load
duke
parents:
diff changeset
3071
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 void LIR_Assembler::store_parameter(jint c, int offset_from_rsp_in_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3073 assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3076 __ movptr (Address(rsp, offset_from_rsp_in_bytes), c);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3078
a61af66fc99e Initial load
duke
parents:
diff changeset
3079
a61af66fc99e Initial load
duke
parents:
diff changeset
3080 void LIR_Assembler::store_parameter(jobject o, int offset_from_rsp_in_words) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3081 assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 __ movoop (Address(rsp, offset_from_rsp_in_bytes), o);
a61af66fc99e Initial load
duke
parents:
diff changeset
3085 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3086
a61af66fc99e Initial load
duke
parents:
diff changeset
3087
a61af66fc99e Initial load
duke
parents:
diff changeset
3088 // This code replaces a call to arraycopy; no exception may
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 // be thrown in this code, they must be thrown in the System.arraycopy
a61af66fc99e Initial load
duke
parents:
diff changeset
3090 // activation frame; we could save some checks if this would not be the case
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3092 ciArrayKlass* default_type = op->expected_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 Register src = op->src()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3094 Register dst = op->dst()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3095 Register src_pos = op->src_pos()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 Register dst_pos = op->dst_pos()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 Register length = op->length()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 Register tmp = op->tmp()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3099
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 CodeStub* stub = op->stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
3101 int flags = op->flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 BasicType basic_type = default_type != NULL ? default_type->element_type()->basic_type() : T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 if (basic_type == T_ARRAY) basic_type = T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
3104
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3105 // if we don't know anything, just go through the generic arraycopy
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3106 if (default_type == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 // save outgoing arguments on stack in case call to System.arraycopy is needed
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 // HACK ALERT. This code used to push the parameters in a hardwired fashion
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 // for interpreter calling conventions. Now we have to do it in new style conventions.
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 // For the moment until C1 gets the new register allocator I just force all the
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 // args to the right place (except the register args) and then on the back side
a61af66fc99e Initial load
duke
parents:
diff changeset
3113 // reload the register args properly if we go slow path. Yuck
a61af66fc99e Initial load
duke
parents:
diff changeset
3114
a61af66fc99e Initial load
duke
parents:
diff changeset
3115 // These are proper for the calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
3116
a61af66fc99e Initial load
duke
parents:
diff changeset
3117 store_parameter(length, 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 store_parameter(dst_pos, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 store_parameter(dst, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3120
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 // these are just temporary placements until we need to reload
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 store_parameter(src_pos, 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 store_parameter(src, 4);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3124 NOT_LP64(assert(src == rcx && src_pos == rdx, "mismatch in calling convention");)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3125
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3126 address C_entry = CAST_FROM_FN_PTR(address, Runtime1::arraycopy);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3127
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3128 address copyfunc_addr = StubRoutines::generic_arraycopy();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3129
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 // pass arguments: may push as this is not a safepoint; SP must be fix at each safepoint
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3131 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3132 // The arguments are in java calling convention so we can trivially shift them to C
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3133 // convention
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3134 assert_different_registers(c_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3135 __ mov(c_rarg0, j_rarg0);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3136 assert_different_registers(c_rarg1, j_rarg2, j_rarg3, j_rarg4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3137 __ mov(c_rarg1, j_rarg1);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3138 assert_different_registers(c_rarg2, j_rarg3, j_rarg4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3139 __ mov(c_rarg2, j_rarg2);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3140 assert_different_registers(c_rarg3, j_rarg4);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3141 __ mov(c_rarg3, j_rarg3);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3142 #ifdef _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3143 // Allocate abi space for args but be sure to keep stack aligned
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3144 __ subptr(rsp, 6*wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3145 store_parameter(j_rarg4, 4);
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3146 if (copyfunc_addr == NULL) { // Use C version if stub was not generated
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3147 __ call(RuntimeAddress(C_entry));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3148 } else {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3149 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3150 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3151 __ incrementl(ExternalAddress((address)&Runtime1::_generic_arraycopystub_cnt));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3152 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3153 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3154 __ call(RuntimeAddress(copyfunc_addr));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3155 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3156 __ addptr(rsp, 6*wordSize);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3157 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3158 __ mov(c_rarg4, j_rarg4);
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3159 if (copyfunc_addr == NULL) { // Use C version if stub was not generated
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3160 __ call(RuntimeAddress(C_entry));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3161 } else {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3162 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3163 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3164 __ incrementl(ExternalAddress((address)&Runtime1::_generic_arraycopystub_cnt));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3165 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3166 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3167 __ call(RuntimeAddress(copyfunc_addr));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3168 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3169 #endif // _WIN64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3170 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3171 __ push(length);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3172 __ push(dst_pos);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3173 __ push(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3174 __ push(src_pos);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3175 __ push(src);
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3176
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3177 if (copyfunc_addr == NULL) { // Use C version if stub was not generated
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3178 __ call_VM_leaf(C_entry, 5); // removes pushed parameter from the stack
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3179 } else {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3180 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3181 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3182 __ incrementl(ExternalAddress((address)&Runtime1::_generic_arraycopystub_cnt));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3183 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3184 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3185 __ call_VM_leaf(copyfunc_addr, 5); // removes pushed parameter from the stack
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3186 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3187
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3188 #endif // _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3189
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 __ cmpl(rax, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 __ jcc(Assembler::equal, *stub->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3193 if (copyfunc_addr != NULL) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3194 __ mov(tmp, rax);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3195 __ xorl(tmp, -1);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3196 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3197
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 // Reload values from the stack so they are where the stub
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 // expects them.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3200 __ movptr (dst, Address(rsp, 0*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3201 __ movptr (dst_pos, Address(rsp, 1*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3202 __ movptr (length, Address(rsp, 2*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3203 __ movptr (src_pos, Address(rsp, 3*BytesPerWord));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3204 __ movptr (src, Address(rsp, 4*BytesPerWord));
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3205
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3206 if (copyfunc_addr != NULL) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3207 __ subl(length, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3208 __ addl(src_pos, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3209 __ addl(dst_pos, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3210 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 __ jmp(*stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3212
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 __ bind(*stub->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3216
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 assert(default_type != NULL && default_type->is_array_klass() && default_type->is_loaded(), "must be true at this point");
a61af66fc99e Initial load
duke
parents:
diff changeset
3218
29
d5fc211aea19 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 0
diff changeset
3219 int elem_size = type2aelembytes(basic_type);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 int shift_amount;
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 Address::ScaleFactor scale;
a61af66fc99e Initial load
duke
parents:
diff changeset
3222
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 switch (elem_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 case 1 :
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 shift_amount = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 scale = Address::times_1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 case 2 :
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 shift_amount = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 scale = Address::times_2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 case 4 :
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 shift_amount = 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 scale = Address::times_4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3235 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 case 8 :
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 shift_amount = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 scale = Address::times_8;
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3243
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 Address src_length_addr = Address(src, arrayOopDesc::length_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 Address dst_length_addr = Address(dst, arrayOopDesc::length_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 Address src_klass_addr = Address(src, oopDesc::klass_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 Address dst_klass_addr = Address(dst, oopDesc::klass_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
3248
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3249 // length and pos's are all sign extended at this point on 64bit
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3250
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 // test for NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 if (flags & LIR_OpArrayCopy::src_null_check) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3253 __ testptr(src, src);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 __ jcc(Assembler::zero, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 if (flags & LIR_OpArrayCopy::dst_null_check) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3257 __ testptr(dst, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 __ jcc(Assembler::zero, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3260
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 // check if negative
a61af66fc99e Initial load
duke
parents:
diff changeset
3262 if (flags & LIR_OpArrayCopy::src_pos_positive_check) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3263 __ testl(src_pos, src_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 __ jcc(Assembler::less, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3266 if (flags & LIR_OpArrayCopy::dst_pos_positive_check) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3267 __ testl(dst_pos, dst_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 __ jcc(Assembler::less, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3270
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 if (flags & LIR_OpArrayCopy::src_range_check) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3272 __ lea(tmp, Address(src_pos, length, Address::times_1, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 __ cmpl(tmp, src_length_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 __ jcc(Assembler::above, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3276 if (flags & LIR_OpArrayCopy::dst_range_check) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3277 __ lea(tmp, Address(dst_pos, length, Address::times_1, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 __ cmpl(tmp, dst_length_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 __ jcc(Assembler::above, *stub->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3281
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3282 if (flags & LIR_OpArrayCopy::length_positive_check) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3283 __ testl(length, length);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3284 __ jcc(Assembler::less, *stub->entry());
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3285 __ jcc(Assembler::zero, *stub->continuation());
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3286 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3287
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3288 #ifdef _LP64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3289 __ movl2ptr(src_pos, src_pos); //higher 32bits must be null
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3290 __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3291 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3292
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3293 if (flags & LIR_OpArrayCopy::type_check) {
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3294 // We don't know the array types are compatible
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3295 if (basic_type != T_OBJECT) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3296 // Simple test for basic type arrays
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3297 if (UseCompressedOops) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3298 __ movl(tmp, src_klass_addr);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3299 __ cmpl(tmp, dst_klass_addr);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3300 } else {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3301 __ movptr(tmp, src_klass_addr);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3302 __ cmpptr(tmp, dst_klass_addr);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3303 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3304 __ jcc(Assembler::notEqual, *stub->entry());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3305 } else {
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3306 // For object arrays, if src is a sub class of dst then we can
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3307 // safely do the copy.
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3308 Label cont, slow;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3309
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3310 __ push(src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3311 __ push(dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3312
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3313 __ load_klass(src, src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3314 __ load_klass(dst, dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3315
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3316 __ check_klass_subtype_fast_path(src, dst, tmp, &cont, &slow, NULL);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3317
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3318 __ push(src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3319 __ push(dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3320 __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3321 __ pop(dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3322 __ pop(src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3323
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3324 __ cmpl(src, 0);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3325 __ jcc(Assembler::notEqual, cont);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3326
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3327 __ bind(slow);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3328 __ pop(dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3329 __ pop(src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3330
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3331 address copyfunc_addr = StubRoutines::checkcast_arraycopy();
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3332 if (copyfunc_addr != NULL) { // use stub if available
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3333 // src is not a sub class of dst so we have to do a
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3334 // per-element check.
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3335
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3336 int mask = LIR_OpArrayCopy::src_objarray|LIR_OpArrayCopy::dst_objarray;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3337 if ((flags & mask) != mask) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3338 // Check that at least both of them object arrays.
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3339 assert(flags & mask, "one of the two should be known to be an object array");
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3340
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3341 if (!(flags & LIR_OpArrayCopy::src_objarray)) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3342 __ load_klass(tmp, src);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3343 } else if (!(flags & LIR_OpArrayCopy::dst_objarray)) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3344 __ load_klass(tmp, dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3345 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3346 int lh_offset = klassOopDesc::header_size() * HeapWordSize +
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3347 Klass::layout_helper_offset_in_bytes();
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3348 Address klass_lh_addr(tmp, lh_offset);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3349 jint objArray_lh = Klass::array_layout_helper(T_OBJECT);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3350 __ cmpl(klass_lh_addr, objArray_lh);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3351 __ jcc(Assembler::notEqual, *stub->entry());
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3352 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3353
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3354 #ifndef _LP64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3355 // save caller save registers
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3356 store_parameter(rax, 2);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3357 store_parameter(rcx, 1);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3358 store_parameter(rdx, 0);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3359
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3360 __ movptr(tmp, dst_klass_addr);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3361 __ movptr(tmp, Address(tmp, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3362 __ push(tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3363 __ movl(tmp, Address(tmp, Klass::super_check_offset_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3364 __ push(tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3365 __ push(length);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3366 __ lea(tmp, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3367 __ push(tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3368 __ lea(tmp, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3369 __ push(tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3370
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3371 __ call_VM_leaf(copyfunc_addr, 5);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3372 #else
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3373 __ movl2ptr(length, length); //higher 32bits must be null
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3374
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3375 // save caller save registers: copy them to callee save registers
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3376 __ mov(rbx, rdx);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3377 __ mov(r13, r8);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3378 __ mov(r14, r9);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3379 #ifndef _WIN64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3380 store_parameter(rsi, 1);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3381 store_parameter(rcx, 0);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3382 // on WIN64 other incoming parameters are in rdi and rsi saved
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3383 // across the call
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3384 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3385
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3386 __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3387 assert_different_registers(c_rarg0, dst, dst_pos, length);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3388 __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3389 assert_different_registers(c_rarg1, dst, length);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3390
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3391 __ mov(c_rarg2, length);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3392 assert_different_registers(c_rarg2, dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3393
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3394 #ifdef _WIN64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3395 // Allocate abi space for args but be sure to keep stack aligned
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3396 __ subptr(rsp, 6*wordSize);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3397 __ load_klass(c_rarg3, dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3398 __ movptr(c_rarg3, Address(c_rarg3, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3399 store_parameter(c_rarg3, 4);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3400 __ movl(c_rarg3, Address(c_rarg3, Klass::super_check_offset_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3401 __ call(RuntimeAddress(copyfunc_addr));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3402 __ addptr(rsp, 6*wordSize);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3403 #else
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3404 __ load_klass(c_rarg4, dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3405 __ movptr(c_rarg4, Address(c_rarg4, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3406 __ movl(c_rarg3, Address(c_rarg4, Klass::super_check_offset_offset_in_bytes() + sizeof(oopDesc)));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3407 __ call(RuntimeAddress(copyfunc_addr));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3408 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3409
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3410 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3411
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3412 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3413 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3414 Label failed;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3415 __ testl(rax, rax);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3416 __ jcc(Assembler::notZero, failed);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3417 __ incrementl(ExternalAddress((address)&Runtime1::_arraycopy_checkcast_cnt));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3418 __ bind(failed);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3419 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3420 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3421
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3422 __ testl(rax, rax);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3423 __ jcc(Assembler::zero, *stub->continuation());
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3424
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3425 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3426 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3427 __ incrementl(ExternalAddress((address)&Runtime1::_arraycopy_checkcast_attempt_cnt));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3428 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3429 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3430
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3431 __ mov(tmp, rax);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3432
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3433 __ xorl(tmp, -1);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3434
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3435 #ifndef _LP64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3436 // restore caller save registers
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3437 assert_different_registers(tmp, rdx, rcx, rax); // result of stub will be lost
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3438 __ movptr(rdx, Address(rsp, 0*BytesPerWord));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3439 __ movptr(rcx, Address(rsp, 1*BytesPerWord));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3440 __ movptr(rax, Address(rsp, 2*BytesPerWord));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3441 #else
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3442 // restore caller save registers
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3443 __ mov(rdx, rbx);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3444 __ mov(r8, r13);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3445 __ mov(r9, r14);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3446 #ifndef _WIN64
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3447 assert_different_registers(tmp, rdx, r8, r9, rcx, rsi); // result of stub will be lost
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3448 __ movptr(rcx, Address(rsp, 0*BytesPerWord));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3449 __ movptr(rsi, Address(rsp, 1*BytesPerWord));
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3450 #else
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3451 assert_different_registers(tmp, rdx, r8, r9); // result of stub will be lost
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3452 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3453 #endif
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3454
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3455 __ subl(length, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3456 __ addl(src_pos, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3457 __ addl(dst_pos, tmp);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3458 }
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3459
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3460 __ jmp(*stub->entry());
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3461
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3462 __ bind(cont);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3463 __ pop(dst);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3464 __ pop(src);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3465 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3467
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 if (basic_type != T_OBJECT || !(flags & LIR_OpArrayCopy::type_check)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 // Sanity check the known type with the incoming class. For the
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 // primitive case the types must match exactly with src.klass and
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 // dst.klass each exactly matching the default type. For the
a61af66fc99e Initial load
duke
parents:
diff changeset
3473 // object array case, if no type check is needed then either the
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 // dst type is exactly the expected type and the src type is a
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // subtype which we can't check or src is the same array as dst
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 // but not necessarily exactly of type default_type.
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 Label known_ok, halt;
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 780
diff changeset
3478 __ movoop(tmp, default_type->constant_encoding());
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3479 #ifdef _LP64
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3480 if (UseCompressedOops) {
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3481 __ encode_heap_oop(tmp);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3482 }
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3483 #endif
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3484
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 if (basic_type != T_OBJECT) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3486
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3487 if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3488 else __ cmpptr(tmp, dst_klass_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 __ jcc(Assembler::notEqual, halt);
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3490 if (UseCompressedOops) __ cmpl(tmp, src_klass_addr);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3491 else __ cmpptr(tmp, src_klass_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 __ jcc(Assembler::equal, known_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3493 } else {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3494 if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3495 else __ cmpptr(tmp, dst_klass_addr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 __ jcc(Assembler::equal, known_ok);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3497 __ cmpptr(src, dst);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 __ jcc(Assembler::equal, known_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 __ bind(halt);
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 __ stop("incorrect type information in arraycopy");
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 __ bind(known_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
3505
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3506 #ifndef PRODUCT
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3507 if (PrintC1Statistics) {
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3508 __ incrementl(ExternalAddress(Runtime1::arraycopy_count_address(basic_type)));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3509 }
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3510 #endif
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3511
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3512 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3513 assert_different_registers(c_rarg0, dst, dst_pos, length);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3514 __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3515 assert_different_registers(c_rarg1, length);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3516 __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3517 __ mov(c_rarg2, length);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3518
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3519 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3520 __ lea(tmp, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 store_parameter(tmp, 0);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3522 __ lea(tmp, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 store_parameter(tmp, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 store_parameter(length, 2);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3525 #endif // _LP64
2446
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3526
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3527 bool disjoint = (flags & LIR_OpArrayCopy::overlapping) == 0;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3528 bool aligned = (flags & LIR_OpArrayCopy::unaligned) == 0;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3529 const char *name;
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3530 address entry = StubRoutines::select_arraycopy_function(basic_type, aligned, disjoint, name, false);
13bc79b5c9c8 7033154: Improve C1 arraycopy performance
roland
parents: 2415
diff changeset
3531 __ call_VM_leaf(entry, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3532
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 __ bind(*stub->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3535
a61af66fc99e Initial load
duke
parents:
diff changeset
3536
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 void LIR_Assembler::emit_lock(LIR_OpLock* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 Register obj = op->obj_opr()->as_register(); // may not be an oop
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 Register hdr = op->hdr_opr()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 Register lock = op->lock_opr()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 if (!UseFastLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 __ jmp(*op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 } else if (op->code() == lir_lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 Register scratch = noreg;
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 scratch = op->scratch_opr()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 // add debug info for NullPointerException only if one is possible
a61af66fc99e Initial load
duke
parents:
diff changeset
3550 int null_check_offset = __ lock_object(hdr, obj, lock, scratch, *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 if (op->info() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 add_debug_info_for_null_check(null_check_offset, op->info());
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 // done
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 } else if (op->code() == lir_unlock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 __ unlock_object(hdr, obj, lock, *op->stub()->entry());
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 __ bind(*op->stub()->continuation());
a61af66fc99e Initial load
duke
parents:
diff changeset
3562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3563
a61af66fc99e Initial load
duke
parents:
diff changeset
3564
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3566 ciMethod* method = op->profiled_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 int bci = op->profiled_bci();
a61af66fc99e Initial load
duke
parents:
diff changeset
3568
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 // Update counter for all call types
2007
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
3570 ciMethodData* md = method->method_data_or_null();
5ddfcf4b079e 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 2002
diff changeset
3571 assert(md != NULL, "Sanity");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 ciProfileData* data = md->bci_to_data(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 assert(data->is_CounterData(), "need CounterData for calls");
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 assert(op->mdo()->is_single_cpu(), "mdo must be allocated");
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 Register mdo = op->mdo()->as_register();
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 780
diff changeset
3576 __ movoop(mdo, md->constant_encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 Bytecodes::Code bc = method->java_code_at_bci(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 // Perform additional virtual call profiling for invokevirtual and
a61af66fc99e Initial load
duke
parents:
diff changeset
3580 // invokeinterface bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 if ((bc == Bytecodes::_invokevirtual || bc == Bytecodes::_invokeinterface) &&
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3582 C1ProfileVirtualCalls) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 assert(op->recv()->is_single_cpu(), "recv must be allocated");
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 Register recv = op->recv()->as_register();
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 assert_different_registers(mdo, recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls");
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 ciKlass* known_klass = op->known_holder();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3588 if (C1OptimizeVirtualCallProfiling && known_klass != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 // We know the type that will be seen at this call site; we can
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 // statically update the methodDataOop rather than needing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 // dynamic tests on the receiver type
a61af66fc99e Initial load
duke
parents:
diff changeset
3592
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 // NOTE: we should probably put a lock around this search to
a61af66fc99e Initial load
duke
parents:
diff changeset
3594 // avoid collisions by concurrent compilations
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 uint i;
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 for (i = 0; i < VirtualCallData::row_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 ciKlass* receiver = vc_data->receiver(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 if (known_klass->equals(receiver)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3601 __ addptr(data_addr, DataLayout::counter_increment);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3605
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 // Receiver type not found in profile data; select an empty slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3607
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 // Note that this is less efficient than it should be because it
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 // always does a write to the receiver part of the
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 // VirtualCallData rather than just the first time
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 for (i = 0; i < VirtualCallData::row_limit(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 ciKlass* receiver = vc_data->receiver(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 if (receiver == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)));
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 780
diff changeset
3615 __ movoop(recv_addr, known_klass->constant_encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3617 __ addptr(data_addr, DataLayout::counter_increment);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 } else {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
3622 __ load_klass(recv, recv);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 Label update_done;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3624 type_profile_helper(mdo, md, data, recv, &update_done);
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
3625 // Receiver did not match any saved receiver and there is no empty row for it.
1251
576e77447e3c 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 1206
diff changeset
3626 // Increment total counter to indicate polymorphic case.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3627 __ addptr(counter_addr, DataLayout::counter_increment);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3628
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 __ bind(update_done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 }
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
3631 } else {
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1204
diff changeset
3632 // Static call
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1579
diff changeset
3633 __ addptr(counter_addr, DataLayout::counter_increment);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3636
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 void LIR_Assembler::emit_delay(LIR_OpDelay*) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3640
a61af66fc99e Initial load
duke
parents:
diff changeset
3641
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3643 __ lea(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3645
a61af66fc99e Initial load
duke
parents:
diff changeset
3646
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 void LIR_Assembler::align_backward_branch_target() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 __ align(BytesPerWord);
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3650
a61af66fc99e Initial load
duke
parents:
diff changeset
3651
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 if (left->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3654 __ negl(left->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 move_regs(left->as_register(), dest->as_register());
a61af66fc99e Initial load
duke
parents:
diff changeset
3656
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 } else if (left->is_double_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 Register lo = left->as_register_lo();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3659 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3660 Register dst = dest->as_register_lo();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3661 __ movptr(dst, lo);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3662 __ negptr(dst);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3663 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 Register hi = left->as_register_hi();
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 __ lneg(hi, lo);
a61af66fc99e Initial load
duke
parents:
diff changeset
3666 if (dest->as_register_lo() == hi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 assert(dest->as_register_hi() != lo, "destroying register");
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 move_regs(hi, dest->as_register_hi());
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 move_regs(lo, dest->as_register_lo());
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 move_regs(lo, dest->as_register_lo());
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 move_regs(hi, dest->as_register_hi());
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3674 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3675
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 } else if (dest->is_single_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 __ xorps(dest->as_xmm_float_reg(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3681 ExternalAddress((address)float_signflip_pool));
a61af66fc99e Initial load
duke
parents:
diff changeset
3682
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 } else if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
3686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3687 __ xorpd(dest->as_xmm_double_reg(),
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 ExternalAddress((address)double_signflip_pool));
a61af66fc99e Initial load
duke
parents:
diff changeset
3689
a61af66fc99e Initial load
duke
parents:
diff changeset
3690 } else if (left->is_single_fpu() || left->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3691 assert(left->fpu() == 0, "arg must be on TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 assert(dest->fpu() == 0, "dest must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 __ fchs();
a61af66fc99e Initial load
duke
parents:
diff changeset
3694
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3699
a61af66fc99e Initial load
duke
parents:
diff changeset
3700
a61af66fc99e Initial load
duke
parents:
diff changeset
3701 void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 assert(addr->is_address() && dest->is_register(), "check");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3703 Register reg;
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3704 reg = dest->as_pointer_register();
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3705 __ lea(reg, as_Address(addr->as_address_ptr()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3707
a61af66fc99e Initial load
duke
parents:
diff changeset
3708
a61af66fc99e Initial load
duke
parents:
diff changeset
3709
a61af66fc99e Initial load
duke
parents:
diff changeset
3710 void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 assert(!tmp->is_valid(), "don't need temporary");
a61af66fc99e Initial load
duke
parents:
diff changeset
3712 __ call(RuntimeAddress(dest));
a61af66fc99e Initial load
duke
parents:
diff changeset
3713 if (info != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 add_call_info_here(info);
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3717
a61af66fc99e Initial load
duke
parents:
diff changeset
3718
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 void LIR_Assembler::volatile_move_op(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 assert(type == T_LONG, "only for volatile long fields");
a61af66fc99e Initial load
duke
parents:
diff changeset
3721
a61af66fc99e Initial load
duke
parents:
diff changeset
3722 if (info != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3723 add_debug_info_for_null_check_here(info);
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3725
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 if (src->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 if (dest->is_double_cpu()) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3728 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3729 __ movdq(dest->as_register_lo(), src->as_xmm_double_reg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3730 #else
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3731 __ movdl(dest->as_register_lo(), src->as_xmm_double_reg());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 __ psrlq(src->as_xmm_double_reg(), 32);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3733 __ movdl(dest->as_register_hi(), src->as_xmm_double_reg());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3734 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3735 } else if (dest->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3736 __ movdbl(frame_map()->address_for_slot(dest->double_stack_ix()), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 } else if (dest->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 __ movdbl(as_Address(dest->as_address_ptr()), src->as_xmm_double_reg());
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3740 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3742
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 } else if (dest->is_double_xmm()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 if (src->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 __ movdbl(dest->as_xmm_double_reg(), frame_map()->address_for_slot(src->double_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3746 } else if (src->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 __ movdbl(dest->as_xmm_double_reg(), as_Address(src->as_address_ptr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3748 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3749 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3751
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 } else if (src->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 assert(src->fpu_regnrLo() == 0, "must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 if (dest->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3755 __ fistp_d(frame_map()->address_for_slot(dest->double_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 } else if (dest->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 __ fistp_d(as_Address(dest->as_address_ptr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3758 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3761
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 } else if (dest->is_double_fpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 assert(dest->fpu_regnrLo() == 0, "must be TOS");
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 if (src->is_double_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3765 __ fild_d(frame_map()->address_for_slot(src->double_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 } else if (src->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 __ fild_d(as_Address(src->as_address_ptr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3768 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3771 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3775
a61af66fc99e Initial load
duke
parents:
diff changeset
3776
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 void LIR_Assembler::membar() {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3778 // QQQ sparc TSO uses this,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3779 __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3781
a61af66fc99e Initial load
duke
parents:
diff changeset
3782 void LIR_Assembler::membar_acquire() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 // No x86 machines currently require load fences
a61af66fc99e Initial load
duke
parents:
diff changeset
3784 // __ load_fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3786
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 void LIR_Assembler::membar_release() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 // No x86 machines currently require store fences
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 // __ store_fence();
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3791
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 void LIR_Assembler::get_thread(LIR_Opr result_reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3793 assert(result_reg->is_register(), "check");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3794 #ifdef _LP64
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3795 // __ get_thread(result_reg->as_register_lo());
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3796 __ mov(result_reg->as_register(), r15_thread);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3797 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3798 __ get_thread(result_reg->as_register());
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3799 #endif // _LP64
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3801
a61af66fc99e Initial load
duke
parents:
diff changeset
3802
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 void LIR_Assembler::peephole(LIR_List*) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 // do nothing for now
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3806
a61af66fc99e Initial load
duke
parents:
diff changeset
3807
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 #undef __