annotate src/cpu/x86/vm/templateTable_x86_64.cpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents 8033953d67ff
children 92add02409c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1976
diff changeset
2 * Copyright (c) 2003, 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: 1506
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1506
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: 1506
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: 1913
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
26 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
27 #include "interpreter/interpreterRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
28 #include "interpreter/templateTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
29 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "oops/methodDataOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "oops/objArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
33 #include "prims/methodHandles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
34 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
35 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
36 #include "runtime/synchronizer.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
38 #ifndef CC_INTERP
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
39
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40 #define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Platform-dependent initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 void TemplateTable::pd_initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // No amd64 specific initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
46 }
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Address computation: local variables
a61af66fc99e Initial load
duke
parents:
diff changeset
49
a61af66fc99e Initial load
duke
parents:
diff changeset
50 static inline Address iaddress(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
51 return Address(r14, Interpreter::local_offset_in_bytes(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 static inline Address laddress(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 return iaddress(n + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 static inline Address faddress(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 return iaddress(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 static inline Address daddress(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 return laddress(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 }
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 static inline Address aaddress(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 return iaddress(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static inline Address iaddress(Register r) {
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
71 return Address(r14, r, Address::times_8);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 static inline Address laddress(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 return Address(r14, r, Address::times_8, Interpreter::local_offset_in_bytes(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 static inline Address faddress(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
79 return iaddress(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static inline Address daddress(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 return laddress(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 }
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static inline Address aaddress(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 return iaddress(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 static inline Address at_rsp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 return Address(rsp, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // At top of Java expression stack which may be different than esp(). It
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // isn't for category 1 objects.
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static inline Address at_tos () {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 return Address(rsp, Interpreter::expr_offset_in_bytes(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 static inline Address at_tos_p1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 return Address(rsp, Interpreter::expr_offset_in_bytes(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static inline Address at_tos_p2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 return Address(rsp, Interpreter::expr_offset_in_bytes(2));
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static inline Address at_tos_p3() {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 return Address(rsp, Interpreter::expr_offset_in_bytes(3));
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // Condition conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static Assembler::Condition j_not(TemplateTable::Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 switch (cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 case TemplateTable::equal : return Assembler::notEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 case TemplateTable::not_equal : return Assembler::equal;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 case TemplateTable::less : return Assembler::greaterEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 case TemplateTable::less_equal : return Assembler::greater;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 case TemplateTable::greater : return Assembler::lessEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 case TemplateTable::greater_equal: return Assembler::less;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
123 return Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Miscelaneous helper routines
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
128 // Store an oop (or NULL) at the address described by obj.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
129 // If val == noreg this means store a NULL
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
130
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
131 static void do_oop_store(InterpreterMacroAssembler* _masm,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
132 Address obj,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
133 Register val,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
134 BarrierSet::Name barrier,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
135 bool precise) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
136 assert(val == noreg || val == rax, "parameter is just for looks");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
137 switch (barrier) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
138 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
139 case BarrierSet::G1SATBCT:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
140 case BarrierSet::G1SATBCTLogging:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
141 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
142 // flatten object address if needed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
143 if (obj.index() == noreg && obj.disp() == 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
144 if (obj.base() != rdx) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
145 __ movq(rdx, obj.base());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
146 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
147 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
148 __ leaq(rdx, obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
149 }
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
150 __ g1_write_barrier_pre(rdx /* obj */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
151 rbx /* pre_val */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
152 r15_thread /* thread */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
153 r8 /* tmp */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
154 val != noreg /* tosca_live */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
155 false /* expand_call */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
156 if (val == noreg) {
1047
beb8f45ee9f0 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 844
diff changeset
157 __ store_heap_oop_null(Address(rdx, 0));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
158 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
159 __ store_heap_oop(Address(rdx, 0), val);
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
160 __ g1_write_barrier_post(rdx /* store_adr */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
161 val /* new_val */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
162 r15_thread /* thread */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
163 r8 /* tmp */,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2357
diff changeset
164 rbx /* tmp2 */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
165 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
166
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
167 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
168 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
169 #endif // SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
170 case BarrierSet::CardTableModRef:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
171 case BarrierSet::CardTableExtension:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
172 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
173 if (val == noreg) {
1047
beb8f45ee9f0 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 844
diff changeset
174 __ store_heap_oop_null(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
175 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
176 __ store_heap_oop(obj, val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
177 // flatten object address if needed
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
178 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
179 __ store_check(obj.base());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
180 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
181 __ leaq(rdx, obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
182 __ store_check(rdx);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
183 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
184 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
185 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
186 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
187 case BarrierSet::ModRef:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
188 case BarrierSet::Other:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
189 if (val == noreg) {
1047
beb8f45ee9f0 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 844
diff changeset
190 __ store_heap_oop_null(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
191 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
192 __ store_heap_oop(obj, val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
193 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
194 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
195 default :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
196 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
197
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
198 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
199 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 Address TemplateTable::at_bcp(int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return Address(r13, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
a61af66fc99e Initial load
duke
parents:
diff changeset
207 Register scratch,
a61af66fc99e Initial load
duke
parents:
diff changeset
208 bool load_bc_into_scratch/*=true*/) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (!RewriteBytecodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // the pair bytecodes have already done the load.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (load_bc_into_scratch) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 __ movl(bc, bytecode);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 Label patch_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (JvmtiExport::can_post_breakpoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Label fast_patch;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // if a breakpoint is present we can't rewrite the stream directly
a61af66fc99e Initial load
duke
parents:
diff changeset
220 __ movzbl(scratch, at_bcp(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
221 __ cmpl(scratch, Bytecodes::_breakpoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 __ jcc(Assembler::notEqual, fast_patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 __ get_method(scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Let breakpoint table handling rewrite to quicker bytecode
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
225 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), scratch, r13, bc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 #ifndef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
227 __ jmpb(patch_done);
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
228 #else
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
229 __ jmp(patch_done);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
230 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 __ bind(fast_patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
233 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 Label okay;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 __ load_unsigned_byte(scratch, at_bcp(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
236 __ cmpl(scratch, (int) Bytecodes::java_code(bytecode));
a61af66fc99e Initial load
duke
parents:
diff changeset
237 __ jcc(Assembler::equal, okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 __ cmpl(scratch, bc);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 __ jcc(Assembler::equal, okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 __ stop("patching the wrong bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
241 __ bind(okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // patch bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
244 __ movb(at_bcp(0), bc);
a61af66fc99e Initial load
duke
parents:
diff changeset
245 __ bind(patch_done);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 // Individual instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void TemplateTable::nop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255
a61af66fc99e Initial load
duke
parents:
diff changeset
256 void TemplateTable::shouldnotreachhere() {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 __ stop("shouldnotreachhere bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void TemplateTable::aconst_null() {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 __ xorl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void TemplateTable::iconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (value == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 __ xorl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 __ movl(rax, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275 void TemplateTable::lconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 if (value == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 __ xorl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 __ movl(rax, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 void TemplateTable::fconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 static float one = 1.0f, two = 2.0f;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 switch (value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
289 __ xorps(xmm0, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
292 __ movflt(xmm0, ExternalAddress((address) &one));
a61af66fc99e Initial load
duke
parents:
diff changeset
293 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
295 __ movflt(xmm0, ExternalAddress((address) &two));
a61af66fc99e Initial load
duke
parents:
diff changeset
296 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
298 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 }
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 void TemplateTable::dconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
304 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 static double one = 1.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 switch (value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 __ xorpd(xmm0, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
311 __ movdbl(xmm0, ExternalAddress((address) &one));
a61af66fc99e Initial load
duke
parents:
diff changeset
312 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
313 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
314 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void TemplateTable::bipush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 __ load_signed_byte(rax, at_bcp(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
322 }
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 void TemplateTable::sipush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 transition(vtos, itos);
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
326 __ load_unsigned_short(rax, at_bcp(1));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 __ bswapl(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 __ sarl(rax, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 void TemplateTable::ldc(bool wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 Label call_ldc, notFloat, notClass, Done;
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 if (wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 __ load_unsigned_byte(rbx, at_bcp(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 __ get_cpool_and_tags(rcx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
342 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // get type
a61af66fc99e Initial load
duke
parents:
diff changeset
346 __ movzbl(rdx, Address(rax, rbx, Address::times_1, tags_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // unresolved string - get the resolved string
a61af66fc99e Initial load
duke
parents:
diff changeset
349 __ cmpl(rdx, JVM_CONSTANT_UnresolvedString);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 __ jccb(Assembler::equal, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 // unresolved class - get the resolved class
a61af66fc99e Initial load
duke
parents:
diff changeset
353 __ cmpl(rdx, JVM_CONSTANT_UnresolvedClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 __ jccb(Assembler::equal, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // unresolved class in error state - call into runtime to throw the error
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // from the first resolution attempt
a61af66fc99e Initial load
duke
parents:
diff changeset
358 __ cmpl(rdx, JVM_CONSTANT_UnresolvedClassInError);
a61af66fc99e Initial load
duke
parents:
diff changeset
359 __ jccb(Assembler::equal, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // resolved class - need to call vm to get java mirror of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
362 __ cmpl(rdx, JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
363 __ jcc(Assembler::notEqual, notClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 __ bind(call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 __ movl(c_rarg1, wide);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 __ push_ptr(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
369 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372 __ bind(notClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
373 __ cmpl(rdx, JVM_CONSTANT_Float);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 __ jccb(Assembler::notEqual, notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // ftos
a61af66fc99e Initial load
duke
parents:
diff changeset
376 __ movflt(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
377 __ push_f();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 __ bind(notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
382 {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
384 __ cmpl(rdx, JVM_CONSTANT_Integer);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 __ jcc(Assembler::equal, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
386 __ cmpl(rdx, JVM_CONSTANT_String);
a61af66fc99e Initial load
duke
parents:
diff changeset
387 __ jcc(Assembler::equal, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 __ stop("unexpected tag type in ldc");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // atos and itos
a61af66fc99e Initial load
duke
parents:
diff changeset
393 Label isOop;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 __ cmpl(rdx, JVM_CONSTANT_Integer);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 __ jcc(Assembler::notEqual, isOop);
a61af66fc99e Initial load
duke
parents:
diff changeset
396 __ movl(rax, Address(rcx, rbx, Address::times_8, base_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
397 __ push_i(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
398 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 __ bind(isOop);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
401 __ movptr(rax, Address(rcx, rbx, Address::times_8, base_offset));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
402 __ push_ptr(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 __ bind(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
411 // Fast path for caching oop constants.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
412 // %%% We should use this to handle Class and String constants also.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
413 // %%% It will simplify the ldc/primitive path considerably.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
414 void TemplateTable::fast_aldc(bool wide) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
415 transition(vtos, atos);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
416
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
417 if (!EnableMethodHandles) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
418 // We should not encounter this bytecode if !EnableMethodHandles.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
419 // The verifier will stop it. However, if we get past the verifier,
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
420 // this will stop the thread in a reasonable way, without crashing the JVM.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
421 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
422 InterpreterRuntime::throw_IncompatibleClassChangeError));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
423 // the call_VM checks for exception, so we should never return here.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
424 __ should_not_reach_here();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
425 return;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
426 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
427
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
428 const Register cache = rcx;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
429 const Register index = rdx;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
430
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
431 resolve_cache_and_index(f1_oop, rax, cache, index, wide ? sizeof(u2) : sizeof(u1));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
432 if (VerifyOops) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
433 __ verify_oop(rax);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
434 }
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
435
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
436 Label L_done, L_throw_exception;
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
437 const Register con_klass_temp = rcx; // same as cache
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
438 const Register array_klass_temp = rdx; // same as index
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
439 __ movptr(con_klass_temp, Address(rax, oopDesc::klass_offset_in_bytes()));
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
440 __ lea(array_klass_temp, ExternalAddress((address)Universe::systemObjArrayKlassObj_addr()));
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
441 __ cmpptr(con_klass_temp, Address(array_klass_temp, 0));
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
442 __ jcc(Assembler::notEqual, L_done);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
443 __ cmpl(Address(rax, arrayOopDesc::length_offset_in_bytes()), 0);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
444 __ jcc(Assembler::notEqual, L_throw_exception);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
445 __ xorptr(rax, rax);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
446 __ jmp(L_done);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
447
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
448 // Load the exception from the system-array which wraps it:
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
449 __ bind(L_throw_exception);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
450 __ movptr(rax, Address(rax, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
451 __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
452
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
453 __ bind(L_done);
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
454 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
455
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 void TemplateTable::ldc2_w() {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 Label Long, Done;
a61af66fc99e Initial load
duke
parents:
diff changeset
459 __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 __ get_cpool_and_tags(rcx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
463 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465 // get type
a61af66fc99e Initial load
duke
parents:
diff changeset
466 __ cmpb(Address(rax, rbx, Address::times_1, tags_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
467 JVM_CONSTANT_Double);
a61af66fc99e Initial load
duke
parents:
diff changeset
468 __ jccb(Assembler::notEqual, Long);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // dtos
a61af66fc99e Initial load
duke
parents:
diff changeset
470 __ movdbl(xmm0, Address(rcx, rbx, Address::times_8, base_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
471 __ push_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
472 __ jmpb(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 __ bind(Long);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // ltos
a61af66fc99e Initial load
duke
parents:
diff changeset
476 __ movq(rax, Address(rcx, rbx, Address::times_8, base_offset));
a61af66fc99e Initial load
duke
parents:
diff changeset
477 __ push_l();
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 __ bind(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 void TemplateTable::locals_index(Register reg, int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 __ load_unsigned_byte(reg, at_bcp(offset));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
484 __ negptr(reg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 void TemplateTable::iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 if (RewriteFrequentPairs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 Label rewrite, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 const Register bc = c_rarg3;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 assert(rbx != bc, "register damaged");
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // get next byte
a61af66fc99e Initial load
duke
parents:
diff changeset
495 __ load_unsigned_byte(rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
496 at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // if _iload, wait to rewrite to iload2. We only want to rewrite the
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // last two iloads in a pair. Comparing against fast_iload means that
a61af66fc99e Initial load
duke
parents:
diff changeset
499 // the next bytecode is neither an iload or a caload, and therefore
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // an iload pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
501 __ cmpl(rbx, Bytecodes::_iload);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 __ jcc(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 __ cmpl(rbx, Bytecodes::_fast_iload);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 __ movl(bc, Bytecodes::_fast_iload2);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 __ jccb(Assembler::equal, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // if _caload, rewrite to fast_icaload
a61af66fc99e Initial load
duke
parents:
diff changeset
509 __ cmpl(rbx, Bytecodes::_caload);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 __ movl(bc, Bytecodes::_fast_icaload);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 __ jccb(Assembler::equal, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // rewrite so iload doesn't check again.
a61af66fc99e Initial load
duke
parents:
diff changeset
514 __ movl(bc, Bytecodes::_fast_iload);
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // bc: fast bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
518 __ bind(rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 patch_bytecode(Bytecodes::_iload, bc, rbx, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523 // Get the local value into tos
a61af66fc99e Initial load
duke
parents:
diff changeset
524 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 void TemplateTable::fast_iload2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
530 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
531 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
532 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 locals_index(rbx, 3);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 void TemplateTable::fast_iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
538 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 void TemplateTable::lload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
545 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
546 __ movq(rax, laddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
548
a61af66fc99e Initial load
duke
parents:
diff changeset
549 void TemplateTable::fload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
552 __ movflt(xmm0, faddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
554
a61af66fc99e Initial load
duke
parents:
diff changeset
555 void TemplateTable::dload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
556 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
558 __ movdbl(xmm0, daddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void TemplateTable::aload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
562 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 locals_index(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
564 __ movptr(rax, aaddress(rbx));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 void TemplateTable::locals_index_wide(Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 __ movl(reg, at_bcp(2));
a61af66fc99e Initial load
duke
parents:
diff changeset
569 __ bswapl(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
570 __ shrl(reg, 16);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
571 __ negptr(reg);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 void TemplateTable::wide_iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
575 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
576 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
579
a61af66fc99e Initial load
duke
parents:
diff changeset
580 void TemplateTable::wide_lload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 __ movq(rax, laddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 void TemplateTable::wide_fload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
588 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
589 __ movflt(xmm0, faddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 void TemplateTable::wide_dload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
594 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
595 __ movdbl(xmm0, daddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 void TemplateTable::wide_aload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 locals_index_wide(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
601 __ movptr(rax, aaddress(rbx));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 void TemplateTable::index_check(Register array, Register index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // destroys rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
606 // check array
a61af66fc99e Initial load
duke
parents:
diff changeset
607 __ null_check(array, arrayOopDesc::length_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // sign extend index for use by indexed load
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
609 __ movl2ptr(index, index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // check index
a61af66fc99e Initial load
duke
parents:
diff changeset
611 __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
a61af66fc99e Initial load
duke
parents:
diff changeset
612 if (index != rbx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // ??? convention: move aberrant index into ebx for exception message
a61af66fc99e Initial load
duke
parents:
diff changeset
614 assert(rbx != array, "different registers");
a61af66fc99e Initial load
duke
parents:
diff changeset
615 __ movl(rbx, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 __ jump_cc(Assembler::aboveEqual,
a61af66fc99e Initial load
duke
parents:
diff changeset
618 ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
619 }
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void TemplateTable::iaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
622 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
623 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
626 index_check(rdx, rax); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
627 __ movl(rax, Address(rdx, rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
628 Address::times_4,
a61af66fc99e Initial load
duke
parents:
diff changeset
629 arrayOopDesc::base_offset_in_bytes(T_INT)));
a61af66fc99e Initial load
duke
parents:
diff changeset
630 }
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 void TemplateTable::laload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 transition(itos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
634 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
636 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
637 index_check(rdx, rax); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
638 __ movq(rax, Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
639 Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
640 arrayOopDesc::base_offset_in_bytes(T_LONG)));
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 void TemplateTable::faload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 transition(itos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
647 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
648 index_check(rdx, rax); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
649 __ movflt(xmm0, Address(rdx, rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
650 Address::times_4,
a61af66fc99e Initial load
duke
parents:
diff changeset
651 arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653
a61af66fc99e Initial load
duke
parents:
diff changeset
654 void TemplateTable::daload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
655 transition(itos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
659 index_check(rdx, rax); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
660 __ movdbl(xmm0, Address(rdx, rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
661 Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
662 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
a61af66fc99e Initial load
duke
parents:
diff changeset
663 }
a61af66fc99e Initial load
duke
parents:
diff changeset
664
a61af66fc99e Initial load
duke
parents:
diff changeset
665 void TemplateTable::aaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
667 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
669 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
670 index_check(rdx, rax); // kills rbx
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
671 __ load_heap_oop(rax, Address(rdx, rax,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
672 UseCompressedOops ? Address::times_4 : Address::times_8,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
673 arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 void TemplateTable::baload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
678 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
681 index_check(rdx, rax); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
682 __ load_signed_byte(rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
683 Address(rdx, rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
684 Address::times_1,
a61af66fc99e Initial load
duke
parents:
diff changeset
685 arrayOopDesc::base_offset_in_bytes(T_BYTE)));
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 void TemplateTable::caload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
689 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
690 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
693 index_check(rdx, rax); // kills rbx
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
694 __ load_unsigned_short(rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
695 Address(rdx, rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
696 Address::times_2,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
697 arrayOopDesc::base_offset_in_bytes(T_CHAR)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 // iload followed by caload frequent pair
a61af66fc99e Initial load
duke
parents:
diff changeset
701 void TemplateTable::fast_icaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // load index out of locals
a61af66fc99e Initial load
duke
parents:
diff changeset
704 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
705 __ movl(rax, iaddress(rbx));
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
708 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
709 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
710 index_check(rdx, rax); // kills rbx
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
711 __ load_unsigned_short(rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
712 Address(rdx, rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
713 Address::times_2,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
714 arrayOopDesc::base_offset_in_bytes(T_CHAR)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
715 }
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 void TemplateTable::saload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
719 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // eax: index
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
722 index_check(rdx, rax); // kills rbx
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
723 __ load_signed_short(rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
724 Address(rdx, rax,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
725 Address::times_2,
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
726 arrayOopDesc::base_offset_in_bytes(T_SHORT)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 void TemplateTable::iload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
730 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
731 __ movl(rax, iaddress(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 void TemplateTable::lload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 __ movq(rax, laddress(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738
a61af66fc99e Initial load
duke
parents:
diff changeset
739 void TemplateTable::fload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
740 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
741 __ movflt(xmm0, faddress(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
742 }
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 void TemplateTable::dload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
746 __ movdbl(xmm0, daddress(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
a61af66fc99e Initial load
duke
parents:
diff changeset
749 void TemplateTable::aload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 transition(vtos, atos);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
751 __ movptr(rax, aaddress(n));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
752 }
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 void TemplateTable::aload_0() {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
756 // According to bytecode histograms, the pairs:
a61af66fc99e Initial load
duke
parents:
diff changeset
757 //
a61af66fc99e Initial load
duke
parents:
diff changeset
758 // _aload_0, _fast_igetfield
a61af66fc99e Initial load
duke
parents:
diff changeset
759 // _aload_0, _fast_agetfield
a61af66fc99e Initial load
duke
parents:
diff changeset
760 // _aload_0, _fast_fgetfield
a61af66fc99e Initial load
duke
parents:
diff changeset
761 //
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // occur frequently. If RewriteFrequentPairs is set, the (slow)
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // _aload_0 bytecode checks if the next bytecode is either
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // rewrites the current bytecode into a pair bytecode; otherwise it
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // rewrites the current bytecode into _fast_aload_0 that doesn't do
a61af66fc99e Initial load
duke
parents:
diff changeset
767 // the pair check anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
768 //
a61af66fc99e Initial load
duke
parents:
diff changeset
769 // Note: If the next bytecode is _getfield, the rewrite must be
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // delayed, otherwise we may miss an opportunity for a pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
771 //
a61af66fc99e Initial load
duke
parents:
diff changeset
772 // Also rewrite frequent pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
773 // aload_0, aload_1
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // aload_0, iload_1
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // These bytecodes with a small amount of code are most profitable
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // to rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
777 if (RewriteFrequentPairs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 Label rewrite, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 const Register bc = c_rarg3;
a61af66fc99e Initial load
duke
parents:
diff changeset
780 assert(rbx != bc, "register damaged");
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // get next byte
a61af66fc99e Initial load
duke
parents:
diff changeset
782 __ load_unsigned_byte(rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
783 at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // do actual aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
786 aload(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // if _getfield then wait with rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
789 __ cmpl(rbx, Bytecodes::_getfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
790 __ jcc(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // if _igetfield then reqrite to _fast_iaccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
793 assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) ==
a61af66fc99e Initial load
duke
parents:
diff changeset
794 Bytecodes::_aload_0,
a61af66fc99e Initial load
duke
parents:
diff changeset
795 "fix bytecode definition");
a61af66fc99e Initial load
duke
parents:
diff changeset
796 __ cmpl(rbx, Bytecodes::_fast_igetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
797 __ movl(bc, Bytecodes::_fast_iaccess_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
798 __ jccb(Assembler::equal, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 // if _agetfield then reqrite to _fast_aaccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
801 assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) ==
a61af66fc99e Initial load
duke
parents:
diff changeset
802 Bytecodes::_aload_0,
a61af66fc99e Initial load
duke
parents:
diff changeset
803 "fix bytecode definition");
a61af66fc99e Initial load
duke
parents:
diff changeset
804 __ cmpl(rbx, Bytecodes::_fast_agetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
805 __ movl(bc, Bytecodes::_fast_aaccess_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
806 __ jccb(Assembler::equal, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 // if _fgetfield then reqrite to _fast_faccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) ==
a61af66fc99e Initial load
duke
parents:
diff changeset
810 Bytecodes::_aload_0,
a61af66fc99e Initial load
duke
parents:
diff changeset
811 "fix bytecode definition");
a61af66fc99e Initial load
duke
parents:
diff changeset
812 __ cmpl(rbx, Bytecodes::_fast_fgetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
813 __ movl(bc, Bytecodes::_fast_faccess_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
814 __ jccb(Assembler::equal, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816 // else rewrite to _fast_aload0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) ==
a61af66fc99e Initial load
duke
parents:
diff changeset
818 Bytecodes::_aload_0,
a61af66fc99e Initial load
duke
parents:
diff changeset
819 "fix bytecode definition");
a61af66fc99e Initial load
duke
parents:
diff changeset
820 __ movl(bc, Bytecodes::_fast_aload_0);
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 // rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // bc: fast bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
824 __ bind(rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
825 patch_bytecode(Bytecodes::_aload_0, bc, rbx, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
826
a61af66fc99e Initial load
duke
parents:
diff changeset
827 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
828 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 aload(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 }
a61af66fc99e Initial load
duke
parents:
diff changeset
832
a61af66fc99e Initial load
duke
parents:
diff changeset
833 void TemplateTable::istore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
834 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
835 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 __ movl(iaddress(rbx), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839 void TemplateTable::lstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 __ movq(laddress(rbx), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
a61af66fc99e Initial load
duke
parents:
diff changeset
845 void TemplateTable::fstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
846 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
847 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
848 __ movflt(faddress(rbx), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 void TemplateTable::dstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
852 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 __ movdbl(daddress(rbx), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
855 }
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 void TemplateTable::astore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
858 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
859 __ pop_ptr(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
860 locals_index(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
861 __ movptr(aaddress(rbx), rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
863
a61af66fc99e Initial load
duke
parents:
diff changeset
864 void TemplateTable::wide_istore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
865 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
866 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
867 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
868 __ movl(iaddress(rbx), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 void TemplateTable::wide_lstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
872 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
873 __ pop_l();
a61af66fc99e Initial load
duke
parents:
diff changeset
874 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
875 __ movq(laddress(rbx), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
876 }
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 void TemplateTable::wide_fstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
880 __ pop_f();
a61af66fc99e Initial load
duke
parents:
diff changeset
881 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 __ movflt(faddress(rbx), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
a61af66fc99e Initial load
duke
parents:
diff changeset
884
a61af66fc99e Initial load
duke
parents:
diff changeset
885 void TemplateTable::wide_dstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
887 __ pop_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
889 __ movdbl(daddress(rbx), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 }
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 void TemplateTable::wide_astore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
894 __ pop_ptr(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895 locals_index_wide(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
896 __ movptr(aaddress(rbx), rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898
a61af66fc99e Initial load
duke
parents:
diff changeset
899 void TemplateTable::iastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
900 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
902 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // eax: value
a61af66fc99e Initial load
duke
parents:
diff changeset
904 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
905 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
906 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
907 __ movl(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
908 Address::times_4,
a61af66fc99e Initial load
duke
parents:
diff changeset
909 arrayOopDesc::base_offset_in_bytes(T_INT)),
a61af66fc99e Initial load
duke
parents:
diff changeset
910 rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913 void TemplateTable::lastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
914 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
915 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // rax: value
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
919 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
920 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
921 __ movq(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
922 Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
923 arrayOopDesc::base_offset_in_bytes(T_LONG)),
a61af66fc99e Initial load
duke
parents:
diff changeset
924 rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
925 }
a61af66fc99e Initial load
duke
parents:
diff changeset
926
a61af66fc99e Initial load
duke
parents:
diff changeset
927 void TemplateTable::fastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
929 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
930 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
931 // xmm0: value
a61af66fc99e Initial load
duke
parents:
diff changeset
932 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
933 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
934 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
935 __ movflt(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
936 Address::times_4,
a61af66fc99e Initial load
duke
parents:
diff changeset
937 arrayOopDesc::base_offset_in_bytes(T_FLOAT)),
a61af66fc99e Initial load
duke
parents:
diff changeset
938 xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
939 }
a61af66fc99e Initial load
duke
parents:
diff changeset
940
a61af66fc99e Initial load
duke
parents:
diff changeset
941 void TemplateTable::dastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
942 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
943 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
944 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
945 // xmm0: value
a61af66fc99e Initial load
duke
parents:
diff changeset
946 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
948 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
949 __ movdbl(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
950 Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
951 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
a61af66fc99e Initial load
duke
parents:
diff changeset
952 xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
954
a61af66fc99e Initial load
duke
parents:
diff changeset
955 void TemplateTable::aastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 Label is_null, ok_is_subtype, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
957 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
958 // stack: ..., array, index, value
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
959 __ movptr(rax, at_tos()); // value
0
a61af66fc99e Initial load
duke
parents:
diff changeset
960 __ movl(rcx, at_tos_p1()); // index
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
961 __ movptr(rdx, at_tos_p2()); // array
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
962
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
963 Address element_address(rdx, rcx,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
964 UseCompressedOops? Address::times_4 : Address::times_8,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
965 arrayOopDesc::base_offset_in_bytes(T_OBJECT));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
966
0
a61af66fc99e Initial load
duke
parents:
diff changeset
967 index_check(rdx, rcx); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // do array store check - check for NULL value first
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
969 __ testptr(rax, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
970 __ jcc(Assembler::zero, is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 // Move subklass into rbx
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
973 __ load_klass(rbx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
974 // Move superklass into rax
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
975 __ load_klass(rax, rdx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
976 __ movptr(rax, Address(rax,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
977 sizeof(oopDesc) +
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
978 objArrayKlass::element_klass_offset_in_bytes()));
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
979 // Compress array + index*oopSize + 12 into a single register. Frees rcx.
362
apetrusenko
parents: 304 356
diff changeset
980 __ lea(rdx, element_address);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981
a61af66fc99e Initial load
duke
parents:
diff changeset
982 // Generate subtype check. Blows rcx, rdi
a61af66fc99e Initial load
duke
parents:
diff changeset
983 // Superklass in rax. Subklass in rbx.
a61af66fc99e Initial load
duke
parents:
diff changeset
984 __ gen_subtype_check(rbx, ok_is_subtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
985
a61af66fc99e Initial load
duke
parents:
diff changeset
986 // Come here on failure
a61af66fc99e Initial load
duke
parents:
diff changeset
987 // object is at TOS
a61af66fc99e Initial load
duke
parents:
diff changeset
988 __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // Come here on success
a61af66fc99e Initial load
duke
parents:
diff changeset
991 __ bind(ok_is_subtype);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
992
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
993 // Get the value we will store
362
apetrusenko
parents: 304 356
diff changeset
994 __ movptr(rax, at_tos());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
995 // Now store using the appropriate barrier
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
996 do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
997 __ jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
998
a61af66fc99e Initial load
duke
parents:
diff changeset
999 // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx]
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 __ bind(is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 __ profile_null_seen(rbx);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
1002
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
1003 // Store a NULL
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
1004 do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1005
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // Pop stack arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 __ bind(done);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1008 __ addptr(rsp, 3 * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1010
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 void TemplateTable::bastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 // eax: value
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 __ movb(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 Address::times_1,
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 arrayOopDesc::base_offset_in_bytes(T_BYTE)),
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1024
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 void TemplateTable::castore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 __ pop_i(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 __ pop_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // eax: value
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 // ebx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 // rdx: array
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 index_check(rdx, rbx); // prefer index in ebx
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 __ movw(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 Address::times_2,
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 arrayOopDesc::base_offset_in_bytes(T_CHAR)),
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1038
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 void TemplateTable::sastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 castore();
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 void TemplateTable::istore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 __ movl(iaddress(n), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1047
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 void TemplateTable::lstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 __ movq(laddress(n), rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1052
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 void TemplateTable::fstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 __ movflt(faddress(n), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 void TemplateTable::dstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 __ movdbl(daddress(n), xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1062
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 void TemplateTable::astore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1065 __ pop_ptr(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1066 __ movptr(aaddress(n), rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1068
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 void TemplateTable::pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1071 __ addptr(rsp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 void TemplateTable::pop2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1076 __ addptr(rsp, 2 * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1078
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 void TemplateTable::dup() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1081 __ load_ptr(0, rax);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1082 __ push_ptr(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 // stack: ..., a, a
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1085
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 void TemplateTable::dup_x1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // stack: ..., a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1089 __ load_ptr( 0, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1090 __ load_ptr( 1, rcx); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1091 __ store_ptr(1, rax); // store b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1092 __ store_ptr(0, rcx); // store a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1093 __ push_ptr(rax); // push b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 // stack: ..., b, a, b
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1096
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 void TemplateTable::dup_x2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // stack: ..., a, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1100 __ load_ptr( 0, rax); // load c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1101 __ load_ptr( 2, rcx); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1102 __ store_ptr(2, rax); // store c in a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1103 __ push_ptr(rax); // push c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // stack: ..., c, b, c, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1105 __ load_ptr( 2, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1106 __ store_ptr(2, rcx); // store a in b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // stack: ..., c, a, c, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1108 __ store_ptr(1, rax); // store b in c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 // stack: ..., c, a, b, c
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 void TemplateTable::dup2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // stack: ..., a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1115 __ load_ptr(1, rax); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1116 __ push_ptr(rax); // push a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1117 __ load_ptr(1, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1118 __ push_ptr(rax); // push b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // stack: ..., a, b, a, b
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 void TemplateTable::dup2_x1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 // stack: ..., a, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1125 __ load_ptr( 0, rcx); // load c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1126 __ load_ptr( 1, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1127 __ push_ptr(rax); // push b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1128 __ push_ptr(rcx); // push c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // stack: ..., a, b, c, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1130 __ store_ptr(3, rcx); // store c in b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // stack: ..., a, c, c, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1132 __ load_ptr( 4, rcx); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1133 __ store_ptr(2, rcx); // store a in 2nd c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // stack: ..., a, c, a, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1135 __ store_ptr(4, rax); // store b in a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 // stack: ..., b, c, a, b, c
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1138
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 void TemplateTable::dup2_x2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 // stack: ..., a, b, c, d
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1142 __ load_ptr( 0, rcx); // load d
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1143 __ load_ptr( 1, rax); // load c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1144 __ push_ptr(rax); // push c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1145 __ push_ptr(rcx); // push d
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 // stack: ..., a, b, c, d, c, d
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1147 __ load_ptr( 4, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1148 __ store_ptr(2, rax); // store b in d
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1149 __ store_ptr(4, rcx); // store d in b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // stack: ..., a, d, c, b, c, d
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1151 __ load_ptr( 5, rcx); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1152 __ load_ptr( 3, rax); // load c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1153 __ store_ptr(3, rcx); // store a in c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1154 __ store_ptr(5, rax); // store c in a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 // stack: ..., c, d, a, b, c, d
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 void TemplateTable::swap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 // stack: ..., a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1161 __ load_ptr( 1, rcx); // load a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1162 __ load_ptr( 0, rax); // load b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1163 __ store_ptr(0, rcx); // store a in b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1164 __ store_ptr(1, rax); // store b in a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 // stack: ..., b, a
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 void TemplateTable::iop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 case add : __ pop_i(rdx); __ addl (rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 case sub : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 case mul : __ pop_i(rdx); __ imull(rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 case _and : __ pop_i(rdx); __ andl (rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 case _or : __ pop_i(rdx); __ orl (rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 case _xor : __ pop_i(rdx); __ xorl (rax, rdx); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 case shl : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 case shr : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 default : 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 void TemplateTable::lop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 switch (op) {
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1187 case add : __ pop_l(rdx); __ addptr(rax, rdx); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1188 case sub : __ mov(rdx, rax); __ pop_l(rax); __ subptr(rax, rdx); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1189 case _and : __ pop_l(rdx); __ andptr(rax, rdx); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1190 case _or : __ pop_l(rdx); __ orptr (rax, rdx); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1191 case _xor : __ pop_l(rdx); __ xorptr(rax, rdx); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1192 default : ShouldNotReachHere();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 void TemplateTable::idiv() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 __ movl(rcx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 __ pop_i(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 // they are not equal, one could do a normal division (no correction
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // needed), which may speed up this implementation for the common case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 // (see also JVM spec., p.243 & p.271)
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 __ corrected_idivl(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 void TemplateTable::irem() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 __ movl(rcx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 __ pop_i(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 // Note: could xor eax and ecx and compare with (-1 ^ min_int). If
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 // they are not equal, one could do a normal division (no correction
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // needed), which may speed up this implementation for the common case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // (see also JVM spec., p.243 & p.271)
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 __ corrected_idivl(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 __ movl(rax, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 void TemplateTable::lmul() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 __ pop_l(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 __ imulq(rax, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1224
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 void TemplateTable::ldiv() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 transition(ltos, ltos);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1227 __ mov(rcx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 __ pop_l(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // generate explicit div0 check
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 __ testq(rcx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 __ jump_cc(Assembler::zero,
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 // they are not equal, one could do a normal division (no correction
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 // needed), which may speed up this implementation for the common case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // (see also JVM spec., p.243 & p.271)
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 __ corrected_idivq(rcx); // kills rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 void TemplateTable::lrem() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 transition(ltos, ltos);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1242 __ mov(rcx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 __ pop_l(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 __ testq(rcx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 __ jump_cc(Assembler::zero,
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
a61af66fc99e Initial load
duke
parents:
diff changeset
1248 // they are not equal, one could do a normal division (no correction
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // needed), which may speed up this implementation for the common case.
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // (see also JVM spec., p.243 & p.271)
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 __ corrected_idivq(rcx); // kills rbx
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1252 __ mov(rax, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1254
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 void TemplateTable::lshl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 transition(itos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 __ movl(rcx, rax); // get shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 __ pop_l(rax); // get shift value
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 __ shlq(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 void TemplateTable::lshr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 transition(itos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 __ movl(rcx, rax); // get shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 __ pop_l(rax); // get shift value
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 __ sarq(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1268
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 void TemplateTable::lushr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 transition(itos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 __ movl(rcx, rax); // get shift count
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 __ pop_l(rax); // get shift value
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 __ shrq(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1275
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 void TemplateTable::fop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 transition(ftos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 case add:
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 __ addss(xmm0, at_rsp());
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1281 __ addptr(rsp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 case sub:
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 __ movflt(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 __ pop_f(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 __ subss(xmm0, xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 case mul:
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 __ mulss(xmm0, at_rsp());
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1290 __ addptr(rsp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 case div:
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 __ movflt(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 __ pop_f(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 __ divss(xmm0, xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 case rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 __ movflt(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 __ pop_f(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 void TemplateTable::dop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 transition(dtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 case add:
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 __ addsd(xmm0, at_rsp());
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1313 __ addptr(rsp, 2 * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 case sub:
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 __ movdbl(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 __ pop_d(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 __ subsd(xmm0, xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 case mul:
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 __ mulsd(xmm0, at_rsp());
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1304
diff changeset
1322 __ addptr(rsp, 2 * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 case div:
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 __ movdbl(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 __ pop_d(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 __ divsd(xmm0, xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 case rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 __ movdbl(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 __ pop_d(xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1332 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1333 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1339
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 void TemplateTable::ineg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 __ negl(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1344
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 void TemplateTable::lneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 __ negq(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1349
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 // Note: 'double' and 'long long' have 32-bits alignment on x86.
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // Use the expression (adr)&(~0xF) to provide 128-bits aligned address
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 // of 128-bits operands for SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 jlong *operand = (jlong*)(((intptr_t)adr)&((intptr_t)(~0xF)));
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 // Store the value to a 128-bits operand.
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 operand[0] = lo;
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 operand[1] = hi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 return operand;
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // Buffer for 128-bits masks used by SSE instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 static jlong float_signflip_pool[2*2];
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 static jlong double_signflip_pool[2*2];
a61af66fc99e Initial load
duke
parents:
diff changeset
1364
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 void TemplateTable::fneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 transition(ftos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 static jlong *float_signflip = double_quadword(&float_signflip_pool[1], 0x8000000080000000, 0x8000000080000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 __ xorps(xmm0, ExternalAddress((address) float_signflip));
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 void TemplateTable::dneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 transition(dtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 static jlong *double_signflip = double_quadword(&double_signflip_pool[1], 0x8000000000000000, 0x8000000000000000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 __ xorpd(xmm0, ExternalAddress((address) double_signflip));
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1376
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 void TemplateTable::iinc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 __ load_signed_byte(rdx, at_bcp(2)); // get constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 locals_index(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 __ addl(iaddress(rbx), rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1383
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 void TemplateTable::wide_iinc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 __ movl(rdx, at_bcp(4)); // get constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 locals_index_wide(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 __ bswapl(rdx); // swap bytes & sign-extend constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 __ sarl(rdx, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 __ addl(iaddress(rbx), rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 // Note: should probably use only one movl to get both
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 // the index and the constant -> fix this
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1394
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 void TemplateTable::convert() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 // Checking
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 TosState tos_in = ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 TosState tos_out = ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 case Bytecodes::_i2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 case Bytecodes::_i2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 case Bytecodes::_i2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 case Bytecodes::_i2b: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 case Bytecodes::_i2c: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 case Bytecodes::_i2s: tos_in = itos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 case Bytecodes::_l2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 case Bytecodes::_l2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 case Bytecodes::_l2d: tos_in = ltos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 case Bytecodes::_f2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 case Bytecodes::_f2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 case Bytecodes::_f2d: tos_in = ftos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 case Bytecodes::_d2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 case Bytecodes::_d2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 case Bytecodes::_d2f: tos_in = dtos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 case Bytecodes::_l2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 case Bytecodes::_f2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 case Bytecodes::_d2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 case Bytecodes::_i2b: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 case Bytecodes::_i2c: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 case Bytecodes::_i2s: tos_out = itos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 case Bytecodes::_i2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 case Bytecodes::_f2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 case Bytecodes::_d2l: tos_out = ltos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 case Bytecodes::_i2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 case Bytecodes::_l2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 case Bytecodes::_d2f: tos_out = ftos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 case Bytecodes::_i2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 case Bytecodes::_l2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 case Bytecodes::_f2d: tos_out = dtos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 transition(tos_in, tos_out);
a61af66fc99e Initial load
duke
parents:
diff changeset
1438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1440
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 static const int64_t is_nan = 0x8000000000000000L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1442
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 // Conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 case Bytecodes::_i2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 __ movslq(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 case Bytecodes::_i2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 __ cvtsi2ssl(xmm0, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 case Bytecodes::_i2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 __ cvtsi2sdl(xmm0, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 case Bytecodes::_i2b:
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 __ movsbl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 case Bytecodes::_i2c:
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 __ movzwl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 case Bytecodes::_i2s:
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 __ movswl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 case Bytecodes::_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 __ movl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 case Bytecodes::_l2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 __ cvtsi2ssq(xmm0, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 case Bytecodes::_l2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 __ cvtsi2sdq(xmm0, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 case Bytecodes::_f2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 __ cvttss2sil(rax, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 __ cmpl(rax, 0x80000000); // NaN or overflow/underflow?
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 __ jcc(Assembler::notEqual, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i), 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 case Bytecodes::_f2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 __ cvttss2siq(rax, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // NaN or overflow/underflow?
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 __ cmp64(rax, ExternalAddress((address) &is_nan));
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 __ jcc(Assembler::notEqual, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l), 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 case Bytecodes::_f2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 __ cvtss2sd(xmm0, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 case Bytecodes::_d2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 __ cvttsd2sil(rax, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 __ cmpl(rax, 0x80000000); // NaN or overflow/underflow?
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 __ jcc(Assembler::notEqual, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i), 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 case Bytecodes::_d2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 __ cvttsd2siq(rax, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 // NaN or overflow/underflow?
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 __ cmp64(rax, ExternalAddress((address) &is_nan));
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 __ jcc(Assembler::notEqual, L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l), 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 case Bytecodes::_d2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 __ cvtsd2ss(xmm0, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1524
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 void TemplateTable::lcmp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 transition(ltos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 __ pop_l(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 __ cmpq(rdx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 __ movl(rax, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 __ jccb(Assembler::less, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 __ setb(Assembler::notEqual, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 __ movzbl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1536
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 void TemplateTable::float_cmp(bool is_float, int unordered_result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 if (is_float) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 // XXX get rid of pop here, use ... reg, mem32
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 __ pop_f(xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 __ ucomiss(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 // XXX get rid of pop here, use ... reg, mem64
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 __ pop_d(xmm1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 __ ucomisd(xmm1, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 if (unordered_result < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 __ movl(rax, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 __ jccb(Assembler::parity, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 __ jccb(Assembler::below, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 __ setb(Assembler::notEqual, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 __ movzbl(rax, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 __ movl(rax, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 __ jccb(Assembler::parity, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 __ jccb(Assembler::above, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 __ movl(rax, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 __ jccb(Assembler::equal, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 __ decrementl(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1564
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 void TemplateTable::branch(bool is_jsr, bool is_wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 __ get_method(rcx); // rcx holds method
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 __ profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 // holds bumped taken count
a61af66fc99e Initial load
duke
parents:
diff changeset
1569
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 const ByteSize be_offset = methodOopDesc::backedge_counter_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 InvocationCounter::counter_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 InvocationCounter::counter_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 const int method_offset = frame::interpreter_frame_method_offset * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1575
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 // Load up edx with the branch displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 __ movl(rdx, at_bcp(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 __ bswapl(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1579
a61af66fc99e Initial load
duke
parents:
diff changeset
1580 if (!is_wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 __ sarl(rdx, 16);
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1583 __ movl2ptr(rdx, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1584
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 // Handle all the JSR stuff here, then exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 // It's much shorter and cleaner than intermingling with the non-JSR
605
98cb887364d3 6810672: Comment typos
twisti
parents: 362
diff changeset
1587 // normal-branch stuff occurring below.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 if (is_jsr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 // Pre-load the next target bytecode into rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1591
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 // compute return address as bci in rax
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1593 __ lea(rax, at_bcp((is_wide ? 5 : 3) -
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 in_bytes(constMethodOopDesc::codes_offset())));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1595 __ subptr(rax, Address(rcx, methodOopDesc::const_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 // Adjust the bcp in r13 by the displacement in rdx
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1597 __ addptr(r13, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 // jsr returns atos that is not an oop
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 __ push_i(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1603
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 // Normal (non-jsr) branch handling
a61af66fc99e Initial load
duke
parents:
diff changeset
1605
a61af66fc99e Initial load
duke
parents:
diff changeset
1606 // Adjust the bcp in r13 by the displacement in rdx
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1607 __ addptr(r13, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1608
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 assert(UseLoopCounter || !UseOnStackReplacement,
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 "on-stack-replacement requires loop counters");
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 Label backedge_counter_overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
1612 Label profile_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 Label dispatch;
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 if (UseLoopCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 // increment backedge counter for backward branches
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 // rax: MDO
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 // ebx: MDO bumped taken-count
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 // rcx: method
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 // rdx: target offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 // r13: target bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
1621 // r14: locals pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
1622 __ testl(rdx, rdx); // check if forward or backward branch
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 __ jcc(Assembler::positive, dispatch); // count only if backward branch
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1624 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1625 Label no_mdo;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1626 int increment = InvocationCounter::count_increment;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1627 int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1628 if (ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1629 // Are we profiling?
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1630 __ movptr(rbx, Address(rcx, in_bytes(methodOopDesc::method_data_offset())));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1631 __ testptr(rbx, rbx);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1632 __ jccb(Assembler::zero, no_mdo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1633 // Increment the MDO backedge counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1634 const Address mdo_backedge_counter(rbx, in_bytes(methodDataOopDesc::backedge_counter_offset()) +
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1635 in_bytes(InvocationCounter::counter_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1636 __ increment_mask_and_jump(mdo_backedge_counter, increment, mask,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1637 rax, false, Assembler::zero, &backedge_counter_overflow);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1638 __ jmp(dispatch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1640 __ bind(no_mdo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1641 // Increment backedge counter in methodOop
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1642 __ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1643 rax, false, Assembler::zero, &backedge_counter_overflow);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 } else {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1645 // increment counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1646 __ movl(rax, Address(rcx, be_offset)); // load backedge counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1647 __ incrementl(rax, InvocationCounter::count_increment); // increment counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1648 __ movl(Address(rcx, be_offset), rax); // store counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1649
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1650 __ movl(rax, Address(rcx, inv_offset)); // load invocation counter
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1651 __ andl(rax, InvocationCounter::count_mask_value); // and the status bits
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1652 __ addl(rax, Address(rcx, be_offset)); // add both counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1653
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1654 if (ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1655 // Test to see if we should create a method data oop
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 __ cmp32(rax,
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1657 ExternalAddress((address) &InvocationCounter::InterpreterProfileLimit));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1658 __ jcc(Assembler::less, dispatch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1659
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1660 // if no method data exists, go to profile method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1661 __ test_method_data_pointer(rax, profile_method);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1662
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1663 if (UseOnStackReplacement) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1664 // check for overflow against ebx which is the MDO taken count
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1665 __ cmp32(rbx,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1666 ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1667 __ jcc(Assembler::below, dispatch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1668
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1669 // When ProfileInterpreter is on, the backedge_count comes
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1670 // from the methodDataOop, which value does not get reset on
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1671 // the call to frequency_counter_overflow(). To avoid
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1672 // excessive calls to the overflow routine while the method is
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1673 // being compiled, add a second test to make sure the overflow
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1674 // function is called only once every overflow_frequency.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1675 const int overflow_frequency = 1024;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1676 __ andl(rbx, overflow_frequency - 1);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1677 __ jcc(Assembler::zero, backedge_counter_overflow);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1678
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1679 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1680 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1681 if (UseOnStackReplacement) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1682 // check for overflow against eax, which is the sum of the
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1683 // counters
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1684 __ cmp32(rax,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1685 ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1686 __ jcc(Assembler::aboveEqual, backedge_counter_overflow);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1687
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1688 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 __ bind(dispatch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1693
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 // Pre-load the next target bytecode into rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 __ load_unsigned_byte(rbx, Address(r13, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1696
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 // continue with the bytecode @ target
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 // eax: return bci for jsr's, unused otherwise
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 // ebx: target bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 // r13: target bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1702
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 if (UseLoopCounter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // Out-of-line code to allocate method data oop.
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 __ bind(profile_method);
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1976
diff changeset
1707 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1976
diff changeset
1709 __ set_method_data_pointer_for_bcp();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 __ jmp(dispatch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1712
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 if (UseOnStackReplacement) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1714 // invocation counter overflow
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 __ bind(backedge_counter_overflow);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1716 __ negptr(rdx);
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1717 __ addptr(rdx, r13); // branch bcp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 InterpreterRuntime::frequency_counter_overflow),
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 __ load_unsigned_byte(rbx, Address(r13, 0)); // restore target bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
1724
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 // rax: osr nmethod (osr ok) or NULL (osr not possible)
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 // ebx: target bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 // rdx: scratch
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 // r14: locals pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 // r13: bcp
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1730 __ testptr(rax, rax); // test result
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 __ jcc(Assembler::zero, dispatch); // no osr if null
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 // nmethod may have been invalidated (VM may block upon call_VM return)
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 __ cmpl(rcx, InvalidOSREntryBci);
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 __ jcc(Assembler::equal, dispatch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1736
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 // We have the address of an on stack replacement routine in eax
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 // We need to prepare to execute the OSR method. First we must
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 // migrate the locals and monitors off of the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
1740
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1741 __ mov(r13, rax); // save the nmethod
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1742
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
a61af66fc99e Initial load
duke
parents:
diff changeset
1744
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 // eax is OSR buffer, move it to expected parameter location
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1746 __ mov(j_rarg0, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1747
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 // We use j_rarg definitions here so that registers don't conflict as parameter
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 // registers change across platforms as we are in the midst of a calling
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
a61af66fc99e Initial load
duke
parents:
diff changeset
1751
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 const Register retaddr = j_rarg2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 const Register sender_sp = j_rarg1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1754
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 // pop the interpreter frame
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1756 __ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 __ leave(); // remove frame anchor
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1758 __ pop(retaddr); // get return address
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1759 __ mov(rsp, sender_sp); // set sp to sender sp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 // Ensure compiled code always sees stack at proper alignment
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1761 __ andptr(rsp, -(StackAlignmentInBytes));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1762
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 // unlike x86 we need no specialized return from compiled code
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 // to the interpreter or the call stub.
a61af66fc99e Initial load
duke
parents:
diff changeset
1765
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 // push the return address
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1767 __ push(retaddr);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1768
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 // and begin the OSR nmethod
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 __ jmp(Address(r13, nmethod::osr_entry_point_offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1774
a61af66fc99e Initial load
duke
parents:
diff changeset
1775
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 void TemplateTable::if_0cmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // assume branch is more often taken than not (loops use backward branches)
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 Label not_taken;
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 __ testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 __ jcc(j_not(cc), not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 branch(false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 __ bind(not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 __ profile_not_taken_branch(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1786
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 void TemplateTable::if_icmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 // assume branch is more often taken than not (loops use backward branches)
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 Label not_taken;
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 __ pop_i(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 __ cmpl(rdx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 __ jcc(j_not(cc), not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 branch(false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 __ bind(not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 __ profile_not_taken_branch(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1798
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 void TemplateTable::if_nullcmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 // assume branch is more often taken than not (loops use backward branches)
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 Label not_taken;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1803 __ testptr(rax, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 __ jcc(j_not(cc), not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 branch(false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 __ bind(not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 __ profile_not_taken_branch(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1809
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 void TemplateTable::if_acmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // assume branch is more often taken than not (loops use backward branches)
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 Label not_taken;
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 __ pop_ptr(rdx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1815 __ cmpptr(rdx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 __ jcc(j_not(cc), not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 branch(false, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 __ bind(not_taken);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 __ profile_not_taken_branch(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 void TemplateTable::ret() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 locals_index(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1825 __ movslq(rbx, iaddress(rbx)); // get return bci, compute return bcp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 __ profile_ret(rbx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 __ get_method(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1828 __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1829 __ lea(r13, Address(r13, rbx, Address::times_1,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1830 constMethodOopDesc::codes_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1833
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 void TemplateTable::wide_ret() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 locals_index_wide(rbx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1837 __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 __ profile_ret(rbx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 __ get_method(rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1840 __ movptr(r13, Address(rax, methodOopDesc::const_offset()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1841 __ lea(r13, Address(r13, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1844
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 void TemplateTable::tableswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 Label default_case, continue_execution;
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // align r13
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1849 __ lea(rbx, at_bcp(BytesPerInt));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1850 __ andptr(rbx, -BytesPerInt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 // load lo & hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 __ movl(rcx, Address(rbx, BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 __ movl(rdx, Address(rbx, 2 * BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 __ bswapl(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 __ bswapl(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 // check against lo & hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 __ cmpl(rax, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 __ jcc(Assembler::less, default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 __ cmpl(rax, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 __ jcc(Assembler::greater, default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 // lookup dispatch offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 __ subl(rax, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 __ profile_switch_case(rax, rbx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 // continue execution
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 __ bind(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 __ bswapl(rdx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1868 __ movl2ptr(rdx, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1870 __ addptr(r13, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 // handle default
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 __ bind(default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 __ profile_switch_default(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 __ movl(rdx, Address(rbx, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 __ jmp(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1878
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 void TemplateTable::lookupswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 __ stop("lookupswitch bytecode should have been rewritten");
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1883
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 void TemplateTable::fast_linearswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 Label loop_entry, loop, found, continue_execution;
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 // bswap rax so we can avoid bswapping the table entries
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 __ bswapl(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 // align r13
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1890 __ lea(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1891 // this instruction (change offsets
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1892 // below)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1893 __ andptr(rbx, -BytesPerInt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 // set counter
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 __ movl(rcx, Address(rbx, BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 __ bswapl(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 __ jmpb(loop_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // table search
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 __ jcc(Assembler::equal, found);
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 __ bind(loop_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 __ decrementl(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 __ jcc(Assembler::greaterEqual, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // default case
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 __ profile_switch_default(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 __ movl(rdx, Address(rbx, 0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 __ jmp(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 // entry found -> get offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 __ bind(found);
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 __ profile_switch_case(rcx, rax, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 // continue execution
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 __ bind(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 __ bswapl(rdx);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1916 __ movl2ptr(rdx, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 __ load_unsigned_byte(rbx, Address(r13, rdx, Address::times_1));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1918 __ addptr(r13, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1921
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 void TemplateTable::fast_binaryswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 // Implementation using the following core algorithm:
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 // int binary_search(int key, LookupswitchPair* array, int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 // // Binary search according to "Methodik des Programmierens" by
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 // int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 // int j = n;
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 // while (i+1 < j) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // // with Q: for all i: 0 <= i < n: key < a[i]
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 // // where a stands for the array and assuming that the (inexisting)
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 // // element a[n] is infinitely big.
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 // int h = (i + j) >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 // // i < h < j
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // if (key < array[h].fast_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 // j = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 // } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 // i = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 // // R: a[i] <= key < a[i+1] or Q
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 // // (i.e., if key is within array, i is the correct index)
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 // return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1948
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 // Register allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 const Register key = rax; // already set (tosca)
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 const Register array = rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 const Register i = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 const Register j = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 const Register h = rdi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 const Register temp = rsi;
a61af66fc99e Initial load
duke
parents:
diff changeset
1956
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 // Find array start
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1958 __ lea(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1959 // get rid of this
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1960 // instruction (change
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1961 // offsets below)
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
1962 __ andptr(array, -BytesPerInt);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1963
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 // Initialize i & j
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 __ xorl(i, i); // i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 __ movl(j, Address(array, -BytesPerInt)); // j = length(array);
a61af66fc99e Initial load
duke
parents:
diff changeset
1967
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 // Convert j into native byteordering
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 __ bswapl(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
1970
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 // And start
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 Label entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 __ jmp(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1974
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 // binary search loop
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 Label loop;
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 // int h = (i + j) >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 __ sarl(h, 1); // h = (i + j) >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 // if (key < array[h].fast_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 // j = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 // } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 // i = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 // Convert array[h].match to native byte-ordering before compare
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 __ movl(temp, Address(array, h, Address::times_8));
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 __ bswapl(temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 __ cmpl(key, temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 // j = h if (key < array[h].fast_match())
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 __ cmovl(Assembler::less, j, h);
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // i = h if (key >= array[h].fast_match())
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 __ cmovl(Assembler::greaterEqual, i, h);
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // while (i+1 < j)
a61af66fc99e Initial load
duke
parents:
diff changeset
1996 __ bind(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 __ leal(h, Address(i, 1)); // i+1
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 __ cmpl(h, j); // i+1 < j
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 __ jcc(Assembler::less, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2001
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 // end of binary search, result index is i (must check again!)
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 Label default_case;
a61af66fc99e Initial load
duke
parents:
diff changeset
2004 // Convert array[i].match to native byte-ordering before compare
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 __ movl(temp, Address(array, i, Address::times_8));
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 __ bswapl(temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 __ cmpl(key, temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 __ jcc(Assembler::notEqual, default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
2009
a61af66fc99e Initial load
duke
parents:
diff changeset
2010 // entry found -> j = offset
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 __ movl(j , Address(array, i, Address::times_8, BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 __ profile_switch_case(i, key, array);
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 __ bswapl(j);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2014 __ movl2ptr(j, j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2016 __ addptr(r13, j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2018
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 // default case -> j = default offset
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 __ bind(default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 __ profile_switch_default(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 __ movl(j, Address(array, -2 * BytesPerInt));
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 __ bswapl(j);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2024 __ movl2ptr(j, j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 __ load_unsigned_byte(rbx, Address(r13, j, Address::times_1));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2026 __ addptr(r13, j);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 __ dispatch_only(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2029
a61af66fc99e Initial load
duke
parents:
diff changeset
2030
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 void TemplateTable::_return(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 transition(state, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 assert(_desc->calls_vm(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 "inconsistent calls_vm information"); // call in remove_activation
a61af66fc99e Initial load
duke
parents:
diff changeset
2035
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 assert(state == vtos, "only valid state");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2038 __ movptr(c_rarg1, aaddress(0));
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2039 __ load_klass(rdi, c_rarg1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 __ testl(rdi, JVM_ACC_HAS_FINALIZER);
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 Label skip_register_finalizer;
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 __ jcc(Assembler::zero, skip_register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2046
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 __ bind(skip_register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2049
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 __ remove_activation(state, r13);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 __ jmp(r13);
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2053
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // Volatile variables demand their effects be made known to all CPU's
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 // in order. Store buffers on most chips allow reads & writes to
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // without some kind of memory barrier (i.e., it's not sufficient that
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // the interpreter does not reorder volatile references, the hardware
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // also must not reorder them).
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // According to the new Java Memory Model (JMM):
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // (1) All volatiles are serialized wrt to each other. ALSO reads &
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // writes act as aquire & release, so:
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // (2) A read cannot let unrelated NON-volatile memory refs that
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // happen after the read float up to before the read. It's OK for
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // non-volatile memory refs that happen before the volatile read to
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // float down below it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 // (3) Similar a volatile write cannot let unrelated NON-volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 // memory refs that happen BEFORE the write float down to after the
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 // write. It's OK for non-volatile memory refs that happen after the
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // volatile write to float up before it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // We only put in barriers around volatile refs (they are expensive),
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // not _between_ memory refs (that would require us to track the
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 // flavor of the previous memory refs). Requirements (2) and (3)
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // require some barriers before volatile stores and after volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // loads. These nearly cover requirement (1) but miss the
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 // volatile-store-volatile-load case. This final case is placed after
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 // volatile-stores although it could just as well go before
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 // volatile-loads.
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits
a61af66fc99e Initial load
duke
parents:
diff changeset
2083 order_constraint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2084 // Helper function to insert a is-volatile test and memory barrier
a61af66fc99e Initial load
duke
parents:
diff changeset
2085 if (os::is_MP()) { // Not needed on single CPU
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 __ membar(order_constraint);
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2089
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2090 void TemplateTable::resolve_cache_and_index(int byte_no,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2091 Register result,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2092 Register Rcache,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2093 Register index,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2094 size_t index_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 const Register temp = rbx;
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2096 assert_different_registers(result, Rcache, index, temp);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2097
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 Label resolved;
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2099 __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2100 if (byte_no == f1_oop) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2101 // We are resolved if the f1 field contains a non-null object (CallSite, etc.)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2102 // This kind of CP cache entry does not need to match the flags byte, because
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2103 // there is a 1-1 relation between bytecode type and CP entry type.
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2104 assert(result != noreg, ""); //else do cmpptr(Address(...), (int32_t) NULL_WORD)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2105 __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2106 __ testptr(result, result);
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2107 __ jcc(Assembler::notEqual, resolved);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2108 } else {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2109 assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2110 assert(result == noreg, ""); //else change code for setting result
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2111 const int shift_count = (1 + byte_no) * BitsPerByte;
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2112 __ movl(temp, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset()));
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2113 __ shrl(temp, shift_count);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2114 // have we resolved this bytecode?
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2115 __ andl(temp, 0xFF);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2116 __ cmpl(temp, (int) bytecode());
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2117 __ jcc(Assembler::equal, resolved);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2118 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2119
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 // resolve first time through
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 address entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 case Bytecodes::_getstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 case Bytecodes::_putstatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 case Bytecodes::_getfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 case Bytecodes::_putfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put);
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 case Bytecodes::_invokestatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 case Bytecodes::_invokeinterface:
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke);
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 break;
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2135 case Bytecodes::_invokedynamic:
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2136 entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2137 break;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2138 case Bytecodes::_fast_aldc:
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2139 entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2140 break;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2141 case Bytecodes::_fast_aldc_w:
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2142 entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2143 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 __ movl(temp, (int) bytecode());
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 __ call_VM(noreg, entry, temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2150
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 // Update registers with resolved info
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2152 __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2153 if (result != noreg)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2154 __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 __ bind(resolved);
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2157
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 // The Rcache and index registers must be set before call
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 void TemplateTable::load_field_cp_cache_entry(Register obj,
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 Register cache,
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 Register index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 Register off,
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 Register flags,
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 bool is_static = false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 assert_different_registers(cache, index, flags, off);
a61af66fc99e Initial load
duke
parents:
diff changeset
2166
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 // Field offset
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2169 __ movptr(off, Address(cache, index, Address::times_8,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2170 in_bytes(cp_base_offset +
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2171 ConstantPoolCacheEntry::f2_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 // Flags
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 __ movl(flags, Address(cache, index, Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 in_bytes(cp_base_offset +
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 ConstantPoolCacheEntry::flags_offset())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2176
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 // klass overwrite register
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 if (is_static) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2179 __ movptr(obj, Address(cache, index, Address::times_8,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2180 in_bytes(cp_base_offset +
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2181 ConstantPoolCacheEntry::f1_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2184
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 Register method,
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 Register itable_index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 Register flags,
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 bool is_invokevirtual,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2190 bool is_invokevfinal, /*unused*/
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2191 bool is_invokedynamic) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 // setup registers
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 const Register cache = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 const Register index = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 assert_different_registers(method, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 assert_different_registers(method, cache, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 assert_different_registers(itable_index, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 assert_different_registers(itable_index, cache, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 // determine constant pool cache field offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 const int method_offset = in_bytes(
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 constantPoolCacheOopDesc::base_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 (is_invokevirtual
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 ? ConstantPoolCacheEntry::f2_offset()
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 : ConstantPoolCacheEntry::f1_offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 ConstantPoolCacheEntry::flags_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 // access constant pool cache fields
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 ConstantPoolCacheEntry::f2_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
2210
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2211 if (byte_no == f1_oop) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2212 // Resolved f1_oop goes directly into 'method' register.
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2213 assert(is_invokedynamic, "");
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2214 resolve_cache_and_index(byte_no, method, cache, index, sizeof(u4));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2215 } else {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2216 resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2217 __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2218 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 if (itable_index != noreg) {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2220 __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 }
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2222 __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2224
a61af66fc99e Initial load
duke
parents:
diff changeset
2225
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 // The registers cache and index expected to be set before call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 // Correct values of the cache and index registers are preserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 void TemplateTable::jvmti_post_field_access(Register cache, Register index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 bool is_static, bool has_tos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 // do the JVMTI work here to avoid disturbing the register state below
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 // We use c_rarg registers here because we want to use the register used in
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 // the call to the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 if (JvmtiExport::can_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 // Check to see if a field access watch has been set before we
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 // take the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 Label L1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 assert_different_registers(cache, index, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 __ testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 __ jcc(Assembler::zero, L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2241
a61af66fc99e Initial load
duke
parents:
diff changeset
2242 __ get_cache_and_index_at_bcp(c_rarg2, c_rarg3, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2243
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 // cache entry pointer
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2245 __ addptr(c_rarg2, in_bytes(constantPoolCacheOopDesc::base_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 __ shll(c_rarg3, LogBytesPerWord);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2247 __ addptr(c_rarg2, c_rarg3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 if (is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 __ xorl(c_rarg1, c_rarg1); // NULL object reference
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 } else {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2251 __ movptr(c_rarg1, at_tos()); // get object pointer without popping it
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 __ verify_oop(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 // c_rarg1: object pointer or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 // c_rarg2: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 // c_rarg3: jvalue object on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 InterpreterRuntime::post_field_access),
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 c_rarg1, c_rarg2, c_rarg3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 __ get_cache_and_index_at_bcp(cache, index, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 __ bind(L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2264
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 void TemplateTable::pop_and_check_object(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 __ pop_ptr(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 __ null_check(r); // for field access must check obj.
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 __ verify_oop(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2270
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2273
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 const Register cache = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 const Register index = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 const Register obj = c_rarg3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 const Register off = rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 const Register flags = rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 const Register bc = c_rarg3; // uses same reg as obj, so don't mix them
a61af66fc99e Initial load
duke
parents:
diff changeset
2280
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2281 resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 jvmti_post_field_access(cache, index, is_static, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2284
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 // obj is on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2289
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 const Address field(obj, off, Address::times_1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2291
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 Label Done, notByte, notInt, notShort, notChar,
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 notLong, notFloat, notObj, notDouble;
a61af66fc99e Initial load
duke
parents:
diff changeset
2294
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 assert(btos == 0, "change code, btos != 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
2297
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 __ andl(flags, 0x0F);
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 __ jcc(Assembler::notZero, notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 // btos
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 __ load_signed_byte(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 __ push(btos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2308
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 __ bind(notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 __ cmpl(flags, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 __ jcc(Assembler::notEqual, notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 // atos
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2313 __ load_heap_oop(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 __ push(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2319
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 __ bind(notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 __ cmpl(flags, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 __ jcc(Assembler::notEqual, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 // itos
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 __ movl(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2331
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 __ cmpl(flags, ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 __ jcc(Assembler::notEqual, notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 // ctos
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
2336 __ load_unsigned_short(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 __ push(ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 patch_bytecode(Bytecodes::_fast_cgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2343
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 __ bind(notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 __ cmpl(flags, stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 __ jcc(Assembler::notEqual, notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 // stos
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
2348 __ load_signed_short(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 __ push(stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 patch_bytecode(Bytecodes::_fast_sgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2355
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 __ bind(notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 __ cmpl(flags, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 __ jcc(Assembler::notEqual, notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 // ltos
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 __ movq(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 __ push(ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 patch_bytecode(Bytecodes::_fast_lgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2367
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 __ bind(notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 __ cmpl(flags, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 __ jcc(Assembler::notEqual, notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 // ftos
a61af66fc99e Initial load
duke
parents:
diff changeset
2372 __ movflt(xmm0, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 __ push(ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 patch_bytecode(Bytecodes::_fast_fgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2379
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 __ bind(notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 __ cmpl(flags, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 __ jcc(Assembler::notEqual, notDouble);
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 // dtos
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 __ movdbl(xmm0, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 __ push(dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 // Rewrite bytecode to be faster
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 patch_bytecode(Bytecodes::_fast_dgetfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2394
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 __ bind(notDouble);
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 __ stop("Bad state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2398
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 __ bind(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadLoad |
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 // Assembler::LoadStore));
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2404
a61af66fc99e Initial load
duke
parents:
diff changeset
2405
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 void TemplateTable::getfield(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 getfield_or_static(byte_no, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 void TemplateTable::getstatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 getfield_or_static(byte_no, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2413
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 // The registers cache and index expected to be set before call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 // The function may destroy various registers, just not the cache and index registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2418
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2420
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 if (JvmtiExport::can_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 // Check to see if a field modification watch has been set before
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 // we take the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 Label L1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 assert_different_registers(cache, index, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 __ mov32(rax, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 __ testl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 __ jcc(Assembler::zero, L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2429
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 __ get_cache_and_index_at_bcp(c_rarg2, rscratch1, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2431
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 if (is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 // Life is simple. Null out the object pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 __ xorl(c_rarg1, c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 // Life is harder. The stack holds the value on top, followed by
a61af66fc99e Initial load
duke
parents:
diff changeset
2437 // the object. We don't know the size of the value, though; it
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 // could be one or two words depending on its type. As a result,
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 // we must find the type to determine where the object is.
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 __ movl(c_rarg3, Address(c_rarg2, rscratch1,
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 in_bytes(cp_base_offset +
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 ConstantPoolCacheEntry::flags_offset())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 __ shrl(c_rarg3, ConstantPoolCacheEntry::tosBits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 // Make sure we don't need to mask rcx for tosBits after the
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 // above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 ConstantPoolCacheEntry::verify_tosBits();
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2448 __ movptr(c_rarg1, at_tos_p1()); // initially assume a one word jvalue
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 __ cmpl(c_rarg3, ltos);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2450 __ cmovptr(Assembler::equal,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2451 c_rarg1, at_tos_p2()); // ltos (two word jvalue)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 __ cmpl(c_rarg3, dtos);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2453 __ cmovptr(Assembler::equal,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2454 c_rarg1, at_tos_p2()); // dtos (two word jvalue)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 // cache entry pointer
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2457 __ addptr(c_rarg2, in_bytes(cp_base_offset));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 __ shll(rscratch1, LogBytesPerWord);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2459 __ addptr(c_rarg2, rscratch1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 // object (tos)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2461 __ mov(c_rarg3, rsp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 // c_rarg1: object pointer set up above (NULL if static)
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 // c_rarg2: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 // c_rarg3: jvalue object on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 InterpreterRuntime::post_field_modification),
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 c_rarg1, c_rarg2, c_rarg3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 __ get_cache_and_index_at_bcp(cache, index, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 __ bind(L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2473
a61af66fc99e Initial load
duke
parents:
diff changeset
2474 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2476
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 const Register cache = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 const Register index = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 const Register obj = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 const Register off = rbx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 const Register flags = rax;
a61af66fc99e Initial load
duke
parents:
diff changeset
2482 const Register bc = c_rarg3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2483
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2484 resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 jvmti_post_field_mod(cache, index, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2487
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 // Assembler::StoreStore));
a61af66fc99e Initial load
duke
parents:
diff changeset
2491
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 Label notVolatile, Done;
a61af66fc99e Initial load
duke
parents:
diff changeset
2493 __ movl(rdx, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 __ andl(rdx, 0x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 // field address
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 const Address field(obj, off, Address::times_1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2499
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 Label notByte, notInt, notShort, notChar,
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 notLong, notFloat, notObj, notDouble;
a61af66fc99e Initial load
duke
parents:
diff changeset
2502
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2504
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 assert(btos == 0, "change code, btos != 0");
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 __ andl(flags, 0x0f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 __ jcc(Assembler::notZero, notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 // btos
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 __ pop(btos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 __ movb(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2516
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 __ bind(notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 __ cmpl(flags, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 __ jcc(Assembler::notEqual, notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 // atos
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 __ pop(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 if (!is_static) pop_and_check_object(obj);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2523
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2524 // Store into the field
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2525 do_oop_store(_masm, field, rax, _bs->kind(), false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2526
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2531
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 __ bind(notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 __ cmpl(flags, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 __ jcc(Assembler::notEqual, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2535 // itos
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 __ pop(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 __ movl(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2543
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 __ cmpl(flags, ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 __ jcc(Assembler::notEqual, notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 // ctos
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 __ pop(ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 __ movw(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2551 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 patch_bytecode(Bytecodes::_fast_cputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2555
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 __ bind(notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 __ cmpl(flags, stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 __ jcc(Assembler::notEqual, notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 // stos
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 __ pop(stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 __ movw(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 patch_bytecode(Bytecodes::_fast_sputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2567
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 __ bind(notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 __ cmpl(flags, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 __ jcc(Assembler::notEqual, notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 // ltos
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 __ pop(ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 __ movq(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 patch_bytecode(Bytecodes::_fast_lputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2579
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 __ bind(notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 __ cmpl(flags, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 __ jcc(Assembler::notEqual, notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2583 // ftos
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 __ pop(ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 __ movflt(field, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 patch_bytecode(Bytecodes::_fast_fputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2591
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 __ bind(notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 __ cmpl(flags, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 __ jcc(Assembler::notEqual, notDouble);
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 // dtos
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 __ pop(dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 if (!is_static) pop_and_check_object(obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 __ movdbl(field, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2604
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 __ jmp(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2607
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 __ bind(notDouble);
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 __ stop("Bad state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2611
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 __ bind(Done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 // Check for volatile store
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 __ testl(rdx, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 __ jcc(Assembler::zero, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 Assembler::StoreStore));
a61af66fc99e Initial load
duke
parents:
diff changeset
2618
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2621
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 void TemplateTable::putfield(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 putfield_or_static(byte_no, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 void TemplateTable::putstatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 putfield_or_static(byte_no, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2629
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 void TemplateTable::jvmti_post_fast_field_mod() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 if (JvmtiExport::can_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 // Check to see if a field modification watch has been set before
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 // we take the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 Label L2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 __ mov32(c_rarg3, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 __ testl(c_rarg3, c_rarg3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 __ jcc(Assembler::zero, L2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 __ pop_ptr(rbx); // copy the object pointer from tos
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 __ verify_oop(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 __ push_ptr(rbx); // put the object pointer back on tos
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2641 __ subptr(rsp, sizeof(jvalue)); // add space for a jvalue object
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2642 __ mov(c_rarg3, rsp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 const Address field(c_rarg3, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2644
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 switch (bytecode()) { // load values into the jvalue object
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2646 case Bytecodes::_fast_aputfield: __ movq(field, rax); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 case Bytecodes::_fast_lputfield: __ movq(field, rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 case Bytecodes::_fast_iputfield: __ movl(field, rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 case Bytecodes::_fast_bputfield: __ movb(field, rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 case Bytecodes::_fast_sputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 case Bytecodes::_fast_cputfield: __ movw(field, rax); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 case Bytecodes::_fast_fputfield: __ movflt(field, xmm0); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 case Bytecodes::_fast_dputfield: __ movdbl(field, xmm0); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2657
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 // Save rax because call_VM() will clobber it, then use it for
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 // JVMTI purposes
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2660 __ push(rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 // access constant pool cache entry
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 __ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 __ verify_oop(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 // rbx: object pointer copied above
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 // c_rarg2: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 // c_rarg3: jvalue object on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 InterpreterRuntime::post_field_modification),
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 rbx, c_rarg2, c_rarg3);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2671 __ pop(rax); // restore lower value
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2672 __ addptr(rsp, sizeof(jvalue)); // release jvalue object space
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 __ bind(L2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2676
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 void TemplateTable::fast_storefield(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 transition(state, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2679
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 ByteSize base = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2681
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 jvmti_post_fast_field_mod();
a61af66fc99e Initial load
duke
parents:
diff changeset
2683
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 // access constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2686
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 // test for volatile with rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 __ movl(rdx, Address(rcx, rbx, Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2689 in_bytes(base +
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 ConstantPoolCacheEntry::flags_offset())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2691
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 // replace index with field offset from cache entry
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2693 __ movptr(rbx, Address(rcx, rbx, Address::times_8,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2694 in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2695
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 // Assembler::StoreStore));
a61af66fc99e Initial load
duke
parents:
diff changeset
2699
a61af66fc99e Initial load
duke
parents:
diff changeset
2700 Label notVolatile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2701 __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 __ andl(rdx, 0x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2703
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 // Get object from stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2705 pop_and_check_object(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2706
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 // field address
a61af66fc99e Initial load
duke
parents:
diff changeset
2708 const Address field(rcx, rbx, Address::times_1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2709
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 // access field
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2712 case Bytecodes::_fast_aputfield:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2713 do_oop_store(_masm, field, rax, _bs->kind(), false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 case Bytecodes::_fast_lputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 __ movq(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 case Bytecodes::_fast_iputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 __ movl(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 case Bytecodes::_fast_bputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2722 __ movb(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2724 case Bytecodes::_fast_sputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 case Bytecodes::_fast_cputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 __ movw(field, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2728 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 case Bytecodes::_fast_fputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 __ movflt(field, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 case Bytecodes::_fast_dputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 __ movdbl(field, xmm0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2738
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 // Check for volatile store
a61af66fc99e Initial load
duke
parents:
diff changeset
2740 __ testl(rdx, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 __ jcc(Assembler::zero, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 Assembler::StoreStore));
a61af66fc99e Initial load
duke
parents:
diff changeset
2744 __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2746
a61af66fc99e Initial load
duke
parents:
diff changeset
2747
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 void TemplateTable::fast_accessfield(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 transition(atos, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2750
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 // Do the JVMTI work here to avoid disturbing the register state below
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 if (JvmtiExport::can_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 // Check to see if a field access watch has been set before we
a61af66fc99e Initial load
duke
parents:
diff changeset
2754 // take the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 Label L1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 __ testl(rcx, rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 __ jcc(Assembler::zero, L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2759 // access constant pool cache entry
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 __ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2761 __ verify_oop(rax);
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
2762 __ push_ptr(rax); // save object pointer before call_VM() clobbers it
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2763 __ mov(c_rarg1, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 // c_rarg1: object pointer copied above
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 // c_rarg2: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 InterpreterRuntime::post_field_access),
a61af66fc99e Initial load
duke
parents:
diff changeset
2769 c_rarg1, c_rarg2);
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
2770 __ pop_ptr(rax); // restore object pointer
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 __ bind(L1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2773
a61af66fc99e Initial load
duke
parents:
diff changeset
2774 // access constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 __ get_cache_and_index_at_bcp(rcx, rbx, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 // replace index with field offset from cache entry
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 // if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 // __ movl(rdx, Address(rcx, rbx, Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 // in_bytes(constantPoolCacheOopDesc::base_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 // ConstantPoolCacheEntry::flags_offset())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 // __ andl(rdx, 0x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2784 // }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2785 __ movptr(rbx, Address(rcx, rbx, Address::times_8,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2786 in_bytes(constantPoolCacheOopDesc::base_offset() +
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2787 ConstantPoolCacheEntry::f2_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2788
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 // rax: object
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 __ null_check(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 Address field(rax, rbx, Address::times_1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2793
a61af66fc99e Initial load
duke
parents:
diff changeset
2794 // access field
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 case Bytecodes::_fast_agetfield:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2797 __ load_heap_oop(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 case Bytecodes::_fast_lgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 __ movq(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 case Bytecodes::_fast_igetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 __ movl(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2806 case Bytecodes::_fast_bgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 __ movsbl(rax, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 case Bytecodes::_fast_sgetfield:
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
2810 __ load_signed_short(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 case Bytecodes::_fast_cgetfield:
622
56aae7be60d4 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 605
diff changeset
2813 __ load_unsigned_short(rax, field);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2814 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 case Bytecodes::_fast_fgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2816 __ movflt(xmm0, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2818 case Bytecodes::_fast_dgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 __ movdbl(xmm0, field);
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2822 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2825 // if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 // Label notVolatile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 // __ testl(rdx, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 // __ jcc(Assembler::zero, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 // __ membar(Assembler::LoadLoad);
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 // __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 //};
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2833
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 void TemplateTable::fast_xaccess(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 transition(vtos, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2836
a61af66fc99e Initial load
duke
parents:
diff changeset
2837 // get receiver
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2838 __ movptr(rax, aaddress(0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2839 // access constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 __ get_cache_and_index_at_bcp(rcx, rdx, 2);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2841 __ movptr(rbx,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2842 Address(rcx, rdx, Address::times_8,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2843 in_bytes(constantPoolCacheOopDesc::base_offset() +
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2844 ConstantPoolCacheEntry::f2_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 // make sure exception is reported in correct bcp range (getfield is
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 // next instruction)
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2847 __ increment(r13);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 __ null_check(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 switch (state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 case itos:
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 __ movl(rax, Address(rax, rbx, Address::times_1));
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2853 case atos:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2854 __ load_heap_oop(rax, Address(rax, rbx, Address::times_1));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 case ftos:
a61af66fc99e Initial load
duke
parents:
diff changeset
2858 __ movflt(xmm0, Address(rax, rbx, Address::times_1));
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2863
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 // [jk] not needed currently
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 // if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 // Label notVolatile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2867 // __ movl(rdx, Address(rcx, rdx, Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2868 // in_bytes(constantPoolCacheOopDesc::base_offset() +
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 // ConstantPoolCacheEntry::flags_offset())));
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 // __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 // __ testl(rdx, 0x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2872 // __ jcc(Assembler::zero, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 // __ membar(Assembler::LoadLoad);
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 // __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
2876
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2877 __ decrement(r13);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2879
a61af66fc99e Initial load
duke
parents:
diff changeset
2880
a61af66fc99e Initial load
duke
parents:
diff changeset
2881
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 // Calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2884
a61af66fc99e Initial load
duke
parents:
diff changeset
2885 void TemplateTable::count_calls(Register method, Register temp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2886 // implemented elsewhere
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2889
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2890 void TemplateTable::prepare_invoke(Register method, Register index, int byte_no) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2891 // determine flags
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2892 Bytecodes::Code code = bytecode();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 const bool is_invokeinterface = code == Bytecodes::_invokeinterface;
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2894 const bool is_invokedynamic = code == Bytecodes::_invokedynamic;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2895 const bool is_invokevirtual = code == Bytecodes::_invokevirtual;
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 const bool is_invokespecial = code == Bytecodes::_invokespecial;
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2897 const bool load_receiver = (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 const bool receiver_null_check = is_invokespecial;
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 const bool save_flags = is_invokeinterface || is_invokevirtual;
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 // setup registers & access constant pool cache
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 const Register recv = rcx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 const Register flags = rdx;
a61af66fc99e Initial load
duke
parents:
diff changeset
2903 assert_different_registers(method, index, recv, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2904
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 // save 'interpreter return address'
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 __ save_bcp();
a61af66fc99e Initial load
duke
parents:
diff changeset
2907
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2908 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2909
a61af66fc99e Initial load
duke
parents:
diff changeset
2910 // load receiver if needed (note: no return address pushed yet)
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 if (load_receiver) {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2912 assert(!is_invokedynamic, "");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 __ movl(recv, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 __ andl(recv, 0xFF);
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2915 Address recv_addr(rsp, recv, Address::times_8, -Interpreter::expr_offset_in_bytes(1));
1304
76c1d7d13ec5 6932091: JSR 292 x86 code cleanup
twisti
parents: 1248
diff changeset
2916 __ movptr(recv, recv_addr);
76c1d7d13ec5 6932091: JSR 292 x86 code cleanup
twisti
parents: 1248
diff changeset
2917 __ verify_oop(recv);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2919
a61af66fc99e Initial load
duke
parents:
diff changeset
2920 // do null check if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 if (receiver_null_check) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 __ null_check(recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2924
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 if (save_flags) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 __ movl(r13, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2927 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2928
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // compute return type
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 __ shrl(flags, ConstantPoolCacheEntry::tosBits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 // Make sure we don't need to mask flags for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2932 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 // load return address
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 {
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2935 address table_addr;
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2936 if (is_invokeinterface || is_invokedynamic)
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2937 table_addr = (address)Interpreter::return_5_addrs_by_index_table();
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2938 else
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2939 table_addr = (address)Interpreter::return_3_addrs_by_index_table();
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2940 ExternalAddress table(table_addr);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2941 __ lea(rscratch1, table);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
2942 __ movptr(flags, Address(rscratch1, flags, Address::times_ptr));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2944
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 // push return address
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2946 __ push(flags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2947
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 // Restore flag field from the constant pool cache, and restore esi
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 // for later null checks. r13 is the bytecode pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2950 if (save_flags) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 __ movl(flags, r13);
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 __ restore_bcp();
a61af66fc99e Initial load
duke
parents:
diff changeset
2953 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2955
a61af66fc99e Initial load
duke
parents:
diff changeset
2956
a61af66fc99e Initial load
duke
parents:
diff changeset
2957 void TemplateTable::invokevirtual_helper(Register index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 Register recv,
a61af66fc99e Initial load
duke
parents:
diff changeset
2959 Register flags) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2960 // Uses temporary registers rax, rdx
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
2961 assert_different_registers(index, recv, rax, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2962
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 // Test for an invoke of a final method
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 Label notFinal;
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 __ movl(rax, flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2966 __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
a61af66fc99e Initial load
duke
parents:
diff changeset
2967 __ jcc(Assembler::zero, notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2968
a61af66fc99e Initial load
duke
parents:
diff changeset
2969 const Register method = index; // method must be rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 assert(method == rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 "methodOop must be rbx for interpreter calling convention");
a61af66fc99e Initial load
duke
parents:
diff changeset
2972
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 // do the call - the index is actually the method to call
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 __ verify_oop(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2975
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 // It's final, need a null check here!
a61af66fc99e Initial load
duke
parents:
diff changeset
2977 __ null_check(recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
2978
a61af66fc99e Initial load
duke
parents:
diff changeset
2979 // profile this call
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 __ profile_final_call(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2981
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 __ jump_from_interpreted(method, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2983
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 __ bind(notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2985
a61af66fc99e Initial load
duke
parents:
diff changeset
2986 // get receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 __ null_check(recv, oopDesc::klass_offset_in_bytes());
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2988 __ load_klass(rax, recv);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2989
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
2991
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 // profile this call
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 __ profile_virtual_call(rax, r14, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
2994
a61af66fc99e Initial load
duke
parents:
diff changeset
2995 // get target methodOop & entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 const int base = instanceKlass::vtable_start_offset() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 assert(vtableEntry::size() * wordSize == 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
2998 "adjust the scaling in the code below");
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
2999 __ movptr(method, Address(rax, index,
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3000 Address::times_8,
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3001 base + vtableEntry::method_offset_in_bytes()));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3002 __ movptr(rdx, Address(method, methodOopDesc::interpreter_entry_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 __ jump_from_interpreted(method, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3005
a61af66fc99e Initial load
duke
parents:
diff changeset
3006
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 void TemplateTable::invokevirtual(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3008 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3009 assert(byte_no == f2_byte, "use this argument");
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3010 prepare_invoke(rbx, noreg, byte_no);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3011
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 // rbx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 // rcx: receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 // rdx: flags
a61af66fc99e Initial load
duke
parents:
diff changeset
3015
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 invokevirtual_helper(rbx, rcx, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3018
a61af66fc99e Initial load
duke
parents:
diff changeset
3019
a61af66fc99e Initial load
duke
parents:
diff changeset
3020 void TemplateTable::invokespecial(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3022 assert(byte_no == f1_byte, "use this argument");
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3023 prepare_invoke(rbx, noreg, byte_no);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3024 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 __ verify_oop(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 __ profile_call(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3027 __ jump_from_interpreted(rbx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3029
a61af66fc99e Initial load
duke
parents:
diff changeset
3030
a61af66fc99e Initial load
duke
parents:
diff changeset
3031 void TemplateTable::invokestatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3032 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3033 assert(byte_no == f1_byte, "use this argument");
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3034 prepare_invoke(rbx, noreg, byte_no);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 __ verify_oop(rbx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 __ profile_call(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3038 __ jump_from_interpreted(rbx, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3040
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 void TemplateTable::fast_invokevfinal(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3043 assert(byte_no == f2_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 __ stop("fast_invokevfinal not used on amd64");
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3046
a61af66fc99e Initial load
duke
parents:
diff changeset
3047 void TemplateTable::invokeinterface(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3049 assert(byte_no == f1_byte, "use this argument");
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3050 prepare_invoke(rax, rbx, byte_no);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3051
a61af66fc99e Initial load
duke
parents:
diff changeset
3052 // rax: Interface
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 // rbx: index
a61af66fc99e Initial load
duke
parents:
diff changeset
3054 // rcx: receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 // rdx: flags
a61af66fc99e Initial load
duke
parents:
diff changeset
3056
a61af66fc99e Initial load
duke
parents:
diff changeset
3057 // Special case of invokeinterface called for virtual method of
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 // java.lang.Object. See cpCacheOop.cpp for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
3059 // This code isn't produced by javac, but could be produced by
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 // another compliant java compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 Label notMethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
3062 __ movl(r14, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3063 __ andl(r14, (1 << ConstantPoolCacheEntry::methodInterface));
a61af66fc99e Initial load
duke
parents:
diff changeset
3064 __ jcc(Assembler::zero, notMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
3065
a61af66fc99e Initial load
duke
parents:
diff changeset
3066 invokevirtual_helper(rbx, rcx, rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3067 __ bind(notMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
3068
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 // Get receiver klass into rdx - also a null check
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 __ restore_locals(); // restore r14
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3071 __ load_klass(rdx, rcx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 __ verify_oop(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3073
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 // profile this call
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 __ profile_virtual_call(rdx, r13, r14);
a61af66fc99e Initial load
duke
parents:
diff changeset
3076
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3077 Label no_such_interface, no_such_method;
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3078
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3079 __ lookup_interface_method(// inputs: rec. class, interface, itable index
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3080 rdx, rax, rbx,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3081 // outputs: method, scan temp. reg
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3082 rbx, r13,
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3083 no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3084
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3085 // rbx,: methodOop to call
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3086 // rcx: receiver
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3087 // Check for abstract method error
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3088 // Note: This should be done more efficiently via a throw_abstract_method_error
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3089 // interpreter entry point and a conditional jump to it in case of a null
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3090 // method.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3091 __ testptr(rbx, rbx);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3092 __ jcc(Assembler::zero, no_such_method);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3093
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3094 // do the call
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3095 // rcx: receiver
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3096 // rbx,: methodOop
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3097 __ jump_from_interpreted(rbx, rdx);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3098 __ should_not_reach_here();
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3099
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3100 // exception handling code follows...
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3101 // note: must restore interpreter registers to canonical
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3102 // state for exception handling to work correctly!
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3103
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3104 __ bind(no_such_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3105 // throw exception
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3106 __ pop(rbx); // pop return address (pushed by prepare_invoke)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3107 __ restore_bcp(); // r13 must be correct for exception handler (was destroyed)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3108 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3109 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3110 // the call_VM checks for exception, so we should never return here.
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3111 __ should_not_reach_here();
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3112
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3113 __ bind(no_such_interface);
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3114 // throw exception
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3115 __ pop(rbx); // pop return address (pushed by prepare_invoke)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3116 __ restore_bcp(); // r13 must be correct for exception handler (was destroyed)
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3117 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 InterpreterRuntime::throw_IncompatibleClassChangeError));
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 // the call_VM checks for exception, so we should never return here.
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 __ should_not_reach_here();
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3122 return;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3124
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3125 void TemplateTable::invokedynamic(int byte_no) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3126 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3127 assert(byte_no == f1_oop, "use this argument");
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3128
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3129 if (!EnableInvokeDynamic) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3130 // We should not encounter this bytecode if !EnableInvokeDynamic.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3131 // The verifier will stop it. However, if we get past the verifier,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3132 // this will stop the thread in a reasonable way, without crashing the JVM.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3133 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3134 InterpreterRuntime::throw_IncompatibleClassChangeError));
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3135 // the call_VM checks for exception, so we should never return here.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3136 __ should_not_reach_here();
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3137 return;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3138 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3139
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3140 assert(byte_no == f1_oop, "use this argument");
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3141 prepare_invoke(rax, rbx, byte_no);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3142
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3143 // rax: CallSite object (f1)
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3144 // rbx: unused (f2)
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3145 // rcx: receiver address
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3146 // rdx: flags (unused)
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3147
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3148 Register rax_callsite = rax;
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3149 Register rcx_method_handle = rcx;
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3150
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3151 if (ProfileInterpreter) {
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3152 // %%% should make a type profile for any invokedynamic that takes a ref argument
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3153 // profile this call
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3154 __ profile_call(r13);
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3155 }
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3156
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2120
diff changeset
3157 __ load_heap_oop(rcx_method_handle, Address(rax_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, rcx)));
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3158 __ null_check(rcx_method_handle);
1108
85f13cdfbc1d 6829192: JSR 292 needs to support 64-bit x86
twisti
parents: 1047
diff changeset
3159 __ prepare_to_jump_from_interpreted();
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3160 __ jump_to_method_handle_entry(rcx_method_handle, rdx);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3161 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 623
diff changeset
3162
623
9adddb8c0fc8 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 622
diff changeset
3163
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 // Allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
3166
a61af66fc99e Initial load
duke
parents:
diff changeset
3167 void TemplateTable::_new() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3170 Label slow_case;
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
3172 Label initialize_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 Label initialize_object; // including clearing the fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 Label allocate_shared;
a61af66fc99e Initial load
duke
parents:
diff changeset
3175
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 __ get_cpool_and_tags(rsi, rax);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3177 // Make sure the class we're about to instantiate has been resolved.
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3178 // This is done before loading instanceKlass to be consistent with the order
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3179 // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 __ cmpb(Address(rax, rdx, Address::times_1, tags_offset),
a61af66fc99e Initial load
duke
parents:
diff changeset
3182 JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 __ jcc(Assembler::notEqual, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3184
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3185 // get instanceKlass
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3186 __ movptr(rsi, Address(rsi, rdx,
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3187 Address::times_8, sizeof(constantPoolOopDesc)));
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3188
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 // make sure klass is initialized & doesn't have finalizer
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 // make sure klass is fully initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 __ cmpl(Address(rsi,
a61af66fc99e Initial load
duke
parents:
diff changeset
3192 instanceKlass::init_state_offset_in_bytes() +
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 sizeof(oopDesc)),
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 instanceKlass::fully_initialized);
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 __ jcc(Assembler::notEqual, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3196
a61af66fc99e Initial load
duke
parents:
diff changeset
3197 // get instance_size in instanceKlass (scaled to a count of bytes)
a61af66fc99e Initial load
duke
parents:
diff changeset
3198 __ movl(rdx,
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 Address(rsi,
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 // test to see if it has a finalizer or is malformed in some way
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 __ testl(rdx, Klass::_lh_instance_slow_path_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 __ jcc(Assembler::notZero, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3204
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 // Allocate the instance
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 // 1) Try to allocate in the TLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 // 2) if fail and the object is large allocate in the shared Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 // 3) if the above fails (or is not applicable), go to a slow case
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 // (creates a new TLAB, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
3210
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 const bool allow_shared_alloc =
a61af66fc99e Initial load
duke
parents:
diff changeset
3212 Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3213
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 if (UseTLAB) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3215 __ movptr(rax, Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3216 __ lea(rbx, Address(rax, rdx, Address::times_1));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3217 __ cmpptr(rbx, Address(r15_thread, in_bytes(JavaThread::tlab_end_offset())));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3218 __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3219 __ movptr(Address(r15_thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 if (ZeroTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 // the fields have been already cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 __ jmp(initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 // initialize both the header and fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 __ jmp(initialize_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3228
a61af66fc99e Initial load
duke
parents:
diff changeset
3229 // Allocation in the shared Eden, if allowed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3231 // rdx: instance size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 if (allow_shared_alloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 __ bind(allocate_shared);
a61af66fc99e Initial load
duke
parents:
diff changeset
3234
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3235 ExternalAddress top((address)Universe::heap()->top_addr());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3236 ExternalAddress end((address)Universe::heap()->end_addr());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
3237
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3238 const Register RtopAddr = rscratch1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 const Register RendAddr = rscratch2;
a61af66fc99e Initial load
duke
parents:
diff changeset
3240
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 __ lea(RtopAddr, top);
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 __ lea(RendAddr, end);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3243 __ movptr(rax, Address(RtopAddr, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3244
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 // For retries rax gets set by cmpxchgq
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 Label retry;
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 __ bind(retry);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3248 __ lea(rbx, Address(rax, rdx, Address::times_1));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3249 __ cmpptr(rbx, Address(RendAddr, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 __ jcc(Assembler::above, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3251
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 // Compare rax with the top addr, and if still equal, store the new
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 // top addr in rbx at the address of the top addr pointer. Sets ZF if was
a61af66fc99e Initial load
duke
parents:
diff changeset
3254 // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 // rax: object begin
a61af66fc99e Initial load
duke
parents:
diff changeset
3257 // rbx: object end
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 // rdx: instance size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3260 __ lock();
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3262 __ cmpxchgptr(rbx, Address(RtopAddr, 0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3263
a61af66fc99e Initial load
duke
parents:
diff changeset
3264 // if someone beat us on the allocation, try again, otherwise continue
a61af66fc99e Initial load
duke
parents:
diff changeset
3265 __ jcc(Assembler::notEqual, retry);
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1976
diff changeset
3266
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1976
diff changeset
3267 __ incr_allocated_bytes(r15_thread, rdx, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3269
a61af66fc99e Initial load
duke
parents:
diff changeset
3270 if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3271 // The object is initialized before the header. If the object size is
a61af66fc99e Initial load
duke
parents:
diff changeset
3272 // zero, go directly to the header initialization.
a61af66fc99e Initial load
duke
parents:
diff changeset
3273 __ bind(initialize_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
3274 __ decrementl(rdx, sizeof(oopDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
3275 __ jcc(Assembler::zero, initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3276
a61af66fc99e Initial load
duke
parents:
diff changeset
3277 // Initialize object fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3278 __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
a61af66fc99e Initial load
duke
parents:
diff changeset
3279 __ shrl(rdx, LogBytesPerLong); // divide by oopSize to simplify the loop
a61af66fc99e Initial load
duke
parents:
diff changeset
3280 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3281 Label loop;
a61af66fc99e Initial load
duke
parents:
diff changeset
3282 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3283 __ movq(Address(rax, rdx, Address::times_8,
a61af66fc99e Initial load
duke
parents:
diff changeset
3284 sizeof(oopDesc) - oopSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
3285 rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3286 __ decrementl(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3287 __ jcc(Assembler::notZero, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3289
a61af66fc99e Initial load
duke
parents:
diff changeset
3290 // initialize object header only.
a61af66fc99e Initial load
duke
parents:
diff changeset
3291 __ bind(initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3292 if (UseBiasedLocking) {
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3293 __ movptr(rscratch1, Address(rsi, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3294 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()), rscratch1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3295 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3296 __ movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
a61af66fc99e Initial load
duke
parents:
diff changeset
3297 (intptr_t) markOopDesc::prototype()); // header (address 0x1)
a61af66fc99e Initial load
duke
parents:
diff changeset
3298 }
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
3299 __ xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
3300 __ store_klass_gap(rax, rcx); // zero klass gap for compressed oops
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
3301 __ store_klass(rax, rsi); // store klass last
1248
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3302
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3303 {
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3304 SkipIfEqual skip(_masm, &DTraceAllocProbes, false);
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3305 // Trigger dtrace event for fastpath
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3306 __ push(atos); // save the return value
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3307 __ call_VM_leaf(
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3308 CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3309 __ pop(atos); // restore the return value
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3310
455df1b81409 6587322: dtrace probe object__alloc doesn't fire in some situations on amd64
kamg
parents: 1108
diff changeset
3311 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3312 __ jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3314
a61af66fc99e Initial load
duke
parents:
diff changeset
3315
a61af66fc99e Initial load
duke
parents:
diff changeset
3316 // slow case
a61af66fc99e Initial load
duke
parents:
diff changeset
3317 __ bind(slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 __ get_constant_pool(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3320 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), c_rarg1, c_rarg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 __ verify_oop(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3322
a61af66fc99e Initial load
duke
parents:
diff changeset
3323 // continue
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3326
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 void TemplateTable::newarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3328 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 __ load_unsigned_byte(c_rarg1, at_bcp(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 __ movl(c_rarg2, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray),
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 c_rarg1, c_rarg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3334
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 void TemplateTable::anewarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3337 __ get_unsigned_2_byte_index_at_bcp(c_rarg2, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3338 __ get_constant_pool(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 __ movl(c_rarg3, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray),
a61af66fc99e Initial load
duke
parents:
diff changeset
3341 c_rarg1, c_rarg2, c_rarg3);
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3343
a61af66fc99e Initial load
duke
parents:
diff changeset
3344 void TemplateTable::arraylength() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 transition(atos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3348 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3349
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 void TemplateTable::checkcast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 transition(atos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 Label done, is_null, ok_is_subtype, quicked, resolved;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3353 __ testptr(rax, rax); // object is in rax
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3354 __ jcc(Assembler::zero, is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3355
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 // Get cpool & tags index
a61af66fc99e Initial load
duke
parents:
diff changeset
3357 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 // See if bytecode has already been quicked
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 __ cmpb(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 Address::times_1,
a61af66fc99e Initial load
duke
parents:
diff changeset
3362 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 __ jcc(Assembler::equal, quicked);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3365 __ push(atos); // save receiver for result, and for GC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 __ pop_ptr(rdx); // restore receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3368 __ jmpb(resolved);
a61af66fc99e Initial load
duke
parents:
diff changeset
3369
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 // Get superklass in rax and subklass in rbx
a61af66fc99e Initial load
duke
parents:
diff changeset
3371 __ bind(quicked);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3372 __ mov(rdx, rax); // Save object in rdx; rax needed for subtype check
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3373 __ movptr(rax, Address(rcx, rbx,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 Address::times_8, sizeof(constantPoolOopDesc)));
a61af66fc99e Initial load
duke
parents:
diff changeset
3375
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 __ bind(resolved);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3377 __ load_klass(rbx, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3378
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 // Generate subtype check. Blows rcx, rdi. Object in rdx.
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 // Superklass in rax. Subklass in rbx.
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 __ gen_subtype_check(rbx, ok_is_subtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
3382
a61af66fc99e Initial load
duke
parents:
diff changeset
3383 // Come here on failure
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 __ push_ptr(rdx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 // object is at TOS
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
a61af66fc99e Initial load
duke
parents:
diff changeset
3387
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 // Come here on success
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 __ bind(ok_is_subtype);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3390 __ mov(rax, rdx); // Restore object in rdx
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3391
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 // Collect counts on whether this check-cast sees NULLs a lot or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3394 __ jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 __ bind(is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3396 __ profile_null_seen(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3397 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3398 __ bind(is_null); // same as 'done'
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3400 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3402
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 void TemplateTable::instanceof() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3404 transition(atos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3405 Label done, is_null, ok_is_subtype, quicked, resolved;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3406 __ testptr(rax, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3407 __ jcc(Assembler::zero, is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3408
a61af66fc99e Initial load
duke
parents:
diff changeset
3409 // Get cpool & tags index
a61af66fc99e Initial load
duke
parents:
diff changeset
3410 __ get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 // See if bytecode has already been quicked
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 __ cmpb(Address(rdx, rbx,
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 Address::times_1,
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 typeArrayOopDesc::header_size(T_BYTE) * wordSize),
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3417 __ jcc(Assembler::equal, quicked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3418
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3419 __ push(atos); // save receiver for result, and for GC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc));
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 __ pop_ptr(rdx); // restore receiver
1976
0fc262af204f 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 1972
diff changeset
3422 __ verify_oop(rdx);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3423 __ load_klass(rdx, rdx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3424 __ jmpb(resolved);
a61af66fc99e Initial load
duke
parents:
diff changeset
3425
a61af66fc99e Initial load
duke
parents:
diff changeset
3426 // Get superklass in rax and subklass in rdx
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 __ bind(quicked);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3428 __ load_klass(rdx, rax);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3429 __ movptr(rax, Address(rcx, rbx,
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3430 Address::times_8, sizeof(constantPoolOopDesc)));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3431
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 __ bind(resolved);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 // Generate subtype check. Blows rcx, rdi
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 // Superklass in rax. Subklass in rdx.
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 __ gen_subtype_check(rdx, ok_is_subtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
3437
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 // Come here on failure
a61af66fc99e Initial load
duke
parents:
diff changeset
3439 __ xorl(rax, rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 __ jmpb(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 // Come here on success
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 __ bind(ok_is_subtype);
a61af66fc99e Initial load
duke
parents:
diff changeset
3443 __ movl(rax, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3444
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 // Collect counts on whether this test sees NULLs a lot or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 __ jmp(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3448 __ bind(is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3449 __ profile_null_seen(rcx);
a61af66fc99e Initial load
duke
parents:
diff changeset
3450 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3451 __ bind(is_null); // same as 'done'
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3453 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 // rax = 0: obj == NULL or obj is not an instanceof the specified klass
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 // rax = 1: obj != NULL and obj is an instanceof the specified klass
a61af66fc99e Initial load
duke
parents:
diff changeset
3456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3457
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 // Breakpoints
a61af66fc99e Initial load
duke
parents:
diff changeset
3460 void TemplateTable::_breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // Note: We get here even if we are single stepping..
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 // jbug inists on setting breakpoints at every bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 // even if we are in single step mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
3464
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3466
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 // get the unpatched byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 __ get_method(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 InterpreterRuntime::get_original_bytecode_at),
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 c_rarg1, r13);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3473 __ mov(rbx, rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3474
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 // post the breakpoint event
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 __ get_method(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 __ call_VM(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
3478 CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint),
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 c_rarg1, r13);
a61af66fc99e Initial load
duke
parents:
diff changeset
3480
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 // complete the execution of original bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 __ dispatch_only_normal(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3483 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3484
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3486 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
3487
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 void TemplateTable::athrow() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 __ null_check(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3493
a61af66fc99e Initial load
duke
parents:
diff changeset
3494 //-----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3495 // Synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 // Note: monitorenter & exit are symmetric routines; which is reflected
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 // in the assembly code structure as well
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 // Stack layout:
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 // [expressions ] <--- rsp = expression stack top
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 // ..
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 // [expressions ]
a61af66fc99e Initial load
duke
parents:
diff changeset
3505 // [monitor entry] <--- monitor block top = expression stack bot
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 // ..
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 // [monitor entry]
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 // [frame data ] <--- monitor block bot
a61af66fc99e Initial load
duke
parents:
diff changeset
3509 // ...
a61af66fc99e Initial load
duke
parents:
diff changeset
3510 // [saved rbp ] <--- rbp
a61af66fc99e Initial load
duke
parents:
diff changeset
3511 void TemplateTable::monitorenter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3513
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 // check for NULL object
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 __ null_check(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3516
a61af66fc99e Initial load
duke
parents:
diff changeset
3517 const Address monitor_block_top(
a61af66fc99e Initial load
duke
parents:
diff changeset
3518 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 const Address monitor_block_bot(
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3522
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 Label allocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
3524
a61af66fc99e Initial load
duke
parents:
diff changeset
3525 // initialize entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
3526 __ xorl(c_rarg1, c_rarg1); // points to free slot or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3527
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 // find a free slot in the monitor block (result in c_rarg1)
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 Label entry, loop, exit;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3531 __ movptr(c_rarg3, monitor_block_top); // points to current entry,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 // starting with top-most entry
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3533 __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 // of monitor block
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 __ jmpb(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3536
a61af66fc99e Initial load
duke
parents:
diff changeset
3537 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 // check if current entry is used
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3539 __ cmpptr(Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 // if not used then remember entry in c_rarg1
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3541 __ cmov(Assembler::equal, c_rarg1, c_rarg3);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 // check if current entry is for same object
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3543 __ cmpptr(rax, Address(c_rarg3, BasicObjectLock::obj_offset_in_bytes()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3544 // if same object then stop searching
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 __ jccb(Assembler::equal, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 // otherwise advance to next entry
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3547 __ addptr(c_rarg3, entry_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3548 __ bind(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 // check if bottom reached
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3550 __ cmpptr(c_rarg3, c_rarg2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3551 // if not at bottom then check this entry
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 __ jcc(Assembler::notEqual, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
3554 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3555
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3556 __ testptr(c_rarg1, c_rarg1); // check if a slot has been found
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 __ jcc(Assembler::notZero, allocated); // if found, continue with that one
a61af66fc99e Initial load
duke
parents:
diff changeset
3558
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 // allocate one if there's no free slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 Label entry, loop;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3562 // 1. compute new pointers // rsp: old expression stack top
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3563 __ movptr(c_rarg1, monitor_block_bot); // c_rarg1: old expression stack bottom
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3564 __ subptr(rsp, entry_size); // move expression stack top
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3565 __ subptr(c_rarg1, entry_size); // move expression stack bottom
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3566 __ mov(c_rarg3, rsp); // set start value for copy loop
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3567 __ movptr(monitor_block_bot, c_rarg1); // set new monitor block bottom
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3568 __ jmp(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3569 // 2. move expression stack contents
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 __ bind(loop);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3571 __ movptr(c_rarg2, Address(c_rarg3, entry_size)); // load expression stack
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3572 // word from old location
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3573 __ movptr(Address(c_rarg3, 0), c_rarg2); // and store it at new location
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3574 __ addptr(c_rarg3, wordSize); // advance to next word
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3575 __ bind(entry);
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3576 __ cmpptr(c_rarg3, c_rarg1); // check if bottom reached
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 __ jcc(Assembler::notEqual, loop); // if not at bottom then
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 // copy next word
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3580
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 // call run-time routine
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 // c_rarg1: points to monitor entry
a61af66fc99e Initial load
duke
parents:
diff changeset
3583 __ bind(allocated);
a61af66fc99e Initial load
duke
parents:
diff changeset
3584
a61af66fc99e Initial load
duke
parents:
diff changeset
3585 // Increment bcp to point to the next bytecode, so exception
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 // handling for async. exceptions work correctly.
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 // The object has already been poped from the stack, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 // expression stack looks correct.
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3589 __ increment(r13);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3590
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 // store object
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3592 __ movptr(Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()), rax);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 __ lock_object(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3594
a61af66fc99e Initial load
duke
parents:
diff changeset
3595 // check to make sure this monitor doesn't cause stack overflow after locking
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 __ save_bcp(); // in case of exception
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 __ generate_stack_overflow_check(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3598
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 // The bcp has already been incremented. Just need to dispatch to
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 // next instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3603
a61af66fc99e Initial load
duke
parents:
diff changeset
3604
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 void TemplateTable::monitorexit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3606 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3607
a61af66fc99e Initial load
duke
parents:
diff changeset
3608 // check for NULL object
a61af66fc99e Initial load
duke
parents:
diff changeset
3609 __ null_check(rax);
a61af66fc99e Initial load
duke
parents:
diff changeset
3610
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 const Address monitor_block_top(
a61af66fc99e Initial load
duke
parents:
diff changeset
3612 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 const Address monitor_block_bot(
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3616
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 Label found;
a61af66fc99e Initial load
duke
parents:
diff changeset
3618
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 // find matching slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3620 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 Label entry, loop;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3622 __ movptr(c_rarg1, monitor_block_top); // points to current entry,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 // starting with top-most entry
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3624 __ lea(c_rarg2, monitor_block_bot); // points to word before bottom
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 // of monitor block
a61af66fc99e Initial load
duke
parents:
diff changeset
3626 __ jmpb(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3627
a61af66fc99e Initial load
duke
parents:
diff changeset
3628 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 // check if current entry is for same object
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3630 __ cmpptr(rax, Address(c_rarg1, BasicObjectLock::obj_offset_in_bytes()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 // if same object then stop searching
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 __ jcc(Assembler::equal, found);
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 // otherwise advance to next entry
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3634 __ addptr(c_rarg1, entry_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3635 __ bind(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3636 // check if bottom reached
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3637 __ cmpptr(c_rarg1, c_rarg2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 // if not at bottom then check this entry
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 __ jcc(Assembler::notEqual, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3641
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 // error handling. Unlocking was not block-structured
a61af66fc99e Initial load
duke
parents:
diff changeset
3643 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 InterpreterRuntime::throw_illegal_monitor_state_exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
3646
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 // call run-time routine
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 // rsi: points to monitor entry
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 __ bind(found);
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 __ push_ptr(rax); // make sure object is on stack (contract with oopMaps)
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 __ unlock_object(c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3652 __ pop_ptr(rax); // discard object
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3654
a61af66fc99e Initial load
duke
parents:
diff changeset
3655
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 // Wide instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 void TemplateTable::wide() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3658 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 __ load_unsigned_byte(rbx, at_bcp(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 __ lea(rscratch1, ExternalAddress((address)Interpreter::_wentry_point));
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 __ jmp(Address(rscratch1, rbx, Address::times_8));
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 // Note: the r13 increment step is part of the individual wide
a61af66fc99e Initial load
duke
parents:
diff changeset
3663 // bytecode implementations
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3665
a61af66fc99e Initial load
duke
parents:
diff changeset
3666
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 // Multi arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 void TemplateTable::multianewarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3670 __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
a61af66fc99e Initial load
duke
parents:
diff changeset
3671 // last dim is on top of stack; we want address of first one:
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 // first_addr = last_addr + (ndims - 1) * wordSize
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3673 __ lea(c_rarg1, Address(rsp, rax, Address::times_8, -wordSize));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3674 call_VM(rax,
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray),
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 c_rarg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3677 __ load_unsigned_byte(rbx, at_bcp(3));
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3678 __ lea(rsp, Address(rsp, rbx, Address::times_8));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 }
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 196
diff changeset
3680 #endif // !CC_INTERP