annotate src/cpu/sparc/vm/templateTable_sparc.cpp @ 2368:dde920245681

6896099: Integrate CMS heap ergo with default heap sizing ergo 6627787: CMS: JVM refuses to start up with -Xms16m -Xmx16m 7000125: CMS: Anti-monotone young gen sizing with respect to maximum whole heap size specification 7027529: CMS: retire CMSUseOldDefaults flag Summary: Simplify CMS heap sizing code, relying on ergonomic initial sizing consistent with other collectors for the most part, controlling only young gen sizing to rein in pause times. Make CMS young gen sizing default statically cpu-dependant. Remove inconsistencies wrt generation sizing and policy code, allowing for the fixing for 6627787 and 7000125. For 7027529, retire the flag CMSUseOldDefaults which had been introduced as a bridge from JDK 5 to JDK 6 a number of years ago. Reviewed-by: brutisso, poonam
author ysr
date Wed, 16 Mar 2011 10:37:08 -0700
parents 856ecff79cf7
children 8033953d67ff
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
2 * Copyright (c) 1997, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
38 #ifndef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
39 #define __ _masm->
a61af66fc99e Initial load
duke
parents:
diff changeset
40
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
41 // Misc helpers
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
42
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
43 // Do an oop store like *(base + index + offset) = val
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
44 // index can be noreg,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
45 static void do_oop_store(InterpreterMacroAssembler* _masm,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
46 Register base,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
47 Register index,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
48 int offset,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
49 Register val,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
50 Register tmp,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
51 BarrierSet::Name barrier,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
52 bool precise) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
53 assert(tmp != val && tmp != base && tmp != index, "register collision");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
54 assert(index == noreg || offset == 0, "only one offset");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
55 switch (barrier) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
56 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
57 case BarrierSet::G1SATBCT:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
58 case BarrierSet::G1SATBCTLogging:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
59 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
60 __ g1_write_barrier_pre( base, index, offset, tmp, /*preserve_o_regs*/true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
61 if (index == noreg ) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
62 assert(Assembler::is_simm13(offset), "fix this code");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
63 __ store_heap_oop(val, base, offset);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
64 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
65 __ store_heap_oop(val, base, index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
66 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
67
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
68 // No need for post barrier if storing NULL
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
69 if (val != G0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
70 if (precise) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
71 if (index == noreg) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
72 __ add(base, offset, base);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
73 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
74 __ add(base, index, base);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
75 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
76 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
77 __ g1_write_barrier_post(base, val, tmp);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
78 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
79 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
80 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
81 #endif // SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
82 case BarrierSet::CardTableModRef:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
83 case BarrierSet::CardTableExtension:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
84 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
85 if (index == noreg ) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
86 assert(Assembler::is_simm13(offset), "fix this code");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
87 __ store_heap_oop(val, base, offset);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
88 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
89 __ store_heap_oop(val, base, index);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
90 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
91 // No need for post barrier if storing NULL
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
92 if (val != G0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
93 if (precise) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
94 if (index == noreg) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
95 __ add(base, offset, base);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
96 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
97 __ add(base, index, base);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
98 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
99 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
100 __ card_write_barrier_post(base, val, tmp);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
101 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
102 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
103 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
104 case BarrierSet::ModRef:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
105 case BarrierSet::Other:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
106 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
107 break;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
108 default :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
109 ShouldNotReachHere();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
110
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
111 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
112 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
113
0
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // Platform-dependent initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void TemplateTable::pd_initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // (none)
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // Condition conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
125 Assembler::Condition ccNot(TemplateTable::Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 switch (cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 case TemplateTable::equal : return Assembler::notEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 case TemplateTable::not_equal : return Assembler::equal;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 case TemplateTable::less : return Assembler::greaterEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 case TemplateTable::less_equal : return Assembler::greater;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 case TemplateTable::greater : return Assembler::lessEqual;
a61af66fc99e Initial load
duke
parents:
diff changeset
132 case TemplateTable::greater_equal: return Assembler::less;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return Assembler::zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Miscelaneous helper routines
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 Address TemplateTable::at_bcp(int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
144 return Address(Lbcp, offset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register Rbyte_code,
a61af66fc99e Initial load
duke
parents:
diff changeset
149 Register Rscratch,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 bool load_bc_into_scratch /*=true*/) {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // With sharing on, may need to test methodOop flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (!RewriteBytecodes) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 if (load_bc_into_scratch) __ set(bc, Rbyte_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
154 Label patch_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 if (JvmtiExport::can_post_breakpoint()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 Label fast_patch;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 __ ldub(at_bcp(0), Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
158 __ cmp(Rscratch, Bytecodes::_breakpoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
159 __ br(Assembler::notEqual, false, Assembler::pt, fast_patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 __ delayed()->nop(); // don't bother to hoist the stb here
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // perform the quickening, slowly, in the bowels of the breakpoint table
a61af66fc99e Initial load
duke
parents:
diff changeset
162 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), Lmethod, Lbcp, Rbyte_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 __ ba(false, patch_done);
a61af66fc99e Initial load
duke
parents:
diff changeset
164 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
165 __ bind(fast_patch);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
167 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
168 Bytecodes::Code orig_bytecode = Bytecodes::java_code(bc);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 Label okay;
a61af66fc99e Initial load
duke
parents:
diff changeset
170 __ ldub(at_bcp(0), Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 __ cmp(Rscratch, orig_bytecode);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 __ br(Assembler::equal, false, Assembler::pt, okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 __ delayed() ->cmp(Rscratch, Rbyte_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 __ br(Assembler::equal, false, Assembler::pt, okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
176 __ stop("Rewriting wrong bytecode location");
a61af66fc99e Initial load
duke
parents:
diff changeset
177 __ bind(okay);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
179 __ stb(Rbyte_code, at_bcp(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
180 __ bind(patch_done);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // Individual instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void TemplateTable::nop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 void TemplateTable::shouldnotreachhere() {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 __ stop("shouldnotreachhere bytecode");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 void TemplateTable::aconst_null() {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 __ clr(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void TemplateTable::iconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 __ set(value, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 void TemplateTable::lconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 assert(value >= 0, "check this code");
a61af66fc99e Initial load
duke
parents:
diff changeset
211 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
212 __ set(value, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
214 __ set(value, Otos_l2);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 __ clr( Otos_l1);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void TemplateTable::fconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 static float zero = 0.0, one = 1.0, two = 2.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 float* p;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 switch( value ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
226 case 0: p = &zero; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 case 1: p = &one; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 case 2: p = &two; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
230 AddressLiteral a(p);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
231 __ sethi(a, G3_scratch);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
232 __ ldf(FloatRegisterImpl::S, G3_scratch, a.low10(), Ftos_f);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 void TemplateTable::dconst(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 static double zero = 0.0, one = 1.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
239 double* p;
a61af66fc99e Initial load
duke
parents:
diff changeset
240 switch( value ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
242 case 0: p = &zero; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 case 1: p = &one; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
245 AddressLiteral a(p);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
246 __ sethi(a, G3_scratch);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
247 __ ldf(FloatRegisterImpl::D, G3_scratch, a.low10(), Ftos_d);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // %%%%% Should factore most snippet templates across platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void TemplateTable::bipush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 __ ldsb( at_bcp(1), Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 void TemplateTable::sipush() {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 __ get_2_byte_integer_at_bcp(1, G3_scratch, Otos_i, InterpreterMacroAssembler::Signed);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 void TemplateTable::ldc(bool wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
265 Label call_ldc, notInt, notString, notClass, exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 if (wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 __ ldub(Lbcp, 1, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 __ get_cpool_and_tags(O0, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // get type from tags
a61af66fc99e Initial load
duke
parents:
diff changeset
278 __ add(O2, tags_offset, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 __ ldub(O2, O1, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 __ cmp(O2, JVM_CONSTANT_UnresolvedString); // unresolved string? If so, must resolve
a61af66fc99e Initial load
duke
parents:
diff changeset
281 __ brx(Assembler::equal, true, Assembler::pt, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 __ cmp(O2, JVM_CONSTANT_UnresolvedClass); // unresolved class? If so, must resolve
a61af66fc99e Initial load
duke
parents:
diff changeset
285 __ brx(Assembler::equal, true, Assembler::pt, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 __ cmp(O2, JVM_CONSTANT_UnresolvedClassInError); // unresolved class in error state
a61af66fc99e Initial load
duke
parents:
diff changeset
289 __ brx(Assembler::equal, true, Assembler::pn, call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 __ cmp(O2, JVM_CONSTANT_Class); // need to call vm to get java mirror of the class
a61af66fc99e Initial load
duke
parents:
diff changeset
293 __ brx(Assembler::notEqual, true, Assembler::pt, notClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
294 __ delayed()->add(O0, base_offset, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 __ bind(call_ldc);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 __ set(wide, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
298 call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
299 __ push(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 __ ba(false, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
302
a61af66fc99e Initial load
duke
parents:
diff changeset
303 __ bind(notClass);
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // __ add(O0, base_offset, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
305 __ sll(O1, LogBytesPerWord, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 __ cmp(O2, JVM_CONSTANT_Integer);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 __ brx(Assembler::notEqual, true, Assembler::pt, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 __ delayed()->cmp(O2, JVM_CONSTANT_String);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 __ ld(O0, O1, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 __ ba(false, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // __ cmp(O2, JVM_CONSTANT_String);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 __ brx(Assembler::notEqual, true, Assembler::pt, notString);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 __ delayed()->ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 __ ld_ptr(O0, O1, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
320 __ push(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
321 __ ba(false, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 __ bind(notString);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // __ ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
326 __ push(ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
329 }
a61af66fc99e Initial load
duke
parents:
diff changeset
330
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
331 // Fast path for caching oop constants.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
332 // %%% We should use this to handle Class and String constants also.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
333 // %%% It will simplify the ldc/primitive path considerably.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
334 void TemplateTable::fast_aldc(bool wide) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
335 transition(vtos, atos);
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
336
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
337 if (!EnableMethodHandles) {
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
338 // We should not encounter this bytecode if !EnableMethodHandles.
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
339 // 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
340 // 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
341 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
342 InterpreterRuntime::throw_IncompatibleClassChangeError));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
343 // 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
344 __ should_not_reach_here();
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
345 return;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
346 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
347
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
348 Register Rcache = G3_scratch;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
349 Register Rscratch = G4_scratch;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
350
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
351 resolve_cache_and_index(f1_oop, Otos_i, Rcache, Rscratch, wide ? sizeof(u2) : sizeof(u1));
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
352
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
353 __ verify_oop(Otos_i);
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
354
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
355 Label L_done;
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
356 const Register Rcon_klass = G3_scratch; // same as Rcache
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
357 const Register Rarray_klass = G4_scratch; // same as Rscratch
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
358 __ load_klass(Otos_i, Rcon_klass);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
359 AddressLiteral array_klass_addr((address)Universe::systemObjArrayKlassObj_addr());
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
360 __ load_contents(array_klass_addr, Rarray_klass);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
361 __ cmp(Rarray_klass, Rcon_klass);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
362 __ brx(Assembler::notEqual, false, Assembler::pt, L_done);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
363 __ delayed()->nop();
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
364 __ ld(Address(Otos_i, arrayOopDesc::length_offset_in_bytes()), Rcon_klass);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
365 __ tst(Rcon_klass);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
366 __ brx(Assembler::zero, true, Assembler::pt, L_done);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
367 __ delayed()->clr(Otos_i); // executed only if branch is taken
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
368
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
369 // Load the exception from the system-array which wraps it:
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
370 __ load_heap_oop(Otos_i, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
371 __ throw_if_not_x(Assembler::never, Interpreter::throw_exception_entry(), G3_scratch);
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
372
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1846
diff changeset
373 __ bind(L_done);
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
374 }
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
375
0
a61af66fc99e Initial load
duke
parents:
diff changeset
376 void TemplateTable::ldc2_w() {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 Label retry, resolved, Long, exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 __ bind(retry);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 __ get_cpool_and_tags(O0, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 const int base_offset = constantPoolOopDesc::header_size() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // get type from tags
a61af66fc99e Initial load
duke
parents:
diff changeset
387 __ add(O2, tags_offset, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 __ ldub(O2, O1, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 __ sll(O1, LogBytesPerWord, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 __ add(O0, O1, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 __ cmp(O2, JVM_CONSTANT_Double);
a61af66fc99e Initial load
duke
parents:
diff changeset
394 __ brx(Assembler::notEqual, false, Assembler::pt, Long);
a61af66fc99e Initial load
duke
parents:
diff changeset
395 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // A double can be placed at word-aligned locations in the constant pool.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Check out Conversions.java for an example.
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // Also constantPoolOopDesc::header_size() is 20, which makes it very difficult
a61af66fc99e Initial load
duke
parents:
diff changeset
399 // to double-align double on the constant pool. SG, 11/7/97
a61af66fc99e Initial load
duke
parents:
diff changeset
400 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
401 __ ldf(FloatRegisterImpl::D, G3_scratch, base_offset, Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
403 FloatRegister f = Ftos_d;
a61af66fc99e Initial load
duke
parents:
diff changeset
404 __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset + sizeof(jdouble)/2,
a61af66fc99e Initial load
duke
parents:
diff changeset
406 f->successor());
a61af66fc99e Initial load
duke
parents:
diff changeset
407 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
408 __ push(dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
409 __ ba(false, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
410 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 __ bind(Long);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
414 __ ldx(G3_scratch, base_offset, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
416 __ ld(G3_scratch, base_offset, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 __ ld(G3_scratch, base_offset + sizeof(jlong)/2, Otos_l->successor());
a61af66fc99e Initial load
duke
parents:
diff changeset
418 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
419 __ push(ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 void TemplateTable::locals_index(Register reg, int offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
426 __ ldub( at_bcp(offset), reg );
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void TemplateTable::locals_index_wide(Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // offset is 2, not 1, because Lbcp points to wide prefix code
a61af66fc99e Initial load
duke
parents:
diff changeset
432 __ get_2_byte_integer_at_bcp(2, G4_scratch, reg, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void TemplateTable::iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
436 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Rewrite iload,iload pair into fast_iload2
a61af66fc99e Initial load
duke
parents:
diff changeset
438 // iload,caload pair into fast_icaload
a61af66fc99e Initial load
duke
parents:
diff changeset
439 if (RewriteFrequentPairs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
440 Label rewrite, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
441
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // get next byte
a61af66fc99e Initial load
duke
parents:
diff changeset
443 __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_iload)), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // if _iload, wait to rewrite to iload2. We only want to rewrite the
a61af66fc99e Initial load
duke
parents:
diff changeset
446 // last two iloads in a pair. Comparing against fast_iload means that
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // the next bytecode is neither an iload or a caload, and therefore
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // an iload pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
449 __ cmp(G3_scratch, (int)Bytecodes::_iload);
a61af66fc99e Initial load
duke
parents:
diff changeset
450 __ br(Assembler::equal, false, Assembler::pn, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
451 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 __ cmp(G3_scratch, (int)Bytecodes::_fast_iload);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 __ br(Assembler::equal, false, Assembler::pn, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
455 __ delayed()->set(Bytecodes::_fast_iload2, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 __ cmp(G3_scratch, (int)Bytecodes::_caload);
a61af66fc99e Initial load
duke
parents:
diff changeset
458 __ br(Assembler::equal, false, Assembler::pn, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 __ delayed()->set(Bytecodes::_fast_icaload, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
460
a61af66fc99e Initial load
duke
parents:
diff changeset
461 __ set(Bytecodes::_fast_iload, G4_scratch); // don't check again
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // G4_scratch: fast bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
464 __ bind(rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 patch_bytecode(Bytecodes::_iload, G4_scratch, G3_scratch, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Get the local value into tos
a61af66fc99e Initial load
duke
parents:
diff changeset
470 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 void TemplateTable::fast_iload2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
476 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
478 __ push_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
479 locals_index(G3_scratch, 3); // get next bytecode's local index.
a61af66fc99e Initial load
duke
parents:
diff changeset
480 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 void TemplateTable::fast_iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
485 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
486 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
487 }
a61af66fc99e Initial load
duke
parents:
diff changeset
488
a61af66fc99e Initial load
duke
parents:
diff changeset
489 void TemplateTable::lload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
490 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
492 __ access_local_long( G3_scratch, Otos_l );
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void TemplateTable::fload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 __ access_local_float( G3_scratch, Ftos_f );
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 void TemplateTable::dload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 __ access_local_double( G3_scratch, Ftos_d );
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 void TemplateTable::aload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 __ access_local_ptr( G3_scratch, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 void TemplateTable::wide_iload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 void TemplateTable::wide_lload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 __ access_local_long( G3_scratch, Otos_l );
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530
a61af66fc99e Initial load
duke
parents:
diff changeset
531 void TemplateTable::wide_fload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
532 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 __ access_local_float( G3_scratch, Ftos_f );
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void TemplateTable::wide_dload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
540 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 __ access_local_double( G3_scratch, Ftos_d );
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 void TemplateTable::wide_aload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
548 __ access_local_ptr( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
549 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 void TemplateTable::iaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
556 // tos: array
a61af66fc99e Initial load
duke
parents:
diff changeset
557 __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
558 __ ld(O3, arrayOopDesc::base_offset_in_bytes(T_INT), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void TemplateTable::laload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 transition(itos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // O2: array
a61af66fc99e Initial load
duke
parents:
diff changeset
566 __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
567 __ ld_long(O3, arrayOopDesc::base_offset_in_bytes(T_LONG), Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 void TemplateTable::faload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
572 transition(itos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // O2: array
a61af66fc99e Initial load
duke
parents:
diff changeset
575 __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
576 __ ldf(FloatRegisterImpl::S, O3, arrayOopDesc::base_offset_in_bytes(T_FLOAT), Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
577 }
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::daload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 transition(itos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // O2: array
a61af66fc99e Initial load
duke
parents:
diff changeset
584 __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 __ ldf(FloatRegisterImpl::D, O3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE), Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 void TemplateTable::aaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
590 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // tos: array
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
593 __ index_check(O2, Otos_i, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O3);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
594 __ load_heap_oop(O3, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 void TemplateTable::baload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // tos: array
a61af66fc99e Initial load
duke
parents:
diff changeset
603 __ index_check(O2, Otos_i, 0, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 __ ldsb(O3, arrayOopDesc::base_offset_in_bytes(T_BYTE), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void TemplateTable::caload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
609 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // tos: array
a61af66fc99e Initial load
duke
parents:
diff changeset
612 __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
613 __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
614 }
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616 void TemplateTable::fast_icaload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // tos: array
a61af66fc99e Initial load
duke
parents:
diff changeset
620 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 __ access_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
622 __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
623 __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 void TemplateTable::saload() {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 // Otos_i: index
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // tos: array
a61af66fc99e Initial load
duke
parents:
diff changeset
631 __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 __ ldsh(O3, arrayOopDesc::base_offset_in_bytes(T_SHORT), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 }
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635
a61af66fc99e Initial load
duke
parents:
diff changeset
636 void TemplateTable::iload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
637 transition(vtos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
638 __ ld( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 void TemplateTable::lload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
643 transition(vtos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
644 assert(n+1 < Argument::n_register_parameters, "would need more code");
a61af66fc99e Initial load
duke
parents:
diff changeset
645 __ load_unaligned_long(Llocals, Interpreter::local_offset_in_bytes(n+1), Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 void TemplateTable::fload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
650 transition(vtos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
651 assert(n < Argument::n_register_parameters, "would need more code");
a61af66fc99e Initial load
duke
parents:
diff changeset
652 __ ldf( FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(n), Ftos_f );
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 void TemplateTable::dload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 transition(vtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
658 FloatRegister dst = Ftos_d;
a61af66fc99e Initial load
duke
parents:
diff changeset
659 __ load_unaligned_double(Llocals, Interpreter::local_offset_in_bytes(n+1), dst);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 }
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662
a61af66fc99e Initial load
duke
parents:
diff changeset
663 void TemplateTable::aload(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 __ ld_ptr( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668
a61af66fc99e Initial load
duke
parents:
diff changeset
669 void TemplateTable::aload_0() {
a61af66fc99e Initial load
duke
parents:
diff changeset
670 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 // According to bytecode histograms, the pairs:
a61af66fc99e Initial load
duke
parents:
diff changeset
673 //
a61af66fc99e Initial load
duke
parents:
diff changeset
674 // _aload_0, _fast_igetfield (itos)
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // _aload_0, _fast_agetfield (atos)
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // _aload_0, _fast_fgetfield (ftos)
a61af66fc99e Initial load
duke
parents:
diff changeset
677 //
a61af66fc99e Initial load
duke
parents:
diff changeset
678 // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // bytecode checks the next bytecode and then rewrites the current
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // bytecode into a pair bytecode; otherwise it rewrites the current
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // bytecode into _fast_aload_0 that doesn't do the pair check anymore.
a61af66fc99e Initial load
duke
parents:
diff changeset
682 //
a61af66fc99e Initial load
duke
parents:
diff changeset
683 if (RewriteFrequentPairs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 Label rewrite, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
685
a61af66fc99e Initial load
duke
parents:
diff changeset
686 // get next byte
a61af66fc99e Initial load
duke
parents:
diff changeset
687 __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
688
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // do actual aload_0
a61af66fc99e Initial load
duke
parents:
diff changeset
690 aload(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // if _getfield then wait with rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
693 __ cmp(G3_scratch, (int)Bytecodes::_getfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 __ br(Assembler::equal, false, Assembler::pn, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // if _igetfield then rewrite to _fast_iaccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
698 assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
a61af66fc99e Initial load
duke
parents:
diff changeset
699 __ cmp(G3_scratch, (int)Bytecodes::_fast_igetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
700 __ br(Assembler::equal, false, Assembler::pn, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 __ delayed()->set(Bytecodes::_fast_iaccess_0, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // if _agetfield then rewrite to _fast_aaccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
704 assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 __ cmp(G3_scratch, (int)Bytecodes::_fast_agetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
706 __ br(Assembler::equal, false, Assembler::pn, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
707 __ delayed()->set(Bytecodes::_fast_aaccess_0, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // if _fgetfield then rewrite to _fast_faccess_0
a61af66fc99e Initial load
duke
parents:
diff changeset
710 assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
a61af66fc99e Initial load
duke
parents:
diff changeset
711 __ cmp(G3_scratch, (int)Bytecodes::_fast_fgetfield);
a61af66fc99e Initial load
duke
parents:
diff changeset
712 __ br(Assembler::equal, false, Assembler::pn, rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
713 __ delayed()->set(Bytecodes::_fast_faccess_0, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
714
a61af66fc99e Initial load
duke
parents:
diff changeset
715 // else rewrite to _fast_aload0
a61af66fc99e Initial load
duke
parents:
diff changeset
716 assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
a61af66fc99e Initial load
duke
parents:
diff changeset
717 __ set(Bytecodes::_fast_aload_0, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
718
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // rewrite
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // G4_scratch: fast bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
721 __ bind(rewrite);
a61af66fc99e Initial load
duke
parents:
diff changeset
722 patch_bytecode(Bytecodes::_aload_0, G4_scratch, G3_scratch, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
723 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
725 aload(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 void TemplateTable::istore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
732 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
733 __ store_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
734 }
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736
a61af66fc99e Initial load
duke
parents:
diff changeset
737 void TemplateTable::lstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
740 __ store_local_long( G3_scratch, Otos_l );
a61af66fc99e Initial load
duke
parents:
diff changeset
741 }
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::fstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
746 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
747 __ store_local_float( G3_scratch, Ftos_f );
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 void TemplateTable::dstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
753 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
754 __ store_local_double( G3_scratch, Ftos_d );
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758 void TemplateTable::astore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
760 __ load_ptr(0, Otos_i);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
761 __ inc(Lesp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
762 __ verify_oop_or_return_address(Otos_i, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 locals_index(G3_scratch);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
764 __ store_local_ptr(G3_scratch, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
765 }
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767
a61af66fc99e Initial load
duke
parents:
diff changeset
768 void TemplateTable::wide_istore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
769 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
771 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
772 __ store_local_int( G3_scratch, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776 void TemplateTable::wide_lstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
777 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 __ pop_l();
a61af66fc99e Initial load
duke
parents:
diff changeset
779 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
780 __ store_local_long( G3_scratch, Otos_l );
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783
a61af66fc99e Initial load
duke
parents:
diff changeset
784 void TemplateTable::wide_fstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
785 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
786 __ pop_f();
a61af66fc99e Initial load
duke
parents:
diff changeset
787 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 __ store_local_float( G3_scratch, Ftos_f );
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 void TemplateTable::wide_dstore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
793 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
794 __ pop_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
795 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
796 __ store_local_double( G3_scratch, Ftos_d );
a61af66fc99e Initial load
duke
parents:
diff changeset
797 }
a61af66fc99e Initial load
duke
parents:
diff changeset
798
a61af66fc99e Initial load
duke
parents:
diff changeset
799
a61af66fc99e Initial load
duke
parents:
diff changeset
800 void TemplateTable::wide_astore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
802 __ load_ptr(0, Otos_i);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
803 __ inc(Lesp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 __ verify_oop_or_return_address(Otos_i, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
805 locals_index_wide(G3_scratch);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
806 __ store_local_ptr(G3_scratch, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810 void TemplateTable::iastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
811 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
812 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
813 // Otos_i: val
a61af66fc99e Initial load
duke
parents:
diff changeset
814 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
815 __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
816 __ st(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_INT));
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 void TemplateTable::lastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // Otos_l: val
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
825 __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
826 __ st_long(Otos_l, O2, arrayOopDesc::base_offset_in_bytes(T_LONG));
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 void TemplateTable::fastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
831 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
832 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // Ftos_f: val
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
835 __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
836 __ stf(FloatRegisterImpl::S, Ftos_f, O2, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
a61af66fc99e Initial load
duke
parents:
diff changeset
839
a61af66fc99e Initial load
duke
parents:
diff changeset
840 void TemplateTable::dastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
841 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
843 // Fos_d: val
a61af66fc99e Initial load
duke
parents:
diff changeset
844 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
845 __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 __ stf(FloatRegisterImpl::D, Ftos_d, O2, arrayOopDesc::base_offset_in_bytes(T_DOUBLE));
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 void TemplateTable::aastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
851 Label store_ok, is_null, done;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
854 __ ld(Lesp, Interpreter::expr_offset_in_bytes(1), O2); // get index
a61af66fc99e Initial load
duke
parents:
diff changeset
855 __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(2), O3); // get array
a61af66fc99e Initial load
duke
parents:
diff changeset
856 // Otos_i: val
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // O2: index
a61af66fc99e Initial load
duke
parents:
diff changeset
858 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
859 __ verify_oop(Otos_i);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
860 __ index_check_without_pop(O3, O2, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
861
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // do array store check - check for NULL value first
a61af66fc99e Initial load
duke
parents:
diff changeset
863 __ br_null( Otos_i, false, Assembler::pn, is_null );
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
864 __ delayed()->nop();
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
865
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
866 __ load_klass(O3, O4); // get array klass
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
867 __ load_klass(Otos_i, O5); // get value klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
868
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // do fast instanceof cache test
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 __ ld_ptr(O4, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes(), O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
872
a61af66fc99e Initial load
duke
parents:
diff changeset
873 assert(Otos_i == O0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // Otos_i: value
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // O1: addr - offset
a61af66fc99e Initial load
duke
parents:
diff changeset
877 // O2: index
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
879 // O4: array element klass
a61af66fc99e Initial load
duke
parents:
diff changeset
880 // O5: value klass
a61af66fc99e Initial load
duke
parents:
diff changeset
881
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
882 // Address element(O1, 0, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
883
0
a61af66fc99e Initial load
duke
parents:
diff changeset
884 // Generate a fast subtype check. Branch to store_ok if no
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // failure. Throw if failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
886 __ gen_subtype_check( O5, O4, G3_scratch, G4_scratch, G1_scratch, store_ok );
a61af66fc99e Initial load
duke
parents:
diff changeset
887
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // Not a subtype; so must throw exception
a61af66fc99e Initial load
duke
parents:
diff changeset
889 __ throw_if_not_x( Assembler::never, Interpreter::_throw_ArrayStoreException_entry, G3_scratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
890
a61af66fc99e Initial load
duke
parents:
diff changeset
891 // Store is OK.
a61af66fc99e Initial load
duke
parents:
diff changeset
892 __ bind(store_ok);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
893 do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
894
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895 __ ba(false,done);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
896 __ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
897
a61af66fc99e Initial load
duke
parents:
diff changeset
898 __ bind(is_null);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
899 do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
900
0
a61af66fc99e Initial load
duke
parents:
diff changeset
901 __ profile_null_seen(G3_scratch);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
902 __ inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
903 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906
a61af66fc99e Initial load
duke
parents:
diff changeset
907 void TemplateTable::bastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
908 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
909 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
910 // Otos_i: val
a61af66fc99e Initial load
duke
parents:
diff changeset
911 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
912 __ index_check(O3, O2, 0, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
913 __ stb(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_BYTE));
a61af66fc99e Initial load
duke
parents:
diff changeset
914 }
a61af66fc99e Initial load
duke
parents:
diff changeset
915
a61af66fc99e Initial load
duke
parents:
diff changeset
916
a61af66fc99e Initial load
duke
parents:
diff changeset
917 void TemplateTable::castore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
918 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
919 __ pop_i(O2); // index
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // Otos_i: val
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // O3: array
a61af66fc99e Initial load
duke
parents:
diff changeset
922 __ index_check(O3, O2, LogBytesPerShort, G3_scratch, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 __ sth(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_CHAR));
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
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::sastore() {
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // %%%%% Factor across platform
a61af66fc99e Initial load
duke
parents:
diff changeset
929 castore();
a61af66fc99e Initial load
duke
parents:
diff changeset
930 }
a61af66fc99e Initial load
duke
parents:
diff changeset
931
a61af66fc99e Initial load
duke
parents:
diff changeset
932
a61af66fc99e Initial load
duke
parents:
diff changeset
933 void TemplateTable::istore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 __ st(Otos_i, Llocals, Interpreter::local_offset_in_bytes(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 void TemplateTable::lstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 transition(ltos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
941 assert(n+1 < Argument::n_register_parameters, "only handle register cases");
a61af66fc99e Initial load
duke
parents:
diff changeset
942 __ store_unaligned_long(Otos_l, Llocals, Interpreter::local_offset_in_bytes(n+1));
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
945
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 void TemplateTable::fstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
948 transition(ftos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
949 assert(n < Argument::n_register_parameters, "only handle register cases");
a61af66fc99e Initial load
duke
parents:
diff changeset
950 __ stf(FloatRegisterImpl::S, Ftos_f, Llocals, Interpreter::local_offset_in_bytes(n));
a61af66fc99e Initial load
duke
parents:
diff changeset
951 }
a61af66fc99e Initial load
duke
parents:
diff changeset
952
a61af66fc99e Initial load
duke
parents:
diff changeset
953
a61af66fc99e Initial load
duke
parents:
diff changeset
954 void TemplateTable::dstore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
955 transition(dtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
956 FloatRegister src = Ftos_d;
a61af66fc99e Initial load
duke
parents:
diff changeset
957 __ store_unaligned_double(src, Llocals, Interpreter::local_offset_in_bytes(n+1));
a61af66fc99e Initial load
duke
parents:
diff changeset
958 }
a61af66fc99e Initial load
duke
parents:
diff changeset
959
a61af66fc99e Initial load
duke
parents:
diff changeset
960
a61af66fc99e Initial load
duke
parents:
diff changeset
961 void TemplateTable::astore(int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
963 __ load_ptr(0, Otos_i);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
964 __ inc(Lesp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
965 __ verify_oop_or_return_address(Otos_i, G3_scratch);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
966 __ store_local_ptr(n, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
967 }
a61af66fc99e Initial load
duke
parents:
diff changeset
968
a61af66fc99e Initial load
duke
parents:
diff changeset
969
a61af66fc99e Initial load
duke
parents:
diff changeset
970 void TemplateTable::pop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
971 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
972 __ inc(Lesp, Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
973 }
a61af66fc99e Initial load
duke
parents:
diff changeset
974
a61af66fc99e Initial load
duke
parents:
diff changeset
975
a61af66fc99e Initial load
duke
parents:
diff changeset
976 void TemplateTable::pop2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
977 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
978 __ inc(Lesp, 2 * Interpreter::stackElementSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
979 }
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981
a61af66fc99e Initial load
duke
parents:
diff changeset
982 void TemplateTable::dup() {
a61af66fc99e Initial load
duke
parents:
diff changeset
983 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // stack: ..., a
a61af66fc99e Initial load
duke
parents:
diff changeset
985 // load a and tag
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
986 __ load_ptr(0, Otos_i);
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
987 __ push_ptr(Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
988 // stack: ..., a, a
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 void TemplateTable::dup_x1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
993 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
994 // stack: ..., a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
995 __ load_ptr( 1, G3_scratch); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
996 __ load_ptr( 0, Otos_l1); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
997 __ store_ptr(1, Otos_l1); // put b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
998 __ store_ptr(0, G3_scratch); // put a - like swap
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
999 __ push_ptr(Otos_l1); // push b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 // stack: ..., b, a, b
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1002
a61af66fc99e Initial load
duke
parents:
diff changeset
1003
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 void TemplateTable::dup_x2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 // stack: ..., a, b, c
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 // get c and push on stack, reuse registers
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1008 __ load_ptr( 0, G3_scratch); // get c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1009 __ push_ptr(G3_scratch); // push c with tag
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // stack: ..., a, b, c, c (c in reg) (Lesp - 4)
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 // (stack offsets n+1 now)
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1012 __ load_ptr( 3, Otos_l1); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1013 __ store_ptr(3, G3_scratch); // put c at 3
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 // stack: ..., c, b, c, c (a in reg)
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1015 __ load_ptr( 2, G3_scratch); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1016 __ store_ptr(2, Otos_l1); // put a at 2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // stack: ..., c, a, c, c (b in reg)
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1018 __ store_ptr(1, G3_scratch); // put b at 1
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 // stack: ..., c, a, b, c
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 void TemplateTable::dup2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 transition(vtos, vtos);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1025 __ load_ptr(1, G3_scratch); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1026 __ load_ptr(0, Otos_l1); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1027 __ push_ptr(G3_scratch); // push a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1028 __ push_ptr(Otos_l1); // push b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 // stack: ..., a, b, a, b
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 void TemplateTable::dup2_x1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // stack: ..., a, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1036 __ load_ptr( 1, Lscratch); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1037 __ load_ptr( 2, Otos_l1); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1038 __ store_ptr(2, Lscratch); // put b at a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // stack: ..., b, b, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1040 __ load_ptr( 0, G3_scratch); // get c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1041 __ store_ptr(1, G3_scratch); // put c at b
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // stack: ..., b, c, c
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1043 __ store_ptr(0, Otos_l1); // put a at c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 // stack: ..., b, c, a
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1045 __ push_ptr(Lscratch); // push b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1046 __ push_ptr(G3_scratch); // push c
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // stack: ..., b, c, a, b, c
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1049
a61af66fc99e Initial load
duke
parents:
diff changeset
1050
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 // The spec says that these types can be a mixture of category 1 (1 word)
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 // types and/or category 2 types (long and doubles)
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 void TemplateTable::dup2_x2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // stack: ..., a, b, c, d
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1056 __ load_ptr( 1, Lscratch); // get c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1057 __ load_ptr( 3, Otos_l1); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1058 __ store_ptr(3, Lscratch); // put c at 3
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1059 __ store_ptr(1, Otos_l1); // put a at 1
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 // stack: ..., c, b, a, d
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1061 __ load_ptr( 2, G3_scratch); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1062 __ load_ptr( 0, Otos_l1); // get d
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1063 __ store_ptr(0, G3_scratch); // put b at 0
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1064 __ store_ptr(2, Otos_l1); // put d at 2
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 // stack: ..., c, d, a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1066 __ push_ptr(Lscratch); // push c
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1067 __ push_ptr(Otos_l1); // push d
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // stack: ..., c, d, a, b, c, d
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1070
a61af66fc99e Initial load
duke
parents:
diff changeset
1071
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 void TemplateTable::swap() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // stack: ..., a, b
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1075 __ load_ptr( 1, G3_scratch); // get a
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1076 __ load_ptr( 0, Otos_l1); // get b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1077 __ store_ptr(0, G3_scratch); // put b
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1078 __ store_ptr(1, Otos_l1); // put a
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // stack: ..., b, a
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 void TemplateTable::iop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 __ pop_i(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 case add: __ add(O1, Otos_i, Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 case sub: __ sub(O1, Otos_i, Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // %%%%% Mul may not exist: better to call .mul?
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 case mul: __ smul(O1, Otos_i, Otos_i); break;
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1091 case _and: __ and3(O1, Otos_i, Otos_i); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1092 case _or: __ or3(O1, Otos_i, Otos_i); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1093 case _xor: __ xor3(O1, Otos_i, Otos_i); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 case shl: __ sll(O1, Otos_i, Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 case shr: __ sra(O1, Otos_i, Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 case ushr: __ srl(O1, Otos_i, Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 void TemplateTable::lop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 __ pop_l(O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 #ifdef _LP64
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1107 case add: __ add(O2, Otos_l, Otos_l); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1108 case sub: __ sub(O2, Otos_l, Otos_l); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1109 case _and: __ and3(O2, Otos_l, Otos_l); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1110 case _or: __ or3(O2, Otos_l, Otos_l); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1111 case _xor: __ xor3(O2, Otos_l, Otos_l); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 case add: __ addcc(O3, Otos_l2, Otos_l2); __ addc(O2, Otos_l1, Otos_l1); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 case sub: __ subcc(O3, Otos_l2, Otos_l2); __ subc(O2, Otos_l1, Otos_l1); break;
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1115 case _and: __ and3(O3, Otos_l2, Otos_l2); __ and3(O2, Otos_l1, Otos_l1); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1116 case _or: __ or3(O3, Otos_l2, Otos_l2); __ or3(O2, Otos_l1, Otos_l1); break;
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1117 case _xor: __ xor3(O3, Otos_l2, Otos_l2); __ xor3(O2, Otos_l1, Otos_l1); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
a61af66fc99e Initial load
duke
parents:
diff changeset
1123
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 void TemplateTable::idiv() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 // %%%%% Later: ForSPARC/V7 call .sdiv library routine,
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // %%%%% Use ldsw...sdivx on pure V9 ABI. 64 bit safe.
a61af66fc99e Initial load
duke
parents:
diff changeset
1127
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 __ pop_i(O1); // get 1st op
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // Y contains upper 32 bits of result, set it to 0 or all ones
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 __ wry(G0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 __ mov(~0, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1134
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 __ tst(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 Label neg;
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 __ br(Assembler::negative, true, Assembler::pn, neg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 __ delayed()->wry(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 __ bind(neg);
a61af66fc99e Initial load
duke
parents:
diff changeset
1140
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 __ tst(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1144
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 const int min_int = 0x80000000;
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 Label regular;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 __ cmp(Otos_i, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 __ br(Assembler::notEqual, false, Assembler::pt, regular);
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // Don't put set in delay slot
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // Set will turn into multiple instructions in 64 bit mode
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 __ set(min_int, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 __ delayed()->set(min_int, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 __ cmp(O1, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 __ br(Assembler::equal, true, Assembler::pt, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 __ delayed()->mov(O1, Otos_i); // (mov only executed if branch taken)
a61af66fc99e Initial load
duke
parents:
diff changeset
1161
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 __ bind(regular);
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 __ sdiv(O1, Otos_i, Otos_i); // note: irem uses O1 after this instruction!
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
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::irem() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 __ mov(Otos_i, O2); // save divisor
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 idiv(); // %%%% Hack: exploits fact that idiv leaves dividend in O1
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 __ smul(Otos_i, O2, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 __ sub(O1, Otos_i, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1175
a61af66fc99e Initial load
duke
parents:
diff changeset
1176
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 void TemplateTable::lmul() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 __ pop_l(O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 __ mulx(Otos_l, O2, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lmul));
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1187
a61af66fc99e Initial load
duke
parents:
diff changeset
1188
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 void TemplateTable::ldiv() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1191
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 // check for zero
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 __ pop_l(O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 __ tst(Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 __ sdivx(O2, Otos_l, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 __ orcc(Otos_l1, Otos_l2, G0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::ldiv));
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1204
a61af66fc99e Initial load
duke
parents:
diff changeset
1205
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 void TemplateTable::lrem() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1208
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // check for zero
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 __ pop_l(O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 __ tst(Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 __ sdivx(O2, Otos_l, Otos_l2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 __ mulx (Otos_l2, Otos_l, Otos_l2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 __ sub (O2, Otos_l2, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 __ orcc(Otos_l1, Otos_l2, G0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 __ throw_if_not_icc(Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
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::lshl() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 transition(itos, ltos); // %%%% could optimize, fill delay slot or opt for ultra
a61af66fc99e Initial load
duke
parents:
diff changeset
1227
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 __ pop_l(O2); // shift value in O2, O3
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 __ sllx(O2, Otos_i, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 __ lshl(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1235
a61af66fc99e Initial load
duke
parents:
diff changeset
1236
a61af66fc99e Initial load
duke
parents:
diff changeset
1237 void TemplateTable::lshr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 transition(itos, ltos); // %%%% see lshl comment
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 __ pop_l(O2); // shift value in O2, O3
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 __ srax(O2, Otos_i, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1243 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 __ lshr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 void TemplateTable::lushr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 transition(itos, ltos); // %%%% see lshl comment
a61af66fc99e Initial load
duke
parents:
diff changeset
1252
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 __ pop_l(O2); // shift value in O2, O3
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 __ srlx(O2, Otos_i, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 __ lushr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 }
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::fop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 transition(ftos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 case add: __ pop_f(F4); __ fadd(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 case sub: __ pop_f(F4); __ fsub(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 case mul: __ pop_f(F4); __ fmul(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 case div: __ pop_f(F4); __ fdiv(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 case rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 assert(Ftos_f == F0, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // LP64 calling conventions use F1, F3 for passing 2 floats
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 __ pop_f(F1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1274 __ fmov(FloatRegisterImpl::S, Ftos_f, F3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 __ pop_i(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 __ stf(FloatRegisterImpl::S, Ftos_f, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 __ ld( __ d_tmp, O1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::frem));
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 assert( Ftos_f == F0, "fix this code" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1283
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1287
a61af66fc99e Initial load
duke
parents:
diff changeset
1288
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 void TemplateTable::dop2(Operation op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 transition(dtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 case add: __ pop_d(F4); __ fadd(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 case sub: __ pop_d(F4); __ fsub(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 case mul: __ pop_d(F4); __ fmul(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 case div: __ pop_d(F4); __ fdiv(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 case rem:
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 // Pass arguments in D0, D2
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 __ fmov(FloatRegisterImpl::D, Ftos_f, F2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 __ pop_d( F0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 // Pass arguments in O0O1, O2O3
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 __ ldd( __ d_tmp, O2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 __ pop_d(Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 __ ldd( __ d_tmp, O0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::drem));
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 assert( Ftos_d == F0, "fix this code" );
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1312
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1316
a61af66fc99e Initial load
duke
parents:
diff changeset
1317
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 void TemplateTable::ineg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 __ neg(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
a61af66fc99e Initial load
duke
parents:
diff changeset
1323
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 void TemplateTable::lneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 transition(ltos, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1326 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 __ sub(G0, Otos_l, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 __ lneg(Otos_l1, Otos_l2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1332
a61af66fc99e Initial load
duke
parents:
diff changeset
1333
a61af66fc99e Initial load
duke
parents:
diff changeset
1334 void TemplateTable::fneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1335 transition(ftos, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 __ fneg(FloatRegisterImpl::S, Ftos_f);
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::dneg() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1341 transition(dtos, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // v8 has fnegd if source and dest are the same
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 __ fneg(FloatRegisterImpl::D, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1345
a61af66fc99e Initial load
duke
parents:
diff changeset
1346
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 void TemplateTable::iinc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 __ ldsb(Lbcp, 2, O2); // load constant
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 __ access_local_int(G3_scratch, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 __ add(Otos_i, O2, Otos_i);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1353 __ st(Otos_i, G3_scratch, 0); // access_local_int puts E.A. in G3_scratch
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 void TemplateTable::wide_iinc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 __ get_2_byte_integer_at_bcp( 4, O2, O3, InterpreterMacroAssembler::Signed);
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 __ access_local_int(G3_scratch, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 __ add(Otos_i, O3, Otos_i);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1363 __ st(Otos_i, G3_scratch, 0); // access_local_int puts E.A. in G3_scratch
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1365
a61af66fc99e Initial load
duke
parents:
diff changeset
1366
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 void TemplateTable::convert() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 // %%%%% Factor this first part accross platforms
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 TosState tos_in = ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 TosState tos_out = ilgl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 case Bytecodes::_i2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 case Bytecodes::_i2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 case Bytecodes::_i2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 case Bytecodes::_i2b: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 case Bytecodes::_i2c: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 case Bytecodes::_i2s: tos_in = itos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 case Bytecodes::_l2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 case Bytecodes::_l2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 case Bytecodes::_l2d: tos_in = ltos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 case Bytecodes::_f2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 case Bytecodes::_f2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 case Bytecodes::_f2d: tos_in = ftos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 case Bytecodes::_d2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 case Bytecodes::_d2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 case Bytecodes::_d2f: tos_in = dtos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 case Bytecodes::_l2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 case Bytecodes::_f2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 case Bytecodes::_d2i: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 case Bytecodes::_i2b: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1395 case Bytecodes::_i2c: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 case Bytecodes::_i2s: tos_out = itos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 case Bytecodes::_i2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 case Bytecodes::_f2l: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 case Bytecodes::_d2l: tos_out = ltos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 case Bytecodes::_i2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 case Bytecodes::_l2f: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 case Bytecodes::_d2f: tos_out = ftos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 case Bytecodes::_i2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 case Bytecodes::_l2d: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 case Bytecodes::_f2d: tos_out = dtos; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 default : ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 transition(tos_in, tos_out);
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1410
a61af66fc99e Initial load
duke
parents:
diff changeset
1411
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 // Conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
1413 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 case Bytecodes::_i2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 // Sign extend the 32 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 __ sra ( Otos_i, 0, Otos_l );
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 __ addcc(Otos_i, 0, Otos_l2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 __ br(Assembler::greaterEqual, true, Assembler::pt, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 __ delayed()->clr(Otos_l1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 __ set(~0, Otos_l1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 case Bytecodes::_i2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 __ st(Otos_i, __ d_tmp );
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 __ ldf(FloatRegisterImpl::S, __ d_tmp, F0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 __ fitof(FloatRegisterImpl::S, F0, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1432
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 case Bytecodes::_i2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 __ st(Otos_i, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 __ ldf(FloatRegisterImpl::S, __ d_tmp, F0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 __ fitof(FloatRegisterImpl::D, F0, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1437 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1438
a61af66fc99e Initial load
duke
parents:
diff changeset
1439 case Bytecodes::_i2b:
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 __ sll(Otos_i, 24, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 __ sra(Otos_i, 24, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1443
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 case Bytecodes::_i2c:
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 __ sll(Otos_i, 16, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 __ srl(Otos_i, 16, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1448
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 case Bytecodes::_i2s:
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 __ sll(Otos_i, 16, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 __ sra(Otos_i, 16, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1453
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 case Bytecodes::_l2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 __ mov(Otos_l2, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 // Sign-extend into the high 32 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 __ sra(Otos_l, 0, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1462
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 case Bytecodes::_l2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 case Bytecodes::_l2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 __ st_long(Otos_l, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 __ ldf(FloatRegisterImpl::D, __ d_tmp, Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1467
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 if (VM_Version::v9_instructions_work()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 if (bytecode() == Bytecodes::_l2f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1470 __ fxtof(FloatRegisterImpl::S, Ftos_d, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 __ fxtof(FloatRegisterImpl::D, Ftos_d, Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 __ call_VM_leaf(
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 Lscratch,
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 bytecode() == Bytecodes::_l2f
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 ? CAST_FROM_FN_PTR(address, SharedRuntime::l2f)
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 : CAST_FROM_FN_PTR(address, SharedRuntime::l2d)
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1483
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 case Bytecodes::_f2i: {
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 Label isNaN;
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 // result must be 0 if value is NaN; test by comparing value to itself
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 __ fcmp(FloatRegisterImpl::S, Assembler::fcc0, Ftos_f, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 // According to the v8 manual, you have to have a non-fp instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 // between fcmp and fb.
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 if (!VM_Version::v9_instructions_work()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 __ nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 __ fb(Assembler::f_unordered, true, Assembler::pn, isNaN);
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 __ delayed()->clr(Otos_i); // NaN
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 __ ftoi(FloatRegisterImpl::S, Ftos_f, F30);
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 __ stf(FloatRegisterImpl::S, F30, __ d_tmp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 __ ld(__ d_tmp, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 __ bind(isNaN);
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1501
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 case Bytecodes::_f2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 // must uncache tos
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 __ push_f();
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 __ pop_f(F1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 __ pop_i(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::f2l));
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1512
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 case Bytecodes::_f2d:
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 __ ftof( FloatRegisterImpl::S, FloatRegisterImpl::D, Ftos_f, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1515 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1516
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 case Bytecodes::_d2i:
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 case Bytecodes::_d2l:
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 // must uncache tos
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 __ push_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 // LP64 calling conventions pass first double arg in D0
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 __ pop_d( Ftos_d );
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1525 __ pop_i( O0 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 __ pop_i( O1 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1528 __ call_VM_leaf(Lscratch,
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 bytecode() == Bytecodes::_d2i
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 ? CAST_FROM_FN_PTR(address, SharedRuntime::d2i)
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 : CAST_FROM_FN_PTR(address, SharedRuntime::d2l));
a61af66fc99e Initial load
duke
parents:
diff changeset
1532 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1533
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 case Bytecodes::_d2f:
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 if (VM_Version::v9_instructions_work()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 __ ftof( FloatRegisterImpl::D, FloatRegisterImpl::S, Ftos_d, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
1537 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 // must uncache tos
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 __ push_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 __ pop_i(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 __ pop_i(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::d2f));
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1546
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1551
a61af66fc99e Initial load
duke
parents:
diff changeset
1552
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 void TemplateTable::lcmp() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1554 transition(ltos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1555
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 __ pop_l(O1); // pop off value 1, value 2 is in O0
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 __ lcmp( O1, Otos_l, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 __ pop_l(O2); // cmp O2,3 to O0,1
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 __ lcmp( O2, O3, Otos_l1, Otos_l2, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1564
a61af66fc99e Initial load
duke
parents:
diff changeset
1565
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 void TemplateTable::float_cmp(bool is_float, int unordered_result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1567
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 if (is_float) __ pop_f(F2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 else __ pop_d(F2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1570
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 assert(Ftos_f == F0 && Ftos_d == F0, "alias checking:");
a61af66fc99e Initial load
duke
parents:
diff changeset
1572
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 __ float_cmp( is_float, unordered_result, F2, F0, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1575
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 void TemplateTable::branch(bool is_jsr, bool is_wide) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 // Note: on SPARC, we use InterpreterMacroAssembler::if_cmp also.
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 __ verify_oop(Lmethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 __ verify_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
1580
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 const Register O2_bumped_count = O2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1582 __ profile_taken_branch(G3_scratch, O2_bumped_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
1583
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // get (wide) offset to O1_disp
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 const Register O1_disp = O1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 if (is_wide) __ get_4_byte_integer_at_bcp( 1, G4_scratch, O1_disp, InterpreterMacroAssembler::set_CC);
a61af66fc99e Initial load
duke
parents:
diff changeset
1587 else __ get_2_byte_integer_at_bcp( 1, G4_scratch, O1_disp, InterpreterMacroAssembler::Signed, InterpreterMacroAssembler::set_CC);
a61af66fc99e Initial load
duke
parents:
diff changeset
1588
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 // Handle all the JSR stuff here, then exit.
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 // It's much shorter and cleaner than intermingling with the
605
98cb887364d3 6810672: Comment typos
twisti
parents: 450
diff changeset
1591 // non-JSR normal-branch stuff occurring below.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 if( is_jsr ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 // compute return address as bci in Otos_i
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
1594 __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 __ sub(Lbcp, G3_scratch, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 __ sub(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 // Bump Lbcp to target of JSR
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 __ add(Lbcp, O1_disp, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1600 // Push returnAddress for "ret" on stack
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
1601 __ push_ptr(Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 // And away we go!
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1606
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 // Normal (non-jsr) branch handling
a61af66fc99e Initial load
duke
parents:
diff changeset
1608
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 // Save the current Lbcp
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 const Register O0_cur_bcp = O0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 __ mov( Lbcp, O0_cur_bcp );
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1613
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 if ( increment_invocation_counter_for_backward_branches ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 Label Lforward;
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 // check branch direction
a61af66fc99e Initial load
duke
parents:
diff changeset
1618 __ br( Assembler::positive, false, Assembler::pn, Lforward );
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 // Bump bytecode pointer by displacement (take the branch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 __ delayed()->add( O1_disp, Lbcp, Lbcp ); // add to bc addr
a61af66fc99e Initial load
duke
parents:
diff changeset
1621
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1622 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1623 Label Lno_mdo, Loverflow;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1624 int increment = InvocationCounter::count_increment;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1625 int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1626 if (ProfileInterpreter) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1627 // If no method data exists, go to profile_continue.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1628 __ ld_ptr(Lmethod, methodOopDesc::method_data_offset(), G4_scratch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1629 __ br_null(G4_scratch, false, Assembler::pn, Lno_mdo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1630 __ delayed()->nop();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1631
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1632 // Increment backedge counter in the MDO
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1633 Address mdo_backedge_counter(G4_scratch, in_bytes(methodDataOopDesc::backedge_counter_offset()) +
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1634 in_bytes(InvocationCounter::counter_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1635 __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, Lscratch,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1636 Assembler::notZero, &Lforward);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1637 __ ba(false, Loverflow);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1638 __ delayed()->nop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1640
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1641 // If there's no MDO, increment counter in methodOop
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1642 __ bind(Lno_mdo);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1643 Address backedge_counter(Lmethod, in_bytes(methodOopDesc::backedge_counter_offset()) +
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1644 in_bytes(InvocationCounter::counter_offset()));
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1645 __ increment_mask_and_jump(backedge_counter, increment, mask, G3_scratch, Lscratch,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1646 Assembler::notZero, &Lforward);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1647 __ bind(Loverflow);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1648
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1649 // notify point for loop, pass branch bytecode
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1650 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O0_cur_bcp);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1651
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1652 // Was an OSR adapter generated?
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1653 // O0 = osr nmethod
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1654 __ br_null(O0, false, Assembler::pn, Lforward);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1655 __ delayed()->nop();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1656
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1657 // Has the nmethod been invalidated already?
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1658 __ ld(O0, nmethod::entry_bci_offset(), O2);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1659 __ cmp(O2, InvalidOSREntryBci);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1660 __ br(Assembler::equal, false, Assembler::pn, Lforward);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1661 __ delayed()->nop();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1662
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1663 // migrate the interpreter frame off of the stack
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1664
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1665 __ mov(G2_thread, L7);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1666 // save nmethod
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1667 __ mov(O0, L6);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1668 __ set_last_Java_frame(SP, noreg);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1669 __ call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), L7);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1670 __ reset_last_Java_frame();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1671 __ mov(L7, G2_thread);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1672
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1673 // move OSR nmethod to I1
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1674 __ mov(L6, I1);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1675
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1676 // OSR buffer to I0
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1677 __ mov(O0, I0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1678
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1679 // remove the interpreter frame
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1680 __ restore(I5_savedSP, 0, SP);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1681
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1682 // Jump to the osr code.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1683 __ ld_ptr(O1, nmethod::osr_entry_point_offset(), O2);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1684 __ jmp(O2, G0);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1685 __ delayed()->nop();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1686
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 } else {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1688 // Update Backedge branch separately from invocations
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1689 const Register G4_invoke_ctr = G4;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1690 __ increment_backedge_counter(G4_invoke_ctr, G1_scratch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1691 if (ProfileInterpreter) {
2118
dd031b2226de 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 1972
diff changeset
1692 __ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1693 if (UseOnStackReplacement) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1694 __ test_backedge_count_for_osr(O2_bumped_count, O0_cur_bcp, G3_scratch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1695 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1696 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1697 if (UseOnStackReplacement) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1698 __ test_backedge_count_for_osr(G4_invoke_ctr, O0_cur_bcp, G3_scratch);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
1699 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1702
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 __ bind(Lforward);
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 // Bump bytecode pointer by displacement (take the branch)
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 __ add( O1_disp, Lbcp, Lbcp );// add to bc addr
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 // continue with bytecode @ target
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above,
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 // %%%%% and changing dispatch_next to dispatch_only
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1713
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 // Note Condition in argument is TemplateTable::Condition
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 // arg scope is within class scope
a61af66fc99e Initial load
duke
parents:
diff changeset
1717
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 void TemplateTable::if_0cmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 // no pointers, integer only!
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 // assume branch is more often taken than not (loops use backward branches)
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 __ cmp( Otos_i, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 __ if_cmp(ccNot(cc), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1725
a61af66fc99e Initial load
duke
parents:
diff changeset
1726
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 void TemplateTable::if_icmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 __ pop_i(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 __ cmp(O1, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 __ if_cmp(ccNot(cc), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733
a61af66fc99e Initial load
duke
parents:
diff changeset
1734
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 void TemplateTable::if_nullcmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 __ tst(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 __ if_cmp(ccNot(cc), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1740
a61af66fc99e Initial load
duke
parents:
diff changeset
1741
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 void TemplateTable::if_acmp(Condition cc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 __ pop_ptr(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 __ verify_oop(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 __ cmp(O1, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 __ if_cmp(ccNot(cc), true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1750
a61af66fc99e Initial load
duke
parents:
diff changeset
1751
a61af66fc99e Initial load
duke
parents:
diff changeset
1752
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 void TemplateTable::ret() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 locals_index(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 __ access_local_returnAddress(G3_scratch, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 // Otos_i contains the bci, compute the bcp from that
a61af66fc99e Initial load
duke
parents:
diff changeset
1758
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 // jsr result was labeled as an 'itos' not an 'atos' because we cannot GC
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 // the result. The return address (really a BCI) was stored with an
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 // 'astore' because JVM specs claim it's a pointer-sized thing. Hence in
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 // the 64-bit build the 32-bit BCI is actually in the low bits of a 64-bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 // loaded value.
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 { Label zzz ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 __ set (65536, G3_scratch) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 __ cmp (Otos_i, G3_scratch) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 __ bp( Assembler::lessEqualUnsigned, false, Assembler::xcc, Assembler::pn, zzz);
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 __ stop("BCI is in the wrong register half?");
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 __ bind (zzz) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1776
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 __ profile_ret(vtos, Otos_i, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1778
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
1779 __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 __ add(G3_scratch, Otos_i, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 __ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1784
a61af66fc99e Initial load
duke
parents:
diff changeset
1785
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 void TemplateTable::wide_ret() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 locals_index_wide(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 __ access_local_returnAddress(G3_scratch, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 // Otos_i contains the bci, compute the bcp from that
a61af66fc99e Initial load
duke
parents:
diff changeset
1791
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 __ profile_ret(vtos, Otos_i, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1793
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
1794 __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 __ add(G3_scratch, Otos_i, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 __ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1799
a61af66fc99e Initial load
duke
parents:
diff changeset
1800
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 void TemplateTable::tableswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 Label default_case, continue_execution;
a61af66fc99e Initial load
duke
parents:
diff changeset
1804
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 // align bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 __ add(Lbcp, BytesPerInt, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 __ and3(O1, -BytesPerInt, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 // load lo, hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 __ ld(O1, 1 * BytesPerInt, O2); // Low Byte
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 __ ld(O1, 2 * BytesPerInt, O3); // High Byte
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 // Sign extend the 32 bits
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 __ sra ( Otos_i, 0, Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 #endif /* _LP64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
1815
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 // check against lo & hi
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 __ cmp( Otos_i, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 __ br( Assembler::less, false, Assembler::pn, default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 __ delayed()->cmp( Otos_i, O3 );
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 __ br( Assembler::greater, false, Assembler::pn, default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // lookup dispatch offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 __ delayed()->sub(Otos_i, O2, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 __ profile_switch_case(O2, O3, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 __ sll(O2, LogBytesPerInt, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 __ add(O2, 3 * BytesPerInt, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 __ ba(false, continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 __ delayed()->ld(O1, O2, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 // handle default
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 __ bind(default_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 __ profile_switch_default(O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 __ ld(O1, 0, O2); // get default offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 // continue execution
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 __ bind(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 __ add(Lbcp, O2, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1837
a61af66fc99e Initial load
duke
parents:
diff changeset
1838
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 void TemplateTable::lookupswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 transition(itos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 __ stop("lookupswitch bytecode should have been rewritten");
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1843
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 void TemplateTable::fast_linearswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 Label loop_entry, loop, found, continue_execution;
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // align bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 __ add(Lbcp, BytesPerInt, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 __ and3(O1, -BytesPerInt, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 // set counter
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 __ ld(O1, BytesPerInt, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 __ sll(O2, LogBytesPerInt + 1, O2); // in word-pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 __ add(O1, 2 * BytesPerInt, O3); // set first pair addr
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 __ ba(false, loop_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 __ delayed()->add(O3, O2, O2); // counter now points past last pair
a61af66fc99e Initial load
duke
parents:
diff changeset
1856
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 // table search
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 __ cmp(O4, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 __ br(Assembler::equal, true, Assembler::pn, found);
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 __ delayed()->ld(O3, BytesPerInt, O4); // offset -> O4
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 __ inc(O3, 2 * BytesPerInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
1863
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 __ bind(loop_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 __ cmp(O2, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 __ brx(Assembler::greaterUnsigned, true, Assembler::pt, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 __ delayed()->ld(O3, 0, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
1868
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 // default case
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 __ ld(O1, 0, O4); // get default offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 __ profile_switch_default(O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 __ ba(false, continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1876
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 // entry found -> get offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 __ bind(found);
a61af66fc99e Initial load
duke
parents:
diff changeset
1879 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 __ sub(O3, O1, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 __ sub(O3, 2*BytesPerInt, O3);
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 __ srl(O3, LogBytesPerInt + 1, O3); // in word-pairs
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 __ profile_switch_case(O3, O1, O2, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
1884
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 __ bind(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 __ add(Lbcp, O4, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1890
a61af66fc99e Initial load
duke
parents:
diff changeset
1891
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 void TemplateTable::fast_binaryswitch() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 transition(itos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 // Implementation using the following core algorithm: (copied from Intel)
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 //
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // int binary_search(int key, LookupswitchPair* array, int n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 // // Binary search according to "Methodik des Programmierens" by
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 // int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 // int j = n;
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 // while (i+1 < j) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // // with Q: for all i: 0 <= i < n: key < a[i]
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 // // where a stands for the array and assuming that the (inexisting)
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 // // element a[n] is infinitely big.
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 // int h = (i + j) >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 // // i < h < j
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 // if (key < array[h].fast_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 // j = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1910 // } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // i = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 // // R: a[i] <= key < a[i+1] or Q
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 // // (i.e., if key is within array, i is the correct index)
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 // return i;
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1918
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 // register allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 assert(Otos_i == O0, "alias checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 const Register Rkey = Otos_i; // already set (tosca)
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 const Register Rarray = O1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 const Register Ri = O2;
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 const Register Rj = O3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 const Register Rh = O4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 const Register Rscratch = O5;
a61af66fc99e Initial load
duke
parents:
diff changeset
1927
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 const int log_entry_size = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 const int entry_size = 1 << log_entry_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1930
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 Label found;
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 // Find Array start
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 __ add(Lbcp, 3 * BytesPerInt, Rarray);
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 __ and3(Rarray, -BytesPerInt, Rarray);
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 // initialize i & j (in delay slot)
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 __ clr( Ri );
a61af66fc99e Initial load
duke
parents:
diff changeset
1937
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 // and start
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 Label entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 __ ba(false, entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
1941 __ delayed()->ld( Rarray, -BytesPerInt, Rj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 // (Rj is already in the native byte-ordering.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1943
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 // binary search loop
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 { Label loop;
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 __ bind( loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 // int h = (i + j) >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 __ sra( Rh, 1, Rh );
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 // if (key < array[h].fast_match()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 // j = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 // } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 // i = h;
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 __ sll( Rh, log_entry_size, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 __ ld( Rarray, Rscratch, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // (Rscratch is already in the native byte-ordering.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 __ cmp( Rkey, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 if ( VM_Version::v9_instructions_work() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 __ movcc( Assembler::less, false, Assembler::icc, Rh, Rj ); // j = h if (key < array[h].fast_match())
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 __ movcc( Assembler::greaterEqual, false, Assembler::icc, Rh, Ri ); // i = h if (key >= array[h].fast_match())
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 Label end_of_if;
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 __ br( Assembler::less, true, Assembler::pt, end_of_if );
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 __ delayed()->mov( Rh, Rj ); // if (<) Rj = Rh
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 __ mov( Rh, Ri ); // else i = h
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 __ bind(end_of_if); // }
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1969
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 // while (i+1 < j)
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 __ bind( entry );
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 __ add( Ri, 1, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 __ cmp(Rscratch, Rj);
a61af66fc99e Initial load
duke
parents:
diff changeset
1974 __ br( Assembler::less, true, Assembler::pt, loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 __ delayed()->add( Ri, Rj, Rh ); // start h = i + j >> 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1977
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 // end of binary search, result index is i (must check again!)
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 Label default_case;
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 Label continue_execution;
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 __ mov( Ri, Rh ); // Save index in i for profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 __ sll( Ri, log_entry_size, Ri );
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 __ ld( Rarray, Ri, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 // (Rscratch is already in the native byte-ordering.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 __ cmp( Rkey, Rscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 __ br( Assembler::notEqual, true, Assembler::pn, default_case );
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 __ delayed()->ld( Rarray, -2 * BytesPerInt, Rj ); // load default offset -> j
a61af66fc99e Initial load
duke
parents:
diff changeset
1990
a61af66fc99e Initial load
duke
parents:
diff changeset
1991 // entry found -> j = offset
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 __ inc( Ri, BytesPerInt );
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 __ profile_switch_case(Rh, Rj, Rscratch, Rkey);
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 __ ld( Rarray, Ri, Rj );
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // (Rj is already in the native byte-ordering.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1996
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 __ ba(false, continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2001
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 __ bind(default_case); // fall through (if not profiling)
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 __ profile_switch_default(Ri);
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 __ bind(continue_execution);
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 __ add( Lbcp, Rj, Lbcp );
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 __ dispatch_next( vtos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2009
a61af66fc99e Initial load
duke
parents:
diff changeset
2010
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 void TemplateTable::_return(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 transition(state, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 assert(_desc->calls_vm(), "inconsistent calls_vm information");
a61af66fc99e Initial load
duke
parents:
diff changeset
2014
a61af66fc99e Initial load
duke
parents:
diff changeset
2015 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 assert(state == vtos, "only valid state");
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 __ mov(G0, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2018 __ access_local_ptr(G3_scratch, Otos_i);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2019 __ load_klass(Otos_i, O2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 __ set(JVM_ACC_HAS_FINALIZER, G3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 __ ld(O2, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022 __ andcc(G3, O2, G0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 Label skip_register_finalizer;
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 __ br(Assembler::zero, false, Assembler::pn, skip_register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2026
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 // Call out to do finalizer registration
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2029
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 __ bind(skip_register_finalizer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2031 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2032
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 __ remove_activation(state, /* throw_monitor_exception */ true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2034
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 // The caller's SP was adjusted upon method entry to accomodate
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 // the callee's non-argument locals. Undo that adjustment.
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 __ ret(); // return to caller
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 __ delayed()->restore(I5_savedSP, G0, SP);
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2040
a61af66fc99e Initial load
duke
parents:
diff changeset
2041
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 // ----------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 // Volatile variables demand their effects be made known to all CPU's in
a61af66fc99e Initial load
duke
parents:
diff changeset
2044 // order. Store buffers on most chips allow reads & writes to reorder; the
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 // JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of
a61af66fc99e Initial load
duke
parents:
diff changeset
2046 // memory barrier (i.e., it's not sufficient that the interpreter does not
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 // reorder volatile references, the hardware also must not reorder them).
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 // According to the new Java Memory Model (JMM):
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 // (1) All volatiles are serialized wrt to each other.
a61af66fc99e Initial load
duke
parents:
diff changeset
2051 // ALSO reads & writes act as aquire & release, so:
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // (2) A read cannot let unrelated NON-volatile memory refs that happen after
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // the read float up to before the read. It's OK for non-volatile memory refs
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // that happen before the volatile read to float down below it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 // (3) Similar a volatile write cannot let unrelated NON-volatile memory refs
a61af66fc99e Initial load
duke
parents:
diff changeset
2056 // that happen BEFORE the write float down to after the write. It's OK for
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // non-volatile memory refs that happen after the volatile write to float up
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // before it.
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 //
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // We only put in barriers around volatile refs (they are expensive), not
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 // _between_ memory refs (that would require us to track the flavor of the
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // previous memory refs). Requirements (2) and (3) require some barriers
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // before volatile stores and after volatile loads. These nearly cover
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // requirement (1) but miss the volatile-store-volatile-load case. This final
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // case is placed after volatile-stores although it could just as well go
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // before volatile-loads.
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // Helper function to insert a is-volatile test and memory barrier
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 // All current sparc implementations run in TSO, needing only StoreLoad
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 if ((order_constraint & Assembler::StoreLoad) == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2071 __ membar( order_constraint );
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2073
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // ----------------------------------------------------------------------------
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2075 void TemplateTable::resolve_cache_and_index(int byte_no,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2076 Register result,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2077 Register Rcache,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2078 Register index,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2079 size_t index_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2080 // Depends on cpCacheOop layout!
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 Label resolved;
a61af66fc99e Initial load
duke
parents:
diff changeset
2082
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2083 __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2084 if (byte_no == f1_oop) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2085 // 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
2086 // 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
2087 // 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
2088 assert_different_registers(result, Rcache);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2089 __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2090 ConstantPoolCacheEntry::f1_offset(), result);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2091 __ tst(result);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2092 __ br(Assembler::notEqual, false, Assembler::pt, resolved);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2093 __ delayed()->set((int)bytecode(), O1);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2094 } else {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2095 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
2096 assert(result == noreg, ""); //else change code for setting result
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2097 const int shift_count = (1 + byte_no)*BitsPerByte;
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2098
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2099 __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2100 ConstantPoolCacheEntry::indices_offset(), Lbyte_code);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2101
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2102 __ srl( Lbyte_code, shift_count, Lbyte_code );
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2103 __ and3( Lbyte_code, 0xFF, Lbyte_code );
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2104 __ cmp( Lbyte_code, (int)bytecode());
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2105 __ br( Assembler::equal, false, Assembler::pt, resolved);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2106 __ delayed()->set((int)bytecode(), O1);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2107 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2108
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 address entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 case Bytecodes::_getstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 case Bytecodes::_putstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 case Bytecodes::_getfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 case Bytecodes::_putfield : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 case Bytecodes::_invokevirtual : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 case Bytecodes::_invokespecial : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 case Bytecodes::_invokestatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke); break;
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
2119 case Bytecodes::_invokedynamic : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic); break;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2120 case Bytecodes::_fast_aldc : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc); break;
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1579
diff changeset
2121 case Bytecodes::_fast_aldc_w : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc); break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 default : ShouldNotReachHere(); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 // first time invocation - must resolve first
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 __ call_VM(noreg, entry, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 // Update registers with resolved info
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2127 __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2128 if (result != noreg)
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2129 __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2130 ConstantPoolCacheEntry::f1_offset(), result);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 __ bind(resolved);
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2133
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 Register Rmethod,
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 Register Ritable_index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 Register Rflags,
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 bool is_invokevirtual,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2139 bool is_invokevfinal,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2140 bool is_invokedynamic) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 // Uses both G3_scratch and G4_scratch
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 Register Rscratch = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 assert_different_registers(Rcache, Rmethod, Ritable_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
2145
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2147
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 // determine constant pool cache field offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 const int method_offset = in_bytes(
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 cp_base_offset +
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 (is_invokevirtual
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 ? ConstantPoolCacheEntry::f2_offset()
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 : ConstantPoolCacheEntry::f1_offset()
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 )
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 );
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 const int flags_offset = in_bytes(cp_base_offset +
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 ConstantPoolCacheEntry::flags_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 // access constant pool cache fields
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 const int index_offset = in_bytes(cp_base_offset +
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 ConstantPoolCacheEntry::f2_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
2161
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 if (is_invokevfinal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 __ get_cache_and_index_at_bcp(Rcache, Rscratch, 1);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2164 __ ld_ptr(Rcache, method_offset, Rmethod);
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2165 } else if (byte_no == f1_oop) {
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2166 // Resolved f1_oop goes directly into 'method' register.
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2167 resolve_cache_and_index(byte_no, Rmethod, Rcache, Rscratch, sizeof(u4));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 } else {
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2169 resolve_cache_and_index(byte_no, noreg, Rcache, Rscratch, sizeof(u2));
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2170 __ ld_ptr(Rcache, method_offset, Rmethod);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2172
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 if (Ritable_index != noreg) {
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2174 __ ld_ptr(Rcache, index_offset, Ritable_index);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 }
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2176 __ ld_ptr(Rcache, flags_offset, Rflags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2178
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 // The Rcache register must be set before call
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 void TemplateTable::load_field_cp_cache_entry(Register Robj,
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 Register Rcache,
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 Register index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 Register Roffset,
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 Register Rflags,
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 assert_different_registers(Rcache, Rflags, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2187
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2189
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2190 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2191 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 if (is_static) {
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2193 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f1_offset(), Robj);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2196
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 // The registers Rcache and index expected to be set before call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 // Correct values of the Rcache and index registers are preserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 void TemplateTable::jvmti_post_field_access(Register Rcache,
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 Register index,
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 bool is_static,
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 bool has_tos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2204
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 if (JvmtiExport::can_post_field_access()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 // Check to see if a field access watch has been set before we take
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 // the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 Label Label1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 assert_different_registers(Rcache, index, G1_scratch);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2210 AddressLiteral get_field_access_count_addr(JvmtiExport::get_field_access_count_addr());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 __ load_contents(get_field_access_count_addr, G1_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 __ tst(G1_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 __ br(Assembler::zero, false, Assembler::pt, Label1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2215
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 __ add(Rcache, in_bytes(cp_base_offset), Rcache);
a61af66fc99e Initial load
duke
parents:
diff changeset
2217
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 if (is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 __ clr(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 if (has_tos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 // save object pointer before call_VM() clobbers it
450
b22701a8b88f 6474243: suspicious jvmti code that uses oop unsafely across GC point
coleenp
parents: 356
diff changeset
2223 __ push_ptr(Otos_i); // put object on tos where GC wants it.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // Load top of stack (do not pop the value off the stack);
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2230 // Otos_i: object pointer or NULL if static
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 // Rcache: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access),
a61af66fc99e Initial load
duke
parents:
diff changeset
2233 Otos_i, Rcache);
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 if (!is_static && has_tos) {
450
b22701a8b88f 6474243: suspicious jvmti code that uses oop unsafely across GC point
coleenp
parents: 356
diff changeset
2235 __ pop_ptr(Otos_i); // restore object pointer
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 __ get_cache_and_index_at_bcp(Rcache, index, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 __ bind(Label1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2245
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 Register index = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 Register Rclass = Rcache;
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 Register Roffset= G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 Register Rflags = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2252
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2253 resolve_cache_and_index(byte_no, noreg, Rcache, index, sizeof(u2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2254 jvmti_post_field_access(Rcache, index, is_static, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2256
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 __ verify_oop(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2262
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 Label exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
2264
a61af66fc99e Initial load
duke
parents:
diff changeset
2265 Assembler::Membar_mask_bits membar_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
a61af66fc99e Initial load
duke
parents:
diff changeset
2267
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 if (__ membar_has_effect(membar_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 // Get volatile flag
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2271 __ and3(Rflags, Lscratch, Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2273
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 Label checkVolatile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2275
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 // compute field type
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj;
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 // Make sure we don't need to mask Rflags for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
2281
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 // Check atos before itos for getstatic, more likely (in Queens at least)
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 __ cmp(Rflags, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 __ br(Assembler::notEqual, false, Assembler::pt, notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 __ delayed() ->cmp(Rflags, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2286
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 // atos
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2288 __ load_heap_oop(Rclass, Roffset, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 __ push(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2292 patch_bytecode(Bytecodes::_fast_agetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2295 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2296
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 __ bind(notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2298
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 // cmp(Rflags, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2300 __ br(Assembler::notEqual, false, Assembler::pt, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 __ delayed() ->cmp(Rflags, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2302
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 // itos
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 __ ld(Rclass, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2305 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 patch_bytecode(Bytecodes::_fast_igetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2310 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2311
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2313
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 // cmp(Rflags, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 __ br(Assembler::notEqual, false, Assembler::pt, notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 __ delayed() ->cmp(Rflags, btos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2317
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 // ltos
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 // load must be atomic
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 __ ld_long(Rclass, Roffset, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 __ push(ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 patch_bytecode(Bytecodes::_fast_lgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2327
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 __ bind(notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2329
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 // cmp(Rflags, btos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 __ br(Assembler::notEqual, false, Assembler::pt, notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 __ delayed() ->cmp(Rflags, ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2333
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 // btos
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 __ ldsb(Rclass, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 patch_bytecode(Bytecodes::_fast_bgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2342
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 __ bind(notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2344
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 // cmp(Rflags, ctos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 __ br(Assembler::notEqual, false, Assembler::pt, notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 __ delayed() ->cmp(Rflags, stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2348
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 // ctos
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 __ lduh(Rclass, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 patch_bytecode(Bytecodes::_fast_cgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2357
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 __ bind(notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2359
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 // cmp(Rflags, stos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 __ br(Assembler::notEqual, false, Assembler::pt, notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2362 __ delayed() ->cmp(Rflags, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2363
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 // stos
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 __ ldsh(Rclass, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 __ push(itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 patch_bytecode(Bytecodes::_fast_sgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2372
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 __ bind(notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2374
a61af66fc99e Initial load
duke
parents:
diff changeset
2375
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 // cmp(Rflags, ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2377 __ br(Assembler::notEqual, false, Assembler::pt, notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 __ delayed() ->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2379
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 // ftos
a61af66fc99e Initial load
duke
parents:
diff changeset
2381 __ ldf(FloatRegisterImpl::S, Rclass, Roffset, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 __ push(ftos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 patch_bytecode(Bytecodes::_fast_fgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2388
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 __ bind(notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2390
a61af66fc99e Initial load
duke
parents:
diff changeset
2391
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 // dtos
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 __ ldf(FloatRegisterImpl::D, Rclass, Roffset, Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 __ push(dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 patch_bytecode(Bytecodes::_fast_dgetfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2398
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 __ bind(checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 if (__ membar_has_effect(membar_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 // __ tst(Lscratch); executed in delay slot
a61af66fc99e Initial load
duke
parents:
diff changeset
2402 __ br(Assembler::zero, false, Assembler::pt, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 volatile_barrier(membar_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2406
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2409
a61af66fc99e Initial load
duke
parents:
diff changeset
2410
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 void TemplateTable::getfield(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 getfield_or_static(byte_no, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2414
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 void TemplateTable::getstatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 getfield_or_static(byte_no, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2418
a61af66fc99e Initial load
duke
parents:
diff changeset
2419
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 void TemplateTable::fast_accessfield(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2421 transition(atos, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 Register index = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 Register Roffset = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 Register Rflags = Rcache;
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2427
a61af66fc99e Initial load
duke
parents:
diff changeset
2428 __ get_cache_and_index_at_bcp(Rcache, index, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 jvmti_post_field_access(Rcache, index, /*is_static*/false, /*has_tos*/true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2430
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2431 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2432
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 __ null_check(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2435
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 Label exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
2437
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 Assembler::Membar_mask_bits membar_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 if (__ membar_has_effect(membar_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 // Get volatile flag
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2442 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Rflags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2443 __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2445
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 case Bytecodes::_fast_bgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 __ ldsb(Otos_i, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 case Bytecodes::_fast_cgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 __ lduh(Otos_i, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 case Bytecodes::_fast_sgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 __ ldsh(Otos_i, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2455 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 case Bytecodes::_fast_igetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 __ ld(Otos_i, Roffset, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 case Bytecodes::_fast_lgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 __ ld_long(Otos_i, Roffset, Otos_l);
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 case Bytecodes::_fast_fgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2463 __ ldf(FloatRegisterImpl::S, Otos_i, Roffset, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 case Bytecodes::_fast_dgetfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 __ ldf(FloatRegisterImpl::D, Otos_i, Roffset, Ftos_d);
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 case Bytecodes::_fast_agetfield:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2469 __ load_heap_oop(Otos_i, Roffset, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2470 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2474
a61af66fc99e Initial load
duke
parents:
diff changeset
2475 if (__ membar_has_effect(membar_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2476 __ btst(Lscratch, Rflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2477 __ br(Assembler::zero, false, Assembler::pt, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2478 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2479 volatile_barrier(membar_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2480 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2482
a61af66fc99e Initial load
duke
parents:
diff changeset
2483 if (state == atos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2484 __ verify_oop(Otos_i); // does not blow flags!
a61af66fc99e Initial load
duke
parents:
diff changeset
2485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2487
a61af66fc99e Initial load
duke
parents:
diff changeset
2488 void TemplateTable::jvmti_post_fast_field_mod() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2489 if (JvmtiExport::can_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 // Check to see if a field modification watch has been set before we take
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 // the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 Label done;
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2493 AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 __ load_contents(get_field_modification_count_addr, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 __ tst(G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2496 __ br(Assembler::zero, false, Assembler::pt, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 __ pop_ptr(G4_scratch); // copy the object pointer from tos
a61af66fc99e Initial load
duke
parents:
diff changeset
2499 __ verify_oop(G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 __ push_ptr(G4_scratch); // put the object pointer back on tos
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 __ get_cache_entry_pointer_at_bcp(G1_scratch, G3_scratch, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 // Save tos values before call_VM() clobbers them. Since we have
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 // to do it for every data type, we use the saved values as the
a61af66fc99e Initial load
duke
parents:
diff changeset
2504 // jvalue object.
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 switch (bytecode()) { // save tos values before call_VM() clobbers them
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 case Bytecodes::_fast_aputfield: __ push_ptr(Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 case Bytecodes::_fast_bputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2508 case Bytecodes::_fast_sputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2509 case Bytecodes::_fast_cputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2510 case Bytecodes::_fast_iputfield: __ push_i(Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2511 case Bytecodes::_fast_dputfield: __ push_d(Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2512 case Bytecodes::_fast_fputfield: __ push_f(Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2513 // get words in right order for use as jvalue object
a61af66fc99e Initial load
duke
parents:
diff changeset
2514 case Bytecodes::_fast_lputfield: __ push_l(Otos_l); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 // setup pointer to jvalue object
a61af66fc99e Initial load
duke
parents:
diff changeset
2517 __ mov(Lesp, G3_scratch); __ inc(G3_scratch, wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 // G4_scratch: object pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 // G1_scratch: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 // G3_scratch: jvalue object on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), G4_scratch, G1_scratch, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 switch (bytecode()) { // restore tos values
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 case Bytecodes::_fast_aputfield: __ pop_ptr(Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 case Bytecodes::_fast_bputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 case Bytecodes::_fast_sputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2526 case Bytecodes::_fast_cputfield: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 case Bytecodes::_fast_iputfield: __ pop_i(Otos_i); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 case Bytecodes::_fast_dputfield: __ pop_d(Ftos_d); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 case Bytecodes::_fast_fputfield: __ pop_f(Ftos_f); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 case Bytecodes::_fast_lputfield: __ pop_l(Otos_l); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2535
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 // The registers Rcache and index expected to be set before call.
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 // The function may destroy various registers, just not the Rcache and index registers.
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 void TemplateTable::jvmti_post_field_mod(Register Rcache, Register index, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2539 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2540
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 if (JvmtiExport::can_post_field_modification()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 // Check to see if a field modification watch has been set before we take
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 // the time to call into the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 Label Label1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 assert_different_registers(Rcache, index, G1_scratch);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2546 AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 __ load_contents(get_field_modification_count_addr, G1_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2548 __ tst(G1_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 __ br(Assembler::zero, false, Assembler::pt, Label1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2551
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 // The Rcache and index registers have been already set.
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 // This allows to eliminate this call but the Rcache and index
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 // registers must be correspondingly used after this line.
a61af66fc99e Initial load
duke
parents:
diff changeset
2555 __ get_cache_and_index_at_bcp(G1_scratch, G4_scratch, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2556
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 __ add(G1_scratch, in_bytes(cp_base_offset), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 if (is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 // Life is simple. Null out the object pointer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 __ clr(G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 Register Rflags = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 // Life is harder. The stack holds the value on top, followed by the
a61af66fc99e Initial load
duke
parents:
diff changeset
2564 // object. We don't know the size of the value, though; it could be
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 // one or two words depending on its type. As a result, we must find
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 // the type to determine where the object is.
a61af66fc99e Initial load
duke
parents:
diff changeset
2567
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 Label two_word, valsizeknown;
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2569 __ ld_ptr(G1_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 __ mov(Lesp, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 // Make sure we don't need to mask Rflags for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 __ cmp(Rflags, ltos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 __ br(Assembler::equal, false, Assembler::pt, two_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 __ delayed()->cmp(Rflags, dtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 __ br(Assembler::equal, false, Assembler::pt, two_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2579 __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 __ br(Assembler::always, false, Assembler::pt, valsizeknown);
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 __ bind(two_word);
a61af66fc99e Initial load
duke
parents:
diff changeset
2583
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(2));
a61af66fc99e Initial load
duke
parents:
diff changeset
2585
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 __ bind(valsizeknown);
a61af66fc99e Initial load
duke
parents:
diff changeset
2587 // setup object pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 __ ld_ptr(G4_scratch, 0, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 __ verify_oop(G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 // setup pointer to jvalue object
a61af66fc99e Initial load
duke
parents:
diff changeset
2592 __ mov(Lesp, G1_scratch); __ inc(G1_scratch, wordSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 // G4_scratch: object pointer or NULL if static
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 // G3_scratch: cache entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 // G1_scratch: jvalue object on the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification),
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 G4_scratch, G3_scratch, G1_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 __ get_cache_and_index_at_bcp(Rcache, index, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 __ bind(Label1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2602
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 void TemplateTable::pop_and_check_object(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2604 __ pop_ptr(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 __ null_check(r); // for field access must check obj.
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 __ verify_oop(r);
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2608
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 Register index = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 Register Rclass = Rcache;
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 Register Roffset= G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 Register Rflags = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2617
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2618 resolve_cache_and_index(byte_no, noreg, Rcache, index, sizeof(u2));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 jvmti_post_field_mod(Rcache, index, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
a61af66fc99e Initial load
duke
parents:
diff changeset
2621
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 Assembler::Membar_mask_bits read_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
a61af66fc99e Initial load
duke
parents:
diff changeset
2625
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 Label notVolatile, checkVolatile, exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 __ and3(Rflags, Lscratch, Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2630
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 if (__ membar_has_effect(read_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 __ tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 __ br(Assembler::zero, false, Assembler::pt, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2634 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 volatile_barrier(read_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2639
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 // Make sure we don't need to mask Rflags for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
2643
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 // compute field type
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 Label notInt, notShort, notChar, notObj, notByte, notLong, notFloat;
a61af66fc99e Initial load
duke
parents:
diff changeset
2646
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 if (is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 // putstatic with object type most likely, check that first
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 __ cmp(Rflags, atos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2650 __ br(Assembler::notEqual, false, Assembler::pt, notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 __ delayed() ->cmp(Rflags, itos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2652
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 // atos
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 __ pop_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 __ verify_oop(Otos_i);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2656
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2657 do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2658
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2661
a61af66fc99e Initial load
duke
parents:
diff changeset
2662 __ bind(notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2663
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 // cmp(Rflags, itos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 __ br(Assembler::notEqual, false, Assembler::pt, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 __ delayed() ->cmp(Rflags, btos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2667
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 // itos
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 __ st(Otos_i, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2673
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2675
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 // putfield with int type most likely, check that first
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 __ cmp(Rflags, itos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 __ br(Assembler::notEqual, false, Assembler::pt, notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 __ delayed() ->cmp(Rflags, atos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2681
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 // itos
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 __ st(Otos_i, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 patch_bytecode(Bytecodes::_fast_iputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2688 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2689
a61af66fc99e Initial load
duke
parents:
diff changeset
2690 __ bind(notInt);
a61af66fc99e Initial load
duke
parents:
diff changeset
2691 // cmp(Rflags, atos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2692 __ br(Assembler::notEqual, false, Assembler::pt, notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2693 __ delayed() ->cmp(Rflags, btos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2694
a61af66fc99e Initial load
duke
parents:
diff changeset
2695 // atos
a61af66fc99e Initial load
duke
parents:
diff changeset
2696 __ pop_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
2697 pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2698 __ verify_oop(Otos_i);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2699
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2700 do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2701
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2702 patch_bytecode(Bytecodes::_fast_aputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2703 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2704 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2705
a61af66fc99e Initial load
duke
parents:
diff changeset
2706 __ bind(notObj);
a61af66fc99e Initial load
duke
parents:
diff changeset
2707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2708
a61af66fc99e Initial load
duke
parents:
diff changeset
2709 // cmp(Rflags, btos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2710 __ br(Assembler::notEqual, false, Assembler::pt, notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2711 __ delayed() ->cmp(Rflags, ltos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2712
a61af66fc99e Initial load
duke
parents:
diff changeset
2713 // btos
a61af66fc99e Initial load
duke
parents:
diff changeset
2714 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
2715 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2716 __ stb(Otos_i, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2717 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2718 patch_bytecode(Bytecodes::_fast_bputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2720 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2721 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2722
a61af66fc99e Initial load
duke
parents:
diff changeset
2723 __ bind(notByte);
a61af66fc99e Initial load
duke
parents:
diff changeset
2724
a61af66fc99e Initial load
duke
parents:
diff changeset
2725 // cmp(Rflags, ltos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2726 __ br(Assembler::notEqual, false, Assembler::pt, notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2727 __ delayed() ->cmp(Rflags, ctos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2728
a61af66fc99e Initial load
duke
parents:
diff changeset
2729 // ltos
a61af66fc99e Initial load
duke
parents:
diff changeset
2730 __ pop_l();
a61af66fc99e Initial load
duke
parents:
diff changeset
2731 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2732 __ st_long(Otos_l, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2733 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2734 patch_bytecode(Bytecodes::_fast_lputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2736 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2737 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2738
a61af66fc99e Initial load
duke
parents:
diff changeset
2739 __ bind(notLong);
a61af66fc99e Initial load
duke
parents:
diff changeset
2740
a61af66fc99e Initial load
duke
parents:
diff changeset
2741 // cmp(Rflags, ctos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2742 __ br(Assembler::notEqual, false, Assembler::pt, notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2743 __ delayed() ->cmp(Rflags, stos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2744
a61af66fc99e Initial load
duke
parents:
diff changeset
2745 // ctos (char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2746 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
2747 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2748 __ sth(Otos_i, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2749 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2750 patch_bytecode(Bytecodes::_fast_cputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2751 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2752 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2753 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2754
a61af66fc99e Initial load
duke
parents:
diff changeset
2755 __ bind(notChar);
a61af66fc99e Initial load
duke
parents:
diff changeset
2756 // cmp(Rflags, stos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2757 __ br(Assembler::notEqual, false, Assembler::pt, notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2758 __ delayed() ->cmp(Rflags, ftos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2759
a61af66fc99e Initial load
duke
parents:
diff changeset
2760 // stos (char)
a61af66fc99e Initial load
duke
parents:
diff changeset
2761 __ pop_i();
a61af66fc99e Initial load
duke
parents:
diff changeset
2762 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2763 __ sth(Otos_i, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2764 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2765 patch_bytecode(Bytecodes::_fast_sputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2766 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2767 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2768 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2769
a61af66fc99e Initial load
duke
parents:
diff changeset
2770 __ bind(notShort);
a61af66fc99e Initial load
duke
parents:
diff changeset
2771 // cmp(Rflags, ftos );
a61af66fc99e Initial load
duke
parents:
diff changeset
2772 __ br(Assembler::notZero, false, Assembler::pt, notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2773 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2774
a61af66fc99e Initial load
duke
parents:
diff changeset
2775 // ftos
a61af66fc99e Initial load
duke
parents:
diff changeset
2776 __ pop_f();
a61af66fc99e Initial load
duke
parents:
diff changeset
2777 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2778 __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2779 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2780 patch_bytecode(Bytecodes::_fast_fputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2782 __ ba(false, checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2783 __ delayed()->tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2784
a61af66fc99e Initial load
duke
parents:
diff changeset
2785 __ bind(notFloat);
a61af66fc99e Initial load
duke
parents:
diff changeset
2786
a61af66fc99e Initial load
duke
parents:
diff changeset
2787 // dtos
a61af66fc99e Initial load
duke
parents:
diff changeset
2788 __ pop_d();
a61af66fc99e Initial load
duke
parents:
diff changeset
2789 if (!is_static) pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2790 __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2791 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2792 patch_bytecode(Bytecodes::_fast_dputfield, G3_scratch, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2794
a61af66fc99e Initial load
duke
parents:
diff changeset
2795 __ bind(checkVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2796 __ tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2797
a61af66fc99e Initial load
duke
parents:
diff changeset
2798 if (__ membar_has_effect(write_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2799 // __ tst(Lscratch); in delay slot
a61af66fc99e Initial load
duke
parents:
diff changeset
2800 __ br(Assembler::zero, false, Assembler::pt, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2801 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2802 volatile_barrier(Assembler::StoreLoad);
a61af66fc99e Initial load
duke
parents:
diff changeset
2803 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2804 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2805 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2806
a61af66fc99e Initial load
duke
parents:
diff changeset
2807 void TemplateTable::fast_storefield(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2808 transition(state, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
2809 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2810 Register Rclass = Rcache;
a61af66fc99e Initial load
duke
parents:
diff changeset
2811 Register Roffset= G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2812 Register Rflags = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2813 ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
2814
a61af66fc99e Initial load
duke
parents:
diff changeset
2815 jvmti_post_fast_field_mod();
a61af66fc99e Initial load
duke
parents:
diff changeset
2816
a61af66fc99e Initial load
duke
parents:
diff changeset
2817 __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2818
a61af66fc99e Initial load
duke
parents:
diff changeset
2819 Assembler::Membar_mask_bits read_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
2820 Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
a61af66fc99e Initial load
duke
parents:
diff changeset
2821 Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
a61af66fc99e Initial load
duke
parents:
diff changeset
2822
a61af66fc99e Initial load
duke
parents:
diff changeset
2823 Label notVolatile, checkVolatile, exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
2824 if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2825 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2826 __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2827 __ and3(Rflags, Lscratch, Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2828 if (__ membar_has_effect(read_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2829 __ tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2830 __ br(Assembler::zero, false, Assembler::pt, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2831 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2832 volatile_barrier(read_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2833 __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2835 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2836
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2837 __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2838 pop_and_check_object(Rclass);
a61af66fc99e Initial load
duke
parents:
diff changeset
2839
a61af66fc99e Initial load
duke
parents:
diff changeset
2840 switch (bytecode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2841 case Bytecodes::_fast_bputfield: __ stb(Otos_i, Rclass, Roffset); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2842 case Bytecodes::_fast_cputfield: /* fall through */
a61af66fc99e Initial load
duke
parents:
diff changeset
2843 case Bytecodes::_fast_sputfield: __ sth(Otos_i, Rclass, Roffset); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2844 case Bytecodes::_fast_iputfield: __ st(Otos_i, Rclass, Roffset); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2845 case Bytecodes::_fast_lputfield: __ st_long(Otos_l, Rclass, Roffset); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2846 case Bytecodes::_fast_fputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2847 __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2848 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2849 case Bytecodes::_fast_dputfield:
a61af66fc99e Initial load
duke
parents:
diff changeset
2850 __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
2851 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2852 case Bytecodes::_fast_aputfield:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 113
diff changeset
2853 do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2854 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2855 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
2856 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2858
a61af66fc99e Initial load
duke
parents:
diff changeset
2859 if (__ membar_has_effect(write_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2860 __ tst(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2861 __ br(Assembler::zero, false, Assembler::pt, exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2862 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2863 volatile_barrier(Assembler::StoreLoad);
a61af66fc99e Initial load
duke
parents:
diff changeset
2864 __ bind(exit);
a61af66fc99e Initial load
duke
parents:
diff changeset
2865 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2867
a61af66fc99e Initial load
duke
parents:
diff changeset
2868
a61af66fc99e Initial load
duke
parents:
diff changeset
2869 void TemplateTable::putfield(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2870 putfield_or_static(byte_no, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2872
a61af66fc99e Initial load
duke
parents:
diff changeset
2873 void TemplateTable::putstatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2874 putfield_or_static(byte_no, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2875 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2876
a61af66fc99e Initial load
duke
parents:
diff changeset
2877
a61af66fc99e Initial load
duke
parents:
diff changeset
2878 void TemplateTable::fast_xaccess(TosState state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2879 transition(vtos, state);
a61af66fc99e Initial load
duke
parents:
diff changeset
2880 Register Rcache = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2881 Register Roffset = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2882 Register Rflags = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2883 Register Rreceiver = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2884
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
2885 __ ld_ptr(Llocals, 0, Rreceiver);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2886
a61af66fc99e Initial load
duke
parents:
diff changeset
2887 // access constant pool cache (is resolved)
a61af66fc99e Initial load
duke
parents:
diff changeset
2888 __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2889 __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2890 __ add(Lbcp, 1, Lbcp); // needed to report exception at the correct bcp
a61af66fc99e Initial load
duke
parents:
diff changeset
2891
a61af66fc99e Initial load
duke
parents:
diff changeset
2892 __ verify_oop(Rreceiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
2893 __ null_check(Rreceiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
2894 if (state == atos) {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
2895 __ load_heap_oop(Rreceiver, Roffset, Otos_i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2896 } else if (state == itos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2897 __ ld (Rreceiver, Roffset, Otos_i) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
2898 } else if (state == ftos) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2899 __ ldf(FloatRegisterImpl::S, Rreceiver, Roffset, Ftos_f);
a61af66fc99e Initial load
duke
parents:
diff changeset
2900 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2901 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2903
a61af66fc99e Initial load
duke
parents:
diff changeset
2904 Assembler::Membar_mask_bits membar_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
2905 Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
a61af66fc99e Initial load
duke
parents:
diff changeset
2906 if (__ membar_has_effect(membar_bits)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2907
a61af66fc99e Initial load
duke
parents:
diff changeset
2908 // Get is_volatile value in Rflags and check if membar is needed
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2909 __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset(), Rflags);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2910
a61af66fc99e Initial load
duke
parents:
diff changeset
2911 // Test volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
2912 Label notVolatile;
a61af66fc99e Initial load
duke
parents:
diff changeset
2913 __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2914 __ btst(Rflags, Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2915 __ br(Assembler::zero, false, Assembler::pt, notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2916 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
2917 volatile_barrier(membar_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
2918 __ bind(notVolatile);
a61af66fc99e Initial load
duke
parents:
diff changeset
2919 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2920
a61af66fc99e Initial load
duke
parents:
diff changeset
2921 __ interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
a61af66fc99e Initial load
duke
parents:
diff changeset
2922 __ sub(Lbcp, 1, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2924
a61af66fc99e Initial load
duke
parents:
diff changeset
2925 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
2926 // Calls
a61af66fc99e Initial load
duke
parents:
diff changeset
2927
a61af66fc99e Initial load
duke
parents:
diff changeset
2928 void TemplateTable::count_calls(Register method, Register temp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2929 // implemented elsewhere
a61af66fc99e Initial load
duke
parents:
diff changeset
2930 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
2931 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2932
a61af66fc99e Initial load
duke
parents:
diff changeset
2933 void TemplateTable::generate_vtable_call(Register Rrecv, Register Rindex, Register Rret) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2934 Register Rtemp = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2935 Register Rcall = Rindex;
a61af66fc99e Initial load
duke
parents:
diff changeset
2936 assert_different_registers(Rcall, G5_method, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2937
a61af66fc99e Initial load
duke
parents:
diff changeset
2938 // get target methodOop & entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
2939 const int base = instanceKlass::vtable_start_offset() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2940 if (vtableEntry::size() % 3 == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2941 // scale the vtable index by 12:
a61af66fc99e Initial load
duke
parents:
diff changeset
2942 int one_third = vtableEntry::size() / 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
2943 __ sll(Rindex, exact_log2(one_third * 1 * wordSize), Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2944 __ sll(Rindex, exact_log2(one_third * 2 * wordSize), Rindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
2945 __ add(Rindex, Rtemp, Rindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
2946 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2947 // scale the vtable index by 8:
a61af66fc99e Initial load
duke
parents:
diff changeset
2948 __ sll(Rindex, exact_log2(vtableEntry::size() * wordSize), Rindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
2949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2950
a61af66fc99e Initial load
duke
parents:
diff changeset
2951 __ add(Rrecv, Rindex, Rrecv);
a61af66fc99e Initial load
duke
parents:
diff changeset
2952 __ ld_ptr(Rrecv, base + vtableEntry::method_offset_in_bytes(), G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
2953
a61af66fc99e Initial load
duke
parents:
diff changeset
2954 __ call_from_interpreter(Rcall, Gargs, Rret);
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(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2958 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2959 assert(byte_no == f2_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2960
a61af66fc99e Initial load
duke
parents:
diff changeset
2961 Register Rscratch = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2962 Register Rtemp = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2963 Register Rret = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
2964 Register Rrecv = G5_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
2965 Label notFinal;
a61af66fc99e Initial load
duke
parents:
diff changeset
2966
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
2967 load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, true, false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2968 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
a61af66fc99e Initial load
duke
parents:
diff changeset
2969
a61af66fc99e Initial load
duke
parents:
diff changeset
2970 // Check for vfinal
a61af66fc99e Initial load
duke
parents:
diff changeset
2971 __ set((1 << ConstantPoolCacheEntry::vfinalMethod), G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2972 __ btst(Rret, G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
2973 __ br(Assembler::zero, false, Assembler::pt, notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2974 __ delayed()->and3(Rret, 0xFF, G4_scratch); // gets number of parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
2975
a61af66fc99e Initial load
duke
parents:
diff changeset
2976 patch_bytecode(Bytecodes::_fast_invokevfinal, Rscratch, Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
2977
a61af66fc99e Initial load
duke
parents:
diff changeset
2978 invokevfinal_helper(Rscratch, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2979
a61af66fc99e Initial load
duke
parents:
diff changeset
2980 __ bind(notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
2981
a61af66fc99e Initial load
duke
parents:
diff changeset
2982 __ mov(G5_method, Rscratch); // better scratch register
a61af66fc99e Initial load
duke
parents:
diff changeset
2983 __ load_receiver(G4_scratch, O0); // gets receiverOop
a61af66fc99e Initial load
duke
parents:
diff changeset
2984 // receiver is in O0
a61af66fc99e Initial load
duke
parents:
diff changeset
2985 __ verify_oop(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2986
a61af66fc99e Initial load
duke
parents:
diff changeset
2987 // get return address
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2988 AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
2989 __ set(table, Rtemp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2990 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
a61af66fc99e Initial load
duke
parents:
diff changeset
2991 // Make sure we don't need to mask Rret for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
2992 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
2993 __ sll(Rret, LogBytesPerWord, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
2994 __ ld_ptr(Rtemp, Rret, Rret); // get return address
a61af66fc99e Initial load
duke
parents:
diff changeset
2995
a61af66fc99e Initial load
duke
parents:
diff changeset
2996 // get receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
2997 __ null_check(O0, 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
2998 __ load_klass(O0, Rrecv);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2999 __ verify_oop(Rrecv);
a61af66fc99e Initial load
duke
parents:
diff changeset
3000
a61af66fc99e Initial load
duke
parents:
diff changeset
3001 __ profile_virtual_call(Rrecv, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3002
a61af66fc99e Initial load
duke
parents:
diff changeset
3003 generate_vtable_call(Rrecv, Rscratch, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3005
a61af66fc99e Initial load
duke
parents:
diff changeset
3006 void TemplateTable::fast_invokevfinal(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3007 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3008 assert(byte_no == f2_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3009
a61af66fc99e Initial load
duke
parents:
diff changeset
3010 load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Lscratch, true,
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3011 /*is_invokevfinal*/true, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3012 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
a61af66fc99e Initial load
duke
parents:
diff changeset
3013 invokevfinal_helper(G3_scratch, Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3015
a61af66fc99e Initial load
duke
parents:
diff changeset
3016 void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3017 Register Rtemp = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3018
a61af66fc99e Initial load
duke
parents:
diff changeset
3019 __ verify_oop(G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3020
a61af66fc99e Initial load
duke
parents:
diff changeset
3021 // Load receiver from stack slot
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3022 __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3023 __ load_receiver(G4_scratch, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3024
a61af66fc99e Initial load
duke
parents:
diff changeset
3025 // receiver NULL check
a61af66fc99e Initial load
duke
parents:
diff changeset
3026 __ null_check(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3027
a61af66fc99e Initial load
duke
parents:
diff changeset
3028 __ profile_final_call(O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3029
a61af66fc99e Initial load
duke
parents:
diff changeset
3030 // get return address
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3031 AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3032 __ set(table, Rtemp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3033 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
a61af66fc99e Initial load
duke
parents:
diff changeset
3034 // Make sure we don't need to mask Rret for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
3035 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
3036 __ sll(Rret, LogBytesPerWord, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3037 __ ld_ptr(Rtemp, Rret, Rret); // get return address
a61af66fc99e Initial load
duke
parents:
diff changeset
3038
a61af66fc99e Initial load
duke
parents:
diff changeset
3039
a61af66fc99e Initial load
duke
parents:
diff changeset
3040 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
3041 __ call_from_interpreter(Rscratch, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3042 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3043
a61af66fc99e Initial load
duke
parents:
diff changeset
3044 void TemplateTable::invokespecial(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3045 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3046 assert(byte_no == f1_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3047
a61af66fc99e Initial load
duke
parents:
diff changeset
3048 Register Rscratch = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3049 Register Rtemp = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3050 Register Rret = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3051
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3052 load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, /*virtual*/ false, false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3053 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
a61af66fc99e Initial load
duke
parents:
diff changeset
3054
a61af66fc99e Initial load
duke
parents:
diff changeset
3055 __ verify_oop(G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3056
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3057 __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3058 __ load_receiver(G4_scratch, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3059
a61af66fc99e Initial load
duke
parents:
diff changeset
3060 // receiver NULL check
a61af66fc99e Initial load
duke
parents:
diff changeset
3061 __ null_check(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3062
a61af66fc99e Initial load
duke
parents:
diff changeset
3063 __ profile_call(O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3064
a61af66fc99e Initial load
duke
parents:
diff changeset
3065 // get return address
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3066 AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3067 __ set(table, Rtemp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3068 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
a61af66fc99e Initial load
duke
parents:
diff changeset
3069 // Make sure we don't need to mask Rret for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
3070 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
3071 __ sll(Rret, LogBytesPerWord, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3072 __ ld_ptr(Rtemp, Rret, Rret); // get return address
a61af66fc99e Initial load
duke
parents:
diff changeset
3073
a61af66fc99e Initial load
duke
parents:
diff changeset
3074 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
3075 __ call_from_interpreter(Rscratch, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3077
a61af66fc99e Initial load
duke
parents:
diff changeset
3078 void TemplateTable::invokestatic(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3079 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3080 assert(byte_no == f1_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3081
a61af66fc99e Initial load
duke
parents:
diff changeset
3082 Register Rscratch = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3083 Register Rtemp = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3084 Register Rret = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3085
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3086 load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, /*virtual*/ false, false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3087 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
a61af66fc99e Initial load
duke
parents:
diff changeset
3088
a61af66fc99e Initial load
duke
parents:
diff changeset
3089 __ verify_oop(G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3090
a61af66fc99e Initial load
duke
parents:
diff changeset
3091 __ profile_call(O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3092
a61af66fc99e Initial load
duke
parents:
diff changeset
3093 // get return address
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3094 AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3095 __ set(table, Rtemp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3096 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
a61af66fc99e Initial load
duke
parents:
diff changeset
3097 // Make sure we don't need to mask Rret for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
3098 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
3099 __ sll(Rret, LogBytesPerWord, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3100 __ ld_ptr(Rtemp, Rret, Rret); // get return address
a61af66fc99e Initial load
duke
parents:
diff changeset
3101
a61af66fc99e Initial load
duke
parents:
diff changeset
3102 // do the call
a61af66fc99e Initial load
duke
parents:
diff changeset
3103 __ call_from_interpreter(Rscratch, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3105
a61af66fc99e Initial load
duke
parents:
diff changeset
3106
a61af66fc99e Initial load
duke
parents:
diff changeset
3107 void TemplateTable::invokeinterface_object_method(Register RklassOop,
a61af66fc99e Initial load
duke
parents:
diff changeset
3108 Register Rcall,
a61af66fc99e Initial load
duke
parents:
diff changeset
3109 Register Rret,
a61af66fc99e Initial load
duke
parents:
diff changeset
3110 Register Rflags) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3111 Register Rscratch = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3112 Register Rindex = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3113
a61af66fc99e Initial load
duke
parents:
diff changeset
3114 assert_different_registers(Rscratch, Rindex, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3115
a61af66fc99e Initial load
duke
parents:
diff changeset
3116 Label notFinal;
a61af66fc99e Initial load
duke
parents:
diff changeset
3117
a61af66fc99e Initial load
duke
parents:
diff changeset
3118 // Check for vfinal
a61af66fc99e Initial load
duke
parents:
diff changeset
3119 __ set((1 << ConstantPoolCacheEntry::vfinalMethod), Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3120 __ btst(Rflags, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3121 __ br(Assembler::zero, false, Assembler::pt, notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
3122 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3123
a61af66fc99e Initial load
duke
parents:
diff changeset
3124 __ profile_final_call(O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3125
a61af66fc99e Initial load
duke
parents:
diff changeset
3126 // do the call - the index (f2) contains the methodOop
a61af66fc99e Initial load
duke
parents:
diff changeset
3127 assert_different_registers(G5_method, Gargs, Rcall);
a61af66fc99e Initial load
duke
parents:
diff changeset
3128 __ mov(Rindex, G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3129 __ call_from_interpreter(Rcall, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3130 __ bind(notFinal);
a61af66fc99e Initial load
duke
parents:
diff changeset
3131
a61af66fc99e Initial load
duke
parents:
diff changeset
3132 __ profile_virtual_call(RklassOop, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3133 generate_vtable_call(RklassOop, Rindex, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3135
a61af66fc99e Initial load
duke
parents:
diff changeset
3136
a61af66fc99e Initial load
duke
parents:
diff changeset
3137 void TemplateTable::invokeinterface(int byte_no) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3138 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3139 assert(byte_no == f1_byte, "use this argument");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3140
a61af66fc99e Initial load
duke
parents:
diff changeset
3141 Register Rscratch = G4_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3142 Register Rret = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3143 Register Rindex = Lscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3144 Register Rinterface = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3145 Register RklassOop = G5_method;
a61af66fc99e Initial load
duke
parents:
diff changeset
3146 Register Rflags = O1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3147 assert_different_registers(Rscratch, G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3148
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3149 load_invoke_cp_cache_entry(byte_no, Rinterface, Rindex, Rflags, /*virtual*/ false, false, false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3150 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
a61af66fc99e Initial load
duke
parents:
diff changeset
3151
a61af66fc99e Initial load
duke
parents:
diff changeset
3152 // get receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3153 __ and3(Rflags, 0xFF, Rscratch); // gets number of parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
3154 __ load_receiver(Rscratch, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3155 __ verify_oop(O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3156
a61af66fc99e Initial load
duke
parents:
diff changeset
3157 __ mov(Rflags, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3158
a61af66fc99e Initial load
duke
parents:
diff changeset
3159 // get return address
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3160 AddressLiteral table(Interpreter::return_5_addrs_by_index_table());
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3161 __ set(table, Rscratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3162 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
a61af66fc99e Initial load
duke
parents:
diff changeset
3163 // Make sure we don't need to mask Rret for tosBits after the above shift
a61af66fc99e Initial load
duke
parents:
diff changeset
3164 ConstantPoolCacheEntry::verify_tosBits();
a61af66fc99e Initial load
duke
parents:
diff changeset
3165 __ sll(Rret, LogBytesPerWord, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3166 __ ld_ptr(Rscratch, Rret, Rret); // get return address
a61af66fc99e Initial load
duke
parents:
diff changeset
3167
a61af66fc99e Initial load
duke
parents:
diff changeset
3168 // get receiver klass
a61af66fc99e Initial load
duke
parents:
diff changeset
3169 __ null_check(O0, 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
3170 __ load_klass(O0, RklassOop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3171 __ verify_oop(RklassOop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3172
a61af66fc99e Initial load
duke
parents:
diff changeset
3173 // Special case of invokeinterface called for virtual method of
a61af66fc99e Initial load
duke
parents:
diff changeset
3174 // java.lang.Object. See cpCacheOop.cpp for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
3175 // This code isn't produced by javac, but could be produced by
a61af66fc99e Initial load
duke
parents:
diff changeset
3176 // another compliant java compiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
3177 Label notMethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
3178 __ set((1 << ConstantPoolCacheEntry::methodInterface), Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3179 __ btst(Rflags, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3180 __ br(Assembler::zero, false, Assembler::pt, notMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
3181 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3182
a61af66fc99e Initial load
duke
parents:
diff changeset
3183 invokeinterface_object_method(RklassOop, Rinterface, Rret, Rflags);
a61af66fc99e Initial load
duke
parents:
diff changeset
3184
a61af66fc99e Initial load
duke
parents:
diff changeset
3185 __ bind(notMethod);
a61af66fc99e Initial load
duke
parents:
diff changeset
3186
a61af66fc99e Initial load
duke
parents:
diff changeset
3187 __ profile_virtual_call(RklassOop, O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3188
a61af66fc99e Initial load
duke
parents:
diff changeset
3189 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3190 // find entry point to call
a61af66fc99e Initial load
duke
parents:
diff changeset
3191 //
a61af66fc99e Initial load
duke
parents:
diff changeset
3192
a61af66fc99e Initial load
duke
parents:
diff changeset
3193 // compute start of first itableOffsetEntry (which is at end of vtable)
a61af66fc99e Initial load
duke
parents:
diff changeset
3194 const int base = instanceKlass::vtable_start_offset() * wordSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
3195 Label search;
a61af66fc99e Initial load
duke
parents:
diff changeset
3196 Register Rtemp = Rflags;
a61af66fc99e Initial load
duke
parents:
diff changeset
3197
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3198 __ ld(RklassOop, instanceKlass::vtable_length_offset() * wordSize, Rtemp);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3199 if (align_object_offset(1) > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3200 __ round_to(Rtemp, align_object_offset(1));
a61af66fc99e Initial load
duke
parents:
diff changeset
3201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3202 __ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3203 if (Assembler::is_simm13(base)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3204 __ add(Rtemp, base, Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3205 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3206 __ set(base, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3207 __ add(Rscratch, Rtemp, Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3209 __ add(RklassOop, Rtemp, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3210
a61af66fc99e Initial load
duke
parents:
diff changeset
3211 __ bind(search);
a61af66fc99e Initial load
duke
parents:
diff changeset
3212
a61af66fc99e Initial load
duke
parents:
diff changeset
3213 __ ld_ptr(Rscratch, itableOffsetEntry::interface_offset_in_bytes(), Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3214 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3215 Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
3216
a61af66fc99e Initial load
duke
parents:
diff changeset
3217 // Check that entry is non-null. Null entries are probably a bytecode
605
98cb887364d3 6810672: Comment typos
twisti
parents: 450
diff changeset
3218 // problem. If the interface isn't implemented by the receiver class,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3219 // the VM should throw IncompatibleClassChangeError. linkResolver checks
a61af66fc99e Initial load
duke
parents:
diff changeset
3220 // this too but that's only if the entry isn't already resolved, so we
a61af66fc99e Initial load
duke
parents:
diff changeset
3221 // need to check again.
a61af66fc99e Initial load
duke
parents:
diff changeset
3222 __ br_notnull( Rtemp, false, Assembler::pt, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3223 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3224 call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError));
a61af66fc99e Initial load
duke
parents:
diff changeset
3225 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
3226 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3227 __ verify_oop(Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3229
a61af66fc99e Initial load
duke
parents:
diff changeset
3230 __ verify_oop(Rinterface);
a61af66fc99e Initial load
duke
parents:
diff changeset
3231
a61af66fc99e Initial load
duke
parents:
diff changeset
3232 __ cmp(Rinterface, Rtemp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3233 __ brx(Assembler::notEqual, true, Assembler::pn, search);
a61af66fc99e Initial load
duke
parents:
diff changeset
3234 __ delayed()->add(Rscratch, itableOffsetEntry::size() * wordSize, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3235
a61af66fc99e Initial load
duke
parents:
diff changeset
3236 // entry found and Rscratch points to it
a61af66fc99e Initial load
duke
parents:
diff changeset
3237 __ ld(Rscratch, itableOffsetEntry::offset_offset_in_bytes(), Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3238
a61af66fc99e Initial load
duke
parents:
diff changeset
3239 assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust instruction below");
a61af66fc99e Initial load
duke
parents:
diff changeset
3240 __ sll(Rindex, exact_log2(itableMethodEntry::size() * wordSize), Rindex); // Rindex *= 8;
a61af66fc99e Initial load
duke
parents:
diff changeset
3241 __ add(Rscratch, Rindex, Rscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3242 __ ld_ptr(RklassOop, Rscratch, G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3243
a61af66fc99e Initial load
duke
parents:
diff changeset
3244 // Check for abstract method error.
a61af66fc99e Initial load
duke
parents:
diff changeset
3245 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3246 Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
3247 __ tst(G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3248 __ brx(Assembler::notZero, false, Assembler::pt, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3249 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3250 call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
a61af66fc99e Initial load
duke
parents:
diff changeset
3251 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
3252 __ bind(ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3254
a61af66fc99e Initial load
duke
parents:
diff changeset
3255 Register Rcall = Rinterface;
a61af66fc99e Initial load
duke
parents:
diff changeset
3256 assert_different_registers(Rcall, G5_method, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3257
a61af66fc99e Initial load
duke
parents:
diff changeset
3258 __ verify_oop(G5_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
3259 __ call_from_interpreter(Rcall, Gargs, Rret);
a61af66fc99e Initial load
duke
parents:
diff changeset
3260
a61af66fc99e Initial load
duke
parents:
diff changeset
3261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3262
a61af66fc99e Initial load
duke
parents:
diff changeset
3263
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3264 void TemplateTable::invokedynamic(int byte_no) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3265 transition(vtos, vtos);
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3266 assert(byte_no == f1_oop, "use this argument");
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3267
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3268 if (!EnableInvokeDynamic) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3269 // We should not encounter this bytecode if !EnableInvokeDynamic.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3270 // The verifier will stop it. However, if we get past the verifier,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3271 // this will stop the thread in a reasonable way, without crashing the JVM.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3272 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3273 InterpreterRuntime::throw_IncompatibleClassChangeError));
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3274 // the call_VM checks for exception, so we should never return here.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3275 __ should_not_reach_here();
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3276 return;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3277 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3278
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3279 // G5: CallSite object (f1)
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3280 // XX: unused (f2)
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3281 // XX: flags (unused)
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3282
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3283 Register G5_callsite = G5_method;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3284 Register Rscratch = G3_scratch;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3285 Register Rtemp = G1_scratch;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3286 Register Rret = Lscratch;
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3287
1565
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3288 load_invoke_cp_cache_entry(byte_no, G5_callsite, noreg, Rret,
ab102d5d923e 6939207: refactor constant pool index processing
jrose
parents: 1506
diff changeset
3289 /*virtual*/ false, /*vfinal*/ false, /*indy*/ true);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3290 __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3291
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3292 __ verify_oop(G5_callsite);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3293
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3294 // profile this call
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3295 __ profile_call(O4);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3296
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3297 // get return address
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3298 AddressLiteral table(Interpreter::return_5_addrs_by_index_table());
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3299 __ set(table, Rtemp);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3300 __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3301 // Make sure we don't need to mask Rret for tosBits after the above shift
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3302 ConstantPoolCacheEntry::verify_tosBits();
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3303 __ sll(Rret, LogBytesPerWord, Rret);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3304 __ ld_ptr(Rtemp, Rret, Rret); // get return address
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3305
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1783
diff changeset
3306 __ load_heap_oop(G5_callsite, __ delayed_value(java_dyn_CallSite::target_offset_in_bytes, Rscratch), G3_method_handle);
1503
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3307 __ null_check(G3_method_handle);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3308
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3309 // Adjust Rret first so Llast_SP can be same as Rret
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3310 __ add(Rret, -frame::pc_return_offset, O7);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3311 __ add(Lesp, BytesPerWord, Gargs); // setup parameter pointer
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3312 __ jump_to_method_handle_entry(G3_method_handle, Rtemp, /* emit_delayed_nop */ false);
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3313 // Record SP so we can remove any stack space allocated by adapter transition
c640000b7cc1 6829193: JSR 292 needs to support SPARC
twisti
parents: 728
diff changeset
3314 __ delayed()->mov(SP, Llast_SP);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3315 }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3316
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 605
diff changeset
3317
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3318 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3319 // Allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
3320
a61af66fc99e Initial load
duke
parents:
diff changeset
3321 void TemplateTable::_new() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3322 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3323
a61af66fc99e Initial load
duke
parents:
diff changeset
3324 Label slow_case;
a61af66fc99e Initial load
duke
parents:
diff changeset
3325 Label done;
a61af66fc99e Initial load
duke
parents:
diff changeset
3326 Label initialize_header;
a61af66fc99e Initial load
duke
parents:
diff changeset
3327 Label initialize_object; // including clearing the fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3328
a61af66fc99e Initial load
duke
parents:
diff changeset
3329 Register RallocatedObject = Otos_i;
a61af66fc99e Initial load
duke
parents:
diff changeset
3330 Register RinstanceKlass = O1;
a61af66fc99e Initial load
duke
parents:
diff changeset
3331 Register Roffset = O3;
a61af66fc99e Initial load
duke
parents:
diff changeset
3332 Register Rscratch = O4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3333
a61af66fc99e Initial load
duke
parents:
diff changeset
3334 __ get_2_byte_integer_at_bcp(1, Rscratch, Roffset, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
3335 __ get_cpool_and_tags(Rscratch, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3336 // make sure the class we're about to instantiate has been resolved
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3337 // 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
3338 // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3339 __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3340 __ ldub(G3_scratch, Roffset, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3341 __ cmp(G3_scratch, JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3342 __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3343 __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1602
diff changeset
3344 // get instanceKlass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3345 //__ sll(Roffset, LogBytesPerWord, Roffset); // executed in delay slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3346 __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3347 __ ld_ptr(Rscratch, Roffset, RinstanceKlass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3348
a61af66fc99e Initial load
duke
parents:
diff changeset
3349 // make sure klass is fully initialized:
a61af66fc99e Initial load
duke
parents:
diff changeset
3350 __ ld(RinstanceKlass, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3351 __ cmp(G3_scratch, instanceKlass::fully_initialized);
a61af66fc99e Initial load
duke
parents:
diff changeset
3352 __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3353 __ delayed()->ld(RinstanceKlass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc), Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3354
a61af66fc99e Initial load
duke
parents:
diff changeset
3355 // get instance_size in instanceKlass (already aligned)
a61af66fc99e Initial load
duke
parents:
diff changeset
3356 //__ ld(RinstanceKlass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc), Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3357
a61af66fc99e Initial load
duke
parents:
diff changeset
3358 // make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class
a61af66fc99e Initial load
duke
parents:
diff changeset
3359 __ btst(Klass::_lh_instance_slow_path_bit, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3360 __ br(Assembler::notZero, false, Assembler::pn, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3361 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3362
a61af66fc99e Initial load
duke
parents:
diff changeset
3363 // allocate the instance
a61af66fc99e Initial load
duke
parents:
diff changeset
3364 // 1) Try to allocate in the TLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
3365 // 2) if fail, and the TLAB is not full enough to discard, allocate in the shared Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
3366 // 3) if the above fails (or is not applicable), go to a slow case
a61af66fc99e Initial load
duke
parents:
diff changeset
3367 // (creates a new TLAB, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
3368
a61af66fc99e Initial load
duke
parents:
diff changeset
3369 const bool allow_shared_alloc =
a61af66fc99e Initial load
duke
parents:
diff changeset
3370 Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
a61af66fc99e Initial load
duke
parents:
diff changeset
3371
a61af66fc99e Initial load
duke
parents:
diff changeset
3372 if(UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3373 Register RoldTopValue = RallocatedObject;
a61af66fc99e Initial load
duke
parents:
diff changeset
3374 Register RtopAddr = G3_scratch, RtlabWasteLimitValue = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3375 Register RnewTopValue = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3376 Register RendValue = Rscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3377 Register RfreeValue = RnewTopValue;
a61af66fc99e Initial load
duke
parents:
diff changeset
3378
a61af66fc99e Initial load
duke
parents:
diff changeset
3379 // check if we can allocate in the TLAB
a61af66fc99e Initial load
duke
parents:
diff changeset
3380 __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_top_offset()), RoldTopValue); // sets up RalocatedObject
a61af66fc99e Initial load
duke
parents:
diff changeset
3381 __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_end_offset()), RendValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3382 __ add(RoldTopValue, Roffset, RnewTopValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3383
a61af66fc99e Initial load
duke
parents:
diff changeset
3384 // if there is enough space, we do not CAS and do not clear
a61af66fc99e Initial load
duke
parents:
diff changeset
3385 __ cmp(RnewTopValue, RendValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3386 if(ZeroTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3387 // the fields have already been cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
3388 __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3389 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3390 // initialize both the header and fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3391 __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
3392 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3393 __ delayed()->st_ptr(RnewTopValue, G2_thread, in_bytes(JavaThread::tlab_top_offset()));
a61af66fc99e Initial load
duke
parents:
diff changeset
3394
a61af66fc99e Initial load
duke
parents:
diff changeset
3395 if (allow_shared_alloc) {
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3396 // Check if tlab should be discarded (refill_waste_limit >= free)
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3397 __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), RtlabWasteLimitValue);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3398 __ sub(RendValue, RoldTopValue, RfreeValue);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3399 #ifdef _LP64
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3400 __ srlx(RfreeValue, LogHeapWordSize, RfreeValue);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3401 #else
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3402 __ srl(RfreeValue, LogHeapWordSize, RfreeValue);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3403 #endif
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3404 __ cmp(RtlabWasteLimitValue, RfreeValue);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3405 __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pt, slow_case); // tlab waste is small
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3406 __ delayed()->nop();
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3407
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3408 // increment waste limit to prevent getting stuck on this slow path
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3409 __ add(RtlabWasteLimitValue, ThreadLocalAllocBuffer::refill_waste_limit_increment(), RtlabWasteLimitValue);
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3410 __ st_ptr(RtlabWasteLimitValue, G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3411 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3412 // No allocation in the shared eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
3413 __ br(Assembler::always, false, Assembler::pt, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3414 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3417
a61af66fc99e Initial load
duke
parents:
diff changeset
3418 // Allocation in the shared Eden
a61af66fc99e Initial load
duke
parents:
diff changeset
3419 if (allow_shared_alloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3420 Register RoldTopValue = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3421 Register RtopAddr = G3_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3422 Register RnewTopValue = RallocatedObject;
a61af66fc99e Initial load
duke
parents:
diff changeset
3423 Register RendValue = Rscratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3424
a61af66fc99e Initial load
duke
parents:
diff changeset
3425 __ set((intptr_t)Universe::heap()->top_addr(), RtopAddr);
a61af66fc99e Initial load
duke
parents:
diff changeset
3426
a61af66fc99e Initial load
duke
parents:
diff changeset
3427 Label retry;
a61af66fc99e Initial load
duke
parents:
diff changeset
3428 __ bind(retry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3429 __ set((intptr_t)Universe::heap()->end_addr(), RendValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3430 __ ld_ptr(RendValue, 0, RendValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3431 __ ld_ptr(RtopAddr, 0, RoldTopValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3432 __ add(RoldTopValue, Roffset, RnewTopValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3433
a61af66fc99e Initial load
duke
parents:
diff changeset
3434 // RnewTopValue contains the top address after the new object
a61af66fc99e Initial load
duke
parents:
diff changeset
3435 // has been allocated.
a61af66fc99e Initial load
duke
parents:
diff changeset
3436 __ cmp(RnewTopValue, RendValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3437 __ brx(Assembler::greaterUnsigned, false, Assembler::pn, slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3438 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3439
a61af66fc99e Initial load
duke
parents:
diff changeset
3440 __ casx_under_lock(RtopAddr, RoldTopValue, RnewTopValue,
a61af66fc99e Initial load
duke
parents:
diff changeset
3441 VM_Version::v9_instructions_work() ? NULL :
a61af66fc99e Initial load
duke
parents:
diff changeset
3442 (address)StubRoutines::Sparc::atomic_memory_operation_lock_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
3443
a61af66fc99e Initial load
duke
parents:
diff changeset
3444 // if someone beat us on the allocation, try again, otherwise continue
a61af66fc99e Initial load
duke
parents:
diff changeset
3445 __ cmp(RoldTopValue, RnewTopValue);
a61af66fc99e Initial load
duke
parents:
diff changeset
3446 __ brx(Assembler::notEqual, false, Assembler::pn, retry);
a61af66fc99e Initial load
duke
parents:
diff changeset
3447 __ delayed()->nop();
2100
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3448
b1a2afa37ec4 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 1972
diff changeset
3449 // bump total bytes allocated by this thread
2127
5577848f5923 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 2100
diff changeset
3450 // RoldTopValue and RtopAddr are dead, so can use G1 and G3
5577848f5923 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 2100
diff changeset
3451 __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3453
a61af66fc99e Initial load
duke
parents:
diff changeset
3454 if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3455 // clear object fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3456 __ bind(initialize_object);
a61af66fc99e Initial load
duke
parents:
diff changeset
3457 __ deccc(Roffset, sizeof(oopDesc));
a61af66fc99e Initial load
duke
parents:
diff changeset
3458 __ br(Assembler::zero, false, Assembler::pt, initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3459 __ delayed()->add(RallocatedObject, sizeof(oopDesc), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3460
a61af66fc99e Initial load
duke
parents:
diff changeset
3461 // initialize remaining object fields
a61af66fc99e Initial load
duke
parents:
diff changeset
3462 { Label loop;
a61af66fc99e Initial load
duke
parents:
diff changeset
3463 __ subcc(Roffset, wordSize, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3464 __ bind(loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3465 //__ subcc(Roffset, wordSize, Roffset); // executed above loop or in delay slot
a61af66fc99e Initial load
duke
parents:
diff changeset
3466 __ st_ptr(G0, G3_scratch, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3467 __ br(Assembler::notEqual, false, Assembler::pt, loop);
a61af66fc99e Initial load
duke
parents:
diff changeset
3468 __ delayed()->subcc(Roffset, wordSize, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3470 __ br(Assembler::always, false, Assembler::pt, initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3471 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3472 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3473
a61af66fc99e Initial load
duke
parents:
diff changeset
3474 // slow case
a61af66fc99e Initial load
duke
parents:
diff changeset
3475 __ bind(slow_case);
a61af66fc99e Initial load
duke
parents:
diff changeset
3476 __ get_2_byte_integer_at_bcp(1, G3_scratch, O2, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
3477 __ get_constant_pool(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3478
a61af66fc99e Initial load
duke
parents:
diff changeset
3479 call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), O1, O2);
a61af66fc99e Initial load
duke
parents:
diff changeset
3480
a61af66fc99e Initial load
duke
parents:
diff changeset
3481 __ ba(false, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3482 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3483
a61af66fc99e Initial load
duke
parents:
diff changeset
3484 // Initialize the header: mark, klass
a61af66fc99e Initial load
duke
parents:
diff changeset
3485 __ bind(initialize_header);
a61af66fc99e Initial load
duke
parents:
diff changeset
3486
a61af66fc99e Initial load
duke
parents:
diff changeset
3487 if (UseBiasedLocking) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3488 __ ld_ptr(RinstanceKlass, Klass::prototype_header_offset_in_bytes() + sizeof(oopDesc), G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3489 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3490 __ set((intptr_t)markOopDesc::prototype(), G4_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3492 __ st_ptr(G4_scratch, RallocatedObject, oopDesc::mark_offset_in_bytes()); // mark
167
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
3493 __ store_klass_gap(G0, RallocatedObject); // klass gap if compressed
feeb96a45707 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 113
diff changeset
3494 __ store_klass(RinstanceKlass, RallocatedObject); // klass (last for cms)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3495
a61af66fc99e Initial load
duke
parents:
diff changeset
3496 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3497 SkipIfEqual skip_if(
a61af66fc99e Initial load
duke
parents:
diff changeset
3498 _masm, G4_scratch, &DTraceAllocProbes, Assembler::zero);
a61af66fc99e Initial load
duke
parents:
diff changeset
3499 // Trigger dtrace event
a61af66fc99e Initial load
duke
parents:
diff changeset
3500 __ push(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3501 __ call_VM_leaf(noreg,
a61af66fc99e Initial load
duke
parents:
diff changeset
3502 CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3503 __ pop(atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3505
a61af66fc99e Initial load
duke
parents:
diff changeset
3506 // continue
a61af66fc99e Initial load
duke
parents:
diff changeset
3507 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3509
a61af66fc99e Initial load
duke
parents:
diff changeset
3510
a61af66fc99e Initial load
duke
parents:
diff changeset
3511
a61af66fc99e Initial load
duke
parents:
diff changeset
3512 void TemplateTable::newarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3513 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3514 __ ldub(Lbcp, 1, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3515 call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), O1, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3517
a61af66fc99e Initial load
duke
parents:
diff changeset
3518
a61af66fc99e Initial load
duke
parents:
diff changeset
3519 void TemplateTable::anewarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3520 transition(itos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3521 __ get_constant_pool(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3522 __ get_2_byte_integer_at_bcp(1, G4_scratch, O2, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
3523 call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), O1, O2, Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3525
a61af66fc99e Initial load
duke
parents:
diff changeset
3526
a61af66fc99e Initial load
duke
parents:
diff changeset
3527 void TemplateTable::arraylength() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3528 transition(atos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3529 Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
3530 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3531 __ tst(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3532 __ throw_if_not_1_x( Assembler::notZero, ok );
a61af66fc99e Initial load
duke
parents:
diff changeset
3533 __ delayed()->ld(Otos_i, arrayOopDesc::length_offset_in_bytes(), Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3534 __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3536
a61af66fc99e Initial load
duke
parents:
diff changeset
3537
a61af66fc99e Initial load
duke
parents:
diff changeset
3538 void TemplateTable::checkcast() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3539 transition(atos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3540 Label done, is_null, quicked, cast_ok, resolved;
a61af66fc99e Initial load
duke
parents:
diff changeset
3541 Register Roffset = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3542 Register RobjKlass = O5;
a61af66fc99e Initial load
duke
parents:
diff changeset
3543 Register RspecifiedKlass = O4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3544
a61af66fc99e Initial load
duke
parents:
diff changeset
3545 // Check for casting a NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3546 __ br_null(Otos_i, false, Assembler::pn, is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3547 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3548
a61af66fc99e Initial load
duke
parents:
diff changeset
3549 // Get value klass in RobjKlass
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3550 __ load_klass(Otos_i, RobjKlass); // get value klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3551
a61af66fc99e Initial load
duke
parents:
diff changeset
3552 // Get constant pool tag
a61af66fc99e Initial load
duke
parents:
diff changeset
3553 __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
3554
a61af66fc99e Initial load
duke
parents:
diff changeset
3555 // See if the checkcast has been quickened
a61af66fc99e Initial load
duke
parents:
diff changeset
3556 __ get_cpool_and_tags(Lscratch, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3557 __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3558 __ ldub(G3_scratch, Roffset, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3559 __ cmp(G3_scratch, JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3560 __ br(Assembler::equal, true, Assembler::pt, quicked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3561 __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3562
a61af66fc99e Initial load
duke
parents:
diff changeset
3563 __ push_ptr(); // save receiver for result, and for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
3564 call_VM(RspecifiedKlass, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
a61af66fc99e Initial load
duke
parents:
diff changeset
3565 __ pop_ptr(Otos_i, G3_scratch); // restore receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3566
a61af66fc99e Initial load
duke
parents:
diff changeset
3567 __ br(Assembler::always, false, Assembler::pt, resolved);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3568 __ delayed()->nop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3569
a61af66fc99e Initial load
duke
parents:
diff changeset
3570 // Extract target class from constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
3571 __ bind(quicked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3572 __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3573 __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3574 __ bind(resolved);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3575 __ load_klass(Otos_i, RobjKlass); // get value klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3576
a61af66fc99e Initial load
duke
parents:
diff changeset
3577 // Generate a fast subtype check. Branch to cast_ok if no
a61af66fc99e Initial load
duke
parents:
diff changeset
3578 // failure. Throw exception if failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
3579 __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, cast_ok );
a61af66fc99e Initial load
duke
parents:
diff changeset
3580
a61af66fc99e Initial load
duke
parents:
diff changeset
3581 // Not a subtype; so must throw exception
a61af66fc99e Initial load
duke
parents:
diff changeset
3582 __ throw_if_not_x( Assembler::never, Interpreter::_throw_ClassCastException_entry, G3_scratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
3583
a61af66fc99e Initial load
duke
parents:
diff changeset
3584 __ bind(cast_ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3585
a61af66fc99e Initial load
duke
parents:
diff changeset
3586 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3587 __ ba(false, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3588 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3590 __ bind(is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3591 __ profile_null_seen(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3592 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3594
a61af66fc99e Initial load
duke
parents:
diff changeset
3595
a61af66fc99e Initial load
duke
parents:
diff changeset
3596 void TemplateTable::instanceof() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3597 Label done, is_null, quicked, resolved;
a61af66fc99e Initial load
duke
parents:
diff changeset
3598 transition(atos, itos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3599 Register Roffset = G1_scratch;
a61af66fc99e Initial load
duke
parents:
diff changeset
3600 Register RobjKlass = O5;
a61af66fc99e Initial load
duke
parents:
diff changeset
3601 Register RspecifiedKlass = O4;
a61af66fc99e Initial load
duke
parents:
diff changeset
3602
a61af66fc99e Initial load
duke
parents:
diff changeset
3603 // Check for casting a NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3604 __ br_null(Otos_i, false, Assembler::pt, is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3605 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3606
a61af66fc99e Initial load
duke
parents:
diff changeset
3607 // Get value klass in RobjKlass
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3608 __ load_klass(Otos_i, RobjKlass); // get value klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3609
a61af66fc99e Initial load
duke
parents:
diff changeset
3610 // Get constant pool tag
a61af66fc99e Initial load
duke
parents:
diff changeset
3611 __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
a61af66fc99e Initial load
duke
parents:
diff changeset
3612
a61af66fc99e Initial load
duke
parents:
diff changeset
3613 // See if the checkcast has been quickened
a61af66fc99e Initial load
duke
parents:
diff changeset
3614 __ get_cpool_and_tags(Lscratch, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3615 __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3616 __ ldub(G3_scratch, Roffset, G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3617 __ cmp(G3_scratch, JVM_CONSTANT_Class);
a61af66fc99e Initial load
duke
parents:
diff changeset
3618 __ br(Assembler::equal, true, Assembler::pt, quicked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3619 __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3620
a61af66fc99e Initial load
duke
parents:
diff changeset
3621 __ push_ptr(); // save receiver for result, and for GC
a61af66fc99e Initial load
duke
parents:
diff changeset
3622 call_VM(RspecifiedKlass, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
a61af66fc99e Initial load
duke
parents:
diff changeset
3623 __ pop_ptr(Otos_i, G3_scratch); // restore receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
3624
a61af66fc99e Initial load
duke
parents:
diff changeset
3625 __ br(Assembler::always, false, Assembler::pt, resolved);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3626 __ delayed()->nop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3627
a61af66fc99e Initial load
duke
parents:
diff changeset
3628
a61af66fc99e Initial load
duke
parents:
diff changeset
3629 // Extract target class from constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
3630 __ bind(quicked);
a61af66fc99e Initial load
duke
parents:
diff changeset
3631 __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
a61af66fc99e Initial load
duke
parents:
diff changeset
3632 __ get_constant_pool(Lscratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3633 __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
a61af66fc99e Initial load
duke
parents:
diff changeset
3634 __ bind(resolved);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
3635 __ load_klass(Otos_i, RobjKlass); // get value klass
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3636
a61af66fc99e Initial load
duke
parents:
diff changeset
3637 // Generate a fast subtype check. Branch to cast_ok if no
a61af66fc99e Initial load
duke
parents:
diff changeset
3638 // failure. Return 0 if failure.
a61af66fc99e Initial load
duke
parents:
diff changeset
3639 __ or3(G0, 1, Otos_i); // set result assuming quick tests succeed
a61af66fc99e Initial load
duke
parents:
diff changeset
3640 __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, done );
a61af66fc99e Initial load
duke
parents:
diff changeset
3641 // Not a subtype; return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
3642 __ clr( Otos_i );
a61af66fc99e Initial load
duke
parents:
diff changeset
3643
a61af66fc99e Initial load
duke
parents:
diff changeset
3644 if (ProfileInterpreter) {
a61af66fc99e Initial load
duke
parents:
diff changeset
3645 __ ba(false, done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3646 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3648 __ bind(is_null);
a61af66fc99e Initial load
duke
parents:
diff changeset
3649 __ profile_null_seen(G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3650 __ bind(done);
a61af66fc99e Initial load
duke
parents:
diff changeset
3651 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3652
a61af66fc99e Initial load
duke
parents:
diff changeset
3653 void TemplateTable::_breakpoint() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3654
a61af66fc99e Initial load
duke
parents:
diff changeset
3655 // Note: We get here even if we are single stepping..
a61af66fc99e Initial load
duke
parents:
diff changeset
3656 // jbug inists on setting breakpoints at every bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3657 // even if we are in single step mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
3658
a61af66fc99e Initial load
duke
parents:
diff changeset
3659 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3660 // get the unpatched byte code
a61af66fc99e Initial load
duke
parents:
diff changeset
3661 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), Lmethod, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3662 __ mov(O0, Lbyte_code);
a61af66fc99e Initial load
duke
parents:
diff changeset
3663
a61af66fc99e Initial load
duke
parents:
diff changeset
3664 // post the breakpoint event
a61af66fc99e Initial load
duke
parents:
diff changeset
3665 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), Lmethod, Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3666
a61af66fc99e Initial load
duke
parents:
diff changeset
3667 // complete the execution of original bytecode
a61af66fc99e Initial load
duke
parents:
diff changeset
3668 __ dispatch_normal(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3670
a61af66fc99e Initial load
duke
parents:
diff changeset
3671
a61af66fc99e Initial load
duke
parents:
diff changeset
3672 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3673 // Exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
3674
a61af66fc99e Initial load
duke
parents:
diff changeset
3675 void TemplateTable::athrow() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3676 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3677
a61af66fc99e Initial load
duke
parents:
diff changeset
3678 // This works because exception is cached in Otos_i which is same as O0,
a61af66fc99e Initial load
duke
parents:
diff changeset
3679 // which is same as what throw_exception_entry_expects
a61af66fc99e Initial load
duke
parents:
diff changeset
3680 assert(Otos_i == Oexception, "see explanation above");
a61af66fc99e Initial load
duke
parents:
diff changeset
3681
a61af66fc99e Initial load
duke
parents:
diff changeset
3682 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3683 __ null_check(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3684 __ throw_if_not_x(Assembler::never, Interpreter::throw_exception_entry(), G3_scratch);
a61af66fc99e Initial load
duke
parents:
diff changeset
3685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3686
a61af66fc99e Initial load
duke
parents:
diff changeset
3687
a61af66fc99e Initial load
duke
parents:
diff changeset
3688 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3689 // Synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
3690
a61af66fc99e Initial load
duke
parents:
diff changeset
3691
a61af66fc99e Initial load
duke
parents:
diff changeset
3692 // See frame_sparc.hpp for monitor block layout.
a61af66fc99e Initial load
duke
parents:
diff changeset
3693 // Monitor elements are dynamically allocated by growing stack as needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
3694
a61af66fc99e Initial load
duke
parents:
diff changeset
3695 void TemplateTable::monitorenter() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3696 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3697 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3698 // Try to acquire a lock on the object
a61af66fc99e Initial load
duke
parents:
diff changeset
3699 // Repeat until succeeded (i.e., until
a61af66fc99e Initial load
duke
parents:
diff changeset
3700 // monitorenter returns true).
a61af66fc99e Initial load
duke
parents:
diff changeset
3701
a61af66fc99e Initial load
duke
parents:
diff changeset
3702 { Label ok;
a61af66fc99e Initial load
duke
parents:
diff changeset
3703 __ tst(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3704 __ throw_if_not_1_x( Assembler::notZero, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3705 __ delayed()->mov(Otos_i, Lscratch); // save obj
a61af66fc99e Initial load
duke
parents:
diff changeset
3706 __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
a61af66fc99e Initial load
duke
parents:
diff changeset
3707 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3708
a61af66fc99e Initial load
duke
parents:
diff changeset
3709 assert(O0 == Otos_i, "Be sure where the object to lock is");
a61af66fc99e Initial load
duke
parents:
diff changeset
3710
a61af66fc99e Initial load
duke
parents:
diff changeset
3711 // find a free slot in the monitor block
a61af66fc99e Initial load
duke
parents:
diff changeset
3712
a61af66fc99e Initial load
duke
parents:
diff changeset
3713
a61af66fc99e Initial load
duke
parents:
diff changeset
3714 // initialize entry pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
3715 __ clr(O1); // points to free slot or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
3716
a61af66fc99e Initial load
duke
parents:
diff changeset
3717 {
a61af66fc99e Initial load
duke
parents:
diff changeset
3718 Label entry, loop, exit;
a61af66fc99e Initial load
duke
parents:
diff changeset
3719 __ add( __ top_most_monitor(), O2 ); // last one to check
a61af66fc99e Initial load
duke
parents:
diff changeset
3720 __ ba( false, entry );
a61af66fc99e Initial load
duke
parents:
diff changeset
3721 __ delayed()->mov( Lmonitors, O3 ); // first one to check
a61af66fc99e Initial load
duke
parents:
diff changeset
3722
a61af66fc99e Initial load
duke
parents:
diff changeset
3723
a61af66fc99e Initial load
duke
parents:
diff changeset
3724 __ bind( loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
3725
a61af66fc99e Initial load
duke
parents:
diff changeset
3726 __ verify_oop(O4); // verify each monitor's oop
a61af66fc99e Initial load
duke
parents:
diff changeset
3727 __ tst(O4); // is this entry unused?
a61af66fc99e Initial load
duke
parents:
diff changeset
3728 if (VM_Version::v9_instructions_work())
a61af66fc99e Initial load
duke
parents:
diff changeset
3729 __ movcc( Assembler::zero, false, Assembler::ptr_cc, O3, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3730 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
3731 Label L;
a61af66fc99e Initial load
duke
parents:
diff changeset
3732 __ br( Assembler::zero, true, Assembler::pn, L );
a61af66fc99e Initial load
duke
parents:
diff changeset
3733 __ delayed()->mov(O3, O1); // rememeber this one if match
a61af66fc99e Initial load
duke
parents:
diff changeset
3734 __ bind(L);
a61af66fc99e Initial load
duke
parents:
diff changeset
3735 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3736
a61af66fc99e Initial load
duke
parents:
diff changeset
3737 __ cmp(O4, O0); // check if current entry is for same object
a61af66fc99e Initial load
duke
parents:
diff changeset
3738 __ brx( Assembler::equal, false, Assembler::pn, exit );
a61af66fc99e Initial load
duke
parents:
diff changeset
3739 __ delayed()->inc( O3, frame::interpreter_frame_monitor_size() * wordSize ); // check next one
a61af66fc99e Initial load
duke
parents:
diff changeset
3740
a61af66fc99e Initial load
duke
parents:
diff changeset
3741 __ bind( entry );
a61af66fc99e Initial load
duke
parents:
diff changeset
3742
a61af66fc99e Initial load
duke
parents:
diff changeset
3743 __ cmp( O3, O2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3744 __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
3745 __ delayed()->ld_ptr(O3, BasicObjectLock::obj_offset_in_bytes(), O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3746
a61af66fc99e Initial load
duke
parents:
diff changeset
3747 __ bind( exit );
a61af66fc99e Initial load
duke
parents:
diff changeset
3748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3749
a61af66fc99e Initial load
duke
parents:
diff changeset
3750 { Label allocated;
a61af66fc99e Initial load
duke
parents:
diff changeset
3751
a61af66fc99e Initial load
duke
parents:
diff changeset
3752 // found free slot?
a61af66fc99e Initial load
duke
parents:
diff changeset
3753 __ br_notnull(O1, false, Assembler::pn, allocated);
a61af66fc99e Initial load
duke
parents:
diff changeset
3754 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3755
a61af66fc99e Initial load
duke
parents:
diff changeset
3756 __ add_monitor_to_stack( false, O2, O3 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3757 __ mov(Lmonitors, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3758
a61af66fc99e Initial load
duke
parents:
diff changeset
3759 __ bind(allocated);
a61af66fc99e Initial load
duke
parents:
diff changeset
3760 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3761
a61af66fc99e Initial load
duke
parents:
diff changeset
3762 // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly.
a61af66fc99e Initial load
duke
parents:
diff changeset
3763 // The object has already been poped from the stack, so the expression stack looks correct.
a61af66fc99e Initial load
duke
parents:
diff changeset
3764 __ inc(Lbcp);
a61af66fc99e Initial load
duke
parents:
diff changeset
3765
a61af66fc99e Initial load
duke
parents:
diff changeset
3766 __ st_ptr(O0, O1, BasicObjectLock::obj_offset_in_bytes()); // store object
a61af66fc99e Initial load
duke
parents:
diff changeset
3767 __ lock_object(O1, O0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3768
a61af66fc99e Initial load
duke
parents:
diff changeset
3769 // check if there's enough space on the stack for the monitors after locking
a61af66fc99e Initial load
duke
parents:
diff changeset
3770 __ generate_stack_overflow_check(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3771
a61af66fc99e Initial load
duke
parents:
diff changeset
3772 // The bcp has already been incremented. Just need to dispatch to next instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
3773 __ dispatch_next(vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3775
a61af66fc99e Initial load
duke
parents:
diff changeset
3776
a61af66fc99e Initial load
duke
parents:
diff changeset
3777 void TemplateTable::monitorexit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3778 transition(atos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3779 __ verify_oop(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3780 __ tst(Otos_i);
a61af66fc99e Initial load
duke
parents:
diff changeset
3781 __ throw_if_not_x( Assembler::notZero, Interpreter::_throw_NullPointerException_entry, G3_scratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
3782
a61af66fc99e Initial load
duke
parents:
diff changeset
3783 assert(O0 == Otos_i, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
3784
a61af66fc99e Initial load
duke
parents:
diff changeset
3785 { Label entry, loop, found;
a61af66fc99e Initial load
duke
parents:
diff changeset
3786 __ add( __ top_most_monitor(), O2 ); // last one to check
a61af66fc99e Initial load
duke
parents:
diff changeset
3787 __ ba(false, entry );
a61af66fc99e Initial load
duke
parents:
diff changeset
3788 // use Lscratch to hold monitor elem to check, start with most recent monitor,
a61af66fc99e Initial load
duke
parents:
diff changeset
3789 // By using a local it survives the call to the C routine.
a61af66fc99e Initial load
duke
parents:
diff changeset
3790 __ delayed()->mov( Lmonitors, Lscratch );
a61af66fc99e Initial load
duke
parents:
diff changeset
3791
a61af66fc99e Initial load
duke
parents:
diff changeset
3792 __ bind( loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
3793
a61af66fc99e Initial load
duke
parents:
diff changeset
3794 __ verify_oop(O4); // verify each monitor's oop
a61af66fc99e Initial load
duke
parents:
diff changeset
3795 __ cmp(O4, O0); // check if current entry is for desired object
a61af66fc99e Initial load
duke
parents:
diff changeset
3796 __ brx( Assembler::equal, true, Assembler::pt, found );
a61af66fc99e Initial load
duke
parents:
diff changeset
3797 __ delayed()->mov(Lscratch, O1); // pass found entry as argument to monitorexit
a61af66fc99e Initial load
duke
parents:
diff changeset
3798
a61af66fc99e Initial load
duke
parents:
diff changeset
3799 __ inc( Lscratch, frame::interpreter_frame_monitor_size() * wordSize ); // advance to next
a61af66fc99e Initial load
duke
parents:
diff changeset
3800
a61af66fc99e Initial load
duke
parents:
diff changeset
3801 __ bind( entry );
a61af66fc99e Initial load
duke
parents:
diff changeset
3802
a61af66fc99e Initial load
duke
parents:
diff changeset
3803 __ cmp( Lscratch, O2 );
a61af66fc99e Initial load
duke
parents:
diff changeset
3804 __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
a61af66fc99e Initial load
duke
parents:
diff changeset
3805 __ delayed()->ld_ptr(Lscratch, BasicObjectLock::obj_offset_in_bytes(), O4);
a61af66fc99e Initial load
duke
parents:
diff changeset
3806
a61af66fc99e Initial load
duke
parents:
diff changeset
3807 call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
a61af66fc99e Initial load
duke
parents:
diff changeset
3808 __ should_not_reach_here();
a61af66fc99e Initial load
duke
parents:
diff changeset
3809
a61af66fc99e Initial load
duke
parents:
diff changeset
3810 __ bind(found);
a61af66fc99e Initial load
duke
parents:
diff changeset
3811 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3812 __ unlock_object(O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3813 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3814
a61af66fc99e Initial load
duke
parents:
diff changeset
3815
a61af66fc99e Initial load
duke
parents:
diff changeset
3816 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3817 // Wide instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
3818
a61af66fc99e Initial load
duke
parents:
diff changeset
3819 void TemplateTable::wide() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3820 transition(vtos, vtos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3821 __ ldub(Lbcp, 1, G3_scratch);// get next bc
a61af66fc99e Initial load
duke
parents:
diff changeset
3822 __ sll(G3_scratch, LogBytesPerWord, G3_scratch);
727
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3823 AddressLiteral ep(Interpreter::_wentry_point);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3824 __ set(ep, G4_scratch);
6b2273dd6fa9 6822110: Add AddressLiteral class on SPARC
twisti
parents: 605
diff changeset
3825 __ ld_ptr(G4_scratch, G3_scratch, G3_scratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3826 __ jmp(G3_scratch, G0);
a61af66fc99e Initial load
duke
parents:
diff changeset
3827 __ delayed()->nop();
a61af66fc99e Initial load
duke
parents:
diff changeset
3828 // Note: the Lbcp increment step is part of the individual wide bytecode implementations
a61af66fc99e Initial load
duke
parents:
diff changeset
3829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3830
a61af66fc99e Initial load
duke
parents:
diff changeset
3831
a61af66fc99e Initial load
duke
parents:
diff changeset
3832 //----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
3833 // Multi arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
3834
a61af66fc99e Initial load
duke
parents:
diff changeset
3835 void TemplateTable::multianewarray() {
a61af66fc99e Initial load
duke
parents:
diff changeset
3836 transition(vtos, atos);
a61af66fc99e Initial load
duke
parents:
diff changeset
3837 // put ndims * wordSize into Lscratch
a61af66fc99e Initial load
duke
parents:
diff changeset
3838 __ ldub( Lbcp, 3, Lscratch);
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 1503
diff changeset
3839 __ sll( Lscratch, Interpreter::logStackElementSize, Lscratch);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3840 // Lesp points past last_dim, so set to O1 to first_dim address
a61af66fc99e Initial load
duke
parents:
diff changeset
3841 __ add( Lesp, Lscratch, O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3842 call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), O1);
a61af66fc99e Initial load
duke
parents:
diff changeset
3843 __ add( Lesp, Lscratch, Lesp); // pop all dimensions off the stack
a61af66fc99e Initial load
duke
parents:
diff changeset
3844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
3845 #endif /* !CC_INTERP */